Monitorez vos clusters Elasticsearch dans Kubernetes en déployant le collecteur OpenTelemetry avec la découverte automatique des pods. Cette intégration utilise le elasticsearchreceiver et le receivercreator pour découvrir et monitorer automatiquement les pods Elasticsearch sans configuration manuelle.
Pour commencer, sélectionnez la distribution du collecteur qui correspond le mieux à votre environnement Kubernetes :
You can choose between three collector options:
- NRDOT : Distribution New Relic d'OpenTelemetry
- OTel Collector Contrib : Collecteur OpenTelemetry standard avec des composants issus de la communauté
- Prometheus Receiver: For environments already running a Prometheus Elasticsearch exporter
Options d'installation
Choisissez la distribution du collecteur qui correspond à vos besoins :
Avant de commencer
Before deploying the NRDOT collector on Kubernetes, ensure you have:
Privilèges d'accès requis :
Votre New Relic
Accès kubectl à votre cluster Kubernetes
Privilèges d'administration de cluster Elasticsearch avec le privilège de cluster
monitoroumanage(voir la documentation sur les privilèges de sécurité Elasticsearch pour plus de détails)Configuration requise :
Elasticsearch version 7.16 ou supérieure - Cette intégration nécessite un cluster Elasticsearch moderne
Cluster Kubernetes - Un cluster Kubernetes en cours d'exécution où Elasticsearch est déployé
Connectivité réseau - HTTPS sortant (port 443) vers le point de terminaison d'ingestion OTLPde New Relic
Prérequis du pod Elasticsearch :
Étiquettes de pod (Requis) - Chaque pod Elasticsearch doit avoir l'étiquette
app: elasticsearchpour que la découverte automatique fonctionne. Sans ce label, le collecteur ne détectera ni ne monitorera vos pods.Important
Comment ajouter des étiquettes aux pods Elasticsearch :
Si vous utilisez un StatefulSet ou un Deployment pour Elasticsearch, ajoutez l'étiquette dans le modèle de 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.xPour les pods existants sans étiquettes, mettez à jour votre StatefulSet/Deployment et redémarrez les pods :
bash$kubectl label pods -l <your-existing-selector> app=elasticsearch -n <namespace>Vous pouvez vérifier que les étiquettes sont correctement définies :
bash$kubectl get pods -n <namespace> --show-labels
Choisissez votre méthode d'installation
You can install the NRDOT Collector using Kubernetes manifests or Helm charts. Choose the method that best fits your workflow:
Manifest install:
More control over individual Kubernetes resources
Requires completing the base Kubernetes OpenTelemetry manifest installation first
Best for customized deployments
Helm install:
Simpler deployment with single command
Easier to manage and upgrade
Best for standard deployments
Proceed to the next step for detailed instructions for your chosen method.
Install and configure NRDOT Collector
Vérifier le déploiement et la collecte de données
Verify that the NRDOT collector is running and collecting Elasticsearch data:
Vérifiez que les pods du collecteur sont en cours d'exécution :
bash$kubectl get pods -n newrelic --watchFor manifest install: You should see pods with names like
nr-k8s-otel-collector-deployment-<hash>in aRunningstate.For Helm install: You should see pods with names like
elasticsearch-nrdot-collector-<hash>in aRunningstate.Vérifiez les logs du collecteur pour détecter d'éventuelles erreurs :
For manifest install:
bash$kubectl logs -n newrelic -l app.kubernetes.io/name=nr-k8s-otel-collector -fFor Helm install:
bash$kubectl logs -n newrelic -l app.kubernetes.io/name=opentelemetry-collector -fRecherchez les connexions réussies aux pods Elasticsearch et à New Relic. Si vous rencontrez des erreurs, consultez le guide de dépannage.
Exécutez une requête NRQL dans New Relic pour confirmer que les données arrivent (remplacez
elasticsearch-clusterpar le nom de votre cluster) :FROM MetricSELECT *WHERE metricName LIKE 'elasticsearch.%'AND instrumentation.provider = 'opentelemetry'AND k8s.cluster.name = 'elasticsearch-cluster'SINCE 10 minutes ago
Avant de commencer
Avant de déployer l'OTel Collector Contrib sur Kubernetes, assurez-vous d'avoir :
Privilèges d'accès requis :
Votre New Relic
Accès kubectl à votre cluster Kubernetes
Privilèges d'administration de cluster Elasticsearch avec le privilège de cluster
monitoroumanage(voir la documentation sur les privilèges de sécurité Elasticsearch pour plus de détails)Configuration requise :
Elasticsearch version 7.16 ou supérieure - Cette intégration nécessite un cluster Elasticsearch moderne
Cluster Kubernetes - Un cluster Kubernetes en cours d'exécution où Elasticsearch est déployé
Helm 3.0 ou version ultérieure - Helm installé sur votre système
Connectivité réseau - HTTPS sortant (port 443) vers le point de terminaison d'ingestion OTLPde New Relic
Prérequis du pod Elasticsearch :
Étiquettes de pod (Requis) - Chaque pod Elasticsearch doit avoir l'étiquette
app: elasticsearchpour que la découverte automatique fonctionne. Sans ce label, le collecteur ne détectera ni ne monitorera vos pods.Important
Comment ajouter des étiquettes aux pods Elasticsearch :
Si vous utilisez un StatefulSet ou un Deployment pour Elasticsearch, ajoutez l'étiquette dans le modèle de 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.xPour les pods existants sans étiquettes, mettez à jour votre StatefulSet/Deployment et redémarrez les pods :
bash$kubectl label pods -l <your-existing-selector> app=elasticsearch -n <namespace>Vous pouvez vérifier que les étiquettes sont correctement définies :
bash$kubectl get pods -n <namespace> --show-labels
Créer un secret Kubernetes pour les identifiants
Créez un secret Kubernetes pour stocker vos identifiants New Relic en toute sécurité :
Créer l'espace de noms :
bash$kubectl create namespace newrelicCréez le secret :
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 newrelicMettre à jour les valeurs :
- Remplacez
YOUR_LICENSE_KEY_HEREpar votre clé de licence New Relic - Remplacez
https://otlp.nr-data.net:4318par l'endpoint de votre région (consultez la documentation sur les endpoints OTLP) - Remplacez
100par la limite de mémoire souhaitée en MiB pour le collecteur (par défaut : 100 MiB). Ajustez en fonction des besoins de votre environnement
Configurer le monitoring d'Elasticsearch
Créez un fichier values.yaml pour configurer le collecteur OpenTelemetry pour le monitoring d'Elasticsearch :
Conseil
Personnalisez pour votre environnement : Mettez à jour les valeurs suivantes dans la configuration :
Modifications requises :
Règle de label de Pod - La règle
labels["app"] == "elasticsearch"doit correspondre à vos labels de Pod. Si vos pods Elasticsearch utilisent des labels différents (par ex.app: es-cluster), mettez à jour la règle en conséquence :rule: type == "pod" && labels["app"] == "es-cluster"Nom du cluster - Remplacez
elasticsearch-clusterpar un nom unique pour identifier votre cluster dans New Relic. Ce nom sera utilisé pour créer et identifier vos entités Elasticsearch dans l'interface utilisateur New Relic. Choisissez un nom unique dans votre compte New Relic (par ex.prod-es-k8s,staging-elasticsearch)Modifications facultatives :
Port - Mettez à jour
9200si Elasticsearch s'exécute sur un port différentAuthentification - Ajoutez des identifiants si votre cluster Elasticsearch est sécurisé
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]Conseil
Pour les clusters Elasticsearch sécurisés : si votre cluster Elasticsearch nécessite une authentification, ajoutez les identifiants à la configuration du récepteur :
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: falseStockez les identifiants de manière sécurisée à l'aide de secrets Kubernetes plutôt que de les coder en dur dans le fichier de valeurs.
Installer avec Helm
Installez le Collecteur OpenTelemetry à l'aide de Helm avec votre configuration 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.yamlVérifier le déploiement et la collecte de données
Vérifiez que l'OpenTelemetry Collector est en cours d'exécution et collecte les données Elasticsearch :
Vérifiez que les pods du collecteur sont en cours d'exécution :
bash$kubectl get pods -n newrelic --watchVous devriez voir des pods avec des noms tels que
elasticsearch-otel-collector-<hash>à l'étatRunning.Vérifiez les logs du collecteur pour détecter d'éventuelles erreurs :
bash$kubectl logs -n newrelic -l app.kubernetes.io/name=opentelemetry-collector -fRecherchez les connexions réussies aux pods Elasticsearch et à New Relic. Si vous rencontrez des erreurs, consultez le guide de dépannage.
Exécutez une requête NRQL dans New Relic pour confirmer que les données arrivent (remplacez
elasticsearch-clusterpar le nom de votre cluster) :FROM MetricSELECT *WHERE metricName LIKE 'elasticsearch.%'AND instrumentation.provider = 'opentelemetry'AND k8s.cluster.name = 'elasticsearch-cluster'SINCE 10 minutes ago
Use this approach if you already have a Prometheus Elasticsearch exporter running in your Kubernetes cluster, or if you're migrating from a Prometheus-based monitoring stack.
Conseil
Recommended: If you don't already have a Prometheus exporter running, use the NRDOT Collector or OTel Collector Contrib tabs instead. They connect directly to the Elasticsearch API without needing an additional exporter component.
Deploy the Elasticsearch exporter
If you don't already have the exporter running, deploy it using 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:9200Replace elasticsearch.default.svc.cluster.local:9200 with your Elasticsearch service address.
Verify the exporter is running:
$kubectl get pods -n monitoring -l app=prometheus-elasticsearch-exporterCreate the credentials Secret
$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:4318Replace YOUR_NEWRELIC_LICENSE_KEY with your .
Conseil
For EU accounts, use NEWRELIC_OTLP_ENDPOINT=https://otlp.eu01.nr-data.net:4318
Create the collector ConfigMap
Create a ConfigMap with the collector configuration. This works with both NRDOT (newrelic/nrdot-collector) and OTel Collector Contrib (otel/opentelemetry-collector-contrib) container images. The configuration scrapes metrics from the Elasticsearch exporter and translates Prometheus metric names to OpenTelemetry-compatible names that power the New Relic Elasticsearch dashboard.
Replace the following values in the configuration:
<elasticsearch-cluster-name>: Your Elasticsearch cluster nameelasticsearch-exporter-prometheus-elasticsearch-exporter.monitoring.svc.cluster.local:9114: Your exporter's Kubernetes service address
Deploy the collector
Deploy the collector using either the NRDOT or OTel Collector Contrib image. Update the image field below based on your choice:
NRDOT:
newrelic/nrdot-collector:latestOTel Collector Contrib:
otel/opentelemetry-collector-contrib:latestSave the following as
otel-collector-deployment.yamland apply withkubectl 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
Verify the deployment
Check the collector pod is running:
bash$kubectl get pods -n monitoring -l app=otel-collector-elasticsearchCheck collector logs:
bash$kubectl logs -n monitoring -l app=otel-collector-elasticsearch -fVerify data in New Relic:
FROM Metric SELECT count(*)WHERE metricName LIKE 'elasticsearch.%'AND elasticsearch.cluster.name = '<elasticsearch-cluster-name>'SINCE 10 minutes ago
Conseil
Corréler APM avec Elasticsearch: pour connecter votre application APM et votre cluster Elasticsearch, incluez l'attribut de ressource es.cluster.name="your-cluster-name" dans vos métriques APM. Cela permet une visibilité inter-services et un dépannage plus rapide au sein de New Relic.
Dépannage
Si vous rencontrez des problèmes lors de l'installation ou si vous ne voyez pas de données dans New Relic, consultez notre guide de dépannage complet pour obtenir des solutions étape par étape aux problèmes courants.
Pour les problèmes spécifiques à Kubernetes, tels que la découverte de pods, les permissions RBAC ou la connectivité réseau, reportez-vous à la section de dépannage Kubernetes.