Monitorez vos instances Redis dans Kubernetes en dĂ©ployant le Collector OpenTelemetry en tant que DaemonSet. Le collecteur utilise k8s_observer et receiver_creator pour dĂ©couvrir automatiquement les pods Redis en fonction des labels â aucune modification n'est nĂ©cessaire pour vos dĂ©ploiements Redis existants.
Important
Le modÚle composite (server.address:server.port) n'est pas pris en charge dans Kubernetes. Les adresses IP des pods sont éphémÚres et changent à chaque redémarrage, ce qui créerait des entités en double. Utilisez le modÚle redis.instance.id avec un identifiant stable (par exemple, cluster-name.namespace:port).
Avant de commencer
Vous aurez besoin des éléments suivants avant de configurer le collecteur :
- Votre New Relic
kubectlaccĂšs Ă votre cluster Kubernetes avec des autorisations d'administrateur- Redis en cours d'exĂ©cution dans votre cluster Kubernetes â version 6.0 ou ultĂ©rieure recommandĂ©e (la version 4.0 et les versions ultĂ©rieures fonctionnent avec un ensemble de mĂ©triques rĂ©duit)
- Pour les chemins NRDOT et OpenTelemetry Collector Contrib, vos pods Redis doivent porter une étiquette découvrable (par exemple,
app: redis) - HTTPS sortant (port 443) vers le point de terminaison OTLPde New Relic
Choisissez votre distribution de collecteur dans les Options d'installation: le collecteur NRDOT, l'OpenTelemetry Collector Contrib ou le récepteur Prometheus. Les chemins NRDOT et Contrib découvrent automatiquement les pods Redis avec k8s_observer; le chemin du récepteur Prometheus scrape un redis_exporter que vous déployez aux cÎtés de Redis.
Options d'installation
Créer un espace de nommage et des identifiants
Créez un espace de nommage newrelic et stockez votre clé de licence et votre point de terminaison OTLP dans un Secret Kubernetes, que le collecteur lit à l'exécution afin que vos identifiants restent en dehors de la configuration :
$kubectl create namespace newrelic$
$# Set OTEL_EXPORTER_OTLP_ENDPOINT for your region.$# See https://docs.newrelic.com/docs/opentelemetry/best-practices/opentelemetry-otlp$kubectl create secret generic newrelic-credentials \> --from-literal=NEW_RELIC_LICENSE_KEY=YOUR_LICENSE_KEY \> --from-literal=OTEL_EXPORTER_OTLP_ENDPOINT=YOUR_OTLP_ENDPOINT \> -n newrelicConfigurer RBAC
Le k8s_observer a besoin dâautorisations pour surveiller les pods. CrĂ©er rbac.yaml:
apiVersion: v1kind: ServiceAccountmetadata: name: otel-collector-redis namespace: newrelic---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: otel-collector-redisrules: - apiGroups: [""] resources: ["pods", "namespaces", "nodes"] verbs: ["get", "list", "watch"] - apiGroups: ["apps"] resources: ["replicasets"] verbs: ["get", "list", "watch"]---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: otel-collector-redissubjects: - kind: ServiceAccount name: otel-collector-redis namespace: newrelicroleRef: kind: ClusterRole name: otel-collector-redis apiGroup: rbac.authorization.k8s.io$kubectl apply -f rbac.yamlConfigurer le collecteur
Ce ConfigMap indique au collecteur comment découvrir les pods Redis, collecter leurs métriques et les envoyer à New Relic. Il gÚre trois tùches principales :
Découvrir les pods Redis automatiquement avec
k8s_observeret lereceiver_creatorFaçonner les donnĂ©es â rĂ©duire la cardinalitĂ©, convertir les compteurs en deltas et dĂ©finir l'identitĂ© de l'entitĂ©
Exportez les métriques traitées vers New Relic via OTLP
Créer
otel-collector-config.yaml:apiVersion: v1kind: ConfigMapmetadata:name: otel-collector-redis-confignamespace: newrelicdata:config.yaml: |extensions:health_check:endpoint: "0.0.0.0:13133"k8s_observer:auth_type: serviceAccountobserve_pods: trueobserve_nodes: falsereceivers:receiver_creator/redis:watch_observers: [k8s_observer]receivers:redis:rule: type == "pod" && labels["app"] == "redis" # Update with your Redis pod labelsconfig:endpoint: "`endpoint`:6379"collection_interval: 10smetrics:redis.maxmemory:enabled: trueredis.role:enabled: falseredis.cmd.calls:enabled: trueredis.cmd.usec:enabled: trueredis.clients.max_input_buffer:enabled: falseredis.clients.max_output_buffer:enabled: falseredis.replication.backlog_first_byte_offset:enabled: falseresource_attributes:server.address:enabled: falseserver.port:enabled: falseprocessors:memory_limiter:check_interval: 5slimit_mib: 256spike_limit_mib: 64resource/k8s_cluster:attributes:- key: k8s.cluster.namevalue: "my-cluster" # Update with your cluster nameaction: upsert- key: redis.instance.idvalue: "my-cluster.default:6379" # Update with cluster.namespace:portaction: upsertattributes/entity_tags:actions:- key: instrumentation.providervalue: opentelemetryaction: upsertcumulativetodelta:include:match_type: regexpmetrics:- redis\.commands\.processed- redis\.connections\.received- redis\.connections\.rejected- redis\.keys\.evicted- redis\.keys\.expired- redis\.keyspace\.hits- redis\.keyspace\.misses- redis\.net\.input- redis\.net\.output- redis\.cpu\.time- redis\.cmd\.calls- redis\.cmd\.usec- redis\.uptimefilter/cardinality:metrics:datapoint:- 'metric.name == "redis.cpu.time" and attributes["state"] != "sys" and attributes["state"] != "user"'- 'metric.name == "redis.cmd.calls" and attributes["cmd"] != "get" and attributes["cmd"] != "set" and attributes["cmd"] != "del" and attributes["cmd"] != "hget" and attributes["cmd"] != "hset" and attributes["cmd"] != "hgetall" and attributes["cmd"] != "lpush" and attributes["cmd"] != "rpop" and attributes["cmd"] != "zadd" and attributes["cmd"] != "expire"'- 'metric.name == "redis.cmd.usec" and attributes["cmd"] != "get" and attributes["cmd"] != "set" and attributes["cmd"] != "del" and attributes["cmd"] != "hget" and attributes["cmd"] != "hset" and attributes["cmd"] != "hgetall" and attributes["cmd"] != "lpush" and attributes["cmd"] != "rpop" and attributes["cmd"] != "zadd" and attributes["cmd"] != "expire"'transform/metadata_nullify:metric_statements:- context: metricstatements:- set(description, "")- set(unit, "")batch:send_batch_size: 2048send_batch_max_size: 4096timeout: 10sexporters:otlp_http:endpoint: ${env:OTEL_EXPORTER_OTLP_ENDPOINT}headers:api-key: ${env:NEW_RELIC_LICENSE_KEY}compression: gzipservice:extensions: [health_check, k8s_observer]pipelines:metrics/redis:receivers: [receiver_creator/redis]processors: [memory_limiter, resource/k8s_cluster, attributes/entity_tags, cumulativetodelta, filter/cardinality, transform/metadata_nullify, batch]exporters: [otlp_http]bash$kubectl apply -f otel-collector-config.yamlCe que fait cette configuration
Chaque composant du pipeline a une tùche spécifique :
Composant Description health_checkExpose un point de terminaison de santĂ© sur 0.0.0.0:13133afin que vous puissiez confirmer que le collecteur est en cours d'exĂ©cution.k8s_observerSurveille l'API Kubernetes pour les pods afin que le collecteur puisse dĂ©couvrir les instances Redis dynamiquement. receiver_creator/redisDĂ©marre un rĂ©cepteur redispour chaque pod correspondant Ă la rĂšgle (labels["app"] == "redis") et lit ses mĂ©triques Ă partir de la commande RedisINFOtoutes les 10 secondes.memory_limiterLimite l'utilisation de la mĂ©moire du collecteur (limite souple de 256 Mio, pic de 64 Mio) pour protĂ©ger le pod. resource/k8s_clusterDĂ©finit k8s.cluster.nameetredis.instance.id, l'identitĂ© stable pour votre entitĂ© Redis (le modĂšle compositeserver.address:server.portn'est pas utilisĂ© sur Kubernetes).attributes/entity_tagsAjoute instrumentation.provider: opentelemetryĂ chaque mĂ©trique afin que vous puissiez limiter les requĂȘtes au chemin OpenTelemetry.cumulativetodeltaConvertit les compteurs cumulatifs de Redis â commandes, succĂšs d'espace clĂ©, Ă©victions, etc. â en valeurs delta afin que New Relic reprĂ©sente correctement les taux. filter/cardinalitySupprime les points de donnĂ©es Ă forte cardinalitĂ© (Ă©tats du processeur autres que useretsys, et mĂ©triques par commande pour les commandes peu communes) afin de contrĂŽler les coĂ»ts d'ingestion.transform/metadata_nullifyEfface les descriptions et les unitĂ©s des mĂ©triques pour rĂ©duire la taille de la charge. batchRegroupe les points de donnĂ©es avant lâexportation (2 048 par lot, jusquâĂ 4 096) et les vide au moins toutes les 10 secondes pour rĂ©duire la surcharge du rĂ©seau. otlp_httpExporte les mĂ©triques traitĂ©es vers New Relic via OTLP avec la compression gzip, authentifiĂ©es avec votre clĂ© de licence.
Facultatif : collecter les logs Redis
Au-delĂ des mĂ©triques, le collecteur peut transfĂ©rer les logs de Redis Ă New Relic afin que vous puissiez corrĂ©ler les Ă©vĂ©nements de log â redĂ©marrages, Ă©vĂ©nements de persistance ou erreurs â avec les pics de mĂ©triques sur la mĂȘme entitĂ©. Pour les collecter, ajoutez le rĂ©cepteur filelog Ă votre ConfigMap et montez /var/log/pods dans le DaemonSet.
Ajoutez à la section receivers de votre ConfigMap :
file_log/redis: include: - /var/log/pods/<namespace>_*redis*/*/*.log # Update <namespace> with your Redis namespace (e.g., default, production) start_at: end include_file_path: true operators: - type: regex_parser regex: '^\S+ stdout F \d+:[XCSM] \d+ \w+ \d+ \d+:\d+:\d+\.\d+ (?P<level>.) ' on_error: send resource: db.system: redisAjouter un Processeur resource/redis_logs :
resource/redis_logs: attributes: - key: redis.instance.id value: "my-cluster.default:6379" # Update with cluster.namespace:port action: upsert - key: instrumentation.provider value: "opentelemetry" action: upsertAjoutez un pipeline de logs Ă la section Service :
service: pipelines: metrics/redis: # ... existing metrics pipeline ... logs/redis: receivers: [file_log/redis] processors: [memory_limiter, resource/redis_logs, batch] exporters: [otlp_http]Décommentez le montage de volume varlogpods dans le DaemonSet ci-dessous.
Facultatif : activer le monitoring du Cluster Redis
Le monitoring du Cluster Redis nécessite actuellement l'approche du Récepteur Prometheus (en utilisant redis_exporter). Le Récepteur Redis natif du Collector NRDOT ne prend pas encore en charge la commande CLUSTER INFO nécessaire pour les métriques du cluster. Utilisez l'onglet Récepteur Prometheus pour la configuration du monitoring du cluster.
Déployer le DaemonSet
Créer otel-collector-daemonset.yaml:
apiVersion: apps/v1kind: DaemonSetmetadata: name: otel-collector-redis namespace: newrelicspec: selector: matchLabels: app: otel-collector-redis template: metadata: labels: app: otel-collector-redis spec: serviceAccountName: otel-collector-redis containers: - name: otel-collector image: newrelic/nrdot-collector:latest args: ["--config=/etc/otel/config.yaml"] env: - name: NEW_RELIC_LICENSE_KEY valueFrom: secretKeyRef: name: newrelic-credentials key: NEW_RELIC_LICENSE_KEY - name: OTEL_EXPORTER_OTLP_ENDPOINT valueFrom: secretKeyRef: name: newrelic-credentials key: OTEL_EXPORTER_OTLP_ENDPOINT - name: K8S_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName resources: limits: cpu: 500m memory: 512Mi requests: cpu: 100m memory: 128Mi volumeMounts: - name: config mountPath: /etc/otel - name: machine-id mountPath: /etc/machine-id readOnly: true # Uncomment if collecting logs: # - name: varlogpods # mountPath: /var/log/pods # readOnly: true livenessProbe: httpGet: path: / port: 13133 initialDelaySeconds: 15 readinessProbe: httpGet: path: / port: 13133 initialDelaySeconds: 5 volumes: - name: config configMap: name: otel-collector-redis-config - name: machine-id hostPath: path: /etc/machine-id # Uncomment if collecting logs: # - name: varlogpods # hostPath: # path: /var/log/pods$kubectl apply -f otel-collector-daemonset.yamlVérifier
Confirmez que le pod du collecteur est en cours d'exécution :
$kubectl get pods -n newrelic -l app=otel-collector-redisLe pod doit afficher Running avec tous les conteneurs prĂȘts. S'il est CrashLoopBackOff ou Error, vĂ©rifiez ses logs avec kubectl logs -n newrelic -l app=otel-collector-redis â les causes les plus courantes sont des erreurs YAML du ConfigMap, un ClusterRole RBAC manquant ou la rĂšgle de dĂ©couverte ne correspondant pas aux labels de vos pods Redis.
Confirmez ensuite que vos mĂ©triques parviennent Ă New Relic. Attendez environ une minute aprĂšs le dĂ©marrage du pod, puis exĂ©cutez cette requĂȘte dans le gĂ©nĂ©rateur de requĂȘtes:
SELECT count(*) FROM MetricWHERE metricName LIKE 'redis.%'AND instrumentation.provider = 'opentelemetry'AND k8s.cluster.name IS NOT NULLSINCE 5 minutes agoUn nombre non nul confirme que les métriques Redis circulent. S'il renvoie 0, consultez Dépanner Redis (OpenTelemetry).
Créer un espace de nommage et des identifiants
Créez un espace de nommage newrelic et stockez votre clé de licence et votre point de terminaison OTLP dans un Secret Kubernetes, que le collecteur lit à l'exécution afin que vos identifiants restent en dehors de la configuration :
$kubectl create namespace newrelic$
$# Set OTEL_EXPORTER_OTLP_ENDPOINT for your region.$# See https://docs.newrelic.com/docs/opentelemetry/best-practices/opentelemetry-otlp$kubectl create secret generic newrelic-credentials \> --from-literal=NEW_RELIC_LICENSE_KEY=YOUR_LICENSE_KEY \> --from-literal=OTEL_EXPORTER_OTLP_ENDPOINT=YOUR_OTLP_ENDPOINT \> -n newrelicConfigurer RBAC
Le k8s_observer a besoin dâautorisations pour surveiller les pods. CrĂ©er rbac.yaml:
apiVersion: v1kind: ServiceAccountmetadata: name: otel-collector-redis namespace: newrelic---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: otel-collector-redisrules: - apiGroups: [""] resources: ["pods", "namespaces", "nodes"] verbs: ["get", "list", "watch"] - apiGroups: ["apps"] resources: ["replicasets"] verbs: ["get", "list", "watch"]---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: otel-collector-redissubjects: - kind: ServiceAccount name: otel-collector-redis namespace: newrelicroleRef: kind: ClusterRole name: otel-collector-redis apiGroup: rbac.authorization.k8s.io$kubectl apply -f rbac.yamlConfigurer le collecteur
Ce ConfigMap indique au collecteur comment découvrir les pods Redis, collecter leurs métriques et les envoyer à New Relic. Il gÚre trois tùches principales :
Découvrir les pods Redis automatiquement avec
k8s_observeret lereceiver_creatorFaçonner les donnĂ©es â rĂ©duire la cardinalitĂ©, convertir les compteurs en deltas et dĂ©finir l'identitĂ© de l'entitĂ©
Exportez les métriques traitées vers New Relic via OTLP
Créer
otel-collector-config.yaml:apiVersion: v1kind: ConfigMapmetadata:name: otel-collector-redis-confignamespace: newrelicdata:config.yaml: |extensions:health_check:endpoint: "0.0.0.0:13133"k8s_observer:auth_type: serviceAccountobserve_pods: trueobserve_nodes: falsereceivers:receiver_creator/redis:watch_observers: [k8s_observer]receivers:redis:rule: type == "pod" && labels["app"] == "redis" # Update with your Redis pod labelsconfig:endpoint: "`endpoint`:6379"collection_interval: 10smetrics:redis.maxmemory:enabled: trueredis.role:enabled: falseredis.cmd.calls:enabled: trueredis.cmd.usec:enabled: trueredis.clients.max_input_buffer:enabled: falseredis.clients.max_output_buffer:enabled: falseredis.replication.backlog_first_byte_offset:enabled: falseresource_attributes:server.address:enabled: falseserver.port:enabled: falseprocessors:memory_limiter:check_interval: 5slimit_mib: 256spike_limit_mib: 64resource/k8s_cluster:attributes:- key: k8s.cluster.namevalue: "my-cluster" # Update with your cluster nameaction: upsert- key: redis.instance.idvalue: "my-cluster.default:6379" # Update with cluster.namespace:portaction: upsertattributes/entity_tags:actions:- key: instrumentation.providervalue: opentelemetryaction: upsertcumulativetodelta:include:match_type: regexpmetrics:- redis\.commands\.processed- redis\.connections\.received- redis\.connections\.rejected- redis\.keys\.evicted- redis\.keys\.expired- redis\.keyspace\.hits- redis\.keyspace\.misses- redis\.net\.input- redis\.net\.output- redis\.cpu\.time- redis\.cmd\.calls- redis\.cmd\.usec- redis\.uptimefilter/cardinality:metrics:datapoint:- 'metric.name == "redis.cpu.time" and attributes["state"] != "sys" and attributes["state"] != "user"'- 'metric.name == "redis.cmd.calls" and attributes["cmd"] != "get" and attributes["cmd"] != "set" and attributes["cmd"] != "del" and attributes["cmd"] != "hget" and attributes["cmd"] != "hset" and attributes["cmd"] != "hgetall" and attributes["cmd"] != "lpush" and attributes["cmd"] != "rpop" and attributes["cmd"] != "zadd" and attributes["cmd"] != "expire"'- 'metric.name == "redis.cmd.usec" and attributes["cmd"] != "get" and attributes["cmd"] != "set" and attributes["cmd"] != "del" and attributes["cmd"] != "hget" and attributes["cmd"] != "hset" and attributes["cmd"] != "hgetall" and attributes["cmd"] != "lpush" and attributes["cmd"] != "rpop" and attributes["cmd"] != "zadd" and attributes["cmd"] != "expire"'transform/metadata_nullify:metric_statements:- context: metricstatements:- set(description, "")- set(unit, "")batch:send_batch_size: 2048send_batch_max_size: 4096timeout: 10sexporters:otlp_http:endpoint: ${env:OTEL_EXPORTER_OTLP_ENDPOINT}headers:api-key: ${env:NEW_RELIC_LICENSE_KEY}compression: gzipservice:extensions: [health_check, k8s_observer]pipelines:metrics/redis:receivers: [receiver_creator/redis]processors: [memory_limiter, resource/k8s_cluster, attributes/entity_tags, cumulativetodelta, filter/cardinality, transform/metadata_nullify, batch]exporters: [otlp_http]bash$kubectl apply -f otel-collector-config.yamlCe que fait cette configuration
Chaque composant du pipeline a une tùche spécifique :
Composant Description health_checkExpose un point de terminaison de santĂ© sur 0.0.0.0:13133afin que vous puissiez confirmer que le collecteur est en cours d'exĂ©cution.k8s_observerSurveille l'API Kubernetes pour les pods afin que le collecteur puisse dĂ©couvrir les instances Redis dynamiquement. receiver_creator/redisDĂ©marre un rĂ©cepteur redispour chaque pod correspondant Ă la rĂšgle (labels["app"] == "redis") et lit ses mĂ©triques Ă partir de la commande RedisINFOtoutes les 10 secondes.memory_limiterLimite l'utilisation de la mĂ©moire du collecteur (limite souple de 256 Mio, pic de 64 Mio) pour protĂ©ger le pod. resource/k8s_clusterDĂ©finit k8s.cluster.nameetredis.instance.id, l'identitĂ© stable pour votre entitĂ© Redis (le modĂšle compositeserver.address:server.portn'est pas utilisĂ© sur Kubernetes).attributes/entity_tagsAjoute instrumentation.provider: opentelemetryĂ chaque mĂ©trique afin que vous puissiez limiter les requĂȘtes au chemin OpenTelemetry.cumulativetodeltaConvertit les compteurs cumulatifs de Redis â commandes, succĂšs d'espace clĂ©, Ă©victions, etc. â en valeurs delta afin que New Relic reprĂ©sente correctement les taux. filter/cardinalitySupprime les points de donnĂ©es Ă forte cardinalitĂ© (Ă©tats du processeur autres que useretsys, et mĂ©triques par commande pour les commandes peu communes) afin de contrĂŽler les coĂ»ts d'ingestion.transform/metadata_nullifyEfface les descriptions et les unitĂ©s des mĂ©triques pour rĂ©duire la taille de la charge. batchRegroupe les points de donnĂ©es avant lâexportation (2 048 par lot, jusquâĂ 4 096) et les vide au moins toutes les 10 secondes pour rĂ©duire la surcharge du rĂ©seau. otlp_httpExporte les mĂ©triques traitĂ©es vers New Relic via OTLP avec la compression gzip, authentifiĂ©es avec votre clĂ© de licence.
Facultatif : collecter les logs Redis
Au-delĂ des mĂ©triques, le collecteur peut transfĂ©rer les logs de Redis Ă New Relic afin que vous puissiez corrĂ©ler les Ă©vĂ©nements de log â redĂ©marrages, Ă©vĂ©nements de persistance ou erreurs â avec les pics de mĂ©triques sur la mĂȘme entitĂ©. Pour les collecter, ajoutez le rĂ©cepteur filelog Ă votre ConfigMap et montez /var/log/pods dans le DaemonSet.
Ajoutez à la section receivers de votre ConfigMap :
file_log/redis: include: - /var/log/pods/<namespace>_*redis*/*/*.log # Update <namespace> with your Redis namespace (e.g., default, production) start_at: end include_file_path: true operators: - type: regex_parser regex: '^\S+ stdout F \d+:[XCSM] \d+ \w+ \d+ \d+:\d+:\d+\.\d+ (?P<level>.) ' on_error: send resource: db.system: redisAjouter un Processeur resource/redis_logs :
resource/redis_logs: attributes: - key: redis.instance.id value: "my-cluster.default:6379" # Update with cluster.namespace:port action: upsert - key: instrumentation.provider value: "opentelemetry" action: upsertAjoutez un pipeline de logs Ă la section Service :
service: pipelines: metrics/redis: # ... existing metrics pipeline ... logs/redis: receivers: [file_log/redis] processors: [memory_limiter, resource/redis_logs, batch] exporters: [otlp_http]Facultatif : activer le monitoring du Cluster Redis
Le monitoring du Cluster Redis nécessite actuellement l'approche du récepteur Prometheus (en utilisant redis_exporter). Le récepteur Redis natif du Collecteur Otel Contrib ne prend pas encore en charge la commande CLUSTER INFO nécessaire pour les métriques de cluster. Utilisez l'onglet Récepteur Prometheus pour la configuration du monitoring de cluster.
Déployer le DaemonSet
Créer otel-collector-daemonset.yaml:
apiVersion: apps/v1kind: DaemonSetmetadata: name: otel-collector-redis namespace: newrelicspec: selector: matchLabels: app: otel-collector-redis template: metadata: labels: app: otel-collector-redis spec: serviceAccountName: otel-collector-redis containers: - name: otel-collector image: otel/opentelemetry-collector-contrib:latest args: ["--config=/etc/otel/config.yaml"] env: - name: NEW_RELIC_LICENSE_KEY valueFrom: secretKeyRef: name: newrelic-credentials key: NEW_RELIC_LICENSE_KEY - name: OTEL_EXPORTER_OTLP_ENDPOINT valueFrom: secretKeyRef: name: newrelic-credentials key: OTEL_EXPORTER_OTLP_ENDPOINT - name: K8S_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName resources: limits: cpu: 500m memory: 512Mi requests: cpu: 100m memory: 128Mi volumeMounts: - name: config mountPath: /etc/otel - name: machine-id mountPath: /etc/machine-id readOnly: true # Uncomment if collecting logs: # - name: varlogpods # mountPath: /var/log/pods # readOnly: true livenessProbe: httpGet: path: / port: 13133 initialDelaySeconds: 15 readinessProbe: httpGet: path: / port: 13133 initialDelaySeconds: 5 volumes: - name: config configMap: name: otel-collector-redis-config - name: machine-id hostPath: path: /etc/machine-id # Uncomment if collecting logs: # - name: varlogpods # hostPath: # path: /var/log/pods$kubectl apply -f otel-collector-daemonset.yamlVérifier
Confirmez que le pod du collecteur est en cours d'exécution :
$kubectl get pods -n newrelic -l app=otel-collector-redisLe pod doit afficher Running avec tous les conteneurs prĂȘts. S'il est CrashLoopBackOff ou Error, vĂ©rifiez ses logs avec kubectl logs -n newrelic -l app=otel-collector-redis â les causes les plus courantes sont des erreurs YAML du ConfigMap, un ClusterRole RBAC manquant ou la rĂšgle de dĂ©couverte ne correspondant pas aux labels de vos pods Redis.
Confirmez ensuite que vos mĂ©triques parviennent Ă New Relic. Attendez environ une minute aprĂšs le dĂ©marrage du pod, puis exĂ©cutez cette requĂȘte dans le gĂ©nĂ©rateur de requĂȘtes:
SELECT count(*) FROM MetricWHERE metricName LIKE 'redis.%'AND instrumentation.provider = 'opentelemetry'AND k8s.cluster.name IS NOT NULLSINCE 5 minutes agoUn nombre non nul confirme que les métriques Redis circulent. S'il renvoie 0, consultez Dépanner Redis (OpenTelemetry).
Créer un espace de nommage et des identifiants
Créez un espace de nommage newrelic et stockez votre clé de licence et votre point de terminaison OTLP dans un Secret Kubernetes, que le collecteur lit à l'exécution afin que vos identifiants restent en dehors de la configuration :
$kubectl create namespace newrelic$
$# Set OTEL_EXPORTER_OTLP_ENDPOINT for your region.$# See https://docs.newrelic.com/docs/opentelemetry/best-practices/opentelemetry-otlp$kubectl create secret generic newrelic-credentials \> --from-literal=NEW_RELIC_LICENSE_KEY=YOUR_LICENSE_KEY \> --from-literal=OTEL_EXPORTER_OTLP_ENDPOINT=YOUR_OTLP_ENDPOINT \> -n newrelicDéployer redis_exporter
Déployez redis_exporter en tant que sidecar dans votre pod Redis ou en tant que déploiement séparé. Cet exemple le déploie en tant que déploiement autonome avec un service pour que le collecteur le scrape.
Créer redis-exporter.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: redis-exporter namespace: default # Update with your Redis namespacespec: replicas: 1 selector: matchLabels: app: redis-exporter template: metadata: labels: app: redis-exporter spec: containers: - name: redis-exporter image: oliver006/redis_exporter:latest env: - name: REDIS_ADDR value: "redis://redis:6379" # Update with your Redis service name:port # Uncomment if using Redis authentication: # - name: REDIS_PASSWORD # valueFrom: # secretKeyRef: # name: redis-credentials # key: password ports: - containerPort: 9121 name: metrics livenessProbe: httpGet: path: /health port: 9121 initialDelaySeconds: 5 readinessProbe: httpGet: path: /health port: 9121 initialDelaySeconds: 5---apiVersion: v1kind: Servicemetadata: name: redis-exporter namespace: default # Update with your Redis namespacespec: selector: app: redis-exporter ports: - port: 9121 targetPort: 9121 name: metrics$kubectl apply -f redis-exporter.yamlVérifiez que l'exportateur est en cours d'exécution :
$kubectl port-forward svc/redis-exporter 9121:9121 &$curl -s http://localhost:9121/metrics | grep redis_upConfigurer le collecteur
Cette ConfigMap récupÚre les métriques de redis_exporter et les envoie à New Relic. Elle gÚre ces tùches principales :
Scraper le service
redis_exportervia le RécepteurprometheusRenommer les métriques Prometheus avec les noms de métrique Redis de New Relic
Façonner les donnĂ©es â rĂ©duire la cardinalitĂ©, convertir les compteurs en deltas et dĂ©finir l'identitĂ© de l'entitĂ©
Exportez les métriques traitées vers New Relic via OTLP
Créer
otel-collector-config.yaml:apiVersion: v1kind: ConfigMapmetadata:name: otel-collector-redis-confignamespace: newrelicdata:config.yaml: |extensions:health_check:endpoint: "0.0.0.0:13133"receivers:prometheus:config:scrape_configs:- job_name: 'redis'scrape_interval: 10sstatic_configs:- targets: ['redis-exporter.default.svc.cluster.local:9121'] # Update with your exporter service FQDNmetric_relabel_configs:- source_labels: [__name__]regex: '(go_|process_|promhttp_|redis_exporter_).*'action: dropprocessors:memory_limiter:check_interval: 5slimit_mib: 256spike_limit_mib: 64resource/redis_identity:attributes:- key: k8s.cluster.namevalue: "my-cluster" # Update with your cluster nameaction: upsert- key: redis.instance.idvalue: "my-cluster.default:6379" # Update with cluster.namespace:portaction: upsertattributes/entity_tags:actions:- key: instrumentation.providervalue: opentelemetryaction: upsertmetricstransform:transforms:- include: redis_uptime_in_secondsaction: updatenew_name: redis.uptime- include: redis_connected_clientsaction: updatenew_name: redis.clients.connected- include: redis_blocked_clientsaction: updatenew_name: redis.clients.blocked- include: redis_memory_used_bytesaction: updatenew_name: redis.memory.used- include: redis_memory_max_bytesaction: updatenew_name: redis.maxmemory- include: redis_mem_fragmentation_ratioaction: updatenew_name: redis.memory.fragmentation_ratio- include: redis_memory_used_rss_bytesaction: updatenew_name: redis.memory.rss- include: redis_memory_used_peak_bytesaction: updatenew_name: redis.memory.peak- include: redis_memory_used_lua_bytesaction: updatenew_name: redis.memory.lua- include: redis_connections_received_totalaction: updatenew_name: redis.connections.received- include: redis_rejected_connections_totalaction: updatenew_name: redis.connections.rejected- include: redis_commands_processed_totalaction: updatenew_name: redis.commands.processed- include: redis_keyspace_hits_totalaction: updatenew_name: redis.keyspace.hits- include: redis_keyspace_misses_totalaction: updatenew_name: redis.keyspace.misses- include: redis_evicted_keys_totalaction: updatenew_name: redis.keys.evicted- include: redis_expired_keys_totalaction: updatenew_name: redis.keys.expired- include: redis_net_input_bytes_totalaction: updatenew_name: redis.net.input- include: redis_net_output_bytes_totalaction: updatenew_name: redis.net.output- include: redis_connected_slavesaction: updatenew_name: redis.slaves.connected- include: redis_db_keysaction: updatenew_name: redis.db.keys- include: redis_db_keys_expiringaction: updatenew_name: redis.db.expires- include: redis_rdb_changes_since_last_saveaction: updatenew_name: redis.rdb.changes_since_last_save- include: redis_db_avg_ttl_secondsaction: updatenew_name: redis.db.avg_ttl- include: redis_latest_fork_secondsaction: updatenew_name: redis.latest_fork- include: redis_master_repl_offsetaction: updatenew_name: redis.replication.offset- include: redis_repl_backlog_first_byte_offsetaction: updatenew_name: redis.replication.backlog_first_byte_offset- include: redis_commands_totalaction: updatenew_name: redis.cmd.calls- include: redis_commands_duration_seconds_totalaction: updatenew_name: redis.cmd.usec- include: redis_cpu_sys_seconds_totalaction: updatenew_name: redis.cpu.timeoperations:- action: add_labelnew_label: statenew_value: sys- include: redis_cpu_user_seconds_totalaction: updatenew_name: redis.cpu.timeoperations:- action: add_labelnew_label: statenew_value: usercumulativetodelta:include:match_type: regexpmetrics:- redis\.commands\.processed- redis\.connections\.received- redis\.connections\.rejected- redis\.keys\.evicted- redis\.keys\.expired- redis\.keyspace\.hits- redis\.keyspace\.misses- redis\.net\.input- redis\.net\.output- redis\.cpu\.time- redis\.cmd\.calls- redis\.cmd\.usec- redis\.uptimefilter/cardinality:metrics:datapoint:- 'metric.name == "redis.cpu.time" and attributes["state"] != "sys" and attributes["state"] != "user"'- 'metric.name == "redis.cmd.calls" and attributes["cmd"] != "get" and attributes["cmd"] != "set" and attributes["cmd"] != "del" and attributes["cmd"] != "hget" and attributes["cmd"] != "hset" and attributes["cmd"] != "hgetall" and attributes["cmd"] != "lpush" and attributes["cmd"] != "rpop" and attributes["cmd"] != "zadd" and attributes["cmd"] != "expire"'- 'metric.name == "redis.cmd.usec" and attributes["cmd"] != "get" and attributes["cmd"] != "set" and attributes["cmd"] != "del" and attributes["cmd"] != "hget" and attributes["cmd"] != "hset" and attributes["cmd"] != "hgetall" and attributes["cmd"] != "lpush" and attributes["cmd"] != "rpop" and attributes["cmd"] != "zadd" and attributes["cmd"] != "expire"'transform/metadata_nullify:metric_statements:- context: metricstatements:- set(description, "")- set(unit, "")batch:send_batch_size: 2048send_batch_max_size: 4096timeout: 10sexporters:otlp_http:endpoint: ${env:OTEL_EXPORTER_OTLP_ENDPOINT}headers:api-key: ${env:NEW_RELIC_LICENSE_KEY}compression: gzipservice:extensions: [health_check]pipelines:metrics/redis:receivers: [prometheus]processors: [memory_limiter, resource/redis_identity, attributes/entity_tags, metricstransform, cumulativetodelta, filter/cardinality, transform/metadata_nullify, batch]exporters: [otlp_http]bash$kubectl apply -f otel-collector-config.yamlCe que fait cette configuration
Chaque composant du pipeline a une tùche spécifique :
Composant Description health_checkExpose un point de terminaison de santĂ© sur 0.0.0.0:13133afin que vous puissiez confirmer que le collecteur est en cours d'exĂ©cution.prometheusRĂ©cepteurScrape le service redis_exporter(par dĂ©fautredis-exporter.default.svc.cluster.local:9121) toutes les 10 secondes et supprime les propres mĂ©triquesgo_*,process_*,promhttp_*etredis_exporter_*de l'exportateur.memory_limiterLimite l'utilisation de la mĂ©moire du collecteur (limite souple de 256 Mio, pic de 64 Mio) pour protĂ©ger le pod. resource/redis_identityDĂ©finit k8s.cluster.nameetredis.instance.id, l'identitĂ© stable pour votre entitĂ© Redis. C'est requis ici car le RĂ©cepteur Prometheus ne fournit passerver.addressniserver.port.attributes/entity_tagsAjoute instrumentation.provider: opentelemetryĂ chaque mĂ©trique afin que vous puissiez limiter les requĂȘtes au chemin OpenTelemetry.metricstransformRenomme les mĂ©triques Prometheus de l'exportateur (par exemple, redis_uptime_in_seconds) avec les noms Redis de New Relic (redis.uptime) et ajoute l'Ă©tiquettestateaux mĂ©triques de processeur.cumulativetodeltaConvertit les compteurs cumulatifs â commandes, succĂšs dâespace clĂ©, Ă©victions, etc. â en valeurs delta afin que New Relic affiche correctement les taux. filter/cardinalitySupprime les points de donnĂ©es Ă forte cardinalitĂ© (Ă©tats du processeur autres que useretsys, et mĂ©triques par commande pour les commandes peu communes) afin de contrĂŽler les coĂ»ts d'ingestion.transform/metadata_nullifyEfface les descriptions et les unitĂ©s des mĂ©triques pour rĂ©duire la taille de la charge. batchRegroupe les points de donnĂ©es avant lâexportation (2 048 par lot, jusquâĂ 4 096) et les vide au moins toutes les 10 secondes pour rĂ©duire la surcharge du rĂ©seau. otlp_httpExporte les mĂ©triques traitĂ©es vers New Relic via OTLP avec la compression gzip, authentifiĂ©es avec votre clĂ© de licence.
Facultatif : activer le monitoring du Cluster Redis
Si votre Redis s'exĂ©cute en mode Cluster, dĂ©marrez redis_exporter avec l'indicateur --is-cluster pour collecter automatiquement les mĂ©triques d'Ă©tat du cluster Ă partir de tous les nĆuds :
$redis_exporter --redis.addr=redis://localhost:7000 --is-clusterLa configuration du RĂ©cepteur Prometheus ci-dessus renomme dĂ©jĂ les mĂ©triques du cluster (par exemple, redis_cluster_state â redis.cluster.state). Pour crĂ©er une entitĂ© de cluster distincte dans New Relic, ajoutez un attribut de ressource redis.cluster.name Ă un pipeline distinct qui nâinclut PAS redis.instance.id:
resource/cluster: attributes: - key: redis.cluster.name value: "my-redis-cluster" # Update with your cluster name action: upsertAjoutez un pipeline de cluster à votre section de service :
metrics/cluster: receivers: [prometheus] processors: [memory_limiter, resource/cluster, attributes/entity_tags, metricstransform, cumulativetodelta, filter/cardinality, transform/metadata_nullify, batch] exporters: [otlp_http]Important
LâentitĂ© de cluster nĂ©cessite que redis.cluster.name soit prĂ©sent ET que redis.instance.id soit absent. Si les deux sont dĂ©finis sur les mĂȘmes mĂ©triques, seule lâentitĂ© dâinstance sera créée. Utilisez des pipelines distincts pour les mĂ©triques dâinstance et de cluster.
Facultatif : collecter les logs Redis
Au-delĂ des mĂ©triques, le collecteur peut transfĂ©rer les logs de Redis Ă New Relic afin que vous puissiez corrĂ©ler les Ă©vĂ©nements de log â redĂ©marrages, Ă©vĂ©nements de persistance ou erreurs â avec les pics de mĂ©triques sur la mĂȘme entitĂ©. Pour les collecter, ajoutez le rĂ©cepteur file_log Ă votre ConfigMap et montez /var/log/pods dans le dĂ©ploiement.
Ajoutez à la section receivers de votre ConfigMap :
file_log/redis: include: - /var/log/pods/<namespace>_*redis*/*/*.log # Update <namespace> with your Redis namespace (e.g., default, production) start_at: end include_file_path: true operators: - type: regex_parser regex: '^\S+ stdout F \d+:[XCSM] \d+ \w+ \d+ \d+:\d+:\d+\.\d+ (?P<level>.) ' on_error: send resource: db.system: redisAjouter un Processeur resource/redis_logs :
resource/redis_logs: attributes: - key: redis.instance.id value: "my-cluster.default:6379" # Must match the value in resource/redis_identity action: upsert - key: instrumentation.provider value: "opentelemetry" action: upsertAjoutez un pipeline de logs Ă la section Service :
service: pipelines: metrics/redis: # ... existing metrics pipeline ... logs/redis: receivers: [file_log/redis] processors: [memory_limiter, resource/redis_logs, batch] exporters: [otlp_http]Ajoutez le montage de volume /var/log/pods à votre déploiement (voir l'étape pour déployer ci-dessous).
Déployer le collecteur
Créer otel-collector-deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: otel-collector-redis namespace: newrelicspec: replicas: 1 selector: matchLabels: app: otel-collector-redis template: metadata: labels: app: otel-collector-redis spec: containers: - name: otel-collector image: otel/opentelemetry-collector-contrib:latest args: ["--config=/etc/otel/config.yaml"] env: - name: NEW_RELIC_LICENSE_KEY valueFrom: secretKeyRef: name: newrelic-credentials key: NEW_RELIC_LICENSE_KEY - name: OTEL_EXPORTER_OTLP_ENDPOINT valueFrom: secretKeyRef: name: newrelic-credentials key: OTEL_EXPORTER_OTLP_ENDPOINT resources: limits: cpu: 500m memory: 512Mi requests: cpu: 100m memory: 128Mi volumeMounts: - name: config mountPath: /etc/otel # Uncomment if collecting logs: # - name: varlogpods # mountPath: /var/log/pods # readOnly: true livenessProbe: httpGet: path: / port: 13133 initialDelaySeconds: 15 readinessProbe: httpGet: path: / port: 13133 initialDelaySeconds: 5 volumes: - name: config configMap: name: otel-collector-redis-config # Uncomment if collecting logs: # - name: varlogpods # hostPath: # path: /var/log/pods$kubectl apply -f otel-collector-deployment.yamlConseil
Pour utiliser le collecteur NRDOT Ă la place, remplacez l'image par newrelic/nrdot-collector:latest.
Vérifier
Confirmez que le pod du collecteur est en cours d'exécution :
$kubectl get pods -n newrelic -l app=otel-collector-redisLe pod doit afficher Running avec tous les conteneurs prĂȘts. S'il s'agit de CrashLoopBackOff ou Error, vĂ©rifiez ses logs avec kubectl logs -n newrelic -l app=otel-collector-redis â les causes les plus courantes sont des erreurs YAML de ConfigMap ou un service redis_exporter inaccessible.
Confirmez ensuite que vos mĂ©triques parviennent Ă New Relic. Attendez environ une minute aprĂšs le dĂ©marrage du pod, puis exĂ©cutez cette requĂȘte dans le gĂ©nĂ©rateur de requĂȘtes:
SELECT count(*) FROM MetricWHERE metricName LIKE 'redis.%'AND instrumentation.provider = 'opentelemetry'AND k8s.cluster.name IS NOT NULLSINCE 5 minutes agoUn nombre non nul confirme que les métriques Redis circulent. S'il renvoie 0, consultez Dépanner Redis (OpenTelemetry).
Conseil
Corréler APM avec Redis: pour connecter votre application APM et votre instance Redis dans les cartes de service, incluez db.system="redis" et redis.instance.id comme attributs de ressource dans vos métriques APM. La valeur redis.instance.id doit correspondre à ce que vous avez configuré dans le collecteur. Cela permet une visibilité inter-services et un dépannage plus rapide au sein de New Relic.
Prochaines étapes
- Installation sur l'hĂŽte: monitorez Redis sur des machines virtuelles/bare metal
- Installation sur Docker: déployer avec Docker Compose
- Consultez vos données: Explorez les dashboards et les alertes
- Référence des métriques: Toutes les métriques disponibles
- Dépannage: problÚmes K8s courants