英文:
How to create Google Cloud Logging entries that are correlated with the request log's trace ID?
问题
使用Google Cloud Logging Go客户端库,可以在Entry
结构体上指定Trace
字段:https://cloud.google.com/logging/docs/reference/libraries#log-entries。在Cloud Run上,默认情况下,请求会被记录并附带一个跟踪ID。我该如何获取这个跟踪ID,并在我创建的日志中指定它,以便可以通过引起日志的请求进行关联呢?
英文:
Using the Google Cloud Logging client library for go, it's possible to specify the Trace
field on an Entry
struct: https://cloud.google.com/logging/docs/reference/libraries#log-entries. By default, on Cloud Run, requests are logged with a trace ID. How can I get this trace ID and specify it in the logs I create so I can correlate logs by the request that caused them?
答案1
得分: 2
云运行接收到的请求会带有头部信息 X-Cloud-Trace-Context
。该头部实际上是 traceID/anotherID
的格式。当你使用 cloud.google.com/go/logging
包创建一个日志 Entry
时,你需要在 Trace
字段中指定格式为 projects/{$project_id}/traces/{$trace_id}
的值,其中包括你的项目 ID 和来自头部的追踪 ID。
在我的代码中,我从请求头中获取追踪 ID,并将其设置到请求上下文 c
中,如下所示:
ctx := context.WithValue(c.Context(), logging.TraceId{}, c.Get("X-Cloud-Trace-Context"))
其中 logging
是我自定义的日志包。然后在日志代码中,我有以下方法将上下文中的追踪附加到云日志条目中:
func populateLogsEntryWithTrace(ctx context.Context, entry logging.Entry) logging.Entry {
traceID, ok := ctx.Value(TraceId{}).(string)
if ok {
trace := strings.Split(traceID, "/")[0]
entry.Trace = fmt.Sprintf("projects/%s/traces/%s", projectID, trace)
}
return entry
}
英文:
Requests that come in to Cloud Run will have the header X-Cloud-Trace-Context
. This header is actually traceID/anotherID
. When you create a logs Entry
with the cloud.google.com/go/logging
package, you need to specify the Trace
field in the format projects/{$project_id}/traces/{$trace_id}
with your project ID and the trace ID from the header.
In my code, I get the trace ID from the request header and set it on the request context c
like:
ctx := context.WithValue(c.Context(), logging.TraceId{}, c.Get("X-Cloud-Trace-Context"))
where logging
is my own custom logging package. Then inside logging code, I have this method to attach a trace from a context to a Cloud logging entry:
func populateLogsEntryWithTrace(ctx context.Context, entry logging.Entry) logging.Entry {
traceID, ok := ctx.Value(TraceId{}).(string)
if ok {
trace := strings.Split(traceID, "/")[0]
entry.Trace = fmt.Sprintf("projects/%s/traces/%s", projectID, trace)
}
return entry
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论