Files
kratos-bootstrap/tracer.go
2023-05-21 10:04:15 +08:00

85 lines
2.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package bootstrap
import (
"errors"
"go.opentelemetry.io/otel/exporters/jaeger"
"go.opentelemetry.io/otel/exporters/zipkin"
"github.com/tx7do/kratos-bootstrap/gen/api/go/conf/v1"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/sdk/resource"
traceSdk "go.opentelemetry.io/otel/sdk/trace"
semConv "go.opentelemetry.io/otel/semconv/v1.4.0"
)
// NewJaegerExporter 创建一个jaeger导出器
func NewJaegerExporter(endpoint string) (traceSdk.SpanExporter, error) {
return jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(endpoint)))
}
// NewZipkinExporter 创建一个zipkin导出器
func NewZipkinExporter(endpoint string) (traceSdk.SpanExporter, error) {
return zipkin.New(endpoint)
}
// NewTracerExporter 创建一个导出器支持jaeger和zipkin
func NewTracerExporter(exporterName, endpoint string) (traceSdk.SpanExporter, error) {
if exporterName == "" {
exporterName = "jaeger"
}
switch exporterName {
case "jaeger":
return NewJaegerExporter(endpoint)
case "zipkin":
return NewZipkinExporter(endpoint)
default:
return nil, errors.New("exporter type not support")
}
}
// NewTracerProvider 创建一个链路追踪器
func NewTracerProvider(cfg *conf.Tracer, serviceInfo *ServiceInfo) error {
if cfg == nil {
return errors.New("tracer config is nil")
}
if cfg.Sampler == 0 {
cfg.Sampler = 1.0
}
if cfg.Env == "" {
cfg.Env = "dev"
}
opts := []traceSdk.TracerProviderOption{
traceSdk.WithSampler(traceSdk.ParentBased(traceSdk.TraceIDRatioBased(cfg.Sampler))),
traceSdk.WithResource(resource.NewSchemaless(
semConv.ServiceNameKey.String(serviceInfo.Name),
semConv.ServiceVersionKey.String(serviceInfo.Version),
semConv.ServiceInstanceIDKey.String(serviceInfo.Id),
attribute.String("env", cfg.Env),
)),
}
if len(cfg.Endpoint) > 0 {
exp, err := NewTracerExporter(cfg.Batcher, cfg.Endpoint)
if err != nil {
panic(err)
}
opts = append(opts, traceSdk.WithBatcher(exp))
}
tp := traceSdk.NewTracerProvider(opts...)
if tp == nil {
return errors.New("create tracer provider failed")
}
otel.SetTracerProvider(tp)
return nil
}