如果希望更有效地追踪Web应用和基础设施,OpenTelemetry或许正是所需的工具。使用现有的OpenTelemetry NGINX社区模块对NGINX服务器进行插桩后,可以收集指标、追踪和日志,更全面地了解服务器的运行状况,从而排查问题并优化Web应用,提升性能。不过,现有社区模块在追踪时会产生性能开销,也可能延长服务器响应时间。此过程还可能消耗额外资源,增加CPU和内存使用量。此外,该模块的设置和配置也较为繁琐。
NGINX近期开发了一个原生OpenTelemetry模块ngx_otel_module,为请求处理性能追踪带来了全新方式。该模块利用遥测调用来监控应用请求和响应,从而增强追踪能力。该模块可直接在NGINX配置文件中轻松设置和配置,使用十分便捷。这个新模块可满足NGINX OSS和NGINX Plus用户的需求。它支持W3C上下文传播和OTLP/gRPC导出协议,为性能优化提供全面的解决方案。
NGINX原生OpenTelemetry模块是一款动态模块,无需与NGINX Plus一起进行任何额外打包。它提供多项功能,包括API和键值存储模块。这些功能协同工作,为监控和优化NGINX Plus实例的性能提供完整的解决方案。通过使用ngx_otel_module,可以深入了解Web应用的性能,并采取措施加以改进。强烈建议探索ngx_otel_module,了解它如何帮助您取得更好的成效。
注意:可前往我们的GitHub页面,查看有关如何安装nginx_otel_module并开始使用的详细说明。
教程概述
本博客将分步介绍如何在NGINX Plus中配置OpenTelemetry,以及如何使用Jaeger工具收集并可视化跟踪数据。OpenTelemetry是一款功能强大的工具,可全面呈现请求的路径,包括延迟、请求详情和响应数据等重要信息。这对于优化性能和发现潜在问题非常有用。为简化操作,我们已将OpenTelemetry模块、应用和Jaeger全部部署在同一个实例中,具体如下图所示。
图 1:NGINX OpenTelemetry 架构概览
按照以下各节中的步骤完成本教程:
- 先决条件
- 部署NGINX Plus并安装OpenTelemetry模块
- 部署Jaeger和
echo应用 - 在NGINX中配置OpenTelemetry以进行跟踪
- 测试配置
先决条件
- Linux/Unix环境或任何兼容环境
- NGINX Plus订阅
- 基本熟悉Linux命令行和JavaScript
- Docker
- Node.js 19.x或更高版本
- Curl
部署NGINX Plus并安装OpenTelemetry模块
选择合适的环境对于成功部署NGINX实例至关重要。本教程将指导您部署NGINX Plus并安装NGINX动态模块。
- 安装NGINX Plus,使用受支持的操作系统。
- 安装
ngx_otel_module。将该动态模块添加到NGINX配置目录,以启用OpenTelemetry:
load_module modules/ngx_otel_module.so;
- 重新加载NGINX以启用该模块:
nginx -t && nginx -s reload
部署 Jaeger 和echo应用
可通过多种方式查看跟踪数据。本教程使用Jaeger收集和分析OpenTelemetry数据。Jaeger提供高效易用的界面,用于收集和可视化跟踪数据。数据收集完成后,将部署mendhak/http-https-echo,这是一个简单的Docker应用。该应用以JSON格式返回JavaScript请求的属性。
- 使用“
docker-compose”部署Jaeger和“http-echo”应用。复制以下配置并将其保存到所选目录,即可创建“docker-compose”文件。
version: '3'
Services:
jaeger:
image: jaegertracing/all-in-one:1.41
container_name: jaeger
ports:
- "16686:16686"
- "4317:4317"
- "4318:4318"
environment:
COLLECTOR_OTLP_ENABLED: true
http-echo:
image: mendhak/http-https-echo
environment:
- HTTP_PORT=8888
- HTTPS_PORT=9999
ports:
- "4500:8888"
- "8443:9999"- 要安装Jaeger一体化追踪和
http-echo应用,请运行以下命令:
'docker-compose up -d'
- 运行docker
ps -a命令,验证容器是否已安装。
$docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
5cb7763439f8 jaegertracing/all-in-one:1.41 "/go/bin/all-in-one-…" 30 hours ago Up 30 hours 5775/udp, 5778/tcp, 14250/tcp, 0.0.0.0:4317-4318->4317-4318/tcp, :::4317-4318->4317-4318/tcp, 0.0.0.0:16686->16686/tcp, :::16686->16686/tcp, 6831-6832/udp, 14268/tcp jaeger
e55d9c00a158 mendhak/http-https-echo "docker-entrypoint.s…" 11 days ago Up 30 hours 8080/tcp, 8443/tcp, 0.0.0.0:8080->8888/tcp, :::8080->8888/tcp, 0.0.0.0:8443->9999/tcp, :::8443->9999/tcp ubuntu-http-echo-1现在,只需在浏览器中输入http://localhost:16686端点,即可访问Jaeger。请注意,由于系统跟踪数据目前正发送到控制台,因此可能无法立即看到这些数据。不过不用担心!将跟踪数据以OpenTelemetry协议(OTLP)格式导出,即可快速解决此问题。下一节将介绍如何配置NGINX,以便将跟踪数据发送到Jaeger。
在NGINX中配置OpenTelemetry以进行追踪
本节将逐步介绍如何使用键值存储在NGINX Plus中设置OpenTelemetry指令。这项强大的配置可用于精确监控和分析流量,帮助优化应用性能。学完本节后,您将深入了解如何利用NGINX OpenTelemetry模块跟踪应用性能。
使用NGINX配置文件,可以轻松设置和配置遥测数据收集。借助ngx_otel_module,用户可以使用一款功能强大且可感知协议的跟踪工具,帮助快速发现并解决应用中的问题。该模块可有效扩展应用开发和管理工具集,并帮助提升应用性能。如需进一步了解如何配置其他OpenTelemetry示例,请参阅ngx_otel_module文档。
OpenTelemetry 指令和变量
NGINX新增了多项指令,可帮助您根据具体需求进一步优化OpenTelemetry部署。这些指令旨在提升应用性能和运行效率。
模块指令:
otel_exporter,用于设置OpenTelemetry数据的参数,包括endpoint、interval、batch size和batch count。这些参数对于成功导出数据至关重要,必须准确定义。otel_service_name,设置OpenTelemetry资源的服务名称属性,以便更好地组织和跟踪资源。otel_trace:现在可以通过指定变量来启用或禁用OpenTelemetry跟踪,从而更灵活地管理跟踪设置。otel_span_name:默认情况下,OpenTelemetry span 的名称会设置为请求的 location 名称。该名称可自定义,并可根据需要包含变量。
配置示例
以下示例展示了如何使用NGINX Plus键值存储在NGINX中配置OpenTelemetry。NGINX Plus键值存储模块支持动态配置OpenTelemetry span及其他OpenTelemetry属性,从而简化跟踪和调试流程。
以下示例展示了如何使用键值存储动态启用OpenTelemetry跟踪:
http {
keyval "otel.trace" $trace_switch zone=name;
server {
location / {
otel_trace $trace_switch;
otel_trace_context inject;
proxy_pass http://backend;
}
location /api {
api write=on;
}
}
}接下来,以下示例展示了如何使用键值存储动态禁用OpenTelemetry跟踪:
location /api {
api write=off;
} 以下是一个NGINX OpenTelemetry span属性配置示例:
user nginx;
worker_processes auto;
load_module modules/ngx_otel_module.so;
error_log /var/log/nginx debug;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
keyval "otel.span.attr" $trace_attr zone=demo;
keyval_zone zone=demo:64k state=/var/lib/nginx/state/demo.keyval;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
include mime.types;
default_type application/json;
upstream echo {
server localhost:4500;
zone echo 64k;
}
otel_service_name nginx;
otel_exporter {
endpoint localhost:4317;
}
server {
listen 4000;
otel_trace on;
otel_span_name otel;
location /city {
proxy_set_header "Connection" "" ;
proxy_set_header Host $host;
otel_span_attr demo $trace_attr;
otel_trace_context inject;
proxy_pass http://echo;
}
location /api {
api write=on;
}
location = /dashboard.html {
root /usr/share/nginx/html;
}
}
}要保存配置并重启NGINX,请输入以下代码:
nginx -s reload
最后,以下是在NGINX Plus API中添加span属性的方法:
curl -X POST -d '{"otel.span.attr": "<span attribute name>"}' http://localhost:4000/api/6/http/keyvals/<zone name>
测试配置
现在,可以按照以下步骤测试配置。
- 要生成跟踪数据,请先打开终端窗口。然后输入以下命令来创建数据:
$ curl -i localhost:4000/city输出将如下所示:
HTTP/1.1 200 OK
Server: nginx/1.25.3
Date: Wed, 29 Nov 2023 20:25:04 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 483
Connection: keep-alive
X-Powered-By: Express
ETag: W/"1e3-2FytbGLEVpb4LkS9Xt+KkoKVW2I"
{
"path": "/city",
"headers": {
"host": "localhost",
"connection": "close",
"user-agent": "curl/7.81.0",
"accept": "*/*",
"traceparent": "00-66ddaa021b1e36b938b0a05fc31cab4a-182d5a6805fef596-00"
},
"method": "GET",
"body": "",
"fresh": false,
"hostname": "localhost",
"ip": "::ffff:172.18.0.1",
"ips": [],
"protocol": "http",
"query": {},
"subdomains": [],
"xhr": false,
"os": {
"hostname": "e55d9c00a158"
},
"connection": {}- 现在,需要确保OTLP导出器正常运行,并且可以访问该跟踪。首先打开浏览器并访问Jaeger UI:
http://localhost:16686。页面加载后,单击标题栏中的“搜索”按钮。然后,从“服务”字段的下拉菜单中选择名称以“NGINX”开头的服务。接着,从“操作”下拉菜单中选择名为“Otel”的操作。为便于发现问题,单击“查找跟踪”按钮以可视化该跟踪。
图 2:Jaeger 仪表板
- 要查看特定跟踪的更详细、更全面的分析,请点击任一可用的单条跟踪。这有助于深入了解所选跟踪。在下方的跟踪中,可以查看OpenTelemetry指令的跨度属性以及跟踪中的非指令部分,从而更好地理解相关数据。
demo – OTel:OpenTelemetry跨度属性名称http.status_code字段:200,表示创建成功otel.library.name – nginx,OpenTelemetry服务名称
图3:OpenTelemetry跟踪的详细分析
在“标签”下,可以看到以下属性:
总结
NGINX现已内置支持OpenTelemetry,这一重要进展有助于在复杂的应用环境中跟踪请求和响应。此功能简化了相关流程并确保无缝集成,让开发人员能够更轻松地监控和优化应用。
尽管NGINX Plus R18中引入的OpenTracing模块现已弃用,并将从NGINX Plus R34开始移除,但在此之前的所有NGINX Plus版本中仍可使用该模块。不过,建议使用OpenTelemetry模块,该模块在NGINX Plus R29中引入。
如果您刚开始使用NGINX Plus,可以立即开始30天免费试用,也可以联系我们,讨论您的使用场景。
关于作者

相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。
