exporter_type: included
app_name_short: HAProxy
app_name: {{app_name_short}}
app_site_name: HAProxy
app_site_url: https://www.haproxy.com/
exporter_name: the PROMEX service for HAProxy
exporter_pkg_name: haproxy_promex
exporter_repo_url: https://github.com/haproxy/haproxy/blob/master/addons/promex/README
dashboard_available: true
minimum_exporter_version: "2.4"
multiple_dashboards: false
dashboard_display_name: {{app_name_short}} Prometheus Overview
additional_prereq_info: |
  {{app_name_short}} exposes Prometheus-format metrics only when it is 
  [built with the service enabled](https://github.com/haproxy/haproxy/blob/master/addons/promex/README){:class="external"} and an appropriate `frontend` is included in the configuration.

  Most of the official Docker images for versions greater than or equal to 2.4 are built with this service enabled.

  The following example was built referencing [HAProxy Enterprise documentation](https://www.haproxy.com/documentation/hapee/latest/observability/metrics/prometheus/){:class="external"}.
  It works with the community edition and can be modified to suit specific needs:
  <pre>
  apiVersion: v1
  kind: ConfigMap
  metadata:
    name: haproxy
  data:
    haproxy.cfg: |
      ...
  +   frontend prometheus
  +     mode http
  +     bind *:8404
  +     http-request use-service prometheus-exporter if { path /metrics }
      ...
  ---
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: haproxy
  spec:
    selector:
      matchLabels:
  +     app.kubernetes.io/name: haproxy
    template:
      metadata:
        labels:
  +       app.kubernetes.io/name: haproxy
      spec:
        containers:
        - name: haproxy
          image: haproxy:2.8
          ports:
          - containerPort: 8404
            name: prometheus
          volumeMounts:
          - mountPath: /usr/local/etc/haproxy/haproxy.cfg
            subPath: haproxy.cfg
            name: haproxy
        volumes:
        - name: haproxy
          configMap:
            name: haproxy
            items:
            - key: haproxy.cfg
              path: haproxy.cfg

  </pre>
  To verify that {{exporter_name}} is emitting metrics on the expected endpoints, do the following:
  1. Set up port forwarding by using the following command:
    <pre class="devsite-click-to-copy">
    kubectl -n {{namespace_name}} port-forward {{pod_name}} 8404
    </pre>
  2. Access the endpoint `localhost:8404/metrics` by using the browser
     or the `curl` utility in another terminal session.
podmonitoring_config: |
  apiVersion: monitoring.googleapis.com/v1
  kind: PodMonitoring
  metadata:
    name: haproxy
    labels:
      app.kubernetes.io/name: haproxy
      app.kubernetes.io/part-of: google-cloud-managed-prometheus
  spec:
    endpoints:
    - port: prometheus
      scheme: http
      interval: 30s
      path: /metrics
    selector:
      matchLabels:
        app.kubernetes.io/name: haproxy
additional_podmonitoring_info: |
  Ensure that the values of the `port` and `matchLabels` fields match those of the {{app_name_short}} pods you want to monitor.
  
  {{app_name_short}} exposes metrics from targets defined in the `bind` configuration option. This option requires a user to define the IP address and port to be listened on for scraping metrics.
sample_promql_query: up{job="haproxy", cluster="{{cluster_name}}", namespace="{{namespace_name}}"}
alerts_config: |
  apiVersion: monitoring.googleapis.com/v1
  kind: Rules
  metadata:
    name: haproxy-rules
    labels:
      app.kubernetes.io/component: rules
      app.kubernetes.io/name: haproxy-rules
      app.kubernetes.io/part-of: google-cloud-managed-prometheus
  spec:
    groups:
    - name: haproxy
      interval: 30s
      rules:
      - alert: HAProxyDown
        annotations:
          description: |-
            HAProxy instance is down 
              VALUE = {{ $value }}
              LABELS: {{ $labels }}
          summary: HAProxy down (instance {{ $labels.instance }})
        expr: haproxy_server_up{job="haproxy"} == 0
        for: 5m
        labels:
          severity: critical
      - alert: HAProxyTooManyConnections
        annotations:
          description: |-
            HAProxy instance has too many connections
              VALUE = {{ $value }}
              LABELS: {{ $labels }}
          summary: HAProxy too many connections (instance {{ $labels.instance }})
        expr: haproxy_frontend_current_sessions{job="haproxy"} / haproxy_frontend_limit_sessions{job="haproxy"} * 100 > 90
        for: 5m
        labels:
          severity: warning
additional_alert_info: You can adjust the alert thresholds to suit your application.
