Как добавить настраиваемый диапазон в Trace на ходу

Мое приложение работает на App Engine Standard и в среде выполнения Go. У меня есть этот след по моему недавнему запросу:

Отслеживание моего запроса в Stackdriver Trace

Существует большой разрыв между диапазоном urlfetch и datastore_v3, потому что мое приложение обрабатывает некоторые вычисления, связанные с процессором, в течение ~ 1000 мс.

Я хотел бы программно добавить свое вычисление как настраиваемый диапазон в представление трассировки и получить что-то вроде этого:

введите здесь описание изображения

Есть ли способ сделать это в моем приложении, написанном на Go? (здесь)


person Deleplace    schedule 21.06.2018    source источник
comment
@Flimzy Мне придется снова отредактировать заголовок и вопрос, поскольку это конкретно относится к стандарту GAE и среде выполнения go. Теги решают это только частично. Тот же вопрос относится к средам выполнения Java, Python, Go, Php и NodeJS, но требует разных ответов в каждом случае, поэтому я намерен создать 5 похожих вопросов.   -  person Deleplace    schedule 22.06.2018
comment
Все в порядке, но нет причин вставлять заглавие - теги закрывают это. Прочтите это для дальнейшего объяснения.   -  person Flimzy    schedule 22.06.2018
comment
Спасибо за ссылку на МЕТА, она действительно ясна. В этом случае мы получим 5 вопросов с одинаковым названием, которые, надеюсь, не вызовут особой путаницы.   -  person Deleplace    schedule 22.06.2018


Ответы (2)


Похоже, это может быть возможным. Из Настройка Stackdriver Trace для Go:

Альфа

Это альфа-версия пакета OpenCensus для Go. Эти библиотеки могут быть изменены обратно несовместимыми способами и не рекомендуются для производственного использования. На них не распространяются соглашения об уровне обслуживания или политика прекращения поддержки.

Stackdriver Trace может использоваться приложениями Go с помощью пакета OpenCensus для Go.

Поддержка Go в Stackdriver Trace обеспечивается OpenCensus, набором библиотек инструментов отслеживания и показателей приложений, которые работают с несколькими серверными ВМ. Последние сведения об OpenCensus for Go, а также дополнительную документацию и примеры можно найти на странице на GitHub..

Поддержка включена по умолчанию в гибкой среде, однако в документации не упоминается о стандартной среде (если это ваш случай, я бы сказал, просто попробуйте). Из App Engine:

В гибкой среде Google App Engine область доступа API Stackdriver Trace включена по умолчанию, а область OpenCensus клиентскую библиотеку можно использовать без необходимости предоставления учетных данных или идентификатора проекта.

На той же странице представлен образец кода приложения.

person Dan Cornilescu    schedule 21.06.2018
comment
Действительно, стандарт GAE явно не поддерживается в соответствии с этим документом. Я пробовал этот пакет, но (по состоянию на июнь 2018 г.) go.opencensus.io/exporter/stackdriver жалуется на панику: это не контекст App Engine, который я не мог обойти. - person Deleplace; 22.06.2018

Я мог бы заставить его работать с новой средой выполнения 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