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 в каждой функции? Это правильный способ думать об этом?