Vector datadog_agent 源组件:接收 Datadog Agent 的日志、指标与追踪数据
2026/9/13 4:48:35 网站建设 项目流程

Vector datadog_agent 源组件:接收 Datadog Agent 的日志、指标与追踪数据

【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector

本文以 Vector 的datadog_agent源组件文档为主体,完整覆盖其配置参数、Datadog Agent 侧的接入方法、HTTP 端点与事件字段语义、超时处理机制等核心内容,并结合当前仓库中src/sources/datadog_agent/的源码实现,说明日志/指标/追踪的解码链路、API Key 提取逻辑与内部指标来源,帮助你在现有 Datadog Agent 采集体系下,把观测数据改道或分流进 Vector 管道。

组件概览

datadog_agent源通过 HTTP/HTTPS 接收由 Datadog Agent 采集的观测数据,可同时承载三类(外加 LLM Observability)事件流:

  • 日志(logs):JSON 编码的日志批次,接收来自/v1/input/(旧路径)与/api/v2/logs/(新路径)的 POST 请求;
  • 指标(metrics):支持/api/v1/series/api/v2/series(v2 为 Protobuf 编码)与/api/beta/sketches(DDSketch 分布直方图)三类端点;
  • 追踪(traces):接收/api/v0.2/traces的 Protobuf 追踪负载;
  • LLM Observability(llmobs):接收/api/v2/llmobsevp_proxy代理路径下的 LLM 观测事件。

以上端点划分可直接在 源码 的build_warp_filters及四个子模块 logs.rs、metrics.rs、traces.rs、llmobs.rs 中确认。

组件的关键属性(来自生成文档所用的 CUE 数据 website/cue/reference/components/sources/datadog_agent.cue):

属性说明
开发状态stable稳定组件
投递语义at_least_once至少一次投递
出口方式batch以批为单位向下游发送
部署角色aggregator, sidecar适合作为聚合器或 sidecar 部署
默认监听端口8080见配置示例
传输协议HTTP支持可选 TLS
分帧(framing)默认bytes按 HTTP body 整体解码
多行支持不支持multiline 未启用
端到端确认支持acknowledgements 可用

配置参数详解

该组件的完整配置定义由 src/sources/datadog_agent/mod.rs 中的DatadogAgentConfig结构体描述,参数元数据同时收录在 website/cue/reference/components/sources/generated/datadog_agent.cue。逐项说明如下:

参数类型默认值说明
addressstring必填监听的 socket 地址,必须包含端口,如0.0.0.0:80localhost:80
tlsobject配置入站连接的 TLS 选项(TlsEnableableConfig),不启用则使用纯 HTTP
store_api_keybooltrue当事件携带 Datadog API key 时,将其存入事件元数据;若事件随后发往 Datadog sink,该 key 会被复用
disable_logsboolfalse设为true时不再接收日志
disable_metricsboolfalse设为true时不再接收指标
disable_tracesboolfalse设为true时不再接收追踪
disable_llmobsboolfalse设为true时不再接收 LLM Observability 事件
multiple_outputsboolfalse设为true时,日志/指标/追踪(及 llmobs)分别写入不同输出端口
parse_ddtagsboolfalse设为true时,日志事件中的ddtags字符串(逗号分隔的 key:value 标签列表)会被解析展开为数组
split_metric_namespacebooltrue设为true时,指标名在第一个.处切分为 namespace 与 name,如system.cpu.usage→ namespacesystem+ namecpu.usage;若下游 sink 使用默认 namespace,可设为false保留完整指标名
send_timeout_secsfloat向下游发送事件的超时时间(秒),超时后以 HTTP 503 响应,详见下文“请求超时处理”
framingobjectbytesHTTP body 的分帧配置
decodingobject原始字节的解码配置;部分解码器还能决定事件输出类型(log/metric/trace)
keepaliveobject默认HTTP 服务 keepalive 参数(TCP keepalive、max_connection_age_secs等)
acknowledgementsbool已废弃。源级开关对确认行为没有效果,请在全局配置或 sink 级启用确认

注意:disable_logsdisable_metricsdisable_tracesdisable_llmobs不能同时全为true,源码中会直接报错 "At least one of the supported data type shall be enabled"(见 mod.rs 的build_warp_filters)。

配置示例

sources: dd_agent: type: datadog_agent address: 0.0.0.0:9000 # 必须包含端口,Datadog Agent 将向此地址发数据 tls: # 可选:启用后 Datadog Agent 需使用 https URL enabled: true cert_file: /path/to/cert.pem key_file: /path/to/key.pem multiple_outputs: true # 日志/指标/追踪/llmobs 分端口输出 parse_ddtags: true # 将 ddtags 字符串展开为数组 split_metric_namespace: true # 指标名按第一个 '.' 拆分为 namespace/name store_api_key: true # 提取 Datadog API key 供下游 Datadog sink 复用 send_timeout_secs: 8 # 建议小于 Agent 侧超时(默认 10 秒)

启用multiple_outputs后,若源组件名为dd_agent,下游可通过dd_agent.logsdd_agent.metricsdd_agent.tracesdd_agent.llmobs分别引用对应输出流(CUE 数据中 outputs 一节完整定义了这四个端口及默认输出端口的语义)。

配置 Datadog Agent

向该源发送日志或指标要求 Datadog Agentv7.35 / 6.35 或更高版本;如果你的 Datadog Agent 默认压缩模式为zstd,还需要 Vector0.40.2 或更高版本

发送日志,在 Datadog Agent 配置中加入:

vector: logs.enabled: true logs.url: http://"<VECTOR_HOST>:<SOURCE_PORT>" # Vector 源启用 SSL 时改为 https

发送指标:

vector: metrics.enabled: true metrics.url: http://"<VECTOR_HOST>:<SOURCE_PORT>" # Vector 源启用 SSL 时改为 https

发送追踪:

vector: traces.enabled: true traces.url: http://"<VECTOR_HOST>:<SOURCE_PORT>" # Vector 源启用 SSL 时改为 https

压缩编码与空载荷处理

从源码 mod.rs 的decode方法看,Vector 会按content-encoding头从右向左依次解码identitygzip/x-gzipzstddeflate/x-deflate编码,遇到不支持的编码返回 415 Unsupported Media Type。源码注释明确指出所有解压都经过CappedDecoder限制解压后大小上限,目的是防止在这个无认证 HTTP 监听器上利用压缩炸弹造成无限制内存分配。

另外,Datadog Agent 会以空载荷(或logs场景下的{})作为 keep alive 心跳,logs.rs 与 metrics.rs 均显式忽略空 body 并直接返回成功,不会报错。

日志事件字段

日志请求体是一个 JSON 数组,每个元素由 mod.rs 中的LogMsg结构严格解析(deny_unknown_fields),字段与输出事件的对应关系如下:

输入字段说明输出字段必填
message纯文本消息体message
status日志级别status(语义映射为 severity)
timestamp毫秒级 Unix 时间戳timestamp
hostname主机名hostname
service服务名service
ddsource数据来源ddsource
ddtags逗号分隔的标签列表ddtagsparse_ddtagstrue时展开为数组)

其中status被刻意在 schema 层面标注为 severity 语义(源码注释引用了 Datadog 对 status 的语义约定),timestamphostnameserviceddsourceddtags分别标注为 timestamp/host/source/tags 语义,见 mod.rs 的outputs实现。parse_ddtags的解析行为有专门单元测试覆盖(logs.rs),例如filename:driver.log,debug,wizard:the_grey会展开为["filename:driver.log", "debug", "wizard:the_grey"]

指标解码:series 与 sketches

指标端点共有三条路由(metrics.rs):

  • POST /api/v1/series/...:JSON 格式,{"series": [...]}
  • POST /api/v2/series/...:Protobuf 格式(MetricPayload),支持 origin 元数据与 resources 字段;
  • POST /api/beta/sketches/...:Protobuf 格式的 DDSketch 负载,解码为分布直方图(distribution)指标。

从实现看(metrics.rs),各 Datadog 指标类型到 Vector 指标的映射为:

Datadog 类型Vector 映射说明
countIncremental Counter直接转为计数器
gaugeAbsolute Gauge直接转为仪表值;v2 中若携带非零 interval(DogStatsD 场景),会作为 gauge 的 interval 保留
rateIncremental Counter(值 × interval)与 DogStatsD 源行为保持一致,interval(秒)换算为毫秒后写入 interval
DDSketchIncremental Distribution通过AgentDDSketch::from_raw还原 min/max/sum/avg 与桶结构

v2 series 的resources字段处理也值得注意:host资源会替换日志 schema 中的主机 tag,device资源保留为devicetag,其他资源类型以带前缀的通用 tag 保留(metrics.rs)。split_metric_namespace的切分逻辑由 metrics.rs 的namespace_name_from_dd_metric实现,即“解析第一个.之前的部分作为 namespace,没有分隔符则无 namespace”。

追踪与 LLM Observability

追踪负载同样由 traces.rs 处理。POST /api/v0.2/traces接收 Datadog 的TracePayloadProtobuf,源码会自动区分新旧两种 schema:

  • 新 schema(含tracer_payloads):每个 chunk 映射为一个TraceEvent,携带priorityorigindropped、tags、spans数组以及container_idlanguage_nametracer_versionruntime_idapp_version等负载级字段,并标记payload_version: v2
  • 旧 schema:每个 trace 映射为一个事件(trace_idstart_timeend_timespans),transactions中的 APM 事件也被逐一映射,标记payload_version: v1

每个 span 被展开为包含servicenameresourcetrace_idspan_idparent_idstartdurationerrormetametricstypemeta_struct的对象(traces.rs)。

另有一条特殊路由:POST /api/v0.2/stats会被直接丢弃并返回 200 OK——源码注释说明 APM 统计是有意丢弃的,因为它们会在下游datadog_tracessink 中重新计算。

追踪支持注意事项(原文档“Trace support caveats”):datadog_agent源能够接收 Datadog Agent 的追踪并转发到 Datadog。为保证 APM 统计(如 span 命中次数、duration 分布)准确,应在 Datadog Agent 或客户端 SDK 中禁用任何追踪采样,因为这些驱动 APM 统计的指标是由 Vector 计算的。

LLM Observability 端点(llmobs.rs)接收event_type包裹的 span 集合,兼容单个 JSON 对象与 JSON 数组两种信封形态,将每个 span 的span_idtrace_idnamesession_idservicestart_nsdurationstatusmetametricstagsml_app(从_dd.ml_apptags中提取)等字段展开为日志事件,start_ns同时用于填充timestamp

API Key 提取与 store_api_key

store_api_key(默认true)控制是否从请求中提取 Datadog API key。从 mod.rs 的ApiKeyExtractor看,提取优先级为:

  1. URL 路径:正则^/v1/input/(?P<api_key>[[:alnum:]]{32})/??匹配/v1/input/<32位key>形式的旧版日志端点;
  2. 查询参数?dd-api-key=...
  3. 请求头dd-api-key

提取到的 key 通过metadata.set_datadog_api_key写入事件元数据(日志、指标、追踪、llmobs 四条链路均如此),当事件最终发往 Datadog sink 时会被直接使用——这使得“Datadog Agent → Vector → Datadog”的转发路径无需在每个 sink 中重复配置同一 API key。设为false时提取逻辑短路返回None

请求超时处理

这是该源文档中非常实用的一个主题。当 Datadog Agent 向本源发送请求、而源在把事件送往下游 transforms/sinks 时阻塞,Agent 最终会超时并断开连接。此时默认情况下 Vector 会报 “Events dropped.” 错误并递增component_discarded_events_total内部指标。

但严格来说事件并未真正丢失:Agent 会无限重试重发该请求,只要阻塞不是永久性的,事件最终仍会被接收。为避免这种有误导性的遥测,可以将send_timeout_secs配置为小于Agent 超时(默认 10 秒)的值。此时 Vector 会:

  • 向 Agent 返回HTTP 503 Service Unavailable
  • 发出warning而非 error;
  • 递增component_timed_out_requests_total指标。

从 mod.rs 的handle_events实现可验证这一链路:SendError::Timeout触发 503 响应,SendError::Closed(服务器关闭)则拒绝请求,端到端确认场景下BatchStatus::Errored/Rejected分别映射为 500/400 响应,从而驱动 Agent 侧重试或放弃。

组件内部指标

该源暴露的内部指标(来自 CUE 数据 telemetry 一节)包括:

指标含义
component_timed_out_events_total因发送超时而被放弃/标记的事件数
component_timed_out_requests_total因发送超时而被标记的请求数(配合send_timeout_secs产生)
http_server_handler_duration_secondsHTTP 请求处理耗时
http_server_requests_received_total收到的 HTTP 请求数
http_server_responses_sent_total已发送的 HTTP 响应数

此外,每次成功解码都会通过EventsReceived内部事件上报事件数量与估算的 JSON 字节大小(见各模块中的events_received.emit调用)。

相关源码与测试

深入阅读该组件实现,可从以下路径入手:

  • 组件配置与 HTTP 服务搭建:src/sources/datadog_agent/mod.rs
  • 日志解码:src/sources/datadog_agent/logs.rs
  • 指标解码(series v1/v2、DDSketch):src/sources/datadog_agent/metrics.rs
  • 追踪解码(新旧 Protobuf schema):src/sources/datadog_agent/traces.rs
  • LLM Observability 解码:src/sources/datadog_agent/llmobs.rs
  • 单元测试:src/sources/datadog_agent/tests.rs
  • 与真实 Datadog Agent 的集成测试(特性datadog-agent-integration-tests):src/sources/datadog_agent/integration_tests.rs
  • 文档元数据来源(CUE):website/cue/reference/components/sources/datadog_agent.cue

综上,datadog_agent源是 Vector 中对接 Datadog 采集体系的“数据入口”:在 Agent 侧添加一段vector:配置即可把日志、指标、追踪甚至 LLM Observability 数据导入 Vector 管道,再配合multiple_outputs分端口输出与datadog_traces等下游 sink,即可实现数据在 Vector 中加工后回流 Datadog,或改道至其他后端。

【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询