Cette intégration Kubernetes découvre automatiquement les pods HAProxy dans votre cluster et collecte des métriques sans configuration manuelle pour chaque instance. Elle utilise le haproxyreceiver et le receivercreator OpenTelemetry pour monitorer dynamiquement les sessions HAProxy, les requests, les erreurs et l'état de santé du serveur backend dans votre environnement conteneurisé.
Conseil
Vous exécutez HAProxy sur des hôtes Linux ? Consultez le guide d'installation auto-hébergée pour les déploiements sur machine virtuelle ou bare metal.
Avant de commencer
Assurez-vous d'avoir :
- Clé de licenceNew Relic valide
- Les pods HAProxy avec le point de terminaison de statistiques activé (généralement sur le port 8404)
- Un label sur chaque pod HAProxy pour la découverte (par exemple,
app: haproxy) - Si vous utilisez la méthode d'installation Helm, terminez l'installation de base de Helm Kubernetes OpenTelemetry
Configurer le monitoring HAProxy
Ajoutez les sections suivantes sous
deployment.extraConfigdans votrevalues.yaml:Important
Dans
deployment.extraConfig,pipelines:doit être défini au niveau racine — et non imbriqué sousservice:. Le modèle de chart Helm mappeextraConfig.pipelinesdansservice.pipelines, etextraConfig.service.extensionsdansservice.extensions.Extensions :
extensions:k8s_observer:auth_type: serviceAccountobserve_pods: trueobserve_nodes: falseVariables d'environnement (ajoutez sous
deployment.envs) :deployment:envs:- name: OTEL_RESOURCE_ATTRIBUTESvalue: "host.id=$(KUBE_NODE_NAME)"Important
L'attribut de ressource
host.idest requis pour la synthèse d'entités. Les images de conteneur n'ont pas/etc/machine-id, vous devez donc l'injecter viaOTEL_RESOURCE_ATTRIBUTES. Le chart Helm définit déjàKUBE_NODE_NAMEà partir de l'API Downward de Kubernetes.Récepteurs :
receivers:receiver_creator/haproxy:watch_observers: [k8s_observer]receivers:haproxy:rule: type == "pod" && labels["app"] == "haproxy"config:endpoint: 'http://`endpoint`:8404/stats'collection_interval: 30sProcesseurs :
processors:resource/cluster:attributes:- key: k8s.cluster.namevalue: "<YOUR_CLUSTER_NAME>"action: inserttransform/haproxy:metric_statements:- context: resourcestatements:- set(attributes["haproxy.display.name"], Concat(["server","k8s",attributes["k8s.cluster.name"],attributes["k8s.namespace.name"],"pod",attributes["k8s.pod.name"],"haproxy","8404"], ":"))transform/metadata_nullify:metric_statements:- context: metricstatements:- set(description, "")- set(unit, "")Extensions de service :
service:extensions: [k8s_observer]Pipelines :
pipelines:metrics/haproxy:receivers: [receiver_creator/haproxy]processors: [batch, resource/cluster, transform/haproxy, transform/metadata_nullify, memory_limiter]exporters: [otlphttp/newrelic]Paramètres de configuration
Le tableau suivant décrit les principaux paramètres de configuration :
paramètres
Description
labels["app"] == "haproxy"Sélecteur de label de pod utilisé pour découvrir les pods HAProxy. Mettez à jour la règle pour correspondre aux labels de votre pod.
<YOUR_PORT_NUMBER>Le port où HAProxy expose son point de terminaison de statistiques.
<YOUR_CLUSTER_NAME>Remplacez par le nom de votre cluster Kubernetes pour l'identification dans New Relic.
collection_intervalÀ quelle fréquence collecter les métriques. La valeur par défaut est
30s.
Appliquez les valeurs mises à jour à votre sortie Helm en cours d'exécution :
bash$helm upgrade nr-k8s-otel-collector newrelic/nr-k8s-otel-collector \>--namespace newrelic \>--reuse-values \>-f values.yaml
Après avoir terminé l'installation de base du manifeste Kubernetes OpenTelemetry, configurez le monitoring de HAProxy :
Mettre à jour l'image du collecteur pour utiliser le collecteur NRDOT.
Dans le fichier
deployment.yamlde votre répertoire localrendered, mettez à jour l'image vers :image: newrelic/nrdot-collector:latestMontez le
/etc/machine-idde l'hôte dans le conteneur du collecteur en ajoutant ces éléments à la spécification de déploiement :volumeMounts:- name: machine-idmountPath: /etc/machine-idreadOnly: truevolumes:- name: machine-idhostPath:path: /etc/machine-idtype: FileImportant
L'attribut de ressource
host.idest requis pour la synthèse d'entités. Le processeurresourcedetectionlit/etc/machine-idpour le renseigner. Sans ce montage de volume,host.idne sera pas défini et les entités ne seront pas créées.Remplacez le contenu dans
deployment-configmap.yamlsousdeployment-config.yaml: |par :extensions:health_check:endpoint: 0.0.0.0:13133k8s_observer:auth_type: serviceAccountobserve_pods: trueobserve_nodes: falsereceivers:receiver_creator/haproxy:watch_observers: [k8s_observer]receivers:haproxy:rule: type == "pod" && labels["app"] == "haproxy"config:endpoint: 'http://`endpoint`:8404/stats'collection_interval: 30sprocessors:resourcedetection:detectors: [env, system]system:resource_attributes:host.name:enabled: truehost.id:enabled: trueos.type:enabled: truebatch:send_batch_max_size: 1000timeout: 30ssend_batch_size: 800memory_limiter:check_interval: 1slimit_percentage: 80spike_limit_percentage: 25resource/cluster:attributes:- key: k8s.cluster.namevalue: "<YOUR_CLUSTER_NAME>"action: inserttransform/haproxy:metric_statements:- context: resourcestatements:- set(attributes["haproxy.display.name"], Concat(["server","k8s",attributes["k8s.cluster.name"],attributes["k8s.namespace.name"],"pod",attributes["k8s.pod.name"],"haproxy","8404"], ":"))transform/metadata_nullify:metric_statements:- context: metricstatements:- set(description, "")- set(unit, "")exporters:otlp_http/newrelic:endpoint: "<YOUR_NEWRELIC_OTLP_ENDPOINT>"headers:api-key: ${env:NR_LICENSE_KEY}service:extensions: [health_check, k8s_observer]pipelines:metrics/haproxy:receivers: [receiver_creator/haproxy]processors: [resourcedetection, batch, resource/cluster, transform/haproxy, transform/metadata_nullify, memory_limiter]exporters: [otlp_http/newrelic]Supprimez le DaemonSet et le déploiement kube-state-metrics (non nécessaires pour le monitoring de HAProxy uniquement) :
bash$kubectl delete daemonset nr-k8s-otel-collector-daemonset -n newrelic$kubectl delete deployment nr-k8s-otel-collector-kube-state-metrics -n newrelicRedémarrez le déploiement du collecteur pour appliquer vos modifications :
bash$kubectl rollout restart deployment nr-k8s-otel-collector-deployment -n newrelicParamètres de configuration
paramètres
Description
labels["app"] == "haproxy"Sélecteur de label de pod utilisé pour découvrir les pods HAProxy. Mettez à jour la règle pour correspondre aux labels de votre pod.
<YOUR_PORT_NUMBER>Le port où HAProxy expose son point de terminaison de statistiques.
<YOUR_CLUSTER_NAME>Remplacez par le nom de votre cluster Kubernetes pour l'identification dans New Relic.
<YOUR_NEWRELIC_OTLP_ENDPOINT>Your New Relic OTLP endpoint. For more information, refer to
.
Déployez l'OpenTelemetry Collector Contrib sur votre cluster Kubernetes. Le collecteur découvre et extrait automatiquement les métriques de vos pods HAProxy. Choisissez entre Helm (en utilisant le chart Helm OTel en amont) ou les manifestes Kubernetes bruts.
Créez un fichier
values.yamlavec la configuration de monitoring HAProxy suivante :mode: deploymentimage:repository: otel/opentelemetry-collector-contribclusterRole:create: truerules:- apiGroups: [""]resources: ["pods", "nodes"]verbs: ["get", "list", "watch"]- apiGroups: ["apps"]resources: ["replicasets"]verbs: ["get", "list", "watch"]extraVolumes:- name: machine-idhostPath:path: /etc/machine-idtype: FileextraVolumeMounts:- name: machine-idmountPath: /etc/machine-idreadOnly: trueconfig:extensions:health_check:endpoint: ${env:MY_POD_IP}:13133k8s_observer:auth_type: serviceAccountobserve_pods: trueobserve_nodes: falsereceivers:receiver_creator/haproxy:watch_observers: [k8s_observer]receivers:haproxy:rule: type == "pod" && labels["app"] == "haproxy"config:endpoint: 'http://`endpoint`:8404/stats'collection_interval: 30sprocessors:resourcedetection:detectors: [env, system]system:resource_attributes:host.name:enabled: truehost.id:enabled: trueos.type:enabled: truebatch:send_batch_size: 1024timeout: 30smemory_limiter:check_interval: 1slimit_percentage: 80spike_limit_percentage: 25resource/cluster:attributes:- key: k8s.cluster.namevalue: "<YOUR_CLUSTER_NAME>"action: inserttransform/haproxy:metric_statements:- context: resourcestatements:- set(attributes["haproxy.display.name"], Concat(["server", "k8s", attributes["k8s.cluster.name"], attributes["k8s.namespace.name"], "pod", attributes["k8s.pod.name"], "haproxy", "8404"], ":"))transform/metadata_nullify:metric_statements:- context: metricstatements:- set(description, "")- set(unit, "")exporters:otlp_http/newrelic:endpoint: "<YOUR_NEWRELIC_OTLP_ENDPOINT>"headers:api-key: "<YOUR_NEW_RELIC_LICENSE_KEY>"service:extensions: [health_check, k8s_observer]pipelines:metrics/haproxy:receivers: [receiver_creator/haproxy]processors: [resourcedetection, batch, resource/cluster, transform/haproxy, transform/metadata_nullify, memory_limiter]exporters: [otlp_http/newrelic]Paramètres de configuration
paramètres
Description
labels["app"] == "haproxy"Sélecteur de label de pod utilisé pour découvrir les pods HAProxy. Mettez à jour la règle pour correspondre aux labels de votre pod.
<YOUR_PORT_NUMBER>Le port où HAProxy expose son point de terminaison de statistiques.
<YOUR_CLUSTER_NAME>Remplacez par le nom de votre cluster Kubernetes pour l'identification dans New Relic.
<YOUR_NEWRELIC_OTLP_ENDPOINT>Your New Relic OTLP endpoint. For more information, refer to
.
<YOUR_NEW_RELIC_LICENSE_KEY>Votre clé de licence d'ingestion New Relic.
Installez à l'aide du chart Helm OpenTelemetry en amont :
bash$helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts$helm repo update$helm upgrade --install haproxy-otel-collector open-telemetry/opentelemetry-collector \>-f values.yaml \>-n newrelic --create-namespace
Utilisez cette option si vous ne pouvez pas utiliser Helm ou si vous préférez gérer les ressources Kubernetes directement avec kubectl.
Créez un secret avec votre clé de licence New Relic :
bash$kubectl create namespace newrelic$kubectl create secret generic otel-collector-haproxy-secret \>--namespace newrelic \>--from-literal=licenseKey='<YOUR_NEW_RELIC_LICENSE_KEY>'Enregistrez le manifeste suivant dans un fichier (par exemple,
otel-collector-haproxy.yaml) :---apiVersion: v1kind: ServiceAccountmetadata:name: otel-collector-haproxynamespace: newreliclabels:app: otel-collector-haproxy---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:name: otel-collector-haproxylabels:app: otel-collector-haproxyrules:- apiGroups: [""]resources: ["pods", "nodes"]verbs: ["get", "list", "watch"]- apiGroups: ["apps"]resources: ["replicasets"]verbs: ["get", "list", "watch"]---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:name: otel-collector-haproxylabels:app: otel-collector-haproxyroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: otel-collector-haproxysubjects:- kind: ServiceAccountname: otel-collector-haproxynamespace: newrelic---apiVersion: v1kind: ConfigMapmetadata:name: otel-collector-haproxy-confignamespace: newreliclabels:app: otel-collector-haproxydata:collector-config.yaml: |extensions:health_check:endpoint: 0.0.0.0:13133k8s_observer:auth_type: serviceAccountobserve_pods: trueobserve_nodes: falsereceivers:receiver_creator/haproxy:watch_observers: [k8s_observer]receivers:haproxy:rule: type == "pod" && labels["app"] == "haproxy"config:endpoint: 'http://`endpoint`:8404/stats'collection_interval: 30sprocessors:resourcedetection:detectors: [env, system]system:resource_attributes:host.name:enabled: truehost.id:enabled: trueos.type:enabled: truebatch:send_batch_size: 1024timeout: 30smemory_limiter:check_interval: 1slimit_percentage: 80spike_limit_percentage: 25resource/cluster:attributes:- key: k8s.cluster.namevalue: "<YOUR_CLUSTER_NAME>"action: inserttransform/haproxy:metric_statements:- context: resourcestatements:- set(attributes["haproxy.display.name"], Concat(["server", "k8s", attributes["k8s.cluster.name"], attributes["k8s.namespace.name"], "pod", attributes["k8s.pod.name"], "haproxy", "8404"], ":"))transform/metadata_nullify:metric_statements:- context: metricstatements:- set(description, "")- set(unit, "")exporters:otlp_http/newrelic:endpoint: "<YOUR_NEWRELIC_OTLP_ENDPOINT>"headers:api-key: ${env:NR_LICENSE_KEY}service:extensions: [health_check, k8s_observer]pipelines:metrics/haproxy:receivers: [receiver_creator/haproxy]processors: [resourcedetection, batch, resource/cluster, transform/haproxy, transform/metadata_nullify, memory_limiter]exporters: [otlp_http/newrelic]---apiVersion: apps/v1kind: Deploymentmetadata:name: otel-collector-haproxynamespace: newreliclabels:app: otel-collector-haproxyspec:replicas: 1selector:matchLabels:app: otel-collector-haproxytemplate:metadata:labels:app: otel-collector-haproxyspec:serviceAccountName: otel-collector-haproxycontainers:- name: otel-collectorimage: otel/opentelemetry-collector-contrib:latestcommand:- "/otelcol-contrib"- "--config=/conf/collector-config.yaml"env:- name: NR_LICENSE_KEYvalueFrom:secretKeyRef:name: otel-collector-haproxy-secretkey: licenseKey- name: GOGCvalue: "80"ports:- name: healthcontainerPort: 13133protocol: TCPresources:limits:cpu: 500mmemory: 512Mirequests:cpu: 100mmemory: 256MivolumeMounts:- name: configmountPath: /conf- name: machine-idmountPath: /etc/machine-idreadOnly: truevolumes:- name: configconfigMap:name: otel-collector-haproxy-configitems:- key: collector-config.yamlpath: collector-config.yaml- name: machine-idhostPath:path: /etc/machine-idtype: FileImportant
Le montage de volume
/etc/machine-idest requis pour la synthèse d'entités. Le processeurresourcedetectionlit ce fichier pour renseigner l'attribut de ressourcehost.id. Sans cela, les entités ne seront pas créées dans New Relic.Appliquez le manifeste :
bash$kubectl apply -f otel-collector-haproxy.yamlVérifiez que le collecteur est en cours d'exécution et découvre les pods HAProxy :
bash$kubectl get pods -n newrelic -l app=otel-collector-haproxy$kubectl logs -n newrelic -l app=otel-collector-haproxyVous devriez voir des lignes de log indiquant
starting receiveravec les adresses IP de vos pods HAProxy.Paramètres de configuration
paramètres
Description
labels["app"] == "haproxy"Sélecteur de label de pod utilisé pour découvrir les pods HAProxy. Mettez à jour la règle pour correspondre aux labels de votre pod.
<YOUR_PORT_NUMBER>Le port où HAProxy expose son point de terminaison de statistiques.
<YOUR_CLUSTER_NAME>Remplacez par le nom de votre cluster Kubernetes pour l'identification dans New Relic.
<YOUR_NEWRELIC_OTLP_ENDPOINT>Your New Relic OTLP endpoint. For more information, refer to
.
<YOUR_NEW_RELIC_LICENSE_KEY>Votre clé de licence d'ingestion New Relic.
Utilisez cette approche si vos pods HAProxy exposent déjà un point de terminaison Prometheus /metrics (HAProxy 2.0+) et que vous préférez extraire les métriques Prometheus plutôt que de vous connecter au point de terminaison des statistiques CSV.
Conseil
Si vous n'avez pas déjà activé le point de terminaison Prometheus, utilisez plutôt les onglets NRDOT Collector ou OpenTelemetry Collector Contrib. Ils se connectent directement au point de terminaison des statistiques HAProxy sans nécessiter la prise en charge de Prometheus.
Important
Cette approche nécessite HAProxy 2.0+ avec le point de terminaison Prometheus intégré activé. Votre configuration HAProxy doit inclure :
frontend stats bind *:8404 http-request use-service prometheus-exporter if { path /metrics }Et vos pods HAProxy doivent exposer un port nommé pour le point de terminaison des métriques :
ports: - name: metrics containerPort: 8404Terminez l'installation de base de Helm Kubernetes OpenTelemetry pour nr-k8s-otel-collector avant de continuer.
Ajoutez les sections suivantes sous
deployment.configMap.extraConfigdans votrevalues.yaml:Important
Dans
deployment.configMap.extraConfig,pipelines:doit être défini au niveau racine — et non imbriqué sousservice:. Le modèle de chart Helm mappeextraConfig.pipelinesdansservice.pipelines, etextraConfig.service.extensionsdansservice.extensions.Extensions :
extensions:k8s_observer:auth_type: serviceAccountobserve_pods: trueobserve_nodes: falseVariables d'environnement (ajoutez sous
deployment.envs) :deployment:envs:- name: OTEL_RESOURCE_ATTRIBUTESvalue: "host.id=$(KUBE_NODE_NAME)"Important
L'attribut de ressource
host.idest requis pour la synthèse d'entité. Le processeurresourcedetectionlitOTEL_RESOURCE_ATTRIBUTESpour le renseigner. Le chart Helm définit déjàKUBE_NODE_NAMEà partir de l'API Downward de Kubernetes.Récepteurs :
receivers:receiver_creator/haproxy_prom:watch_observers: [k8s_observer]receivers:prometheus:rule: type == "port" && pod.labels["app"] == "haproxy" && port == 8404config:config:scrape_configs:- job_name: haproxy_prommetrics_path: /metricsscrape_interval: 30sstatic_configs:- targets:- '`endpoint`'resource_attributes:haproxy.addr: 'http://`endpoint`/metrics'Processeurs :
processors:resourcedetection:detectors: [env]filter/haproxy:metrics:include:match_type: regexpmetric_names:- "haproxy_frontend_bytes_in_total"- "haproxy_frontend_bytes_out_total"- "haproxy_frontend_requests_denied_total"- "haproxy_frontend_request_errors_total"- "haproxy_frontend_http_requests_total"- "haproxy_frontend_current_sessions"- "haproxy_frontend_max_session_rate"- "haproxy_frontend_http_requests_rate_max"- "haproxy_frontend_connections_rate_max"- "haproxy_backend_bytes_in_total"- "haproxy_backend_bytes_out_total"- "haproxy_backend_connection_errors_total"- "haproxy_backend_http_requests_total"- "haproxy_backend_current_sessions"- "haproxy_backend_max_session_rate"- "haproxy_backend_current_queue"- "haproxy_server_bytes_in_total"- "haproxy_server_bytes_out_total"- "haproxy_server_connection_errors_total"- "haproxy_server_current_sessions"- "haproxy_server_max_session_rate"- "haproxy_server_current_queue"transform/add_labels:metric_statements:- context: datapointstatements:- set(attributes["haproxy.service_name"], "FRONTEND") where IsMatch(metric.name, "^haproxy_frontend_.*")- set(attributes["haproxy.service_name"], "BACKEND") where IsMatch(metric.name, "^haproxy_backend_.*")- set(attributes["haproxy.service_name"], attributes["server"]) where IsMatch(metric.name, "^haproxy_server_.*")- set(attributes["haproxy.proxy_name"], attributes["proxy"]) where attributes["proxy"] != nil- delete_key(attributes, "proxy") where attributes["proxy"] != nil- delete_key(attributes, "server") where attributes["server"] != nilmetricstransform/rename:transforms:- include: haproxy_frontend_bytes_in_totalaction: updatenew_name: haproxy.bytes.input- include: haproxy_backend_bytes_in_totalaction: updatenew_name: haproxy.bytes.input- include: haproxy_server_bytes_in_totalaction: updatenew_name: haproxy.bytes.input- include: haproxy_frontend_bytes_out_totalaction: updatenew_name: haproxy.bytes.output- include: haproxy_backend_bytes_out_totalaction: updatenew_name: haproxy.bytes.output- include: haproxy_server_bytes_out_totalaction: updatenew_name: haproxy.bytes.output- include: haproxy_backend_connection_errors_totalaction: updatenew_name: haproxy.connections.errors- include: haproxy_server_connection_errors_totalaction: updatenew_name: haproxy.connections.errors- include: haproxy_frontend_requests_denied_totalaction: updatenew_name: haproxy.requests.denied- include: haproxy_frontend_request_errors_totalaction: updatenew_name: haproxy.requests.errors- include: haproxy_frontend_http_requests_totalaction: updatenew_name: haproxy.requests.total- include: haproxy_backend_http_requests_totalaction: updatenew_name: haproxy.requests.total- include: haproxy_backend_current_queueaction: updatenew_name: haproxy.requests.queued- include: haproxy_server_current_queueaction: updatenew_name: haproxy.requests.queued- include: haproxy_frontend_current_sessionsaction: updatenew_name: haproxy.sessions.count- include: haproxy_backend_current_sessionsaction: updatenew_name: haproxy.sessions.count- include: haproxy_server_current_sessionsaction: updatenew_name: haproxy.sessions.count- include: haproxy_frontend_http_requests_rate_maxaction: updatenew_name: haproxy.requests.rate- include: haproxy_frontend_connections_rate_maxaction: updatenew_name: haproxy.connections.rate- include: haproxy_frontend_max_session_rateaction: updatenew_name: haproxy.sessions.rate- include: haproxy_backend_max_session_rateaction: updatenew_name: haproxy.sessions.rate- include: haproxy_server_max_session_rateaction: updatenew_name: haproxy.sessions.rateresource/cluster:attributes:- key: k8s.cluster.namevalue: "<YOUR_CLUSTER_NAME>"action: inserttransform/haproxy:metric_statements:- context: resourcestatements:- set(attributes["haproxy.display.name"], Concat(["server", "k8s", attributes["k8s.cluster.name"], attributes["k8s.namespace.name"], "pod", attributes["k8s.pod.name"], "haproxy", "8404"], ":"))transform/metadata_nullify:metric_statements:- context: metricstatements:- set(description, "")- set(unit, "")Extensions de service :
service:extensions: [k8s_observer]Pipelines :
pipelines:metrics/haproxy_prom:receivers: [receiver_creator/haproxy_prom]processors: [resourcedetection, filter/haproxy, transform/add_labels, metricstransform/rename, resource/cluster, batch, transform/haproxy, transform/metadata_nullify, memory_limiter]exporters: [otlp_http/newrelic]Paramètres de configuration
paramètres
Description
labels["app"] == "haproxy"Sélecteur de label de pod utilisé pour découvrir les pods HAProxy. Mettez à jour la règle pour correspondre aux labels de votre pod.
<YOUR_PORT_NUMBER>Le port où HAProxy expose son point de terminaison Prometheus.
<YOUR_CLUSTER_NAME>Remplacez par le nom de votre cluster Kubernetes pour l'identification dans New Relic.
scrape_intervalFréquence de scraping des métriques Prometheus. Par défaut :
30s.
Appliquez les valeurs mises à jour à votre sortie Helm en cours d'exécution :
bash$helm upgrade nr-k8s-otel-collector newrelic/nr-k8s-otel-collector \>--namespace newrelic \>--reuse-values \>-f values.yaml
Créez un fichier
values.yamlavec la configuration du récepteur Prometheus :mode: deploymentimage:repository: otel/opentelemetry-collector-contribclusterRole:create: truerules:- apiGroups: [""]resources: ["pods", "nodes"]verbs: ["get", "list", "watch"]- apiGroups: ["apps"]resources: ["replicasets"]verbs: ["get", "list", "watch"]extraVolumes:- name: machine-idhostPath:path: /etc/machine-idtype: FileextraVolumeMounts:- name: machine-idmountPath: /etc/machine-idreadOnly: trueconfig:extensions:health_check:endpoint: ${env:MY_POD_IP}:13133k8s_observer:auth_type: serviceAccountobserve_pods: trueobserve_nodes: falsereceivers:receiver_creator/haproxy_prom:watch_observers: [k8s_observer]receivers:prometheus:rule: type == "port" && pod.labels["app"] == "haproxy" && port == 8404config:config:scrape_configs:- job_name: haproxy_prommetrics_path: /metricsscrape_interval: 30sstatic_configs:- targets:- '`endpoint`'resource_attributes:haproxy.addr: 'http://`endpoint`/metrics'processors:resourcedetection:detectors: [env, system]system:resource_attributes:host.name:enabled: truehost.id:enabled: trueos.type:enabled: truefilter/haproxy:metrics:include:match_type: regexpmetric_names:- "haproxy_frontend_bytes_in_total"- "haproxy_frontend_bytes_out_total"- "haproxy_frontend_requests_denied_total"- "haproxy_frontend_request_errors_total"- "haproxy_frontend_http_requests_total"- "haproxy_frontend_current_sessions"- "haproxy_frontend_max_session_rate"- "haproxy_backend_bytes_in_total"- "haproxy_backend_bytes_out_total"- "haproxy_backend_connection_errors_total"- "haproxy_backend_http_requests_total"- "haproxy_backend_current_sessions"- "haproxy_backend_max_session_rate"- "haproxy_backend_current_queue"- "haproxy_server_bytes_in_total"- "haproxy_server_bytes_out_total"- "haproxy_server_connection_errors_total"- "haproxy_server_current_sessions"- "haproxy_server_max_session_rate"- "haproxy_server_current_queue"transform/add_labels:metric_statements:- context: datapointstatements:- set(attributes["haproxy.service_name"], "FRONTEND") where IsMatch(metric.name, "^haproxy_frontend_.*")- set(attributes["haproxy.service_name"], "BACKEND") where IsMatch(metric.name, "^haproxy_backend_.*")- set(attributes["haproxy.service_name"], attributes["server"]) where IsMatch(metric.name, "^haproxy_server_.*")- set(attributes["haproxy.proxy_name"], attributes["proxy"]) where attributes["proxy"] != nil- delete_key(attributes, "proxy") where attributes["proxy"] != nil- delete_key(attributes, "server") where attributes["server"] != nilmetricstransform/rename:transforms:- include: haproxy_frontend_bytes_in_totalaction: updatenew_name: haproxy.bytes.input- include: haproxy_backend_bytes_in_totalaction: updatenew_name: haproxy.bytes.input- include: haproxy_server_bytes_in_totalaction: updatenew_name: haproxy.bytes.input- include: haproxy_frontend_bytes_out_totalaction: updatenew_name: haproxy.bytes.output- include: haproxy_backend_bytes_out_totalaction: updatenew_name: haproxy.bytes.output- include: haproxy_server_bytes_out_totalaction: updatenew_name: haproxy.bytes.output- include: haproxy_backend_connection_errors_totalaction: updatenew_name: haproxy.connections.errors- include: haproxy_server_connection_errors_totalaction: updatenew_name: haproxy.connections.errors- include: haproxy_frontend_requests_denied_totalaction: updatenew_name: haproxy.requests.denied- include: haproxy_frontend_request_errors_totalaction: updatenew_name: haproxy.requests.errors- include: haproxy_frontend_http_requests_totalaction: updatenew_name: haproxy.requests.total- include: haproxy_backend_http_requests_totalaction: updatenew_name: haproxy.requests.total- include: haproxy_backend_current_queueaction: updatenew_name: haproxy.requests.queued- include: haproxy_server_current_queueaction: updatenew_name: haproxy.requests.queued- include: haproxy_frontend_current_sessionsaction: updatenew_name: haproxy.sessions.count- include: haproxy_backend_current_sessionsaction: updatenew_name: haproxy.sessions.count- include: haproxy_server_current_sessionsaction: updatenew_name: haproxy.sessions.count- include: haproxy_frontend_max_session_rateaction: updatenew_name: haproxy.sessions.rate- include: haproxy_backend_max_session_rateaction: updatenew_name: haproxy.sessions.rate- include: haproxy_server_max_session_rateaction: updatenew_name: haproxy.sessions.rateresource/cluster:attributes:- key: k8s.cluster.namevalue: "<YOUR_CLUSTER_NAME>"action: insertbatch:send_batch_size: 1024timeout: 30smemory_limiter:check_interval: 1slimit_percentage: 80spike_limit_percentage: 25transform/haproxy:metric_statements:- context: resourcestatements:- set(attributes["haproxy.display.name"], Concat(["server", "k8s", attributes["k8s.cluster.name"], attributes["k8s.namespace.name"], "pod", attributes["k8s.pod.name"], "haproxy", "8404"], ":"))transform/metadata_nullify:metric_statements:- context: metricstatements:- set(description, "")- set(unit, "")exporters:otlp_http/newrelic:endpoint: "<YOUR_NEWRELIC_OTLP_ENDPOINT>"headers:api-key: "<YOUR_NEW_RELIC_LICENSE_KEY>"service:extensions: [health_check, k8s_observer]pipelines:metrics/haproxy_prom:receivers: [receiver_creator/haproxy_prom]processors: [resourcedetection, filter/haproxy, transform/add_labels, metricstransform/rename, resource/cluster, batch, transform/haproxy, transform/metadata_nullify, memory_limiter]exporters: [otlp_http/newrelic]Important
Le montage de volume
/etc/machine-idest requis pour la synthèse d'entités. Le processeurresourcedetectionlit ce fichier pour renseigner l'attribut de ressourcehost.id. Sans cela, les entités ne seront pas créées dans New Relic.Paramètres de configuration
paramètres
Description
labels["app"] == "haproxy"Sélecteur de label de pod utilisé pour découvrir les pods HAProxy. Mettez à jour la règle pour correspondre aux labels de votre pod.
<YOUR_PORT_NUMBER>Le port où HAProxy expose son point de terminaison Prometheus.
<YOUR_CLUSTER_NAME>Remplacez par le nom de votre cluster Kubernetes pour l'identification dans New Relic.
<YOUR_NEWRELIC_OTLP_ENDPOINT>Your New Relic OTLP endpoint. For more information, refer to
.
<YOUR_NEW_RELIC_LICENSE_KEY>Votre clé de licence d'ingestion New Relic.
scrape_intervalFréquence de scraping des métriques Prometheus. Par défaut :
30s.
Installez à l'aide du chart Helm OpenTelemetry en amont :
bash$helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts$helm repo update$helm upgrade --install haproxy-prom-collector open-telemetry/opentelemetry-collector \>-f values.yaml \>-n newrelic --create-namespace
Affichez vos données dans New Relic
Après quelques minutes, les métriques HAProxy apparaissent dans New Relic. Pour trouver vos données :
- Allez à one.newrelic.com > All capabilities > All entities.
- Recherchez vos entités HAProxy par nom ou filtrez par type d'entité
HAPROXYINSTANCE. - Sélectionnez une entité pour afficher la page de résumé avec les métriques dorées (sessions par seconde, requests par seconde, erreurs de connexion).
Dépannage
- Vérifiez que les pods HAProxy ont la bonne étiquette (par exemple,
app: haproxy) :kubectl get pods -l app=haproxy - Vérifiez que le point de terminaison des statistiques répond :
kubectl exec -it <haproxy-pod> -- curl -s http://localhost:8404/stats - Consultez les logs du collecteur pour les erreurs de découverte :
kubectl logs -n newrelic -l app.kubernetes.io/name=nr-k8s-otel-collector -f(NRDOT) oukubectl logs -n newrelic -l app=otel-collector-haproxy -f(manifeste OTel Contrib) - Assurez-vous que le ServiceAccount du collecteur dispose des permissions
get,listetwatchsur les pods.
Chaque pod HAProxy doit créer une entité distincte dans New Relic. Si vous ne voyez qu'une seule entité :
- Vérifiez que le collecteur a
host.iddéfini. Dans les environnements conteneurisés, ajoutez ceci au déploiement du collecteur :env:- name: K8S_NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName- name: OTEL_RESOURCE_ATTRIBUTESvalue: "host.id=$(K8S_NODE_NAME)" - Confirmez les différentes valeurs de
haproxy.addrpar pod en effectuant une requête :FROM Metric SELECT uniques(haproxy.addr) WHERE metricName LIKE 'haproxy.%' SINCE 10 minutes ago
- Le
receiver_creatorutilise l'adresse IP du pod (et nonlocalhost) pour atteindre HAProxy. Assurez-vous que le frontend de statistiques est lié à*:8404(toutes les interfaces), et non à127.0.0.1:8404. - Vérifiez les stratégies réseau qui pourraient bloquer le trafic entre le pod du collecteur et les pod HAProxy.
Prochaines étapes
- Consultez la référence des métriques pour obtenir une liste complète des métriques collectées.
- Découvrez comment trouver et interroger vos données HAProxy.
- Configurez des alertes basées sur les métriques dorées HAProxy.