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



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

我正在将一些服务部署到Google Cloud Run,并希望在请求通过服务时跟踪请求并将日志与这些请求相关联。StackDriver在"StackDriver Trace"中有一个很好的平台。我正在 asp.net 核心 Web API 中使用 Google.Cloud.Diagnostics 库。我能够成功跟踪请求并启动跨度,并在 StackDriver 跟踪时间线中查看嵌套在跟踪中的跨度。但是,我对如何让我的日志与跟踪和跨度相关联感到困惑?

StackDriver 文档指出,将"特殊字段"写入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 跟踪视图无法识别我的日志并将它们嵌套在请求跟踪中。目前,我将跟踪和spanId都包含在JSON中。

这是我的一个日志,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 Run 请求日志相关联,您需要填充属性logging.googleapis.com/trace,Cloud Run 将其用作堆栈驱动程序日志记录的跟踪属性。

您可以在 Cloud Run 日志记录文档中阅读更多详细信息,并查看结构化日志记录 Node.js 示例。

示例中的相关代码片段:

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"对象作为代码的一部分与每个单独日志条目的对象合并。

最新更新