ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Apache APISIX datadog 插件:通过 DogStatsD 协议上报网关监控指标实战指南

Apache APISIX datadog 插件:通过 DogStatsD 协议上报网关监控指标实战指南 Apache APISIX datadog 插件通过 DogStatsD 协议上报网关监控指标实战指南【免费下载链接】apisixThe Cloud-Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/ap/apisixdatadog是 Apache APISIX 内置的可观测性插件它基于 StatsD/DogStatsD 协议通过 UDP 将每个请求/响应周期的关键指标请求计数、各级延迟、出入站流量大小异步推送给 Datadog Agent让网关自身的健康与行为状态无缝汇入 Datadog 监控体系。本文以官方文档为主线结合仓库内插件源码与测试用例完整讲解指标与标签语义、DogStatsD 部署、插件启用/删除、元数据热更新与批处理调优帮助你快速落地一套低侵入、低开销的 API 网关监控方案。插件定位与简介datadog插件是 Apache APISIX 与 Datadog 生态集成的官方通道。Datadog 是云应用领域常用的监控与可观测性平台而本插件为其补齐了 APISIX 网关侧的指标采集能力在每个请求和响应周期内抓取多项指标参数这些参数基本反映了系统的行为与健康状况。从实现上看插件并不直接与 Datadog 云端通信而是通过 UDP 协议将自定义指标推送给 DogStatsD 服务器——该服务器通过 UDP 连接与 Datadog Agent 捆绑在一起。DogStatsD 本质上是 StatsD 协议的一种实现它负责为 APISIX 收集自定义指标、聚合成单一数据点后发送到配置好的 Datadog 服务器。说明本文不涉及 Datadog 账户与 Agent 的云端配置细节聚焦于 APISIX 侧插件本身DogStatsD 的安装与配置以官方 Agent 文档为准。工作原理与数据流datadog插件的工作链路可以概括为APISIX 在日志阶段log阶段为每个请求采集指标指标先进入插件内部的批处理缓冲buffer当批处理器达到触发条件定时或条数上限时批量通过 UDP 套接字发送给本地运行的 DogStatsD serverDogStatsD 将指标聚合并转发至 Datadog server。插件维护了一个带 timer 的 buffer当 timer 失效时buffer 中的指标会作为一个批量处理程序传送给本地 DogStatsD server。这种方式通过重复使用同一个 UDP 套接字降低资源占用同时由于刷新周期可配置不会让网络一直处于过载状态。该机制有效解决了日志数据发送不及时的问题创建批处理器后如果配置了inactive_timeout批处理器会在设定时间内自动发送数据未配置时默认值为 5s。关于 APISIX 批处理器的更多细节可参考批处理程序文档。源码中的实现佐证从插件源码可以看到每次批量推送时会为每条 entry 建立 UDP 连接使用ngx.socket.udp()创建套接字通过setpeername(host, port)指定 DogStatsD 服务器地址依次发送 6 类指标数据包发送失败时记录core.log.error错误日志且单个条目失败即终止该批次剩余发送并返回错误最后sock:close()关闭连接。整个入口在_M.log回调apisix/plugins/datadog.lua#L224-L249先通过fetch_log获取完整请求日志再补充ctx.balancer_ip与ctx.upstream_scheme作为标签来源最后交给batch_processor_manager:add_entry进入批处理队列。输出指标与标签语义启用datadog插件后APISIX 会在每个请求响应周期向 DogStatsD server 输出以下指标参数名称StatsD 类型描述Request CounterCounter收到的请求数量。Request LatencyHistogram处理该请求所需的时间以毫秒为单位。Upstream latencyHistogram上游 server agent 请求到收到响应所需的时间以毫秒为单位。APISIX LatencyHistogramAPISIX agent 处理该请求的时间以毫秒为单位。Ingress SizeTimer请求体大小以字节为单位。Egress SizeTimer响应体大小以字节为单位。这些指标会附带上以下标签发送到 DogStatsD agent。如果某个标签没有合适的值该标签会被直接省略参数名称描述route_name路由的名称如果不存在将显示路由 ID。service_id如果一个路由是用服务的抽象概念创建的那么特定的服务 ID 将被使用。consumer如果路由有一个链接的消费者消费者的用户名将被添加为一个标签。balancer_ip处理了当前请求的上游复制均衡器的 IP。response_statusHTTP 响应状态代码。scheme已用于提出请求的协议如 HTTP、gRPC、gRPCs 等。实际 UDP 数据包格式来自测试用例测试用例 t/plugin/datadog.t 直接验证了 DogStatsD 线上传输的真实报文格式。例如一次 GET 请求/opentracing后mock 的 DogStatsD 服务收到如下数据apisix.request.counter:1|c|#source:apisix,route_name:datadog,balancer_ip:10.0.0.1,response_status:200,scheme:http apisix.request.latency:1.2|h|#source:apisix,route_name:datadog,balancer_ip:10.0.0.1,response_status:200,scheme:http apisix.upstream.latency:0.8|h|#source:apisix,route_name:datadog,balancer_ip:10.0.0.1,response_status:200,scheme:http apisix.apisix.latency:0.4|h|#source:apisix,route_name:datadog,balancer_ip:10.0.0.1,response_status:200,scheme:http apisix.ingress.size:0|ms|#source:apisix,route_name:datadog,balancer_ip:10.0.0.1,response_status:200,scheme:http apisix.egress.size:10|ms|#source:apisix,route_name:datadog,balancer_ip:10.0.0.1,response_status:200,scheme:http对应源码中的构造逻辑apisix/plugins/datadog.lua#L75-L109标签以|#为前缀、用逗号拼接route_name/service_name优先使用名称缺省时回退为 IDconsumer取entry.consumer.usernamebalancer_ip、response_status、scheme仅在非空时加入标签。测试文件中的 mock 服务实现位于 t/lib/mock_layer4.lua它通过 UDP 收包并把原始报文打印到错误日志便于在测试中断言报文格式。指标命名与 namespace 前缀所有指标名都会带上namespace前缀默认apisix最终形成apisix.request.counter、apisix.request.latency、apisix.upstream.latency、apisix.apisix.latency、apisix.ingress.size、apisix.egress.size这样的完整指标名。测试用例也验证了自定义 namespace 的效果当元数据中namespace设置为mycompany时报文前缀整体变为mycompany.*。使用前提部署 Datadog Agent / DogStatsD在使用插件前必须先确保环境中存在可用的 DogStatsD 服务安装 Datadog Agent它可以是 Docker 容器、Kubernetes Pod 或二进制包管理器安装的进程。核心要求是 APISIX 能够访问到 Datadog Agent 的 8125 端口DogStatsD 默认 UDP 端口。准备 Datadog 账户与 API Key如果你从未使用过 Datadog需要先在官网注册账户并按指引生成 API Key该 Key 用于 DogStatsD 容器启动时绑定账号。推荐轻量镜像datadog插件仅依赖datadog/agent的 dogstatsd 组件即可实现插件按照 StatsD 协议通过标准 UDP 套接字异步发送指标。官方文档建议使用独立的datadog/dogstatsd镜像而非完整的datadog/agent前者镜像大小仅约 11 MB后者高达约 2.8 GB明显更轻量。将 DogStatsD 作为容器运行# 拉取最新镜像 docker pull datadog/dogstatsd:latest # 以分离模式运行容器并绑定 UDP 8125 端口 docker run -d --name dogstatsd-agent -e DD_API_KEYYour API Key from step 2 -p 8125:8125/udp datadog/dogstatsd在生产环境使用 Kubernetes 时可以将dogstatsd作为Daemonset或Multi-Container Pod与 APISIX agent 一起部署确保每个节点上都有本地的 DogStatsD 接收端。在路由上启用插件本节演示如何在指定路由上启用datadog插件。操作前请确认 Datadog Agent 已启动并正常运行。首先从config.yaml中获取admin_key并存入环境变量admin_key$(yq .deployment.admin.admin_key[0].key conf/config.yaml | sed s///g)然后通过 Admin API 为路由/hello绑定插件curl http://127.0.0.1:9180/apisix/admin/routes/1 -H X-API-KEY: $admin_key -X PUT -d { plugins: { datadog: {} }, upstream: { type: roundrobin, nodes: { 127.0.0.1:1980: 1 } }, uri: /hello }配置完成后任何对uri /hello的请求都会生成前述 6 类指标并推送到 Datadog Agent 的 DogStatsD 服务器。提示上例使用空对象datadog: {}即采用全部默认配置也可以在插件配置中直接指定批处理参数如batch_max_size、max_retry_count详见下文“批处理参数调优”一节。删除插件删除插件只需移除路由配置中相应的 JSON 配置即可禁用datadogcurl http://127.0.0.1:9180/apisix/admin/routes/1 -H X-API-KEY: $admin_key -X PUT -d { methods: [GET], uri: /hello, plugins: {}, upstream: { type: roundrobin, nodes: { 127.0.0.1:1980: 1 } } }APISIX 插件支持热加载因此无需重启 APISIX配置即可生效。自定义配置插件元数据在默认配置中datadog插件期望 DogStatsD 服务在127.0.0.1:8125可用。若需要更新目标地址、命名空间或静态标签请通过修改插件元数据实现元数据字段说明见下文“元数据”小节。向/apisix/admin/plugin_metadata/datadog发起 PUT 请求即可更改元数据curl http://127.0.0.1:9180/apisix/admin/plugin_metadata/datadog -H X-API-KEY: $admin_key -X PUT -d { host: 172.168.45.29, port: 8126, constant_tags: [ source:apisix, service:custom ], namespace: apisix }上述命令更新后各指标将通过 UDP StatsD 推送到172.168.45.29:8126上对应的服务配置将被热加载无需重启 APISIX 实例即可生效。恢复默认元数据如果需要把datadog插件的元数据 schema 恢复到默认值只需向同一服务地址发送一个 Body 为空的 PUT 请求curl http://127.0.0.1:9180/apisix/admin/plugin_metadata/datadog \ -H X-API-KEY: $admin_key -X PUT -d {}从源码看当元数据为空时push_metrics会回退到内置默认值defaultsapisix/plugins/datadog.lua#L29-L34local defaults { host 127.0.0.1, port 8125, namespace apisix, constant_tags {source:apisix} }配置属性插件属性名称类型必选项默认值有效值描述prefer_namebooleanoptionaltruetrue/false如果设置为false将使用路由/服务的 id 值作为插件的route_name而不是带有参数的标签名称。该属性的核心影响在插件源码_M.log中体现当prefer_name为true时插件会尝试用服务名称service_fetch查询服务的name字段和路由名称ctx.route_name替换标签中的 ID若名称为空或属性为false则回退使用 route/service 的 id 值。测试用例 t/plugin/datadog.t 中的 TEST 7/TEST 9 分别验证了“无路由名时回退到route_name:1”和“prefer_name: false时service_name:1使用 id”的行为。批处理参数调优该插件支持使用批处理程序聚集和处理条目日志/数据的批次避免频繁提交数据。默认情况下批处理程序每5秒或当队列中的数据达到1000条时提交数据。批处理器的参数通过插件配置conf传入常用项如下完整说明见批处理程序文档名称类型默认值有效值描述batch_max_sizeinteger1000[1,...]每批发送日志的最大条数达到该值时自动推送全部日志。inactive_timeoutinteger5[1,...]刷新缓冲区的最大时间秒达到该时间时无论数量是否达标都会推送。buffer_durationinteger60[1,...]必须先处理批次中最旧条目的最长期限秒。max_retry_countinteger0[0,...]从处理管道中移除之前的最大重试次数。测试用例中常见batch_max_size: 1的配置这意味着每条请求日志都会立即生成一个批次并触发发送方便在测试中逐条断言报文内容生产环境建议保持默认聚合以降低 UDP 发包频率。刷新批处理的计时器基于inactive_timeout运行因此最佳实践是保持inactive_timeout小于buffer_duration。元数据名称类型必选项默认值描述hoststringoptional127.0.0.1DogStatsD 服务器的主机地址。portintegeroptional8125DogStatsD 服务器的主机端口。namespacestringoptionalapisix由 APISIX 代理发送的所有自定义参数的前缀对寻找指标图的实体很有帮助例如apisix.request.counter。constant_tagsarrayoptional[ source:apisix ]静态标签嵌入到生成的指标中对按某些信号维度度量进行分组很有用。元数据的 schema 定义见插件源码port类型为 integer 且最小值为 0constant_tags为 string 数组。测试用例 TEST 5/TEST 6 验证了修改namespace为mycompany、追加constant_tags为[source:apisix,new_tag:must]后报文前缀与标签均按预期变化。源码结构速览如果你想深入阅读或二次开发该插件以下是仓库内相关的核心文件插件主实现schema 定义、标签生成generate_tag、UDP 发送send_metric_over_udp、批量推送push_metrics与日志钩子_M.log插件priority 495批处理器管理器插件级批处理器实例的管理与复用批处理器实现batch_max_size/inactive_timeout/buffer_duration/max_retry_count等参数的解析与刷新逻辑插件测试用例覆盖元数据校验、报文格式、namespace、constant_tags、名称回退、service 抽象、consumer 标签等 10 个场景测试用 mock DogStatsD 服务在测试环境中模拟 UDP 收包并输出报文。小结datadog插件为 Apache APISIX 提供了通往 Datadog 可观测性体系的低成本通道通过 StatsD 协议的 UDP 数据包、可配置的批处理聚合、热加载的元数据管理以及丰富且可省略的标签维度你可以在不引入额外采集组件的情况下获得网关的请求量、各级延迟与流量大小的连续监控视图。结合实际场景建议优先使用轻量的dogstatsd镜像就近部署按业务维度规划namespace与constant_tags并合理调整批处理参数以平衡实时性与网络开销。【免费下载链接】apisixThe Cloud-Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/ap/apisix创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表