66 lines
1.7 KiB
Go
66 lines
1.7 KiB
Go
package apm
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"strings"
|
|
|
|
"go.opentelemetry.io/otel"
|
|
"go.opentelemetry.io/otel/attribute"
|
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
|
"go.opentelemetry.io/otel/sdk/resource"
|
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
|
"google.golang.org/grpc/credentials"
|
|
|
|
"github.com/chaitin/panda-wiki/config"
|
|
)
|
|
|
|
type Tracer struct {
|
|
Shutdown func(context.Context) error
|
|
}
|
|
|
|
func NewTracer(config *config.Config) (*Tracer, error) {
|
|
serviceName := config.GetString("apm.service_name")
|
|
collectorURL := config.GetString("apm.otel_exporter_otlp_endpoint")
|
|
insecure := config.GetString("apm.insecure")
|
|
var secureOption otlptracegrpc.Option
|
|
|
|
if strings.ToLower(insecure) == "false" || insecure == "0" || strings.ToLower(insecure) == "f" {
|
|
secureOption = otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, ""))
|
|
} else {
|
|
secureOption = otlptracegrpc.WithInsecure()
|
|
}
|
|
|
|
exporter, err := otlptrace.New(
|
|
context.Background(),
|
|
otlptracegrpc.NewClient(
|
|
secureOption,
|
|
otlptracegrpc.WithEndpoint(collectorURL),
|
|
),
|
|
)
|
|
if err != nil {
|
|
log.Fatalf("Failed to create exporter: %v", err)
|
|
}
|
|
resources, err := resource.New(
|
|
context.Background(),
|
|
resource.WithAttributes(
|
|
attribute.String("service.name", serviceName),
|
|
attribute.String("library.language", "go"),
|
|
),
|
|
)
|
|
if err != nil {
|
|
log.Fatalf("Could not set resources: %v", err)
|
|
}
|
|
|
|
otel.SetTracerProvider(
|
|
sdktrace.NewTracerProvider(
|
|
sdktrace.WithSampler(sdktrace.AlwaysSample()),
|
|
sdktrace.WithBatcher(exporter),
|
|
sdktrace.WithResource(resources),
|
|
),
|
|
)
|
|
|
|
return &Tracer{Shutdown: exporter.Shutdown}, nil
|
|
}
|