Как добавить пользовательскую трассировку в приложение App Engine второго поколения в Go? - PullRequest
0 голосов
/ 22 октября 2018

Google App Engine теперь поддерживает Go 1.11 в новой стандартной среде второго поколения .При преобразовании старого стандартного приложения среды во второе поколение было неочевидно, как объединить информацию трассировки из инфраструктуры ядра приложения с настраиваемой трассировкой, которую я добавил в приложение, используя OpenCensus .

Несмотря на то, что я создал экспортер стековых драйверов и зарегистрировал трассировки, я не видел пользовательской информации трассировки в консоли стековых драйверов, связанной с входящими запросами.

1 Ответ

0 голосов
/ 22 октября 2018

Ключ, который я пропустил, - это понимание того, как контекст диапазона передается в обслуживающее приложение.Google использует заголовок X-Cloud-Trace-Context для распространения контекста диапазона в запросах, отправляемых вашим обслуживающим экземплярам, ​​а библиотека go.opencensus.io / exporter / stackdriver / пропаганда предоставляет реализацию для извлечения и сохранения этой информации в httpзапросы.

Не забудьте создать экспортер стековых драйверов и зарегистрировать трассировки для него.Документы для библиотеки экспортера показывают пример этого.

// CreateSpanFromRequest returns a context and span based on the http.Request.
// If no existing spancontext is found, this will start a new span.
// Modifies existing request to contain the generated span's context.
func CreateSpanFromRequest(name string, r *http.Request) (context.Context, *trace.Span) {
    var span *trace.Span
    ctx := r.Context()
    httpFormat := &propagation.HTTPFormat{}
    sc, ok := httpFormat.SpanContextFromRequest(r)
    if ok {
        ctx, span = trace.StartSpanWithRemoteParent(ctx, name, sc)
    } else {
        ctx, span = trace.StartSpan(ctx, name)
    }
    // Write the span context into the http.Request.  We do this to
    // to enable chaining handlers together more easily.
    httpFormat.SpanContextToRequest(span.SpanContext(), r)
    return ctx, span
}

Используя это, я смог добавить собственные обработчики в мои обработчики, которые будут правильно связаны с информацией о входящем запросе в stackdriver:

func indexHandler(w http.ResponseWriter, r *http.Request) {
    _, span := CreateSpanFromRequest("indexHandler", r)
    defer span.End()
    if r.URL.Path != "/" {
        http.NotFound(w, r)
        return
    }
    fmt.Fprint(w, "Hello, World!")
}
...