一篇够实战的 Datadog 从 0 到落地的可观测性与成本守护
继续保留 Prometheus Exporter,Agent 直接抓或走 OTLP;语义标签策略要统一(,方便回溯发布与波动的关系。Kubernetes 集群。Metrics 存储/查询。Logs 索引/归档/回灌。OTLP/DD 协议。
·
一、一体化可观测性与安全
- 一站式:指标(Metrics)、日志(Logs)、追踪(APM/Profiling)、真实用户监测(RUM)、合成监测(Synthetics)、网络/数据库监控、安全(Cloud SIEM / 应用与 API 保护 / CSPM)统一在一个平台。
- 生态集成:上千集成(K8s、Docker、NGINX、PostgreSQL、Redis、Kafka、云厂商等),开箱即用的 Dashboard/Monitor。
- 运营效率:故障排查从“跨平台切换”变为“单一时间线回放”:日志⇄追踪⇄主机/容器⇄网络流量⇄RUM。
- 成本可控:可在采集端与平台内做过滤、降采样、按索引/保留期分层;历史日志可归档后回灌(需要时再查)。
二、总体架构与数据流
关键点:
- Agent 作为边车/DaemonSet 统一采集;
- APM 可用语言 SDK 或自动注入,也支持 OpenTelemetry(OTLP);
- Logging without Limits™:日志摄取与索引分离,降本关键;
- 同一张时间线串起指标、日志、追踪与安全事件。
三、快速上手:Kubernetes + Go 微服务示例
3.1 安装 Helm Chart(推荐)
helm repo add datadog https://helm.datadoghq.com
helm repo update
# values.yaml 见下方
helm upgrade --install datadog datadog/datadog -f values.yaml -n datadog --create-namespace
3.2 values.yaml
(精简但够用)
datadog:
apiKey: "<你的_api_key>"
appKey: "<你的_app_key>" # 需要管理仪表盘/监控可选
site: "datadoghq.com" # 或 datadoghq.eu 等
clusterName: "prod-us-cluster"
# 基础采集
kubeStateMetricsCore:
enabled: true
logs:
enabled: true
containerCollectAll: true
# 先把噪声降下来
containerCollectUsingFiles: true
processingRules:
- type: mask_sequences
name: mask-secrets
pattern: '(password|token|apikey)\s*=\s*\S+'
apm:
enabled: true
port: 8126
env: "prod"
receiverSocket: "/var/run/datadog/apm.socket" # 避免明文端口暴露(可选)
processAgent:
enabled: true
networkMonitoring:
enabled: true
orchestratorExplorer:
enabled: true
agents:
image:
tag: "latest" # 企业建议 pin 具体版本
# 采样/过滤(示例):在容器级别排除不重要的日志
containers:
logs:
enabled: true
containerExcludeLogs: "name:pause|name:istio-.*|image:gcr.io/.*-proxy"
部署后
kubectl -n datadog exec -it ds/datadog -- agent status
检查健康。
3.3 Go 应用(APM + 指标 + 语义标签)
// go.mod
// require gopkg.in/DataDog/dd-trace-go.v1 v1.63.0+ (示例版本)
package main
import (
"log"
"net/http"
"time"
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
"gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http"
)
func main() {
// 建议通过环境变量注入:DD_SERVICE / DD_ENV / DD_VERSION
tracer.Start(
tracer.WithService("checkout-api"),
tracer.WithEnv("prod"),
tracer.WithServiceVersion("1.8.3"),
tracer.WithAnalytics(true), // 参与 APM 分析
)
defer tracer.Stop()
mux := http.NewServeMux()
mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte("ok"))
})
mux.HandleFunc("/pay", func(w http.ResponseWriter, r *http.Request) {
time.Sleep(80 * time.Millisecond)
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte("paid"))
})
// 使用 Datadog 包装器自动打点
wrapped := httptrace.WrapHandler(mux, "http.server", httptrace.WithSpanOptions())
log.Fatal(http.ListenAndServe(":8080", wrapped))
}
K8s 部署清单(片段)
apiVersion: apps/v1
kind: Deployment
metadata:
name: checkout-api
spec:
template:
metadata:
labels:
app: checkout-api
tags.datadoghq.com/env: "prod"
tags.datadoghq.com/service: "checkout-api"
tags.datadoghq.com/version: "1.8.3"
spec:
containers:
- name: app
image: yourrepo/checkout-api:1.8.3
env:
- name: DD_ENV
valueFrom: { fieldRef: { fieldPath: metadata.labels['tags.datadoghq.com/env'] } }
- name: DD_SERVICE
valueFrom: { fieldRef: { fieldPath: metadata.labels['tags.datadoghq.com/service'] } }
- name: DD_VERSION
valueFrom: { fieldRef: { fieldPath: metadata.labels['tags.datadoghq.com/version'] } }
- name: DD_TRACE_AGENT_URL
value: "unix:///var/run/datadog/apm.socket"
volumeMounts:
- name: apm-socket
mountPath: /var/run/datadog
volumes:
- name: apm-socket
hostPath:
path: /var/run/datadog
以上标签(
tags.datadoghq.com/*
)能自动串联 服务地图 / 部署版本 / 环境,方便回溯发布与波动的关系。
四、日志策略:只索引有价值的,其他归档
目标:把“摄取(ingest)”与“索引(index)”拆开:
- 索引:错误、告警、审计、关键交易流水;
- 不索引:调试、请求/响应大字段、重复性心跳 —— 直接归档到你的 S3/GCS/OSS;
- 需要临时排查时,再“回灌(Rehydration)”到临时索引查询,查完自动清理。
平台内建议做法
- 建立按“服务/环境/重要度”的多索引集(不同保留期);
- 使用 过滤器 + 采样(例如只保留 5xx、或
level:error|warn
); - 脱敏:手机号、邮箱、token 在 Agent 端或 Pipelines 中做掩码;
- 配额:为高噪服务设置索引配额与超额丢弃策略,避免“蝗灾”。
五、APM/分布式追踪:低侵入启动 + 基数控制
- 自动注入(Java/Node/Python 等)可 0 改码接入;Go 使用 wrapper;
- 保持 Trace 采样(例如 10–20% 起步),遇到错误/高延迟请求强制保留;
- 控制标签基数(不要把
user_id
这类爆炸维度当作高基数 tag),改为日志字段或 span tag 且不用于分组; - 开启 持续剖析(Profiler) 用于 CPU/Heap/火焰图,定位间歇性抖动。
六、常用仪表盘与服务 SLO 模板
服务总览(Service Overview)
- P50/P90/P99 延迟(
service.request.duration{service:checkout-api}
); - 错误率(
count by status:5xx / all
); - QPS/吞吐;
- Top N 慢端点 / 慢 SQL;
- 版本维度对比(
by version
)。
K8s 视角
- Pod 重启率、Pending/Failed、节点资源(CPU/内存/磁盘/网络);
- HPA 目标命中率、限流(OOMKill / Throttle);
- 关键 Daemon(CoreDNS、Ingress、Sidecar)健康。
SLO(例)
- 可用性:99.9%(7 天窗口);
- 错误预算告警(Burn Rate):
BR(2h) > 14 或 BR(1h) > 7
提醒,BR(6h) > 2
升级。
七、告警与值班:多信道、烧蚀率(Burn Rate)
- 多渠道:Slack/Teams/钉钉/短信/电话;
- 抑制/去重:同一事件短时合并;
- 层级化:P1(客户面故障,电话+短信)、P2(功能受限,即时 IM)、P3(非生产,归档);
- 运行手册:告警描述内链接到 Runbook/自动化修复脚本;
- 值班表:跟随 SRE on-call 排班。
Burn Rate 监控查询(示意)
(error_requests / total_requests) over last 1h > 7 * (1 - SLO)
八、 前端与合成监测(RUM/Synthetics)
- RUM:浏览器 SDK 注入,采集真实用户的性能、错误、Core Web Vitals(LCP/FID/CLS)。
- Synthetics:无头浏览器脚本/API 测试,覆盖登录、下单、支付等关键路径,跨区域拨测;结合 APM 链路还原前后端全链路。
九、网络、数据库与依赖可视化
- Network Performance Monitoring (NPM):跨命名空间/服务的流量地图、延迟、丢包;
- Database Monitoring (DBM):慢查询榜单、执行计划、等待事件;
- Service Map:上游/下游依赖拓扑,一键定位热点服务与异常传播路径。
十、成本守护 8 招
- 日志分层:只索引 Error/Warn 与审计,其他归档。
- 回灌查询:历史问题排查时临时回灌到短期索引。
- 采样:Trace 与日志按端点/错误优先级采样,动态上调/下调比例。
- 去高基数:限制
user_id
/request_id
等在指标标签中的使用。 - 边缘过滤:Agent/Pipelines 先过滤/脱敏/限速再上传。
- 保留期按价值:关键日志 14–30 天,普通 3–7 天,冷数据进对象存储。
- 指标聚合:优先上报已聚合指标(降低时间序列数量)。
- 看板治理:清理孤儿仪表盘/告警,定期审计最贵的查询与索引。
十一、运维日常:排错、变更、合规
agent status
/agent flare
收集诊断包;- 升级 按环境分批,对比新旧版本延迟/错误率;
- 安全/合规:日志脱敏、PIV/CMP 授权、只读访问、审计日志开启。
十二、基础设施即可观测(Terraform)
Provider 初始化(片段)
terraform {
required_providers {
datadog = {
source = "DataDog/datadog"
version = "~> 3.39"
}
}
}
provider "datadog" {
api_key = var.datadog_api_key
app_key = var.datadog_app_key
api_url = "https://api.datadoghq.com/"
}
创建一个错误率告警(示例)
resource "datadog_monitor" "checkout_error_rate" {
name = "[P1] checkout-api error rate high"
type = "query alert"
query = "sum(last_5m): (sum:service.requests.error{service:checkout-api} / sum:service.requests.total{service:checkout-api}) * 100 > 2"
message = "Error rate >2% in last 5m. @oncall-sre @team-checkout"
tags = ["service:checkout-api", "env:prod", "team:checkout"]
escalation_message = "Escalate to incident commander if persists over 15m."
notify_no_data = false
evaluation_delay = 120
renotify_interval = 30
priority = 1
}
十三、迁移/对比与踩坑清单
-
从 Prometheus/Grafana 迁移:继续保留 Prometheus Exporter,Agent 直接抓或走 OTLP;语义标签策略要统一(
service/env/version
)。 -
踩坑
- 忘记打
DD_ENV/DD_SERVICE/DD_VERSION
→ 服务地图碎片化; - 指标标签爆炸(高基数) → 查询变慢/账单暴涨;
- 把请求体/大字段原样索引 → 成本倍增;
- APM 采样全量 → 存储与费用飙升;
- 归档未加生命周期策略 → 冷存也会贵。
- 忘记打
十四、附录:可复制的配置清单
Agent 健康检查
kubectl -n datadog exec -it ds/datadog -- agent status
kubectl -n datadog logs ds/datadog
典型 Log Pipeline(思路)
- 解析 JSON → 提取
service/env/trace_id/span_id
→ 脱敏 → 按status
分流到不同索引集 → 超配额丢弃策略 → 归档。
APM 必备环境变量
DD_ENV=prod
DD_SERVICE=checkout-api
DD_VERSION=1.8.3
DD_TRACE_SAMPLE_RATE=0.2 # 20% 采样
DD_TRACE_RATE_LIMIT=100 # 每秒最大样本数
DD_PROFILING_ENABLED=true
RUM(前端片段,示意)
<script>
(function(h,o,u,n,d){h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
;n=o.createElement(u);n.async=1;n.src='https://www.datadoghq-browser-agent.com/datadog-rum.js'
;o.getElementsByTagName(u)[0].parentNode.appendChild(n)
;h.onReady(function(){
DD_RUM.init({
clientToken: 'xxx',
applicationId: 'xxx',
site: 'datadoghq.com',
service: 'web-portal',
env: 'prod',
sampleRate: 50
})
})})(window,document,'script',0,'DD_RUM')
</script>
更多推荐
所有评论(0)