Files
kratos-bootstrap/tracer.go
2023-10-26 16:46:14 +08:00

102 lines
2.7 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 (
"context"
"errors"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
"go.opentelemetry.io/otel/exporters/zipkin"
"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"
"github.com/tx7do/kratos-bootstrap/gen/api/go/conf/v1"
)
// NewTracerExporter 创建一个导出器支持jaeger和zipkin
func NewTracerExporter(exporterName, endpoint string) (traceSdk.SpanExporter, error) {
if exporterName == "" {
exporterName = "jaeger"
}
switch exporterName {
case "zipkin":
return NewZipkinExporter(endpoint)
case "jaeger":
fallthrough
case "otlptracehttp":
return NewOtlpHttpExporter(endpoint)
case "otlptracegrpc":
return NewOtlpGrpcExporter(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
}
// NewZipkinExporter 创建一个zipkin导出器
func NewZipkinExporter(endpoint string) (traceSdk.SpanExporter, error) {
return zipkin.New(endpoint)
}
//// NewJaegerExporter 创建一个jaeger导出器
//func NewJaegerExporter(endpoint string) (traceSdk.SpanExporter, error) {
// return jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(endpoint)))
//}
// NewOtlpHttpExporter 创建一个OTLP HTTP导出器
func NewOtlpHttpExporter(endpoint string) (traceSdk.SpanExporter, error) {
return otlptracehttp.New(context.Background(), otlptracehttp.WithEndpoint(endpoint))
}
// NewOtlpGrpcExporter 创建一个OTLP GRPC导出器
func NewOtlpGrpcExporter(endpoint string) (traceSdk.SpanExporter, error) {
return otlptracegrpc.New(context.Background(), otlptracegrpc.WithEndpoint(endpoint))
}