1 Star 0 Fork 0

天雨流芳 / go-micro-framework

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
agent.go 2.37 KB
一键复制 编辑 原始数据 按行查看 历史
天雨流芳 提交于 2024-04-01 17:43 . 链路追踪逻辑修改
package trace
import (
log "gitee.com/tylf2018/go-micro-framework/pkg/logger"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/jaeger"
"go.opentelemetry.io/otel/exporters/zipkin"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.18.0"
"sync"
)
/*
初始化不同的 export 的设置
*/
const (
kindJaeger = "jaeger"
kindZipkin = "zipkin"
)
var (
// set struct 空结构体 不占内存 zerobase
agents = make(map[string]struct{})
lock sync.Mutex
)
func InitAgent(o *Options) {
lock.Lock()
defer lock.Unlock()
_, ok := agents[o.Endpoint]
if ok {
return
}
err := startAgent(o)
if err != nil {
return
}
agents[o.Endpoint] = struct{}{}
}
func startAgent(o *Options) error {
var sexp sdktrace.SpanExporter
var err error
if err = o.Validate(); err != nil {
log.ErrorF("trace options validation error: %v", err)
return err
}
opts := []sdktrace.TracerProviderOption{
// WithSampler() 设置采样策略
// ParentBased() 根据上一个 Span 是否抽样来决定当前 Span 是否抽样
// 使用采样什么策略
// AlwaysSample(): 总是对 span 进行采样
// NeverSample(): 总是对 span 不进行采样
// TraceIdRatioBased(double): 基于 trace ID 的一定比例进行采样
sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.TraceIDRatioBased(o.Sampler))),
// semconv.ServiceNameKey.String(o.Name): 将 o.Name 转换为 attribute.KeyValue 类型
// 设置链路追踪 提供者 的名字
sdktrace.WithResource(resource.NewSchemaless(semconv.ServiceNameKey.String(o.Name))),
}
if len(o.Endpoint) > 0 {
switch o.Batcher {
case kindJaeger:
sexp, err = jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(o.Endpoint)))
if err != nil {
return err
}
case kindZipkin:
sexp, err = zipkin.New(o.Endpoint)
if err != nil {
return err
}
}
opts = append(opts, sdktrace.WithBatcher(sexp))
}
tp := sdktrace.NewTracerProvider(opts...)
// 设置全局提取器
otel.SetTracerProvider(tp)
// 设置全局的传播器
otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
// 设置全局错误处理函数
otel.SetErrorHandler(otel.ErrorHandlerFunc(func(err error) {
log.ErrorF("[otel] error: %v", err)
}))
return nil
}
1
https://gitee.com/tylf2018/go-micro-framework.git
git@gitee.com:tylf2018/go-micro-framework.git
tylf2018
go-micro-framework
go-micro-framework
4cc90ded505a

搜索帮助