K8s Pod 中的应用如何接入 GCP Error Reporting(Stackdriver)?
K8s 应用接入 GCP Error Reporting 的两种方式:写符合格式的结构化日志到 stdout(含 stack_trace 与 severity=ERROR),或用客户端库直接调用 API。GKE 自动采集 stdout 日志并识别错误。本文给出日志格式要求与配置。
GKE 上的标准做法是"日志即错误":应用把异常堆栈以特定 JSON 格式写到 stdout,GKE 的日志代理自动采集进 Cloud Logging,Error Reporting 按 stack_trace 字段自动识别聚合成错误事件——无需额外组件。
方式一:结构化日志(推荐)
应用输出这样的 JSON 行到 stdout:
{
"severity": "ERROR",
"message": "支付回调处理失败",
"stack_trace": "java.lang.NullPointerException\n\tat com.shop.PayService...",
"context": {"httpRequest": {"url": "/callback/pay", "responseStatusCode": 500}}
}
要点:severity ≥ ERROR、含 stack_trace 字段(或 exception 堆栈文本)。Error Reporting 会按堆栈指纹自动聚合同类错误、计数并支持告警。
方式二:客户端库直连 API
Java/Node/Python/Go 都有 Error Reporting 客户端库,直接 report(exception)。K8s 中用 Workload Identity 绑定 GCP 服务账号授权,避免密钥文件。
注意事项
- 日志必须是单条 JSON——多行堆栈要用 fluent-bit 的多行解析合并后再打 stack_trace;
- 非 GKE 集群(自建 K8s)需要部署 Cloud Logging 代理并配置认证;
- 错误分组依赖堆栈指纹,频繁变化的堆栈文本(如带随机 ID)会拆散分组。
观测云对照
观测云的错误追踪能力类似:应用日志或 APM 链路中的 ERROR 自动聚合为错误事件,按堆栈指纹聚类、计数、关联链路上下文,告警直达钉钉/企微——且与云厂商无关,多云与自建机房均可用。
常见问题(FAQ)
Q:println 打印的堆栈能被识别吗? 不能——必须进 JSON 的 stack_trace 字段;多行堆栈先合并。
Q:能自定义错误分组规则吗? Error Reporting 按堆栈指纹自动分组,不支持自定义;控制分组靠规范异常抛出位置。