Skip to content

Commit

Permalink
WIP upgrade opentelemetry
Browse files Browse the repository at this point in the history
  • Loading branch information
voidlock committed Oct 18, 2023
1 parent ac2660c commit b229bd3
Show file tree
Hide file tree
Showing 6 changed files with 132 additions and 451 deletions.
90 changes: 26 additions & 64 deletions go-kit/metrics/provider/otel/options.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
package otel

import (
"context"
"errors"
"fmt"
"time"

"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric"
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc"
"go.opentelemetry.io/otel/sdk/export/metric"
"go.opentelemetry.io/otel/sdk/metric/selector/simple"
"go.opentelemetry.io/otel/sdk/metric"
"go.opentelemetry.io/otel/sdk/resource"

"github.com/heroku/x/go-kit/metrics/provider/otel/selector/explicit"
)

var (
Expand All @@ -30,41 +27,6 @@ const DefaultAgentEndpoint = "0.0.0.0:55680"
// Option is used for optional arguments when initializing Provider.
type Option func(*Provider) error

// WithDefaultAggregator initializes the Provider with a default aggregator.
var WithDefaultAggregator = WithExactAggregator

// WithExactAggregator initializes the Provider with the simple.NewWithExactDistribution.
//
// NOTE: simple.NewWithExactDistribution is removed in go.opentelemetry.io/otel/sdk/metric@v0.26.0.
func WithExactAggregator() Option {
return WithAggregator(simple.NewWithExactDistribution())
}

// WithExplicitHistogramAggregator initializes the Provider with with our custom explicit.NewExplicitHistogramSelector.
//
// This AggregatorSelector hooks the Provider interface to allow customization of a histogram's bucket definition.
func WithExplicitHistogramAggregator() Option {
return func(p *Provider) error {
selector, cache := explicit.NewExplicitHistogramDistribution()
p.optionCache = cache
p.selector = selector

return nil
}
}

// WithAggregator initializes the Provider with an aggregator used by its controller.
func WithAggregator(agg metric.AggregatorSelector) Option {
return func(p *Provider) error {
if agg == nil {
return ErrAggregatorNil
}

p.selector = agg
return nil
}
}

// WithAttributes initializes a serviceNameResource with attributes.
// If a resource already exists, a new resource is created by merging the two resources.
func WithAttributes(attributes ...attribute.KeyValue) Option {
Expand Down Expand Up @@ -117,28 +79,39 @@ func WithServiceInstanceIDAttribute(serviceInstanceID string) Option {
}

// WithDefaultEndpointExporter initializes the Provider with an exporter using a default endpoint.
func WithDefaultEndpointExporter() Option {
return WithEndpointExporter(DefaultAgentEndpoint)
func WithDefaultExporter(ctx context.Context) Option {
return WithGRPCExporter(ctx, DefaultAgentEndpoint)
}

// WithEndpointExporter initializes the Provider with a default exporter.
func WithEndpointExporter(endpoint string) Option {
func WithGRPCExporter(ctx context.Context, endpoint string, options ...otlpmetricgrpc.Option) Option {
return func(p *Provider) error {
if endpoint == "" {
return ErrEndpointNil
defaults := []otlpmetricgrpc.Option{
otlpmetricgrpc.WithEndpoint(endpoint),
otlpmetricgrpc.WithInsecure(),
}
p.exporter = defaultExporter(endpoint)
options = append(defaults, options...)
exp, err := otlpmetricgrpc.New(ctx, options...)
if err != nil {
return err
}

p.exporter = exp
return nil
}
}

// WithExporter initializes the Provider with an exporter.
func WithExporter(exp exporter) Option {
func WithReader(reader *metric.PeriodicReader) Option {
return func(p *Provider) error {
if exp == nil {
return ErrExporterNil
}
p.exporter = exp
p.reader = reader

return nil
}
}

func WithExporter(exporter metric.Exporter) Option {
return func(p *Provider) error {
p.exporter = exporter

return nil
}
}
Expand All @@ -150,14 +123,3 @@ func WithCollectPeriod(collectPeriod time.Duration) Option {
return nil
}
}

// defaultExporter returns a new otlp exporter that uses a gRPC driver.
// A collector agent endpoint (host:port) is required as the addr.
func defaultExporter(addr string) exporter {
c := otlpmetricgrpc.NewClient(
otlpmetricgrpc.WithEndpoint(addr),
otlpmetricgrpc.WithInsecure(),
)
eo := otlpmetric.WithMetricExportKindSelector(metric.DeltaExportKindSelector())
return otlpmetric.NewUnstarted(c, eo)
}
40 changes: 11 additions & 29 deletions go-kit/metrics/provider/otel/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,22 +10,17 @@ import (
"github.com/go-kit/kit/metrics"
"github.com/go-kit/kit/metrics/generic"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/metric/global"
metricexport "go.opentelemetry.io/otel/sdk/export/metric"
"go.opentelemetry.io/otel/sdk/export/metric/aggregation"
"go.opentelemetry.io/otel/sdk/metric/aggregator/histogram"
metriccontroller "go.opentelemetry.io/otel/sdk/metric/controller/basic"
processor "go.opentelemetry.io/otel/sdk/metric/processor/basic"
"go.opentelemetry.io/otel/sdk/metric"
"go.opentelemetry.io/otel/sdk/resource"

xmetrics "github.com/heroku/x/go-kit/metrics"
"github.com/heroku/x/go-kit/metrics/provider/otel/selector/explicit"
)

var _ metrics.Counter = (*Counter)(nil)
var _ metrics.Gauge = (*Gauge)(nil)
var _ metrics.Histogram = (*Histogram)(nil)
var (
_ metrics.Counter = (*Counter)(nil)
_ metrics.Gauge = (*Gauge)(nil)
_ metrics.Histogram = (*Histogram)(nil)
)

const (
// The values of these attributes should be the service name.
Expand All @@ -47,17 +42,18 @@ const (
cloudKey = "cloud"
)

var DefaultReaderInterval = metric.WithInterval(time.Minute)

// Provider initializes a global otlp meter provider that can collect metrics and
// use a collector to push those metrics to various backends (e.g. Argus, Honeycomb).
// Initialize with New(...). An initialized Provider must be started before
// it can be used to provide a Meter (i.e. p.Start()).
type Provider struct {
ctx context.Context // used for init and shutdown of the otlp exporter and other bits of this Provider
serviceNameResource *resource.Resource
optionCache explicit.OptionCache
selector metricexport.AggregatorSelector
exporter exporter
controller controller
exporter metric.Exporter
reader *metric.PeriodicReader
meterProvider metric.MeterProvider

defaultTags []string
prefix string
Expand Down Expand Up @@ -108,24 +104,10 @@ func New(ctx context.Context, serviceName string, opts ...Option) (xmetrics.Prov
metriccontroller.WithResource(p.serviceNameResource),
metriccontroller.WithCollectPeriod(p.collectPeriod),
)
global.SetMeterProvider(p.controller.MeterProvider())

return &p, nil
}

type exporter interface {
Start(ctx context.Context) error
Shutdown(ctx context.Context) error
Export(parent context.Context, resource *resource.Resource, cps metricexport.CheckpointSet) error
ExportKindFor(desc *metric.Descriptor, kind aggregation.Kind) metricexport.ExportKind
}

type controller interface {
MeterProvider() metric.MeterProvider
Start(ctx context.Context) error
Stop(ctx context.Context) error
}

// Start starts the provider's controller and exporter.
func (p *Provider) Start() error {
if err := p.controller.Start(p.ctx); err != nil {
Expand Down
84 changes: 0 additions & 84 deletions go-kit/metrics/provider/otel/selector/explicit/explicit.go

This file was deleted.

Loading

0 comments on commit b229bd3

Please sign in to comment.