Мы установили отношения «родитель-ребенок» для регистрации нашей системы согласно этой документации. Мы также извлекаем traceId
для заголовка X-Cloud-Trace-Context
, используя формат, определенный здесь .
Журналы красиво группируются в консоли Stackdriver при работе только с одной службой, но трассировка может охватывать несколько сервисов. Поведение, которое мы наблюдаем, состоит в том, что дочерние журналы всех служб связаны с журналом запросов, даже если мы фильтруем представление через консоль. Я бы подумал, что определение ресурса должно было помочь отфильтровать это представление в консоли? т.е. если мы фильтровали, чтобы видеть только службу B, мы не должны видеть дочерние журналы, связанные со службой A?
Вот фрагмент кода, который создает родительский и дочерний элементы
import (
"cloud.google.com/go/logging"
"google.golang.org/genproto/googleapis/api/monitoredres"
"os"
"time"
)
//ParentLogger constructs a logger to bundle child log lines to
func ParentLogger(client *logging.Client) *logging.Logger {
initParentLoggerOnce.Do(func() {
commonResource := &monitoredres.MonitoredResource{
Labels: map[string]string{
"module_id": os.Getenv("GAE_SERVICE"),
"project_id": os.Getenv("GOOGLE_CLOUD_PROJECT"),
"version_id": os.Getenv("GAE_VERSION"),
},
Type: "gae_app",
}
parentLogger = client.Logger(
"log_parent",
logging.CommonLabels(map[string]string{}),
logging.CommonResource(commonResource),
)
})
return parentLogger
}
//ChildLogger constructs a logger representing individual log lines
func ChildLogger(client *logging.Client) *logging.Logger {
initChildLoggerOnce.Do(func() {
commonResource := &monitoredres.MonitoredResource{
Labels: map[string]string{
"module_id": os.Getenv("GAE_SERVICE"),
"project_id": os.Getenv("GOOGLE_CLOUD_PROJECT"),
"version_id": os.Getenv("GAE_VERSION"),
},
Type: "gae_app",
}
childLogger = client.Logger(
"log_child",
logging.CommonLabels(map[string]string{}),
logging.CommonResource(commonResource),
)
})
return childLogger
}
//LogRequest posts the parent request log to stackdriver
func (l *gcpRequestLogger) LogRequest() error {
var rSize int64 = 0 //simplified for stack overflow post
rStatus := 200 //simplified for stack overflow post
//
traceID, spanID, sampled := deconstructTraceContext(l.r.Header.Get("X-Cloud-Trace-Context"))
l.parentLogger.Log(logging.Entry{
HTTPRequest: &logging.HTTPRequest{
Request: l.r,
Latency: time.Since(l.start),
ResponseSize: rSize,
Status: rStatus,
RemoteIP: l.r.RemoteAddr,
},
Timestamp: time.Now().UTC(),
Severity: l.severity,
Trace: traceID,
SpanID: spanID,
Payload: l.requestLogPayload,
TraceSampled: sampled,
})
return nil
}
Пока мы может начать новую трассировку для каждого запроса на микросервисе для полезной группировки журналов запросов, но тогда мы потеряем красивое глобальное представление в Stackdriver Trace (не говоря уже о журналах, связанных с трассировкой). Мы сделали что-то не так или это пробел в работе Stackdriver Logging?
ОБНОВЛЕНИЕ: добавлено изображение поведения, которое мы видим. Последняя группа журналов не ожидалась, так как они были сгенерированы нашим сервисом config
, и в этом представлении я фильтрую сервисом support-portal
.