Google StackDriver:如何关联(嵌套)其他日志与跟踪日志?

Google StackDriver: How do I correlate (and nest) other logs with trace logs?

请帮忙,我已经3天不成功了:/

我正在向 Google 云 运行 部署一些服务,并且希望在请求通过服务跳跃时跟踪请求并将日志与这些请求相关联。 StackDriver 在 "StackDriver Trace" 中为此提供了一个很好的平台。我在我的 asp.net 核心网络 api 中使用 Google.Cloud.Diagnostics 库。我能够成功跟踪请求,启动跨度,并在 StackDriver 跟踪时间轴中查看嵌套在跟踪内的跨度。 然而,我对如何让我的日志与跟踪和跨度相关联感到困惑?

StackDriver 文档声明将 "special fields" 写入 LogEntry 对象将被日志记录识别 API:

Special fields in structured payloads

When the Logging agent receives a structured log record, it treats the following fields specially, allowing you to set specific fields in the LogEntry object that get written to the Logging API.

All (special fields) are stripped from the payload if present.

它具体说明了 trace 字段:

The value of this field should be formatted as projects/[PROJECT-ID]/traces/[TRACE-ID], so it can be used by the Logs Viewer and the Trace Viewer to group log entries and display them in line with traces. 

来源:https://cloud.google.com/logging/docs/agent/configuration#special-fields

我对我的结构化 JSON 尝试了很多不同的东西,但 Stackdriver Trace View 无法识别我的日志并将它们嵌套在请求跟踪中。目前我在 JSON.

中包含了 trace 和 spanId

这是 StackDriver Trace 不会嵌套在跟踪中的我的日志之一:

{
 insertId: "5da6c3a200j0923bx23x2"  
 jsonPayload: {
  ConnectionId: "0HLQI121N94JM"   
  CorrelationId: null   
  RequestId: "0HLQI121N94JM:00000001"   
  RequestPath: "/graphql"   
  message: "Getting Collection of type: FakeItem in GetCollectionOfItemsAsync"   
  messageTemplate: "Getting Collection of type: FakeItem in GetCollectionOfItemsAsync"   
  spanId: "4560986706170855936"   
  timestamp: "2019-10-16T07:15:46.8713740Z"   
  trace: "projects/myProject/traces/04b4a840df0289bb9fddcd62235d3ee4"   
 }
 labels: {
  instanceId: "00bf4bf02d34e072dc1c49x8dj943x4b5609mubm0409u566ad08acf6283d2b5135651fd8f2633e7b06e7dde4b96cfddbf5373a642da0b65fb21cf87a5aad"   
 }
 logName: "projects/myProject/logs/run.googleapis.com%2Fstdout"  
 receiveTimestamp: "2019-10-16T07:15:47.113845061Z"  
 resource: {
  labels: {
   configuration_name: "baseproject-graphql"    
   location: "us-central1"    
   project_id: "myProject"    
   revision_name: "baseproject-graphql-vhglp"    
   service_name: "baseproject-graphql"    
  }
  type: "cloud_run_revision"   
 }
 timestamp: "2019-10-16T07:15:46.871489Z"  
}

这是一个由 gcp 生成并被识别的日志:

{
 httpRequest: {
  latency: "0.026068056s"   
  protocol: "HTTP/1.1"   
  remoteIp: "73.158.189.48"   
  requestMethod: "POST"   
  requestSize: "1950"   
  requestUrl: "https://baseproject-api.myUrl.com/graphql"   
  responseSize: "2768"   
  serverIp: "152.289.4.125"   
  status: 200   
  userAgent: "PostmanRuntime/7.18.0"   
 }
 insertId: "5da6c3a8j90kjo9db8346"  
 labels: {
  instanceId: "00bf4bf02d34e072dc1cfda1073f2f5ec6888d75e1d75f26259006ad08acf6283d2b5135651fd8f26398n9hu0h9h09gm08g76f67f567fb21cf87a5aad"   
 }
 logName: "projects/myProject/logs/run.googleapis.com%2Frequests"  
 receiveTimestamp: "2019-10-16T07:15:47.207098181Z"  
 resource: {
  labels: {
   configuration_name: "baseproject-graphql"    
   location: "us-central1"    
   project_id: "myProject"    
   revision_name: "baseproject-graphql-vhglp"    
   service_name: "baseproject-graphql"    
  }
  type: "cloud_run_revision"   
 }
 severity: "INFO"  
 timestamp: "2019-10-16T07:15:46.877387Z"  
 trace: "projects/myProject/traces/04b4a840df0289bb9fddcd62235d3ee4"  
}

有什么想法吗???

为了将您的日志与 Cloud 运行 请求日志相关联,您需要填充 属性 logging.googleapis.com/trace,Cloud 运行 使用此作为跟踪 属性 使用 Stackdriver Logging。

您可以在 Cloud Run logging docs and review the structured logging Node.js sample 中阅读更多详细信息。

示例中的相关代码片段:

const traceHeader = req.header('X-Cloud-Trace-Context');
if (traceHeader && project) {
  const [trace] = traceHeader.split('/');
  globalLogFields[
    'logging.googleapis.com/trace'
  ] = `projects/${project}/traces/${trace}`;
}

其中 "globalLogFields" 对象作为代码的一部分与每个单独日志条目的对象合并。