andrey
8 months ago
3 changed files with 159 additions and 0 deletions
@ -0,0 +1,17 @@ |
|||
module gitoa.ru/go-4devs/otel |
|||
|
|||
go 1.22.2 |
|||
|
|||
require ( |
|||
go.opentelemetry.io/otel v1.25.0 |
|||
go.opentelemetry.io/otel/sdk v1.25.0 |
|||
go.opentelemetry.io/otel/sdk/metric v1.25.0 |
|||
) |
|||
|
|||
require ( |
|||
github.com/go-logr/logr v1.4.1 // indirect |
|||
github.com/go-logr/stdr v1.2.2 // indirect |
|||
go.opentelemetry.io/otel/metric v1.25.0 // indirect |
|||
go.opentelemetry.io/otel/trace v1.25.0 // indirect |
|||
golang.org/x/sys v0.18.0 // indirect |
|||
) |
@ -0,0 +1,27 @@ |
|||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= |
|||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= |
|||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= |
|||
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= |
|||
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= |
|||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= |
|||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= |
|||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= |
|||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= |
|||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= |
|||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= |
|||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= |
|||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= |
|||
go.opentelemetry.io/otel v1.25.0 h1:gldB5FfhRl7OJQbUHt/8s0a7cE8fbsPAtdpRaApKy4k= |
|||
go.opentelemetry.io/otel v1.25.0/go.mod h1:Wa2ds5NOXEMkCmUou1WA7ZBfLTHWIsp034OVD7AO+Vg= |
|||
go.opentelemetry.io/otel/metric v1.25.0 h1:LUKbS7ArpFL/I2jJHdJcqMGxkRdxpPHE0VU/D4NuEwA= |
|||
go.opentelemetry.io/otel/metric v1.25.0/go.mod h1:rkDLUSd2lC5lq2dFNrX9LGAbINP5B7WBkC78RXCpH5s= |
|||
go.opentelemetry.io/otel/sdk v1.25.0 h1:PDryEJPC8YJZQSyLY5eqLeafHtG+X7FWnf3aXMtxbqo= |
|||
go.opentelemetry.io/otel/sdk v1.25.0/go.mod h1:oFgzCM2zdsxKzz6zwpTZYLLQsFwc+K0daArPdIhuxkw= |
|||
go.opentelemetry.io/otel/sdk/metric v1.25.0 h1:7CiHOy08LbrxMAp4vWpbiPcklunUshVpAvGBrdDRlGw= |
|||
go.opentelemetry.io/otel/sdk/metric v1.25.0/go.mod h1:LzwoKptdbBBdYfvtGCzGwk6GWMA3aUzBOwtQpR6Nz7o= |
|||
go.opentelemetry.io/otel/trace v1.25.0 h1:tqukZGLwQYRIFtSQM2u2+yfMVTgGVeqRLPUYx1Dq6RM= |
|||
go.opentelemetry.io/otel/trace v1.25.0/go.mod h1:hCCs70XM/ljO+BeQkyFnbK28SBIJ/Emuha+ccrCRT7I= |
|||
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= |
|||
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= |
|||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= |
|||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= |
@ -0,0 +1,115 @@ |
|||
package meter |
|||
|
|||
import ( |
|||
"context" |
|||
"fmt" |
|||
"os" |
|||
"path/filepath" |
|||
|
|||
"go.opentelemetry.io/otel" |
|||
"go.opentelemetry.io/otel/attribute" |
|||
"go.opentelemetry.io/otel/sdk/metric" |
|||
"go.opentelemetry.io/otel/sdk/resource" |
|||
semconv "go.opentelemetry.io/otel/semconv/v1.17.0" |
|||
) |
|||
|
|||
func WithServiceName(name string) func(*Option) error { |
|||
return func(o *Option) error { |
|||
o.serviceName = name |
|||
|
|||
return nil |
|||
} |
|||
} |
|||
|
|||
func WithAttributes(attrs ...attribute.KeyValue) func(context.Context, *Option) error { |
|||
return func(_ context.Context, o *Option) error { |
|||
o.attributes = attrs |
|||
|
|||
return nil |
|||
} |
|||
} |
|||
|
|||
func WithExtraResource(opts ...resource.Option) func(context.Context, *Option) error { |
|||
return func(_ context.Context, o *Option) error { |
|||
o.extraResource = opts |
|||
|
|||
return nil |
|||
} |
|||
} |
|||
|
|||
func WithReader(reader metric.Reader) func(context.Context, *Option) error { |
|||
return func(_ context.Context, o *Option) error { |
|||
o.reader = reader |
|||
|
|||
return nil |
|||
} |
|||
} |
|||
|
|||
type Option struct { |
|||
reader metric.Reader |
|||
serviceName string |
|||
attributes []attribute.KeyValue |
|||
extraResource []resource.Option |
|||
} |
|||
|
|||
func newOptions(ctx context.Context, opts ...func(context.Context, *Option) error) (Option, error) { |
|||
option := Option{ |
|||
serviceName: filepath.Base(os.Args[0]), |
|||
extraResource: []resource.Option{ |
|||
resource.WithOS(), |
|||
resource.WithProcess(), |
|||
resource.WithContainer(), |
|||
resource.WithHost(), |
|||
}, |
|||
} |
|||
|
|||
for idx, opt := range opts { |
|||
if err := opt(ctx, &option); err != nil { |
|||
return option, fmt.Errorf("option[%d]:%w", idx, err) |
|||
} |
|||
} |
|||
|
|||
return option, nil |
|||
} |
|||
|
|||
func New(ctx context.Context, opts ...func(context.Context, *Option) error) (*metric.MeterProvider, error) { |
|||
option, err := newOptions(ctx, opts...) |
|||
if err != nil { |
|||
return nil, fmt.Errorf("configure:%w", err) |
|||
} |
|||
|
|||
extraResources, eerr := resource.New( |
|||
ctx, |
|||
append( |
|||
option.extraResource, |
|||
resource.WithAttributes( |
|||
append( |
|||
option.attributes, |
|||
semconv.ServiceName(option.serviceName), |
|||
)..., |
|||
), |
|||
)..., |
|||
) |
|||
if eerr != nil { |
|||
return nil, fmt.Errorf("create extra resource: %w", eerr) |
|||
} |
|||
|
|||
res, rerr := resource.Merge( |
|||
resource.Default(), |
|||
extraResources, |
|||
) |
|||
if rerr != nil { |
|||
return nil, fmt.Errorf("merge resource: %w", rerr) |
|||
} |
|||
|
|||
provOption := make([]metric.Option, 0, 2) |
|||
|
|||
if option.reader != nil { |
|||
provOption = append(provOption, metric.WithReader(option.reader)) |
|||
} |
|||
|
|||
meterProvider := metric.NewMeterProvider(append(provOption, metric.WithResource(res))...) |
|||
otel.SetMeterProvider(meterProvider) |
|||
|
|||
return meterProvider, nil |
|||
} |
Loading…
Reference in new issue