datadog
Datadog 是一个用于监控应用程序和基础设施的可观测性平台。datadog 插件通过 UDP 将网关请求指标发送到 DogStatsD;DogStatsD 是 Datadog Agent 随附的指标聚合服务。Agent 聚合这些指标后将其转发到 Datadog,以供查询、仪表板和告警使用。
指标
该插件会导出以下指标。每个指标名称都会以插件元数据中配置的命名空间为前缀。使用默认命名空间 apisix 时,request.counter 会导出为 apisix.request.counter。
| 名称 | 类型 | 描述 |
|---|---|---|
request.counter | Counter | 接收的请求数。 |
request.latency | Histogram | 请求总延迟,单位为毫秒。 |
upstream.latency | Histogram | 从建立上游连接到收到上游响应的耗时,单位为毫秒。没有可用的上游延迟时,不会上报此指标。 |
apisix.latency | Histogram | 网关处理请求所用的时间,单位为毫秒。 |
ingress.size | Timer | 请求大小,单位为字节。 |
egress.size | Timer | 响应大小,单位为字节。 |
标签
当以下标签的值可用时,插件会将其附加到指标:
| 名称 | 描述 |
|---|---|
route_name | 当 prefer_name 为 true 且已配置名称时,使用路由名称;否则使用路由 ID。 |
service_name | 当 prefer_name 为 true 且已配置名称时,使用服务名称;否则使用服务 ID。 |
consumer | Consumer 用户名。 |
balancer_ip | 处理请求的上游节点地址。 |
response_status | HTTP 响应状态码,例如 200、404 或 503。 |
response_status_class | HTTP 响应状态类别,例如 2xx、4xx 或 5xx。该标签从 API7 企业版 3.9.0 和 3.10.0 以及 APISIX 3.14.0 开始提供。 |
scheme | 上游协议,例如 http、https 或 grpc。 |
path | 当 include_path 为 true 时,为匹配的路由路径。 |
method | 当 include_method 为 true 时,为 HTTP 方法。 |
示例
以下示例会部署固定版本的 DogStatsD Agent,配置网关以访问该 Agent,并在 Datadog 中验证网关指标。Docker 设置使用专用网络,以便网关可以通过容器名称向 Agent 发送 UDP 指标。
创建或选择一个 Datadog API 密钥,并确定组织使用的 Datadog 站点。将它们设置为环境变量,不要将密钥添加到配置文件或源代码管理中:
export DD_API_KEY=replace-with-datadog-api-key
export DD_SITE=datadoghq.com
以下 Agent 部署仅用于评估。生产部署请遵循 Datadog Agent 容器指南以及组织的密钥管理要求。
- Docker
- Kubernetes
将 GATEWAY_CONTAINER 设置为正在运行的 APISIX 或 API7 网关容器。创建专用网络并将网关连接到该网络:
export GATEWAY_CONTAINER=replace-with-gateway-container-name
docker network create gateway-datadog-net
docker network connect gateway-datadog-net "$GATEWAY_CONTAINER"
在同一网络中启动独立的 DogStatsD Agent:
docker run -d \
--name dogstatsd-agent \
--network gateway-datadog-net \
-e DD_API_KEY \
-e DD_SITE \
-e DD_HOSTNAME=apisix-docs-datadog \
-e DD_DOGSTATSD_NON_LOCAL_TRAFFIC=true \
registry.datadoghq.com/dogstatsd:7.83.1
等待 Agent 健康检查通过:
until [ "$(docker inspect -f '{{.State.Health.Status}}' dogstatsd-agent)" = "healthy" ]; do
sleep 2
done
使用 API 密钥创建 Kubernetes Secret:
kubectl create secret generic datadog-api-key \
--namespace aic \
--from-literal=api-key="$DD_API_KEY"
创建 DogStatsD Deployment 和 Service。如果组织不使用 US1 站点,请替换 DD_SITE 的值:
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: aic
name: dogstatsd-agent
spec:
replicas: 1
selector:
matchLabels:
app: dogstatsd-agent
template:
metadata:
labels:
app: dogstatsd-agent
spec:
containers:
- name: dogstatsd-agent
image: registry.datadoghq.com/dogstatsd:7.83.1
env:
- name: DD_API_KEY
valueFrom:
secretKeyRef:
name: datadog-api-key
key: api-key
- name: DD_SITE
value: datadoghq.com
- name: DD_HOSTNAME
value: apisix-docs-datadog
- name: DD_DOGSTATSD_NON_LOCAL_TRAFFIC
value: "true"
ports:
- name: dogstatsd
containerPort: 8125
protocol: UDP
readinessProbe:
exec:
command:
- /probe.sh
initialDelaySeconds: 5
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
namespace: aic
name: dogstatsd-agent
spec:
selector:
app: dogstatsd-agent
ports:
- name: dogstatsd
port: 8125
targetPort: dogstatsd
protocol: UDP
应用清单并等待 Agent 就绪:
kubectl apply -f dogstatsd.yaml
kubectl rollout status -n aic deployment/dogstatsd-agent
配置 DogStatsD 目标
插件元数据定义了所有启用该插件的路由共享的 DogStatsD 端点、指标命名空间和标签。为所选环境配置元数据:
- Admin API (Docker)
- ADC (Docker)
- Ingress Controller (Kubernetes)
curl "http://127.0.0.1:9180/apisix/admin/plugin_metadata/datadog" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"host": "dogstatsd-agent",
"port": 8125,
"namespace": "apisix_docs",
"constant_tags": [
"source:apisix",
"docs_example:datadog"
]
}'
插件元数据是全局集合,无法通过标签选择器隔离。更改 Datadog 条目前,请先导出完整集合:
adc dump -o adc-metadata.yaml --with-id \
--include-resource-type plugin_metadata
新增或更新 datadog 条目,同时保留其他所有插件元数据条目:
plugin_metadata:
# 保留导出文件中的其他所有插件元数据条目。
datadog:
host: dogstatsd-agent
port: 8125
namespace: apisix_docs
constant_tags:
- "source:apisix"
- "docs_example:datadog"
预览完整集合,并确认其中没有无关的变更或删除:
adc diff -f adc-metadata.yaml \
--include-resource-type plugin_metadata
同步已审核的集合:
adc sync -f adc-metadata.yaml \
--include-resource-type plugin_metadata
在部署所使用的完整 GatewayProxy 清单的 spec.pluginMetadata 下添加以下条目:
datadog:
host: dogstatsd-agent.aic.svc
port: 8125
namespace: apisix_docs
constant_tags:
- "source:apisix"
- "docs_example:datadog"
通过部署的常规 Kubernetes 或 GitOps 工作流应用更新后的完整清单。
该端点必须能从网关访问。命名空间会作为每个指标的前缀,固定标签则便于在 Datadog 中识别示例指标。
监控路由指标
创建一个将请求指标发送到 DogStatsD 的路由。该示例包含匹配的路径、HTTP 方法和路由专用标签,并会立即将每个指标条目发送到 Agent 以便验证。
- Admin API (Docker)
- ADC (Docker)
- Ingress Controller (Kubernetes)
curl "http://127.0.0.1:9180/apisix/admin/routes/datadog-route" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "datadog-docs",
"uri": "/anything/datadog",
"plugins": {
"datadog": {
"batch_max_size": 1,
"include_path": true,
"include_method": true,
"constant_tags": [
"scenario:plugin-hub"
]
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'
services:
- name: datadog-example
labels:
docs-example: datadog
routes:
- name: datadog-route
uris:
- /anything/datadog
plugins:
datadog:
batch_max_size: 1
include_path: true
include_method: true
constant_tags:
- "scenario:plugin-hub"
upstream:
type: roundrobin
nodes:
- host: httpbin.org
port: 80
weight: 1
预览限定范围的 Service 变更,并确认其中没有无关的变更或删除:
adc diff -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=datadog
同步已审核的 Service:
adc sync -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=datadog
- Gateway API
- APISIX CRD
apiVersion: v1
kind: Service
metadata:
namespace: aic
name: httpbin-external-domain
spec:
type: ExternalName
externalName: httpbin.org
ports:
- name: http
port: 80
targetPort: 80
---
apiVersion: apisix.apache.org/v1alpha1
kind: PluginConfig
metadata:
namespace: aic
name: datadog-plugin-config
spec:
plugins:
- name: datadog
config:
batch_max_size: 1
include_path: true
include_method: true
constant_tags:
- "scenario:plugin-hub"
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: aic
name: datadog-route
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: Exact
value: /anything/datadog
filters:
- type: ExtensionRef
extensionRef:
group: apisix.apache.org
kind: PluginConfig
name: datadog-plugin-config
backendRefs:
- name: httpbin-external-domain
port: 80
apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
namespace: aic
name: httpbin-external-domain
spec:
ingressClassName: apisix
externalNodes:
- type: Domain
name: httpbin.org
---
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: aic
name: datadog-route
spec:
ingressClassName: apisix
http:
- name: datadog-route
match:
paths:
- /anything/datadog
methods:
- GET
upstreams:
- name: httpbin-external-domain
plugins:
- name: datadog
config:
batch_max_size: 1
include_path: true
include_method: true
constant_tags:
- "scenario:plugin-hub"
应用配置:
kubectl apply -f datadog-ic.yaml
发送多个请求以生成指标:
for request_number in $(seq 1 5); do
curl -fsS "http://127.0.0.1:9080/anything/datadog?request=${request_number}" > /dev/null
done
DogStatsD 会在较短的时间间隔内聚合指标,然后将其转发。在 Datadog 中打开 Metrics → Explorer,选择 apisix_docs.request.counter,并按 docs_example:datadog 筛选。对于新组织,该指标可能需要几分钟才会显示。
