Archived
实现首轮协议与 Transit 签名 PoC
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
package telemetry
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"go.opentelemetry.io/otel/metric"
|
||||
metricnoop "go.opentelemetry.io/otel/metric/noop"
|
||||
sdkmetric "go.opentelemetry.io/otel/sdk/metric"
|
||||
sdkresource "go.opentelemetry.io/otel/sdk/resource"
|
||||
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
tracenoop "go.opentelemetry.io/otel/trace/noop"
|
||||
)
|
||||
|
||||
type Providers struct {
|
||||
Tracer trace.TracerProvider
|
||||
Meter metric.MeterProvider
|
||||
|
||||
shutdown func(context.Context) error
|
||||
}
|
||||
|
||||
type Config struct {
|
||||
Resource *sdkresource.Resource
|
||||
TraceExporter sdktrace.SpanExporter
|
||||
MetricReader sdkmetric.Reader
|
||||
}
|
||||
|
||||
func New(config Config) (*Providers, error) {
|
||||
if config.Resource == nil {
|
||||
return nil, errors.New("OpenTelemetry resource is required")
|
||||
}
|
||||
|
||||
providers := &Providers{
|
||||
Tracer: tracenoop.NewTracerProvider(),
|
||||
Meter: metricnoop.NewMeterProvider(),
|
||||
}
|
||||
|
||||
var tracerProvider *sdktrace.TracerProvider
|
||||
if config.TraceExporter != nil {
|
||||
tracerProvider = sdktrace.NewTracerProvider(
|
||||
sdktrace.WithBatcher(config.TraceExporter),
|
||||
sdktrace.WithResource(config.Resource),
|
||||
)
|
||||
providers.Tracer = tracerProvider
|
||||
}
|
||||
|
||||
var meterProvider *sdkmetric.MeterProvider
|
||||
if config.MetricReader != nil {
|
||||
meterProvider = sdkmetric.NewMeterProvider(
|
||||
sdkmetric.WithReader(config.MetricReader),
|
||||
sdkmetric.WithResource(config.Resource),
|
||||
)
|
||||
providers.Meter = meterProvider
|
||||
}
|
||||
|
||||
providers.shutdown = func(ctx context.Context) error {
|
||||
var shutdownErrors []error
|
||||
if meterProvider != nil {
|
||||
shutdownErrors = append(shutdownErrors, meterProvider.Shutdown(ctx))
|
||||
}
|
||||
if tracerProvider != nil {
|
||||
shutdownErrors = append(shutdownErrors, tracerProvider.Shutdown(ctx))
|
||||
}
|
||||
if err := errors.Join(shutdownErrors...); err != nil {
|
||||
return fmt.Errorf("shutdown OpenTelemetry providers: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
return providers, nil
|
||||
}
|
||||
|
||||
func (p *Providers) Shutdown(ctx context.Context) error {
|
||||
return p.shutdown(ctx)
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package telemetry
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
sdkresource "go.opentelemetry.io/otel/sdk/resource"
|
||||
)
|
||||
|
||||
func TestNewWithoutExportersUsesNoopProviders(t *testing.T) {
|
||||
providers, err := New(Config{Resource: sdkresource.Empty()})
|
||||
if err != nil {
|
||||
t.Fatalf("New() error = %v", err)
|
||||
}
|
||||
if providers.Tracer == nil || providers.Meter == nil {
|
||||
t.Fatal("New() returned nil provider")
|
||||
}
|
||||
if err := providers.Shutdown(context.Background()); err != nil {
|
||||
t.Fatalf("Shutdown() error = %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewRequiresResource(t *testing.T) {
|
||||
if _, err := New(Config{}); err == nil {
|
||||
t.Fatal("New() error = nil, want missing resource error")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user