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

How do I correlate request logs in Cloud Run?

我正在使用自结构 JSON 有效负载从我的节点进行日志记录。js/Express 基于云 运行 服务,我无法从同一请求中获取日志以使用trace 方法。

documentation 说:

Container logs are not automatically correlated to request logs unless you use a Stackdriver Logging client library. If you want this correlation without using a client library, use a structured JSON log line that contains a trace field with the content of the incoming X-Cloud-Trace-Context header. Then your logs will be correctly correlated to the request log.

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

我作为 trace 的值传递的正是 X-Cloud-Trace-Context header 传递的值,这是我使用 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 中的示例。

我也试过使用 logging.googleapis.com/trace 属性 Special fields in structured payloads documentation 中提到的。我相当确定 X-Cloud-Trace-Context header 的值对此 属性 无效,但我不确定如何格式化 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 云项目,即 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
}