K8s Pod 中的应用如何接入 GCP Error Reporting(Stackdriver)?

K8s 应用接入 GCP Error Reporting 的两种方式:写符合格式的结构化日志到 stdout(含 stack_trace 与 severity=ERROR),或用客户端库直接调用 API。GKE 启用工作负载日志采集后,可将符合要求的日志送入 Cloud Logging 并识别错误。本文给出日志格式要求与配置。

最佳实践
K8s Pod 中的应用如何接入 GCP Error Reporting(Stackdriver)?封面

GKE 上的标准做法是"日志即错误":应用把异常堆栈以特定 JSON 格式写到 stdout,GKE 启用工作负载日志采集后送入 Cloud Logging,Error Reporting 可从支持格式的堆栈和资源类型中识别错误;stack_trace 不是唯一支持字段。

方式一:结构化日志(推荐)

应用输出这样的 JSON 行到 stdout:

{
  "severity": "ERROR",
  "message": "支付回调处理失败",
  "stack_trace": "java.lang.NullPointerException: payment was null\n\tat com.shop.PayService.handle(PayService.java:42)",
  "context": {"httpRequest": {"url": "/callback/pay", "responseStatusCode": 500}}
}

要点:设置合适的 severity,并使用支持语言格式的完整堆栈。可放在 stack_trace、exception、message 中,也支持保存在单个多行 textPayload 中;纯文本错误消息可按文档显式声明 ReportedErrorEvent。Error Reporting 会按堆栈指纹自动聚合同类错误、计数并支持告警。

方式二:客户端库直连 API

Java/Node/Python/Go 都有 Error Reporting 客户端库,按各语言 SDK 的接口上报异常或错误事件。GKE 中可用 Workload Identity Federation 配置工作负载身份与上报权限;其他 K8s 环境需另行配置合适的 Google Cloud 身份与认证,避免分发密钥文件。

注意事项

  • 容器采集建议输出单行 JSON;普通多行堆栈需配置并验证多行合并,使完整堆栈成为一个日志条目,不强制必须是 JSON;
  • 非 GKE 集群(自建 K8s)需要部署 Cloud Logging 代理并配置认证;
  • 错误分组依赖堆栈指纹,分组还会进行规范化,随机 ID 或消息变化不一定拆散分组,应检查实际分组结果。

常见问题(FAQ)

Q:println 打印的堆栈能被识别吗? 可以——支持语言格式的完整堆栈也可在一个多行 textPayload 中识别;采集时需避免把各行拆成独立条目。

Q:能自定义错误分组规则吗? Error Reporting 按堆栈指纹自动分组,不支持自定义;控制分组靠规范异常抛出位置。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台