Bin*_*les 5 logging stackdriver google-cloud-run
我正在使用自结构的 JSON 有效负载从基于 Node.js/Express 的 Cloud Run 服务进行日志记录,但无法从同一请求中获取日志以使用该trace
方法进行关联。
该文件说:
除非您使用 Stackdriver Logging 客户端库,否则容器日志不会自动与请求日志相关联。如果您希望在不使用客户端库的情况下进行这种关联,请使用结构化 JSON 日志行,其中包含带有传入 X-Cloud-Trace-Context 标头内容的跟踪字段。然后您的日志将与请求日志正确关联。
我知道我的结构化 JSON 日志正在按预期工作,level/severity
并且message
正在按预期提取和显示。
我传递的trace
正是X-Cloud-Trace-Context
我使用req.get
Express: 提供的方法获得的标头所传递的值req.get('X-Cloud-Trace-Context')
。
这是正在记录的 JSON:
{
"message": "Create Query",
"level": "debug",
"severity": "DEBUG",
"trace": "40f...........................cc/131...............23;o=1"
}
Run Code Online (Sandbox Code Playgroud)
以下是该日志行在 Stackdriver Logging 中的显示方式示例。
我还尝试使用结构化负载文档logging.googleapis.com/trace
中的特殊字段中提到的属性。我相当确定X-Cloud-Trace-Context
标头的值对此属性无效,但我不确定如何设置标头值的格式以匹配此页面上记录的值。
综上所述,我的问题是:
trace
?X-Cloud-Trace-Context
标题的值正确格式化此属性的值?以下是 Stackdriver Logging 中显示的完整日志消息示例(已删除 ID):
{
"message": "Create Query",
"level": "debug",
"severity": "DEBUG",
"trace": "40f...........................cc/131...............23;o=1"
}
Run Code Online (Sandbox Code Playgroud)
哪个是用于跟踪的正确属性名称?
JSON 字符串中所需的属性名称是logging.googleapis.com/trace
. 这是从 jsonpayload 中拉出的trace
属性,您可以在“INFO”日志上看到示例用法。
如何根据 X-Cloud-Trace-Context 标头的值正确格式化此属性的值?
所需的格式如下:projects/[project]/traces/[trace]
这里[project]
是你的谷歌云计算项目,即b.......0
并[trace]
从你的例子是40f...........................cc
。需要省略 base 和 query 参数(这不是特别有据可查的)。
以下是在此处找到的 Google 文档中在 JS 中执行的片段:https : //cloud.google.com/run/docs/logging
// Build structured log messages as an object.
const globalLogFields = {};
// Add log correlation to nest all log messages beneath request log in Log Viewer.
const traceHeader = req.header('X-Cloud-Trace-Context');
if (traceHeader && project) {
const [trace] = traceHeader.split('/');
globalLogFields[
'logging.googleapis.com/trace'
] = `projects/${project}/traces/${trace}`;
}
Run Code Online (Sandbox Code Playgroud)
下面是我在提取信息并正确格式化方面取得成功的 Golang 函数:
func extractTracePath(r *http.Request, app *application) string {
s := r.Header.Get("X-Cloud-Trace-Context")
traceURL, err := url.Parse(s)
if err != nil {
app.infoLog.Fatal("Invalid trace URL")
}
tracePath := traceURL.Path
trace := strings.Split(tracePath, "/")[0]
project := os.Getenv("GCLOUD_PROJECT")
partialTracePath, err := url.Parse("projects/" + project + "/traces/")
tracePath = partialTracePath.Path
tracePath = path.Join(tracePath, trace)
return tracePath
}
Run Code Online (Sandbox Code Playgroud)