Esta integração do Kubernetes descobre automaticamente os pods HAProxy em seu cluster e coleta métricas sem configuração manual para cada instância. Ele utiliza o haproxyreceiver e o receivercreator OpenTelemetry para monitorar dinamicamente as sessões do HAProxy, requests, erros e integridade do servidor backend em seu ambiente em contêineres.
Dica
Executando HAProxy em hosts Linux? Consulte o guia de instalação auto-hospedada para implantações em máquinas virtuais ou bare metal.
Antes de você começar
Certifique-se de ter:
- Chave de licençada New Relic válida
- Pods do HAProxy com o endpoint de estatísticas habilitado (normalmente na porta 8404)
- Um rótulo em cada pod HAProxy para descoberta (por exemplo,
app: haproxy) - Se você estiver usando o método de instalação do Helm, conclua a instalação base do Kubernetes OpenTelemetry Helm
Configurar o monitoramento do HAProxy
Adicione as seguintes seções sob
deployment.extraConfigno seuvalues.yaml:Importante
Em
deployment.extraConfig,pipelines:deve ser definido no nível raiz — não aninhado sobservice:. O modelo do Helm chart mapeiaextraConfig.pipelinesparaservice.pipelines, eextraConfig.service.extensionsparaservice.extensions.Extensões:
extensions:k8s_observer:auth_type: serviceAccountobserve_pods: trueobserve_nodes: falseVariáveis de ambiente (adicione em
deployment.envs):deployment:envs:- name: OTEL_RESOURCE_ATTRIBUTESvalue: "host.id=$(KUBE_NODE_NAME)"Importante
O atributo de recurso
host.idé necessário para a síntese de entidade. As imagens de contêiner não têm/etc/machine-id, então você deve injetá-lo viaOTEL_RESOURCE_ATTRIBUTES. O chart do Helm já defineKUBE_NODE_NAMEa partir da Downward API do Kubernetes.Receptores:
receivers:receiver_creator/haproxy:watch_observers: [k8s_observer]receivers:haproxy:rule: type == "pod" && labels["app"] == "haproxy"config:endpoint: 'http://`endpoint`:8404/stats'collection_interval: 30sProcessadores:
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, "")Extensões de serviço:
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]Parâmetro de configuração
A tabela a seguir descreve os principais parâmetros de configuração:
Parâmetro
Descrição
labels["app"] == "haproxy"Seletor de rótulo de pod usado para descobrir pods HAProxy. Atualize a regra para corresponder aos rótulos do seu pod.
<YOUR_PORT_NUMBER>A porta onde o HAProxy expõe seu endpoint de estatísticas.
<YOUR_CLUSTER_NAME>Substitua pelo nome do seu cluster do Kubernetes para identificação no New Relic.
collection_intervalCom que frequência coletar métricas. O padrão é
30s.
Aplique os valores atualizados à sua release do Helm em execução:
bash$helm upgrade nr-k8s-otel-collector newrelic/nr-k8s-otel-collector \>--namespace newrelic \>--reuse-values \>-f values.yaml
Após concluir a instalação base do manifesto do OpenTelemetry para Kubernetes, configure o monitoramento do HAProxy:
Atualize a imagem do coletor para usar o coletor NRDOT.
No arquivo
deployment.yamlno seu diretório localrendered, atualize a imagem para:image: newrelic/nrdot-collector:latestMonte o
/etc/machine-iddo host no contêiner do coletor adicionando-os à especificação de implantação:volumeMounts:- name: machine-idmountPath: /etc/machine-idreadOnly: truevolumes:- name: machine-idhostPath:path: /etc/machine-idtype: FileImportante
O atributo de recurso
host.idé necessário para a síntese da entidade. O processadorresourcedetectionlê/etc/machine-idpara preenchê-lo. Sem essa montagem de volume,host.idnão será definido e as entidades não serão criadas.Substitua o conteúdo em
deployment-configmap.yamlemdeployment-config.yaml: |por: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]Exclua o DaemonSet e a implantação do kube-state-metrics (não são necessários para o monitoramento apenas do HAProxy):
bash$kubectl delete daemonset nr-k8s-otel-collector-daemonset -n newrelic$kubectl delete deployment nr-k8s-otel-collector-kube-state-metrics -n newrelicReinicie a implantação do coletor para aplicar suas alterações:
bash$kubectl rollout restart deployment nr-k8s-otel-collector-deployment -n newrelicParâmetro de configuração
Parâmetro
Descrição
labels["app"] == "haproxy"Seletor de rótulo de pod usado para descobrir pods HAProxy. Atualize a regra para corresponder aos rótulos do seu pod.
<YOUR_PORT_NUMBER>A porta onde o HAProxy expõe seu endpoint de estatísticas.
<YOUR_CLUSTER_NAME>Substitua pelo nome do seu cluster do Kubernetes para identificação no New Relic.
<YOUR_NEWRELIC_OTLP_ENDPOINT>Seu endpoint OTLP da New Relic. Para mais informações, consulte o
.
Implante o OpenTelemetry Collector Contrib em seu cluster do Kubernetes. O coletor descobre e coleta automaticamente métricas de seus pods HAProxy. Escolha entre Helm (usando o chart do Helm do OTel upstream) ou manifestos brutos do Kubernetes.
Crie um arquivo
values.yamlcom a seguinte configuração de monitoramento do HAProxy: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]Parâmetro de configuração
Parâmetro
Descrição
labels["app"] == "haproxy"Seletor de rótulo de pod usado para descobrir pods HAProxy. Atualize a regra para corresponder aos rótulos do seu pod.
<YOUR_PORT_NUMBER>A porta onde o HAProxy expõe seu endpoint de estatísticas.
<YOUR_CLUSTER_NAME>Substitua pelo nome do seu cluster do Kubernetes para identificação no New Relic.
<YOUR_NEWRELIC_OTLP_ENDPOINT>Seu endpoint OTLP da New Relic. Para mais informações, consulte o
.
<YOUR_NEW_RELIC_LICENSE_KEY>Sua chave de licença de ingestão da New Relic.
Instale usando o chart do Helm do OpenTelemetry upstream:
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
Use esta opção se você não puder usar o Helm ou preferir gerenciar os recursos do Kubernetes diretamente com kubectl.
Crie um segredo com sua chave de licença da 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>'Salve o seguinte manifesto em um arquivo (por exemplo,
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: FileImportante
A montagem de volume
/etc/machine-idé necessária para a síntese de entidade. O processadorresourcedetectionlê este arquivo para preencher o atributo de recursohost.id. Sem isso, as entidades não serão criadas no New Relic.Aplique o manifesto:
bash$kubectl apply -f otel-collector-haproxy.yamlVerifique se o coletor está em execução e descobrindo os pods do HAProxy:
bash$kubectl get pods -n newrelic -l app=otel-collector-haproxy$kubectl logs -n newrelic -l app=otel-collector-haproxyVocê deve ver linhas de log mostrando
starting receivercom os IPs do seu pod do HAProxy.Parâmetro de configuração
Parâmetro
Descrição
labels["app"] == "haproxy"Seletor de rótulo de pod usado para descobrir pods HAProxy. Atualize a regra para corresponder aos rótulos do seu pod.
<YOUR_PORT_NUMBER>A porta onde o HAProxy expõe seu endpoint de estatísticas.
<YOUR_CLUSTER_NAME>Substitua pelo nome do seu cluster do Kubernetes para identificação no New Relic.
<YOUR_NEWRELIC_OTLP_ENDPOINT>Seu endpoint OTLP da New Relic. Para mais informações, consulte o
.
<YOUR_NEW_RELIC_LICENSE_KEY>Sua chave de licença de ingestão da New Relic.
Use essa abordagem se seus pods HAProxy já expõem um endpoint /metrics do Prometheus (HAProxy 2.0+) e você prefere coletar métricas do Prometheus em vez de se conectar ao endpoint de estatísticas CSV.
Dica
Se você ainda não tem o endpoint do Prometheus habilitado, use as guias coletor NRDOT ou OpenTelemetry Collector Contrib em vez disso. Eles se conectam diretamente ao endpoint de estatísticas do HAProxy sem precisar de suporte do Prometheus.
Importante
Essa abordagem requer o HAProxy 2.0+ com o endpoint integrado do Prometheus ativado. Sua configuração do HAProxy deve incluir:
frontend stats bind *:8404 http-request use-service prometheus-exporter if { path /metrics }E seus pods do HAProxy devem expor uma porta nomeada para o endpoint de métricas:
ports: - name: metrics containerPort: 8404Conclua a instalação base do Helm do OpenTelemetry para Kubernetes para nr-k8s-otel-collector antes de prosseguir.
Adicione as seguintes seções sob
deployment.configMap.extraConfigno seuvalues.yaml:Importante
Em
deployment.configMap.extraConfig,pipelines:deve ser definido no nível raiz — não aninhado sobservice:. O modelo do Helm chart mapeiaextraConfig.pipelinesparaservice.pipelines, eextraConfig.service.extensionsparaservice.extensions.Extensões:
extensions:k8s_observer:auth_type: serviceAccountobserve_pods: trueobserve_nodes: falseVariáveis de ambiente (adicione em
deployment.envs):deployment:envs:- name: OTEL_RESOURCE_ATTRIBUTESvalue: "host.id=$(KUBE_NODE_NAME)"Importante
O atributo de recurso
host.idé necessário para a síntese de entidade. O processadorresourcedetectionlêOTEL_RESOURCE_ATTRIBUTESpara preenchê-lo. O chart do Helm já defineKUBE_NODE_NAMEa partir da API Downward do Kubernetes.Receptores:
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'Processadores:
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, "")Extensões de serviço:
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]Parâmetro de configuração
Parâmetro
Descrição
labels["app"] == "haproxy"Seletor de rótulo de pod usado para descobrir pods HAProxy. Atualize a regra para corresponder aos rótulos do seu pod.
<YOUR_PORT_NUMBER>A porta onde o HAProxy expõe seu endpoint do Prometheus.
<YOUR_CLUSTER_NAME>Substitua pelo nome do seu cluster do Kubernetes para identificação no New Relic.
scrape_intervalCom que frequência extrair métricas do Prometheus. Padrão:
30s.
Aplique os valores atualizados à sua release do Helm em execução:
bash$helm upgrade nr-k8s-otel-collector newrelic/nr-k8s-otel-collector \>--namespace newrelic \>--reuse-values \>-f values.yaml
Crie um arquivo
values.yamlcom a configuração do receiver do 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]Importante
A montagem de volume
/etc/machine-idé necessária para a síntese de entidade. O processadorresourcedetectionlê este arquivo para preencher o atributo de recursohost.id. Sem isso, as entidades não serão criadas no New Relic.Parâmetro de configuração
Parâmetro
Descrição
labels["app"] == "haproxy"Seletor de rótulo de pod usado para descobrir pods HAProxy. Atualize a regra para corresponder aos rótulos do seu pod.
<YOUR_PORT_NUMBER>A porta onde o HAProxy expõe seu endpoint do Prometheus.
<YOUR_CLUSTER_NAME>Substitua pelo nome do seu cluster do Kubernetes para identificação no New Relic.
<YOUR_NEWRELIC_OTLP_ENDPOINT>Seu endpoint OTLP da New Relic. Para mais informações, consulte o
.
<YOUR_NEW_RELIC_LICENSE_KEY>Sua chave de licença de ingestão da New Relic.
scrape_intervalCom que frequência extrair métricas do Prometheus. Padrão:
30s.
Instale usando o chart do Helm do OpenTelemetry upstream:
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
Visualize seus dados no New Relic
Após alguns minutos, as métricas do HAProxy aparecem no New Relic. Para encontrar seus dados:
- Vá para one.newrelic.com > All capabilities > All entities.
- Pesquise suas entidades do HAProxy por nome ou filtre por tipo de entidade
HAPROXYINSTANCE. - Selecione uma entidade para visualizar a página de resumo com métricas clássicas (sessões por segundo, requests por segundo, erros de conexão).
Resolução de problemas
- Verifique se os pods do HAProxy têm o rótulo correto (por exemplo,
app: haproxy):kubectl get pods -l app=haproxy - Verifique se o endpoint de estatísticas responde:
kubectl exec -it <haproxy-pod> -- curl -s http://localhost:8404/stats - Revise os logs do coletor em busca de erros de descoberta:
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(manifesto do OTel Contrib) - Certifique-se de que o ServiceAccount do coletor tenha permissões de
get,listewatchnos pods.
Cada pod do HAProxy deve criar uma entidade separada no New Relic. Se você vir apenas uma entidade:
- Verifique se o coletor tem
host.iddefinido. Em ambientes em contêineres, adicione isso à implantação do coletor:env:- name: K8S_NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName- name: OTEL_RESOURCE_ATTRIBUTESvalue: "host.id=$(K8S_NODE_NAME)" - Confirme diferentes valores de
haproxy.addrpor pod consultando:FROM Metric SELECT uniques(haproxy.addr) WHERE metricName LIKE 'haproxy.%' SINCE 10 minutes ago
- O
receiver_creatorusa o IP do pod (nãolocalhost) para alcançar o HAProxy. Certifique-se de que o frontend de estatísticas esteja vinculado a*:8404(todas as interfaces), não a127.0.0.1:8404. - Verifique as políticas de rede que podem bloquear o tráfego entre o pod do coletor e os pods do HAProxy.
Próximos passos
- Revise a referência de métricas para obter uma lista completa de métricas coletadas.
- Saiba como encontrar e consultar seus dados do HAProxy.
- Configure alertas com base nas métricas clássicas do HAProxy.