一、一体化可观测性与安全

  • 一站式:指标(Metrics)、日志(Logs)、追踪(APM/Profiling)、真实用户监测(RUM)、合成监测(Synthetics)、网络/数据库监控、安全(Cloud SIEM / 应用与 API 保护 / CSPM)统一在一个平台。
  • 生态集成:上千集成(K8s、Docker、NGINX、PostgreSQL、Redis、Kafka、云厂商等),开箱即用的 Dashboard/Monitor。
  • 运营效率:故障排查从“跨平台切换”变为“单一时间线回放”:日志⇄追踪⇄主机/容器⇄网络流量⇄RUM。
  • 成本可控:可在采集端与平台内做过滤、降采样、按索引/保留期分层;历史日志可归档后回灌(需要时再查)。

二、总体架构与数据流

Kubernetes 集群
Trace/Logs/Metrics
OTLP/DD 协议
Datadog Agent
DaemonSet
应用服务
Go/Java/Node
Kube-State-Metrics-Core
主机/容器指标
Datadog Intake
Metrics 存储/查询
Logs 索引/归档/回灌
APM/Profiling/Service Map
SIEM/CSPM/ASM
浏览器 SDK
合成监测

关键点:

  • 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 招

  1. 日志分层:只索引 Error/Warn 与审计,其他归档。
  2. 回灌查询:历史问题排查时临时回灌到短期索引。
  3. 采样:Trace 与日志按端点/错误优先级采样,动态上调/下调比例。
  4. 去高基数:限制 user_id/request_id 等在指标标签中的使用。
  5. 边缘过滤:Agent/Pipelines 先过滤/脱敏/限速再上传。
  6. 保留期按价值:关键日志 14–30 天,普通 3–7 天,冷数据进对象存储。
  7. 指标聚合:优先上报已聚合指标(降低时间序列数量)。
  8. 看板治理:清理孤儿仪表盘/告警,定期审计最贵的查询与索引。

十一、运维日常:排错、变更、合规

  • 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>
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐