OpenTelemetry 跟踪
预览状态
OpenTelemetry 跟踪自 n8n 2.19.0 起处于预览阶段,未来版本可能更改。请避免在生产工作流中依赖此功能。n8n 计划在后续版本中增加 OpenTelemetry 格式的指标。
n8n 可以为工作流和节点执行生成 OpenTelemetry 跟踪。使用这些跟踪,可以监控执行延迟、调试故障,并在可观测性系统中跨服务跟踪请求。
观看 n8n OpenTelemetry 跟踪概览:
可获得的内容
启用跟踪后,n8n 会为每次执行导出两类 span(跟踪片段):
workflow.execute:每次工作流执行生成一个 span,记录工作流 ID、名称、版本、项目、节点数量、执行模式、状态和错误类型。node.execute:每次节点执行生成一个 span,嵌套在所属工作流 span 中,记录节点 ID、名称、类型、版本、输入和输出条目数量,以及所属执行、工作流和项目。
n8n 在 span 结束时导出它。要在运行仍进行时查看,请启用开始 span。
每个 span 都包含用于标识 n8n 实例 的资源属性:
service.name,默认为n8n。service.version,即 n8n 版本。n8n.instance.idn8n.instance.role,例如main、worker或webhook。
n8n 也会处理跟踪上下文传播:
- 入站:如果 webhook 请求包含 W3C
traceparent标头,n8n 会将其作为工作流 span 的父级,将 n8n 工作流跟踪与上游调用方关联。 - 出站:HTTP Request 节点及其他使用 n8n HTTP 辅助方法的节点,可以在出站请求中注入
traceparent标头。支持 W3C 跟踪上下文的下游服务即可继续此跟踪。 - 子工作流:子工作流的 span 使用父工作流的 span 作为父级。
- 恢复的工作流:工作流从等待中恢复时,新的 span 通过 span link 关联到之前的 span。
在界面中启用跟踪
功能可用范围
自 n8n 2.27.0 起,可以在界面中配置 OpenTelemetry 跟踪。需要实例所有者或管理员身份。
可以在 Settings > OpenTelemetry(设置 > OpenTelemetry)中配置跟踪,无需设置环境变量。n8n 会直接应用更改,无需重启,并在队列模式下将配置重新加载到各工作进程和 webhook 处理器。
要配置跟踪:
- 选择 Settings > OpenTelemetry(设置 > OpenTelemetry)。
- 打开 Enable OpenTelemetry(启用 OpenTelemetry)。
- 在 Collector connection(收集器连接)下,填写 OTLP endpoint(OTLP 端点)和其他连接信息。
- 在 Tracing(跟踪)下设置采样和 span 选项。
- 选择 Save settings(保存设置)。
要检查 n8n 能否访问收集器,请在 Verify configuration(验证配置)下选择 Send test trace(发送测试跟踪)。n8n 会发送单个测试 span,并报告收集器是否接受。保存前后都可以测试。
每个字段都对应一个环境变量,字段提示中会显示该变量。完整列表请参阅 OpenTelemetry 环境变量。
环境变量优先
如果通过环境变量设置某个选项,n8n 会使用该值,并禁用界面中的对应字段。要从界面管理设置,请不要设置其环境变量。n8n 重启时,环境变量会覆盖界面保存的值。
通过环境变量启用跟踪
在每个需要启用工作流跟踪的 n8n 实例上设置以下环境变量,包括主实例、工作进程和 webhook 处理器:
export N8N_OTEL_ENABLED=true
export N8N_OTEL_EXPORTER_OTLP_ENDPOINT=http://<your-collector-host>:4318
重启 n8n。实例会使用 Protobuf 编码,通过 OTLP HTTP 导出 span。要改用 gRPC 导出,请参阅选择 OTLP 协议。
n8n 默认会在端点后追加 /v1/traces。请将 N8N_OTEL_EXPORTER_OTLP_ENDPOINT 指向收集器的基础 URL,而非跟踪路径。端点必须使用 http:// 或 https:// URL。如果使用其他协议或未指定协议,n8n 会记录警告并使用默认端点。
如果收集器需要身份验证,请将 N8N_OTEL_EXPORTER_OTLP_HEADERS 设为以逗号分隔的 key=value 键值对列表:
export N8N_OTEL_EXPORTER_OTLP_HEADERS="authorization=Bearer <your-token>,x-tenant=acme"
// For added protection - It is recommended to use the `_FILE` postfix if you are putting a token in here:
export N8N_OTEL_EXPORTER_OTLP_HEADERS_FILE=/mnt/otel-headers
完整的受支持变量列表,请参阅 OpenTelemetry 环境变量。
队列模式
在队列模式下,必须在所有实例上设置 OpenTelemetry 变量。跟踪上下文会在实例间传播。
选择 OTLP 协议
功能可用范围
自 n8n 2.39.0 起,提供 OTLP gRPC 协议、Protocol(协议)设置和 N8N_OTEL_EXPORTER_OTLP_PROTOCOL 环境变量。
n8n 可以通过两种 OTLP 传输方式导出跟踪:
http/protobuf,默认选项:通过 HTTP 传输 OTLP,使用 Protobuf 编码。收集器通常在端口 4318 监听。可通过不支持 HTTP/2 的代理、Ingress 和防火墙,调试也更简单。grpc:通过 gRPC 传输 OTLP。收集器通常在端口 4317 监听。HTTP/2 多路复用和二进制分帧降低了每次导出的开销,span 数量很大时差异最明显。此方式要求端到端支持 HTTP/2,部分代理和负载均衡器需要显式配置 HTTP/2。
除非收集器仅接受 gRPC,或你通过支持 HTTP/2 的基础设施导出大量跟踪,否则请保留默认的 http/protobuf。
要选择协议,请设置 Settings > OpenTelemetry(设置 > OpenTelemetry)中的 Protocol(协议)字段,或设置环境变量:
export N8N_OTEL_EXPORTER_OTLP_PROTOCOL=grpc
变量名及其值(http/protobuf 和 grpc)与上游 OTEL_EXPORTER_OTLP_PROTOCOL 规范一致。与 Settings > OpenTelemetry 中的其他字段一样,设置环境变量后,n8n 会禁用 Protocol 字段。
TLS
两种协议都通过端点 URL 的协议部分控制 TLS。https:// 启用 TLS,http:// 禁用 TLS。n8n 不接受 grpc:// 协议。
要信任自定义证书颁发机构,或提供客户端证书进行双向 TLS(mTLS),请使用上游 OpenTelemetry 变量 OTEL_EXPORTER_OTLP_CERTIFICATE、OTEL_EXPORTER_OTLP_CLIENT_KEY 和 OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE。对于 http/protobuf 协议,NODE_EXTRA_CA_CERTS 也有效。n8n 本身没有证书设置。
gRPC 行为
grpc 协议与 http/protobuf 有以下区别:
- **在端点中包含端口。**未显式指定端口的 gRPC 端点会连接到 gRPC 默认端口 443,而非 4317。请写为
http://<your-collector-host>:4317。 - **gRPC 端点不包含 URL 路径。**n8n 会忽略 Trace path(跟踪路径)设置(
N8N_OTEL_EXPORTER_OTLP_TRACING_PATH),并在界面中隐藏该行。n8n 保留已保存的值,切回http/protobuf时会重新应用。 - **自定义标头转换为 gRPC 元数据。**n8n 会将键转为小写。对于 gRPC 拒绝的条目,包括带
-bin后缀但值为文本的键,n8n 会跳过并记录警告,而不是导致启动失败。 - **启动连接检查会等待 gRPC 通道就绪。**通道就绪证明 n8n 能打开 TCP 连接、在
https://下完成 TLS 握手,并建立 HTTP/2 连接,但不能证明端点提供 OTLP。请使用 Settings > OpenTelemetry 中的 Send test trace(发送测试跟踪),确认收集器收到 span。此检查不会阻止启动。
采样
默认情况下,n8n 导出每条跟踪。要减少繁忙实例的数据量,请将 N8N_OTEL_TRACES_SAMPLE_RATE 设为 0 到 1 之间的值:
# Export 10% of traces <a href="#export-10percent-of-traces" id="export-10percent-of-traces"></a>
export N8N_OTEL_TRACES_SAMPLE_RATE=0.1
n8n 使用基于跟踪 ID 比例的采样器,因此同一跟踪 ID 下的所有 span 要么全部采样,要么全部丢弃。
n8n 默认仅为生产执行输出跟踪。要为所有工作流执行输出跟踪,请设置 N8N_OTEL_TRACES_PRODUCTION_ONLY=false。
减少 span 数量
工作流中的每个节点都会生成自己的 span,节点很多时,产生的数据可能超出需要。要仅导出工作流级 span,请设置:
export N8N_OTEL_TRACES_INCLUDE_NODE_SPANS=false
要停止 n8n 向出站 HTTP 请求注入 traceparent 标头,请设置:
export N8N_OTEL_TRACES_INJECT_OUTBOUND=false
开始 span
功能可用范围
自 n8n 2.44.0 起提供开始 span。
长时间运行的工作流或节点,在其 span 结束前不会显示在观测后端中。启用开始 span 后,n8n 还会在工作流或节点开始的瞬间发送一个 0 毫秒的子 span。开始 span 携带父 span 在该时刻的相同属性,让你立即知道哪些任务正在运行,以及所属工作流和项目。
| 开始 span | 父级 | 设置 | 环境变量 |
|---|---|---|---|
workflow.execute.started | workflow.execute | Send workflow start spans(发送工作流开始 span) | N8N_OTEL_TRACES_EMIT_WORKFLOW_START_SPAN |
node.execute.started | node.execute | Send node start spans(发送节点开始 span) | N8N_OTEL_TRACES_EMIT_NODE_START_SPAN |
两者默认均关闭。可以在 Settings > OpenTelemetry > Tracing(设置 > OpenTelemetry > 跟踪)下启用,或将环境变量设为 true。节点开始 span 还需要启用 Include node spans(包含节点 span,N8N_OTEL_TRACES_INCLUDE_NODE_SPANS)。队列模式下,请在主实例和每个工作进程上设置变量。
要使用公共 API,请调用 PUT /api/v1/settings/otel,传入 emitWorkflowStartSpan 和 emitNodeStartSpan,并使用具有 otel:manage 权限范围的 API 密钥。此调用会替换所有 OpenTelemetry 设置。缺少必填字段的请求体会被 n8n 拒绝。如果省略可选字段 exporterProtocol、emitWorkflowStartSpan 或 emitNodeStartSpan,n8n 会将其重置为默认值。
崩溃的执行
功能可用范围
自 n8n 2.42.0 起,崩溃的执行也会产生 span。
运行执行的 n8n 实例未记录结果就停止时,例如因内存不足被终止或容器被驱逐,执行即处于 crashed 状态。n8n 发现执行无法完成后,会将其标记为 crashed。在 n8n 2.42.0 之前,这些执行不产生 span,因此跟踪后端的错误率会漏掉所有这类平台故障。自 n8n 2.42.0 起,崩溃的执行会产生一个 workflow.execute span。
接收崩溃 span
span 由发现崩溃的实例发出,而非运行该执行的实例。在队列模式下,这是主实例,因此需要在主实例启用 OpenTelemetry,不能仅在工作进程启用。常 规模式下,单个主实例运行并检查自身执行,因此正常配置即可覆盖。
阅读崩溃 span
崩溃 span 携带通常的工作流 span 属性,并增加:
| 属性 | 值 |
|---|---|
n8n.execution.status | crashed |
n8n.execution.error_type | WorkflowCrashedError |
n8n.execution.crash.detector | 哪种检查发现了崩溃。参阅 n8n 如何检测崩溃。 |
n8n.execution.reconstructed | n8n 结束原 span 时为 false,重建 span 时为 true。参阅跟踪中的 span 与重建的 span。 |
span 状态为 error,并带有 exception 事件。
n8n 如何检测崩溃
| 检测器 | 含 义 |
|---|---|
stall | 队列模式下,工作进程停止续订其作业锁。 |
queue-recovery | 队列模式下,定期检查发现有正在运行的执行,但队列中不存在对应作业。 |
startup-recovery | n8n 重启后,发现执行仍标记为正在运行。 |
start-failure | 执行无法启动。 |
workflow-deactivation | 执行仍在进行时,有人取消发布了工作流。 |
跟踪中的 span 与重建的 span
启动执行的实例会打开其 workflow.execute span。如果同一实例检测到崩溃,就直接结束该 span,并设置 n8n.execution.reconstructed=false。span 保留启动时设置的全部属性。该实例上仍未结束的节点 span 会以 n8n.node.termination_reason=workflow_crashed 结束。
如果由其他实例检测到崩溃,例如主实例已重启,就不存在尚未结束的 span。n8n 会使用执行中存储的跟踪上下文,在同一跟踪中重建一个 workflow.execute span,并设置 n8n.execution.reconstructed=true。重建的 span 包含工作流 ID、工作流名称、工作流版本 ID、项目 ID、项目和工作流的自定义 span 属性、执行 ID、执行模式、n8n.execution.is_retry 和 n8n.execution.retry_of,但不包含:
n8n.workflow.node_count.- 自身的节点 span。崩溃前已导出的节点 span 仍保留在跟踪中,实例停止时正在运行的节点没有 span。
- 执行曾从等待中恢复时,指向之前 span 的 span link。
其工作流自定义属性来自工作流当前设置,而非实际运行的版本。
崩溃执行的注意事项
- **时长表示检测延迟,而非运行时间。**崩溃 span 在 n8n 检测到崩溃时结束,而非实例停止时。对于
stall,延迟为一至两分钟;对于queue-recovery,到下次定期检查时才发现;对于startup-recovery,到下次重启时才发现。延迟指标应排除带n8n.execution.status=crashed的 span,仅在错误率指标中计入它们。 - **重建的 span 会显示父级缺失。**存储的跟踪上下文是原 span 的 ID,而 OpenTelemetry 不能复用 span ID。重建的 span 成为从未结束的 span 的子级,因此 Jaeger 等后端会标记父级缺失。这是预期警告。
- **停滞队列作业的状态发生变化。**在 n8n 2.42.0 之前,工作进程停止的作业以
error结束;自 n8n 2.42.0 起,以crashed结束,检测器为stall。仅匹配n8n.execution.status=error的告警会漏掉这些情况。