Monitorez votre cluster Kafka fonctionnant sur Kubernetes avec l'opérateur Strimzi en déployant l'OpenTelemetry Collector. Le collecteur découvre automatiquement les pods de broker Kafka et collecte des métriques complètes.
Installation et configuration
Suivez ces étapes pour déployer et configurer l'OpenTelemetry Collector dans votre cluster Kubernetes afin de découvrir et monitorer automatiquement vos brokers Strimzi Kafka.
Avant de commencer
Assurez-vous d'avoir :
- Un compte New Relic avec un
- Cluster Kubernetes avec accès kubectl
- Kafka déployé via l'opérateur Strimzi
Configurer le cluster Kafka pour les métriques JMX Kafka
Configurez votre cluster Strimzi Kafka pour exposer les métriques JMX Kafka via le Prometheus JMX Exporter. Cette configuration sera déployée en tant que ConfigMap et référencée par votre cluster Kafka.
Créer la ConfigMap des métriques JMX
Créez une ConfigMap avec des patterns JMX Exporter qui définissent les métriques Kafka à collecter. Enregistrer sous kafka-jmx-metrics-config.yaml:
apiVersion: v1kind: ConfigMapmetadata: name: kafka-jmx-metrics namespace: newrelicdata: kafka-metrics-config.yml: | startDelaySeconds: 0 lowercaseOutputName: true lowercaseOutputLabelNames: true
rules: # Cluster-level controller metrics - pattern: 'kafka.controller<type=KafkaController, name=GlobalTopicCount><>Value' name: kafka_cluster_topic_count type: GAUGE
- pattern: 'kafka.controller<type=KafkaController, name=GlobalPartitionCount><>Value' name: kafka_cluster_partition_count type: GAUGE
- pattern: 'kafka.controller<type=KafkaController, name=FencedBrokerCount><>Value' name: kafka_broker_fenced_count type: GAUGE
- pattern: 'kafka.controller<type=KafkaController, name=PreferredReplicaImbalanceCount><>Value' name: kafka_partition_non_preferred_leader type: GAUGE
- pattern: 'kafka.controller<type=KafkaController, name=OfflinePartitionsCount><>Value' name: kafka_partition_offline type: GAUGE
- pattern: 'kafka.controller<type=KafkaController, name=ActiveControllerCount><>Value' name: kafka_controller_active_count type: GAUGE
# Broker-level replica metrics - pattern: 'kafka.server<type=ReplicaManager, name=UnderMinIsrPartitionCount><>Value' name: kafka_partition_under_min_isr type: GAUGE
- pattern: 'kafka.server<type=ReplicaManager, name=LeaderCount><>Value' name: kafka_broker_leader_count type: GAUGE
- pattern: 'kafka.server<type=ReplicaManager, name=PartitionCount><>Value' name: kafka_partition_count type: GAUGE
- pattern: 'kafka.server<type=ReplicaManager, name=UnderReplicatedPartitions><>Value' name: kafka_partition_under_replicated type: GAUGE
- pattern: 'kafka.server<type=ReplicaManager, name=IsrShrinksPerSec><>Count' name: kafka_isr_operation_count type: COUNTER labels: operation: "shrink"
- pattern: 'kafka.server<type=ReplicaManager, name=IsrExpandsPerSec><>Count' name: kafka_isr_operation_count type: COUNTER labels: operation: "expand"
- pattern: 'kafka.server<type=ReplicaFetcherManager, name=MaxLag, clientId=Replica><>Value' name: kafka_max_lag type: GAUGE
# Broker topic metrics (totals) - pattern: 'kafka.server<type=BrokerTopicMetrics, name=MessagesInPerSec><>Count' name: kafka_message_count type: COUNTER
- pattern: 'kafka.server<type=BrokerTopicMetrics, name=TotalFetchRequestsPerSec><>Count' name: kafka_request_count type: COUNTER labels: type: "fetch"
- pattern: 'kafka.server<type=BrokerTopicMetrics, name=TotalProduceRequestsPerSec><>Count' name: kafka_request_count type: COUNTER labels: type: "produce"
- pattern: 'kafka.server<type=BrokerTopicMetrics, name=FailedFetchRequestsPerSec><>Count' name: kafka_request_failed type: COUNTER labels: type: "fetch"
- pattern: 'kafka.server<type=BrokerTopicMetrics, name=FailedProduceRequestsPerSec><>Count' name: kafka_request_failed type: COUNTER labels: type: "produce"
- pattern: 'kafka.server<type=BrokerTopicMetrics, name=BytesInPerSec><>Count' name: kafka_network_io type: COUNTER labels: direction: "in"
- pattern: 'kafka.server<type=BrokerTopicMetrics, name=BytesOutPerSec><>Count' name: kafka_network_io type: COUNTER labels: direction: "out"
# Per-topic metrics (only appear after traffic flows) - pattern: 'kafka.server<type=BrokerTopicMetrics, name=MessagesInPerSec, topic=(.+)><>Count' name: kafka_prod_msg_count type: COUNTER labels: topic: "$1"
- pattern: 'kafka.server<type=BrokerTopicMetrics, name=BytesInPerSec, topic=(.+)><>Count' name: kafka_topic_io type: COUNTER labels: topic: "$1" direction: "in"
- pattern: 'kafka.server<type=BrokerTopicMetrics, name=BytesOutPerSec, topic=(.+)><>Count' name: kafka_topic_io type: COUNTER labels: topic: "$1" direction: "out"
# Request metrics - pattern: 'kafka.network<type=RequestMetrics, name=TotalTimeMs, request=(Produce|FetchConsumer|FetchFollower)><>Count' name: kafka_request_time_total type: COUNTER labels: type: "$1"
- pattern: 'kafka.network<type=RequestMetrics, name=TotalTimeMs, request=(Produce|FetchConsumer|FetchFollower)><>50thPercentile' name: kafka_request_time_50p type: GAUGE labels: type: "$1"
- pattern: 'kafka.network<type=RequestMetrics, name=TotalTimeMs, request=(Produce|FetchConsumer|FetchFollower)><>99thPercentile' name: kafka_request_time_99p type: GAUGE labels: type: "$1"
- pattern: 'kafka.network<type=RequestMetrics, name=TotalTimeMs, request=(Produce|FetchConsumer|FetchFollower)><>Mean' name: kafka_request_time_avg type: GAUGE labels: type: "$1"
- pattern: 'kafka.network<type=RequestChannel, name=RequestQueueSize><>Value' name: kafka_request_queue type: GAUGE
- pattern: 'kafka.server<type=DelayedOperationPurgatory, name=PurgatorySize, delayedOperation=(.+)><>Value' name: kafka_purgatory_size type: GAUGE labels: type: "$1"
# Controller stats - pattern: 'kafka.controller<type=ControllerStats, name=LeaderElectionRateAndTimeMs><>Count' name: kafka_leader_election_rate type: COUNTER
- pattern: 'kafka.controller<type=ControllerStats, name=UncleanLeaderElectionsPerSec><>Count' name: kafka_unclean_election_rate type: COUNTER
# Log flush metrics - pattern: 'kafka.log<type=LogFlushStats, name=LogFlushRateAndTimeMs><>Count' name: kafka_logs_flush_count type: COUNTER
- pattern: 'kafka.log<type=LogFlushStats, name=LogFlushRateAndTimeMs><>50thPercentile' name: kafka_logs_flush_time_50p type: GAUGE
- pattern: 'kafka.log<type=LogFlushStats, name=LogFlushRateAndTimeMs><>99thPercentile' name: kafka_logs_flush_time_99p type: GAUGE
# JVM Garbage Collection - pattern: 'java.lang<name=(.+), type=GarbageCollector><>CollectionCount' name: jvm_gc_collections_count type: COUNTER labels: name: "$1"
- pattern: 'java.lang<name=(.+), type=GarbageCollector><>CollectionTime' name: jvm_gc_collections_elapsed type: COUNTER labels: name: "$1"
# JVM Memory - pattern: 'java.lang<type=Memory><HeapMemoryUsage>committed' name: jvm_memory_heap_committed type: GAUGE
- pattern: 'java.lang<type=Memory><HeapMemoryUsage>max' name: jvm_memory_heap_max type: GAUGE
- pattern: 'java.lang<type=Memory><HeapMemoryUsage>used' name: jvm_memory_heap_used type: GAUGE
# JVM Threading and System - pattern: 'java.lang<type=Threading><>ThreadCount' name: jvm_thread_count type: GAUGE
- pattern: 'java.lang<type=OperatingSystem><>SystemLoadAverage' name: jvm_system_cpu_load_1m type: GAUGE
- pattern: 'java.lang<type=OperatingSystem><>AvailableProcessors' name: jvm_cpu_count type: GAUGE
- pattern: 'java.lang<type=OperatingSystem><>ProcessCpuLoad' name: jvm_cpu_recent_utilization type: GAUGE
- pattern: 'java.lang<type=OperatingSystem><>SystemCpuLoad' name: jvm_system_cpu_utilization type: GAUGE
- pattern: 'java.lang<type=OperatingSystem><>OpenFileDescriptorCount' name: jvm_file_descriptor_count type: GAUGE
- pattern: 'java.lang<type=ClassLoading><>LoadedClassCount' name: jvm_class_count type: GAUGE
# JVM Memory Pool - pattern: 'java.lang<type=MemoryPool, name=(.+)><Usage>used' name: jvm_memory_pool_used type: GAUGE labels: name: "$1"
- pattern: 'java.lang<type=MemoryPool, name=(.+)><Usage>max' name: jvm_memory_pool_max type: GAUGE labels: name: "$1"
- pattern: 'java.lang<type=MemoryPool, name=(.+)><CollectionUsage>used' name: jvm_memory_pool_used_after_last_gc type: GAUGE labels: name: "$1"
# Broker uptime - pattern: 'java.lang<type=Runtime><>Uptime' name: kafka_broker_uptime type: GAUGEConseil
Personnaliser les métriques: cette ConfigMap inclut des métriques complètes sur les brokers Kafka, les topics, les requêtes, les contrôleurs et la JVM. Vous pouvez ajouter ou modifier des motifs en consultant les exemples Prometheus JMX Exporter et la documentation des MBeans Kafka. Consultez la documentation des règles de JMX Exporter pour des configurations supplémentaires.
Important
Exigence relative à l'espace de noms: La ConfigMap des métriques JMX et votre cluster Kafka doivent se trouver dans le même espace de noms. Dans ce guide, les deux sont déployés dans l'espace de noms newrelic.
Appliquer la ConfigMap :
$kubectl apply -f kafka-jmx-metrics-config.yamlMettre à jour le cluster Kafka pour utiliser JMX Exporter
Mettez à jour votre ressource Strimzi Kafka pour référencer la ConfigMap des métriques :
apiVersion: kafka.strimzi.io/v1beta2kind: Kafkametadata: name: my-cluster namespace: newrelicspec: kafka: version: X.X.X metricsConfig: type: jmxPrometheusExporter valueFrom: configMapKeyRef: name: kafka-jmx-metrics key: kafka-metrics-config.yml # ...rest of your Kafka configurationAppliquer les modifications. Strimzi effectuera un redémarrage progressif de vos brokers Kafka :
$kubectl apply -f kafka-cluster.yamlUne fois le redémarrage progressif terminé, chaque broker Kafka exposera des métriques Prometheus sur le port 9404.
Déployer le Collecteur OpenTelemetry
Déployez le Collecteur OpenTelemetry pour monitorer votre cluster Kafka. Choisissez votre méthode d'installation préférée :
La méthode d'installation Helm est l'approche recommandée pour déployer OpenTelemetry Collector dans Kubernetes.
Créer un secret d'identifiants New Relic
Créez un secret Kubernetes contenant votre clé de licence New Relic et votre point de terminaison OTLP. Choisissez le point de terminaison pour votre région New Relic :
Conseil
Pour d'autres configurations de point de terminaison, consultez Configurer votre point de terminaison OTLP.
Créer values.yaml avec la configuration du collecteur
Créez un fichier values.yaml contenant la configuration complète du collecteur OpenTelemetry. Les collecteurs NRDOT et OpenTelemetry utilisent une configuration identique et offrent les mêmes capacités du monitoring Kafka. Choisissez votre image de collecteur préférée :
Pour des options de configuration avancées, reportez-vous aux pages de documentation de ces récepteurs :
Documentation du récepteur Prometheus - Options de configuration supplémentaires du récepteur
Documentation du récepteur de métriques Kafka - Configuration de métriques Kafka supplémentaires
Installer OpenTelemetry Collector avec Helm
Ajoutez le dépôt Helm et installez le collecteur OpenTelemetry à l'aide du fichier values.yaml :
bash$helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts$helm upgrade kafka-monitoring open-telemetry/opentelemetry-collector \>--install \>--namespace newrelic \>--create-namespace \>-f values.yamlVérifier le déploiement :
bash$# Check pod status$kubectl get pods -n newrelic -l app.kubernetes.io/name=opentelemetry-collector$$# View logs to verify metrics collection$kubectl logs -n newrelic -l app.kubernetes.io/name=opentelemetry-collector --tail=50Vous devriez voir des logs indiquant un scraping réussi des brokers Kafka sur le port 9404.
La méthode d'installation par manifeste offre un contrôle direct sur les ressources Kubernetes sans utiliser Helm.
Créer un secret d'identifiants New Relic
Créez un secret Kubernetes contenant votre clé de licence New Relic et votre point de terminaison OTLP. Choisissez le point de terminaison pour votre région New Relic :
Conseil
Pour d'autres configurations de point de terminaison, consultez Configurer votre point de terminaison OTLP.
Créer des fichiers manifestes
Créez les fichiers manifestes Kubernetes pour votre collecteur préféré. Les deux collecteurs utilisent une configuration identique - seule l'image diffère.
Choisissez votre option de collecteur et créez les trois fichiers requis :
Pour des options de configuration avancées, reportez-vous aux pages de documentation de ces récepteurs :
Documentation du récepteur Prometheus - Options de configuration supplémentaires du récepteur
Documentation du récepteur de métriques Kafka - Configuration de métriques Kafka supplémentaires
Déployer les manifestes
Appliquez les manifestes Kubernetes pour déployer le Collecteur OpenTelemetry :
bash$# Create namespace if it doesn't exist$kubectl create namespace newrelic --dry-run=client -o yaml | kubectl apply -f -$$# Apply RBAC configuration$kubectl apply -f collector-rbac.yaml$$# Apply ConfigMap$kubectl apply -f collector-configmap.yaml$$# Apply Deployment$kubectl apply -f collector-deployment.yamlVérifier le déploiement :
bash$# Check pod status$kubectl get pods -n newrelic -l app=otel-collector$$# View logs to verify metrics collection$kubectl logs -n newrelic -l app=otel-collector --tail=50Vous devriez voir des logs indiquant un scraping réussi des brokers Kafka sur le port 9404.
(Facultatif) Instrumenter les applications productrices ou consommatrices
Important
Prise en charge des langages: les applications Java prennent en charge l'instrumentation client Kafka prête à l'emploi à l'aide de l'agent Java OpenTelemetry.
Pour collecter la télémétrie au niveau applicatif de vos applications productrices et consommatrices Kafka, utilisez l'agent Java OpenTelemetry.
Instrumentez votre application Kafka
Utilisez un conteneur d'initialisation pour télécharger l'agent Java OpenTelemetry au moment de l'exécution :
apiVersion: apps/v1kind: Deploymentmetadata: name: kafka-producer-appspec: template: spec: initContainers: - name: download-java-agent image: busybox:latest command: - sh - -c - | wget -O /otel-auto-instrumentation/opentelemetry-javaagent.jar \ https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar volumeMounts: - name: otel-auto-instrumentation mountPath: /otel-auto-instrumentation
containers: - name: app image: your-kafka-app:latest env: - name: JAVA_TOOL_OPTIONS value: >- -javaagent:/otel-auto-instrumentation/opentelemetry-javaagent.jar -Dotel.service.name=order-process-service -Dotel.resource.attributes=kafka.cluster.name=my-cluster -Dotel.exporter.otlp.endpoint=http://localhost:4317 -Dotel.exporter.otlp.protocol=grpc -Dotel.metrics.exporter=otlp -Dotel.traces.exporter=otlp -Dotel.logs.exporter=otlp -Dotel.instrumentation.kafka.experimental-span-attributes=true -Dotel.instrumentation.messaging.experimental.receive-telemetry.enabled=true -Dotel.instrumentation.kafka.producer-propagation.enabled=true -Dotel.instrumentation.kafka.enabled=true volumeMounts: - name: otel-auto-instrumentation mountPath: /otel-auto-instrumentation
volumes: - name: otel-auto-instrumentation emptyDir: {}Notes de configuration :
- Remplacez
order-process-servicepar un nom unique pour votre application producteur ou consommateur - Remplacez
my-clusterpar le même nom de cluster utilisé dans la configuration de votre collecteur. - Le point de terminaison
http://localhost:4317suppose que le collecteur s'exécute en tant que sidecar dans le même pod ou est accessible via localhost
Conseil
La configuration ci-dessus envoie la télémétrie à un Collecteur OpenTelemetry. Si vous devez envoyer des données de télémétrie au collecteur, déployez-le comme décrit à l'étape 3 avec cette configuration :
L'agent Java fournit l'instrumentation Kafka prête à l'emploi sans aucune modification de code, capturant :
- Latences des requêtes
- Métriques de débit
- Taux d'erreur
- traces distribuées
Pour une configuration avancée, consultez la documentation d'instrumentation Kafka.
Trouvez vos données
Après quelques minutes, vos métriques Kafka devraient apparaître dans New Relic. Consultez Trouver vos données pour obtenir des instructions détaillées sur l'exploration de vos métriques Kafka dans différentes vues de l'interface utilisateur New Relic.
Vous pouvez également interroger vos données avec NRQL :
FROM Metric SELECT * WHERE kafka.cluster.name = 'my-kafka-cluster'Dépannage
Prochaines étapes
- Explorer les métriques Kafka - Consulter la référence complète des métriques
- Créer des dashboards personnalisés - Créez des visualisations pour vos données Kafka
- Configurer des alertes - Monitorez les métriques critiques telles que le retard du consommateur et les partitions sous-répliquées