Monitorez vos équilibreurs de charge HAProxy auto-hébergés avec OpenTelemetry pour envoyer des métriques de performance et des données télémétriques à New Relic.
Vous pouvez choisir entre trois options de collecteur :
- NRDOT : Distribution New Relic d’OpenTelemetry (recommandée — automatisée via l’installation guidée)
- OTel Collector Contrib : Collector OpenTelemetry standard avec le haproxyreceiver
- Récepteur Prometheus : pour les environnements utilisant déjà le point de terminaison Prometheus intégré de HAProxy (HAProxy 2.0+)
Conseil
Si vous utilisez actuellement nri-haproxy et souhaitez passer à OpenTelemetry, désactivez l’intégration legacy et suivez les étapes de configuration ci-dessous. L’approche basée sur OTel fournit des métriques dimensionnelles avec des métadonnées plus riches (haproxy.proxy_name, haproxy.service_name par frontend/backend/serveur).
Avant de commencer
Assurez-vous d'avoir :
Clé de licenceNew Relic valide
HAProxy version 2.0 ou ultérieure avec le point de terminaison de statistiques activé (toute version prenant en charge les statistiques ; le chemin Prometheus nécessite la version 2.0+)
L'un des collecteurs suivants installés sur un hôte Linux :
Accès réseau de l'hôte Linux vers :
- Point de terminaison des statistiques HAProxy (généralement
http://localhost:8404/stats) - Le point de terminaison OTLPde New Relic
- Point de terminaison des statistiques HAProxy (généralement
Configurer le monitoring HAProxy
Choisissez votre collecteur préféré et suivez les étapes :
Le collecteur NRDOT est une distribution préconfigurée qui inclut le haproxyreceiver et des composants spécifiques à New Relic.
Pour installer et configurer le collecteur NRDOT, suivez ces étapes :
Conseil
Si une étape de vérification échoue, installez les composants manquants avant de poursuivre. Besoin d'aide pour installer le collecteur NRDOT ? Consultez la section d'installation du référentiel nrdot-collector-releases.
Lors de l'installation, utilisez export collector_distro="nrdot-collector"
Si vous n’avez pas encore activé le point de terminaison de statistiques HAProxy, ajoutez ce qui suit à votre haproxy.cfg:
frontend stats bind *:8404 stats enable stats uri /stats stats refresh 10sRechargez HAProxy pour appliquer la configuration :
$sudo systemctl reload haproxyVérifiez que le point de terminaison des statistiques est accessible :
$curl -s http://localhost:8404/statsVous devriez voir une sortie HTML avec les statistiques HAProxy.
Configurez le collecteur NRDOT pour collecter les métriques de votre point de terminaison de statistiques HAProxy et les envoyer à New Relic.
Important
Choisissez votre approche de monitoring:
Monitoring HAProxy uniquement (ce guide) : monitore juste les performances et les métriques de votre équilibreur de charge HAProxy
Monitoring complet du serveur : monitore HAProxy ainsi que tout votre serveur (utilisation du CPU, mémoire, espace disque, logs système)
Si vous souhaitez monitorer l’ensemble de votre serveur, et pas seulement HAProxy, utilisez plutôt la configuration par défaut du collecteur NRDOT et ajoutez-y la configuration du récepteur HAProxy.
Créez le fichier de configuration /etc/nrdot-collector/haproxy-config.yaml:
receivers: haproxy: endpoint: http://localhost:8404/stats collection_interval: 15s
processors: resourcedetection: detectors: [system] system: resource_attributes: host.name: enabled: true host.id: enabled: true
batch:
exporters: otlphttp: endpoint: ${env:OTEL_EXPORTER_OTLP_ENDPOINT} headers: api-key: ${env:NEW_RELIC_LICENSE_KEY}
service: pipelines: metrics: receivers: [haproxy] processors: [resourcedetection, batch] exporters: [otlphttp]Cette configuration collecte les 17 métriques par défaut à un intervalle de 15 secondes. Le haproxyreceiver attache automatiquement les attributs haproxy.proxy_name, haproxy.service_name et haproxy.addr à chaque métrique.
Pour activer des métriques supplémentaires pour une visibilité plus approfondie (27 au total : 17 par défaut + 10 facultatives), ajoutez des métriques facultatives :
receivers: haproxy: endpoint: http://localhost:8404/stats collection_interval: 15s metrics: haproxy.connections.average_time: enabled: true haproxy.requests.average_time: enabled: true haproxy.responses.average_time: enabled: true haproxy.active: enabled: true haproxy.backup: enabled: true haproxy.downtime: enabled: true haproxy.failed_checks: enabled: true haproxy.weight: enabled: true haproxy.sessions.total: enabled: true haproxy.connections.total: enabled: trueConseil
La configuration optimisée ci-dessous réduit l’ingestion de données d’environ 85 % par rapport au mode complet. Tous les dashboards et métriques dorées restent entièrement fonctionnels.
Pour réduire le volume d’ingestion de données, utilisez un intervalle de 60 secondes et ajoutez des processeurs d’optimisation :
receivers: haproxy: endpoint: http://localhost:8404/stats collection_interval: 60s
processors: resourcedetection: detectors: [system] system: resource_attributes: host.name: enabled: true host.id: enabled: true
transform/metadata_nullify: metric_statements: - context: metric statements: - set(description, "") where description != "" - set(unit, "") where unit != ""
resource/remove_attributes: attributes: - key: os.description action: delete - key: telemetry.sdk.version action: delete - key: telemetry.sdk.language action: delete - key: telemetry.sdk.name action: delete - key: host.arch action: delete
batch: send_batch_size: 2048 timeout: 30s
exporters: otlphttp: endpoint: ${env:OTEL_EXPORTER_OTLP_ENDPOINT} headers: api-key: ${env:NEW_RELIC_LICENSE_KEY}
service: pipelines: metrics: receivers: [haproxy] processors: [resourcedetection, transform/metadata_nullify, resource/remove_attributes, batch] exporters: [otlphttp]Paramètres de configuration
paramètres | Description |
|---|---|
| Remplacez par l’URL de votre point de terminaison de statistiques HAProxy (par exemple
) |
| Intervalle entre les collectes de métriques.
pour tous les détails,
pour un volume d’ingestion plus faible |
Mettez à jour la configuration du collecteur NRDOT pour utiliser votre fichier de configuration HAProxy et définissez le point de terminaison OTLP.
Pour plus d’informations sur votre point de terminaison OTLP, consultez le point de terminaison OTLP New Relic.
Important
Votre clé de licence est déjà configurée dans /etc/nrdot-collector/nrdot-collector.conf lors de l'installation. Il vous suffit de mettre à jour le chemin du fichier de configuration et le point de terminaison OTLP.
Mettez à jour le fichier de configuration du collecteur :
$export collector_distro="nrdot-collector"$export otlp_endpoint="<YOUR_NEWRELIC_OTLP_ENDPOINT>" # Replace with your region's endpoint$
$# Update the config file path to point to haproxy-config.yaml$sudo sed -i 's|OTELCOL_OPTIONS="--config=/etc/nrdot-collector/config.yaml"|OTELCOL_OPTIONS="--config=/etc/nrdot-collector/haproxy-config.yaml"|' /etc/${collector_distro}/${collector_distro}.conf$
$# Add the OTLP endpoint$echo "OTEL_EXPORTER_OTLP_ENDPOINT=${otlp_endpoint}" | sudo tee -a /etc/${collector_distro}/${collector_distro}.conf > /dev/nullDémarrez (ou redémarrez) le service du collecteur NRDOT :
$sudo systemctl daemon-reload$sudo systemctl restart nrdot-collectorVérifiez l'état du service :
$sudo systemctl status nrdot-collectorExaminez les logs pour détecter d’éventuelles erreurs de configuration :
$sudo journalctl -u nrdot-collector -n 50 --no-pagerPatientez 2 à 3 minutes pour que les données affluent, puis vérifiez dans New Relic :
FROM Metric SELECT uniques(metricName)WHERE metricName LIKE 'haproxy.%'SINCE 10 minutes agoVous devriez voir 17 (par défaut) ou 27 (toutes les métriques activées) noms de métrique HAProxy uniques. Vérifiez les attributs dimensionnels :
FROM Metric SELECT latest(haproxy.sessions.count)FACET haproxy.proxy_name, haproxy.service_nameSINCE 5 minutes agoVous pouvez utiliser la distribution OpenTelemetry Collector Contrib avec le haproxyreceiver pour monitorer votre serveur HAProxy. Le haproxyreceiver récupère le point de terminaison de statistiques CSV de HAProxy et produit des métriques dimensionnelles avec une granularité par frontend, par backend, et par serveur.
Si vous n’avez pas encore activé le point de terminaison de statistiques HAProxy, ajoutez ce qui suit à votre haproxy.cfg:
frontend stats bind *:8404 stats enable stats uri /stats stats refresh 10sRechargez HAProxy pour appliquer la configuration :
$sudo systemctl reload haproxyVérifiez que le point de terminaison des statistiques est accessible :
$curl -s http://localhost:8404/statsSi vous n'avez pas encore installé OpenTelemetry Collector Contrib, téléchargez et installez la dernière sortie à partir des sorties d'OpenTelemetry Collector:
Pour Debian/Ubuntu :
$wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/latest/download/otelcol-contrib_<VERSION>_linux_amd64.deb$sudo dpkg -i otelcol-contrib_<VERSION>_linux_amd64.debPour RHEL/Amazon Linux :
$wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/latest/download/otelcol-contrib_<VERSION>_linux_amd64.rpm$sudo rpm -U otelcol-contrib_<VERSION>_linux_amd64.rpmImportant
Avant de modifier : sauvegardez votre configuration existante : sudo cp /etc/otelcol-contrib/config.yaml /etc/otelcol-contrib/config.yaml.backup
Remplacez le contenu de votre fichier de configuration du collecteur (/etc/otelcol-contrib/config.yaml) par :
receivers: haproxy: endpoint: http://localhost:8404/stats collection_interval: 15s
processors: resourcedetection: detectors: [system] system: resource_attributes: host.name: enabled: true host.id: enabled: true
batch:
exporters: otlphttp: endpoint: ${env:OTEL_EXPORTER_OTLP_ENDPOINT} headers: api-key: ${env:NEW_RELIC_LICENSE_KEY}
service: pipelines: metrics: receivers: [haproxy] processors: [resourcedetection, batch] exporters: [otlphttp]Cette configuration minimale collecte les 17 métriques par défaut. Le haproxyreceiver attache automatiquement les attributs haproxy.proxy_name, haproxy.service_name et haproxy.addr à chaque métrique.
Pour activer des métriques supplémentaires pour une visibilité plus approfondie (27 au total : 17 par défaut + 10 facultatives), ajoutez une section metrics :
receivers: haproxy: endpoint: http://localhost:8404/stats collection_interval: 15s metrics: haproxy.connections.average_time: enabled: true haproxy.requests.average_time: enabled: true haproxy.responses.average_time: enabled: true haproxy.active: enabled: true haproxy.backup: enabled: true haproxy.downtime: enabled: true haproxy.failed_checks: enabled: true haproxy.weight: enabled: true haproxy.sessions.total: enabled: true haproxy.connections.total: enabled: trueParamètres de configuration
paramètres | Description |
|---|---|
| L'URL de votre point de terminaison de statistiques HAProxy (par exemple
) |
| Intervalle entre les collectes de métriques. Recommandé :
pour tous les détails ou
pour un volume d’ingestion inférieur |
Définissez les variables d'environnement requises :
$# Set your New Relic license key$export NEW_RELIC_LICENSE_KEY="<YOUR_LICENSE_KEY>"$
$# Set the OTLP endpoint. For more information, refer to New Relic OTLP endpoint: https://docs.newrelic.com/docs/opentelemetry/best-practices/opentelemetry-otlp$export OTEL_EXPORTER_OTLP_ENDPOINT="<YOUR_NEWRELIC_OTLP_ENDPOINT>"Pour un service systemd, ajoutez-les au fichier d’environnement du service :
$echo "NEW_RELIC_LICENSE_KEY=<YOUR_LICENSE_KEY>" | sudo tee -a /etc/otelcol-contrib/otelcol-contrib.conf$echo "OTEL_EXPORTER_OTLP_ENDPOINT=<YOUR_NEWRELIC_OTLP_ENDPOINT>" | sudo tee -a /etc/otelcol-contrib/otelcol-contrib.confRemplacez <YOUR_LICENSE_KEY> par votre .
Démarrez (ou redémarrez) le service du collecteur :
$sudo systemctl daemon-reload$sudo systemctl restart otelcol-contribVérifiez l'état du service :
$sudo systemctl status otelcol-contribExaminez les logs pour détecter d’éventuelles erreurs de configuration :
$sudo journalctl -u otelcol-contrib -n 50 --no-pagerPatientez 2 à 3 minutes pour que les données affluent, puis vérifiez dans New Relic :
FROM Metric SELECT uniques(metricName)WHERE metricName LIKE 'haproxy.%'SINCE 10 minutes agoVous devriez voir apparaître des métriques HAProxy. Vérifiez les attributs dimensionnels :
FROM Metric SELECT latest(haproxy.sessions.count)WHERE metricName = 'haproxy.sessions.count'FACET haproxy.proxy_name, haproxy.service_nameSINCE 5 minutes agoUtilisez cette approche si le point de terminaison Prometheus intégré de HAProxy est déjà activé dans votre environnement, ou si vous migrez depuis une stack de monitoring basée sur Prometheus.
Conseil
Recommandé : si vous n’avez pas déjà activé le point de terminaison Prometheus HAProxy, utilisez plutôt les onglets collecteur NRDOT ou OpenTelemetry Collector Contrib. Ils se connectent directement au point de terminaison de statistiques HAProxy sans nécessiter le module exportateur Prometheus.
Ajoutez l’exportateur Prometheus à votre frontend de statistiques dans haproxy.cfg:
frontend stats bind *:8404 http-request use-service prometheus-exporter if { path /metrics } stats enable stats uri /stats stats refresh 10sLa ligne clé est http-request use-service prometheus-exporter if { path /metrics } : cela intercepte les requests vers /metrics et sert des métriques au format Prometheus via le module promex intégré d’HAProxy.
Conseil
Si vous exécutez HAProxy 2.0–2.3, vous devez également ajouter option http-use-htx au frontend. Cette option est devenue la valeur par défaut dans HAProxy 2.4+ et n'est plus nécessaire.
Rechargez HAProxy :
$sudo systemctl reload haproxyVérifiez le point de terminaison Prometheus :
$curl -s http://localhost:8404/metrics | head -20Vous devriez voir des métriques au format Prometheus telles que haproxy_frontend_current_sessions et haproxy_backend_http_responses_total. HAProxy expose environ 204 métriques via ce point de terminaison.
Important
Le point de terminaison Prometheus nécessite HAProxy 2.0 ou une version ultérieure. Si vous exécutez une version plus ancienne, utilisez plutôt l'onglet Collecteur Otel Contrib avec le haproxyreceiver, qui utilise le point de terminaison de statistiques CSV et fonctionne avec toutes les versions de HAProxy.
Si vous n'avez pas encore installé OpenTelemetry Collector Contrib, téléchargez et installez la dernière sortie à partir des sorties d'OpenTelemetry Collector:
Pour Debian/Ubuntu :
$wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/latest/download/otelcol-contrib_<VERSION>_linux_amd64.deb$sudo dpkg -i otelcol-contrib_<VERSION>_linux_amd64.debPour RHEL/Amazon Linux :
$wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/latest/download/otelcol-contrib_<VERSION>_linux_amd64.rpm$sudo rpm -U otelcol-contrib_<VERSION>_linux_amd64.rpmCette configuration récupère les données du point de terminaison Prometheus de HAProxy, filtre les métriques pertinentes, transforme les étiquettes pour correspondre au schéma d'attribut de haproxyreceiver (haproxy.proxy_name, haproxy.service_name), et renomme les métriques selon la convention de nommage OTel haproxy.*.
Cette configuration fonctionne à la fois avec NRDOT et OTel Collector Contrib. Placez-le dans l’emplacement de configuration approprié :
NRDOT :
/etc/nrdot-collector/config.yamlCollecteur OTel Contrib :
/etc/otelcol-contrib/config.yamlImportant
Avant de modifier : sauvegardez votre configuration existante :
bash$# NRDOT$sudo cp /etc/nrdot-collector/config.yaml /etc/nrdot-collector/config.yaml.backup$# OTel Collector Contrib$sudo cp /etc/otelcol-contrib/config.yaml /etc/otelcol-contrib/config.yaml.backupRemplacez le contenu de votre fichier de configuration du collecteur par :
receivers:prometheus/haproxy_transform:config:scrape_configs:- job_name: haproxy_transformscrape_interval: 30sstatic_configs:- targets: ["localhost:8404"]metrics_path: /metricsprocessors:# Filter to keep only the metrics we need to transformfilter/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_responses_denied_total"- "haproxy_frontend_http_requests_total"- "haproxy_frontend_connections_rate_max"- "haproxy_frontend_http_requests_rate_max"- "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_retry_warnings_total"- "haproxy_backend_requests_denied_total"- "haproxy_backend_responses_denied_total"- "haproxy_backend_redispatch_warnings_total"- "haproxy_backend_http_requests_total"- "haproxy_backend_response_errors_total"- "haproxy_backend_loadbalanced_total"- "haproxy_backend_current_queue"- "haproxy_backend_total_time_average_seconds"- "haproxy_backend_current_sessions"- "haproxy_backend_max_session_rate"- "haproxy_server_bytes_in_total"- "haproxy_server_bytes_out_total"- "haproxy_server_connection_errors_total"- "haproxy_server_retry_warnings_total"- "haproxy_server_responses_denied_total"- "haproxy_server_redispatch_warnings_total"- "haproxy_server_response_errors_total"- "haproxy_server_loadbalanced_total"- "haproxy_server_current_queue"- "haproxy_server_total_time_average_seconds"- "haproxy_server_current_sessions"- "haproxy_server_max_session_rate"# Add haproxy.service_name and haproxy.proxy_name attributes using OTTLtransform/add_labels:metric_statements:- context: datapointstatements:# Frontend metrics: haproxy.service_name = "FRONTEND"- set(attributes["haproxy.service_name"], "FRONTEND") where metric.name == "haproxy_frontend_bytes_in_total"- set(attributes["haproxy.service_name"], "FRONTEND") where metric.name == "haproxy_frontend_bytes_out_total"- set(attributes["haproxy.service_name"], "FRONTEND") where metric.name == "haproxy_frontend_requests_denied_total"- set(attributes["haproxy.service_name"], "FRONTEND") where metric.name == "haproxy_frontend_request_errors_total"- set(attributes["haproxy.service_name"], "FRONTEND") where metric.name == "haproxy_frontend_responses_denied_total"- set(attributes["haproxy.service_name"], "FRONTEND") where metric.name == "haproxy_frontend_http_requests_total"- set(attributes["haproxy.service_name"], "FRONTEND") where metric.name == "haproxy_frontend_connections_rate_max"- set(attributes["haproxy.service_name"], "FRONTEND") where metric.name == "haproxy_frontend_http_requests_rate_max"- set(attributes["haproxy.service_name"], "FRONTEND") where metric.name == "haproxy_frontend_current_sessions"- set(attributes["haproxy.service_name"], "FRONTEND") where metric.name == "haproxy_frontend_max_session_rate"# Backend metrics: haproxy.service_name = "BACKEND"- set(attributes["haproxy.service_name"], "BACKEND") where metric.name == "haproxy_backend_bytes_in_total"- set(attributes["haproxy.service_name"], "BACKEND") where metric.name == "haproxy_backend_bytes_out_total"- set(attributes["haproxy.service_name"], "BACKEND") where metric.name == "haproxy_backend_connection_errors_total"- set(attributes["haproxy.service_name"], "BACKEND") where metric.name == "haproxy_backend_retry_warnings_total"- set(attributes["haproxy.service_name"], "BACKEND") where metric.name == "haproxy_backend_requests_denied_total"- set(attributes["haproxy.service_name"], "BACKEND") where metric.name == "haproxy_backend_responses_denied_total"- set(attributes["haproxy.service_name"], "BACKEND") where metric.name == "haproxy_backend_redispatch_warnings_total"- set(attributes["haproxy.service_name"], "BACKEND") where metric.name == "haproxy_backend_http_requests_total"- set(attributes["haproxy.service_name"], "BACKEND") where metric.name == "haproxy_backend_response_errors_total"- set(attributes["haproxy.service_name"], "BACKEND") where metric.name == "haproxy_backend_loadbalanced_total"- set(attributes["haproxy.service_name"], "BACKEND") where metric.name == "haproxy_backend_current_queue"- set(attributes["haproxy.service_name"], "BACKEND") where metric.name == "haproxy_backend_total_time_average_seconds"- set(attributes["haproxy.service_name"], "BACKEND") where metric.name == "haproxy_backend_current_sessions"- set(attributes["haproxy.service_name"], "BACKEND") where metric.name == "haproxy_backend_max_session_rate"# Server metrics: haproxy.service_name = server label value- set(attributes["haproxy.service_name"], attributes["server"]) where metric.name == "haproxy_server_bytes_in_total"- set(attributes["haproxy.service_name"], attributes["server"]) where metric.name == "haproxy_server_bytes_out_total"- set(attributes["haproxy.service_name"], attributes["server"]) where metric.name == "haproxy_server_connection_errors_total"- set(attributes["haproxy.service_name"], attributes["server"]) where metric.name == "haproxy_server_retry_warnings_total"- set(attributes["haproxy.service_name"], attributes["server"]) where metric.name == "haproxy_server_responses_denied_total"- set(attributes["haproxy.service_name"], attributes["server"]) where metric.name == "haproxy_server_redispatch_warnings_total"- set(attributes["haproxy.service_name"], attributes["server"]) where metric.name == "haproxy_server_response_errors_total"- set(attributes["haproxy.service_name"], attributes["server"]) where metric.name == "haproxy_server_loadbalanced_total"- set(attributes["haproxy.service_name"], attributes["server"]) where metric.name == "haproxy_server_current_queue"- set(attributes["haproxy.service_name"], attributes["server"]) where metric.name == "haproxy_server_total_time_average_seconds"- set(attributes["haproxy.service_name"], attributes["server"]) where metric.name == "haproxy_server_current_sessions"- set(attributes["haproxy.service_name"], attributes["server"]) where metric.name == "haproxy_server_max_session_rate"# Rename proxy label to haproxy.proxy_name for ALL metrics- set(attributes["haproxy.proxy_name"], attributes["proxy"]) where attributes["proxy"] != nil# Remove old Prometheus labels- delete_key(attributes, "proxy") where attributes["proxy"] != nil- delete_key(attributes, "server") where attributes["server"] != nil# Rename metrics to match haproxyreceiver naming conventionmetricstransform/rename:transforms:# haproxy.bytes.input- 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# haproxy.bytes.output- 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# haproxy.connections.errors- include: haproxy_backend_connection_errors_totalaction: updatenew_name: haproxy.connections.errors- include: haproxy_server_connection_errors_totalaction: updatenew_name: haproxy.connections.errors# haproxy.connections.retries- include: haproxy_backend_retry_warnings_totalaction: updatenew_name: haproxy.connections.retries- include: haproxy_server_retry_warnings_totalaction: updatenew_name: haproxy.connections.retries# haproxy.requests.denied- include: haproxy_frontend_requests_denied_totalaction: updatenew_name: haproxy.requests.denied- include: haproxy_backend_requests_denied_totalaction: updatenew_name: haproxy.requests.denied# haproxy.requests.errors- include: haproxy_frontend_request_errors_totalaction: updatenew_name: haproxy.requests.errors# haproxy.requests.redispatched- include: haproxy_backend_redispatch_warnings_totalaction: updatenew_name: haproxy.requests.redispatched- include: haproxy_server_redispatch_warnings_totalaction: updatenew_name: haproxy.requests.redispatched# haproxy.requests.total- include: haproxy_frontend_http_requests_totalaction: updatenew_name: haproxy.requests.total- include: haproxy_backend_http_requests_totalaction: updatenew_name: haproxy.requests.total# haproxy.responses.denied- include: haproxy_frontend_responses_denied_totalaction: updatenew_name: haproxy.responses.denied- include: haproxy_backend_responses_denied_totalaction: updatenew_name: haproxy.responses.denied- include: haproxy_server_responses_denied_totalaction: updatenew_name: haproxy.responses.denied# haproxy.responses.errors- include: haproxy_backend_response_errors_totalaction: updatenew_name: haproxy.responses.errors- include: haproxy_server_response_errors_totalaction: updatenew_name: haproxy.responses.errors# haproxy.server_selected.total- include: haproxy_backend_loadbalanced_totalaction: updatenew_name: haproxy.server_selected.total- include: haproxy_server_loadbalanced_totalaction: updatenew_name: haproxy.server_selected.total# haproxy.connections.rate- include: haproxy_frontend_connections_rate_maxaction: updatenew_name: haproxy.connections.rate# haproxy.requests.queued- include: haproxy_backend_current_queueaction: updatenew_name: haproxy.requests.queued- include: haproxy_server_current_queueaction: updatenew_name: haproxy.requests.queued# haproxy.requests.rate- include: haproxy_frontend_http_requests_rate_maxaction: updatenew_name: haproxy.requests.rate# haproxy.sessions.average- include: haproxy_backend_total_time_average_secondsaction: updatenew_name: haproxy.sessions.average- include: haproxy_server_total_time_average_secondsaction: updatenew_name: haproxy.sessions.average# haproxy.sessions.count- 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# haproxy.sessions.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.rate# Add resource attributes and strip Prometheus auto-labelsresource/haproxy_transform:attributes:- key: haproxy.addrvalue: "http://localhost:8404/stats"action: upsert- key: service.nameaction: delete- key: service.instance.idaction: delete- key: net.host.nameaction: delete- key: net.host.portaction: delete- key: server.portaction: delete- key: url.schemeaction: deleteresourcedetection:detectors: [system]system:resource_attributes:host.name:enabled: truehost.id:enabled: trueos.type:enabled: truetransform/metadata_nullify:metric_statements:- context: metricstatements:- set(description, "")- set(unit, "")batch:exporters:otlphttp:endpoint: ${env:OTEL_EXPORTER_OTLP_ENDPOINT}headers:api-key: ${env:NEW_RELIC_LICENSE_KEY}service:pipelines:metrics/haproxy_transform:receivers:- prometheus/haproxy_transformprocessors:- filter/haproxy- transform/add_labels- metricstransform/rename- resourcedetection- resource/haproxy_transform- transform/metadata_nullify- batchexporters:- otlphttpImportant
Cette configuration effectue trois transformations clés :
- Filtres pour ne conserver que les 36 métriques Prometheus qui correspondent aux 17 métriques OTel par défaut (sur les niveaux frontend/backend/serveur)
- Ajoute des attributs dimensionnels (
haproxy.proxy_name,haproxy.service_name) correspondant au schéma d'attribut de haproxyreceiver - Renomme les métriques de la nomenclature Prometheus (
haproxy_frontend_*) vers la nomenclature OTel (haproxy.*) pour des dashboards et des alertes cohérents
Paramètres de configuration
paramètres
Description
targetsAdresse du point de terminaison Prometheus HAProxy (par défaut
localhost:8404)
haproxy.addrvaleur
Remplacez par l'URL de votre point de terminaison des statistiques HAProxy
scrape_intervalÀ quelle fréquence scraper le point de terminaison Prometheus. Par défaut :
30s
Créez un fichier de surcharge systemd avec vos identifiants New Relic :
$sudo mkdir -p /etc/systemd/system/<collector-service>.service.d$cat <<EOF | sudo tee /etc/systemd/system/<collector-service>.service.d/environment.conf$[Service]$Environment="NEW_RELIC_LICENSE_KEY=<YOUR_LICENSE_KEY>"$Environment="OTEL_EXPORTER_OTLP_ENDPOINT=<YOUR_NEWRELIC_OTLP_ENDPOINT>"$EOFRemplacez <YOUR_LICENSE_KEY> par votre et <collector-service> par le nom de votre service de collecteur (par exemple otelcol-contrib ou nrdot-collector).
$sudo systemctl daemon-reload$sudo systemctl restart <collector-service>Vérifiez l’état du service et les logs :
$sudo systemctl status <collector-service>$sudo journalctl -u <collector-service> -n 20Vous devriez voir Active: active (running) sans erreurs.
Après quelques minutes, exécutez cette requête NRQL dans le générateur de requêtes:
FROM Metric SELECT *WHERE metricName LIKE 'haproxy.%'SINCE 10 minutes agoAffichez vos données dans New Relic
Une fois que les données circulent, trouvez vos métriques HAProxy dans New Relic :
- 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).
Pour d’autres façons d’explorer vos données, consultez Trouver et interroger vos données HAProxy.
Dépannage
Si vous rencontrez des problèmes lors de l'installation, utilisez ce guide de dépannage pour diagnostiquer et résoudre les problèmes courants.
Vérifiez que le frontend de statistiques est configuré dans haproxy.cfg:
$sudo haproxy -c -f /etc/haproxy/haproxy.cfg$grep -A 4 "frontend stats" /etc/haproxy/haproxy.cfgSolutions :
- Assurez-vous que le port
bind(8404 par défaut) n’est pas utilisé par un autre processus :sudo ss -tlnp | grep 8404 - Vérifiez que HAProxy est en cours d'exécution :
sudo systemctl status haproxy - Rechargez la configuration après les modifications :
sudo systemctl reload haproxy
Vérifiez les logs du collecteur pour les erreurs de configuration :
$sudo journalctl -u otelcol-contrib -n 100 --no-pager$# or for NRDOT:$sudo journalctl -u nrdot-collector -n 100 --no-pagerCauses courantes :
- Syntaxe YAML non valide dans le fichier de configuration
- Variables d'environnement manquantes (
NEW_RELIC_LICENSE_KEY,OTEL_EXPORTER_OTLP_ENDPOINT) - Conflits de ports sur le port de télémétrie du collecteur
- Prévoyez 2 à 3 minutes pour l’ingestion initiale des données
- Vérifiez que le collecteur est en cours d'exécution :
sudo systemctl status otelcol-contrib - Vérifiez que le point de terminaison des statistiques est accessible depuis l'hôte du collecteur :
curl -s http://localhost:8404/stats - Vérifiez que votre clé de licence est correcte et que le point de terminaison OTLP est configuré correctement. Pour plus d’informations, consultez le point de terminaison OTLP New Relic.
- Requête pour toutes les métriques HAProxy :FROM Metric SELECT count(*) WHERE metricName LIKE 'haproxy.%' SINCE 30 minutes ago
Si vous voyez 401 Unauthorized ou 403 Forbidden dans les logs du collecteur :
- Vérifiez votre clé de licence : assurez-vous qu’il s’agit d’une clé d’ ingestion (INGEST - LICENSE), et non d’une clé utilisateur
- Vérifiez que le point de terminaison est défini correctement. Pour plus d’informations, consultez le point de terminaison OTLP New Relic.
- Assurez-vous que la variable d'environnement est correctement définie :
echo $NEW_RELIC_LICENSE_KEY
L'exportateur Prometheus intégré de HAProxy (promex) nécessite la version 2.0 ou ultérieure.
Vérifiez votre version de HAProxy :
$haproxy -vSi vous exécutez une version antérieure à 2.0, utilisez plutôt l’onglet OTel Collector Contrib avec le haproxyreceiver, qui utilise le point de terminaison de statistiques CSV et fonctionne avec toutes les versions de HAProxy qui prennent en charge les statistiques.
Si vous exécutez HAProxy 2.0-2.3, vérifiez que option http-use-htx est présent dans la configuration frontend des statistiques. Cette option est devenue la valeur par défaut dans HAProxy 2.4+ et n’est pas nécessaire pour les versions plus récentes.
Prochaines étapes
- Monitorer HAProxy sur Kubernetes — découverte automatique des pods pour les environnements conteneurisés
- Trouver et interroger vos données HAProxy — dashboards, requêtes NRQL et navigation dans les données
- Référence des métriques OTel HAProxy : liste complète des métriques collectées
- Bonnes pratiques OpenTelemetry - conseils généraux pour OTel avec New Relic