Google StackDriver: Как соотнести (и вложить) другие журналы с журналами трассировки? - PullRequest
2 голосов
/ 16 октября 2019

Пожалуйста, помогите, у меня не получилось в течение 3 дней: /

Я развернул несколько сервисов в Google Cloud Run и хотел бы отслеживать запросы и сопоставлять журналы с этими запросами как запросыпрыгать через услуги. StackDriver имеет отличную платформу для этого в «StackDriver Trace». Я использую библиотеку Google.Cloud.Diagnostics в моих основных веб-API asp.net. Я могу успешно отслеживать запросы, запускать пролеты и видеть промежутки, вложенные в трассировку на временной шкале StackDriver Trace. Однако я не знаю, как заставить мои журналы соотноситься с трассами и интервалами?

Документы StackDriver утверждают, что запись «специальных полей» в объект LogEntry будет распознанас помощью Logging 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. 

source: 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"  
}

Есть мысли ???

1 Ответ

2 голосов
/ 16 октября 2019

Чтобы соотнести ваши журналы с журналом запросов Cloud Run, вам необходимо заполнить свойство logging.googleapis.com/trace, Cloud Run использует его в качестве свойства трассировки для ведения журнала Stackdriver.

Подробнее можно прочитать в Документация по журналу 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" объединяется с объектом для каждой отдельной записи журнала как часть кода.

...