我正在使用自结构化的JSON负载从基于Node.js/Express的Cloud Run服务进行日志记录,但无法使用trace
方法从同一请求中获取日志以进行关联。
documentation说:
我知道我的结构化JSON日志正在工作,因为level/severity
和message
正在按预期方式提取和显示。
我正在传递的trace
值正好是我使用Express提供的X-Cloud-Trace-Context
方法传递的req.get
header 传递的内容:req.get('X-Cloud-Trace-Context')
。
这是正在记录的JSON:
{
"message": "Create Query",
"level": "debug",
"severity": "DEBUG",
"trace": "40f...........................cc/131...............23;o=1"
}
以下是在Stackdriver Logging中如何显示该日志行的示例。
我也尝试过使用Special fields in structured payloads documentation中提到的
logging.googleapis.com/trace
属性。我相当确定X-Cloud-Trace-Context
header 的值对此属性无效,但是我不确定如何格式化 header 值以匹配此页面上记录的值。鉴于以上所述,我的问题是:
trace
的正确属性名称是什么? X-Cloud-Trace-Context
header 的值正确设置此属性的值格式? 这是在Stackdriver Logging中显示的完整日志消息的示例(删除了ID):
{
insertId: "..."
jsonPayload: {
level: "debug"
message: "Create Query"
trace: "40f...........................cc/131...............23;o=1"
}
labels: {
instanceId: "0.........................................2"
}
logName: "projects/b.............0/logs/run.googleapis.com%2Fstdout"
receiveTimestamp: "2019-08-16T18:05:58.816240093Z"
resource: {
labels: {
configuration_name: "a..................ing"
location: "..."
project_id: "b.............0"
revision_name: "a..................ing-01987"
service_name: "a..................ing"
}
type: "cloud_run_revision"
}
severity: "DEBUG"
timestamp: "2019-08-16T18:05:58.479527Z"
}
最佳答案
用于跟踪的正确属性名称是什么?
JSON字符串中所需的属性名称是logging.googleapis.com/trace
。这是从jsonpayload中拉出来的,并进入了trace
属性,您可以在“INFO”日志中查看示例用法。
如何根据X-Cloud-Trace-Context header 的值正确格式化此属性的值?
所需的格式如下:projects/[project]/traces/[trace]
其中[project]
是您的Google Cloud Project,即b.......0
和[trace]
,例如您的示例是40f...........................cc
。基本参数和查询参数需要省略(没有特别的文档证明)。
以下是可从此处找到的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}`;
}
以下是我在提取信息并正确设置格式方面取得的成功的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
}