datadog apm, opentracing, и приложения go

Я пытаюсь обернуть свой мозг вокруг APM Datadog и как включить его в приложение Go. Я читал эти документы: https://docs.datadoghq.com/tracing/setup/go/

но я до сих пор не совсем понимаю, как это работает. Например

Допустим, у меня есть приложение (здесь suedo-код), подобное этому, которое потребляет некоторые сообщения kafka, а затем записывает пакеты в базу данных эластичного поиска:

package main

import (
    "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
    "golang.org/x/text/message"
)

func main() {

    tracer.Start(tracer.WithServiceName("program1"))
    defer tracer.Stop()

    getKafaMessages()
}

func getKafaMessages() {
    for {
        select {
        case msg := <-partitionConsumer.Messages():
            consumed++

            message.MsgValue = msg.Value

            messages = append(messages, *msg)

            if consumed >= 200 {

                sendMessages(messages)

                msgs.Msgs = nil
                consumed = 0

            }
        case <-signals:
            break ConsumerLoop
        }
    }
}

func sendMessages(messages []string) {
    //send `messages` to some where like elasticsearch
}

Для меня, чтобы сделать трассировку, чтобы я мог видеть, сколько времени у меня занимает получение сообщений от Кафки getKafkaMessages() и сколько времени нужно, чтобы написать в asticsearch sendMessages... мне просто нужно добавить трассировщик к основному, но ничего не делать в таких функциях, как это?

package main

import (
    "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
    "golang.org/x/text/message"
)

func main() {

    tracer.Start(tracer.WithServiceName("some-app"))
    defer tracer.Stop()

    span := tracer.StartSpan("kafka-to-es", tracer.ResourceName("consumer"))
    defer span.Finish()
    span.SetTag("env", "dev", "region", "us-east-1")

    getKafaMessages()
}

func getKafaMessages() {
    for {
        select {
        case msg := <-partitionConsumer.Messages():
            consumed++

            message.MsgValue = msg.Value

            messages = append(messages, *msg)

            if consumed >= 200 {

                sendMessages(messages)

                msgs.Msgs = nil
                consumed = 0

            }
        case <-signals:
            break ConsumerLoop
        }
    }
}

func sendMessages(messages []string) {
    //send `messages` to some where like elasticsearch
}

Я также немного читал на http://opentracing.io/ но до сих пор не могу обернуть это вокруг себя.

Я думаю, что понимаю концепцию span и child, поэтому я запускаю span в начале приложения и, так сказать, запускаю child в каждой функции? Это правильный способ думать об этом?

0 ответов

Другие вопросы по тегам