我正在使用自结构化的JSON负载从基于Node.js/Express的Cloud Run服务进行日志记录,但无法使用trace方法从同一请求中获取日志以进行关联。

documentation说:



我知道我的结构化JSON日志正在工作,因为level/severitymessage正在按预期方式提取和显示。

我正在传递的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
    }
    

    09-15 18:00