Monitoree su instancia de Redis autohospedada instalando el OpenTelemetry Collector directamente en un servidor o máquina virtual. Esta guía le muestra cómo configurar el recolector para extraer métricas de Redis, recopilar registros y enviar toda la telemetría a New Relic utilizando el protocolo OTLP.
Antes de que empieces
Necesitará lo siguiente antes de configurar el recolector:
- Tu New Relic
- Un host de Linux con privilegios de root o sudo
- Redis en ejecución y accesible — se recomienda la versión 6.0 o posterior (la 4.0 y posteriores funcionan con un conjunto de métricas reducido)
- Conectividad de red a tu extremo de Redis (predeterminado
localhost:6379) - HTTPS saliente (puerto 443) al extremo OTLPde New Relic
- Un OpenTelemetry Collector instalado en ese host —ya sea el recolector NRDOT o el OpenTelemetry Collector Contrib— que elija en Opciones de instalación
- Solo para la ruta del receptor de Prometheus, el redis_exporter que se ejecuta junto a Redis
Los pasos de configuración de cada ruta cubren cualquier instalación que aún necesite, ya sea el recolector de NRDOT, otelcol-contrib o el redis_exporter.
Opciones de instalación
Elija la distribución del recolector que coincida con su entorno:
Configurar el monitoreo de Redis
Esta configuración le indica al recolector cómo recopilar las métricas de Redis y enviarlas a New Relic. Se encarga de tres tareas principales:
Recopile métricas de Redis a través del receptor
redisDar forma a los datos — reducir la cardinalidad, convertir contadores en deltas y etiquetarlos para la síntesis de entidades
Exporte las métricas procesadas a New Relic a través de OTLP
Cree el archivo de configuración del recolector:
bash$sudo nano /etc/nrdot-collector/redis-collector-config.yamlPegue la siguiente configuración, actualizando el
endpointde Redis si no eslocalhost:6379:extensions:health_check:endpoint: "0.0.0.0:13133"receivers:redis:endpoint: "localhost:6379" # Update with your Redis host:portcollection_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: trueserver.port:enabled: trueprocessors:memory_limiter:check_interval: 5slimit_mib: 512spike_limit_mib: 128resource_detection:detectors: [env, system]timeout: 5soverride: falsesystem:resource_attributes:host.name:enabled: truehost.id:enabled: true# Uncomment the section below to use a custom human-readable name for your# Redis entity instead of the default server.address:server.port identifier.# resource/redis:# attributes:# - key: redis.instance.id# value: "my-redis-instance"# action: 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]pipelines:metrics/redis:receivers: [redis]# If using resource/redis for custom name, add it to the processors list:# processors: [memory_limiter, resource_detection, resource/redis, attributes/entity_tags, cumulativetodelta, filter/cardinality, transform/metadata_nullify, batch]processors: [memory_limiter, resource_detection, attributes/entity_tags, cumulativetodelta, filter/cardinality, transform/metadata_nullify, batch]exporters: [otlp_http]Qué hace esta configuración
Cada componente en la canalización tiene un trabajo específico:
Componente Descripción health_checkExpone un extremo de estado en 0.0.0.0:13133para que pueda confirmar que el recolector se está ejecutando.redisreceptorSe conecta a su extremo de Redis cada 10 segundos y lee las métricas del comando INFOde Redis.server.addressyserver.portse convierten en la identidad de la entidad.memory_limiterLimita el uso de memoria del recolector (límite flexible de 512 MiB, pico de 128 MiB) para proteger el host. resource_detectionDetecta el host y agrega host.nameyhost.id, vinculando las métricas de Redis a la entidad de host subyacente.attributes/entity_tagsMarca instrumentation.provider: opentelemetryen cada métrica para que pueda limitar las consultas a la ruta de OpenTelemetry.cumulativetodeltaConvierte los contadores acumulativos de Redis —comandos, aciertos de keyspace, desalojos, etc.— a valores delta para que New Relic grafique las tasas correctamente. filter/cardinalityDescarta los puntos de datos de alta cardinalidad (estados de CPU distintos de userysys, y métricas por comando para comandos poco comunes) para controlar el costo de ingesta.transform/metadata_nullifyBorra las descripciones y unidades de las métricas para reducir el tamaño de la carga. batchAgrupa los puntos de datos antes de la exportación (2048 por lote, hasta 4096) y los vacía al menos cada 10 segundos para reducir la sobrecarga de la red. otlp_httpExporta las métricas procesadas a New Relic a través de OTLP con compresión gzip, autenticadas con su clave de licencia. Sugerencia
¿Desea un nombre de entidad fácil de usar? De forma predeterminada, su entidad de Redis se nombra usando la combinación
server.address:server.port. Para usar un nombre personalizado legible por humanos en su lugar, descomente la secciónresource/redisen la configuración anterior, establezca su nombre preferido en el valorredis.instance.idy agregueresource/redisal pipeline de procesadores.
Opcional: configurar la autenticación
Por defecto, el recolector se conecta a Redis sin credenciales. Si su instancia de Redis requiere autenticación, agregue las credenciales correspondientes al receptor redis. Seleccione la opción que coincida con su configuración:
Opcional: recopilar logs de Redis
Más allá de las métricas, el recolector puede reenviar el archivo de log de Redis a New Relic para que pueda correlacionar los logs de eventos —reinicios, eventos de persistencia o errores— con los picos de métricas en la misma entidad. Agregue el receptor filelog para seguir el log de Redis:
receivers: # ... existing redis receiver ... file_log/redis: include: - /var/log/redis/redis-server.log start_at: end operators: - type: regex_parser regex: '^\d+:[XCSM] \d+ \w+ \d+ \d+:\d+:\d+\.\d+ (?P<level>.) ' on_error: send resource: db.system: redisLas líneas de registro del archivo no tienen contexto de conexión de Redis por sí solas —debe adjuntar explícitamente atributos de identidad para que New Relic asocie los registros con su entidad de Redis. Agregue un procesador resource/redis_logs con valores codificados que coincidan con la identidad de su entidad de Redis:
processors: # ... existing processors ... resource/redis_logs: attributes: - key: server.address value: "localhost" # Must match your redis receiver endpoint host action: upsert - key: server.port value: 6379 # Must match your redis receiver endpoint port action: upsert - key: instrumentation.provider value: opentelemetry action: upsertSugerencia
¿Usa un ID de la instancia personalizado? Si habilitó el procesador resource/redis para la asignación de nombres de entidades personalizadas, reemplace server.address y server.port anteriores con su redis.instance.id:
resource/redis_logs: attributes: - key: redis.instance.id value: "my-redis-instance" # Must match the value in resource/redis action: upsert - key: instrumentation.provider value: opentelemetry action: upsertAgregue un pipeline de logs separado a la sección de servicio:
service: pipelines: metrics/redis: receivers: [redis] processors: [memory_limiter, resource_detection, attributes/entity_tags, cumulativetodelta, filter/cardinality, transform/metadata_nullify, batch] exporters: [otlp_http] logs/redis: receivers: [file_log/redis] processors: [memory_limiter, resource/redis_logs, batch] exporters: [otlp_http]Importante
El recolector debe tener acceso de lectura tanto al archivo de log de Redis como a su directorio padre. Ejecutar:
$sudo chmod 755 /var/log/redis$sudo chmod 644 /var/log/redis/redis-server.logOpcional: recopilar métricas del host
El rendimiento de Redis a menudo refleja la presión de los recursos del host — saturación de CPU, agotamiento de memoria o contención de I/O del disco. Agregue el receptor hostmetrics para recopilar métricas del sistema del host junto con Redis, para que pueda correlacionar ambos en New Relic:
receivers: # ... existing receivers ... host_metrics: collection_interval: 10s scrapers: cpu: metrics: system.cpu.utilization: {enabled: true} system.cpu.time: {enabled: true} load: metrics: system.cpu.load_average.1m: {enabled: true} system.cpu.load_average.5m: {enabled: true} system.cpu.load_average.15m: {enabled: true} memory: metrics: system.memory.usage: {enabled: true} system.memory.utilization: {enabled: true} disk: metrics: system.disk.io: {enabled: true} system.disk.operations: {enabled: true} filesystem: metrics: system.filesystem.usage: {enabled: true} system.filesystem.utilization: {enabled: true} network: metrics: system.network.io: {enabled: true} system.network.packets: {enabled: true}Agregue una canalización de metrics/host separada para las métricas del host (no agregue hostmetrics a la canalización de Redis):
service: pipelines: metrics/redis: receivers: [redis] processors: [memory_limiter, resource_detection, attributes/entity_tags, cumulativetodelta, filter/cardinality, transform/metadata_nullify, batch] exporters: [otlp_http] metrics/host: receivers: [host_metrics] processors: [memory_limiter, resource_detection, attributes/entity_tags, cumulativetodelta, batch] exporters: [otlp_http]Opcional: agregar metadatos personalizados
Los atributos de recursos personalizados etiquetan cada métrica de Redis con contexto — entorno, equipo o nivel — para que pueda filtrar y agrupar sus datos en New Relic. Agregue un procesador resource/custom con las etiquetas que desee:
processors: # ... existing processors ... resource/custom: attributes: - key: environment value: "production" action: upsert - key: team value: "platform" action: upsert - key: redis.cluster value: "cache-tier-1" action: upsertIncluya el procesador en su pipeline:
service: pipelines: metrics/redis: receivers: [redis] processors: [memory_limiter, resource_detection, resource/custom, attributes/entity_tags, cumulativetodelta, filter/cardinality, transform/metadata_nullify, batch] exporters: [otlp_http]Opcional: habilitar el monitoreo de Redis Cluster
El monitoreo de Redis Cluster actualmente requiere el enfoque del receptor de Prometheus (usando redis_exporter). El receptor de Redis nativo del NRDOT Collector aún no es compatible con el comando CLUSTER INFO necesario para las métricas del clúster. Utilice la pestaña del receptor de Prometheus para la configuración del monitoreo del clúster.
Establecer variables de entorno
El recolector lee valores específicos del despliegue —su clave de licencia, extremo OTLP y ruta de configuración— de un archivo de entorno, lo que mantiene los secretos fuera del YAML de configuración. Cree el archivo de entorno:
$sudo tee /etc/nrdot-collector/nrdot-collector.conf > /dev/null <<'EOF'$NEW_RELIC_LICENSE_KEY=YOUR_LICENSE_KEY$OTEL_EXPORTER_OTLP_ENDPOINT=YOUR_OTLP_ENDPOINT$# Set the New Relic OTLP endpoint for your region.$# See https://docs.newrelic.com/docs/opentelemetry/best-practices/opentelemetry-otlp$OTELCOL_OPTIONS="--config=/etc/nrdot-collector/redis-collector-config.yaml"$EOF$sudo chmod 600 /etc/nrdot-collector/nrdot-collector.confReemplace los marcadores de posición con sus propios valores:
| Variable | Requerido | Descripción |
|---|---|---|
NEW_RELIC_LICENSE_KEY | Sí | Tu clave de licencia de ingesta de New Relic. |
OTEL_EXPORTER_OTLP_ENDPOINT | Sí | Extremo OTLP de New Relic para su región. Para obtener más información, consulte el extremo OTLP de New Relic. |
OTELCOL_OPTIONS | Sí | Apunta el recolector a su archivo de configuración de Redis. |
Sugerencia
Esta configuración reemplaza la configuración predeterminada de NRDot. Si necesita preservar los pipelines predeterminados de NRDot junto con el monitoreo de Redis, agregue también el archivo de configuración predeterminado:
$OTELCOL_OPTIONS="--config=/etc/nrdot-collector/config.yaml --config=/etc/nrdot-collector/redis-collector-config.yaml"Al usar múltiples archivos de configuración, asegúrese de que no haya nombres de componentes conflictivos entre ellos. Cambie el nombre de cualquier procesador duplicado en su configuración de Redis agregando un sufijo (por ejemplo, memory_limiter/redis en lugar de memory_limiter).
Reiniciar y verificar
Reinicie el recolector para cargar la nueva configuración:
$sudo systemctl daemon-reload$sudo systemctl restart nrdot-collector$sudo systemctl status nrdot-collectorEl comando status debería mostrar Active: active (running). Si muestra Active: failed, revise los registros con journalctl -u nrdot-collector -n 100 --no-pager — las causas más comunes son errores de sangría de YAML y un extremo de Redis inalcanzable.
Luego confirme que sus métricas están llegando a New Relic. Espere aproximadamente un minuto después del reinicio, luego ejecute esta consulta en el generador de consultas:
SELECT count(*) FROM Metric WHERE metricName LIKE 'redis.%' AND instrumentation.provider = 'opentelemetry' SINCE 5 minutes agoUn recuento distinto de cero confirma que las métricas de Redis están fluyendo. Si devuelve 0, consulte Solucionar problemas de Redis (OpenTelemetry).
Instalar el recolector
Instale el OpenTelemetry Collector Contrib si aún no está presente:
Después de la instalación, el recolector está disponible como un servicio de systemd llamado otelcol-contrib.service.
Configurar el monitoreo de Redis
Esta configuración le indica al recolector cómo recopilar las métricas de Redis y enviarlas a New Relic. Se encarga de tres tareas principales:
Recopile métricas de Redis a través del receptor
redisDar forma a los datos — reducir la cardinalidad, convertir contadores en deltas y etiquetarlos para la síntesis de entidades
Exporte las métricas procesadas a New Relic a través de OTLP
Cree el archivo de configuración del recolector:
bash$sudo nano /etc/otelcol-contrib/redis-collector-config.yamlPegue la siguiente configuración, actualizando el
endpointde Redis si no eslocalhost:6379:extensions:health_check:endpoint: "0.0.0.0:13133"receivers:redis:endpoint: "localhost:6379" # Update with your Redis host:portcollection_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: trueserver.port:enabled: trueprocessors:memory_limiter:check_interval: 5slimit_mib: 512spike_limit_mib: 128resource_detection:detectors: [env, system]timeout: 5soverride: falsesystem:resource_attributes:host.name:enabled: truehost.id:enabled: true# Uncomment the section below to use a custom human-readable name for your# Redis entity instead of the default server.address:server.port identifier.# resource/redis:# attributes:# - key: redis.instance.id# value: "my-redis-instance"# action: 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]pipelines:metrics/redis:receivers: [redis]# If using resource/redis for custom name, add it to the processors list:# processors: [memory_limiter, resource_detection, resource/redis, attributes/entity_tags, cumulativetodelta, filter/cardinality, transform/metadata_nullify, batch]processors: [memory_limiter, resource_detection, attributes/entity_tags, cumulativetodelta, filter/cardinality, transform/metadata_nullify, batch]exporters: [otlp_http]Qué hace esta configuración
Cada componente en la canalización tiene un trabajo específico:
Componente Descripción health_checkExpone un extremo de estado en 0.0.0.0:13133para que pueda confirmar que el recolector se está ejecutando.redisreceptorSe conecta a su extremo de Redis cada 10 segundos y lee las métricas del comando INFOde Redis.server.addressyserver.portse convierten en la identidad de la entidad.memory_limiterLimita el uso de memoria del recolector (límite flexible de 512 MiB, pico de 128 MiB) para proteger el host. resource_detectionDetecta el host y agrega host.nameyhost.id, vinculando las métricas de Redis a la entidad de host subyacente.attributes/entity_tagsMarca instrumentation.provider: opentelemetryen cada métrica para que pueda limitar las consultas a la ruta de OpenTelemetry.cumulativetodeltaConvierte los contadores acumulativos de Redis —comandos, aciertos de keyspace, desalojos, etc.— a valores delta para que New Relic grafique las tasas correctamente. filter/cardinalityDescarta los puntos de datos de alta cardinalidad (estados de CPU distintos de userysys, y métricas por comando para comandos poco comunes) para controlar el costo de ingesta.transform/metadata_nullifyBorra las descripciones y unidades de las métricas para reducir el tamaño de la carga. batchAgrupa los puntos de datos antes de la exportación (2048 por lote, hasta 4096) y los vacía al menos cada 10 segundos para reducir la sobrecarga de la red. otlp_httpExporta las métricas procesadas a New Relic a través de OTLP con compresión gzip, autenticadas con su clave de licencia. Sugerencia
¿Desea un nombre de entidad fácil de usar? De forma predeterminada, su entidad de Redis se nombra usando la combinación
server.address:server.port. Para usar un nombre personalizado legible por humanos en su lugar, descomente la secciónresource/redisen la configuración anterior, establezca su nombre preferido en el valorredis.instance.idy agregueresource/redisal pipeline de procesadores.
Opcional: configurar la autenticación
Por defecto, el recolector se conecta a Redis sin credenciales. Si su instancia de Redis requiere autenticación, agregue las credenciales correspondientes al receptor redis. Seleccione la opción que coincida con su configuración:
Opcional: recopilar logs de Redis
Más allá de las métricas, el recolector puede reenviar el archivo de log de Redis a New Relic para que pueda correlacionar los logs de eventos —reinicios, eventos de persistencia o errores— con los picos de métricas en la misma entidad. Agregue el receptor filelog para seguir el log de Redis:
receivers: # ... existing redis receiver ... file_log/redis: include: - /var/log/redis/redis-server.log start_at: end operators: - type: regex_parser regex: '^\d+:[XCSM] \d+ \w+ \d+ \d+:\d+:\d+\.\d+ (?P<level>.) ' on_error: send resource: db.system: redisLas líneas de registro del archivo no tienen contexto de conexión de Redis por sí solas —debe adjuntar explícitamente atributos de identidad para que New Relic asocie los registros con su entidad de Redis. Agregue un procesador resource/redis_logs con valores codificados que coincidan con la identidad de su entidad de Redis:
processors: # ... existing processors ... resource/redis_logs: attributes: - key: server.address value: "localhost" # Must match your redis receiver endpoint host action: upsert - key: server.port value: 6379 # Must match your redis receiver endpoint port action: upsert - key: instrumentation.provider value: opentelemetry action: upsertSugerencia
¿Usa un ID de la instancia personalizado? Si habilitó el procesador resource/redis para la asignación de nombres de entidades personalizadas, reemplace server.address y server.port anteriores con su redis.instance.id:
resource/redis_logs: attributes: - key: redis.instance.id value: "my-redis-instance" # Must match the value in resource/redis action: upsert - key: instrumentation.provider value: opentelemetry action: upsertAgregue un pipeline de logs separado a la sección de servicio:
service: pipelines: metrics/redis: receivers: [redis] processors: [memory_limiter, resource_detection, attributes/entity_tags, cumulativetodelta, filter/cardinality, transform/metadata_nullify, batch] exporters: [otlp_http] logs/redis: receivers: [file_log/redis] processors: [memory_limiter, resource/redis_logs, batch] exporters: [otlp_http]Importante
El recolector debe tener acceso de lectura tanto al archivo de log de Redis como a su directorio padre. Ejecutar:
$sudo chmod 755 /var/log/redis$sudo chmod 644 /var/log/redis/redis-server.logOpcional: recopilar métricas del host
El rendimiento de Redis a menudo refleja la presión de los recursos del host — saturación de CPU, agotamiento de memoria o contención de I/O del disco. Agregue el receptor hostmetrics para recopilar métricas del sistema del host junto con Redis, para que pueda correlacionar ambos en New Relic:
receivers: # ... existing receivers ... host_metrics: collection_interval: 10s scrapers: cpu: metrics: system.cpu.utilization: {enabled: true} system.cpu.time: {enabled: true} load: metrics: system.cpu.load_average.1m: {enabled: true} system.cpu.load_average.5m: {enabled: true} system.cpu.load_average.15m: {enabled: true} memory: metrics: system.memory.usage: {enabled: true} system.memory.utilization: {enabled: true} disk: metrics: system.disk.io: {enabled: true} system.disk.operations: {enabled: true} filesystem: metrics: system.filesystem.usage: {enabled: true} system.filesystem.utilization: {enabled: true} network: metrics: system.network.io: {enabled: true} system.network.packets: {enabled: true}Agregue una canalización de metrics/host separada para las métricas del host (no agregue host_metrics a la canalización de Redis):
service: pipelines: metrics/redis: receivers: [redis] processors: [memory_limiter, resource_detection, attributes/entity_tags, cumulativetodelta, filter/cardinality, transform/metadata_nullify, batch] exporters: [otlp_http] metrics/host: receivers: [host_metrics] processors: [memory_limiter, resource_detection, attributes/entity_tags, cumulativetodelta, batch] exporters: [otlp_http]Opcional: habilitar el monitoreo de Redis Cluster
El monitoreo de Redis Cluster actualmente requiere el enfoque del receptor de Prometheus (usando redis_exporter). El receptor nativo de Redis del Collector Contrib de OpenTelemetry aún no es compatible con el comando CLUSTER INFO necesario para las métricas del clúster. Use la pestaña del receptor de Prometheus para la configuración del monitoreo del clúster.
Establecer variables de entorno
El recolector lee valores específicos del despliegue —su clave de licencia, extremo OTLP y ruta de configuración— de un archivo de entorno, lo que mantiene los secretos fuera del YAML de configuración. Cree el archivo de entorno:
$sudo tee /etc/otelcol-contrib/otelcol-contrib.conf > /dev/null <<'EOF'$NEW_RELIC_LICENSE_KEY=YOUR_LICENSE_KEY$OTEL_EXPORTER_OTLP_ENDPOINT=YOUR_OTLP_ENDPOINT$# Set the New Relic OTLP endpoint for your region.$# See https://docs.newrelic.com/docs/opentelemetry/best-practices/opentelemetry-otlp$OTELCOL_OPTIONS="--config=/etc/otelcol-contrib/redis-collector-config.yaml"$EOF$sudo chmod 600 /etc/otelcol-contrib/otelcol-contrib.confReemplace los marcadores de posición con sus propios valores:
| Variable | Requerido | Descripción |
|---|---|---|
NEW_RELIC_LICENSE_KEY | Sí | Tu clave de licencia de ingesta de New Relic. |
OTEL_EXPORTER_OTLP_ENDPOINT | Sí | Extremo OTLP de New Relic para su región. Para obtener más información, consulte el extremo OTLP de New Relic. |
OTELCOL_OPTIONS | Sí | Apunta el recolector a su archivo de configuración de Redis. |
Sugerencia
Esta configuración reemplaza la configuración predeterminada de OTel Collector Contrib. Si necesita preservar la configuración predeterminada junto con el monitoreo de Redis, agregue también el archivo de configuración predeterminado:
$OTELCOL_OPTIONS="--config=/etc/otelcol-contrib/config.yaml --config=/etc/otelcol-contrib/redis-collector-config.yaml"Al usar múltiples archivos de configuración, asegúrese de que no haya nombres de componentes conflictivos entre ellos. Cambie el nombre de cualquier procesador duplicado en su configuración de Redis agregando un sufijo (por ejemplo, memory_limiter/redis en lugar de memory_limiter).
Reiniciar y verificar
Reinicie el recolector para cargar la nueva configuración:
$sudo systemctl daemon-reload$sudo systemctl restart otelcol-contrib$sudo systemctl status otelcol-contribEl comando status debería mostrar Active: active (running). Si muestra Active: failed, revise los registros con journalctl -u otelcol-contrib -n 100 --no-pager — las causas más comunes son errores de sangría de YAML y un extremo de Redis inalcanzable.
Luego confirme que sus métricas están llegando a New Relic. Espere aproximadamente un minuto después del reinicio, luego ejecute esta consulta en el generador de consultas:
SELECT count(*) FROM Metric WHERE metricName LIKE 'redis.%' AND instrumentation.provider = 'opentelemetry' SINCE 5 minutes agoUn recuento distinto de cero confirma que las métricas de Redis están fluyendo. Si devuelve 0, consulte Solucionar problemas de Redis (OpenTelemetry).
Instalar redis_exporter
El redis_exporter expone las métricas de Redis en formato Prometheus en el puerto 9121.
Crea un servicio de systemd para redis_exporter:
$sudo tee /etc/systemd/system/redis_exporter.service > /dev/null <<'EOF'$[Unit]$Description=Redis Exporter$After=network.target$
$[Service]$ExecStart=/usr/local/bin/redis_exporter --redis.addr=redis://localhost:6379$Restart=always$User=nobody$
$[Install]$WantedBy=multi-user.target$EOF$
$sudo systemctl daemon-reload$sudo systemctl enable --now redis_exporterVerifique que el exportador se esté ejecutando:
$curl -s http://localhost:9121/metrics | grep redis_upDebería ver redis_up 1.
Cree la configuración del recolector
Esta configuración extrae métricas de redis_exporter y las envía a New Relic. Se encarga de estos trabajos principales:
Extraer el extremo de Prometheus
redis_exportera través del receptorprometheusRenombre las métricas de Prometheus a los nombres de métricas de Redis de New Relic
Dar forma a los datos — reducir la cardinalidad, convertir contadores en deltas y etiquetarlos para la síntesis de entidades
Exporte las métricas procesadas a New Relic a través de OTLP
Cree el archivo de configuración. Use la ruta adecuada para su recolector:
NRDOT:
/etc/nrdot-collector/redis-prometheus-config.yamlOTel Contrib:
/etc/otelcol-contrib/redis-prometheus-config.yamlextensions:health_check:endpoint: "0.0.0.0:13133"receivers:prometheus:config:scrape_configs:- job_name: 'redis'scrape_interval: 10sstatic_configs:- targets: ['localhost:9121'] # Update with your Redis exporter host:portmetric_relabel_configs:- source_labels: [__name__]regex: '(go_|process_|promhttp_|redis_exporter_).*'action: dropprocessors:memory_limiter:check_interval: 5slimit_mib: 512spike_limit_mib: 128resource_detection:detectors: [env, system]timeout: 5soverride: falsesystem:resource_attributes:host.name:enabled: truehost.id:enabled: true# Required: Set a unique identifier for your Redis entity.# The Prometheus receiver does not provide server.address/server.port,# so redis.instance.id is required for entity creation in New Relic.resource/redis_identity:attributes:- key: redis.instance.idvalue: "my-redis-instance:6379" # Update with a unique name for this Redis instanceaction: 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_detection, resource/redis_identity, attributes/entity_tags, metricstransform, cumulativetodelta, filter/cardinality, transform/metadata_nullify, batch]exporters: [otlp_http]Qué hace esta configuración
Cada componente en la canalización tiene un trabajo específico:
Componente Descripción health_checkExpone un extremo de estado en 0.0.0.0:13133para que pueda confirmar que el recolector se está ejecutando.prometheusreceptorExtrae del extremo redis_exporter(por defectolocalhost:9121) cada 10 segundos y descarta las métricasgo_*,process_*,promhttp_*yredis_exporter_*propias del exportador.memory_limiterLimita el uso de memoria del recolector (límite flexible de 512 MiB, pico de 128 MiB) para proteger el host. resource_detectionDetecta el host y agrega host.nameyhost.id, vinculando las métricas de Redis a la entidad de host subyacente.resource/redis_identityEstablece redis.instance.id, que identifica la entidad de Redis en New Relic. Es necesario aquí porque el receptor de Prometheus no proporcionaserver.addressniserver.port.attributes/entity_tagsMarca instrumentation.provider: opentelemetryen cada métrica para que pueda limitar las consultas a la ruta de OpenTelemetry.metricstransformRenombra las métricas de Prometheus del exportador (por ejemplo, redis_uptime_in_seconds) a los nombres de Redis de New Relic (redis.uptime) y agrega la etiquetastatea las métricas de CPU.cumulativetodeltaConvierte los contadores acumulativos — comandos, aciertos de keyspace, desalojos, etc. — en valores delta para que New Relic grafique las tasas correctamente. filter/cardinalityDescarta los puntos de datos de alta cardinalidad (estados de CPU distintos de userysys, y métricas por comando para comandos poco comunes) para controlar el costo de ingesta.transform/metadata_nullifyBorra las descripciones y unidades de las métricas para reducir el tamaño de la carga. batchAgrupa los puntos de datos antes de la exportación (2048 por lote, hasta 4096) y los vacía al menos cada 10 segundos para reducir la sobrecarga de la red. otlp_httpExporta las métricas procesadas a New Relic a través de OTLP con compresión gzip, autenticadas con su clave de licencia. Importante
El procesador
resource/redis_identityconredis.instance.ides obligatorio para el enfoque del receptor de Prometheus. A diferencia del receptor de Redis nativo, el receptor de Prometheus no proporcionaserver.addressniserver.port— por lo queredis.instance.ides la única forma de identificar su entidad de Redis en New Relic. Establézcalo en un nombre único y descriptivo para cada instancia (por ejemplo,prod-redis-cache:6379).
Opcional: habilitar el monitoreo de Redis Cluster
Si su Redis se está ejecutando en modo Cluster, inicie redis_exporter con la bandera --is-cluster para recopilar automáticamente las métricas de estado del clúster de todos los nodos:
$redis_exporter --redis.addr=redis://localhost:7000 --is-clusterLa configuración del receptor de Prometheus anterior ya cambia el nombre de las métricas del clúster (por ejemplo, redis_cluster_state → redis.cluster.state). Para crear una entidad de clúster separada en New Relic, agregue un atributo de recurso redis.cluster.name a una canalización separada que NO incluya redis.instance.id:
resource/cluster: attributes: - key: redis.cluster.name value: "my-redis-cluster" # Update with your cluster name action: upsertAgregue una canalización de clúster a su sección de servicio:
metrics/cluster: receivers: [prometheus] processors: [memory_limiter, resource_detection, resource/cluster, attributes/entity_tags, metricstransform, cumulativetodelta, filter/cardinality, transform/metadata_nullify, batch] exporters: [otlp_http]Importante
La entidad de clúster requiere que redis.cluster.name esté presente Y que redis.instance.id esté ausente. Si ambos se establecen en las mismas métricas, solo se creará la entidad de instancia. Use canalizaciones separadas para las métricas de instancia y de clúster.
Opcional: recopilar logs de Redis
Más allá de las métricas, el recolector puede reenviar el archivo de log de Redis a New Relic para que pueda correlacionar los logs de eventos —reinicios, eventos de persistencia o errores— con los picos de métricas en la misma entidad. Agregue el receptor filelog para seguir el log de Redis:
receivers: # ... existing prometheus receiver ... file_log/redis: include: - /var/log/redis/redis-server.log start_at: end operators: - type: regex_parser regex: '^\d+:[XCSM] \d+ \w+ \d+ \d+:\d+:\d+\.\d+ (?P<level>.) ' on_error: send resource: db.system: redisLas líneas de registro del archivo no tienen contexto de conexión de Redis por sí solas —debe adjuntar explícitamente atributos de identidad para que New Relic asocie los registros con su entidad de Redis. Agregue un procesador resource/redis_logs con valores codificados que coincidan con la identidad de su entidad de Redis:
processors: # ... existing processors ... resource/redis_logs: attributes: - key: redis.instance.id value: "my-redis-instance:6379" # Must match the value in resource/redis_identity action: upsert - key: instrumentation.provider value: opentelemetry action: upsertAgregue un pipeline de logs separado a la sección de servicio:
service: pipelines: metrics/redis: receivers: [prometheus] processors: [memory_limiter, resource_detection, resource/redis_identity, attributes/entity_tags, metricstransform, cumulativetodelta, filter/cardinality, transform/metadata_nullify, batch] exporters: [otlp_http] logs/redis: receivers: [file_log/redis] processors: [memory_limiter, resource/redis_logs, batch] exporters: [otlp_http]Importante
El recolector debe tener acceso de lectura tanto al archivo de log de Redis como a su directorio padre. Ejecutar:
$sudo chmod 755 /var/log/redis$sudo chmod 644 /var/log/redis/redis-server.logOpcional: recopilar métricas del host
El rendimiento de Redis a menudo refleja la presión de los recursos del host — saturación de CPU, agotamiento de memoria o contención de I/O del disco. Agregue el receptor hostmetrics para recopilar métricas del sistema del host junto con Redis, para que pueda correlacionar ambos en New Relic:
receivers: # ... existing receivers ... host_metrics: collection_interval: 10s scrapers: cpu: metrics: system.cpu.utilization: {enabled: true} system.cpu.time: {enabled: true} load: metrics: system.cpu.load_average.1m: {enabled: true} system.cpu.load_average.5m: {enabled: true} system.cpu.load_average.15m: {enabled: true} memory: metrics: system.memory.usage: {enabled: true} system.memory.utilization: {enabled: true} disk: metrics: system.disk.io: {enabled: true} system.disk.operations: {enabled: true} filesystem: metrics: system.filesystem.usage: {enabled: true} system.filesystem.utilization: {enabled: true} network: metrics: system.network.io: {enabled: true} system.network.packets: {enabled: true}Agregue una canalización de metrics/host separada para las métricas del host (no agregue host_metrics a la canalización de Redis):
service: pipelines: metrics/redis: receivers: [prometheus] processors: [memory_limiter, resource_detection, resource/redis_identity, attributes/entity_tags, metricstransform, cumulativetodelta, filter/cardinality, transform/metadata_nullify, batch] exporters: [otlp_http] metrics/host: receivers: [host_metrics] processors: [memory_limiter, resource_detection, attributes/entity_tags, cumulativetodelta, batch] exporters: [otlp_http]Configurar variables de entorno y ruta de configuración
El recolector lee valores específicos del despliegue —su clave de licencia, extremo OTLP y ruta de configuración— de un archivo de entorno, lo que mantiene los secretos fuera del YAML de configuración. Configure estos para cualquier recolector que haya instalado:
| Variable | Requerido | Descripción |
|---|---|---|
NEW_RELIC_LICENSE_KEY | Sí | Tu clave de licencia de ingesta de New Relic. |
OTEL_EXPORTER_OTLP_ENDPOINT | Sí | Extremo OTLP de New Relic para su región. Para obtener más información, consulte el extremo OTLP de New Relic. |
OTELCOL_OPTIONS | Sí | Apunta el recolector a su archivo de configuración de Redis Prometheus. |
Para NRDOT:
$sudo tee /etc/nrdot-collector/nrdot-collector.conf > /dev/null <<'EOF'$NEW_RELIC_LICENSE_KEY=YOUR_LICENSE_KEY$OTEL_EXPORTER_OTLP_ENDPOINT=YOUR_OTLP_ENDPOINT$# Set the New Relic OTLP endpoint for your region.$# See https://docs.newrelic.com/docs/opentelemetry/best-practices/opentelemetry-otlp$OTELCOL_OPTIONS="--config=/etc/nrdot-collector/redis-prometheus-config.yaml"$EOF$sudo chmod 600 /etc/nrdot-collector/nrdot-collector.confSugerencia
Esta configuración reemplaza la configuración predeterminada de NRDot. Si necesita preservar los pipelines predeterminados de NRDot junto con el monitoreo de Redis, agregue también el archivo de configuración predeterminado:
$OTELCOL_OPTIONS="--config=/etc/nrdot-collector/config.yaml --config=/etc/nrdot-collector/redis-prometheus-config.yaml"Al usar múltiples archivos de configuración, asegúrese de que no haya nombres de componentes conflictivos entre ellos. Cambie el nombre de cualquier procesador duplicado en su configuración de Redis agregando un sufijo (por ejemplo, memory_limiter/redis en lugar de memory_limiter).
Para OTel Collector Contrib:
$sudo tee /etc/otelcol-contrib/otelcol-contrib.conf > /dev/null <<'EOF'$NEW_RELIC_LICENSE_KEY=YOUR_LICENSE_KEY$OTEL_EXPORTER_OTLP_ENDPOINT=YOUR_OTLP_ENDPOINT$# Set the New Relic OTLP endpoint for your region.$# See https://docs.newrelic.com/docs/opentelemetry/best-practices/opentelemetry-otlp$OTELCOL_OPTIONS="--config=/etc/otelcol-contrib/redis-prometheus-config.yaml"$EOF$sudo chmod 600 /etc/otelcol-contrib/otelcol-contrib.confReiniciar y verificar
Reinicie el recolector para cargar la nueva configuración.
Para NRDOT:
$sudo systemctl daemon-reload$sudo systemctl restart nrdot-collector$sudo systemctl status nrdot-collectorPara OTel Collector Contrib:
$sudo systemctl daemon-reload$sudo systemctl restart otelcol-contrib$sudo systemctl status otelcol-contribEl comando status debería mostrar Active: active (running). Si muestra Active: failed, revise los registros con journalctl -u nrdot-collector -n 100 --no-pager (o otelcol-contrib) — las causas más comunes son errores de indentación YAML, un redis_exporter inalcanzable o que el exportador no se esté ejecutando.
Luego confirme que sus métricas están llegando a New Relic. Espere aproximadamente un minuto después del reinicio, luego ejecute esta consulta en el generador de consultas:
SELECT count(*) FROM Metric WHERE metricName LIKE 'redis.%' AND instrumentation.provider = 'opentelemetry' SINCE 5 minutes agoUn recuento distinto de cero confirma que las métricas de Redis están fluyendo. Si devuelve 0, consulte Solucionar problemas de Redis (OpenTelemetry).
Sugerencia
Correlacione APM con Redis: para conectar su aplicación de APM y su instancia de Redis en los mapas de servicio, incluya db.system="redis" junto con el patrón de identificador de entidad elegido —ya sea redis.instance.id o server.address y server.port — como atributos de recursos en sus métricas de APM. Los valores deben coincidir con lo que configuró en el recolector. Esto permite la visibilidad entre servicios y una resolución de problemas más rápida dentro de New Relic.
Próximos pasos
- Instalación de Docker: desplegar con Docker Compose
- Instalación en Kubernetes: despliegue en Kubernetes con el patrón DaemonSet
- Ver sus datos: explore los dashboards y configure alertas
- Referencia de métricas: lista completa de métricas disponibles
- Resolución de problemas: problemas y soluciones comunes