Go Observability 是一套面向 Go 服务的可观测性规范与实践参考,目标是将结构化日志、分布式追踪、指标以及遥测优雅关闭等能力落到日常编码中。资料强调可观测性对生产服务不是可选项:每个服务都应产出结构化日志、暴露指标并传播 trace 上下文。日志使用标准库 log/slog,追踪与指标使用 OpenTelemetry。
结构化日志(slog) 日志使用 log/slog(Go 1.21+),生产环境采用 JSON handler。每行日志是键值对,而不是格式化句子。例如推荐写法为 logger.Info("user created", slog.String("user_id", user.ID), slog.Duration("latency", elapsed)),而不推荐 log.Printf("user %s created in %v", user.ID, elapsed) 这类在生产中难以解析的写法。logger 应作为依赖注入,而不是使用包级全局变量;通过 logger.With(...) 派生 child logger,让 component、method 和 request ID 只附加一次,而不是在每个调用点重复添加。
日志级别需要一致地使用:Debug 用于详细诊断信息(生产环境禁用);Info 用于正常操作,如收到请求、任务完成;Warn 用于可恢复问题,如重试成功、使用已废弃用法;Error 用于需要关注的失败,如数据库不可用、外部调用失败。对于预期内的情况(如用户未找到)绝不应使用 Error 级别,而应使用 Info 或 Warn。敏感数据绝不应记录,包括密码、令牌、API key、完整信用卡号、SSN,以及包含 PII 的原始请求体。资料给出了脱敏示例:记录 auth attempt 时只记录 user 和 success,绝不记录 password。
分布式追踪(OpenTelemetry) 每一个值得在水位图中看到的操作都应创建 span,包括入站请求、数据库调用、出站 HTTP、有意义的业务步骤,并且始终 defer span.End()。参考资料中的规则包括:span 以操作命名(如 GetUser、db.query),而不是以完整限定函数名或 doStuff 之类的名称命名;失败时调用 span.RecordError(err) 与 span.SetStatus(codes.Error, ...),否则失败请求会在追踪中显示为绿色(成功)span;在整个调用链中向下传递 ctx,链中间使用 context.Background() 会静默开启新 trace 并打断父子关系。
指标(OpenTelemetry / Prometheus) 指标类型分为三种:Counter 用于单调递增的值,如请求总数、错误总数;Gauge 用于可升可降的值,如活跃连接数、队列深度;Histogram 用于值的分布,如请求延迟、响应大小。命名遵循 <namespace><subsystem><name>_<unit> 格式:http_request_duration_seconds 正确(名称含单位);http_requests_total 正确(counter 带 _total 后缀);db_connections_active 正确(gauge 无需后缀);user_signups 错误(counter 缺少 _total);requestLatency 错误(驼峰且无单位)。指标需保持基数有界,标签应使用路由模式、方法与状态,绝不使用用户 ID、请求 ID 或原始 r.URL.Path,因为这些值会为每个取值生成新的时间序列,最终拖垮指标后端。
连接日志、追踪与指标 没有 trace ID 的日志行无法关联到产生它的请求。应在每个 handler 或 service 方法开头从 ctx 中取出 trace.SpanContextFromContext(ctx),并将 trace_id 与 span_id 附加到 logger 上。
遥测的优雅关闭 批量 span 处理器会将 span 保存在内存中。退出时必须使用带独立超时的 tp.Shutdown(ctx) 调用,否则崩溃前最后几秒(往往是最有价值的部分)的 span 无法到达 collector。
验证清单 资料给出验证清单:所有日志使用 log/slog 结构化键值对,而非 fmt.Printf 或 log.Printf;logger 以依赖方式注入,不作为全局使用;日志输出中无敏感数据;trace 上下文通过 context.Context 在所有函数调用中传播;为重要操作(数据库调用、HTTP 请求、业务逻辑)创建 span;span 通过 span.RecordError(err) 记录错误并设置错误状态;指标遵循 _seconds、_total、_bytes 命名约定;指标中无高基数标签(用户 ID、请求 ID);服务退出时遥测 provider 优雅关闭;日志条目包含 trace ID 以便关联。
资料还提到可按需加载详细参考文件:references/slog.md(handler 设置、logger 注入、child logger)、references/tracing.md(tracer provider、span、传播、关闭)、references/metrics.md(指标定义、HTTP 插桩),仅当上述章节不够用时才读取。关于安装命令、平台支持、收费与价格等事实,资料未提供。