SuperAPI AI 工具集

production-monitoring

部署与运维

查看项目

更新于 10-16 04:02

技能介绍

用途

该技能用于为生产服务构建可观测性基础,定位是“从第一天就开始搭建”的基础设施,而非上线后才补充的功能。目标是让团队能够在不部署新代码的前提下,对系统行为提出任意问题,从而快速定位生产事故。

三条支柱

资料将可观测性拆为三条互补支柱:

  • 日志:告知发生了什么,即带上下文的离散事件,例如“用户 X 登录失败:token 过期”。
  • 指标:告知系统当前表现,即随时间聚合的数值,例如“p99 延迟 450ms 且仍在上升”。
  • 追踪:告知为什么变慢,即一次请求跨服务的完整路径,例如“user-service 中的 Postgres 查询耗时 2.3s”。

三者的协同方式:指标触发告警(错误率 > 1%),按时间窗口过滤日志查看具体错误,从日志中提取 trace ID 追踪到慢服务,修复后验证指标恢复。

主要能力

结构化日志

资料强调非结构化日志在生产中无法过滤、聚合或做看板。给出 Python 的 structlog 配置示例(含处理器链、JSON 渲染、开发环境控制台渲染、屏蔽 uvicorn.access、httpx、sqlalchemy.engine 等噪音库),以及 Node.js 的 pino 配置示例(含日志级别、pino-pretty 传输、service 基础字段、对 authorization、cookie、password、token 的 redact 脱敏)。

日志级别被视为与值班工程师的约定:ERROR 需要人工关注并应触发告警;WARNING 是意外但被处理的情况;INFO 记录业务事件与正常路径;DEBUG 仅供开发者诊断且不应出现在生产。规则包括:没人会读的日志不要打;ERROR 必须有对应告警,否则应降为 WARNING;生产 DEBUG 是零价值的性能负担。

明确禁止记录的字段:密码、token/授权头、信用卡号、SSN/PII、原始请求体(可能含密钥)。每条日志应尽量包含 request_id、trace_id、user_id、业务实体 ID、金额与币种、service 等字段。

跨服务关联 ID:在边缘为每个请求生成唯一 ID,通过 header 向下游传递,并写入每一行日志。资料给出 Starlette/ASGI 中间件的 CorrelationIDMiddleware 实现(读取 x-request-id 或 x-correlation-id,否则生成 UUID,绑定到 structlog contextvars,并在响应头回写 x-request-id),以及使用 httpx 向下游传递 X-Request-ID 的示例。

OpenTelemetry 链路追踪

资料将 OpenTelemetry 定位为厂商中立标准,一次埋点可导出到 Jaeger、Tempo、Datadog 或任意 OTLP 后端。给出 Python 依赖列表(opentelemetry-api、opentelemetry-sdk、opentelemetry-exporter-otlp-proto-grpc,以及 fastapi、sqlalchemy、httpx、redis 的 instrumentation 包),完整的 FastAPI 集成代码(Resource 配置服务名、版本、部署环境,BatchSpanProcessor + OTLPSpanExporter,自动埋点 SQLAlchemy、HTTPX、Redis,并在 lifespan 中配置与关闭)。

资料指出自动埋点只覆盖库层面,最有价值的 span 应在业务逻辑上,并给出 process_order 的示例:为 process_order、validate_inventory、charge_payment 创建嵌套 span,设置 order.id、user.id 属性,失败时设置 span 状态与错误信息,成功后添加 order_completed 事件及订单总额。上下文传播采用 W3C TraceContext,已埋点的 HTTP 客户端会自动注入 traceparent;未埋点的客户端可用 opentelemetry.propagate.inject 手动注入 traceparent 与 tracestate。导出端示例使用 Jaeger 容器命令与 OTEL_EXPORTER_OTLP_ENDPOINT 环境变量。

指标(RED 方法)

RED 方法给出三个最关键的指标:Rate(每秒请求数)、Errors(错误率,含 4xx 与 5xx)、Duration(延迟分布,p50/p95/p99)。

资料给出 Python prometheus_client 的计数器、直方图与仪表定义,以及 PrometheusMiddleware 的实现:将路径中的数字和 UUID 归一化为 {id} 以避免基数爆炸,记录进行中请求数、请求总数(按 method、endpoint、status_code)与请求耗时,并提供 metrics_endpoint 输出 generate_latest。

同时给出业务指标示例:orders_placed_total(按支付方式与地区)、order_value_dollars 直方图、active_users_current 仪表。

基数意识被视为 Prometheus 最常见的配置错误:标签取值必须有界(少于 100 个唯一值),绝不能把 user_id、request_id 或时间戳作为标签;需要按用户维度分析时应使用日志或追踪;并建议监控 prometheus_tsdb_head_series 是否无界增长。

健康检查端点

资料给出三类探针:

  • /health/live(存活):始终返回 200,绝不检查依赖,避免慢数据库导致容器被重启。
  • /health/ready(就绪):检查所有关键依赖,失败则从负载均衡中移除(不重启)。示例包含数据库与 Redis 检查,每个检查有 2 秒超时,健康返回 200,不健康返回 503 并附带各依赖状态。
  • /health/startup(启动):面向启动慢的服务(ML 模型、迁移),Kubernetes 会先等待该探针再开始存活探测,示例通过 app.state.startup_complete 判断。

并给出 Kubernetes 探针配置:livenessProbe 连续 3 次失败重启容器,readinessProbe 连续 3 次失败从 Service 移除但不重启,startupProbe 以 30 次、每次 5 秒即最多 150 秒启动时间。资料还建议将健康端点排除在访问日志与鉴权中间件之外。

告警

资料强调告警疲劳比没有告警更糟,会导致团队忽略分页并漏掉真实事故。核心原则是“对症状告警,而非对原因告警”:例如基于 CPU 使用率超 80% 的告警会在部署与批处理任务时频繁触发而被忽略;而基于用户实际遭遇错误的告警(如错误率过高)才有意义。资料以 YAML 片段形式给出告警表达式示例,原文在此处截断。

适用场景

适用于需要为生产服务建立可观测性基础的 Web 服务与微服务场景,尤其是使用 Python(FastAPI、SQLAlchemy、httpx、Redis、structlog、prometheus_client、OpenTelemetry)或 Node.js(pino)技术栈,并运行在 Kubernetes、ECS、Cloud Run 等编排平台上的服务。

限制

资料原文在“告警最佳实践”的 YAML 示例处被截断,该部分内容不完整。SLO 定义在标题中被提及,但资料未展开具体内容。资料未说明该技能的安装方式、支持的平台范围、收费情况或使用限制,这些信息暂未提供。