如何关联 Cloud Run 中的请求日志?

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.getExpress: 提供的方法获得的标头所传递的值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)

Jim*_*ing 5

哪个是用于跟踪的正确属性名称?

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)