Te ofrecemos esta traducción automática para facilitar la lectura.
En caso de que haya discrepancias entre la versión en inglés y la versión traducida, se entiende que prevalece la versión en inglés. Visita esta página para obtener más información.
NGINX 1.25.3 y versiones posteriores incluyen el ngx_otel_module, un módulo nativo de OpenTelemetry que agrega compatibilidad con el rastreo distribuido directamente en el servidor web.
Al combinar ngx_otel_module con aplicaciones instrumentadas, New Relic conecta las trazas de extremo a extremo y crea relaciones de servicio entre sus servicios y la entidad de NGINX. Estas relaciones aparecen en los mapas de servicio, lo que le brinda visibilidad de cómo fluye el tráfico a través de su servidor web o proxy inverso.
Cómo funciona
En una configuración típica, el tráfico fluye de la siguiente manera:
La aplicación cliente envía una solicitud con un encabezado traceparent de W3C.
El ngx_otel_module de NGINX extrae el contexto de traza, crea un span para la solicitud e inyecta el contexto de traza actualizado en la solicitud enviada por proxy al backend ascendente.
La aplicación del backend recibe la solicitud con el contexto de traza propagado y continúa la traza.
Todos los spans (del cliente, NGINX y el backend) se exportan a un OpenTelemetry Collector, que enriquece los spans de NGINX con la identidad de NGINX y los reenvía a New Relic.
New Relic utiliza estos spans conectados para crear relaciones CALLS:
Servicio del cliente LLAMA A entidad de NGINX
Entidad de NGINX CALLS servicio de backend
Debido a que el recolector estampa la misma identidad nginx.deployment.name y nginx.server.endpoint que usan las métricas de NGINX, los spans de NGINX se resuelven en la misma entidad NGINXSERVER que sus métricas de NGINX. Estas relaciones son visibles en los mapas de servicios y en la experiencia de mapas.
Compatibilidad
ngx_otel_module funciona con cualquier aplicación que admita la propagación del contexto de W3C Trace Context, lo que incluye:
Aplicaciones instrumentadas con OpenTelemetry SDK (cualquier lenguaje)
Instrumentación automática de OpenTelemetry (Java, .NET, Python, Node.js, Go)
Puede combinar enfoques de instrumentación. Por ejemplo, un cliente del SDK de OTel puede llamar a través de NGINX a un backend de agente APM de New Relic, y la cadena de relaciones aparece correctamente en New Relic.
OpenTelemetry Collector (NRDOT u OTel Collector Contrib) que se ejecuta en el mismo host o al que se puede acceder desde el host de NGINX
Aplicaciones instrumentadas que envían requests a través de NGINX, utilizando cualquiera de los enfoques de instrumentación compatibles enumerados anteriormente
Acceso de red desde el recolector al extremo OTLPde New Relic
Sugerencia
Esta guía configura tanto la recopilación de métricas como el rastreo distribuido en un solo OTel Collector. Para una configuración de solo métricas o un despliegue de Kubernetes, consulte Monitorear NGINX autohospedado y Monitorear NGINX en Kubernetes.
Configurar el rastreo distribuido
Sugerencia
El pipeline de trazas a continuación es la misma configuración estándar que usaría para cualquier servicio que participe en el rastreo distribuido. No es una configuración de relación manual. Una vez que el rastreo está activo, New Relic detecta automáticamente los spans conectados y crea relaciones de servicio.
Cargue el módulo y habilite el rastreo en su nginx.conf. Agregue la directiva load_module en el nivel superior (contexto principal) y las directivas de OpenTelemetry dentro del contexto http:
# Main context — load the dynamic module
load_module modules/ngx_otel_module.so;
http{
# Export spans to the OpenTelemetry Collector over OTLP/gRPC
otel_exporter{
endpoint localhost:4317;
}
# A name that identifies this NGINX instance in traces
otel_service_name nginx-server;
# Emit a span per request and propagate W3C trace context to upstreams
otel_traceon;
otel_trace_context propagate;
server{
listen80;
location /{
proxy_pass http://backend_app;
}
}
}
Esta configuración:
Carga el módulo de OpenTelemetry (load_module).
Exporta spans a través de OTLP/gRPC al recolector que escucha en localhost:4317 (otel_exporter).
Crea un span para cada solicitud (otel_trace on). Para trazar un subconjunto de tráfico en entornos de alto rendimiento, configure otel_trace en una variable (por ejemplo, controlada por split_clients) en lugar de on.
Propaga el contexto de traza (otel_trace_context propagate): esto extrae el encabezado traceparent entrante (vinculando los spans de NGINX al servicio de llamada) e inyecta el contexto actualizado en las requests enviadas a los upstreams (permitiendo que los servicios downstream continúen la traza).
Las directivas otel_trace on y otel_trace_context también se pueden configurar por bloque server o location si desea trazar solo hosts virtuales o rutas específicas.
Configure el OTel Collector para recibir trazas de ngx_otel_module y métricas del extremo de estado stub de NGINX, enriquecer ambas con la identidad de NGINX y enviarlas a New Relic.
receivers:
# Receives spans from ngx_otel_module (NGINX → localhost:4317)
otlp:
protocols:
grpc:
endpoint:"0.0.0.0:4317"
http:
endpoint:"0.0.0.0:4318"
# Collects NGINX metrics from the stub status endpoint
nginx:
endpoint: <YOUR_STUB_STATUS_ENDPOINT># e.g. http://127.0.0.1/status
collection_interval: 30s
processors:
resourcedetection:
detectors:[system]
system:
resource_attributes:
host.id:
enabled:true
# Adds the NGINX identity so spans and metrics resolve to the SAME NGINXSERVER entity
resource/nginx:
attributes:
-key: nginx.server.endpoint
value:"<YOUR_STUB_STATUS_ENDPOINT>"# must match the nginx receiver endpoint
action: upsert
-key: nginx.deployment.name
value:"<YOUR_DEPLOYMENT_NAME>"# a stable name for this NGINX deployment
action: upsert
# Sets nginx.display.name for the metrics pipeline
Esta configuración del recolector incluye dos pipelines:
Pipeline de trazas: recibe datos de traza de OTLP de ngx_otel_module y sus aplicaciones instrumentadas a través de gRPC (puerto 4317) o HTTP (puerto 4318). Este es el mismo pipeline de trazas estándar que usaría para cualquier servicio que envíe datos de OTLP a New Relic.
Pipeline de métricas: usa el nginxreceiver para recopilar métricas de rendimiento (conexiones, requests) del extremo de estado stub de NGINX. Estas métricas crean la entidad de NGINX en New Relic con métricas doradas.
Ambas canalizaciones comparten estos procesadores:
resourcedetection: agrega host.id, un atributo de recurso estándar que se usa para identificar hosts en todo el ecosistema de OpenTelemetry.
resource/nginx: agrega nginx.server.endpoint y nginx.deployment.name. Estos dos atributos forman la identidad de la entidad de NGINX. Al aplicarlos a ambos pipelines, los spans y las métricas de NGINX se resuelven en la misma entidad NGINXSERVER en lugar de en una entidad de servicio duplicada.
transform/nginx_*: agrega nginx.display.name para obtener un nombre de entidad amigable.
Importante
El valor de nginx.server.endpoint en resource/nginx y el endpoint del receptor nginx deben ser idénticos. Junto con nginx.deployment.name, forman la identidad de la entidad NGINXSERVER. Este es un valor estático y único por instancia de NGINX. Cuando agrega o elimina aplicaciones de cliente y de backend, no necesita cambiar la configuración del recolector. Las relaciones se forman automáticamente a través de la propagación del contexto de traza.
Establezca las variables de entorno requeridas e inicie (o reinicie) el recolector:
Pruebe la configuración y recargue NGINX para cargar el módulo de OpenTelemetry:
bash
$
sudo nginx -t
$
sudo systemctl reload nginx
Importante
La directiva load_module requiere que el archivo ngx_otel_module.so exista en la ruta indicada y coincida con su versión de NGINX. Si ve unknown directive "otel_exporter" o un error de carga del módulo, el módulo no está instalado o no está cargado. Instale el paquete nginx-module-otel para su versión de NGINX y confirme la ruta load_module.
Una vez que NGINX y el recolector estén en ejecución, genere algo de tráfico a través de sus aplicaciones instrumentadas. Después de unos minutos, verifique que los datos estén llegando a New Relic:
-- Verify NGINX trace spans
FROM Span SELECTcount(*)
WHERE nginx.deployment.name ='<YOUR_DEPLOYMENT_NAME>'
SINCE 10 minutes ago
-- Verify NGINX metrics
FROM Metric SELECTcount(*)
WHERE metricName LIKE'nginx.%'
SINCE 10 minutes ago
Una vez que los datos de traza fluyen, New Relic crea automáticamente relaciones CALLS entre sus servicios y la entidad de NGINX. Las relaciones pueden tardar hasta 10 minutos en aparecer.
WHERE source.entityName ='<YOUR_NGINX_DISPLAY_NAME>'
OR target.entityName ='<YOUR_NGINX_DISPLAY_NAME>'
SINCE 1day ago
Resolución de problemas
Verifique que NGINX se haya recargado sin errores: sudo nginx -t y sudo journalctl -u nginx -n 50 --no-pager
Confirme que ngx_otel_module esté cargado. Un error unknown directive "otel_exporter" significa que el módulo no está cargado. Verifique la ruta load_module y que nginx-module-otel esté instalado para su versión de NGINX.
Verifique que el OTel Collector se esté ejecutando y escuchando en el puerto en otel_exporter: sudo ss -tlnp | grep 4317
Verifique los logs del recolector en busca de errores: sudo journalctl -u nrdot-collector -n 50 --no-pager
Confirme que el extremo otel_exporter coincida con la dirección del listener de gRPC del recolector.
Espere hasta 10 minutos para que aparezcan las relaciones después de que lleguen los primeros spans.
Verifique que sus aplicaciones instrumentadas estén enviando trazas a través del recolector. Tanto los spans de NGINX como los spans de la aplicación deben llegar a New Relic para que se formen las relaciones.
Compruebe que las aplicaciones cliente propaguen los encabezados traceparent del W3C. Sin la propagación del contexto de traza, los spans de NGINX no están conectados al servicio de llamada.
Confirme que los procesadores resourcedetection y resource/nginx estén incluidos en el pipeline de trazas del recolector. Los atributos nginx.server.endpoint y nginx.deployment.name son necesarios para que los spans de NGINX se resuelvan en la entidad NGINXSERVER.
Confirme que otel_trace_context propagate esté configurado (no solo extract o inject). propagate es necesario para el flujo de contexto de extremo a extremo a través de NGINX.
Consulta para verificar que tanto los spans de NGINX como los de la aplicación compartan los ID de traza:
FROM Span SELECT uniques(service.name)
WHERE trace.id IN(
SELECT uniques(trace.id)FROM Span
WHERE nginx.deployment.name ='<YOUR_DEPLOYMENT_NAME>'
SINCE 10 minutes ago LIMIT5
)
SINCE 10 minutes ago
Debería ver su servicio NGINX junto a los nombres de los servicios de su aplicación.
Asegúrese de que el procesador resource/nginx se ejecute en el pipeline de trazas (no solo en el pipeline de métricas). Sin él, los spans de NGINX carecen de nginx.deployment.name / nginx.server.endpoint y se sintetizan como un servicio genérico en lugar de resolverse en la entidad NGINXSERVER.
Verifique que el valor nginx.server.endpoint sea idéntico en el receptor nginx y el procesador resource/nginx, y que nginx.deployment.name coincida con el valor utilizado por sus métricas de NGINX. La identidad de la entidad es la composición de estos dos valores. Una discrepancia produce una entidad diferente.
Ejecute también el pipeline de métricas. Las métricas doradas de la entidad NGINXSERVER provienen del nginxreceiver; sin esto, NGINX sigue apareciendo a través de trazas, pero sin métricas.
Cada aplicación instrumentada debe enviar trazas a través del mismo OTel Collector (o directamente a New Relic) para que los datos de los spans de todos los servicios lleguen a la misma cuenta.
Para las aplicaciones que utilizan agentes APM de New Relic, verifique que el rastreo distribuido esté habilitado y que el agente esté conectado.
Para las aplicaciones del SDK de OTel, verifique que el exportador OTLP esté configurado para enviar al recolector.
Espere un tiempo adicional. Las relaciones de los servicios con menor volumen de tráfico pueden tardar más en aparecer.
Próximos pasos
Mapas de servicios: aprenda a explorar las relaciones de las entidades visualmente