如何在Cloud Run中关联请求日志?

时间:2019-08-19 13:36:16

标签: logging stackdriver google-cloud-run

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

documentation说:

  

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

我知道我的结构化JSON日志正在按level/severitymessage的方式提取并按预期显示。

我正以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"  
}

1 个答案:

答案 0 :(得分:3)

哪个属性用于跟踪?

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

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

所需的格式如下:projects/[project]/traces/[trace],其中[project]是您的Google Cloud Project,即b.......0,而[trace]就是您的示例,40f...........................cc。基本参数和查询参数需要省略(没有特别的文档证明)。

下面是Google文档中{@ {3}}

中的JS代码片段。
// 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
}