1// Copyright The OpenTelemetry Authors
2// SPDX-License-Identifier: Apache-2.0
3
4package metric // import "go.opentelemetry.io/otel/metric"
5
6import "go.opentelemetry.io/otel/attribute"
7
8// MeterConfig contains options for Meters.
9type MeterConfig struct {
10 instrumentationVersion string
11 schemaURL string
12 attrs attribute.Set
13
14 // Ensure forward compatibility by explicitly making this not comparable.
15 noCmp [0]func() //nolint: unused // This is indeed used.
16}
17
18// InstrumentationVersion returns the version of the library providing
19// instrumentation.
20func (cfg MeterConfig) InstrumentationVersion() string {
21 return cfg.instrumentationVersion
22}
23
24// InstrumentationAttributes returns the attributes associated with the library
25// providing instrumentation.
26func (cfg MeterConfig) InstrumentationAttributes() attribute.Set {
27 return cfg.attrs
28}
29
30// SchemaURL is the schema_url of the library providing instrumentation.
31func (cfg MeterConfig) SchemaURL() string {
32 return cfg.schemaURL
33}
34
35// MeterOption is an interface for applying Meter options.
36type MeterOption interface {
37 // applyMeter is used to set a MeterOption value of a MeterConfig.
38 applyMeter(MeterConfig) MeterConfig
39}
40
41// NewMeterConfig creates a new MeterConfig and applies
42// all the given options.
43func NewMeterConfig(opts ...MeterOption) MeterConfig {
44 var config MeterConfig
45 for _, o := range opts {
46 config = o.applyMeter(config)
47 }
48 return config
49}
50
51type meterOptionFunc func(MeterConfig) MeterConfig
52
53func (fn meterOptionFunc) applyMeter(cfg MeterConfig) MeterConfig {
54 return fn(cfg)
55}
56
57// WithInstrumentationVersion sets the instrumentation version.
58func WithInstrumentationVersion(version string) MeterOption {
59 return meterOptionFunc(func(config MeterConfig) MeterConfig {
60 config.instrumentationVersion = version
61 return config
62 })
63}
64
65// WithInstrumentationAttributes sets the instrumentation attributes.
66//
67// The passed attributes will be de-duplicated.
68func WithInstrumentationAttributes(attr ...attribute.KeyValue) MeterOption {
69 return meterOptionFunc(func(config MeterConfig) MeterConfig {
70 config.attrs = attribute.NewSet(attr...)
71 return config
72 })
73}
74
75// WithSchemaURL sets the schema URL.
76func WithSchemaURL(schemaURL string) MeterOption {
77 return meterOptionFunc(func(config MeterConfig) MeterConfig {
78 config.schemaURL = schemaURL
79 return config
80 })
81}