mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-11-12 21:44:22 +08:00
71 lines
2.1 KiB
Go
71 lines
2.1 KiB
Go
// Copyright 2025 linux.do
|
|
// Copyright 2026 Arctel.net
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package trace
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"go.opentelemetry.io/otel/attribute"
|
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
|
|
"go.opentelemetry.io/otel/sdk/resource"
|
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
|
)
|
|
|
|
// newTracerProvider combines SDK and application resources with a batched exporter.
|
|
func newTracerProvider(cfg Config) (*sdktrace.TracerProvider, error) {
|
|
// 获取主机名和容器信息
|
|
hostname, err := os.Hostname()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 业务属性不绑定 schema URL,合并时继承 resource.Default() 的 SDK 内置版本,避免 semconv 与 otel/sdk 升级不同步。
|
|
r, err := resource.Merge(
|
|
resource.Default(),
|
|
resource.NewSchemaless(
|
|
attribute.String("service.name", cfg.AppName),
|
|
attribute.String("host.name", hostname),
|
|
attribute.String("k8s.namespace.name", os.Getenv("KUBERNETES_NAMESPACE")),
|
|
attribute.String("k8s.pod.name", os.Getenv("KUBERNETES_POD_NAME")),
|
|
attribute.String("k8s.pod.uid", os.Getenv("KUBERNETES_POD_UID")),
|
|
),
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 初始化 Exporter
|
|
traceExporter, err := newTraceExporter(context.Background(), cfg.ExportProtocol)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 初始化 Trace
|
|
tracerProvider := sdktrace.NewTracerProvider(
|
|
sdktrace.WithBatcher(traceExporter),
|
|
sdktrace.WithResource(r),
|
|
sdktrace.WithSampler(ParentBasedRatioSampler(cfg.SamplingRate)),
|
|
)
|
|
return tracerProvider, nil
|
|
}
|
|
|
|
// newTraceExporter selects the OTLP wire transport without changing existing gRPC defaults.
|
|
// The SDK exporters read standard OTEL_EXPORTER_OTLP_* endpoint and header settings.
|
|
func newTraceExporter(ctx context.Context, protocol string) (sdktrace.SpanExporter, error) {
|
|
protocol = strings.ToLower(strings.TrimSpace(protocol))
|
|
switch protocol {
|
|
case "", "grpc":
|
|
return otlptracegrpc.New(ctx)
|
|
case "http/protobuf":
|
|
return otlptracehttp.New(ctx)
|
|
default:
|
|
return nil, fmt.Errorf("unsupported OTLP trace protocol %q", protocol)
|
|
}
|
|
}
|