blob: 74770f7b0e545c89a1a16a828f41bc10e2074123 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package trace
import (
"errors"
"fmt"
)
import (
"github.com/dubbogo/gost/log/logger"
"go.opentelemetry.io/contrib/propagators/b3"
"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.7.0"
)
type ExporterConfig struct {
Exporter string
Endpoint string
SampleMode string
SampleRatio float64
Propagator string
ServiceNamespace string
ServiceName string
ServiceVersion string
}
type Exporter interface {
GetTracerProvider() *sdktrace.TracerProvider
GetPropagator() propagation.TextMapPropagator
}
type DefaultExporter struct {
TracerProvider *sdktrace.TracerProvider
Propagator propagation.TextMapPropagator
}
func (e *DefaultExporter) GetTracerProvider() *sdktrace.TracerProvider {
return e.TracerProvider
}
func (e *DefaultExporter) GetPropagator() propagation.TextMapPropagator {
return e.Propagator
}
// NewExporter is an absolute function with @customFunc to create a spec exporter
func NewExporter(config *ExporterConfig, customFunc func() (sdktrace.SpanExporter, error)) (tracerProvider *sdktrace.TracerProvider, propagator propagation.TextMapPropagator, err error) {
if config == nil {
err = errors.New("otel exporter config is nil")
return
}
exporter, err := customFunc()
if err != nil {
err = fmt.Errorf("failed to create %s exporter: %v", config.Exporter, err)
logger.Error(err)
return
}
var samplerOption sdktrace.TracerProviderOption
switch config.SampleMode {
case "ratio":
samplerOption = sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.TraceIDRatioBased(config.SampleRatio)))
case "always":
samplerOption = sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.AlwaysSample()))
case "never":
samplerOption = sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.NeverSample()))
default:
err = fmt.Errorf("otel sample mode %s not supported", config.SampleMode)
logger.Error(err)
return
}
tracerProvider = sdktrace.NewTracerProvider(
samplerOption,
sdktrace.WithBatcher(exporter),
sdktrace.WithResource(resource.NewSchemaless(
semconv.ServiceNamespaceKey.String(config.ServiceNamespace),
semconv.ServiceNameKey.String(config.ServiceName),
semconv.ServiceVersionKey.String(config.ServiceVersion),
)),
)
switch config.Propagator {
case "w3c":
propagator = propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})
case "b3":
b3Propagator := b3.New(b3.WithInjectEncoding(b3.B3MultipleHeader | b3.B3SingleHeader))
propagator = propagation.NewCompositeTextMapPropagator(b3Propagator, propagation.Baggage{})
}
return tracerProvider, propagator, nil
}