Monitoree sus clústeres de Elasticsearch en Kubernetes desplegando el OpenTelemetry Collector con descubrimiento automático de pods. Esta integración utiliza el elasticsearchreceiver y el receivercreator para descubrir y monitorear automáticamente los pods de Elasticsearch sin configuración manual.
Para empezar, seleccione la distribución del recopilador que mejor se adapte a su entorno de Kubernetes:
Puede elegir entre tres opciones de recolector:
- NRDOT: Distribución de New Relic de OpenTelemetry
- OTel Collector Contrib: OpenTelemetry Collector estándar con componentes aportados por la comunidad
- Receptor de Prometheus: para entornos que ya ejecutan un exportador de Elasticsearch para Prometheus
Opciones de instalación
Seleccione la distribución del recopilador que se ajuste a sus necesidades:
Antes de que empieces
Antes de desplegar el recolector NRDOT en Kubernetes, asegúrese de tener:
Privilegios de acceso requeridos:
Tu New Relic
Acceso a su clúster de Kubernetes con kubectl
Privilegios de administrador de clúster de Elasticsearch con privilegio de clúster
monitoromanage(consulte la documentación de privilegios de seguridad de Elasticsearch para obtener detalles)Requisitos del sistema:
Versión 7.16 o superior de Elasticsearch - Esta integración requiere un clúster moderno de Elasticsearch
Clúster de Kubernetes - Un clúster de Kubernetes en ejecución donde Elasticsearch está desplegado
Conectividad de red - HTTPS saliente (puerto 443) al endpoint de ingesta OTLPde New Relic
Requisitos del pod de Elasticsearch:
Etiquetas de pod (Obligatorio) - Cada pod de Elasticsearch debe tener la etiqueta
app: elasticsearchpara que funcione el descubrimiento automático. Sin esta etiqueta, el colector no detectará ni monitoreará sus pods.Importante
Cómo agregar etiquetas a los pods de Elasticsearch:
Si utiliza un StatefulSet o un Deployment para Elasticsearch, agregue la etiqueta en la plantilla del 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 los pods existentes sin etiquetas, actualice su StatefulSet/Deployment y reinicie los pods:
bash$kubectl label pods -l <your-existing-selector> app=elasticsearch -n <namespace>Puede verificar que las etiquetas estén configuradas correctamente:
bash$kubectl get pods -n <namespace> --show-labels
Elige tu método de instalación
Puede instalar el NRDOT Collector utilizando manifiestos de Kubernetes o charts de Helm. Elija el método que mejor se adapte a su flujo de trabajo:
Instalación con manifiesto:
Más control sobre los recursos individuales de Kubernetes
Requiere completar primero la instalación base del manifiesto de OpenTelemetry para Kubernetes
Lo mejor para despliegues personalizados
Instalación con Helm:
Despliegue más simple con un solo comando
Más fácil de administrar y actualizar
Ideal para despliegues estándar
Continúe con el siguiente paso para obtener instrucciones detalladas sobre el método elegido.
Instalar y configurar NRDOT Collector
Verifique la implementación y la recopilación de datos
Verifique que el recolector NRDOT se esté ejecutando y recopilando datos de Elasticsearch:
Verifique que los pods del recopilador se estén ejecutando:
bash$kubectl get pods -n newrelic --watchPara la instalación del manifiesto: debería ver pods con nombres como
nr-k8s-otel-collector-deployment-<hash>en un estadoRunning.Para la instalación de Helm: debería ver pods con nombres como
elasticsearch-nrdot-collector-<hash>en un estadoRunning.Revise los logs del colector en busca de errores:
Para la instalación con manifiesto:
bash$kubectl logs -n newrelic -l app.kubernetes.io/name=nr-k8s-otel-collector -fPara la instalación con Helm:
bash$kubectl logs -n newrelic -l app.kubernetes.io/name=opentelemetry-collector -fBusque conexiones exitosas a los pods de Elasticsearch y New Relic. Si ve errores, consulte la guía de solución de problemas.
Ejecute una consulta NRQL en New Relic para confirmar que los datos están llegando (reemplace
elasticsearch-clusterpor el nombre de su clúster):FROM MetricSELECT *WHERE metricName LIKE 'elasticsearch.%'AND instrumentation.provider = 'opentelemetry'AND k8s.cluster.name = 'elasticsearch-cluster'SINCE 10 minutes ago
Antes de que empieces
Antes de desplegar el OTel Collector Contrib en Kubernetes, asegúrese de tener:
Privilegios de acceso requeridos:
Tu New Relic
Acceso a su clúster de Kubernetes con kubectl
Privilegios de administrador de clúster de Elasticsearch con privilegio de clúster
monitoromanage(consulte la documentación de privilegios de seguridad de Elasticsearch para obtener detalles)Requisitos del sistema:
Versión 7.16 o superior de Elasticsearch - Esta integración requiere un clúster moderno de Elasticsearch
Clúster de Kubernetes - Un clúster de Kubernetes en ejecución donde Elasticsearch está desplegado
Helm 3.0 o superior - Helm instalado en su sistema
Conectividad de red - HTTPS saliente (puerto 443) al endpoint de ingesta OTLPde New Relic
Requisitos del pod de Elasticsearch:
Etiquetas de pod (Obligatorio) - Cada pod de Elasticsearch debe tener la etiqueta
app: elasticsearchpara que funcione el descubrimiento automático. Sin esta etiqueta, el colector no detectará ni monitoreará sus pods.Importante
Cómo agregar etiquetas a los pods de Elasticsearch:
Si utiliza un StatefulSet o un Deployment para Elasticsearch, agregue la etiqueta en la plantilla del 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 los pods existentes sin etiquetas, actualice su StatefulSet/Deployment y reinicie los pods:
bash$kubectl label pods -l <your-existing-selector> app=elasticsearch -n <namespace>Puede verificar que las etiquetas estén configuradas correctamente:
bash$kubectl get pods -n <namespace> --show-labels
Crear secreto de Kubernetes para credenciales
Crea un secreto de Kubernetes para almacenar tus credenciales de New Relic de forma segura:
Cree el espacio de nombres:
bash$kubectl create namespace newrelicCree el secreto:
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 newrelicActualice los valores:
- Reemplace
YOUR_LICENSE_KEY_HEREcon su clave de licencia de New Relic real - Reemplace
https://otlp.nr-data.net:4318con el endpoint de su región (consulte la documentación del endpoint OTLP) - Reemplace
100con el límite de memoria deseado en MiB para el colector (predeterminado: 100 MiB). Ajuste según las necesidades de su entorno
Configurar el monitoreo de Elasticsearch
Cree un archivo values.yaml para configurar el OpenTelemetry Collector para el monitoreo de Elasticsearch:
Sugerencia
Personalice para su entorno: Actualice los siguientes valores en la configuración:
Cambios requeridos:
Regla de etiquetas de Pod - La regla
labels["app"] == "elasticsearch"debe coincidir con las etiquetas de su Pod. Si sus pods de Elasticsearch usan etiquetas diferentes (p. ej.,app: es-cluster), actualice la regla según corresponda:rule: type == "pod" && labels["app"] == "es-cluster"Nombre del clúster - Reemplace
elasticsearch-clusterpor un nombre único para identificar su clúster en New Relic. Este nombre se utilizará para crear e identificar sus entidades de Elasticsearch en la UI de New Relic. Elige un nombre que sea único en tu cuenta de New Relic (p. ej.,prod-es-k8s,staging-elasticsearch)Cambios opcionales:
Puerto - Actualice
9200si Elasticsearch se ejecuta en un puerto diferenteAutenticación - Agregue credenciales si su clúster de Elasticsearch está 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]Sugerencia
Para clústeres de Elasticsearch protegidos: Si su clúster de Elasticsearch requiere autenticación, agregue las credenciales a la configuración del receptor:
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: falseAlmacene las credenciales de forma segura utilizando secretos de Kubernetes en lugar de codificarlas directamente en el archivo de valores.
Instalar con Helm
Instale el OpenTelemetry Collector usando Helm con su configuración 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.yamlVerifique la implementación y la recopilación de datos
Verifique que el OpenTelemetry Collector se esté ejecutando y recopilando datos de Elasticsearch:
Verifique que los pods del recopilador se estén ejecutando:
bash$kubectl get pods -n newrelic --watchDebería ver pods con nombres como
elasticsearch-otel-collector-<hash>en un estadoRunning.Revise los logs del colector en busca de errores:
bash$kubectl logs -n newrelic -l app.kubernetes.io/name=opentelemetry-collector -fBusque conexiones exitosas a los pods de Elasticsearch y New Relic. Si ve errores, consulte la guía de solución de problemas.
Ejecute una consulta NRQL en New Relic para confirmar que los datos están llegando (reemplace
elasticsearch-clusterpor el nombre de su clúster):FROM MetricSELECT *WHERE metricName LIKE 'elasticsearch.%'AND instrumentation.provider = 'opentelemetry'AND k8s.cluster.name = 'elasticsearch-cluster'SINCE 10 minutes ago
Use este enfoque si ya tiene un exporter de Elasticsearch de Prometheus ejecutándose en su clúster de Kubernetes, o si está migrando desde un stack de monitoreo basado en Prometheus.
Sugerencia
Recomendado: si aún no tiene un exportador de Prometheus en ejecución, use las pestañas NRDOT Collector u OTel Collector Contrib en su lugar. Se conectan directamente a la API de Elasticsearch sin necesidad de un componente exportador adicional.
Desplegar el exportador de Elasticsearch
Si aún no tiene el exporter en ejecución, despliéguelo usando 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:9200Reemplace elasticsearch.default.svc.cluster.local:9200 con la dirección de su servicio Elasticsearch.
Verifique que el exportador se esté ejecutando:
$kubectl get pods -n monitoring -l app=prometheus-elasticsearch-exporterCrear el secreto de credenciales
$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:4318Reemplace YOUR_NEWRELIC_LICENSE_KEY con su .
Sugerencia
Para las cuentas de la UE, use NEWRELIC_OTLP_ENDPOINT=https://otlp.eu01.nr-data.net:4318
Crear el ConfigMap del recolector
Cree un ConfigMap con la configuración del recolector. Esto funciona con las imágenes de contenedor tanto de NRDOT (newrelic/nrdot-collector) como de OTel Collector Contrib (otel/opentelemetry-collector-contrib). La configuración recopila métricas del exportador de Elasticsearch y traduce los nombres de las métricas de Prometheus a nombres compatibles con OpenTelemetry que alimentan el dashboard de Elasticsearch de New Relic.
Reemplace los siguientes valores en la configuración:
<elasticsearch-cluster-name>: el nombre de su clúster de Elasticsearchelasticsearch-exporter-prometheus-elasticsearch-exporter.monitoring.svc.cluster.local:9114: la dirección del servicio de Kubernetes de tu exportador
Desplegar el recolector
Despliegue el recolector usando la imagen NRDOT o la de OTel Collector Contrib. Actualice el campo image a continuación según su elección:
NRDOT:
newrelic/nrdot-collector:latestOTel Collector Contrib:
otel/opentelemetry-collector-contrib:latestGuarde lo siguiente como
otel-collector-deployment.yamly aplique conkubectl 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 el despliegue
Verifique que el pod del recolector se esté ejecutando:
bash$kubectl get pods -n monitoring -l app=otel-collector-elasticsearchVerifique los logs del recolector:
bash$kubectl logs -n monitoring -l app=otel-collector-elasticsearch -fVerifique los datos en New Relic:
FROM Metric SELECT count(*)WHERE metricName LIKE 'elasticsearch.%'AND elasticsearch.cluster.name = '<elasticsearch-cluster-name>'SINCE 10 minutes ago
Sugerencia
Correlacione APM con Elasticsearch: Para conectar su aplicación APM y el clúster de Elasticsearch, incluya el atributo de recurso es.cluster.name="your-cluster-name" en sus métricas de APM. Esto permite la visibilidad entre servicios y una solución de problemas más rápida dentro de New Relic.
Resolución de problemas
Si encuentra problemas durante la instalación o no ve datos en New Relic, consulte nuestra completa guía de solución de problemas para obtener soluciones paso a paso a los problemas comunes.
Para problemas específicos de Kubernetes, como el descubrimiento de pods, los permisos RBAC o la conectividad de red, consulte la sección de resolución de problemas de Kubernetes.