Move exporter Factory and types to exporter package (#6672)
Signed-off-by: Bogdan Drutu <bogdandrutu@gmail.com> Signed-off-by: Bogdan Drutu <bogdandrutu@gmail.com>
This commit is contained in:
parent
4069c593ed
commit
6a2dc302a9
|
|
@ -0,0 +1,25 @@
|
||||||
|
# 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: component
|
||||||
|
|
||||||
|
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
|
||||||
|
note: Deprecate Exporter related types/funcs from component package in favor of exporter package.
|
||||||
|
|
||||||
|
# One or more tracking issues or pull requests related to the change
|
||||||
|
issues: [6578]
|
||||||
|
|
||||||
|
# (Optional) One or more lines of additional information to render under the primary note.
|
||||||
|
# These lines will be padded with 2 spaces and then inserted directly into the document.
|
||||||
|
# Use pipe (|) for multiline entries.
|
||||||
|
subtext: |-
|
||||||
|
- `component.ExporterCreateSettings` -> `exporter.CreateSettings`
|
||||||
|
- `component.CreateTracesExporterFunc` -> `exporter.CreateTracesFunc`
|
||||||
|
- `component.CreateMetricsExporterFunc` -> `exporter.CreateMetricsFunc`
|
||||||
|
- `component.CreateLogsExporterFunc` -> `exporter.CreateLogsFunc`
|
||||||
|
- `component.ExporterFactory` -> `exporter.Factory`
|
||||||
|
- `component.NewExporterFactory` -> `exporter.NewFactory`
|
||||||
|
- `component.MakeExporterFactoryMap` -> `exporter.MakeFactoryMap`
|
||||||
|
- `componenttest.NewNopExporterCreateSettings` -> `exportertest.NewNopCreateSettings`
|
||||||
|
- `componenttest.NewNopExporterFactory` -> `exportertest.NewNopFactory`
|
||||||
|
|
@ -20,11 +20,12 @@ import (
|
||||||
"go.opentelemetry.io/collector/component"
|
"go.opentelemetry.io/collector/component"
|
||||||
"go.opentelemetry.io/collector/config"
|
"go.opentelemetry.io/collector/config"
|
||||||
"go.opentelemetry.io/collector/consumer/consumertest"
|
"go.opentelemetry.io/collector/consumer/consumertest"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewNopExporterCreateSettings returns a new nop settings for Create*Exporter functions.
|
// NewNopExporterCreateSettings returns a new nop settings for Create*Exporter functions.
|
||||||
func NewNopExporterCreateSettings() component.ExporterCreateSettings {
|
func NewNopExporterCreateSettings() exporter.CreateSettings {
|
||||||
return component.ExporterCreateSettings{
|
return exporter.CreateSettings{
|
||||||
TelemetrySettings: NewNopTelemetrySettings(),
|
TelemetrySettings: NewNopTelemetrySettings(),
|
||||||
BuildInfo: component.NewDefaultBuildInfo(),
|
BuildInfo: component.NewDefaultBuildInfo(),
|
||||||
}
|
}
|
||||||
|
|
@ -34,30 +35,30 @@ type nopExporterConfig struct {
|
||||||
config.ExporterSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct
|
config.ExporterSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewNopExporterFactory returns a component.ExporterFactory that constructs nop exporters.
|
// NewNopExporterFactory returns an exporter.Factory that constructs nop exporters.
|
||||||
func NewNopExporterFactory() component.ExporterFactory {
|
func NewNopExporterFactory() exporter.Factory {
|
||||||
return component.NewExporterFactory(
|
return exporter.NewFactory(
|
||||||
"nop",
|
"nop",
|
||||||
func() component.Config {
|
func() component.Config {
|
||||||
return &nopExporterConfig{
|
return &nopExporterConfig{
|
||||||
ExporterSettings: config.NewExporterSettings(component.NewID("nop")),
|
ExporterSettings: config.NewExporterSettings(component.NewID("nop")),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
component.WithTracesExporter(createTracesExporter, component.StabilityLevelStable),
|
exporter.WithTraces(createTracesExporter, component.StabilityLevelStable),
|
||||||
component.WithMetricsExporter(createMetricsExporter, component.StabilityLevelStable),
|
exporter.WithMetrics(createMetricsExporter, component.StabilityLevelStable),
|
||||||
component.WithLogsExporter(createLogsExporter, component.StabilityLevelStable),
|
exporter.WithLogs(createLogsExporter, component.StabilityLevelStable),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func createTracesExporter(context.Context, component.ExporterCreateSettings, component.Config) (component.TracesExporter, error) {
|
func createTracesExporter(context.Context, exporter.CreateSettings, component.Config) (exporter.Traces, error) {
|
||||||
return nopExporterInstance, nil
|
return nopExporterInstance, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createMetricsExporter(context.Context, component.ExporterCreateSettings, component.Config) (component.MetricsExporter, error) {
|
func createMetricsExporter(context.Context, exporter.CreateSettings, component.Config) (exporter.Metrics, error) {
|
||||||
return nopExporterInstance, nil
|
return nopExporterInstance, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createLogsExporter(context.Context, component.ExporterCreateSettings, component.Config) (component.LogsExporter, error) {
|
func createLogsExporter(context.Context, exporter.CreateSettings, component.Config) (exporter.Logs, error) {
|
||||||
return nopExporterInstance, nil
|
return nopExporterInstance, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ func NopFactories() (component.Factories, error) {
|
||||||
return component.Factories{}, err
|
return component.Factories{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//nolint:staticcheck
|
||||||
if factories.Exporters, err = component.MakeExporterFactoryMap(NewNopExporterFactory()); err != nil {
|
if factories.Exporters, err = component.MakeExporterFactoryMap(NewNopExporterFactory()); err != nil {
|
||||||
return component.Factories{}, err
|
return component.Factories{}, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,25 +26,25 @@ type ExporterConfig = Config
|
||||||
// Deprecated: [v0.67.0] use UnmarshalConfig.
|
// Deprecated: [v0.67.0] use UnmarshalConfig.
|
||||||
var UnmarshalExporterConfig = UnmarshalConfig
|
var UnmarshalExporterConfig = UnmarshalConfig
|
||||||
|
|
||||||
// TracesExporter is an Exporter that can consume traces.
|
// Deprecated: [v0.67.0] use exporter.Traces.
|
||||||
type TracesExporter interface {
|
type TracesExporter interface {
|
||||||
Component
|
Component
|
||||||
consumer.Traces
|
consumer.Traces
|
||||||
}
|
}
|
||||||
|
|
||||||
// MetricsExporter is an Exporter that can consume metrics.
|
// Deprecated: [v0.67.0] use exporter.Metrics.
|
||||||
type MetricsExporter interface {
|
type MetricsExporter interface {
|
||||||
Component
|
Component
|
||||||
consumer.Metrics
|
consumer.Metrics
|
||||||
}
|
}
|
||||||
|
|
||||||
// LogsExporter is an Exporter that can consume logs.
|
// Deprecated: [v0.67.0] use exporter.Logs.
|
||||||
type LogsExporter interface {
|
type LogsExporter interface {
|
||||||
Component
|
Component
|
||||||
consumer.Logs
|
consumer.Logs
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExporterCreateSettings configures Exporter creators.
|
// Deprecated: [v0.67.0] use exporter.CreateSettings.
|
||||||
type ExporterCreateSettings struct {
|
type ExporterCreateSettings struct {
|
||||||
// ID returns the ID of the component that will be created.
|
// ID returns the ID of the component that will be created.
|
||||||
ID ID
|
ID ID
|
||||||
|
|
@ -55,10 +55,7 @@ type ExporterCreateSettings struct {
|
||||||
BuildInfo BuildInfo
|
BuildInfo BuildInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExporterFactory is factory interface for exporters.
|
// Deprecated: [v0.67.0] use exporter.Factory.
|
||||||
//
|
|
||||||
// This interface cannot be directly implemented. Implementations must
|
|
||||||
// use the NewExporterFactory to implement it.
|
|
||||||
type ExporterFactory interface {
|
type ExporterFactory interface {
|
||||||
Factory
|
Factory
|
||||||
|
|
||||||
|
|
@ -87,7 +84,7 @@ type ExporterFactory interface {
|
||||||
LogsExporterStability() StabilityLevel
|
LogsExporterStability() StabilityLevel
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExporterFactoryOption apply changes to ExporterOptions.
|
// Deprecated: [v0.67.0] use exporter.FactoryOption.
|
||||||
type ExporterFactoryOption interface {
|
type ExporterFactoryOption interface {
|
||||||
// applyExporterFactoryOption applies the option.
|
// applyExporterFactoryOption applies the option.
|
||||||
applyExporterFactoryOption(o *exporterFactory)
|
applyExporterFactoryOption(o *exporterFactory)
|
||||||
|
|
@ -105,7 +102,7 @@ func (f exporterFactoryOptionFunc) applyExporterFactoryOption(o *exporterFactory
|
||||||
// Deprecated: [v0.67.0] use CreateDefaultConfigFunc.
|
// Deprecated: [v0.67.0] use CreateDefaultConfigFunc.
|
||||||
type ExporterCreateDefaultConfigFunc = CreateDefaultConfigFunc
|
type ExporterCreateDefaultConfigFunc = CreateDefaultConfigFunc
|
||||||
|
|
||||||
// CreateTracesExporterFunc is the equivalent of ExporterFactory.CreateTracesExporter().
|
// Deprecated: [v0.67.0] use exporter.CreateTracesFunc.
|
||||||
type CreateTracesExporterFunc func(context.Context, ExporterCreateSettings, Config) (TracesExporter, error)
|
type CreateTracesExporterFunc func(context.Context, ExporterCreateSettings, Config) (TracesExporter, error)
|
||||||
|
|
||||||
// CreateTracesExporter implements ExporterFactory.CreateTracesExporter().
|
// CreateTracesExporter implements ExporterFactory.CreateTracesExporter().
|
||||||
|
|
@ -116,7 +113,7 @@ func (f CreateTracesExporterFunc) CreateTracesExporter(ctx context.Context, set
|
||||||
return f(ctx, set, cfg)
|
return f(ctx, set, cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateMetricsExporterFunc is the equivalent of ExporterFactory.CreateMetricsExporter().
|
// Deprecated: [v0.67.0] use exporter.CreateMetricsFunc.
|
||||||
type CreateMetricsExporterFunc func(context.Context, ExporterCreateSettings, Config) (MetricsExporter, error)
|
type CreateMetricsExporterFunc func(context.Context, ExporterCreateSettings, Config) (MetricsExporter, error)
|
||||||
|
|
||||||
// CreateMetricsExporter implements ExporterFactory.CreateMetricsExporter().
|
// CreateMetricsExporter implements ExporterFactory.CreateMetricsExporter().
|
||||||
|
|
@ -127,7 +124,7 @@ func (f CreateMetricsExporterFunc) CreateMetricsExporter(ctx context.Context, se
|
||||||
return f(ctx, set, cfg)
|
return f(ctx, set, cfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateLogsExporterFunc is the equivalent of ExporterFactory.CreateLogsExporter().
|
// Deprecated: [v0.67.0] use exporter.CreateLogsFunc.
|
||||||
type CreateLogsExporterFunc func(context.Context, ExporterCreateSettings, Config) (LogsExporter, error)
|
type CreateLogsExporterFunc func(context.Context, ExporterCreateSettings, Config) (LogsExporter, error)
|
||||||
|
|
||||||
// CreateLogsExporter implements ExporterFactory.CreateLogsExporter().
|
// CreateLogsExporter implements ExporterFactory.CreateLogsExporter().
|
||||||
|
|
@ -160,7 +157,7 @@ func (e exporterFactory) LogsExporterStability() StabilityLevel {
|
||||||
return e.logsStabilityLevel
|
return e.logsStabilityLevel
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithTracesExporter overrides the default "error not supported" implementation for CreateTracesExporter and the default "undefined" stability level.
|
// Deprecated: [v0.67.0] use exporter.WithTraces.
|
||||||
func WithTracesExporter(createTracesExporter CreateTracesExporterFunc, sl StabilityLevel) ExporterFactoryOption {
|
func WithTracesExporter(createTracesExporter CreateTracesExporterFunc, sl StabilityLevel) ExporterFactoryOption {
|
||||||
return exporterFactoryOptionFunc(func(o *exporterFactory) {
|
return exporterFactoryOptionFunc(func(o *exporterFactory) {
|
||||||
o.tracesStabilityLevel = sl
|
o.tracesStabilityLevel = sl
|
||||||
|
|
@ -168,7 +165,7 @@ func WithTracesExporter(createTracesExporter CreateTracesExporterFunc, sl Stabil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithMetricsExporter overrides the default "error not supported" implementation for CreateMetricsExporter and the default "undefined" stability level.
|
// Deprecated: [v0.67.0] use exporter.WithMetrics.
|
||||||
func WithMetricsExporter(createMetricsExporter CreateMetricsExporterFunc, sl StabilityLevel) ExporterFactoryOption {
|
func WithMetricsExporter(createMetricsExporter CreateMetricsExporterFunc, sl StabilityLevel) ExporterFactoryOption {
|
||||||
return exporterFactoryOptionFunc(func(o *exporterFactory) {
|
return exporterFactoryOptionFunc(func(o *exporterFactory) {
|
||||||
o.metricsStabilityLevel = sl
|
o.metricsStabilityLevel = sl
|
||||||
|
|
@ -176,7 +173,7 @@ func WithMetricsExporter(createMetricsExporter CreateMetricsExporterFunc, sl Sta
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithLogsExporter overrides the default "error not supported" implementation for CreateLogsExporter and the default "undefined" stability level.
|
// Deprecated: [v0.67.0] use exporter.WithLogs.
|
||||||
func WithLogsExporter(createLogsExporter CreateLogsExporterFunc, sl StabilityLevel) ExporterFactoryOption {
|
func WithLogsExporter(createLogsExporter CreateLogsExporterFunc, sl StabilityLevel) ExporterFactoryOption {
|
||||||
return exporterFactoryOptionFunc(func(o *exporterFactory) {
|
return exporterFactoryOptionFunc(func(o *exporterFactory) {
|
||||||
o.logsStabilityLevel = sl
|
o.logsStabilityLevel = sl
|
||||||
|
|
@ -184,7 +181,7 @@ func WithLogsExporter(createLogsExporter CreateLogsExporterFunc, sl StabilityLev
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewExporterFactory returns a ExporterFactory.
|
// Deprecated: [v0.67.0] use exporter.NewFactory.
|
||||||
func NewExporterFactory(cfgType Type, createDefaultConfig CreateDefaultConfigFunc, options ...ExporterFactoryOption) ExporterFactory {
|
func NewExporterFactory(cfgType Type, createDefaultConfig CreateDefaultConfigFunc, options ...ExporterFactoryOption) ExporterFactory {
|
||||||
f := &exporterFactory{
|
f := &exporterFactory{
|
||||||
baseFactory: baseFactory{
|
baseFactory: baseFactory{
|
||||||
|
|
|
||||||
|
|
@ -1,80 +0,0 @@
|
||||||
// Copyright The OpenTelemetry Authors
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
// TODO: Move tests back to component package after config.*Settings are removed.
|
|
||||||
|
|
||||||
package component_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/collector/component"
|
|
||||||
"go.opentelemetry.io/collector/config"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestNewExporterFactory(t *testing.T) {
|
|
||||||
const typeStr = "test"
|
|
||||||
defaultCfg := config.NewExporterSettings(component.NewID(typeStr))
|
|
||||||
factory := component.NewExporterFactory(
|
|
||||||
typeStr,
|
|
||||||
func() component.Config { return &defaultCfg })
|
|
||||||
assert.EqualValues(t, typeStr, factory.Type())
|
|
||||||
assert.EqualValues(t, &defaultCfg, factory.CreateDefaultConfig())
|
|
||||||
_, err := factory.CreateTracesExporter(context.Background(), component.ExporterCreateSettings{}, &defaultCfg)
|
|
||||||
assert.Error(t, err)
|
|
||||||
_, err = factory.CreateMetricsExporter(context.Background(), component.ExporterCreateSettings{}, &defaultCfg)
|
|
||||||
assert.Error(t, err)
|
|
||||||
_, err = factory.CreateLogsExporter(context.Background(), component.ExporterCreateSettings{}, &defaultCfg)
|
|
||||||
assert.Error(t, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestNewExporterFactory_WithOptions(t *testing.T) {
|
|
||||||
const typeStr = "test"
|
|
||||||
defaultCfg := config.NewExporterSettings(component.NewID(typeStr))
|
|
||||||
factory := component.NewExporterFactory(
|
|
||||||
typeStr,
|
|
||||||
func() component.Config { return &defaultCfg },
|
|
||||||
component.WithTracesExporter(createTracesExporter, component.StabilityLevelDevelopment),
|
|
||||||
component.WithMetricsExporter(createMetricsExporter, component.StabilityLevelAlpha),
|
|
||||||
component.WithLogsExporter(createLogsExporter, component.StabilityLevelDeprecated))
|
|
||||||
assert.EqualValues(t, typeStr, factory.Type())
|
|
||||||
assert.EqualValues(t, &defaultCfg, factory.CreateDefaultConfig())
|
|
||||||
|
|
||||||
assert.Equal(t, component.StabilityLevelDevelopment, factory.TracesExporterStability())
|
|
||||||
_, err := factory.CreateTracesExporter(context.Background(), component.ExporterCreateSettings{}, &defaultCfg)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
|
|
||||||
assert.Equal(t, component.StabilityLevelAlpha, factory.MetricsExporterStability())
|
|
||||||
_, err = factory.CreateMetricsExporter(context.Background(), component.ExporterCreateSettings{}, &defaultCfg)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
|
|
||||||
assert.Equal(t, component.StabilityLevelDeprecated, factory.LogsExporterStability())
|
|
||||||
_, err = factory.CreateLogsExporter(context.Background(), component.ExporterCreateSettings{}, &defaultCfg)
|
|
||||||
assert.NoError(t, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
func createTracesExporter(context.Context, component.ExporterCreateSettings, component.Config) (component.TracesExporter, error) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func createMetricsExporter(context.Context, component.ExporterCreateSettings, component.Config) (component.MetricsExporter, error) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func createLogsExporter(context.Context, component.ExporterCreateSettings, component.Config) (component.LogsExporter, error) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
@ -62,9 +62,7 @@ func MakeProcessorFactoryMap(factories ...ProcessorFactory) (map[Type]ProcessorF
|
||||||
return fMap, nil
|
return fMap, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// MakeExporterFactoryMap takes a list of exporter factories and returns a map
|
// Deprecated: [v0.67.0] use exporter.MakeFactoryMap
|
||||||
// with factory type as keys. It returns a non-nil error when more than one factories
|
|
||||||
// have the same type.
|
|
||||||
func MakeExporterFactoryMap(factories ...ExporterFactory) (map[Type]ExporterFactory, error) {
|
func MakeExporterFactoryMap(factories ...ExporterFactory) (map[Type]ExporterFactory, error) {
|
||||||
fMap := map[Type]ExporterFactory{}
|
fMap := map[Type]ExporterFactory{}
|
||||||
for _, f := range factories {
|
for _, f := range factories {
|
||||||
|
|
|
||||||
|
|
@ -95,41 +95,3 @@ func TestMakeProcessorFactoryMap(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMakeExporterFactoryMap(t *testing.T) {
|
|
||||||
type testCase struct {
|
|
||||||
name string
|
|
||||||
in []ExporterFactory
|
|
||||||
out map[Type]ExporterFactory
|
|
||||||
}
|
|
||||||
|
|
||||||
p1 := NewExporterFactory("p1", nil)
|
|
||||||
p2 := NewExporterFactory("p2", nil)
|
|
||||||
testCases := []testCase{
|
|
||||||
{
|
|
||||||
name: "different names",
|
|
||||||
in: []ExporterFactory{p1, p2},
|
|
||||||
out: map[Type]ExporterFactory{
|
|
||||||
p1.Type(): p1,
|
|
||||||
p2.Type(): p2,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "same name",
|
|
||||||
in: []ExporterFactory{p1, p2, NewExporterFactory("p1", nil)},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := range testCases {
|
|
||||||
tt := testCases[i]
|
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
|
||||||
out, err := MakeExporterFactoryMap(tt.in...)
|
|
||||||
if tt.out == nil {
|
|
||||||
assert.Error(t, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
assert.NoError(t, err)
|
|
||||||
assert.Equal(t, tt.out, out)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package exporter // import "go.opentelemetry.io/collector/exporter"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.opentelemetry.io/collector/component"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Traces is an exporter that can consume traces.
|
||||||
|
type Traces = component.TracesExporter //nolint:staticcheck
|
||||||
|
|
||||||
|
// Metrics is an exporter that can consume metrics.
|
||||||
|
type Metrics = component.MetricsExporter //nolint:staticcheck
|
||||||
|
|
||||||
|
// Logs is an exporter that can consume logs.
|
||||||
|
type Logs = component.LogsExporter //nolint:staticcheck
|
||||||
|
|
||||||
|
// CreateSettings configures exporter creators.
|
||||||
|
type CreateSettings = component.ExporterCreateSettings //nolint:staticcheck
|
||||||
|
|
||||||
|
// Factory is factory interface for exporters.
|
||||||
|
//
|
||||||
|
// This interface cannot be directly implemented. Implementations must
|
||||||
|
// use the NewFactory to implement it.
|
||||||
|
type Factory = component.ExporterFactory //nolint:staticcheck
|
||||||
|
|
||||||
|
// FactoryOption apply changes to Factory.
|
||||||
|
type FactoryOption = component.ExporterFactoryOption //nolint:staticcheck
|
||||||
|
|
||||||
|
// CreateTracesFunc is the equivalent of Factory.CreateTraces.
|
||||||
|
type CreateTracesFunc = component.CreateTracesExporterFunc //nolint:staticcheck
|
||||||
|
|
||||||
|
// CreateMetricsFunc is the equivalent of Factory.CreateMetrics.
|
||||||
|
type CreateMetricsFunc = component.CreateMetricsExporterFunc //nolint:staticcheck
|
||||||
|
|
||||||
|
// CreateLogsFunc is the equivalent of Factory.CreateLogs.
|
||||||
|
type CreateLogsFunc = component.CreateLogsExporterFunc //nolint:staticcheck
|
||||||
|
|
||||||
|
// WithTraces overrides the default "error not supported" implementation for CreateTracesExporter and the default "undefined" stability level.
|
||||||
|
var WithTraces = component.WithTracesExporter //nolint:staticcheck
|
||||||
|
|
||||||
|
// WithMetrics overrides the default "error not supported" implementation for CreateMetricsExporter and the default "undefined" stability level.
|
||||||
|
var WithMetrics = component.WithMetricsExporter //nolint:staticcheck
|
||||||
|
|
||||||
|
// WithLogs overrides the default "error not supported" implementation for CreateLogsExporter and the default "undefined" stability level.
|
||||||
|
var WithLogs = component.WithLogsExporter //nolint:staticcheck
|
||||||
|
|
||||||
|
// NewFactory returns a Factory.
|
||||||
|
var NewFactory = component.NewExporterFactory //nolint:staticcheck
|
||||||
|
|
||||||
|
// MakeFactoryMap takes a list of exporter factories and returns a map
|
||||||
|
// with factory type as keys. It returns a non-nil error when more than one factories
|
||||||
|
// have the same type.
|
||||||
|
var MakeFactoryMap = component.MakeExporterFactoryMap //nolint:staticcheck
|
||||||
|
|
@ -0,0 +1,118 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
// TODO: Move tests back to component package after config.*Settings are removed.
|
||||||
|
|
||||||
|
package exporter
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/collector/component"
|
||||||
|
"go.opentelemetry.io/collector/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNewFactory(t *testing.T) {
|
||||||
|
const typeStr = "test"
|
||||||
|
defaultCfg := config.NewExporterSettings(component.NewID(typeStr))
|
||||||
|
factory := NewFactory(
|
||||||
|
typeStr,
|
||||||
|
func() component.Config { return &defaultCfg })
|
||||||
|
assert.EqualValues(t, typeStr, factory.Type())
|
||||||
|
assert.EqualValues(t, &defaultCfg, factory.CreateDefaultConfig())
|
||||||
|
_, err := factory.CreateTracesExporter(context.Background(), CreateSettings{}, &defaultCfg)
|
||||||
|
assert.Error(t, err)
|
||||||
|
_, err = factory.CreateMetricsExporter(context.Background(), CreateSettings{}, &defaultCfg)
|
||||||
|
assert.Error(t, err)
|
||||||
|
_, err = factory.CreateLogsExporter(context.Background(), CreateSettings{}, &defaultCfg)
|
||||||
|
assert.Error(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewFactoryWithOptions(t *testing.T) {
|
||||||
|
const typeStr = "test"
|
||||||
|
defaultCfg := config.NewExporterSettings(component.NewID(typeStr))
|
||||||
|
factory := NewFactory(
|
||||||
|
typeStr,
|
||||||
|
func() component.Config { return &defaultCfg },
|
||||||
|
WithTraces(createTracesExporter, component.StabilityLevelDevelopment),
|
||||||
|
WithMetrics(createMetricsExporter, component.StabilityLevelAlpha),
|
||||||
|
WithLogs(createLogsExporter, component.StabilityLevelDeprecated))
|
||||||
|
assert.EqualValues(t, typeStr, factory.Type())
|
||||||
|
assert.EqualValues(t, &defaultCfg, factory.CreateDefaultConfig())
|
||||||
|
|
||||||
|
assert.Equal(t, component.StabilityLevelDevelopment, factory.TracesExporterStability())
|
||||||
|
_, err := factory.CreateTracesExporter(context.Background(), CreateSettings{}, &defaultCfg)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
assert.Equal(t, component.StabilityLevelAlpha, factory.MetricsExporterStability())
|
||||||
|
_, err = factory.CreateMetricsExporter(context.Background(), CreateSettings{}, &defaultCfg)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
assert.Equal(t, component.StabilityLevelDeprecated, factory.LogsExporterStability())
|
||||||
|
_, err = factory.CreateLogsExporter(context.Background(), CreateSettings{}, &defaultCfg)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMakeFactoryMap(t *testing.T) {
|
||||||
|
type testCase struct {
|
||||||
|
name string
|
||||||
|
in []Factory
|
||||||
|
out map[component.Type]Factory
|
||||||
|
}
|
||||||
|
|
||||||
|
p1 := NewFactory("p1", nil)
|
||||||
|
p2 := NewFactory("p2", nil)
|
||||||
|
testCases := []testCase{
|
||||||
|
{
|
||||||
|
name: "different names",
|
||||||
|
in: []Factory{p1, p2},
|
||||||
|
out: map[component.Type]Factory{
|
||||||
|
p1.Type(): p1,
|
||||||
|
p2.Type(): p2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "same name",
|
||||||
|
in: []Factory{p1, p2, NewFactory("p1", nil)},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := range testCases {
|
||||||
|
tt := testCases[i]
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
out, err := MakeFactoryMap(tt.in...)
|
||||||
|
if tt.out == nil {
|
||||||
|
assert.Error(t, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, tt.out, out)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func createTracesExporter(context.Context, CreateSettings, component.Config) (Traces, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func createMetricsExporter(context.Context, CreateSettings, component.Config) (Metrics, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func createLogsExporter(context.Context, CreateSettings, component.Config) (Logs, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
@ -20,6 +20,7 @@ import (
|
||||||
|
|
||||||
"go.opentelemetry.io/collector/component"
|
"go.opentelemetry.io/collector/component"
|
||||||
"go.opentelemetry.io/collector/consumer"
|
"go.opentelemetry.io/collector/consumer"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/exporter/exporterhelper/internal"
|
"go.opentelemetry.io/collector/exporter/exporterhelper/internal"
|
||||||
"go.opentelemetry.io/collector/obsreport"
|
"go.opentelemetry.io/collector/obsreport"
|
||||||
)
|
)
|
||||||
|
|
@ -155,7 +156,7 @@ type baseExporter struct {
|
||||||
qrSender *queuedRetrySender
|
qrSender *queuedRetrySender
|
||||||
}
|
}
|
||||||
|
|
||||||
func newBaseExporter(set component.ExporterCreateSettings, bs *baseSettings, signal component.DataType, reqUnmarshaler internal.RequestUnmarshaler) (*baseExporter, error) {
|
func newBaseExporter(set exporter.CreateSettings, bs *baseSettings, signal component.DataType, reqUnmarshaler internal.RequestUnmarshaler) (*baseExporter, error) {
|
||||||
be := &baseExporter{}
|
be := &baseExporter{}
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
|
|
||||||
|
|
@ -26,13 +26,14 @@ import (
|
||||||
"go.opentelemetry.io/collector/component"
|
"go.opentelemetry.io/collector/component"
|
||||||
"go.opentelemetry.io/collector/component/componenttest"
|
"go.opentelemetry.io/collector/component/componenttest"
|
||||||
"go.opentelemetry.io/collector/consumer"
|
"go.opentelemetry.io/collector/consumer"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/exporter/exporterhelper/internal"
|
"go.opentelemetry.io/collector/exporter/exporterhelper/internal"
|
||||||
"go.opentelemetry.io/collector/pdata/ptrace"
|
"go.opentelemetry.io/collector/pdata/ptrace"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
defaultID = component.NewID("test")
|
defaultID = component.NewID("test")
|
||||||
defaultSettings = func() component.ExporterCreateSettings {
|
defaultSettings = func() exporter.CreateSettings {
|
||||||
set := componenttest.NewNopExporterCreateSettings()
|
set := componenttest.NewNopExporterCreateSettings()
|
||||||
set.ID = defaultID
|
set.ID = defaultID
|
||||||
return set
|
return set
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ import (
|
||||||
"go.opentelemetry.io/collector/component"
|
"go.opentelemetry.io/collector/component"
|
||||||
"go.opentelemetry.io/collector/consumer"
|
"go.opentelemetry.io/collector/consumer"
|
||||||
"go.opentelemetry.io/collector/consumer/consumererror"
|
"go.opentelemetry.io/collector/consumer/consumererror"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/exporter/exporterhelper/internal"
|
"go.opentelemetry.io/collector/exporter/exporterhelper/internal"
|
||||||
"go.opentelemetry.io/collector/pdata/plog"
|
"go.opentelemetry.io/collector/pdata/plog"
|
||||||
)
|
)
|
||||||
|
|
@ -77,14 +78,14 @@ type logsExporter struct {
|
||||||
consumer.Logs
|
consumer.Logs
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewLogsExporter creates a component.LogsExporter that records observability metrics and wraps every request with a Span.
|
// NewLogsExporter creates a exporter.Logs that records observability metrics and wraps every request with a Span.
|
||||||
func NewLogsExporter(
|
func NewLogsExporter(
|
||||||
_ context.Context,
|
_ context.Context,
|
||||||
set component.ExporterCreateSettings,
|
set exporter.CreateSettings,
|
||||||
cfg component.Config,
|
cfg component.Config,
|
||||||
pusher consumer.ConsumeLogsFunc,
|
pusher consumer.ConsumeLogsFunc,
|
||||||
options ...Option,
|
options ...Option,
|
||||||
) (component.LogsExporter, error) {
|
) (exporter.Logs, error) {
|
||||||
if cfg == nil {
|
if cfg == nil {
|
||||||
return nil, errNilConfig
|
return nil, errNilConfig
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ import (
|
||||||
"go.opentelemetry.io/collector/config"
|
"go.opentelemetry.io/collector/config"
|
||||||
"go.opentelemetry.io/collector/consumer"
|
"go.opentelemetry.io/collector/consumer"
|
||||||
"go.opentelemetry.io/collector/consumer/consumererror"
|
"go.opentelemetry.io/collector/consumer/consumererror"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/internal/obsreportconfig/obsmetrics"
|
"go.opentelemetry.io/collector/internal/obsreportconfig/obsmetrics"
|
||||||
"go.opentelemetry.io/collector/internal/testdata"
|
"go.opentelemetry.io/collector/internal/testdata"
|
||||||
"go.opentelemetry.io/collector/obsreport/obsreporttest"
|
"go.opentelemetry.io/collector/obsreport/obsreporttest"
|
||||||
|
|
@ -65,7 +66,7 @@ func TestLogsExporter_InvalidName(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLogsExporter_NilLogger(t *testing.T) {
|
func TestLogsExporter_NilLogger(t *testing.T) {
|
||||||
le, err := NewLogsExporter(context.Background(), component.ExporterCreateSettings{}, &fakeLogsExporterConfig, newPushLogsData(nil))
|
le, err := NewLogsExporter(context.Background(), exporter.CreateSettings{}, &fakeLogsExporterConfig, newPushLogsData(nil))
|
||||||
require.Nil(t, le)
|
require.Nil(t, le)
|
||||||
require.Equal(t, errNilLogger, err)
|
require.Equal(t, errNilLogger, err)
|
||||||
}
|
}
|
||||||
|
|
@ -212,7 +213,7 @@ func newPushLogsData(retError error) consumer.ConsumeLogsFunc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkRecordedMetricsForLogsExporter(t *testing.T, tt obsreporttest.TestTelemetry, le component.LogsExporter, wantError error) {
|
func checkRecordedMetricsForLogsExporter(t *testing.T, tt obsreporttest.TestTelemetry, le exporter.Logs, wantError error) {
|
||||||
ld := testdata.GenerateLogs(2)
|
ld := testdata.GenerateLogs(2)
|
||||||
const numBatches = 7
|
const numBatches = 7
|
||||||
for i := 0; i < numBatches; i++ {
|
for i := 0; i < numBatches; i++ {
|
||||||
|
|
@ -227,7 +228,7 @@ func checkRecordedMetricsForLogsExporter(t *testing.T, tt obsreporttest.TestTele
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateLogsTraffic(t *testing.T, tracer trace.Tracer, le component.LogsExporter, numRequests int, wantError error) {
|
func generateLogsTraffic(t *testing.T, tracer trace.Tracer, le exporter.Logs, numRequests int, wantError error) {
|
||||||
ld := testdata.GenerateLogs(1)
|
ld := testdata.GenerateLogs(1)
|
||||||
ctx, span := tracer.Start(context.Background(), fakeLogsParentSpanName)
|
ctx, span := tracer.Start(context.Background(), fakeLogsParentSpanName)
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
@ -236,7 +237,7 @@ func generateLogsTraffic(t *testing.T, tracer trace.Tracer, le component.LogsExp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkWrapSpanForLogsExporter(t *testing.T, sr *tracetest.SpanRecorder, tracer trace.Tracer, le component.LogsExporter, wantError error, numLogRecords int64) {
|
func checkWrapSpanForLogsExporter(t *testing.T, sr *tracetest.SpanRecorder, tracer trace.Tracer, le exporter.Logs, wantError error, numLogRecords int64) {
|
||||||
const numRequests = 5
|
const numRequests = 5
|
||||||
generateLogsTraffic(t, tracer, le, numRequests, wantError)
|
generateLogsTraffic(t, tracer, le, numRequests, wantError)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ import (
|
||||||
"go.opentelemetry.io/collector/component"
|
"go.opentelemetry.io/collector/component"
|
||||||
"go.opentelemetry.io/collector/consumer"
|
"go.opentelemetry.io/collector/consumer"
|
||||||
"go.opentelemetry.io/collector/consumer/consumererror"
|
"go.opentelemetry.io/collector/consumer/consumererror"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/exporter/exporterhelper/internal"
|
"go.opentelemetry.io/collector/exporter/exporterhelper/internal"
|
||||||
"go.opentelemetry.io/collector/pdata/pmetric"
|
"go.opentelemetry.io/collector/pdata/pmetric"
|
||||||
)
|
)
|
||||||
|
|
@ -78,14 +79,14 @@ type metricsExporter struct {
|
||||||
consumer.Metrics
|
consumer.Metrics
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMetricsExporter creates a component.MetricsExporter that records observability metrics and wraps every request with a Span.
|
// NewMetricsExporter creates a exporter.Metrics that records observability metrics and wraps every request with a Span.
|
||||||
func NewMetricsExporter(
|
func NewMetricsExporter(
|
||||||
_ context.Context,
|
_ context.Context,
|
||||||
set component.ExporterCreateSettings,
|
set exporter.CreateSettings,
|
||||||
cfg component.Config,
|
cfg component.Config,
|
||||||
pusher consumer.ConsumeMetricsFunc,
|
pusher consumer.ConsumeMetricsFunc,
|
||||||
options ...Option,
|
options ...Option,
|
||||||
) (component.MetricsExporter, error) {
|
) (exporter.Metrics, error) {
|
||||||
if cfg == nil {
|
if cfg == nil {
|
||||||
return nil, errNilConfig
|
return nil, errNilConfig
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ import (
|
||||||
"go.opentelemetry.io/collector/config"
|
"go.opentelemetry.io/collector/config"
|
||||||
"go.opentelemetry.io/collector/consumer"
|
"go.opentelemetry.io/collector/consumer"
|
||||||
"go.opentelemetry.io/collector/consumer/consumererror"
|
"go.opentelemetry.io/collector/consumer/consumererror"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/internal/obsreportconfig/obsmetrics"
|
"go.opentelemetry.io/collector/internal/obsreportconfig/obsmetrics"
|
||||||
"go.opentelemetry.io/collector/internal/testdata"
|
"go.opentelemetry.io/collector/internal/testdata"
|
||||||
"go.opentelemetry.io/collector/obsreport/obsreporttest"
|
"go.opentelemetry.io/collector/obsreport/obsreporttest"
|
||||||
|
|
@ -64,7 +65,7 @@ func TestMetricsExporter_InvalidName(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMetricsExporter_NilLogger(t *testing.T) {
|
func TestMetricsExporter_NilLogger(t *testing.T) {
|
||||||
me, err := NewMetricsExporter(context.Background(), component.ExporterCreateSettings{}, &fakeMetricsExporterConfig, newPushMetricsData(nil))
|
me, err := NewMetricsExporter(context.Background(), exporter.CreateSettings{}, &fakeMetricsExporterConfig, newPushMetricsData(nil))
|
||||||
require.Nil(t, me)
|
require.Nil(t, me)
|
||||||
require.Equal(t, errNilLogger, err)
|
require.Equal(t, errNilLogger, err)
|
||||||
}
|
}
|
||||||
|
|
@ -213,7 +214,7 @@ func newPushMetricsData(retError error) consumer.ConsumeMetricsFunc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkRecordedMetricsForMetricsExporter(t *testing.T, tt obsreporttest.TestTelemetry, me component.MetricsExporter, wantError error) {
|
func checkRecordedMetricsForMetricsExporter(t *testing.T, tt obsreporttest.TestTelemetry, me exporter.Metrics, wantError error) {
|
||||||
md := testdata.GenerateMetrics(2)
|
md := testdata.GenerateMetrics(2)
|
||||||
const numBatches = 7
|
const numBatches = 7
|
||||||
for i := 0; i < numBatches; i++ {
|
for i := 0; i < numBatches; i++ {
|
||||||
|
|
@ -229,7 +230,7 @@ func checkRecordedMetricsForMetricsExporter(t *testing.T, tt obsreporttest.TestT
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateMetricsTraffic(t *testing.T, tracer trace.Tracer, me component.MetricsExporter, numRequests int, wantError error) {
|
func generateMetricsTraffic(t *testing.T, tracer trace.Tracer, me exporter.Metrics, numRequests int, wantError error) {
|
||||||
md := testdata.GenerateMetrics(1)
|
md := testdata.GenerateMetrics(1)
|
||||||
ctx, span := tracer.Start(context.Background(), fakeMetricsParentSpanName)
|
ctx, span := tracer.Start(context.Background(), fakeMetricsParentSpanName)
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
@ -238,7 +239,7 @@ func generateMetricsTraffic(t *testing.T, tracer trace.Tracer, me component.Metr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkWrapSpanForMetricsExporter(t *testing.T, sr *tracetest.SpanRecorder, tracer trace.Tracer, me component.MetricsExporter, wantError error, numMetricPoints int64) {
|
func checkWrapSpanForMetricsExporter(t *testing.T, sr *tracetest.SpanRecorder, tracer trace.Tracer, me exporter.Metrics, wantError error, numMetricPoints int64) {
|
||||||
const numRequests = 5
|
const numRequests = 5
|
||||||
generateMetricsTraffic(t, tracer, me, numRequests, wantError)
|
generateMetricsTraffic(t, tracer, me, numRequests, wantError)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ import (
|
||||||
"go.opentelemetry.io/collector/component"
|
"go.opentelemetry.io/collector/component"
|
||||||
"go.opentelemetry.io/collector/consumer"
|
"go.opentelemetry.io/collector/consumer"
|
||||||
"go.opentelemetry.io/collector/consumer/consumererror"
|
"go.opentelemetry.io/collector/consumer/consumererror"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/exporter/exporterhelper/internal"
|
"go.opentelemetry.io/collector/exporter/exporterhelper/internal"
|
||||||
"go.opentelemetry.io/collector/pdata/ptrace"
|
"go.opentelemetry.io/collector/pdata/ptrace"
|
||||||
)
|
)
|
||||||
|
|
@ -78,14 +79,14 @@ type traceExporter struct {
|
||||||
consumer.Traces
|
consumer.Traces
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTracesExporter creates a component.TracesExporter that records observability metrics and wraps every request with a Span.
|
// NewTracesExporter creates a exporter.Traces that records observability metrics and wraps every request with a Span.
|
||||||
func NewTracesExporter(
|
func NewTracesExporter(
|
||||||
_ context.Context,
|
_ context.Context,
|
||||||
set component.ExporterCreateSettings,
|
set exporter.CreateSettings,
|
||||||
cfg component.Config,
|
cfg component.Config,
|
||||||
pusher consumer.ConsumeTracesFunc,
|
pusher consumer.ConsumeTracesFunc,
|
||||||
options ...Option,
|
options ...Option,
|
||||||
) (component.TracesExporter, error) {
|
) (exporter.Traces, error) {
|
||||||
if cfg == nil {
|
if cfg == nil {
|
||||||
return nil, errNilConfig
|
return nil, errNilConfig
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ import (
|
||||||
"go.opentelemetry.io/collector/config"
|
"go.opentelemetry.io/collector/config"
|
||||||
"go.opentelemetry.io/collector/consumer"
|
"go.opentelemetry.io/collector/consumer"
|
||||||
"go.opentelemetry.io/collector/consumer/consumererror"
|
"go.opentelemetry.io/collector/consumer/consumererror"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/internal/obsreportconfig/obsmetrics"
|
"go.opentelemetry.io/collector/internal/obsreportconfig/obsmetrics"
|
||||||
"go.opentelemetry.io/collector/internal/testdata"
|
"go.opentelemetry.io/collector/internal/testdata"
|
||||||
"go.opentelemetry.io/collector/obsreport/obsreporttest"
|
"go.opentelemetry.io/collector/obsreport/obsreporttest"
|
||||||
|
|
@ -60,7 +61,7 @@ func TestTracesExporter_InvalidName(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTracesExporter_NilLogger(t *testing.T) {
|
func TestTracesExporter_NilLogger(t *testing.T) {
|
||||||
te, err := NewTracesExporter(context.Background(), component.ExporterCreateSettings{}, &fakeTracesExporterConfig, newTraceDataPusher(nil))
|
te, err := NewTracesExporter(context.Background(), exporter.CreateSettings{}, &fakeTracesExporterConfig, newTraceDataPusher(nil))
|
||||||
require.Nil(t, te)
|
require.Nil(t, te)
|
||||||
require.Equal(t, errNilLogger, err)
|
require.Equal(t, errNilLogger, err)
|
||||||
}
|
}
|
||||||
|
|
@ -213,7 +214,7 @@ func newTraceDataPusher(retError error) consumer.ConsumeTracesFunc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkRecordedMetricsForTracesExporter(t *testing.T, tt obsreporttest.TestTelemetry, te component.TracesExporter, wantError error) {
|
func checkRecordedMetricsForTracesExporter(t *testing.T, tt obsreporttest.TestTelemetry, te exporter.Traces, wantError error) {
|
||||||
td := testdata.GenerateTraces(2)
|
td := testdata.GenerateTraces(2)
|
||||||
const numBatches = 7
|
const numBatches = 7
|
||||||
for i := 0; i < numBatches; i++ {
|
for i := 0; i < numBatches; i++ {
|
||||||
|
|
@ -228,7 +229,7 @@ func checkRecordedMetricsForTracesExporter(t *testing.T, tt obsreporttest.TestTe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateTraceTraffic(t *testing.T, tracer trace.Tracer, te component.TracesExporter, numRequests int, wantError error) {
|
func generateTraceTraffic(t *testing.T, tracer trace.Tracer, te exporter.Traces, numRequests int, wantError error) {
|
||||||
td := ptrace.NewTraces()
|
td := ptrace.NewTraces()
|
||||||
td.ResourceSpans().AppendEmpty().ScopeSpans().AppendEmpty().Spans().AppendEmpty()
|
td.ResourceSpans().AppendEmpty().ScopeSpans().AppendEmpty().Spans().AppendEmpty()
|
||||||
ctx, span := tracer.Start(context.Background(), fakeTraceParentSpanName)
|
ctx, span := tracer.Start(context.Background(), fakeTraceParentSpanName)
|
||||||
|
|
@ -238,7 +239,7 @@ func generateTraceTraffic(t *testing.T, tracer trace.Tracer, te component.Traces
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkWrapSpanForTracesExporter(t *testing.T, sr *tracetest.SpanRecorder, tracer trace.Tracer, te component.TracesExporter, wantError error, numSpans int64) {
|
func checkWrapSpanForTracesExporter(t *testing.T, sr *tracetest.SpanRecorder, tracer trace.Tracer, te exporter.Traces, wantError error, numSpans int64) {
|
||||||
const numRequests = 5
|
const numRequests = 5
|
||||||
generateTraceTraffic(t, tracer, te, numRequests, wantError)
|
generateTraceTraffic(t, tracer, te, numRequests, wantError)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
// Copyright The OpenTelemetry Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package exportertest // import "go.opentelemetry.io/collector/exporter/exportertest"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.opentelemetry.io/collector/component/componenttest"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewNopCreateSettings returns a new nop settings for Create*Exporter functions.
|
||||||
|
var NewNopCreateSettings = componenttest.NewNopExporterCreateSettings
|
||||||
|
|
||||||
|
// NewNopFactory returns an exporter.Factory that constructs nop exporters.
|
||||||
|
var NewNopFactory = componenttest.NewNopExporterFactory
|
||||||
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package componenttest
|
package exportertest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
@ -22,34 +22,34 @@ import (
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
"go.opentelemetry.io/collector/component"
|
"go.opentelemetry.io/collector/component"
|
||||||
"go.opentelemetry.io/collector/config"
|
"go.opentelemetry.io/collector/component/componenttest"
|
||||||
"go.opentelemetry.io/collector/pdata/plog"
|
"go.opentelemetry.io/collector/pdata/plog"
|
||||||
"go.opentelemetry.io/collector/pdata/pmetric"
|
"go.opentelemetry.io/collector/pdata/pmetric"
|
||||||
"go.opentelemetry.io/collector/pdata/ptrace"
|
"go.opentelemetry.io/collector/pdata/ptrace"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestNewNopExporterFactory(t *testing.T) {
|
func TestNewNopFactory(t *testing.T) {
|
||||||
factory := NewNopExporterFactory()
|
factory := NewNopFactory()
|
||||||
require.NotNil(t, factory)
|
require.NotNil(t, factory)
|
||||||
assert.Equal(t, component.Type("nop"), factory.Type())
|
assert.Equal(t, component.Type("nop"), factory.Type())
|
||||||
cfg := factory.CreateDefaultConfig()
|
cfg := factory.CreateDefaultConfig()
|
||||||
assert.Equal(t, &nopExporterConfig{ExporterSettings: config.NewExporterSettings(component.NewID("nop"))}, cfg)
|
// assert.Equal(t, &nopExporterConfig{ExporterSettings: config.NewExporterSettings(component.NewID("nop"))}, cfg)
|
||||||
|
|
||||||
traces, err := factory.CreateTracesExporter(context.Background(), NewNopExporterCreateSettings(), cfg)
|
traces, err := factory.CreateTracesExporter(context.Background(), componenttest.NewNopExporterCreateSettings(), cfg)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.NoError(t, traces.Start(context.Background(), NewNopHost()))
|
assert.NoError(t, traces.Start(context.Background(), componenttest.NewNopHost()))
|
||||||
assert.NoError(t, traces.ConsumeTraces(context.Background(), ptrace.NewTraces()))
|
assert.NoError(t, traces.ConsumeTraces(context.Background(), ptrace.NewTraces()))
|
||||||
assert.NoError(t, traces.Shutdown(context.Background()))
|
assert.NoError(t, traces.Shutdown(context.Background()))
|
||||||
|
|
||||||
metrics, err := factory.CreateMetricsExporter(context.Background(), NewNopExporterCreateSettings(), cfg)
|
metrics, err := factory.CreateMetricsExporter(context.Background(), componenttest.NewNopExporterCreateSettings(), cfg)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.NoError(t, metrics.Start(context.Background(), NewNopHost()))
|
assert.NoError(t, metrics.Start(context.Background(), componenttest.NewNopHost()))
|
||||||
assert.NoError(t, metrics.ConsumeMetrics(context.Background(), pmetric.NewMetrics()))
|
assert.NoError(t, metrics.ConsumeMetrics(context.Background(), pmetric.NewMetrics()))
|
||||||
assert.NoError(t, metrics.Shutdown(context.Background()))
|
assert.NoError(t, metrics.Shutdown(context.Background()))
|
||||||
|
|
||||||
logs, err := factory.CreateLogsExporter(context.Background(), NewNopExporterCreateSettings(), cfg)
|
logs, err := factory.CreateLogsExporter(context.Background(), componenttest.NewNopExporterCreateSettings(), cfg)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.NoError(t, logs.Start(context.Background(), NewNopHost()))
|
assert.NoError(t, logs.Start(context.Background(), componenttest.NewNopHost()))
|
||||||
assert.NoError(t, logs.ConsumeLogs(context.Background(), plog.NewLogs()))
|
assert.NoError(t, logs.ConsumeLogs(context.Background(), plog.NewLogs()))
|
||||||
assert.NoError(t, logs.Shutdown(context.Background()))
|
assert.NoError(t, logs.Shutdown(context.Background()))
|
||||||
}
|
}
|
||||||
|
|
@ -26,6 +26,7 @@ import (
|
||||||
"go.opentelemetry.io/collector/config"
|
"go.opentelemetry.io/collector/config"
|
||||||
"go.opentelemetry.io/collector/config/configtelemetry"
|
"go.opentelemetry.io/collector/config/configtelemetry"
|
||||||
"go.opentelemetry.io/collector/consumer"
|
"go.opentelemetry.io/collector/consumer"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/exporter/exporterhelper"
|
"go.opentelemetry.io/collector/exporter/exporterhelper"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -39,13 +40,13 @@ const (
|
||||||
var onceWarnLogLevel sync.Once
|
var onceWarnLogLevel sync.Once
|
||||||
|
|
||||||
// NewFactory creates a factory for Logging exporter
|
// NewFactory creates a factory for Logging exporter
|
||||||
func NewFactory() component.ExporterFactory {
|
func NewFactory() exporter.Factory {
|
||||||
return component.NewExporterFactory(
|
return exporter.NewFactory(
|
||||||
typeStr,
|
typeStr,
|
||||||
createDefaultConfig,
|
createDefaultConfig,
|
||||||
component.WithTracesExporter(createTracesExporter, component.StabilityLevelDevelopment),
|
exporter.WithTraces(createTracesExporter, component.StabilityLevelDevelopment),
|
||||||
component.WithMetricsExporter(createMetricsExporter, component.StabilityLevelDevelopment),
|
exporter.WithMetrics(createMetricsExporter, component.StabilityLevelDevelopment),
|
||||||
component.WithLogsExporter(createLogsExporter, component.StabilityLevelDevelopment),
|
exporter.WithLogs(createLogsExporter, component.StabilityLevelDevelopment),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -59,7 +60,7 @@ func createDefaultConfig() component.Config {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func createTracesExporter(ctx context.Context, set component.ExporterCreateSettings, config component.Config) (component.TracesExporter, error) {
|
func createTracesExporter(ctx context.Context, set exporter.CreateSettings, config component.Config) (exporter.Traces, error) {
|
||||||
cfg := config.(*Config)
|
cfg := config.(*Config)
|
||||||
exporterLogger := createLogger(cfg, set.TelemetrySettings.Logger)
|
exporterLogger := createLogger(cfg, set.TelemetrySettings.Logger)
|
||||||
s := newLoggingExporter(exporterLogger, cfg.Verbosity)
|
s := newLoggingExporter(exporterLogger, cfg.Verbosity)
|
||||||
|
|
@ -74,7 +75,7 @@ func createTracesExporter(ctx context.Context, set component.ExporterCreateSetti
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func createMetricsExporter(ctx context.Context, set component.ExporterCreateSettings, config component.Config) (component.MetricsExporter, error) {
|
func createMetricsExporter(ctx context.Context, set exporter.CreateSettings, config component.Config) (exporter.Metrics, error) {
|
||||||
cfg := config.(*Config)
|
cfg := config.(*Config)
|
||||||
exporterLogger := createLogger(cfg, set.TelemetrySettings.Logger)
|
exporterLogger := createLogger(cfg, set.TelemetrySettings.Logger)
|
||||||
s := newLoggingExporter(exporterLogger, cfg.Verbosity)
|
s := newLoggingExporter(exporterLogger, cfg.Verbosity)
|
||||||
|
|
@ -89,7 +90,7 @@ func createMetricsExporter(ctx context.Context, set component.ExporterCreateSett
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func createLogsExporter(ctx context.Context, set component.ExporterCreateSettings, config component.Config) (component.LogsExporter, error) {
|
func createLogsExporter(ctx context.Context, set exporter.CreateSettings, config component.Config) (exporter.Logs, error) {
|
||||||
cfg := config.(*Config)
|
cfg := config.(*Config)
|
||||||
exporterLogger := createLogger(cfg, set.TelemetrySettings.Logger)
|
exporterLogger := createLogger(cfg, set.TelemetrySettings.Logger)
|
||||||
s := newLoggingExporter(exporterLogger, cfg.Verbosity)
|
s := newLoggingExporter(exporterLogger, cfg.Verbosity)
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ import (
|
||||||
"go.opentelemetry.io/collector/config/configcompression"
|
"go.opentelemetry.io/collector/config/configcompression"
|
||||||
"go.opentelemetry.io/collector/config/configgrpc"
|
"go.opentelemetry.io/collector/config/configgrpc"
|
||||||
"go.opentelemetry.io/collector/consumer"
|
"go.opentelemetry.io/collector/consumer"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/exporter/exporterhelper"
|
"go.opentelemetry.io/collector/exporter/exporterhelper"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -31,13 +32,13 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewFactory creates a factory for OTLP exporter.
|
// NewFactory creates a factory for OTLP exporter.
|
||||||
func NewFactory() component.ExporterFactory {
|
func NewFactory() exporter.Factory {
|
||||||
return component.NewExporterFactory(
|
return exporter.NewFactory(
|
||||||
typeStr,
|
typeStr,
|
||||||
createDefaultConfig,
|
createDefaultConfig,
|
||||||
component.WithTracesExporter(createTracesExporter, component.StabilityLevelStable),
|
exporter.WithTraces(createTracesExporter, component.StabilityLevelStable),
|
||||||
component.WithMetricsExporter(createMetricsExporter, component.StabilityLevelStable),
|
exporter.WithMetrics(createMetricsExporter, component.StabilityLevelStable),
|
||||||
component.WithLogsExporter(createLogsExporter, component.StabilityLevelBeta),
|
exporter.WithLogs(createLogsExporter, component.StabilityLevelBeta),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -59,9 +60,9 @@ func createDefaultConfig() component.Config {
|
||||||
|
|
||||||
func createTracesExporter(
|
func createTracesExporter(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
set component.ExporterCreateSettings,
|
set exporter.CreateSettings,
|
||||||
cfg component.Config,
|
cfg component.Config,
|
||||||
) (component.TracesExporter, error) {
|
) (exporter.Traces, error) {
|
||||||
oce, err := newExporter(cfg, set)
|
oce, err := newExporter(cfg, set)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
@ -79,9 +80,9 @@ func createTracesExporter(
|
||||||
|
|
||||||
func createMetricsExporter(
|
func createMetricsExporter(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
set component.ExporterCreateSettings,
|
set exporter.CreateSettings,
|
||||||
cfg component.Config,
|
cfg component.Config,
|
||||||
) (component.MetricsExporter, error) {
|
) (exporter.Metrics, error) {
|
||||||
oce, err := newExporter(cfg, set)
|
oce, err := newExporter(cfg, set)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
@ -100,9 +101,9 @@ func createMetricsExporter(
|
||||||
|
|
||||||
func createLogsExporter(
|
func createLogsExporter(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
set component.ExporterCreateSettings,
|
set exporter.CreateSettings,
|
||||||
cfg component.Config,
|
cfg component.Config,
|
||||||
) (component.LogsExporter, error) {
|
) (exporter.Logs, error) {
|
||||||
oce, err := newExporter(cfg, set)
|
oce, err := newExporter(cfg, set)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ import (
|
||||||
|
|
||||||
"go.opentelemetry.io/collector/component"
|
"go.opentelemetry.io/collector/component"
|
||||||
"go.opentelemetry.io/collector/consumer/consumererror"
|
"go.opentelemetry.io/collector/consumer/consumererror"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/exporter/exporterhelper"
|
"go.opentelemetry.io/collector/exporter/exporterhelper"
|
||||||
"go.opentelemetry.io/collector/pdata/plog"
|
"go.opentelemetry.io/collector/pdata/plog"
|
||||||
"go.opentelemetry.io/collector/pdata/plog/plogotlp"
|
"go.opentelemetry.io/collector/pdata/plog/plogotlp"
|
||||||
|
|
@ -38,7 +39,7 @@ import (
|
||||||
"go.opentelemetry.io/collector/pdata/ptrace/ptraceotlp"
|
"go.opentelemetry.io/collector/pdata/ptrace/ptraceotlp"
|
||||||
)
|
)
|
||||||
|
|
||||||
type exporter struct {
|
type baseExporter struct {
|
||||||
// Input configuration.
|
// Input configuration.
|
||||||
config *Config
|
config *Config
|
||||||
|
|
||||||
|
|
@ -58,7 +59,7 @@ type exporter struct {
|
||||||
|
|
||||||
// Crete new exporter and start it. The exporter will begin connecting but
|
// Crete new exporter and start it. The exporter will begin connecting but
|
||||||
// this function may return before the connection is established.
|
// this function may return before the connection is established.
|
||||||
func newExporter(cfg component.Config, set component.ExporterCreateSettings) (*exporter, error) {
|
func newExporter(cfg component.Config, set exporter.CreateSettings) (*baseExporter, error) {
|
||||||
oCfg := cfg.(*Config)
|
oCfg := cfg.(*Config)
|
||||||
|
|
||||||
if oCfg.Endpoint == "" {
|
if oCfg.Endpoint == "" {
|
||||||
|
|
@ -68,12 +69,12 @@ func newExporter(cfg component.Config, set component.ExporterCreateSettings) (*e
|
||||||
userAgent := fmt.Sprintf("%s/%s (%s/%s)",
|
userAgent := fmt.Sprintf("%s/%s (%s/%s)",
|
||||||
set.BuildInfo.Description, set.BuildInfo.Version, runtime.GOOS, runtime.GOARCH)
|
set.BuildInfo.Description, set.BuildInfo.Version, runtime.GOOS, runtime.GOARCH)
|
||||||
|
|
||||||
return &exporter{config: oCfg, settings: set.TelemetrySettings, userAgent: userAgent}, nil
|
return &baseExporter{config: oCfg, settings: set.TelemetrySettings, userAgent: userAgent}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// start actually creates the gRPC connection. The client construction is deferred till this point as this
|
// start actually creates the gRPC connection. The client construction is deferred till this point as this
|
||||||
// is the only place we get hold of Extensions which are required to construct auth round tripper.
|
// is the only place we get hold of Extensions which are required to construct auth round tripper.
|
||||||
func (e *exporter) start(ctx context.Context, host component.Host) (err error) {
|
func (e *baseExporter) start(ctx context.Context, host component.Host) (err error) {
|
||||||
if e.clientConn, err = e.config.GRPCClientSettings.ToClientConn(ctx, host, e.settings, grpc.WithUserAgent(e.userAgent)); err != nil {
|
if e.clientConn, err = e.config.GRPCClientSettings.ToClientConn(ctx, host, e.settings, grpc.WithUserAgent(e.userAgent)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -88,32 +89,32 @@ func (e *exporter) start(ctx context.Context, host component.Host) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *exporter) shutdown(context.Context) error {
|
func (e *baseExporter) shutdown(context.Context) error {
|
||||||
if e.clientConn != nil {
|
if e.clientConn != nil {
|
||||||
return e.clientConn.Close()
|
return e.clientConn.Close()
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *exporter) pushTraces(ctx context.Context, td ptrace.Traces) error {
|
func (e *baseExporter) pushTraces(ctx context.Context, td ptrace.Traces) error {
|
||||||
req := ptraceotlp.NewExportRequestFromTraces(td)
|
req := ptraceotlp.NewExportRequestFromTraces(td)
|
||||||
_, err := e.traceExporter.Export(e.enhanceContext(ctx), req, e.callOptions...)
|
_, err := e.traceExporter.Export(e.enhanceContext(ctx), req, e.callOptions...)
|
||||||
return processError(err)
|
return processError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *exporter) pushMetrics(ctx context.Context, md pmetric.Metrics) error {
|
func (e *baseExporter) pushMetrics(ctx context.Context, md pmetric.Metrics) error {
|
||||||
req := pmetricotlp.NewExportRequestFromMetrics(md)
|
req := pmetricotlp.NewExportRequestFromMetrics(md)
|
||||||
_, err := e.metricExporter.Export(e.enhanceContext(ctx), req, e.callOptions...)
|
_, err := e.metricExporter.Export(e.enhanceContext(ctx), req, e.callOptions...)
|
||||||
return processError(err)
|
return processError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *exporter) pushLogs(ctx context.Context, ld plog.Logs) error {
|
func (e *baseExporter) pushLogs(ctx context.Context, ld plog.Logs) error {
|
||||||
req := plogotlp.NewExportRequestFromLogs(ld)
|
req := plogotlp.NewExportRequestFromLogs(ld)
|
||||||
_, err := e.logExporter.Export(e.enhanceContext(ctx), req, e.callOptions...)
|
_, err := e.logExporter.Export(e.enhanceContext(ctx), req, e.callOptions...)
|
||||||
return processError(err)
|
return processError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *exporter) enhanceContext(ctx context.Context) context.Context {
|
func (e *baseExporter) enhanceContext(ctx context.Context) context.Context {
|
||||||
if e.metadata.Len() > 0 {
|
if e.metadata.Len() > 0 {
|
||||||
return metadata.NewOutgoingContext(ctx, e.metadata)
|
return metadata.NewOutgoingContext(ctx, e.metadata)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -34,10 +34,10 @@ import (
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
"google.golang.org/protobuf/types/known/durationpb"
|
"google.golang.org/protobuf/types/known/durationpb"
|
||||||
|
|
||||||
"go.opentelemetry.io/collector/component"
|
|
||||||
"go.opentelemetry.io/collector/component/componenttest"
|
"go.opentelemetry.io/collector/component/componenttest"
|
||||||
"go.opentelemetry.io/collector/config/configgrpc"
|
"go.opentelemetry.io/collector/config/configgrpc"
|
||||||
"go.opentelemetry.io/collector/config/configtls"
|
"go.opentelemetry.io/collector/config/configtls"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/internal/testdata"
|
"go.opentelemetry.io/collector/internal/testdata"
|
||||||
"go.opentelemetry.io/collector/pdata/plog"
|
"go.opentelemetry.io/collector/pdata/plog"
|
||||||
"go.opentelemetry.io/collector/pdata/plog/plogotlp"
|
"go.opentelemetry.io/collector/pdata/plog/plogotlp"
|
||||||
|
|
@ -586,7 +586,7 @@ func TestSendTracesOnResourceExhaustion(t *testing.T) {
|
||||||
}, 10*time.Second, 5*time.Millisecond, "Should retry if RetryInfo is included into status details by the server.")
|
}, 10*time.Second, 5*time.Millisecond, "Should retry if RetryInfo is included into status details by the server.")
|
||||||
}
|
}
|
||||||
|
|
||||||
func startServerAndMakeRequest(t *testing.T, exp component.TracesExporter, td ptrace.Traces, ln net.Listener) {
|
func startServerAndMakeRequest(t *testing.T, exp exporter.Traces, td ptrace.Traces, ln net.Listener) {
|
||||||
rcv, _ := otlpTracesReceiverOnGRPCServer(ln, false)
|
rcv, _ := otlpTracesReceiverOnGRPCServer(ln, false)
|
||||||
defer rcv.srv.GracefulStop()
|
defer rcv.srv.GracefulStop()
|
||||||
// Ensure that initially there is no data in the receiver.
|
// Ensure that initially there is no data in the receiver.
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ import (
|
||||||
"go.opentelemetry.io/collector/config/configcompression"
|
"go.opentelemetry.io/collector/config/configcompression"
|
||||||
"go.opentelemetry.io/collector/config/confighttp"
|
"go.opentelemetry.io/collector/config/confighttp"
|
||||||
"go.opentelemetry.io/collector/consumer"
|
"go.opentelemetry.io/collector/consumer"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/exporter/exporterhelper"
|
"go.opentelemetry.io/collector/exporter/exporterhelper"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -34,13 +35,13 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewFactory creates a factory for OTLP exporter.
|
// NewFactory creates a factory for OTLP exporter.
|
||||||
func NewFactory() component.ExporterFactory {
|
func NewFactory() exporter.Factory {
|
||||||
return component.NewExporterFactory(
|
return exporter.NewFactory(
|
||||||
typeStr,
|
typeStr,
|
||||||
createDefaultConfig,
|
createDefaultConfig,
|
||||||
component.WithTracesExporter(createTracesExporter, component.StabilityLevelStable),
|
exporter.WithTraces(createTracesExporter, component.StabilityLevelStable),
|
||||||
component.WithMetricsExporter(createMetricsExporter, component.StabilityLevelStable),
|
exporter.WithMetrics(createMetricsExporter, component.StabilityLevelStable),
|
||||||
component.WithLogsExporter(createLogsExporter, component.StabilityLevelBeta),
|
exporter.WithLogs(createLogsExporter, component.StabilityLevelBeta),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -78,9 +79,9 @@ func composeSignalURL(oCfg *Config, signalOverrideURL string, signalName string)
|
||||||
|
|
||||||
func createTracesExporter(
|
func createTracesExporter(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
set component.ExporterCreateSettings,
|
set exporter.CreateSettings,
|
||||||
cfg component.Config,
|
cfg component.Config,
|
||||||
) (component.TracesExporter, error) {
|
) (exporter.Traces, error) {
|
||||||
oce, err := newExporter(cfg, set)
|
oce, err := newExporter(cfg, set)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
@ -104,9 +105,9 @@ func createTracesExporter(
|
||||||
|
|
||||||
func createMetricsExporter(
|
func createMetricsExporter(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
set component.ExporterCreateSettings,
|
set exporter.CreateSettings,
|
||||||
cfg component.Config,
|
cfg component.Config,
|
||||||
) (component.MetricsExporter, error) {
|
) (exporter.Metrics, error) {
|
||||||
oce, err := newExporter(cfg, set)
|
oce, err := newExporter(cfg, set)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
@ -130,9 +131,9 @@ func createMetricsExporter(
|
||||||
|
|
||||||
func createLogsExporter(
|
func createLogsExporter(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
set component.ExporterCreateSettings,
|
set exporter.CreateSettings,
|
||||||
cfg component.Config,
|
cfg component.Config,
|
||||||
) (component.LogsExporter, error) {
|
) (exporter.Logs, error) {
|
||||||
oce, err := newExporter(cfg, set)
|
oce, err := newExporter(cfg, set)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ import (
|
||||||
|
|
||||||
"go.opentelemetry.io/collector/component"
|
"go.opentelemetry.io/collector/component"
|
||||||
"go.opentelemetry.io/collector/consumer/consumererror"
|
"go.opentelemetry.io/collector/consumer/consumererror"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/exporter/exporterhelper"
|
"go.opentelemetry.io/collector/exporter/exporterhelper"
|
||||||
"go.opentelemetry.io/collector/pdata/plog"
|
"go.opentelemetry.io/collector/pdata/plog"
|
||||||
"go.opentelemetry.io/collector/pdata/plog/plogotlp"
|
"go.opentelemetry.io/collector/pdata/plog/plogotlp"
|
||||||
|
|
@ -41,7 +42,7 @@ import (
|
||||||
"go.opentelemetry.io/collector/pdata/ptrace/ptraceotlp"
|
"go.opentelemetry.io/collector/pdata/ptrace/ptraceotlp"
|
||||||
)
|
)
|
||||||
|
|
||||||
type exporter struct {
|
type baseExporter struct {
|
||||||
// Input configuration.
|
// Input configuration.
|
||||||
config *Config
|
config *Config
|
||||||
client *http.Client
|
client *http.Client
|
||||||
|
|
@ -60,7 +61,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
// Create new exporter.
|
// Create new exporter.
|
||||||
func newExporter(cfg component.Config, set component.ExporterCreateSettings) (*exporter, error) {
|
func newExporter(cfg component.Config, set exporter.CreateSettings) (*baseExporter, error) {
|
||||||
oCfg := cfg.(*Config)
|
oCfg := cfg.(*Config)
|
||||||
|
|
||||||
if oCfg.Endpoint != "" {
|
if oCfg.Endpoint != "" {
|
||||||
|
|
@ -74,7 +75,7 @@ func newExporter(cfg component.Config, set component.ExporterCreateSettings) (*e
|
||||||
set.BuildInfo.Description, set.BuildInfo.Version, runtime.GOOS, runtime.GOARCH)
|
set.BuildInfo.Description, set.BuildInfo.Version, runtime.GOOS, runtime.GOARCH)
|
||||||
|
|
||||||
// client construction is deferred to start
|
// client construction is deferred to start
|
||||||
return &exporter{
|
return &baseExporter{
|
||||||
config: oCfg,
|
config: oCfg,
|
||||||
logger: set.Logger,
|
logger: set.Logger,
|
||||||
userAgent: userAgent,
|
userAgent: userAgent,
|
||||||
|
|
@ -84,7 +85,7 @@ func newExporter(cfg component.Config, set component.ExporterCreateSettings) (*e
|
||||||
|
|
||||||
// start actually creates the HTTP client. The client construction is deferred till this point as this
|
// start actually creates the HTTP client. The client construction is deferred till this point as this
|
||||||
// is the only place we get hold of Extensions which are required to construct auth round tripper.
|
// is the only place we get hold of Extensions which are required to construct auth round tripper.
|
||||||
func (e *exporter) start(_ context.Context, host component.Host) error {
|
func (e *baseExporter) start(_ context.Context, host component.Host) error {
|
||||||
client, err := e.config.HTTPClientSettings.ToClient(host, e.settings)
|
client, err := e.config.HTTPClientSettings.ToClient(host, e.settings)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -93,7 +94,7 @@ func (e *exporter) start(_ context.Context, host component.Host) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *exporter) pushTraces(ctx context.Context, td ptrace.Traces) error {
|
func (e *baseExporter) pushTraces(ctx context.Context, td ptrace.Traces) error {
|
||||||
tr := ptraceotlp.NewExportRequestFromTraces(td)
|
tr := ptraceotlp.NewExportRequestFromTraces(td)
|
||||||
request, err := tr.MarshalProto()
|
request, err := tr.MarshalProto()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -103,7 +104,7 @@ func (e *exporter) pushTraces(ctx context.Context, td ptrace.Traces) error {
|
||||||
return e.export(ctx, e.tracesURL, request)
|
return e.export(ctx, e.tracesURL, request)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *exporter) pushMetrics(ctx context.Context, md pmetric.Metrics) error {
|
func (e *baseExporter) pushMetrics(ctx context.Context, md pmetric.Metrics) error {
|
||||||
tr := pmetricotlp.NewExportRequestFromMetrics(md)
|
tr := pmetricotlp.NewExportRequestFromMetrics(md)
|
||||||
request, err := tr.MarshalProto()
|
request, err := tr.MarshalProto()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -112,7 +113,7 @@ func (e *exporter) pushMetrics(ctx context.Context, md pmetric.Metrics) error {
|
||||||
return e.export(ctx, e.metricsURL, request)
|
return e.export(ctx, e.metricsURL, request)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *exporter) pushLogs(ctx context.Context, ld plog.Logs) error {
|
func (e *baseExporter) pushLogs(ctx context.Context, ld plog.Logs) error {
|
||||||
tr := plogotlp.NewExportRequestFromLogs(ld)
|
tr := plogotlp.NewExportRequestFromLogs(ld)
|
||||||
request, err := tr.MarshalProto()
|
request, err := tr.MarshalProto()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -122,7 +123,7 @@ func (e *exporter) pushLogs(ctx context.Context, ld plog.Logs) error {
|
||||||
return e.export(ctx, e.logsURL, request)
|
return e.export(ctx, e.logsURL, request)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *exporter) export(ctx context.Context, url string, request []byte) error {
|
func (e *baseExporter) export(ctx context.Context, url string, request []byte) error {
|
||||||
e.logger.Debug("Preparing to make HTTP request", zap.String("url", url))
|
e.logger.Debug("Preparing to make HTTP request", zap.String("url", url))
|
||||||
req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewReader(request))
|
req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewReader(request))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@ import (
|
||||||
"go.opentelemetry.io/collector/consumer"
|
"go.opentelemetry.io/collector/consumer"
|
||||||
"go.opentelemetry.io/collector/consumer/consumererror"
|
"go.opentelemetry.io/collector/consumer/consumererror"
|
||||||
"go.opentelemetry.io/collector/consumer/consumertest"
|
"go.opentelemetry.io/collector/consumer/consumertest"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/exporter/exporterhelper"
|
"go.opentelemetry.io/collector/exporter/exporterhelper"
|
||||||
"go.opentelemetry.io/collector/internal/testdata"
|
"go.opentelemetry.io/collector/internal/testdata"
|
||||||
"go.opentelemetry.io/collector/internal/testutil"
|
"go.opentelemetry.io/collector/internal/testutil"
|
||||||
|
|
@ -302,7 +303,7 @@ func TestIssue_4221(t *testing.T) {
|
||||||
assert.NoError(t, exp.ConsumeTraces(context.Background(), md))
|
assert.NoError(t, exp.ConsumeTraces(context.Background(), md))
|
||||||
}
|
}
|
||||||
|
|
||||||
func startTracesExporter(t *testing.T, baseURL string, overrideURL string) component.TracesExporter {
|
func startTracesExporter(t *testing.T, baseURL string, overrideURL string) exporter.Traces {
|
||||||
factory := NewFactory()
|
factory := NewFactory()
|
||||||
cfg := createExporterConfig(baseURL, factory.CreateDefaultConfig())
|
cfg := createExporterConfig(baseURL, factory.CreateDefaultConfig())
|
||||||
cfg.TracesEndpoint = overrideURL
|
cfg.TracesEndpoint = overrideURL
|
||||||
|
|
@ -312,7 +313,7 @@ func startTracesExporter(t *testing.T, baseURL string, overrideURL string) compo
|
||||||
return exp
|
return exp
|
||||||
}
|
}
|
||||||
|
|
||||||
func startMetricsExporter(t *testing.T, baseURL string, overrideURL string) component.MetricsExporter {
|
func startMetricsExporter(t *testing.T, baseURL string, overrideURL string) exporter.Metrics {
|
||||||
factory := NewFactory()
|
factory := NewFactory()
|
||||||
cfg := createExporterConfig(baseURL, factory.CreateDefaultConfig())
|
cfg := createExporterConfig(baseURL, factory.CreateDefaultConfig())
|
||||||
cfg.MetricsEndpoint = overrideURL
|
cfg.MetricsEndpoint = overrideURL
|
||||||
|
|
@ -322,7 +323,7 @@ func startMetricsExporter(t *testing.T, baseURL string, overrideURL string) comp
|
||||||
return exp
|
return exp
|
||||||
}
|
}
|
||||||
|
|
||||||
func startLogsExporter(t *testing.T, baseURL string, overrideURL string) component.LogsExporter {
|
func startLogsExporter(t *testing.T, baseURL string, overrideURL string) exporter.Logs {
|
||||||
factory := NewFactory()
|
factory := NewFactory()
|
||||||
cfg := createExporterConfig(baseURL, factory.CreateDefaultConfig())
|
cfg := createExporterConfig(baseURL, factory.CreateDefaultConfig())
|
||||||
cfg.LogsEndpoint = overrideURL
|
cfg.LogsEndpoint = overrideURL
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ import (
|
||||||
|
|
||||||
"go.opentelemetry.io/collector/component"
|
"go.opentelemetry.io/collector/component"
|
||||||
"go.opentelemetry.io/collector/config/configtelemetry"
|
"go.opentelemetry.io/collector/config/configtelemetry"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/featuregate"
|
"go.opentelemetry.io/collector/featuregate"
|
||||||
"go.opentelemetry.io/collector/internal/obsreportconfig"
|
"go.opentelemetry.io/collector/internal/obsreportconfig"
|
||||||
"go.opentelemetry.io/collector/internal/obsreportconfig/obsmetrics"
|
"go.opentelemetry.io/collector/internal/obsreportconfig/obsmetrics"
|
||||||
|
|
@ -61,7 +62,7 @@ type Exporter struct {
|
||||||
// ExporterSettings are settings for creating an Exporter.
|
// ExporterSettings are settings for creating an Exporter.
|
||||||
type ExporterSettings struct {
|
type ExporterSettings struct {
|
||||||
ExporterID component.ID
|
ExporterID component.ID
|
||||||
ExporterCreateSettings component.ExporterCreateSettings
|
ExporterCreateSettings exporter.CreateSettings
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewExporter creates a new Exporter.
|
// NewExporter creates a new Exporter.
|
||||||
|
|
|
||||||
|
|
@ -38,10 +38,10 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
receiver = component.NewID("fakeReceiver")
|
receiverID = component.NewID("fakeReceiver")
|
||||||
scraper = component.NewID("fakeScraper")
|
scraperID = component.NewID("fakeScraper")
|
||||||
processor = component.NewID("fakeProcessor")
|
processorID = component.NewID("fakeProcessor")
|
||||||
exporter = component.NewID("fakeExporter")
|
exporterID = component.NewID("fakeExporter")
|
||||||
|
|
||||||
errFake = errors.New("errFake")
|
errFake = errors.New("errFake")
|
||||||
partialErrFake = scrapererror.NewPartialScrapeError(errFake, 1)
|
partialErrFake = scrapererror.NewPartialScrapeError(errFake, 1)
|
||||||
|
|
@ -75,7 +75,7 @@ func testTelemetry(t *testing.T, id component.ID, testFunc func(t *testing.T, tt
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestReceiveTraceDataOp(t *testing.T) {
|
func TestReceiveTraceDataOp(t *testing.T) {
|
||||||
testTelemetry(t, receiver, func(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
testTelemetry(t, receiverID, func(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
||||||
parentCtx, parentSpan := tt.TracerProvider.Tracer("test").Start(context.Background(), t.Name())
|
parentCtx, parentSpan := tt.TracerProvider.Tracer("test").Start(context.Background(), t.Name())
|
||||||
defer parentSpan.End()
|
defer parentSpan.End()
|
||||||
|
|
||||||
|
|
@ -85,7 +85,7 @@ func TestReceiveTraceDataOp(t *testing.T) {
|
||||||
}
|
}
|
||||||
for i, param := range params {
|
for i, param := range params {
|
||||||
rec, err := newReceiver(ReceiverSettings{
|
rec, err := newReceiver(ReceiverSettings{
|
||||||
ReceiverID: receiver,
|
ReceiverID: receiverID,
|
||||||
Transport: transport,
|
Transport: transport,
|
||||||
ReceiverCreateSettings: tt.ToReceiverCreateSettings(),
|
ReceiverCreateSettings: tt.ToReceiverCreateSettings(),
|
||||||
}, registry)
|
}, registry)
|
||||||
|
|
@ -100,7 +100,7 @@ func TestReceiveTraceDataOp(t *testing.T) {
|
||||||
|
|
||||||
var acceptedSpans, refusedSpans int
|
var acceptedSpans, refusedSpans int
|
||||||
for i, span := range spans {
|
for i, span := range spans {
|
||||||
assert.Equal(t, "receiver/"+receiver.String()+"/TraceDataReceived", span.Name())
|
assert.Equal(t, "receiver/"+receiverID.String()+"/TraceDataReceived", span.Name())
|
||||||
switch {
|
switch {
|
||||||
case params[i].err == nil:
|
case params[i].err == nil:
|
||||||
acceptedSpans += params[i].items
|
acceptedSpans += params[i].items
|
||||||
|
|
@ -122,7 +122,7 @@ func TestReceiveTraceDataOp(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestReceiveLogsOp(t *testing.T) {
|
func TestReceiveLogsOp(t *testing.T) {
|
||||||
testTelemetry(t, receiver, func(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
testTelemetry(t, receiverID, func(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
||||||
parentCtx, parentSpan := tt.TracerProvider.Tracer("test").Start(context.Background(), t.Name())
|
parentCtx, parentSpan := tt.TracerProvider.Tracer("test").Start(context.Background(), t.Name())
|
||||||
defer parentSpan.End()
|
defer parentSpan.End()
|
||||||
|
|
||||||
|
|
@ -132,7 +132,7 @@ func TestReceiveLogsOp(t *testing.T) {
|
||||||
}
|
}
|
||||||
for i, param := range params {
|
for i, param := range params {
|
||||||
rec, err := newReceiver(ReceiverSettings{
|
rec, err := newReceiver(ReceiverSettings{
|
||||||
ReceiverID: receiver,
|
ReceiverID: receiverID,
|
||||||
Transport: transport,
|
Transport: transport,
|
||||||
ReceiverCreateSettings: tt.ToReceiverCreateSettings(),
|
ReceiverCreateSettings: tt.ToReceiverCreateSettings(),
|
||||||
}, registry)
|
}, registry)
|
||||||
|
|
@ -148,7 +148,7 @@ func TestReceiveLogsOp(t *testing.T) {
|
||||||
|
|
||||||
var acceptedLogRecords, refusedLogRecords int
|
var acceptedLogRecords, refusedLogRecords int
|
||||||
for i, span := range spans {
|
for i, span := range spans {
|
||||||
assert.Equal(t, "receiver/"+receiver.String()+"/LogsReceived", span.Name())
|
assert.Equal(t, "receiver/"+receiverID.String()+"/LogsReceived", span.Name())
|
||||||
switch {
|
switch {
|
||||||
case params[i].err == nil:
|
case params[i].err == nil:
|
||||||
acceptedLogRecords += params[i].items
|
acceptedLogRecords += params[i].items
|
||||||
|
|
@ -170,7 +170,7 @@ func TestReceiveLogsOp(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestReceiveMetricsOp(t *testing.T) {
|
func TestReceiveMetricsOp(t *testing.T) {
|
||||||
testTelemetry(t, receiver, func(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
testTelemetry(t, receiverID, func(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
||||||
parentCtx, parentSpan := tt.TracerProvider.Tracer("test").Start(context.Background(), t.Name())
|
parentCtx, parentSpan := tt.TracerProvider.Tracer("test").Start(context.Background(), t.Name())
|
||||||
defer parentSpan.End()
|
defer parentSpan.End()
|
||||||
|
|
||||||
|
|
@ -180,7 +180,7 @@ func TestReceiveMetricsOp(t *testing.T) {
|
||||||
}
|
}
|
||||||
for i, param := range params {
|
for i, param := range params {
|
||||||
rec, err := newReceiver(ReceiverSettings{
|
rec, err := newReceiver(ReceiverSettings{
|
||||||
ReceiverID: receiver,
|
ReceiverID: receiverID,
|
||||||
Transport: transport,
|
Transport: transport,
|
||||||
ReceiverCreateSettings: tt.ToReceiverCreateSettings(),
|
ReceiverCreateSettings: tt.ToReceiverCreateSettings(),
|
||||||
}, registry)
|
}, registry)
|
||||||
|
|
@ -196,7 +196,7 @@ func TestReceiveMetricsOp(t *testing.T) {
|
||||||
|
|
||||||
var acceptedMetricPoints, refusedMetricPoints int
|
var acceptedMetricPoints, refusedMetricPoints int
|
||||||
for i, span := range spans {
|
for i, span := range spans {
|
||||||
assert.Equal(t, "receiver/"+receiver.String()+"/MetricsReceived", span.Name())
|
assert.Equal(t, "receiver/"+receiverID.String()+"/MetricsReceived", span.Name())
|
||||||
switch {
|
switch {
|
||||||
case params[i].err == nil:
|
case params[i].err == nil:
|
||||||
acceptedMetricPoints += params[i].items
|
acceptedMetricPoints += params[i].items
|
||||||
|
|
@ -219,7 +219,7 @@ func TestReceiveMetricsOp(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestScrapeMetricsDataOp(t *testing.T) {
|
func TestScrapeMetricsDataOp(t *testing.T) {
|
||||||
testTelemetry(t, receiver, testScrapeMetricsDataOp)
|
testTelemetry(t, receiverID, testScrapeMetricsDataOp)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testScrapeMetricsDataOp(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
func testScrapeMetricsDataOp(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
||||||
|
|
@ -233,8 +233,8 @@ func testScrapeMetricsDataOp(t *testing.T, tt obsreporttest.TestTelemetry, regis
|
||||||
}
|
}
|
||||||
for i := range params {
|
for i := range params {
|
||||||
scrp, err := newScraper(ScraperSettings{
|
scrp, err := newScraper(ScraperSettings{
|
||||||
ReceiverID: receiver,
|
ReceiverID: receiverID,
|
||||||
Scraper: scraper,
|
Scraper: scraperID,
|
||||||
ReceiverCreateSettings: tt.ToReceiverCreateSettings(),
|
ReceiverCreateSettings: tt.ToReceiverCreateSettings(),
|
||||||
}, registry)
|
}, registry)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
@ -248,7 +248,7 @@ func testScrapeMetricsDataOp(t *testing.T, tt obsreporttest.TestTelemetry, regis
|
||||||
|
|
||||||
var scrapedMetricPoints, erroredMetricPoints int
|
var scrapedMetricPoints, erroredMetricPoints int
|
||||||
for i, span := range spans {
|
for i, span := range spans {
|
||||||
assert.Equal(t, "scraper/"+receiver.String()+"/"+scraper.String()+"/MetricsScraped", span.Name())
|
assert.Equal(t, "scraper/"+receiverID.String()+"/"+scraperID.String()+"/MetricsScraped", span.Name())
|
||||||
switch {
|
switch {
|
||||||
case params[i].err == nil:
|
case params[i].err == nil:
|
||||||
scrapedMetricPoints += params[i].items
|
scrapedMetricPoints += params[i].items
|
||||||
|
|
@ -274,16 +274,16 @@ func testScrapeMetricsDataOp(t *testing.T, tt obsreporttest.TestTelemetry, regis
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
require.NoError(t, obsreporttest.CheckScraperMetrics(tt, receiver, scraper, int64(scrapedMetricPoints), int64(erroredMetricPoints)))
|
require.NoError(t, obsreporttest.CheckScraperMetrics(tt, receiverID, scraperID, int64(scrapedMetricPoints), int64(erroredMetricPoints)))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestExportTraceDataOp(t *testing.T) {
|
func TestExportTraceDataOp(t *testing.T) {
|
||||||
testTelemetry(t, exporter, func(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
testTelemetry(t, exporterID, func(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
||||||
parentCtx, parentSpan := tt.TracerProvider.Tracer("test").Start(context.Background(), t.Name())
|
parentCtx, parentSpan := tt.TracerProvider.Tracer("test").Start(context.Background(), t.Name())
|
||||||
defer parentSpan.End()
|
defer parentSpan.End()
|
||||||
|
|
||||||
obsrep, err := newExporter(ExporterSettings{
|
obsrep, err := newExporter(ExporterSettings{
|
||||||
ExporterID: exporter,
|
ExporterID: exporterID,
|
||||||
ExporterCreateSettings: tt.ToExporterCreateSettings(),
|
ExporterCreateSettings: tt.ToExporterCreateSettings(),
|
||||||
}, registry)
|
}, registry)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
@ -303,7 +303,7 @@ func TestExportTraceDataOp(t *testing.T) {
|
||||||
|
|
||||||
var sentSpans, failedToSendSpans int
|
var sentSpans, failedToSendSpans int
|
||||||
for i, span := range spans {
|
for i, span := range spans {
|
||||||
assert.Equal(t, "exporter/"+exporter.String()+"/traces", span.Name())
|
assert.Equal(t, "exporter/"+exporterID.String()+"/traces", span.Name())
|
||||||
switch {
|
switch {
|
||||||
case params[i].err == nil:
|
case params[i].err == nil:
|
||||||
sentSpans += params[i].items
|
sentSpans += params[i].items
|
||||||
|
|
@ -327,12 +327,12 @@ func TestExportTraceDataOp(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestExportMetricsOp(t *testing.T) {
|
func TestExportMetricsOp(t *testing.T) {
|
||||||
testTelemetry(t, exporter, func(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
testTelemetry(t, exporterID, func(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
||||||
parentCtx, parentSpan := tt.TracerProvider.Tracer("test").Start(context.Background(), t.Name())
|
parentCtx, parentSpan := tt.TracerProvider.Tracer("test").Start(context.Background(), t.Name())
|
||||||
defer parentSpan.End()
|
defer parentSpan.End()
|
||||||
|
|
||||||
obsrep, err := newExporter(ExporterSettings{
|
obsrep, err := newExporter(ExporterSettings{
|
||||||
ExporterID: exporter,
|
ExporterID: exporterID,
|
||||||
ExporterCreateSettings: tt.ToExporterCreateSettings(),
|
ExporterCreateSettings: tt.ToExporterCreateSettings(),
|
||||||
}, registry)
|
}, registry)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
@ -353,7 +353,7 @@ func TestExportMetricsOp(t *testing.T) {
|
||||||
|
|
||||||
var sentMetricPoints, failedToSendMetricPoints int
|
var sentMetricPoints, failedToSendMetricPoints int
|
||||||
for i, span := range spans {
|
for i, span := range spans {
|
||||||
assert.Equal(t, "exporter/"+exporter.String()+"/metrics", span.Name())
|
assert.Equal(t, "exporter/"+exporterID.String()+"/metrics", span.Name())
|
||||||
switch {
|
switch {
|
||||||
case params[i].err == nil:
|
case params[i].err == nil:
|
||||||
sentMetricPoints += params[i].items
|
sentMetricPoints += params[i].items
|
||||||
|
|
@ -376,12 +376,12 @@ func TestExportMetricsOp(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestExportLogsOp(t *testing.T) {
|
func TestExportLogsOp(t *testing.T) {
|
||||||
testTelemetry(t, exporter, func(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
testTelemetry(t, exporterID, func(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
||||||
parentCtx, parentSpan := tt.TracerProvider.Tracer("test").Start(context.Background(), t.Name())
|
parentCtx, parentSpan := tt.TracerProvider.Tracer("test").Start(context.Background(), t.Name())
|
||||||
defer parentSpan.End()
|
defer parentSpan.End()
|
||||||
|
|
||||||
obsrep, err := newExporter(ExporterSettings{
|
obsrep, err := newExporter(ExporterSettings{
|
||||||
ExporterID: exporter,
|
ExporterID: exporterID,
|
||||||
ExporterCreateSettings: tt.ToExporterCreateSettings(),
|
ExporterCreateSettings: tt.ToExporterCreateSettings(),
|
||||||
}, registry)
|
}, registry)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
@ -402,7 +402,7 @@ func TestExportLogsOp(t *testing.T) {
|
||||||
|
|
||||||
var sentLogRecords, failedToSendLogRecords int
|
var sentLogRecords, failedToSendLogRecords int
|
||||||
for i, span := range spans {
|
for i, span := range spans {
|
||||||
assert.Equal(t, "exporter/"+exporter.String()+"/logs", span.Name())
|
assert.Equal(t, "exporter/"+exporterID.String()+"/logs", span.Name())
|
||||||
switch {
|
switch {
|
||||||
case params[i].err == nil:
|
case params[i].err == nil:
|
||||||
sentLogRecords += params[i].items
|
sentLogRecords += params[i].items
|
||||||
|
|
@ -425,7 +425,7 @@ func TestExportLogsOp(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestReceiveWithLongLivedCtx(t *testing.T) {
|
func TestReceiveWithLongLivedCtx(t *testing.T) {
|
||||||
tt, err := obsreporttest.SetupTelemetryWithID(receiver)
|
tt, err := obsreporttest.SetupTelemetryWithID(receiverID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
t.Cleanup(func() { require.NoError(t, tt.Shutdown(context.Background())) })
|
t.Cleanup(func() { require.NoError(t, tt.Shutdown(context.Background())) })
|
||||||
|
|
||||||
|
|
@ -440,7 +440,7 @@ func TestReceiveWithLongLivedCtx(t *testing.T) {
|
||||||
// Use a new context on each operation to simulate distinct operations
|
// Use a new context on each operation to simulate distinct operations
|
||||||
// under the same long lived context.
|
// under the same long lived context.
|
||||||
rec, rerr := NewReceiver(ReceiverSettings{
|
rec, rerr := NewReceiver(ReceiverSettings{
|
||||||
ReceiverID: receiver,
|
ReceiverID: receiverID,
|
||||||
Transport: transport,
|
Transport: transport,
|
||||||
LongLivedCtx: true,
|
LongLivedCtx: true,
|
||||||
ReceiverCreateSettings: tt.ToReceiverCreateSettings(),
|
ReceiverCreateSettings: tt.ToReceiverCreateSettings(),
|
||||||
|
|
@ -460,7 +460,7 @@ func TestReceiveWithLongLivedCtx(t *testing.T) {
|
||||||
link := span.Links()[0]
|
link := span.Links()[0]
|
||||||
assert.Equal(t, parentSpan.SpanContext().TraceID(), link.SpanContext.TraceID())
|
assert.Equal(t, parentSpan.SpanContext().TraceID(), link.SpanContext.TraceID())
|
||||||
assert.Equal(t, parentSpan.SpanContext().SpanID(), link.SpanContext.SpanID())
|
assert.Equal(t, parentSpan.SpanContext().SpanID(), link.SpanContext.SpanID())
|
||||||
assert.Equal(t, "receiver/"+receiver.String()+"/TraceDataReceived", span.Name())
|
assert.Equal(t, "receiver/"+receiverID.String()+"/TraceDataReceived", span.Name())
|
||||||
require.Contains(t, span.Attributes(), attribute.KeyValue{Key: obsmetrics.TransportKey, Value: attribute.StringValue(transport)})
|
require.Contains(t, span.Attributes(), attribute.KeyValue{Key: obsmetrics.TransportKey, Value: attribute.StringValue(transport)})
|
||||||
switch {
|
switch {
|
||||||
case params[i].err == nil:
|
case params[i].err == nil:
|
||||||
|
|
@ -479,7 +479,7 @@ func TestReceiveWithLongLivedCtx(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestProcessorTraceData(t *testing.T) {
|
func TestProcessorTraceData(t *testing.T) {
|
||||||
testTelemetry(t, processor, testProcessorTraceData)
|
testTelemetry(t, processorID, testProcessorTraceData)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testProcessorTraceData(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
func testProcessorTraceData(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
||||||
|
|
@ -487,7 +487,7 @@ func testProcessorTraceData(t *testing.T, tt obsreporttest.TestTelemetry, regist
|
||||||
const refusedSpans = 19
|
const refusedSpans = 19
|
||||||
const droppedSpans = 13
|
const droppedSpans = 13
|
||||||
obsrep, err := newProcessor(ProcessorSettings{
|
obsrep, err := newProcessor(ProcessorSettings{
|
||||||
ProcessorID: processor,
|
ProcessorID: processorID,
|
||||||
ProcessorCreateSettings: tt.ToProcessorCreateSettings(),
|
ProcessorCreateSettings: tt.ToProcessorCreateSettings(),
|
||||||
}, registry)
|
}, registry)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
@ -499,7 +499,7 @@ func testProcessorTraceData(t *testing.T, tt obsreporttest.TestTelemetry, regist
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestProcessorMetricsData(t *testing.T) {
|
func TestProcessorMetricsData(t *testing.T) {
|
||||||
testTelemetry(t, processor, testProcessorMetricsData)
|
testTelemetry(t, processorID, testProcessorMetricsData)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testProcessorMetricsData(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
func testProcessorMetricsData(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
||||||
|
|
@ -508,7 +508,7 @@ func testProcessorMetricsData(t *testing.T, tt obsreporttest.TestTelemetry, regi
|
||||||
const droppedPoints = 17
|
const droppedPoints = 17
|
||||||
|
|
||||||
obsrep, err := newProcessor(ProcessorSettings{
|
obsrep, err := newProcessor(ProcessorSettings{
|
||||||
ProcessorID: processor,
|
ProcessorID: processorID,
|
||||||
ProcessorCreateSettings: tt.ToProcessorCreateSettings(),
|
ProcessorCreateSettings: tt.ToProcessorCreateSettings(),
|
||||||
}, registry)
|
}, registry)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
@ -542,7 +542,7 @@ func TestBuildProcessorCustomMetricName(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestProcessorLogRecords(t *testing.T) {
|
func TestProcessorLogRecords(t *testing.T) {
|
||||||
testTelemetry(t, processor, testProcessorLogRecords)
|
testTelemetry(t, processorID, testProcessorLogRecords)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testProcessorLogRecords(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
func testProcessorLogRecords(t *testing.T, tt obsreporttest.TestTelemetry, registry *featuregate.Registry) {
|
||||||
|
|
@ -551,7 +551,7 @@ func testProcessorLogRecords(t *testing.T, tt obsreporttest.TestTelemetry, regis
|
||||||
const droppedRecords = 17
|
const droppedRecords = 17
|
||||||
|
|
||||||
obsrep, err := newProcessor(ProcessorSettings{
|
obsrep, err := newProcessor(ProcessorSettings{
|
||||||
ProcessorID: processor,
|
ProcessorID: processorID,
|
||||||
ProcessorCreateSettings: tt.ToProcessorCreateSettings(),
|
ProcessorCreateSettings: tt.ToProcessorCreateSettings(),
|
||||||
}, registry)
|
}, registry)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ import (
|
||||||
"go.opentelemetry.io/collector/component"
|
"go.opentelemetry.io/collector/component"
|
||||||
"go.opentelemetry.io/collector/component/componenttest"
|
"go.opentelemetry.io/collector/component/componenttest"
|
||||||
"go.opentelemetry.io/collector/config/configtelemetry"
|
"go.opentelemetry.io/collector/config/configtelemetry"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/internal/obsreportconfig"
|
"go.opentelemetry.io/collector/internal/obsreportconfig"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -59,7 +60,7 @@ type TestTelemetry struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToExporterCreateSettings returns ExporterCreateSettings with configured TelemetrySettings
|
// ToExporterCreateSettings returns ExporterCreateSettings with configured TelemetrySettings
|
||||||
func (tts *TestTelemetry) ToExporterCreateSettings() component.ExporterCreateSettings {
|
func (tts *TestTelemetry) ToExporterCreateSettings() exporter.CreateSettings {
|
||||||
set := componenttest.NewNopExporterCreateSettings()
|
set := componenttest.NewNopExporterCreateSettings()
|
||||||
set.TelemetrySettings = tts.TelemetrySettings
|
set.TelemetrySettings = tts.TelemetrySettings
|
||||||
set.ID = tts.id
|
set.ID = tts.id
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ import (
|
||||||
|
|
||||||
"go.opentelemetry.io/collector/component"
|
"go.opentelemetry.io/collector/component"
|
||||||
"go.opentelemetry.io/collector/confmap"
|
"go.opentelemetry.io/collector/confmap"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
)
|
)
|
||||||
|
|
||||||
// exportersKeyName is the configuration key name for exporters section.
|
// exportersKeyName is the configuration key name for exporters section.
|
||||||
|
|
@ -27,10 +28,10 @@ const exportersKeyName = "exporters"
|
||||||
type Exporters struct {
|
type Exporters struct {
|
||||||
exps map[component.ID]component.Config
|
exps map[component.ID]component.Config
|
||||||
|
|
||||||
factories map[component.Type]component.ExporterFactory
|
factories map[component.Type]exporter.Factory
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewExporters(factories map[component.Type]component.ExporterFactory) *Exporters {
|
func NewExporters(factories map[component.Type]exporter.Factory) *Exporters {
|
||||||
return &Exporters{factories: factories}
|
return &Exporters{factories: factories}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,10 +23,11 @@ import (
|
||||||
"go.opentelemetry.io/collector/component"
|
"go.opentelemetry.io/collector/component"
|
||||||
"go.opentelemetry.io/collector/component/componenttest"
|
"go.opentelemetry.io/collector/component/componenttest"
|
||||||
"go.opentelemetry.io/collector/confmap"
|
"go.opentelemetry.io/collector/confmap"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestExportersUnmarshal(t *testing.T) {
|
func TestExportersUnmarshal(t *testing.T) {
|
||||||
factories, err := component.MakeExporterFactoryMap(componenttest.NewNopExporterFactory())
|
factories, err := exporter.MakeFactoryMap(componenttest.NewNopExporterFactory())
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
exps := NewExporters(factories)
|
exps := NewExporters(factories)
|
||||||
|
|
@ -100,7 +101,7 @@ func TestExportersUnmarshalError(t *testing.T) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
factories, err := component.MakeExporterFactoryMap(componenttest.NewNopExporterFactory())
|
factories, err := exporter.MakeFactoryMap(componenttest.NewNopExporterFactory())
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
for _, tt := range testCases {
|
for _, tt := range testCases {
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ import (
|
||||||
"go.opentelemetry.io/collector/component"
|
"go.opentelemetry.io/collector/component"
|
||||||
"go.opentelemetry.io/collector/config"
|
"go.opentelemetry.io/collector/config"
|
||||||
"go.opentelemetry.io/collector/consumer"
|
"go.opentelemetry.io/collector/consumer"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/pdata/plog"
|
"go.opentelemetry.io/collector/pdata/plog"
|
||||||
"go.opentelemetry.io/collector/pdata/pmetric"
|
"go.opentelemetry.io/collector/pdata/pmetric"
|
||||||
"go.opentelemetry.io/collector/pdata/ptrace"
|
"go.opentelemetry.io/collector/pdata/ptrace"
|
||||||
|
|
@ -36,12 +37,12 @@ type ExampleExporterConfig struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExampleExporterFactory is factory for ExampleExporter.
|
// ExampleExporterFactory is factory for ExampleExporter.
|
||||||
var ExampleExporterFactory = component.NewExporterFactory(
|
var ExampleExporterFactory = exporter.NewFactory(
|
||||||
typeStr,
|
typeStr,
|
||||||
createExporterDefaultConfig,
|
createExporterDefaultConfig,
|
||||||
component.WithTracesExporter(createTracesExporter, stability),
|
exporter.WithTraces(createTracesExporter, stability),
|
||||||
component.WithMetricsExporter(createMetricsExporter, stability),
|
exporter.WithMetrics(createMetricsExporter, stability),
|
||||||
component.WithLogsExporter(createLogsExporter, stability),
|
exporter.WithLogs(createLogsExporter, stability),
|
||||||
)
|
)
|
||||||
|
|
||||||
func createExporterDefaultConfig() component.Config {
|
func createExporterDefaultConfig() component.Config {
|
||||||
|
|
@ -50,15 +51,15 @@ func createExporterDefaultConfig() component.Config {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func createTracesExporter(context.Context, component.ExporterCreateSettings, component.Config) (component.TracesExporter, error) {
|
func createTracesExporter(context.Context, exporter.CreateSettings, component.Config) (exporter.Traces, error) {
|
||||||
return &ExampleExporter{}, nil
|
return &ExampleExporter{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createMetricsExporter(context.Context, component.ExporterCreateSettings, component.Config) (component.MetricsExporter, error) {
|
func createMetricsExporter(context.Context, exporter.CreateSettings, component.Config) (exporter.Metrics, error) {
|
||||||
return &ExampleExporter{}, nil
|
return &ExampleExporter{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createLogsExporter(context.Context, component.ExporterCreateSettings, component.Config) (component.LogsExporter, error) {
|
func createLogsExporter(context.Context, exporter.CreateSettings, component.Config) (exporter.Logs, error) {
|
||||||
return &ExampleExporter{}, nil
|
return &ExampleExporter{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ import (
|
||||||
|
|
||||||
"go.opentelemetry.io/collector/component"
|
"go.opentelemetry.io/collector/component"
|
||||||
"go.opentelemetry.io/collector/consumer"
|
"go.opentelemetry.io/collector/consumer"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/service/internal/capabilityconsumer"
|
"go.opentelemetry.io/collector/service/internal/capabilityconsumer"
|
||||||
"go.opentelemetry.io/collector/service/internal/components"
|
"go.opentelemetry.io/collector/service/internal/components"
|
||||||
"go.opentelemetry.io/collector/service/internal/fanoutconsumer"
|
"go.opentelemetry.io/collector/service/internal/fanoutconsumer"
|
||||||
|
|
@ -194,8 +195,8 @@ type pipelinesSettings struct {
|
||||||
// ProcessorConfigs is a map of component.ID to component.Config.
|
// ProcessorConfigs is a map of component.ID to component.Config.
|
||||||
ProcessorConfigs map[component.ID]component.Config
|
ProcessorConfigs map[component.ID]component.Config
|
||||||
|
|
||||||
// ExporterFactories maps exporter type names in the config to the respective component.ExporterFactory.
|
// ExporterFactories maps exporter type names in the config to the respective exporter.Factory.
|
||||||
ExporterFactories map[component.Type]component.ExporterFactory
|
ExporterFactories map[component.Type]exporter.Factory
|
||||||
|
|
||||||
// ExporterConfigs is a map of component.ID to component.Config.
|
// ExporterConfigs is a map of component.ID to component.Config.
|
||||||
ExporterConfigs map[component.ID]component.Config
|
ExporterConfigs map[component.ID]component.Config
|
||||||
|
|
@ -336,7 +337,7 @@ func buildExporter(
|
||||||
settings component.TelemetrySettings,
|
settings component.TelemetrySettings,
|
||||||
buildInfo component.BuildInfo,
|
buildInfo component.BuildInfo,
|
||||||
cfgs map[component.ID]component.Config,
|
cfgs map[component.ID]component.Config,
|
||||||
factories map[component.Type]component.ExporterFactory,
|
factories map[component.Type]exporter.Factory,
|
||||||
id component.ID,
|
id component.ID,
|
||||||
pipelineID component.ID,
|
pipelineID component.ID,
|
||||||
) (component.Component, error) {
|
) (component.Component, error) {
|
||||||
|
|
@ -350,7 +351,7 @@ func buildExporter(
|
||||||
return nil, fmt.Errorf("exporter factory not available for: %q", id)
|
return nil, fmt.Errorf("exporter factory not available for: %q", id)
|
||||||
}
|
}
|
||||||
|
|
||||||
set := component.ExporterCreateSettings{
|
set := exporter.CreateSettings{
|
||||||
ID: id,
|
ID: id,
|
||||||
TelemetrySettings: settings,
|
TelemetrySettings: settings,
|
||||||
BuildInfo: buildInfo,
|
BuildInfo: buildInfo,
|
||||||
|
|
@ -366,7 +367,7 @@ func buildExporter(
|
||||||
return exp, nil
|
return exp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createExporter(ctx context.Context, set component.ExporterCreateSettings, cfg component.Config, id component.ID, pipelineID component.ID, factory component.ExporterFactory) (component.Component, error) {
|
func createExporter(ctx context.Context, set exporter.CreateSettings, cfg component.Config, id component.ID, pipelineID component.ID, factory exporter.Factory) (component.Component, error) {
|
||||||
switch pipelineID.Type() {
|
switch pipelineID.Type() {
|
||||||
case component.DataTypeTraces:
|
case component.DataTypeTraces:
|
||||||
return factory.CreateTracesExporter(ctx, set, cfg)
|
return factory.CreateTracesExporter(ctx, set, cfg)
|
||||||
|
|
@ -414,7 +415,7 @@ func exporterLogger(logger *zap.Logger, id component.ID, dt component.DataType)
|
||||||
zap.String(components.ZapNameKey, id.String()))
|
zap.String(components.ZapNameKey, id.String()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func getExporterStabilityLevel(factory component.ExporterFactory, dt component.DataType) component.StabilityLevel {
|
func getExporterStabilityLevel(factory exporter.Factory, dt component.DataType) component.StabilityLevel {
|
||||||
switch dt {
|
switch dt {
|
||||||
case component.DataTypeTraces:
|
case component.DataTypeTraces:
|
||||||
return factory.TracesExporterStability()
|
return factory.TracesExporterStability()
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ import (
|
||||||
"go.opentelemetry.io/collector/config"
|
"go.opentelemetry.io/collector/config"
|
||||||
"go.opentelemetry.io/collector/consumer"
|
"go.opentelemetry.io/collector/consumer"
|
||||||
"go.opentelemetry.io/collector/consumer/consumertest"
|
"go.opentelemetry.io/collector/consumer/consumertest"
|
||||||
|
"go.opentelemetry.io/collector/exporter"
|
||||||
"go.opentelemetry.io/collector/internal/testdata"
|
"go.opentelemetry.io/collector/internal/testdata"
|
||||||
"go.opentelemetry.io/collector/service/internal/testcomponents"
|
"go.opentelemetry.io/collector/service/internal/testcomponents"
|
||||||
)
|
)
|
||||||
|
|
@ -193,7 +194,7 @@ func TestBuildPipelines(t *testing.T) {
|
||||||
component.NewID("exampleprocessor"): testcomponents.ExampleProcessorFactory.CreateDefaultConfig(),
|
component.NewID("exampleprocessor"): testcomponents.ExampleProcessorFactory.CreateDefaultConfig(),
|
||||||
component.NewIDWithName("exampleprocessor", "1"): testcomponents.ExampleProcessorFactory.CreateDefaultConfig(),
|
component.NewIDWithName("exampleprocessor", "1"): testcomponents.ExampleProcessorFactory.CreateDefaultConfig(),
|
||||||
},
|
},
|
||||||
ExporterFactories: map[component.Type]component.ExporterFactory{
|
ExporterFactories: map[component.Type]exporter.Factory{
|
||||||
testcomponents.ExampleExporterFactory.Type(): testcomponents.ExampleExporterFactory,
|
testcomponents.ExampleExporterFactory.Type(): testcomponents.ExampleExporterFactory,
|
||||||
},
|
},
|
||||||
ExporterConfigs: map[component.ID]component.Config{
|
ExporterConfigs: map[component.ID]component.Config{
|
||||||
|
|
@ -209,15 +210,15 @@ func TestBuildPipelines(t *testing.T) {
|
||||||
for dt, pipeline := range test.pipelineConfigs {
|
for dt, pipeline := range test.pipelineConfigs {
|
||||||
// Verify exporters created, started and empty.
|
// Verify exporters created, started and empty.
|
||||||
for _, expID := range pipeline.Exporters {
|
for _, expID := range pipeline.Exporters {
|
||||||
exporter := pipelines.GetExporters()[dt.Type()][expID].(*testcomponents.ExampleExporter)
|
exp := pipelines.GetExporters()[dt.Type()][expID].(*testcomponents.ExampleExporter)
|
||||||
assert.True(t, exporter.Started)
|
assert.True(t, exp.Started)
|
||||||
switch dt.Type() {
|
switch dt.Type() {
|
||||||
case component.DataTypeTraces:
|
case component.DataTypeTraces:
|
||||||
assert.Len(t, exporter.Traces, 0)
|
assert.Len(t, exp.Traces, 0)
|
||||||
case component.DataTypeMetrics:
|
case component.DataTypeMetrics:
|
||||||
assert.Len(t, exporter.Metrics, 0)
|
assert.Len(t, exp.Metrics, 0)
|
||||||
case component.DataTypeLogs:
|
case component.DataTypeLogs:
|
||||||
assert.Len(t, exporter.Logs, 0)
|
assert.Len(t, exp.Logs, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -267,19 +268,19 @@ func TestBuildPipelines(t *testing.T) {
|
||||||
|
|
||||||
// Now verify that exporters received data, and are shutdown.
|
// Now verify that exporters received data, and are shutdown.
|
||||||
for _, expID := range pipeline.Exporters {
|
for _, expID := range pipeline.Exporters {
|
||||||
exporter := pipelines.GetExporters()[dt.Type()][expID].(*testcomponents.ExampleExporter)
|
exp := pipelines.GetExporters()[dt.Type()][expID].(*testcomponents.ExampleExporter)
|
||||||
switch dt.Type() {
|
switch dt.Type() {
|
||||||
case component.DataTypeTraces:
|
case component.DataTypeTraces:
|
||||||
require.Len(t, exporter.Traces, test.expectedRequests)
|
require.Len(t, exp.Traces, test.expectedRequests)
|
||||||
assert.EqualValues(t, testdata.GenerateTraces(1), exporter.Traces[0])
|
assert.EqualValues(t, testdata.GenerateTraces(1), exp.Traces[0])
|
||||||
case component.DataTypeMetrics:
|
case component.DataTypeMetrics:
|
||||||
require.Len(t, exporter.Metrics, test.expectedRequests)
|
require.Len(t, exp.Metrics, test.expectedRequests)
|
||||||
assert.EqualValues(t, testdata.GenerateMetrics(1), exporter.Metrics[0])
|
assert.EqualValues(t, testdata.GenerateMetrics(1), exp.Metrics[0])
|
||||||
case component.DataTypeLogs:
|
case component.DataTypeLogs:
|
||||||
require.Len(t, exporter.Logs, test.expectedRequests)
|
require.Len(t, exp.Logs, test.expectedRequests)
|
||||||
assert.EqualValues(t, testdata.GenerateLogs(1), exporter.Logs[0])
|
assert.EqualValues(t, testdata.GenerateLogs(1), exp.Logs[0])
|
||||||
}
|
}
|
||||||
assert.True(t, exporter.Stopped)
|
assert.True(t, exp.Stopped)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
@ -588,7 +589,7 @@ func TestBuildErrors(t *testing.T) {
|
||||||
nopProcessorFactory.Type(): nopProcessorFactory,
|
nopProcessorFactory.Type(): nopProcessorFactory,
|
||||||
badProcessorFactory.Type(): badProcessorFactory,
|
badProcessorFactory.Type(): badProcessorFactory,
|
||||||
}
|
}
|
||||||
set.ExporterFactories = map[component.Type]component.ExporterFactory{
|
set.ExporterFactories = map[component.Type]exporter.Factory{
|
||||||
nopExporterFactory.Type(): nopExporterFactory,
|
nopExporterFactory.Type(): nopExporterFactory,
|
||||||
badExporterFactory.Type(): badExporterFactory,
|
badExporterFactory.Type(): badExporterFactory,
|
||||||
}
|
}
|
||||||
|
|
@ -626,7 +627,7 @@ func TestFailToStartAndShutdown(t *testing.T) {
|
||||||
component.NewID(nopProcessorFactory.Type()): nopProcessorFactory.CreateDefaultConfig(),
|
component.NewID(nopProcessorFactory.Type()): nopProcessorFactory.CreateDefaultConfig(),
|
||||||
component.NewID(errProcessorFactory.Type()): errProcessorFactory.CreateDefaultConfig(),
|
component.NewID(errProcessorFactory.Type()): errProcessorFactory.CreateDefaultConfig(),
|
||||||
},
|
},
|
||||||
ExporterFactories: map[component.Type]component.ExporterFactory{
|
ExporterFactories: map[component.Type]exporter.Factory{
|
||||||
nopExporterFactory.Type(): nopExporterFactory,
|
nopExporterFactory.Type(): nopExporterFactory,
|
||||||
errExporterFactory.Type(): errExporterFactory,
|
errExporterFactory.Type(): errExporterFactory,
|
||||||
},
|
},
|
||||||
|
|
@ -701,8 +702,8 @@ func newBadProcessorFactory() component.ProcessorFactory {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func newBadExporterFactory() component.ExporterFactory {
|
func newBadExporterFactory() exporter.Factory {
|
||||||
return component.NewExporterFactory("bf", func() component.Config {
|
return exporter.NewFactory("bf", func() component.Config {
|
||||||
return &struct {
|
return &struct {
|
||||||
config.ExporterSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct
|
config.ExporterSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct
|
||||||
}{
|
}{
|
||||||
|
|
@ -751,21 +752,21 @@ func newErrProcessorFactory() component.ProcessorFactory {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newErrExporterFactory() component.ExporterFactory {
|
func newErrExporterFactory() exporter.Factory {
|
||||||
return component.NewExporterFactory("err", func() component.Config {
|
return exporter.NewFactory("err", func() component.Config {
|
||||||
return &struct {
|
return &struct {
|
||||||
config.ExporterSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct
|
config.ExporterSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct
|
||||||
}{
|
}{
|
||||||
ExporterSettings: config.NewExporterSettings(component.NewID("bf")),
|
ExporterSettings: config.NewExporterSettings(component.NewID("bf")),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
component.WithTracesExporter(func(context.Context, component.ExporterCreateSettings, component.Config) (component.TracesExporter, error) {
|
exporter.WithTraces(func(context.Context, exporter.CreateSettings, component.Config) (exporter.Traces, error) {
|
||||||
return &errComponent{}, nil
|
return &errComponent{}, nil
|
||||||
}, component.StabilityLevelUndefined),
|
}, component.StabilityLevelUndefined),
|
||||||
component.WithLogsExporter(func(context.Context, component.ExporterCreateSettings, component.Config) (component.LogsExporter, error) {
|
exporter.WithLogs(func(context.Context, exporter.CreateSettings, component.Config) (exporter.Logs, error) {
|
||||||
return &errComponent{}, nil
|
return &errComponent{}, nil
|
||||||
}, component.StabilityLevelUndefined),
|
}, component.StabilityLevelUndefined),
|
||||||
component.WithMetricsExporter(func(context.Context, component.ExporterCreateSettings, component.Config) (component.MetricsExporter, error) {
|
exporter.WithMetrics(func(context.Context, exporter.CreateSettings, component.Config) (exporter.Metrics, error) {
|
||||||
return &errComponent{}, nil
|
return &errComponent{}, nil
|
||||||
}, component.StabilityLevelUndefined),
|
}, component.StabilityLevelUndefined),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue