跳到主要内容

a6-plugin-datadog

概览

datadog 插件会通过 DogStatsD 将 Apache APISIX 的请求指标推送到 Datadog Agent, DogStatsD 使用 UDP 协议,报告请求数、延迟、带宽以及上游耗时, 并使用自动标签标识路由、服务、消费者和状态码等信息。

适用场景

  • 使用 Datadog APM 和仪表板监控 Apache APISIX。
  • 按路由跟踪请求速率、延迟和错误率。
  • 为业务级指标添加自定义标签。
  • 集成现有的 Datadog 基础设施。

插件配置参考(路由/服务)

字段类型是否必填默认值说明
prefer_namebooleantrue在标签中使用路由/服务名称,而不是 ID
include_pathbooleanfalse在标签中包含 HTTP 路径模式
include_methodbooleanfalse在标签中包含 HTTP 方法
constant_tagsarray[]为此路由设置的静态标签(例如 ["env:prod"]
batch_max_sizeinteger1000每个批次的最大条目数
inactive_timeoutinteger5批次刷新前等待的秒数
buffer_durationinteger60最早条目的最大保留时间
max_retry_countinteger0重试次数

插件元数据(全局配置)

为所有路由设置 DogStatsD 服务器地址:

curl "$(a6 context current -o json | jq -r .server)/apisix/admin/plugin_metadata/datadog" \
-X PUT \
-H "X-API-KEY: $(a6 context current -o json | jq -r .api_key)" \
-d '{
"host": "127.0.0.1",
"port": 8125,
"namespace": "apisix",
"constant_tags": ["source:apisix"]
}'
字段类型默认值说明
hoststring"127.0.0.1"DogStatsD 服务器主机
portinteger8125DogStatsD 服务器端口
namespacestring"apisix"指标名称前缀
constant_tagsarray["source:apisix"]应用于所有指标的全局标签

生成的指标

指标类型说明
{namespace}.request.countercounter请求数
{namespace}.request.latencyhistogram请求总延迟(毫秒)
{namespace}.upstream.latencyhistogram上游响应时间(毫秒)
{namespace}.apisix.latencyhistogramApache APISIX处理时间(毫秒)
{namespace}.ingress.sizetimer请求体大小(字节)
{namespace}.egress.sizetimer响应体大小(字节)

默认命名空间为 apisix,因此指标名称类似 apisix.request.counter

自动标签

标签始终存在说明
route_name路由 ID 或名称
service_name路由包含服务时服务 ID 或名称
consumer请求经过身份认证时消费者用户名
balancer_ip处理请求的上游 IP
response_statusHTTP 状态码(例如 200
response_status_class状态码类别(例如 2xx5xx
schemehttp, https, grpc, grpcs
path如果 include_path: trueHTTP 路径模式
method如果 include_method: trueHTTP 方法

分步指南:将指标发送到 Datadog

1. 配置插件元数据(DogStatsD 地址)

curl "$(a6 context current -o json | jq -r .server)/apisix/admin/plugin_metadata/datadog" \
-X PUT \
-H "X-API-KEY: $(a6 context current -o json | jq -r .api_key)" \
-d '{
"host": "127.0.0.1",
"port": 8125,
"namespace": "apisix",
"constant_tags": ["source:apisix", "env:production"]
}'

2. 在路由上启用

a6 route create -f - <<'EOF'
{
"id": "monitored-api",
"name": "api-v1",
"uri": "/api/v1/*",
"plugins": {
"datadog": {
"prefer_name": true,
"include_path": true,
"include_method": true
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"backend:8080": 1
}
}
}
EOF

3. 在 Datadog 中验证

打开 Datadog → Metrics Explorer → 搜索 apisix.request.counter

常见模式

为每个路由设置自定义常量标签

{
"plugins": {
"datadog": {
"prefer_name": true,
"constant_tags": [
"team:platform",
"api_version:v2",
"tier:premium"
]
}
}
}

远程 Datadog Agent

curl "$(a6 context current -o json | jq -r .server)/apisix/admin/plugin_metadata/datadog" \
-X PUT \
-H "X-API-KEY: $(a6 context current -o json | jq -r .api_key)" \
-d '{
"host": "datadog-agent.internal",
"port": 8125,
"namespace": "mycompany",
"constant_tags": ["source:apisix", "datacenter:us-east-1"]
}'

使用 Docker Compose 部署 Datadog Agent

services:
apisix:
image: apache/apisix:3.15.0-debian
depends_on:
- datadog-agent

datadog-agent:
image: datadog/agent:latest
environment:
- DD_API_KEY=${DD_API_KEY}
- DD_SITE=datadoghq.com
- DD_DOGSTATSD_NON_LOCAL_TRAFFIC=true
ports:
- "8125:8125/udp"

Datadog 控制台查询

# Request rate by route
sum:apisix.request.counter{*} by {route_name}.as_count()

# P95 latency
percentile:apisix.request.latency{*} by {route_name}, p:95

# Error rate
sum:apisix.request.counter{response_status_class:5xx}.as_count()

# Upstream health by IP
avg:apisix.upstream.latency{*} by {balancer_ip}

配置同步示例

version: "1"
routes:
- id: monitored-api
name: api-v1
uri: /api/v1/*
plugins:
datadog:
prefer_name: true
include_path: true
include_method: true
constant_tags:
- "team:platform"
upstream_id: my-upstream

故障排查

现象原因解决方法
Datadog 中没有指标Agent 未接收 UDP 数据检查插件元数据中的 host/port,并验证 Agent 配置
缺少消费者标签路由未启用身份认证该标签仅在经过身份认证的请求中出现
指标命名空间错误默认值为 apisix在插件元数据中修改 namespace
Datadog 拒绝标签标签格式无效标签必须以字母开头,不能以 : 结尾
指标延迟inactive_timeout 设置过大调低批次相关设置以加快传输

本文根据 api7/a6 仓库中的 a6-plugin-datadog/SKILL.md 生成。可在 AI Agent Skills 页面浏览全部 Skill。