package main
import (
"context"
"encoding/json"
"fmt"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/exporters/jaeger"
"go.opentelemetry.io/otel/sdk/resource"
"go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.12.0"
"sync"
"time"
)
const (
TRACE_NAME = "mxshop-otel"
)
func funcA(ctx context.Context, wg *sync.WaitGroup) {
defer wg.Done()
tr := otel.Tracer(TRACE_NAME)
_, span := tr.Start(ctx, "func-a")
span.SetAttributes(attribute.String("name", "funA"))
type _LogStruct struct {
CurrentTime time.Time `json:"current_time"`
PassWho string `json:"pass_who"`
Name string `json:"name"`
}
logTest := _LogStruct{
CurrentTime: time.Now(),
PassWho: "bobby",
Name: "func-a",
}
b, _ := json.Marshal(logTest)
span.SetAttributes(attribute.Key("这是测试日志的key").String(string(b)))
time.Sleep(time.Second)
span.End()
}
func funcB(ctx context.Context, wg *sync.WaitGroup) {
defer wg.Done()
tr := otel.Tracer("traceName")
_, span := tr.Start(ctx, "func-b")
fmt.Println("trace:", span.SpanContext().TraceID(), span.SpanContext().SpanID())
time.Sleep(time.Second)
span.End()
}
func main() {
url := "http://192.168.66.130:14268/api/traces"
jexp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))
if err != nil {
panic(err)
}
tp := trace.NewTracerProvider(
trace.WithBatcher(jexp),
trace.WithResource(
resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceNameKey.String("mxshop-user"),
attribute.String("environment", "dev"),
attribute.Int("ID", 1),
),
),
)
otel.SetTracerProvider(tp)
ctx, cancel := context.WithCancel(context.Background())
defer func(ctx context.Context) {
ctx, cancel = context.WithTimeout(ctx, time.Second*5)
defer cancel()
if err := tp.Shutdown(ctx); err != nil {
panic(err)
}
}(ctx)
tr := otel.Tracer(TRACE_NAME)
spanCtx, span := tr.Start(ctx, "func-main")
wg := &sync.WaitGroup{}
wg.Add(2)
go funcA(spanCtx, wg)
go funcB(spanCtx, wg)
span.AddEvent("this is an event")
time.Sleep(time.Second)
wg.Wait()
span.End()
}
函数中传递span的context
最新推荐文章于 2025-12-16 21:04:50 发布
本文介绍了如何在Go程序中使用OpenTelemetry和Jaeger进行分布式追踪,包括创建TracerProvider、设置资源属性、创建Span以及记录日志和事件。
部署运行你感兴趣的模型镜像
您可能感兴趣的与本文相关的镜像
ACE-Step
音乐合成
ACE-Step
ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言
4929

被折叠的 条评论
为什么被折叠?



