Игнорирование группировки журналов Stackdriver в определении отслеживаемого ресурса - PullRequest
4 голосов
/ 15 января 2020

Мы установили отношения «родитель-ребенок» для регистрации нашей системы согласно этой документации. Мы также извлекаем 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. enter image description here

...