Monitore seus clusters Elasticsearch no Kubernetes implantando o OpenTelemetry Collector com descoberta automática de pods. Esta integração usa o elasticsearchreceiver e o receivercreator para descobrir e monitorar automaticamente pods do Elasticsearch sem configuração manual.
Para começar, selecione a distribuição do coletor que melhor se adequa ao seu ambiente Kubernetes:
Você pode escolher entre três opções de coletor:
- NRDOT: Distribuição New Relic do OpenTelemetry
- OTel Collector Contrib: Coletor OpenTelemetry padrão com componentes contribuídos pela comunidade
- Receptor do Prometheus: para ambientes que já executam um exportador do Prometheus para Elasticsearch
Opções de instalação
Escolha a distribuição do coletor que atenda às suas necessidades:
Antes de você começar
Antes de implantar o coletor NRDOT no Kubernetes, certifique-se de ter:
Privilégios de acesso necessários:
Seu New Relic
Acesso do kubectl ao seu cluster Kubernetes
Privilégios de administrador de cluster do Elasticsearch com privilégio de cluster
monitoroumanage(consulte a documentação de privilégios de segurança do Elasticsearch para obter detalhes)Requisitos do sistema:
Elasticsearch versão 7.16 ou superior - Esta integração requer um cluster Elasticsearch moderno
Cluster Kubernetes - Um cluster Kubernetes em execução onde o Elasticsearch está implantado
Conectividade de rede - HTTPS de saída (porta 443) para o endpoint de ingestão OTLPda New Relic
Requisitos do pod do Elasticsearch:
Rótulos do pod (Obrigatório) - Cada pod do Elasticsearch deve ter o rótulo
app: elasticsearchpara que a descoberta automática funcione. Sem esse rótulo, o coletor não detectará nem monitorará seus pods.Importante
Como adicionar rótulos aos pods do Elasticsearch:
Se você estiver usando um StatefulSet ou Deployment para o Elasticsearch, adicione o rótulo no modelo do pod:
apiVersion: apps/v1kind: StatefulSetmetadata:name: elasticsearchspec:template:metadata:labels:app: elasticsearch # Required for auto-discoveryspec:containers:- name: elasticsearchimage: docker.elastic.co/elasticsearch/elasticsearch:8.x.xPara pods existentes sem rótulos, atualize seu StatefulSet/Deployment e reinicie os pods:
bash$kubectl label pods -l <your-existing-selector> app=elasticsearch -n <namespace>Você pode verificar se os rótulos estão definidos corretamente:
bash$kubectl get pods -n <namespace> --show-labels
Escolha seu método de instalação
Você pode instalar o NRDOT Collector usando manifestos do Kubernetes ou charts do Helm. Escolha o método que melhor se adapta ao seu fluxo de trabalho:
Instalação via manifesto:
Mais controle sobre recursos individuais do Kubernetes
Requer concluir a instalação base do manifesto do OpenTelemetry para Kubernetes primeiro
Melhor para implantações personalizadas
Instalação via Helm:
Implantação mais simples com um único comando
Mais fácil de gerenciar e atualizar
Melhor para implantações padrão
Prossiga para a próxima etapa para obter instruções detalhadas sobre o método escolhido.
Instalar e configurar o NRDOT Collector
Verificar a implantação e a coleta de dados
Verifique se o coletor NRDOT está em execução e coletando dados do Elasticsearch:
Verifique se os pods do coletor estão em execução:
bash$kubectl get pods -n newrelic --watchPara instalação de manifesto: você deve ver pods com nomes como
nr-k8s-otel-collector-deployment-<hash>em um estadoRunning.Para instalação do Helm: você deve ver pods com nomes como
elasticsearch-nrdot-collector-<hash>em um estadoRunning.Verifique os logs do coletor em busca de erros:
Para instalação via manifesto:
bash$kubectl logs -n newrelic -l app.kubernetes.io/name=nr-k8s-otel-collector -fPara instalação via Helm:
bash$kubectl logs -n newrelic -l app.kubernetes.io/name=opentelemetry-collector -fProcure por conexões bem-sucedidas com os pods do Elasticsearch e o New Relic. Se você encontrar erros, consulte o guia de solução de problemas.
Execute uma consulta NRQL no New Relic para confirmar que os dados estão chegando (substitua
elasticsearch-clusterpelo nome do seu cluster):FROM MetricSELECT *WHERE metricName LIKE 'elasticsearch.%'AND instrumentation.provider = 'opentelemetry'AND k8s.cluster.name = 'elasticsearch-cluster'SINCE 10 minutes ago
Antes de você começar
Antes de implantar o OTel Collector Contrib no Kubernetes, certifique-se de ter:
Privilégios de acesso necessários:
Seu New Relic
Acesso do kubectl ao seu cluster Kubernetes
Privilégios de administrador de cluster do Elasticsearch com privilégio de cluster
monitoroumanage(consulte a documentação de privilégios de segurança do Elasticsearch para obter detalhes)Requisitos do sistema:
Elasticsearch versão 7.16 ou superior - Esta integração requer um cluster Elasticsearch moderno
Cluster Kubernetes - Um cluster Kubernetes em execução onde o Elasticsearch está implantado
Helm 3.0 ou superior - Helm instalado no seu sistema
Conectividade de rede - HTTPS de saída (porta 443) para o endpoint de ingestão OTLPda New Relic
Requisitos do pod do Elasticsearch:
Rótulos do pod (Obrigatório) - Cada pod do Elasticsearch deve ter o rótulo
app: elasticsearchpara que a descoberta automática funcione. Sem esse rótulo, o coletor não detectará nem monitorará seus pods.Importante
Como adicionar rótulos aos pods do Elasticsearch:
Se você estiver usando um StatefulSet ou Deployment para o Elasticsearch, adicione o rótulo no modelo do pod:
apiVersion: apps/v1kind: StatefulSetmetadata:name: elasticsearchspec:template:metadata:labels:app: elasticsearch # Required for auto-discoveryspec:containers:- name: elasticsearchimage: docker.elastic.co/elasticsearch/elasticsearch:8.x.xPara pods existentes sem rótulos, atualize seu StatefulSet/Deployment e reinicie os pods:
bash$kubectl label pods -l <your-existing-selector> app=elasticsearch -n <namespace>Você pode verificar se os rótulos estão definidos corretamente:
bash$kubectl get pods -n <namespace> --show-labels
Crie um segredo do Kubernetes para credenciais
Crie um segredo do Kubernetes para armazenar suas credenciais do New Relic com segurança:
Crie o namespace:
bash$kubectl create namespace newrelicCrie o segredo:
bash$kubectl create secret generic newrelic-licenses \>--from-literal=NEWRELIC_LICENSE_KEY=YOUR_LICENSE_KEY_HERE \>--from-literal=NEWRELIC_OTLP_ENDPOINT=https://otlp.nr-data.net:4318 \>--from-literal=NEW_RELIC_MEMORY_LIMIT_MIB=100 \>-n newrelicAtualize os valores:
- Substitua
YOUR_LICENSE_KEY_HEREpela sua chave de licença da New Relic - Substitua
https://otlp.nr-data.net:4318pelo endpoint da sua região (consulte a documentação do endpoint OTLP) - Substitua
100pelo limite de memória desejado em MiB para o coletor (padrão: 100 MiB). Ajuste com base nas necessidades do seu ambiente
Configurar o monitoramento do Elasticsearch
Crie um arquivo values.yaml para configurar o OpenTelemetry Collector para o monitoramento do Elasticsearch:
Dica
Personalize para seu ambiente: Atualize os seguintes valores na configuração:
Alterações necessárias:
Regra de rótulo do Pod - A regra
labels["app"] == "elasticsearch"deve corresponder aos rótulos do seu pod. Se seus pods do Elasticsearch usam labels diferentes (por exemplo,app: es-cluster), atualize a regra de acordo:rule: type == "pod" && labels["app"] == "es-cluster"Nome do cluster - Substitua
elasticsearch-clusterpor um nome exclusivo para identificar seu cluster no New Relic. Este nome será usado para criar e identificar suas entidades do Elasticsearch na interface do New Relic. Escolha um nome que seja exclusivo em sua conta New Relic (por exemplo,prod-es-k8s,staging-elasticsearch)Alterações opcionais:
Porta - Atualize
9200se o Elasticsearch estiver sendo executado em uma porta diferenteAutenticação - Adicione credenciais se o seu cluster Elasticsearch estiver protegido
mode: deployment
image: repository: otel/opentelemetry-collector-contrib pullPolicy: IfNotPresent
command: name: otelcol-contrib
resources: limits: cpu: 500m memory: 512Mi requests: cpu: 200m memory: 256Mi
extraEnvs: - name: NEWRELIC_LICENSE_KEY valueFrom: secretKeyRef: name: newrelic-licenses key: NEWRELIC_LICENSE_KEY - name: NEWRELIC_OTLP_ENDPOINT valueFrom: secretKeyRef: name: newrelic-licenses key: NEWRELIC_OTLP_ENDPOINT - name: NEW_RELIC_MEMORY_LIMIT_MIB valueFrom: secretKeyRef: name: newrelic-licenses key: NEW_RELIC_MEMORY_LIMIT_MIB - name: K8S_CLUSTER_NAME value: "elasticsearch-cluster"
clusterRole: create: true rules: - apiGroups: [""] resources: ["pods", "nodes", "nodes/stats", "nodes/proxy"] verbs: ["get", "list", "watch"] - apiGroups: ["apps"] resources: ["replicasets"] verbs: ["get", "list", "watch"]
config: extensions: health_check: endpoint: 0.0.0.0:13133 k8s_observer: auth_type: serviceAccount observe_pods: true observe_nodes: true
receivers: receiver_creator/elasticsearch: watch_observers: [k8s_observer] receivers: elasticsearch: rule: type == "pod" && labels["app"] == "elasticsearch" config: endpoint: 'http://`endpoint`:9200' collection_interval: 30s metrics: elasticsearch.os.cpu.usage: enabled: true elasticsearch.cluster.data_nodes: enabled: true elasticsearch.cluster.health: enabled: true elasticsearch.cluster.in_flight_fetch: enabled: true elasticsearch.cluster.nodes: enabled: true elasticsearch.cluster.pending_tasks: enabled: true elasticsearch.cluster.shards: enabled: true elasticsearch.cluster.state_update.time: enabled: true elasticsearch.index.documents: enabled: true elasticsearch.index.operations.merge.current: enabled: true elasticsearch.index.operations.time: enabled: true elasticsearch.node.cache.count: enabled: true elasticsearch.node.cache.evictions: enabled: true elasticsearch.node.cache.memory.usage: enabled: true elasticsearch.node.shards.size: enabled: true elasticsearch.node.cluster.io: enabled: true elasticsearch.node.documents: enabled: true elasticsearch.node.disk.io.read: enabled: true elasticsearch.node.disk.io.write: enabled: true elasticsearch.node.fs.disk.available: enabled: true elasticsearch.node.fs.disk.total: enabled: true elasticsearch.node.http.connections: enabled: true elasticsearch.node.ingest.documents.current: enabled: true elasticsearch.node.ingest.operations.failed: enabled: true elasticsearch.node.open_files: enabled: true elasticsearch.node.operations.completed: enabled: true elasticsearch.node.operations.current: enabled: true elasticsearch.node.operations.get.completed: enabled: true elasticsearch.node.operations.time: enabled: true elasticsearch.node.shards.reserved.size: enabled: true elasticsearch.index.shards.size: enabled: true elasticsearch.os.cpu.load_avg.1m: enabled: true elasticsearch.os.cpu.load_avg.5m: enabled: true elasticsearch.os.cpu.load_avg.15m: enabled: true elasticsearch.os.memory: enabled: true jvm.gc.collections.count: enabled: true jvm.gc.collections.elapsed: enabled: true jvm.memory.heap.max: enabled: true jvm.memory.heap.used: enabled: true jvm.memory.heap.utilization: enabled: true jvm.threads.count: enabled: true elasticsearch.index.segments.count: enabled: true elasticsearch.index.operations.completed: enabled: true elasticsearch.node.script.cache_evictions: enabled: false elasticsearch.node.cluster.connections: enabled: false elasticsearch.node.pipeline.ingest.documents.preprocessed: enabled: false elasticsearch.node.thread_pool.tasks.queued: enabled: false elasticsearch.cluster.published_states.full: enabled: false jvm.memory.pool.max: enabled: false elasticsearch.node.script.compilation_limit_triggered: enabled: false elasticsearch.node.shards.data_set.size: enabled: false elasticsearch.node.pipeline.ingest.documents.current: enabled: false elasticsearch.cluster.state_update.count: enabled: false elasticsearch.node.fs.disk.free: enabled: false jvm.memory.nonheap.used: enabled: false jvm.memory.pool.used: enabled: false elasticsearch.node.translog.size: enabled: false elasticsearch.node.thread_pool.threads: enabled: false elasticsearch.cluster.state_queue: enabled: false elasticsearch.node.translog.operations: enabled: false elasticsearch.memory.indexing_pressure: enabled: false elasticsearch.node.ingest.documents: enabled: false jvm.classes.loaded: enabled: false jvm.memory.heap.committed: enabled: false elasticsearch.breaker.memory.limit: enabled: false elasticsearch.indexing_pressure.memory.total.replica_rejections: enabled: false elasticsearch.breaker.memory.estimated: enabled: false elasticsearch.cluster.published_states.differences: enabled: false jvm.memory.nonheap.committed: enabled: false elasticsearch.node.translog.uncommitted.size: enabled: false elasticsearch.node.script.compilations: enabled: false elasticsearch.node.pipeline.ingest.operations.failed: enabled: false elasticsearch.indexing_pressure.memory.limit: enabled: false elasticsearch.breaker.tripped: enabled: false elasticsearch.indexing_pressure.memory.total.primary_rejections: enabled: false elasticsearch.node.thread_pool.tasks.finished: enabled: false
processors: memory_limiter: check_interval: 60s limit_mib: ${env:NEW_RELIC_MEMORY_LIMIT_MIB} cumulativetodelta: {} resource/cluster: attributes: - key: k8s.cluster.name value: "${env:K8S_CLUSTER_NAME}" action: insert resource/cluster_name_override: attributes: - key: elasticsearch.cluster.name value: "${env:K8S_CLUSTER_NAME}" action: upsert resourcedetection: detectors: [env, system] system: resource_attributes: host.name: enabled: true host.id: enabled: true os.type: enabled: true batch: timeout: 10s send_batch_size: 1024 attributes/cardinality_reduction: actions: - key: process.pid action: delete - key: process.parent_pid action: delete - key: k8s.pod.uid action: delete transform/metadata_nullify: metric_statements: - context: metric statements: - set(description, "") - set(unit, "")
exporters: otlphttp: endpoint: "${env:NEWRELIC_OTLP_ENDPOINT}" headers: api-key: "${env:NEWRELIC_LICENSE_KEY}"
service: extensions: [health_check, k8s_observer] pipelines: metrics/elasticsearch: receivers: [receiver_creator/elasticsearch] processors: [memory_limiter, resourcedetection, resource/cluster, resource/cluster_name_override, attributes/cardinality_reduction, cumulativetodelta, transform/metadata_nullify, batch] exporters: [otlphttp]Dica
Para clusters Elasticsearch protegidos: Se o seu cluster Elasticsearch exigir autenticação, adicione as credenciais à configuração do receiver:
receiver_creator/elasticsearch: watch_observers: [k8s_observer] receivers: elasticsearch: rule: type == "pod" && labels["app"] == "elasticsearch" config: endpoint: 'https://`endpoint`:9200' username: "your_elasticsearch_username" password: "your_elasticsearch_password" tls: insecure_skip_verify: falseArmazene credenciais com segurança usando Secrets do Kubernetes em vez de inseri-las diretamente no arquivo values.
Instalar com Helm
Instale o OpenTelemetry Collector usando o Helm com sua configuração values.yaml:
$helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts$helm repo update$helm upgrade --install elasticsearch-otel-collector open-telemetry/opentelemetry-collector \> --namespace newrelic \> --create-namespace \> -f values.yamlVerificar a implantação e a coleta de dados
Verifique se o OpenTelemetry Collector está em execução e coletando dados do Elasticsearch:
Verifique se os pods do coletor estão em execução:
bash$kubectl get pods -n newrelic --watchVocê deve ver pods com nomes como
elasticsearch-otel-collector-<hash>em um estadoRunning.Verifique os logs do coletor em busca de erros:
bash$kubectl logs -n newrelic -l app.kubernetes.io/name=opentelemetry-collector -fProcure por conexões bem-sucedidas com os pods do Elasticsearch e o New Relic. Se você encontrar erros, consulte o guia de solução de problemas.
Execute uma consulta NRQL no New Relic para confirmar que os dados estão chegando (substitua
elasticsearch-clusterpelo nome do seu cluster):FROM MetricSELECT *WHERE metricName LIKE 'elasticsearch.%'AND instrumentation.provider = 'opentelemetry'AND k8s.cluster.name = 'elasticsearch-cluster'SINCE 10 minutes ago
Use esta abordagem se você já tiver um exporter do Elasticsearch para Prometheus em execução no seu cluster do Kubernetes, ou se estiver migrando de uma stack de monitoramento baseada no Prometheus.
Dica
Recomendado: se você ainda não tiver um exportador do Prometheus em execução, use as guias NRDOT Collector ou OTel Collector Contrib em vez disso. Eles se conectam diretamente à API do Elasticsearch sem precisar de um componente exportador adicional.
Implantar o exportador do Elasticsearch
Se você ainda não tem o exporter em execução, implante-o usando o Helm:
$helm repo add prometheus-community https://prometheus-community.github.io/helm-charts$helm repo update$
$helm install elasticsearch-exporter prometheus-community/prometheus-elasticsearch-exporter \> --namespace monitoring \> --create-namespace \> --set es.uri=http://elasticsearch.default.svc.cluster.local:9200Substitua elasticsearch.default.svc.cluster.local:9200 pelo endereço do seu serviço Elasticsearch.
Verifique se o exportador está em execução:
$kubectl get pods -n monitoring -l app=prometheus-elasticsearch-exporterCrie o segredo de credenciais
$kubectl create secret generic newrelic-credentials \> --namespace monitoring \> --from-literal=NEWRELIC_LICENSE_KEY=YOUR_NEWRELIC_LICENSE_KEY \> --from-literal=NEWRELIC_OTLP_ENDPOINT=https://otlp.nr-data.net:4318Substitua YOUR_NEWRELIC_LICENSE_KEY pelo seu .
Dica
Para contas da UE, use NEWRELIC_OTLP_ENDPOINT=https://otlp.eu01.nr-data.net:4318
Criar o ConfigMap do coletor
Crie um ConfigMap com a configuração do coletor. Isso funciona com as imagens de contêiner tanto do NRDOT (newrelic/nrdot-collector) quanto do OTel Collector Contrib (otel/opentelemetry-collector-contrib). A configuração coleta métricas do exportador do Elasticsearch e traduz os nomes das métricas do Prometheus para nomes compatíveis com o OpenTelemetry que alimentam o dashboard do Elasticsearch do New Relic.
Substitua os seguintes valores na configuração:
<elasticsearch-cluster-name>: nome do seu cluster Elasticsearchelasticsearch-exporter-prometheus-elasticsearch-exporter.monitoring.svc.cluster.local:9114: endereço do serviço do Kubernetes do seu exportador
Implantar o coletor
Implante o coletor usando a imagem NRDOT ou OTel Collector Contrib. Atualize o campo image abaixo com base na sua escolha:
NRDOT:
newrelic/nrdot-collector:latestOTel Collector Contrib:
otel/opentelemetry-collector-contrib:latestSalve o seguinte como
otel-collector-deployment.yamle aplique comkubectl apply -f otel-collector-deployment.yaml:apiVersion: apps/v1kind: Deploymentmetadata:name: otel-collector-elasticsearchnamespace: monitoringlabels:app: otel-collector-elasticsearchspec:replicas: 1selector:matchLabels:app: otel-collector-elasticsearchtemplate:metadata:labels:app: otel-collector-elasticsearchspec:containers:- name: otel-collectorimage: otel/opentelemetry-collector-contrib:latestargs:- "--config=/etc/otel/config.yaml"env:- name: NEWRELIC_LICENSE_KEYvalueFrom:secretKeyRef:name: newrelic-credentialskey: NEWRELIC_LICENSE_KEY- name: NEWRELIC_OTLP_ENDPOINTvalueFrom:secretKeyRef:name: newrelic-credentialskey: NEWRELIC_OTLP_ENDPOINTvolumeMounts:- name: configmountPath: /etc/otelresources:requests:memory: "128Mi"cpu: "100m"limits:memory: "256Mi"cpu: "500m"volumes:- name: configconfigMap:name: otel-collector-prometheus-es
Verifique a implantação
Verifique se o pod do coletor está em execução:
bash$kubectl get pods -n monitoring -l app=otel-collector-elasticsearchVerifique os logs do coletor:
bash$kubectl logs -n monitoring -l app=otel-collector-elasticsearch -fVerifique os dados no New Relic:
FROM Metric SELECT count(*)WHERE metricName LIKE 'elasticsearch.%'AND elasticsearch.cluster.name = '<elasticsearch-cluster-name>'SINCE 10 minutes ago
Dica
Correlacione APM com Elasticsearch: Para conectar seu aplicativo APM e o cluster Elasticsearch, inclua o atributo de recurso es.cluster.name="your-cluster-name" em suas métricas APM. Isso permite a visibilidade entre serviços e uma solução de problemas mais rápida no New Relic.
Resolução de problemas
Se você encontrar problemas durante a instalação ou não vir dados na New Relic, consulte nosso guia de solução de problemas abrangente para obter soluções passo a passo para problemas comuns.
Para problemas específicos do Kubernetes, como descoberta de pods, permissões RBAC ou conectividade de rede, consulte a seção de solução de problemas do Kubernetes.