Deprecate service::telemetry::metrics::address (#11205)

Existing configs like:

```yaml
service:
  telemetry:
    metrics:
      level: "basic"
      address: "localhost:8888"
```

Should change to:

```yaml
service:
  telemetry:
    metrics:
      level: "basic"
      readers:
        - pull:
            exporter:
              prometheus:
                host: "localhost"
                port: 8888
```

---------

Signed-off-by: Bogdan Drutu <bogdandrutu@gmail.com>
Co-authored-by: Alex Boten <223565+codeboten@users.noreply.github.com>
This commit is contained in:
Bogdan Drutu 2024-09-25 13:34:53 -07:00 committed by GitHub
parent 0ed97aa2a0
commit 3eec76c4a3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
26 changed files with 323 additions and 156 deletions

View File

@ -0,0 +1,20 @@
# Use this changelog template to create an entry for release notes.
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: 'deprecation'
# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
component: service/telemetry
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Deprecate service::telemetry::metrics::address in favor of service::telemetry::metrics::readers.
# One or more tracking issues or pull requests related to the change
issues: [11205]
# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: [user]

View File

@ -389,8 +389,8 @@ func TestCollectorRun(t *testing.T) {
tests := []struct {
file string
}{
{file: "otelcol-nometrics.yaml"},
{file: "otelcol-noaddress.yaml"},
{file: "otelcol-noreaders.yaml"},
{file: "otelcol-emptyreaders.yaml"},
}
for _, tt := range tests {

View File

@ -9,6 +9,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
"go.opentelemetry.io/contrib/config"
"go.uber.org/zap/zapcore"
"go.opentelemetry.io/collector/component"
@ -275,8 +276,17 @@ func generateConfig() *Config {
InitialFields: map[string]any{"fieldKey": "filed-value"},
},
Metrics: telemetry.MetricsConfig{
Level: configtelemetry.LevelNormal,
Address: ":8080",
Level: configtelemetry.LevelNormal,
Readers: []config.MetricReader{
{
Pull: &config.PullMetricReader{Exporter: config.MetricExporter{
Prometheus: &config.Prometheus{
Host: newPtr("localhost"),
Port: newPtr(8080),
},
}},
},
},
},
},
Extensions: []component.ID{component.MustNewID("nop")},
@ -290,3 +300,7 @@ func generateConfig() *Config {
},
}
}
func newPtr[T int | string](str T) *T {
return &str
}

View File

@ -17,6 +17,7 @@ require (
go.opentelemetry.io/collector/processor v0.110.0
go.opentelemetry.io/collector/receiver v0.110.0
go.opentelemetry.io/collector/service v0.110.0
go.opentelemetry.io/contrib/config v0.10.0
go.uber.org/goleak v1.3.0
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.27.0
@ -79,7 +80,6 @@ require (
go.opentelemetry.io/collector/processor/processorprofiles v0.110.0 // indirect
go.opentelemetry.io/collector/receiver/receiverprofiles v0.110.0 // indirect
go.opentelemetry.io/collector/semconv v0.110.0 // indirect
go.opentelemetry.io/contrib/config v0.10.0 // indirect
go.opentelemetry.io/contrib/propagators/b3 v1.30.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 // indirect

View File

@ -7,7 +7,7 @@ exporters:
service:
telemetry:
metrics:
address: ""
readers: []
pipelines:
metrics:
receivers: [nop]

View File

@ -10,7 +10,12 @@ exporters:
service:
telemetry:
metrics:
address: localhost:8888
readers:
- pull:
exporter:
prometheus:
host: "localhost"
port: 8888
pipelines:
traces:
receivers: [nop_logs]

View File

@ -10,7 +10,12 @@ exporters:
service:
telemetry:
metrics:
address: localhost:8888
readers:
- pull:
exporter:
prometheus:
host: "localhost"
port: 8888
pipelines:
traces:
receivers: [nop]

View File

@ -14,7 +14,12 @@ service:
- "unknown"
- "tracecontext"
metrics:
address: localhost:8888
readers:
- pull:
exporter:
prometheus:
host: "localhost"
port: 8888
pipelines:
traces:
receivers: [nop]

View File

@ -16,7 +16,12 @@ connectors:
service:
telemetry:
metrics:
address: localhost:8888
readers:
- pull:
exporter:
prometheus:
host: "localhost"
port: 8888
extensions: [nop]
pipelines:
traces:

View File

@ -14,7 +14,12 @@ extensions:
service:
telemetry:
metrics:
address: localhost:8888
readers:
- pull:
exporter:
prometheus:
host: "localhost"
port: 8888
extensions: [statuswatcher]
pipelines:
traces:

View File

@ -14,7 +14,12 @@ service:
- "b3"
- "tracecontext"
metrics:
address: localhost:8888
readers:
- pull:
exporter:
prometheus:
host: "localhost"
port: 8888
pipelines:
traces:
receivers: [nop]

View File

@ -159,7 +159,7 @@ func TestServiceUnmarshalError(t *testing.T) {
},
},
}),
expectError: "error decoding 'telemetry.logs.level': unrecognized level: \"UNKNOWN\"",
expectError: "error decoding 'telemetry': decoding failed due to the following error(s):\n\nerror decoding 'logs.level': unrecognized level: \"UNKNOWN\"",
},
{
name: "invalid-metrics-level",
@ -170,7 +170,7 @@ func TestServiceUnmarshalError(t *testing.T) {
},
},
}),
expectError: "error decoding 'telemetry.metrics.level': unknown metrics level \"unknown\"",
expectError: "error decoding 'telemetry': decoding failed due to the following error(s):\n\nerror decoding 'metrics.level': unknown metrics level \"unknown\"",
},
{
name: "invalid-service-extensions-section",
@ -204,8 +204,7 @@ func TestServiceUnmarshalError(t *testing.T) {
for _, tt := range testCases {
t.Run(tt.name, func(t *testing.T) {
err := tt.conf.Unmarshal(&service.Config{})
require.Error(t, err)
assert.Contains(t, err.Error(), tt.expectError)
require.ErrorContains(t, err, tt.expectError)
})
}
}

View File

@ -9,6 +9,7 @@ import (
"testing"
"github.com/stretchr/testify/assert"
"go.opentelemetry.io/contrib/config"
"go.uber.org/zap/zapcore"
"go.opentelemetry.io/collector/component"
@ -67,7 +68,7 @@ func TestConfigValidate(t *testing.T) {
cfgFn: func() *Config {
cfg := generateConfig()
cfg.Telemetry.Metrics.Level = configtelemetry.LevelBasic
cfg.Telemetry.Metrics.Address = ""
cfg.Telemetry.Metrics.Readers = nil
return cfg
},
expected: nil,
@ -96,8 +97,13 @@ func generateConfig() *Config {
InitialFields: map[string]any{"fieldKey": "filed-value"},
},
Metrics: telemetry.MetricsConfig{
Level: configtelemetry.LevelNormal,
Address: ":8080",
Level: configtelemetry.LevelNormal,
Readers: []config.MetricReader{{
Pull: &config.PullMetricReader{Exporter: config.MetricExporter{Prometheus: &config.Prometheus{
Host: newPtr("localhost"),
Port: newPtr(8080),
}}}},
},
},
},
Extensions: extensions.Config{component.MustNewID("nop")},

View File

@ -187,6 +187,7 @@ func logsAboutMeterProvider(logger *zap.Logger, cfg telemetry.MetricsConfig, mp
return
}
//nolint
if len(cfg.Address) != 0 {
logger.Warn("service::telemetry::metrics::address is being deprecated in favor of service::telemetry::metrics::readers")
}

View File

@ -289,78 +289,6 @@ func TestServiceTelemetryCleanupOnError(t *testing.T) {
}
func TestServiceTelemetry(t *testing.T) {
for _, tc := range ownMetricsTestCases() {
t.Run(fmt.Sprintf("ipv4_%s", tc.name), func(t *testing.T) {
testCollectorStartHelper(t, tc, "tcp4")
})
t.Run(fmt.Sprintf("ipv6_%s", tc.name), func(t *testing.T) {
testCollectorStartHelper(t, tc, "tcp6")
})
}
}
func testCollectorStartHelper(t *testing.T, tc ownMetricsTestCase, network string) {
var once sync.Once
loggingHookCalled := false
hook := func(zapcore.Entry) error {
once.Do(func() {
loggingHookCalled = true
})
return nil
}
var (
metricsAddr string
zpagesAddr string
)
switch network {
case "tcp", "tcp4":
metricsAddr = testutil.GetAvailableLocalAddress(t)
zpagesAddr = testutil.GetAvailableLocalAddress(t)
case "tcp6":
metricsAddr = testutil.GetAvailableLocalIPv6Address(t)
zpagesAddr = testutil.GetAvailableLocalIPv6Address(t)
}
require.NotZero(t, metricsAddr, "network must be either of tcp, tcp4 or tcp6")
require.NotZero(t, zpagesAddr, "network must be either of tcp, tcp4 or tcp6")
set := newNopSettings()
set.BuildInfo = component.BuildInfo{Version: "test version", Command: otelCommand}
set.ExtensionsConfigs = map[component.ID]component.Config{
component.MustNewID("zpages"): &zpagesextension.Config{
ServerConfig: confighttp.ServerConfig{Endpoint: zpagesAddr},
},
}
set.ExtensionsFactories = map[component.Type]extension.Factory{component.MustNewType("zpages"): zpagesextension.NewFactory()}
set.LoggingOptions = []zap.Option{zap.Hooks(hook)}
cfg := newNopConfig()
cfg.Extensions = []component.ID{component.MustNewID("zpages")}
cfg.Telemetry.Metrics.Address = metricsAddr
cfg.Telemetry.Resource = make(map[string]*string)
// Include resource attributes under the service::telemetry::resource key.
for k, v := range tc.userDefinedResource {
cfg.Telemetry.Resource[k] = v
}
// Create a service, check for metrics, shutdown and repeat to ensure that telemetry can be started/shutdown and started again.
for i := 0; i < 2; i++ {
srv, err := New(context.Background(), set, cfg)
require.NoError(t, err)
require.NoError(t, srv.Start(context.Background()))
// Sleep for 1 second to ensure the http server is started.
time.Sleep(1 * time.Second)
assert.True(t, loggingHookCalled)
assertResourceLabels(t, srv.telemetrySettings.Resource, tc.expectedLabels)
assertMetrics(t, metricsAddr, tc.expectedLabels)
assertZPages(t, zpagesAddr)
require.NoError(t, srv.Shutdown(context.Background()))
}
}
func TestServiceTelemetryWithReaders(t *testing.T) {
for _, tc := range ownMetricsTestCases() {
t.Run(fmt.Sprintf("ipv4_%s", tc.name), func(t *testing.T) {
testCollectorStartHelperWithReaders(t, tc, "tcp4")
@ -408,7 +336,6 @@ func testCollectorStartHelperWithReaders(t *testing.T, tc ownMetricsTestCase, ne
cfg := newNopConfig()
cfg.Extensions = []component.ID{component.MustNewID("zpages")}
cfg.Telemetry.Metrics.Address = ""
cfg.Telemetry.Metrics.Readers = []config.MetricReader{
{
Pull: &config.PullMetricReader{
@ -742,8 +669,13 @@ func newNopConfigPipelineConfigs(pipelineCfgs pipelines.ConfigWithPipelineID) Co
InitialFields: map[string]any(nil),
},
Metrics: telemetry.MetricsConfig{
Level: configtelemetry.LevelBasic,
Address: "localhost:8888",
Level: configtelemetry.LevelBasic,
Readers: []config.MetricReader{{
Pull: &config.PullMetricReader{Exporter: config.MetricExporter{Prometheus: &config.Prometheus{
Host: newPtr("localhost"),
Port: newPtr(8888),
}}}},
},
},
},
}
@ -775,3 +707,7 @@ func newConfigWatcherExtensionFactory(name component.Type) extension.Factory {
component.StabilityLevelDevelopment,
)
}
func newPtr[T int | string](str T) *T {
return &str
}

View File

@ -5,14 +5,27 @@ package telemetry // import "go.opentelemetry.io/collector/service/telemetry"
import (
"fmt"
"net"
"strconv"
"time"
"go.opentelemetry.io/contrib/config"
"go.uber.org/zap/zapcore"
"go.opentelemetry.io/collector/config/configtelemetry"
"go.opentelemetry.io/collector/confmap"
"go.opentelemetry.io/collector/featuregate"
)
var _ confmap.Unmarshaler = (*Config)(nil)
var disableAddressFieldForInternalTelemetryFeatureGate = featuregate.GlobalRegistry().MustRegister(
"telemetry.disableAddressFieldForInternalTelemetry",
featuregate.StageAlpha,
featuregate.WithRegisterFromVersion("v0.111.0"),
featuregate.WithRegisterToVersion("v0.114.0"),
featuregate.WithRegisterDescription("controls whether the deprecated address field for internal telemetry is still supported"))
// Config defines the configurable settings for service telemetry.
type Config struct {
Logs LogsConfig `mapstructure:"logs"`
@ -119,7 +132,7 @@ type MetricsConfig struct {
// - "detailed" adds dimensions and views to the previous levels.
Level configtelemetry.Level `mapstructure:"level"`
// Address is the [address]:port that metrics exposition should be bound to.
// Deprecated: [v0.111.0] use readers configuration.
Address string `mapstructure:"address"`
// Readers allow configuration of metric readers to emit metrics to
@ -143,11 +156,52 @@ type TracesConfig struct {
Processors []config.SpanProcessor `mapstructure:"processors"`
}
// Validate checks whether the current configuration is valid
func (c *Config) Validate() error {
// Check when service telemetry metric level is not none, the metrics address should not be empty
if c.Metrics.Level != configtelemetry.LevelNone && c.Metrics.Address == "" && len(c.Metrics.Readers) == 0 {
return fmt.Errorf("collector telemetry metric address or reader should exist when metric level is not none")
func (c *Config) Unmarshal(conf *confmap.Conf) error {
if err := conf.Unmarshal(c); err != nil {
return err
}
// If the support for "metrics::address" is disabled, nothing to do.
// TODO: when this gate is marked stable remove the whole Unmarshal definition.
if disableAddressFieldForInternalTelemetryFeatureGate.IsEnabled() {
return nil
}
if len(c.Metrics.Address) != 0 {
host, port, err := net.SplitHostPort(c.Metrics.Address)
if err != nil {
return fmt.Errorf("failing to parse metrics address %q: %w", c.Metrics.Address, err)
}
portInt, err := strconv.Atoi(port)
if err != nil {
return fmt.Errorf("failing to extract the port from the metrics address %q: %w", c.Metrics.Address, err)
}
// User did not overwrite readers, so we will remove the default configured reader.
if !conf.IsSet("metrics::readers") {
c.Metrics.Readers = nil
}
c.Metrics.Readers = append(c.Metrics.Readers, config.MetricReader{
Pull: &config.PullMetricReader{
Exporter: config.MetricExporter{
Prometheus: &config.Prometheus{
Host: &host,
Port: &portInt,
},
},
},
})
}
return nil
}
// Validate checks whether the current configuration is valid
func (c *Config) Validate() error {
// Check when service telemetry metric level is not none, the metrics readers should not be empty
if c.Metrics.Level != configtelemetry.LevelNone && len(c.Metrics.Readers) == 0 {
return fmt.Errorf("collector telemetry metrics reader should exist when metric level is not none")
}
return nil

View File

@ -4,15 +4,109 @@
package telemetry
import (
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/contrib/config"
"go.opentelemetry.io/collector/component/componenttest"
"go.opentelemetry.io/collector/config/configtelemetry"
"go.opentelemetry.io/collector/confmap"
"go.opentelemetry.io/collector/confmap/confmaptest"
"go.opentelemetry.io/collector/featuregate"
)
func TestLoadConfig(t *testing.T) {
func TestComponentConfigStruct(t *testing.T) {
require.NoError(t, componenttest.CheckConfigStruct(NewFactory().CreateDefaultConfig()))
}
func TestUnmarshalDefaultConfig(t *testing.T) {
factory := NewFactory()
cfg := factory.CreateDefaultConfig()
require.NoError(t, confmap.New().Unmarshal(&cfg))
assert.Equal(t, factory.CreateDefaultConfig(), cfg)
}
func TestUnmarshalEmptyMetricReaders(t *testing.T) {
prev := disableAddressFieldForInternalTelemetryFeatureGate.IsEnabled()
require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), false))
defer func() {
// Restore previous value.
require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), prev))
}()
cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config_empty_readers.yaml"))
require.NoError(t, err)
cfg := NewFactory().CreateDefaultConfig()
require.NoError(t, cm.Unmarshal(&cfg))
require.Empty(t, cfg.(*Config).Metrics.Readers)
}
func TestUnmarshalConfigDeprecatedAddress(t *testing.T) {
prev := disableAddressFieldForInternalTelemetryFeatureGate.IsEnabled()
require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), false))
defer func() {
// Restore previous value.
require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), prev))
}()
cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config_deprecated_address.yaml"))
require.NoError(t, err)
cfg := NewFactory().CreateDefaultConfig()
require.NoError(t, cm.Unmarshal(&cfg))
require.Len(t, cfg.(*Config).Metrics.Readers, 1)
assert.Equal(t, "localhost", *cfg.(*Config).Metrics.Readers[0].Pull.Exporter.Prometheus.Host)
assert.Equal(t, 6666, *cfg.(*Config).Metrics.Readers[0].Pull.Exporter.Prometheus.Port)
}
func TestUnmarshalConfigDeprecatedAddressGateEnabled(t *testing.T) {
prev := disableAddressFieldForInternalTelemetryFeatureGate.IsEnabled()
require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), true))
defer func() {
// Restore previous value.
require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), prev))
}()
cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config_deprecated_address.yaml"))
require.NoError(t, err)
cfg := NewFactory().CreateDefaultConfig()
require.NoError(t, cm.Unmarshal(&cfg))
require.Len(t, cfg.(*Config).Metrics.Readers, 1)
assert.Equal(t, "", *cfg.(*Config).Metrics.Readers[0].Pull.Exporter.Prometheus.Host)
assert.Equal(t, 8888, *cfg.(*Config).Metrics.Readers[0].Pull.Exporter.Prometheus.Port)
}
func TestUnmarshalConfigInvalidDeprecatedAddress(t *testing.T) {
prev := disableAddressFieldForInternalTelemetryFeatureGate.IsEnabled()
require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), false))
defer func() {
// Restore previous value.
require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), prev))
}()
cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config_invalid_deprecated_address.yaml"))
require.NoError(t, err)
cfg := NewFactory().CreateDefaultConfig()
require.Error(t, cm.Unmarshal(&cfg))
}
func TestUnmarshalConfigDeprecatedAddressAndReaders(t *testing.T) {
prev := disableAddressFieldForInternalTelemetryFeatureGate.IsEnabled()
require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), false))
defer func() {
// Restore previous value.
require.NoError(t, featuregate.GlobalRegistry().Set(disableAddressFieldForInternalTelemetryFeatureGate.ID(), prev))
}()
cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config_deprecated_address_and_readers.yaml"))
require.NoError(t, err)
cfg := NewFactory().CreateDefaultConfig()
require.NoError(t, cm.Unmarshal(&cfg))
require.Len(t, cfg.(*Config).Metrics.Readers, 2)
assert.Equal(t, "localhost", *cfg.(*Config).Metrics.Readers[0].Pull.Exporter.Prometheus.Host)
assert.Equal(t, 9999, *cfg.(*Config).Metrics.Readers[0].Pull.Exporter.Prometheus.Port)
assert.Equal(t, "192.168.0.1", *cfg.(*Config).Metrics.Readers[1].Pull.Exporter.Prometheus.Host)
assert.Equal(t, 6666, *cfg.(*Config).Metrics.Readers[1].Pull.Exporter.Prometheus.Port)
}
func TestConfigValidate(t *testing.T) {
tests := []struct {
name string
cfg *Config
@ -22,8 +116,13 @@ func TestLoadConfig(t *testing.T) {
name: "basic metric telemetry",
cfg: &Config{
Metrics: MetricsConfig{
Level: configtelemetry.LevelBasic,
Address: "127.0.0.1:3333",
Level: configtelemetry.LevelBasic,
Readers: []config.MetricReader{{
Pull: &config.PullMetricReader{Exporter: config.MetricExporter{Prometheus: &config.Prometheus{
Host: newPtr("127.0.0.1"),
Port: newPtr(3333),
}}}},
},
},
},
success: true,
@ -33,32 +132,20 @@ func TestLoadConfig(t *testing.T) {
cfg: &Config{
Metrics: MetricsConfig{
Level: configtelemetry.LevelBasic,
Address: "",
Readers: nil,
},
},
success: false,
},
{
name: "valid metric telemetry with metric readers",
cfg: &Config{
Metrics: MetricsConfig{
Level: configtelemetry.LevelBasic,
Readers: []config.MetricReader{
{Pull: &config.PullMetricReader{}},
},
},
},
success: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := tt.cfg.Validate()
if tt.success {
assert.NoError(t, err)
require.NoError(t, err)
} else {
assert.Error(t, err)
require.Error(t, err)
}
})
}

View File

@ -7,6 +7,7 @@ import (
"context"
"time"
"go.opentelemetry.io/contrib/config"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/trace"
"go.uber.org/zap"
@ -99,8 +100,17 @@ func createDefaultConfig() component.Config {
InitialFields: map[string]any(nil),
},
Metrics: MetricsConfig{
Level: configtelemetry.LevelNormal,
Address: ":8888",
Level: configtelemetry.LevelNormal,
Readers: []config.MetricReader{{
Pull: &config.PullMetricReader{Exporter: config.MetricExporter{Prometheus: &config.Prometheus{
Host: newPtr(""),
Port: newPtr(8888),
}}}},
},
},
}
}
func newPtr[T int | string](str T) *T {
return &str
}

View File

@ -10,6 +10,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/contrib/config"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
@ -30,8 +31,13 @@ func TestTelemetryConfiguration(t *testing.T) {
Encoding: "console",
},
Metrics: MetricsConfig{
Level: configtelemetry.LevelBasic,
Address: "127.0.0.1:3333",
Level: configtelemetry.LevelBasic,
Readers: []config.MetricReader{{
Pull: &config.PullMetricReader{Exporter: config.MetricExporter{Prometheus: &config.Prometheus{
Host: newPtr("127.0.0.1"),
Port: newPtr(3333),
}}}},
},
},
},
success: true,
@ -43,8 +49,13 @@ func TestTelemetryConfiguration(t *testing.T) {
Level: zapcore.DebugLevel,
},
Metrics: MetricsConfig{
Level: configtelemetry.LevelBasic,
Address: "127.0.0.1:3333",
Level: configtelemetry.LevelBasic,
Readers: []config.MetricReader{{
Pull: &config.PullMetricReader{Exporter: config.MetricExporter{Prometheus: &config.Prometheus{
Host: newPtr("127.0.0.1"),
Port: newPtr(3333),
}}}},
},
},
},
success: false,

View File

@ -5,12 +5,9 @@ package telemetry // import "go.opentelemetry.io/collector/service/telemetry"
import (
"context"
"net"
"net/http"
"strconv"
"sync"
"go.opentelemetry.io/contrib/config"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/metric/noop"
sdkmetric "go.opentelemetry.io/otel/sdk/metric"
@ -40,34 +37,10 @@ type meterProviderSettings struct {
}
func newMeterProvider(set meterProviderSettings, disableHighCardinality bool) (metric.MeterProvider, error) {
if set.cfg.Level == configtelemetry.LevelNone || (set.cfg.Address == "" && len(set.cfg.Readers) == 0) {
if set.cfg.Level == configtelemetry.LevelNone || len(set.cfg.Readers) == 0 {
return noop.NewMeterProvider(), nil
}
if len(set.cfg.Address) != 0 {
host, port, err := net.SplitHostPort(set.cfg.Address)
if err != nil {
return nil, err
}
portInt, err := strconv.Atoi(port)
if err != nil {
return nil, err
}
if set.cfg.Readers == nil {
set.cfg.Readers = []config.MetricReader{}
}
set.cfg.Readers = append(set.cfg.Readers, config.MetricReader{
Pull: &config.PullMetricReader{
Exporter: config.MetricExporter{
Prometheus: &config.Prometheus{
Host: &host,
Port: &portInt,
},
},
},
})
}
mp := &meterProvider{}
var opts []sdkmetric.Option
for _, reader := range set.cfg.Readers {

View File

@ -17,7 +17,6 @@ import (
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/configtelemetry"
"go.opentelemetry.io/collector/internal/testutil"
semconv "go.opentelemetry.io/collector/semconv/v1.18.0"
"go.opentelemetry.io/collector/service/internal/promtest"
"go.opentelemetry.io/collector/service/internal/resource"
@ -208,8 +207,10 @@ func TestTelemetryInit(t *testing.T) {
semconv.AttributeServiceInstanceID: &testInstanceID,
},
Metrics: MetricsConfig{
Level: configtelemetry.LevelDetailed,
Address: testutil.GetAvailableLocalAddress(t),
Level: configtelemetry.LevelDetailed,
Readers: []config.MetricReader{{
Pull: &config.PullMetricReader{Exporter: config.MetricExporter{Prometheus: promtest.GetAvailableLocalAddressPrometheus(t)}},
}},
},
}
}
@ -276,5 +277,4 @@ func getMetricsFromPrometheus(t *testing.T, handler http.Handler) map[string]*io
require.NoError(t, err)
return parsed
}

View File

@ -0,0 +1,5 @@
logs:
level: "info"
metrics:
level: "basic"
address: "localhost:6666"

View File

@ -0,0 +1,11 @@
logs:
level: "info"
metrics:
level: "basic"
address: "192.168.0.1:6666"
readers:
- pull:
exporter:
prometheus:
host: "localhost"
port: 9999

View File

@ -0,0 +1,5 @@
logs:
level: "info"
metrics:
level: "basic"
readers: []

View File

@ -0,0 +1,5 @@
logs:
level: "info"
metrics:
level: "basic"
address: "1212:212121:2121"