Я мог бы заставить его работать с новой средой выполнения AppEngine для Go 1.11 (в настоящее время в стадии бета-тестирования) и OpenCensus с экспортер Stackdriver.
Чтобы прикрепить свой настраиваемый диапазон к основной трассировке запроса, я использую эту служебную функцию:
// Start a new span "With Remote Parent"
func startSpanfWRT(r *http.Request, msg string, args ...interface{}) (c2 context.Context, endSpan func()) {
caption := fmt.Sprintf(msg, args...)
c := r.Context()
spanContext, ok := (&propagation.HTTPFormat{}).SpanContextFromRequest(r)
if !ok {
return c, func() {}
}
var span *trace.Span
c2, span = trace.StartSpanWithRemoteParent(c, caption, spanContext)
endSpan = func() {
span.End()
}
return c2, endSpan
}
Обратите внимание, что для этого требуется аргумент *http.Request
в качестве аргумента (context.Context
здесь недостаточно).
Вот исходный код примера приложения < / а>.
Поскольку диапазон должен быть запущен, а затем остановлен, функция start возвращает обратный вызов "end", а также новый контекст.
Вызов startSpanfWRT
несколько раз - это нормально, и они могут перекрываться. Это требует передачи *http.Request
, что не очень удобно (обычно мы передаем только контексты).
Однако после вызова startSpanfWRT
вы можете удобно добавлять дочерние промежутки, просто обращая внимание на соответствующие контексты:
c2, childSpan := trace.StartSpan(c, caption)
person
Deleplace
schedule
05.12.2018