【问题标题】:How do I correlate request logs in Cloud Run?如何关联 Cloud Run 中的请求日志?
【发布时间】:2019-12-24 17:46:56
【问题描述】:

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

documentation 说:

容器日志不会自动与请求日志相关联,除非 您使用 Stackdriver Logging 客户端库。如果你想要这个 不使用客户端库的关联,使用结构化的 JSON 日志 包含带有传入内容的跟踪字段的行 X-Cloud-Trace-Context 标头。然后您的日志将正确 与请求日志相关。

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

我作为trace 的值传递的正是X-Cloud-Trace-Context 标头传递的值,我使用Express 提供的req.get 方法获得: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 标头的值对此属性无效,但我不确定如何格式化标头值以匹配此页面上记录的值。


鉴于上述情况,我的问题是:

  • trace 使用的正确属性名称是什么?
  • 如何根据X-Cloud-Trace-Context 标头的值正确格式化此属性的值?

以下是 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"  
}

【问题讨论】:

    标签: logging stackdriver google-cloud-run


    【解决方案1】:

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

    您的 JSON 字符串中所需的属性名称是 logging.googleapis.com/trace。这是从 jsonpayload 中提取并进入 trace 属性,您可以在“INFO”日志中查看示例用法。

    如何根据 X-Cloud-Trace-Context 标头的值正确格式化此属性的值?

    所需格式如下:projects/[project]/traces/[trace] 其中[project] 是您的Google Cloud 项目,即b.......0 和[trace],因为您的示例为40f...........................cc。需要省略 base 和 query 参数(这不是特别有据可查的)。

    以下是在此处找到的 Google 文档中以 JS 执行的 sn-p: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
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-24
      • 1970-01-01
      • 2021-11-07
      • 2019-12-20
      • 2020-03-31
      • 2021-01-08
      • 2013-04-04
      • 2020-05-17
      • 2020-12-23
      相关资源
      最近更新 更多