Ключ, который я пропустил, - это понимание того, как контекст диапазона передается в обслуживающее приложение.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!")
}