`ngx_otel_module` NGINX OpenTelemetry 分布式追踪实战

1. 模块简介

ngx_otel_module 为 NGINX(开源版 1.25.3+,商业版 1.23.4+)提供了 OpenTelemetry(OTel)分布式追踪支持,能够:

  • 自动采集 HTTP 请求的生命周期 Span
  • 上下文传播:兼容 W3C traceparent / tracestate
  • OTLP/gRPC 导出:将 Span 批量上传到 OTel Collector 或云端后端

模块的源码和安装说明见官方仓库(GitHub: nginx-module-otel)。

2. 安装与加载

2.1 开源版预构建包

# Debian/Ubuntu
apt-get install nginx-module-otel
# 或者在源码编译时
./configure \--add-dynamic-module=path/to/ngx_otel_module \[其他选项…]
make && make install

2.2 商业版(NGINX Plus)

# 已包含 MODULE
# 只需在 nginx.conf 中 load_module 即可
load_module modules/ngx_otel_module.so;

3. 核心指令详解

全部指令 仅在 http(或 serverlocation)上下文有效。

3.1 OTel 导出器配置

http {otel_exporter {endpoint    localhost:4317;            # OTLP/gRPC 端点trusted_certificate /etc/ssl/ca.pem;   # TLS 验证 CAheader      "X-API-Token" "token";     # 自定义请求头interval    5s;                        # 最大发送间隔(默认 5s)batch_size  512;                       # 最大 Span 批量大小batch_count 4;                         # 最大并发批次数}
}
  • TLS 支持(http|https):// + trusted_certificate
  • 请求头:用于上传鉴权
  • 批量控制:调节吞吐与资源消耗平衡

3.2 服务与资源属性

http {otel_service_name my-nginx-service;      # resource.service.nameotel_resource_attr deployment "blue";    # 自定义 resource 属性
}
  • otel_service_name:设置 service.name(默认 unknown_service:nginx
  • otel_resource_attr:任意 key/value,标注部署信息、环境等

3.3 启用追踪与上下文传播

server {listen 8080;otel_trace         on;                   # 开启追踪otel_trace_context inject;               # 强制注入/覆盖 traceparentproxy_pass http://backend;
}
  • otel_trace:可用变量控制,如基于 split_clients 动态采样

  • otel_trace_context

    • extract:仅提取外部上下文
    • inject:强制为下游请求注入新的或覆盖已有上下文
    • propagate:提取并更新
    • ignore:不处理

3.4 自定义 Span 名称与属性

location /api/ {otel_span_name "API $uri";              # 自定义 Span 名称otel_span_attr user_id   $cookie_uid;    # 添加自定义 Span 属性otel_span_attr  debug    "true";
}
  • 默认 Span 名称为 NGINX location
  • 支持变量,结合自定义逻辑埋点

4. 默认 Span 属性 & 内置变量

模块自动为每个 HTTP 请求 Span 设置一系列标准属性:

http.method
http.target
http.route
http.scheme
http.flavor
http.user_agent
http.request_content_length
http.response_content_length
http.status_code
net.host.name
net.host.port
net.sock.peer.addr
net.sock.peer.port

同时提供以下内置变量,可用于自定义属性或采样逻辑:

变量含义
$otel_trace_idTrace 标识符,如 56552bc4daa3bf39...
$otel_span_id当前 Span ID,如 4c0b8531ec38ca59
$otel_parent_id父 Span ID
$otel_parent_sampled父 Span 的 Sampled 标志(10

5. 动态采样示例

结合 split_clients 模块,实现比例采样:

# 按 trace_id 哈希 10% 流量采样
split_clients "$otel_trace_id" $ratio_sampler {10% on;*   off;
}server {otel_trace         $ratio_sampler;     # 动态开关otel_trace_context propagate;proxy_pass http://backend;
}

6. 性能与最佳实践

  1. 批量与间隔

    • batch_sizeinterval 配合,需根据流量规模和后端吞吐调优。
  2. 上下文传播模式

    • inject 覆盖性最强,适用于关闭无痕迹客户端;
    • extract 用于被动接入已有追踪链;
  3. 自定义资源属性

    • 在多租户或多环境部署中,务必设置 otel_resource_attr 标注环境或版本。
  4. 监控 OTel Agent

    • 定期检查 Collector 或后端的遥测接收指标,避免上报端点故障导致数据丢失。

7. 总结

ngx_otel_module 通过零侵入的方式,将 OpenTelemetry 分布式追踪能力无缝集成到 NGINX 中。

  • 自动化 Span:从入口到代理,全链路捕获 HTTP 请求细节。
  • 灵活控制:支持自定义 Span 名称、属性、采样策略。
  • 标准导出:兼容 OTLP/gRPC,方便对接主流监控与 APM 工具。

立即启用:在你的 NGINX 配置中引入 ngx_otel_module,让你的服务从“黑盒”变“白盒”,为性能调优和故障分析提供可靠的追踪数据!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87351.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue+TypeScript 枚举(Enum)的使用规范

在 TypeScript 中,枚举(Enum)的命名应遵循以下规范,这些规范结合了 TypeScript 官方建议和行业最佳实践: 枚举命名规范(TypeScript/Vue 项目) 基本命名规则: 使用 PascalCase&#…

一个完整的LSTM风光发电预测与并网优化方案,包含数据处理、模型构建、训练优化、预测应用及系统集成实现细节

以下是一个完整的LSTM风光发电预测与并网优化方案,包含数据处理、模型构建、训练优化、预测应用及系统集成实现细节: 风光发电功率预测与并网优化系统 基于LSTM的时间序列预测与储能协同控制 第一部分:系统架构设计(1200字) 1.1 整体技术路线 #mermaid-svg-U5pxzefmzZ4s…

如何在 MX Linux 上安装 Mint 的 Cinnamon 桌面 UI

如何在 MX Linux 上安装 Mint 的 Cinnamon 桌面 UI 你是否想在 MX Linux 上安装流行的 Linux Mint Cinnamon 图形用户界面?那么这里有一个教程…… Cinnamon 是一个类似 Windows 7 的界面,它默认安装在 Linux Mint 操作系统中。它使 Mint 非常易于理解和使用,这也是 Mint …

OpenStack 入门

目录 简介 一、云计算与 OpenStack 基础概念 1.1 云计算概述 1.2 OpenStack 简介 二、OpenStack 单机环境部署 2.1 环境准备 2.2 部署前准备工作 2.3 在线部署 OpenStack(Train 版本) 三、通过 Dashboard 部署 OpenStack 的功能 3.1 登录 Dash…

【Git】关于项目开发分支的使用规范

背景 在项目开发过程中,往往一个优秀的产品都会出现不断的版本迭代,我时常在项目发布后对于如何结合后续更新的业务场景在分支上的应用没有一个很好的办法,一直也比较苦恼。目前项目的迭代场景如下,一个A项目,经过需求…

msquic的windows版本编译

首先确保安装cmake和powershell(需要6以上,本人升级到了7.5),vs(本人用的vs2022) powershell,默认是5,会编译不成功,所以附带一个升级的流程 $PSVersionTable.PSVersion …

批量文件重命名工具 OncePower ,永久免费!

软件介绍 适用于Windows OncePower是一款Windows批量重命名工具,支持基本及高级匹配重命名,无需复杂正则。特色包括匹配修改、长度截取、日期命名、前缀后缀修改及TXT文件导入。支持保留特定内容、批量移动文件和删除空文件夹。可保存设置,…

Python入门Day6.1:异常处理

一、什么是异常(Exception)? 异常是指程序运行过程中出现的错误情况。比如: 打开一个不存在的文件0作为除数列表索引越界类型转换失败 二、基本结构:try...except try:# 可能出错的代码 except 错误类型:# 出错时执…

C++中的标准模板(STL)

C中的核心标准模板包含:容器、迭代器、算法、函数对象、适配器。 1.容器 容器提供了各种数据结构,包括向量(vector)、链表(list)、队列(queue)、栈(stack)、集合(set)、映射(map)等,可以根据实际需求选择合适的容器。 容器分为三大类&…

excel 待办日历软件(需要宏)特别推荐

Excel待办日历软件是一款基于Excel表格的日程管理工具,能够帮助用户更高效地管理待办事项和日程安排。用户可以在软件中创建不同的任务列表,以便更好地进行管理和跟踪。软件还提供了日历视图,用户可以直观地查看和安排每日的任务,…

激活函数-sigmoid、tanh、relu、softmax对比

激活函数是神经网络的核心组件,用于引入非线性特性,使网络能够学习复杂模式。以下从定义、作用、分类及应用场景进行详细解析: 🔍 ​​一、定义​​ 激活函数(Activation Function)是作用于神经元输出的​…

三步走实现嵌入式硬件与软件开发

目录 ✅ 一、嵌入式硬件与软件的边界(为你后面每阶段安排任务打基础) ✅ 二、三阶段开发策略规划(以你的三步走为主线) 📍阶段1:确定能做 → 外包技术顾问协助选型 + 需求拆解 + 采购建议 适用角色 关键目标 如何管理? 工具推荐 📍阶段2:会做一些 → 小范围…

ubuntu运行cursor

一.CURSOR官网下载AppImage文件 https://www.cursor.com/en/download 二、解压 AppImage 绕过挂载机制 解决:默认使用Cursor.AppImage 会自动挂载临时目录在/tmp目录下,出现没有权限挂载的报错问题 若挂载点仍不可写,直接解压 AppImage 运…

PTA天梯赛L1 071-080题目解析

目录 1.L1-071 前世档案 2.L1-072 刮刮彩票 3.L1-073 人与神 4.L1-074 两小时学完C语言 5.L1-075 强迫症 6.L1-076 降价提醒机器人 7.L1-077 大笨钟的心情 8.L1-078 吉老师的回归 9.L1-079 天梯赛的善良 10.L1-080 乘法口诀数列 1.L1-071 前世档案 解析:…

git常用操作 --- idea编译器 --- 公司实战版

前言 虽然git的命令方式很灵活,但是还是不够人性化,不够方便。 如果对git操作不熟练特别容易犯迷,可能敲一会命令就不知道当前在干什么了,下一步要干什么。 下面,我将演示在Java开发中使用最常用最经典的idea编译器来进行git操作,非常人性化和方便。 如果没有安装git和初始…

window显示驱动开发—流输出阶段

流输出 (SO) 阶段可以在这些顶点到达光栅器之前将顶点流式传输到内存。 流输出的运行方式类似于管道中的点击。 即使数据继续向下流向光栅器,也可以打开此点击。 通过流输出发送的数据连接到缓冲区。 这些缓冲区可以在后续传递上作为管道输入进行循环。 流输出的一…

备份docker desktop中的opengauss数据库

文章目录 备份docker desktop中的opengauss数据库一、前提条件二、备份步骤三、注意事项四、自动化备份(可选)五、验证备份 备份docker desktop中的opengauss数据库 ​ 以下是在 Docker Desktop 中备份 OpenGauss 数据库(以你的环境为例&…

实时中值滤波 + 低通滤波 示例程序(STM32环境)

一、功能概述 本示例实现两个滤波器: 中值滤波器(Median Filter):对短期异常值(如尖峰噪声)有良好的抑制能力;低通滤波器(Low-Pass Filter):对数据进行平滑…

AtCoder Beginner Contest 409 题解

本文为AtCoder Beginner Contest 409 的详细题解 目录 题目A: 题目大意: 解题思路: 代码(C): 题目B: 题目大意: 解题思路: 代码(C): 题目C: 题目大意: 解题思路: 代码(C): 题目D: 题目大意: 解题思路: 代码(C): 题目E: 题目大意: 解题思路: 代码(C): 题目A…

Spring @Environment 典型用法

简单说:Spring 里没有直接叫 Environment 的注解,更准确说常用的是 Autowired 注入 Environment 对象,或者结合 Value 配合 Environment 读取配置 。 支持从以下来源读取: 1、application.properties / .yaml 2、JVM 参数&#xf…