[component] Refactor to use pipeline.ID and pipeline.Signal (#11204)

#### Description
Depends on
https://github.com/open-telemetry/opentelemetry-collector/pull/11209

This PR is a non-breaking implementation of
https://github.com/open-telemetry/opentelemetry-collector/pull/10947. It
adds a new module, `pipeline`, which houses a `pipeline.ID` and
`pipeline.Signal`. `pipeline.ID` is used to identify a pipeline within
the service. `pipeline.Signal` is uses to identify the signal associated
to a pipeline.

I do this work begrudgingly. As the PR shows, this is a huge refactor
when done in a non-breaking way, will require 3 full releases, and
doesn't benefit our [End Users or, in my opinion, our Component
Developers or Collector Library
Users](https://github.com/open-telemetry/opentelemetry-collector/blob/main/CONTRIBUTING.md#target-audiences).
I view this refactor as a Nice-To-Have, not a requirement for Component
1.0.

<!-- Issue number if applicable -->
#### Link to tracking issue
Works towards
https://github.com/open-telemetry/opentelemetry-collector/issues/9429
This commit is contained in:
Tyler Helmuth 2024-09-23 08:38:59 -06:00 committed by GitHub
parent d17559b6e8
commit 77bb849aa0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
116 changed files with 1583 additions and 875 deletions

View File

@ -0,0 +1,25 @@
# Use this changelog template to create an entry for release notes.
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: deprecation
# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
component: componentprofiles
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Deprecates `DataTypeProfiles`. Use `SignalProfiles` instead.
# One or more tracking issues or pull requests related to the change
issues: [11204]
# (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:
# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: [api]

View File

@ -0,0 +1,25 @@
# Use this changelog template to create an entry for release notes.
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: deprecation
# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
component: componentstatus
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Deprecates `NewInstanceID`, `AllPipelineIDs`, and `WithPipelines`. Use `NewInstanceIDWithPipelineIDs`, `AllPipelineIDsWithPipelineIDs`, and `WithPipelineIDs` instead.
# One or more tracking issues or pull requests related to the change
issues: [11204]
# (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:
# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: [api]

View File

@ -0,0 +1,25 @@
# Use this changelog template to create an entry for release notes.
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: deprecation
# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
component: exporterqueue
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Deprecates `Settings.DataType`. Use `Settings.Signal` instead.
# One or more tracking issues or pull requests related to the change
issues: [11204]
# (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:
# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: [api]

View File

@ -0,0 +1,25 @@
# Use this changelog template to create an entry for release notes.
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: deprecation
# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
component: service
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Deprecates `pipelines.Config`. Use `pipelines.ConfigWithPipelineID` instead.
# One or more tracking issues or pull requests related to the change
issues: [11204]
# (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:
# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: [api]

View File

@ -0,0 +1,25 @@
# Use this changelog template to create an entry for release notes.
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: breaking
# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
component: connector
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Change `TracesRouterAndConsumer`, `NewTracesRouter`, `MetricsRouterAndConsumer`, `NewMetricsRouter`, `LogsRouterAndConsumer`, and `NewLogsRouter` to use `pipeline.ID` instead of `component.ID`.
# One or more tracking issues or pull requests related to the change
issues: [11204]
# (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:
# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: [api]

View File

@ -0,0 +1,25 @@
# Use this changelog template to create an entry for release notes.
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: deprecation
# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
component: component
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Deprecates `DataType`, `DataTypeTraces`, `DataTypeMetrics`, and `DataTypeLogs`. Use `pipeline.Signal`, `SignalTraces`, `SignalMetrics`, and `SignalLogs` instead.
# One or more tracking issues or pull requests related to the change
issues: [11204]
# (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:
# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: [api]

View File

@ -78,6 +78,8 @@ var (
"/extension/zpagesextension",
"/featuregate",
"/internal/globalgates",
"/internal/globalsignal",
"/pipeline",
"/processor",
"/processor/batchprocessor",
"/processor/memorylimiterprocessor",

View File

@ -49,11 +49,13 @@ replaces:
- go.opentelemetry.io/collector/extension/zpagesextension => ${WORKSPACE_DIR}/extension/zpagesextension
- go.opentelemetry.io/collector/featuregate => ${WORKSPACE_DIR}/featuregate
- go.opentelemetry.io/collector/internal/globalgates => ${WORKSPACE_DIR}/internal/globalgates
- go.opentelemetry.io/collector/internal/globalsignal => ${WORKSPACE_DIR}/internal/globalsignal
- go.opentelemetry.io/collector/otelcol => ${WORKSPACE_DIR}/otelcol
- go.opentelemetry.io/collector/otelcol/otelcoltest => ${WORKSPACE_DIR}/otelcol/otelcoltest
- go.opentelemetry.io/collector/pdata => ${WORKSPACE_DIR}/pdata
- go.opentelemetry.io/collector/pdata/pprofile => ${WORKSPACE_DIR}/pdata/pprofile
- go.opentelemetry.io/collector/pdata/testdata => ${WORKSPACE_DIR}/pdata/testdata
- go.opentelemetry.io/collector/pipeline => ${WORKSPACE_DIR}/pipeline
- go.opentelemetry.io/collector/processor => ${WORKSPACE_DIR}/processor
- go.opentelemetry.io/collector/processor/processorprofiles => ${WORKSPACE_DIR}/processor/processorprofiles
- go.opentelemetry.io/collector/receiver => ${WORKSPACE_DIR}/receiver

View File

@ -42,8 +42,11 @@ require (
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
go.opentelemetry.io/collector/component/componentprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/consumer/consumerprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/collector/receiver/receiverprofiles v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/sdk v1.30.0 // indirect
@ -89,3 +92,9 @@ replace go.opentelemetry.io/collector/consumer/consumerprofiles => ../../consume
replace go.opentelemetry.io/collector/consumer/consumertest => ../../consumer/consumertest
replace go.opentelemetry.io/collector/receiver/receiverprofiles => ../../receiver/receiverprofiles
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal
replace go.opentelemetry.io/collector/component/componentprofiles => ../../component/componentprofiles

View File

@ -44,6 +44,7 @@ import (
"go.opentelemetry.io/collector/connector/connectortest"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/consumer/consumertest"
"go.opentelemetry.io/collector/pipeline"
{{- end }}
{{- if or isExporter isProcessor }}
"go.opentelemetry.io/collector/pdata/pcommon"
@ -372,7 +373,7 @@ func TestComponentLifecycle(t *testing.T) {
{
name: "logs_to_logs",
createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) {
router := connector.NewLogsRouter(map[component.ID]consumer.Logs{component.NewID(component.DataTypeLogs): consumertest.NewNop()})
router := connector.NewLogsRouter(map[pipeline.ID]consumer.Logs{pipeline.NewID(pipeline.SignalLogs): consumertest.NewNop()})
return factory.CreateLogsToLogs(ctx, set, cfg, router)
},
},
@ -381,7 +382,7 @@ func TestComponentLifecycle(t *testing.T) {
{
name: "logs_to_metrics",
createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) {
router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{component.NewID(component.DataTypeMetrics): consumertest.NewNop()})
router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()})
return factory.CreateLogsToMetrics(ctx, set, cfg, router)
},
},
@ -390,7 +391,7 @@ func TestComponentLifecycle(t *testing.T) {
{
name: "logs_to_traces",
createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) {
router := connector.NewTracesRouter(map[component.ID]consumer.Traces{component.NewID(component.DataTypeTraces): consumertest.NewNop()})
router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{pipeline.NewID(pipeline.SignalTraces): consumertest.NewNop()})
return factory.CreateLogsToTraces(ctx, set, cfg, router)
},
},
@ -399,7 +400,7 @@ func TestComponentLifecycle(t *testing.T) {
{
name: "metrics_to_logs",
createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) {
router := connector.NewLogsRouter(map[component.ID]consumer.Logs{component.NewID(component.DataTypeLogs): consumertest.NewNop()})
router := connector.NewLogsRouter(map[pipeline.ID]consumer.Logs{pipeline.NewID(pipeline.SignalLogs): consumertest.NewNop()})
return factory.CreateMetricsToLogs(ctx, set, cfg, router)
},
},
@ -408,7 +409,7 @@ func TestComponentLifecycle(t *testing.T) {
{
name: "metrics_to_metrics",
createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) {
router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{component.NewID(component.DataTypeMetrics): consumertest.NewNop()})
router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()})
return factory.CreateMetricsToMetrics(ctx, set, cfg, router)
},
},
@ -417,7 +418,7 @@ func TestComponentLifecycle(t *testing.T) {
{
name: "metrics_to_traces",
createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) {
router := connector.NewTracesRouter(map[component.ID]consumer.Traces{component.NewID(component.DataTypeTraces): consumertest.NewNop()})
router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{pipeline.NewID(pipeline.SignalTraces): consumertest.NewNop()})
return factory.CreateMetricsToTraces(ctx, set, cfg, router)
},
},
@ -426,7 +427,7 @@ func TestComponentLifecycle(t *testing.T) {
{
name: "traces_to_logs",
createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) {
router := connector.NewLogsRouter(map[component.ID]consumer.Logs{component.NewID(component.DataTypeLogs): consumertest.NewNop()})
router := connector.NewLogsRouter(map[pipeline.ID]consumer.Logs{pipeline.NewID(pipeline.SignalLogs): consumertest.NewNop()})
return factory.CreateTracesToLogs(ctx, set, cfg, router)
},
},
@ -435,7 +436,7 @@ func TestComponentLifecycle(t *testing.T) {
{
name: "traces_to_metrics",
createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) {
router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{component.NewID(component.DataTypeMetrics): consumertest.NewNop()})
router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()})
return factory.CreateTracesToMetrics(ctx, set, cfg, router)
},
},
@ -444,7 +445,7 @@ func TestComponentLifecycle(t *testing.T) {
{
name: "traces_to_traces",
createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) {
router := connector.NewTracesRouter(map[component.ID]consumer.Traces{component.NewID(component.DataTypeTraces): consumertest.NewNop()})
router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{pipeline.NewID(pipeline.SignalTraces): consumertest.NewNop()})
return factory.CreateTracesToTraces(ctx, set, cfg, router)
},
},

View File

@ -41,6 +41,7 @@ providers:
replaces:
- go.opentelemetry.io/collector => ../../
- go.opentelemetry.io/collector/internal/globalgates => ../../internal/globalgates
- go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal
- go.opentelemetry.io/collector/client => ../../client
- go.opentelemetry.io/collector/otelcol => ../../otelcol
- go.opentelemetry.io/collector/component => ../../component
@ -85,6 +86,7 @@ replaces:
- go.opentelemetry.io/collector/pdata => ../../pdata
- go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata
- go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile
- go.opentelemetry.io/collector/pipeline => ../../pipeline
- go.opentelemetry.io/collector/processor => ../../processor
- go.opentelemetry.io/collector/processor/batchprocessor => ../../processor/batchprocessor
- go.opentelemetry.io/collector/processor/memorylimiterprocessor => ../../processor/memorylimiterprocessor

View File

@ -103,9 +103,11 @@ require (
go.opentelemetry.io/collector/extension/extensioncapabilities v0.109.0 // indirect
go.opentelemetry.io/collector/featuregate v1.15.0 // indirect
go.opentelemetry.io/collector/internal/globalgates v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/collector/pdata/testdata v0.109.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/collector/processor/processorprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/receiver/receiverprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/semconv v0.109.0 // indirect
@ -150,6 +152,8 @@ replace go.opentelemetry.io/collector => ../../
replace go.opentelemetry.io/collector/internal/globalgates => ../../internal/globalgates
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal
replace go.opentelemetry.io/collector/client => ../../client
replace go.opentelemetry.io/collector/otelcol => ../../otelcol
@ -238,6 +242,8 @@ replace go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata
replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/processor => ../../processor
replace go.opentelemetry.io/collector/processor/batchprocessor => ../../processor/batchprocessor

View File

@ -7,13 +7,16 @@ package component // import "go.opentelemetry.io/collector/component"
import (
"context"
"errors"
"go.opentelemetry.io/collector/pipeline"
)
var (
// ErrDataTypeIsNotSupported can be returned by receiver, exporter, processor or connector factory funcs that create the
// Component if the particular telemetry data type is not supported by the receiver, exporter, processor or connector factory.
ErrDataTypeIsNotSupported = errors.New("telemetry type is not supported")
//
// Deprecated: [v0.110.0] Use pipeline.ErrSignalNotSupported instead
ErrDataTypeIsNotSupported = pipeline.ErrSignalNotSupported
)
// Component is either a receiver, exporter, processor, connector, or an extension.

View File

@ -3,13 +3,21 @@
package componentprofiles // import "go.opentelemetry.io/collector/component/componentprofiles"
import "go.opentelemetry.io/collector/component"
import (
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/internal/globalsignal"
)
// nolint
func mustNewDataType(strType string) component.DataType {
return component.MustNewType(strType)
}
var (
// DataTypeProfiles is the data type tag for profiles.
//
// Deprecated: [v0.110.0] Use SignalProfiles instead
DataTypeProfiles = mustNewDataType("profiles")
SignalProfiles = globalsignal.MustNewSignal("profiles")
)

View File

@ -2,12 +2,16 @@ module go.opentelemetry.io/collector/component/componentprofiles
go 1.22.0
require go.opentelemetry.io/collector/component v0.109.0
require (
go.opentelemetry.io/collector/component v0.109.0
go.opentelemetry.io/collector/internal/globalsignal v0.109.0
)
require (
github.com/gogo/protobuf v1.3.2 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
go.opentelemetry.io/otel/trace v1.30.0 // indirect
@ -26,3 +30,7 @@ replace go.opentelemetry.io/collector/pdata => ../../pdata
replace go.opentelemetry.io/collector/config/configtelemetry => ../../config/configtelemetry
replace go.opentelemetry.io/collector/component => ../
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal
replace go.opentelemetry.io/collector/pipeline => ../../pipeline

View File

@ -5,6 +5,7 @@ go 1.22.0
require (
github.com/stretchr/testify v1.9.0
go.opentelemetry.io/collector/component v0.109.0
go.opentelemetry.io/collector/pipeline v0.109.0
)
require (
@ -12,6 +13,7 @@ require (
github.com/gogo/protobuf v1.3.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
@ -32,3 +34,7 @@ replace go.opentelemetry.io/collector/config/configtelemetry => ../../config/con
replace go.opentelemetry.io/collector/component => ../
replace go.opentelemetry.io/collector/pdata => ../../pdata
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal

View File

@ -9,6 +9,7 @@ import (
"strings"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/pipeline"
)
// pipelineDelim is the delimiter for internal representation of pipeline
@ -26,7 +27,19 @@ type InstanceID struct {
}
// NewInstanceID returns an ID that uniquely identifies a component.
//
// Deprecated: [v0.110.0] Use NewInstanceIDWithPipelineID instead
func NewInstanceID(componentID component.ID, kind component.Kind, pipelineIDs ...component.ID) *InstanceID {
instanceID := &InstanceID{
componentID: componentID,
kind: kind,
}
instanceID.addPipelines(convertToPipelineIDs(pipelineIDs))
return instanceID
}
// NewInstanceIDWithPipelineIDs returns an InstanceID that uniquely identifies a component.
func NewInstanceIDWithPipelineIDs(componentID component.ID, kind component.Kind, pipelineIDs ...pipeline.ID) *InstanceID {
instanceID := &InstanceID{
componentID: componentID,
kind: kind,
@ -47,6 +60,8 @@ func (id *InstanceID) Kind() component.Kind {
// AllPipelineIDs calls f for each pipeline this instance is associated with. If
// f returns false it will stop iteration.
//
// Deprecated: [v0.110.0] Use AllPipelineIDsWithPipelineIDs instead.
func (id *InstanceID) AllPipelineIDs(f func(component.ID) bool) {
var bs []byte
for _, b := range []byte(id.pipelineIDs) {
@ -66,9 +81,44 @@ func (id *InstanceID) AllPipelineIDs(f func(component.ID) bool) {
}
}
// AllPipelineIDsWithPipelineIDs calls f for each pipeline this instance is associated with. If
// f returns false it will stop iteration.
func (id *InstanceID) AllPipelineIDsWithPipelineIDs(f func(pipeline.ID) bool) {
var bs []byte
for _, b := range []byte(id.pipelineIDs) {
if b != pipelineDelim {
bs = append(bs, b)
continue
}
pipelineID := pipeline.ID{}
err := pipelineID.UnmarshalText(bs)
bs = bs[:0]
if err != nil {
continue
}
if !f(pipelineID) {
break
}
}
}
// WithPipelines returns a new InstanceID updated to include the given
// pipelineIDs.
//
// Deprecated: [v0.110.0] Use WithPipelineIDs instead
func (id *InstanceID) WithPipelines(pipelineIDs ...component.ID) *InstanceID {
instanceID := &InstanceID{
componentID: id.componentID,
kind: id.kind,
pipelineIDs: id.pipelineIDs,
}
instanceID.addPipelines(convertToPipelineIDs(pipelineIDs))
return instanceID
}
// WithPipelineIDs returns a new InstanceID updated to include the given
// pipelineIDs.
func (id *InstanceID) WithPipelineIDs(pipelineIDs ...pipeline.ID) *InstanceID {
instanceID := &InstanceID{
componentID: id.componentID,
kind: id.kind,
@ -78,7 +128,7 @@ func (id *InstanceID) WithPipelines(pipelineIDs ...component.ID) *InstanceID {
return instanceID
}
func (id *InstanceID) addPipelines(pipelineIDs []component.ID) {
func (id *InstanceID) addPipelines(pipelineIDs []pipeline.ID) {
delim := string(pipelineDelim)
strIDs := strings.Split(id.pipelineIDs, delim)
for _, pID := range pipelineIDs {
@ -88,3 +138,16 @@ func (id *InstanceID) addPipelines(pipelineIDs []component.ID) {
strIDs = slices.Compact(strIDs)
id.pipelineIDs = strings.Join(strIDs, delim) + delim
}
func convertToPipelineIDs(ids []component.ID) []pipeline.ID {
pipelineIDs := make([]pipeline.ID, len(ids))
for i, id := range ids {
if id.Name() != "" {
pipelineIDs[i] = pipeline.MustNewIDWithName(id.Type().String(), id.Name())
} else {
pipelineIDs[i] = pipeline.MustNewID(id.Type().String())
}
}
return pipelineIDs
}

View File

@ -9,21 +9,22 @@ import (
"github.com/stretchr/testify/assert"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/pipeline"
)
func TestInstanceID(t *testing.T) {
traces := component.MustNewID("traces")
tracesA := component.MustNewIDWithName("traces", "a")
tracesB := component.MustNewIDWithName("traces", "b")
tracesC := component.MustNewIDWithName("traces", "c")
tracesA := pipeline.MustNewIDWithName("traces", "a")
tracesB := pipeline.MustNewIDWithName("traces", "b")
tracesC := pipeline.MustNewIDWithName("traces", "c")
idTracesA := NewInstanceID(traces, component.KindReceiver, tracesA)
idTracesAll := NewInstanceID(traces, component.KindReceiver, tracesA, tracesB, tracesC)
idTracesA := NewInstanceIDWithPipelineIDs(traces, component.KindReceiver, tracesA)
idTracesAll := NewInstanceIDWithPipelineIDs(traces, component.KindReceiver, tracesA, tracesB, tracesC)
assert.NotEqual(t, idTracesA, idTracesAll)
assertHasPipelines := func(t *testing.T, instanceID *InstanceID, expectedPipelineIDs []component.ID) {
var pipelineIDs []component.ID
instanceID.AllPipelineIDs(func(id component.ID) bool {
assertHasPipelines := func(t *testing.T, instanceID *InstanceID, expectedPipelineIDs []pipeline.ID) {
var pipelineIDs []pipeline.ID
instanceID.AllPipelineIDsWithPipelineIDs(func(id pipeline.ID) bool {
pipelineIDs = append(pipelineIDs, id)
return true
})
@ -34,31 +35,31 @@ func TestInstanceID(t *testing.T) {
name string
id1 *InstanceID
id2 *InstanceID
pipelineIDs []component.ID
pipelineIDs []pipeline.ID
}{
{
name: "equal instances",
id1: idTracesA,
id2: NewInstanceID(traces, component.KindReceiver, tracesA),
pipelineIDs: []component.ID{tracesA},
id2: NewInstanceIDWithPipelineIDs(traces, component.KindReceiver, tracesA),
pipelineIDs: []pipeline.ID{tracesA},
},
{
name: "equal instances - out of order",
id1: idTracesAll,
id2: NewInstanceID(traces, component.KindReceiver, tracesC, tracesB, tracesA),
pipelineIDs: []component.ID{tracesA, tracesB, tracesC},
id2: NewInstanceIDWithPipelineIDs(traces, component.KindReceiver, tracesC, tracesB, tracesA),
pipelineIDs: []pipeline.ID{tracesA, tracesB, tracesC},
},
{
name: "with pipelines",
id1: idTracesAll,
id2: idTracesA.WithPipelines(tracesB, tracesC),
pipelineIDs: []component.ID{tracesA, tracesB, tracesC},
id2: idTracesA.WithPipelineIDs(tracesB, tracesC),
pipelineIDs: []pipeline.ID{tracesA, tracesB, tracesC},
},
{
name: "with pipelines - out of order",
id1: idTracesAll,
id2: idTracesA.WithPipelines(tracesC, tracesB),
pipelineIDs: []component.ID{tracesA, tracesB, tracesC},
id2: idTracesA.WithPipelineIDs(tracesC, tracesB),
pipelineIDs: []pipeline.ID{tracesA, tracesB, tracesC},
},
} {
t.Run(tc.name, func(t *testing.T) {
@ -69,24 +70,24 @@ func TestInstanceID(t *testing.T) {
}
}
func TestAllPipelineIDs(t *testing.T) {
instanceID := NewInstanceID(
func TestAllPipelineIDsWithPipelineIDs(t *testing.T) {
instanceID := NewInstanceIDWithPipelineIDs(
component.MustNewID("traces"),
component.KindReceiver,
component.MustNewIDWithName("traces", "a"),
component.MustNewIDWithName("traces", "b"),
component.MustNewIDWithName("traces", "c"),
pipeline.MustNewIDWithName("traces", "a"),
pipeline.MustNewIDWithName("traces", "b"),
pipeline.MustNewIDWithName("traces", "c"),
)
count := 0
instanceID.AllPipelineIDs(func(component.ID) bool {
instanceID.AllPipelineIDsWithPipelineIDs(func(pipeline.ID) bool {
count++
return true
})
assert.Equal(t, 3, count)
count = 0
instanceID.AllPipelineIDs(func(component.ID) bool {
instanceID.AllPipelineIDsWithPipelineIDs(func(pipeline.ID) bool {
count++
return false
})

View File

@ -147,6 +147,8 @@ func MustNewType(strType string) Type {
// DataType is a special Type that represents the data types supported by the collector. We currently support
// collecting metrics, traces and logs, this can expand in the future.
//
// Deprecated: [v0.110.0] Use pipeline.Signal instead.
type DataType = Type
func mustNewDataType(strType string) DataType {
@ -156,12 +158,18 @@ func mustNewDataType(strType string) DataType {
// Currently supported data types. Add new data types here when new types are supported in the future.
var (
// DataTypeTraces is the data type tag for traces.
//
// Deprecated: [v0.110.0] Use pipeline.SignalTraces instead.
DataTypeTraces = mustNewDataType("traces")
// DataTypeMetrics is the data type tag for metrics.
//
// Deprecated: [v0.110.0] Use pipeline.SignalMetrics instead.
DataTypeMetrics = mustNewDataType("metrics")
// DataTypeLogs is the data type tag for logs.
//
// Deprecated: [v0.110.0] Use pipeline.SignalLogs instead.
DataTypeLogs = mustNewDataType("logs")
)

View File

@ -6,6 +6,7 @@ require (
github.com/stretchr/testify v1.9.0
go.opentelemetry.io/collector/config/configtelemetry v0.109.0
go.opentelemetry.io/collector/pdata v1.15.0
go.opentelemetry.io/collector/pipeline v0.109.0
go.opentelemetry.io/otel v1.30.0
go.opentelemetry.io/otel/metric v1.30.0
go.opentelemetry.io/otel/sdk v1.30.0
@ -23,6 +24,7 @@ require (
github.com/gogo/protobuf v1.3.2 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
golang.org/x/net v0.28.0 // indirect
golang.org/x/sys v0.25.0 // indirect
golang.org/x/text v0.17.0 // indirect
@ -40,3 +42,7 @@ retract (
v0.76.0 // Depends on retracted pdata v1.0.0-rc10 module, use v0.76.1
v0.69.0 // Release failed, use v0.69.1
)
replace go.opentelemetry.io/collector/pipeline => ../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../internal/globalsignal

View File

@ -15,7 +15,9 @@ require (
github.com/gogo/protobuf v1.3.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
go.opentelemetry.io/otel/trace v1.30.0 // indirect
@ -39,3 +41,7 @@ replace go.opentelemetry.io/collector/config/configtelemetry => ../configtelemet
replace go.opentelemetry.io/collector/extension => ../../extension
replace go.opentelemetry.io/collector/extension/auth => ../../extension/auth
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal

View File

@ -41,7 +41,9 @@ require (
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/extension v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
go.opentelemetry.io/otel/sdk v1.30.0 // indirect
go.opentelemetry.io/otel/sdk/metric v1.30.0 // indirect
@ -88,3 +90,7 @@ replace go.opentelemetry.io/collector/component => ../../component
replace go.opentelemetry.io/collector/consumer => ../../consumer
replace go.opentelemetry.io/collector/internal/globalgates => ../../internal/globalgates
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal
replace go.opentelemetry.io/collector/pipeline => ../../pipeline

View File

@ -37,7 +37,9 @@ require (
github.com/hashicorp/go-version v1.7.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/extension v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/otel/sdk v1.30.0 // indirect
go.opentelemetry.io/otel/sdk/metric v1.30.0 // indirect
go.opentelemetry.io/otel/trace v1.30.0 // indirect
@ -81,3 +83,7 @@ replace go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata
replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile
replace go.opentelemetry.io/collector/internal/globalgates => ../../internal/globalgates
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal
replace go.opentelemetry.io/collector/pipeline => ../../pipeline

View File

@ -14,6 +14,7 @@ import (
"go.opentelemetry.io/collector/connector/internal"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/consumer/consumertest"
"go.opentelemetry.io/collector/pipeline"
)
var (
@ -28,25 +29,25 @@ func TestNewFactoryNoOptions(t *testing.T) {
assert.EqualValues(t, &defaultCfg, factory.CreateDefaultConfig())
_, err := factory.CreateTracesToTraces(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeTraces, component.DataTypeTraces))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalTraces, pipeline.SignalTraces))
_, err = factory.CreateTracesToMetrics(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeTraces, component.DataTypeMetrics))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalTraces, pipeline.SignalMetrics))
_, err = factory.CreateTracesToLogs(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeTraces, component.DataTypeLogs))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalTraces, pipeline.SignalLogs))
_, err = factory.CreateMetricsToTraces(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeMetrics, component.DataTypeTraces))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalMetrics, pipeline.SignalTraces))
_, err = factory.CreateMetricsToMetrics(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeMetrics, component.DataTypeMetrics))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalMetrics, pipeline.SignalMetrics))
_, err = factory.CreateMetricsToLogs(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeMetrics, component.DataTypeLogs))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalMetrics, pipeline.SignalLogs))
_, err = factory.CreateLogsToTraces(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeLogs, component.DataTypeTraces))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalLogs, pipeline.SignalTraces))
_, err = factory.CreateLogsToMetrics(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeLogs, component.DataTypeMetrics))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalLogs, pipeline.SignalMetrics))
_, err = factory.CreateLogsToLogs(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeLogs, component.DataTypeLogs))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalLogs, pipeline.SignalLogs))
}
func TestNewFactoryWithSameTypes(t *testing.T) {
@ -71,19 +72,19 @@ func TestNewFactoryWithSameTypes(t *testing.T) {
require.NoError(t, err)
_, err = factory.CreateTracesToMetrics(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeTraces, component.DataTypeMetrics))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalTraces, pipeline.SignalMetrics))
_, err = factory.CreateTracesToLogs(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeTraces, component.DataTypeLogs))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalTraces, pipeline.SignalLogs))
_, err = factory.CreateMetricsToTraces(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeMetrics, component.DataTypeTraces))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalMetrics, pipeline.SignalTraces))
_, err = factory.CreateMetricsToLogs(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeMetrics, component.DataTypeLogs))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalMetrics, pipeline.SignalLogs))
_, err = factory.CreateLogsToTraces(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeLogs, component.DataTypeTraces))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalLogs, pipeline.SignalTraces))
_, err = factory.CreateLogsToMetrics(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeLogs, component.DataTypeMetrics))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalLogs, pipeline.SignalMetrics))
}
func TestNewFactoryWithTranslateTypes(t *testing.T) {
@ -99,11 +100,11 @@ func TestNewFactoryWithTranslateTypes(t *testing.T) {
assert.EqualValues(t, &defaultCfg, factory.CreateDefaultConfig())
_, err := factory.CreateTracesToTraces(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeTraces, component.DataTypeTraces))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalTraces, pipeline.SignalTraces))
_, err = factory.CreateMetricsToMetrics(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeMetrics, component.DataTypeMetrics))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalMetrics, pipeline.SignalMetrics))
_, err = factory.CreateLogsToLogs(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeLogs, component.DataTypeLogs))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalLogs, pipeline.SignalLogs))
assert.Equal(t, component.StabilityLevelDevelopment, factory.TracesToMetricsStability())
_, err = factory.CreateTracesToMetrics(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())

View File

@ -17,6 +17,7 @@ import (
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/consumer/consumerprofiles"
"go.opentelemetry.io/collector/consumer/consumertest"
"go.opentelemetry.io/collector/pipeline"
)
var (
@ -31,18 +32,18 @@ func TestNewFactoryNoOptions(t *testing.T) {
assert.EqualValues(t, &defaultCfg, factory.CreateDefaultConfig())
_, err := factory.CreateTracesToProfiles(context.Background(), connector.Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeTraces, componentprofiles.DataTypeProfiles))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalTraces, componentprofiles.SignalProfiles))
_, err = factory.CreateMetricsToProfiles(context.Background(), connector.Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeMetrics, componentprofiles.DataTypeProfiles))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalMetrics, componentprofiles.SignalProfiles))
_, err = factory.CreateLogsToProfiles(context.Background(), connector.Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, component.DataTypeLogs, componentprofiles.DataTypeProfiles))
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalLogs, componentprofiles.SignalProfiles))
_, err = factory.CreateProfilesToTraces(context.Background(), connector.Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, componentprofiles.DataTypeProfiles, component.DataTypeTraces))
assert.Equal(t, err, internal.ErrDataTypes(testID, componentprofiles.SignalProfiles, pipeline.SignalTraces))
_, err = factory.CreateProfilesToMetrics(context.Background(), connector.Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, componentprofiles.DataTypeProfiles, component.DataTypeMetrics))
assert.Equal(t, err, internal.ErrDataTypes(testID, componentprofiles.SignalProfiles, pipeline.SignalMetrics))
_, err = factory.CreateProfilesToLogs(context.Background(), connector.Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, componentprofiles.DataTypeProfiles, component.DataTypeLogs))
assert.Equal(t, err, internal.ErrDataTypes(testID, componentprofiles.SignalProfiles, pipeline.SignalLogs))
}
func TestNewFactoryWithSameTypes(t *testing.T) {
@ -58,11 +59,11 @@ func TestNewFactoryWithSameTypes(t *testing.T) {
require.NoError(t, err)
_, err = factory.CreateProfilesToTraces(context.Background(), connector.Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, componentprofiles.DataTypeProfiles, component.DataTypeTraces))
assert.Equal(t, err, internal.ErrDataTypes(testID, componentprofiles.SignalProfiles, pipeline.SignalTraces))
_, err = factory.CreateProfilesToMetrics(context.Background(), connector.Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, componentprofiles.DataTypeProfiles, component.DataTypeMetrics))
assert.Equal(t, err, internal.ErrDataTypes(testID, componentprofiles.SignalProfiles, pipeline.SignalMetrics))
_, err = factory.CreateProfilesToLogs(context.Background(), connector.Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, componentprofiles.DataTypeProfiles, component.DataTypeLogs))
assert.Equal(t, err, internal.ErrDataTypes(testID, componentprofiles.SignalProfiles, pipeline.SignalLogs))
}
func TestNewFactoryWithTranslateTypes(t *testing.T) {
@ -80,7 +81,7 @@ func TestNewFactoryWithTranslateTypes(t *testing.T) {
assert.EqualValues(t, &defaultCfg, factory.CreateDefaultConfig())
_, err := factory.CreateProfilesToProfiles(context.Background(), connector.Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
assert.Equal(t, err, internal.ErrDataTypes(testID, componentprofiles.DataTypeProfiles, componentprofiles.DataTypeProfiles))
assert.Equal(t, err, internal.ErrDataTypes(testID, componentprofiles.SignalProfiles, componentprofiles.SignalProfiles))
assert.Equal(t, component.StabilityLevelBeta, factory.TracesToProfilesStability())
_, err = factory.CreateTracesToProfiles(context.Background(), connector.Settings{ID: testID}, &defaultCfg, consumertest.NewNop())

View File

@ -13,6 +13,7 @@ require (
go.opentelemetry.io/collector/consumer/consumertest v0.109.0
go.opentelemetry.io/collector/pdata/pprofile v0.109.0
go.opentelemetry.io/collector/pdata/testdata v0.109.0
go.opentelemetry.io/collector/pipeline v0.109.0
)
require (
@ -23,6 +24,7 @@ require (
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
@ -63,3 +65,7 @@ replace go.opentelemetry.io/collector/config/configtelemetry => ../../config/con
replace go.opentelemetry.io/collector/pdata/testdata => ../../pdata/testdata
replace go.opentelemetry.io/collector/component/componentstatus => ../../component/componentstatus
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal

View File

@ -4,17 +4,16 @@
package connectorprofiles // import "go.opentelemetry.io/collector/connector/connectorprofiles"
import (
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/connector/internal"
"go.opentelemetry.io/collector/consumer/consumerprofiles"
"go.opentelemetry.io/collector/internal/fanoutconsumer"
"go.opentelemetry.io/collector/pipeline"
)
// ProfilesRouterAndConsumer feeds the first consumerprofiles.Profiles in each of the specified pipelines.
type ProfilesRouterAndConsumer interface {
consumerprofiles.Profiles
Consumer(...component.ID) (consumerprofiles.Profiles, error)
PipelineIDs() []component.ID
Consumer(...pipeline.ID) (consumerprofiles.Profiles, error)
PipelineIDs() []pipeline.ID
privateFunc()
}
@ -23,7 +22,7 @@ type profilesRouter struct {
internal.BaseRouter[consumerprofiles.Profiles]
}
func NewProfilesRouter(cm map[component.ID]consumerprofiles.Profiles) ProfilesRouterAndConsumer {
func NewProfilesRouter(cm map[pipeline.ID]consumerprofiles.Profiles) ProfilesRouterAndConsumer {
consumers := make([]consumerprofiles.Profiles, 0, len(cm))
for _, cons := range cm {
consumers = append(consumers, cons)

View File

@ -12,12 +12,12 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/consumer/consumerprofiles"
"go.opentelemetry.io/collector/consumer/consumertest"
"go.opentelemetry.io/collector/pdata/pprofile"
"go.opentelemetry.io/collector/pdata/testdata"
"go.opentelemetry.io/collector/pipeline"
)
type mutatingProfilesSink struct {
@ -44,13 +44,13 @@ func TestProfilesRouterMultiplexing(t *testing.T) {
func fuzzProfiles(numIDs, numCons, numProfiles int) func(*testing.T) {
return func(t *testing.T) {
allIDs := make([]component.ID, 0, numCons)
allIDs := make([]pipeline.ID, 0, numCons)
allCons := make([]consumerprofiles.Profiles, 0, numCons)
allConsMap := make(map[component.ID]consumerprofiles.Profiles)
allConsMap := make(map[pipeline.ID]consumerprofiles.Profiles)
// If any consumer is mutating, the router must report mutating
for i := 0; i < numCons; i++ {
allIDs = append(allIDs, component.MustNewIDWithName("sink", strconv.Itoa(numCons)))
allIDs = append(allIDs, pipeline.MustNewIDWithName("sink", strconv.Itoa(numCons)))
// Random chance for each consumer to be mutating
if (numCons+numProfiles+i)%4 == 0 {
allCons = append(allCons, &mutatingProfilesSink{ProfilesSink: new(consumertest.ProfilesSink)})
@ -65,11 +65,11 @@ func fuzzProfiles(numIDs, numCons, numProfiles int) func(*testing.T) {
// Keep track of how many logs each consumer should receive.
// This will be validated after every call to RouteProfiles.
expected := make(map[component.ID]int, numCons)
expected := make(map[pipeline.ID]int, numCons)
for i := 0; i < numProfiles; i++ {
// Build a random set of ids (no duplicates)
randCons := make(map[component.ID]bool, numIDs)
randCons := make(map[pipeline.ID]bool, numIDs)
for j := 0; j < numIDs; j++ {
// This number should be pretty random and less than numCons
conNum := (numCons + numIDs + i + j) % numCons
@ -77,7 +77,7 @@ func fuzzProfiles(numIDs, numCons, numProfiles int) func(*testing.T) {
}
// Convert to slice, update expectations
conIDs := make([]component.ID, 0, len(randCons))
conIDs := make([]pipeline.ID, 0, len(randCons))
for id := range randCons {
conIDs = append(conIDs, id)
expected[id]++
@ -110,16 +110,16 @@ func TestProfilessRouterConsumer(t *testing.T) {
ctx := context.Background()
td := testdata.GenerateProfiles(1)
fooID := component.MustNewID("foo")
barID := component.MustNewID("bar")
fooID := pipeline.MustNewID("foo")
barID := pipeline.MustNewID("bar")
foo := new(consumertest.ProfilesSink)
bar := new(consumertest.ProfilesSink)
r := NewProfilesRouter(map[component.ID]consumerprofiles.Profiles{fooID: foo, barID: bar})
r := NewProfilesRouter(map[pipeline.ID]consumerprofiles.Profiles{fooID: foo, barID: bar})
rcs := r.PipelineIDs()
assert.Len(t, rcs, 2)
assert.ElementsMatch(t, []component.ID{fooID, barID}, rcs)
assert.ElementsMatch(t, []pipeline.ID{fooID, barID}, rcs)
assert.Empty(t, foo.AllProfiles())
assert.Empty(t, bar.AllProfiles())
@ -152,7 +152,7 @@ func TestProfilessRouterConsumer(t *testing.T) {
assert.Nil(t, none)
require.Error(t, err)
fake, err := r.Consumer(component.MustNewID("fake"))
fake, err := r.Consumer(pipeline.MustNewID("fake"))
assert.Nil(t, fake)
assert.Error(t, err)
}

View File

@ -15,6 +15,7 @@ import (
"go.opentelemetry.io/collector/connector/connectortest"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/consumer/consumertest"
"go.opentelemetry.io/collector/pipeline"
)
func TestComponentFactoryType(t *testing.T) {
@ -36,7 +37,7 @@ func TestComponentLifecycle(t *testing.T) {
{
name: "logs_to_logs",
createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) {
router := connector.NewLogsRouter(map[component.ID]consumer.Logs{component.NewID(component.DataTypeLogs): consumertest.NewNop()})
router := connector.NewLogsRouter(map[pipeline.ID]consumer.Logs{pipeline.NewID(pipeline.SignalLogs): consumertest.NewNop()})
return factory.CreateLogsToLogs(ctx, set, cfg, router)
},
},
@ -44,7 +45,7 @@ func TestComponentLifecycle(t *testing.T) {
{
name: "metrics_to_metrics",
createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) {
router := connector.NewMetricsRouter(map[component.ID]consumer.Metrics{component.NewID(component.DataTypeMetrics): consumertest.NewNop()})
router := connector.NewMetricsRouter(map[pipeline.ID]consumer.Metrics{pipeline.NewID(pipeline.SignalMetrics): consumertest.NewNop()})
return factory.CreateMetricsToMetrics(ctx, set, cfg, router)
},
},
@ -52,7 +53,7 @@ func TestComponentLifecycle(t *testing.T) {
{
name: "traces_to_traces",
createFn: func(ctx context.Context, set connector.Settings, cfg component.Config) (component.Component, error) {
router := connector.NewTracesRouter(map[component.ID]consumer.Traces{component.NewID(component.DataTypeTraces): consumertest.NewNop()})
router := connector.NewTracesRouter(map[pipeline.ID]consumer.Traces{pipeline.NewID(pipeline.SignalTraces): consumertest.NewNop()})
return factory.CreateTracesToTraces(ctx, set, cfg, router)
},
},

View File

@ -10,6 +10,7 @@ require (
go.opentelemetry.io/collector/consumer v0.109.0
go.opentelemetry.io/collector/consumer/consumertest v0.109.0
go.opentelemetry.io/collector/pdata v1.15.0
go.opentelemetry.io/collector/pipeline v0.109.0
go.uber.org/goleak v1.3.0
)
@ -34,6 +35,7 @@ require (
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/connector/connectorprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/consumer/consumerprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
@ -83,3 +85,7 @@ replace go.opentelemetry.io/collector/component/componentprofiles => ../../compo
replace go.opentelemetry.io/collector/component/componentstatus => ../../component/componentstatus
replace go.opentelemetry.io/collector/connector/connectorprofiles => ../connectorprofiles
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal

View File

@ -15,6 +15,7 @@ require (
go.opentelemetry.io/collector/pdata v1.15.0
go.opentelemetry.io/collector/pdata/pprofile v0.109.0
go.opentelemetry.io/collector/pdata/testdata v0.109.0
go.opentelemetry.io/collector/pipeline v0.109.0
go.uber.org/goleak v1.3.0
go.uber.org/multierr v1.11.0
)
@ -29,6 +30,7 @@ require (
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
go.opentelemetry.io/otel/sdk v1.30.0 // indirect
@ -69,3 +71,7 @@ replace go.opentelemetry.io/collector/component/componentprofiles => ../componen
replace go.opentelemetry.io/collector/component/componentstatus => ../component/componentstatus
replace go.opentelemetry.io/collector/connector/connectorprofiles => ./connectorprofiles
replace go.opentelemetry.io/collector/pipeline => ../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../internal/globalsignal

View File

@ -11,6 +11,7 @@ import (
"go.opentelemetry.io/collector/component/componentprofiles"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/consumer/consumerprofiles"
"go.opentelemetry.io/collector/pipeline"
)
// Factory is a factory interface for connectors.
@ -143,7 +144,7 @@ func (f CreateTracesToTracesFunc) CreateTracesToTraces(
cfg component.Config,
nextConsumer consumer.Traces) (Traces, error) {
if f == nil {
return nil, ErrDataTypes(set.ID, component.DataTypeTraces, component.DataTypeTraces)
return nil, ErrDataTypes(set.ID, pipeline.SignalTraces, pipeline.SignalTraces)
}
return f(ctx, set, cfg, nextConsumer)
}
@ -159,7 +160,7 @@ func (f CreateTracesToMetricsFunc) CreateTracesToMetrics(
nextConsumer consumer.Metrics,
) (Traces, error) {
if f == nil {
return nil, ErrDataTypes(set.ID, component.DataTypeTraces, component.DataTypeMetrics)
return nil, ErrDataTypes(set.ID, pipeline.SignalTraces, pipeline.SignalMetrics)
}
return f(ctx, set, cfg, nextConsumer)
}
@ -175,7 +176,7 @@ func (f CreateTracesToLogsFunc) CreateTracesToLogs(
nextConsumer consumer.Logs,
) (Traces, error) {
if f == nil {
return nil, ErrDataTypes(set.ID, component.DataTypeTraces, component.DataTypeLogs)
return nil, ErrDataTypes(set.ID, pipeline.SignalTraces, pipeline.SignalLogs)
}
return f(ctx, set, cfg, nextConsumer)
}
@ -191,7 +192,7 @@ func (f CreateTracesToProfilesFunc) CreateTracesToProfiles(
nextConsumer consumerprofiles.Profiles,
) (Traces, error) {
if f == nil {
return nil, ErrDataTypes(set.ID, component.DataTypeTraces, componentprofiles.DataTypeProfiles)
return nil, ErrDataTypes(set.ID, pipeline.SignalTraces, componentprofiles.SignalProfiles)
}
return f(ctx, set, cfg, nextConsumer)
}
@ -207,7 +208,7 @@ func (f CreateMetricsToTracesFunc) CreateMetricsToTraces(
nextConsumer consumer.Traces,
) (Metrics, error) {
if f == nil {
return nil, ErrDataTypes(set.ID, component.DataTypeMetrics, component.DataTypeTraces)
return nil, ErrDataTypes(set.ID, pipeline.SignalMetrics, pipeline.SignalTraces)
}
return f(ctx, set, cfg, nextConsumer)
}
@ -223,7 +224,7 @@ func (f CreateMetricsToMetricsFunc) CreateMetricsToMetrics(
nextConsumer consumer.Metrics,
) (Metrics, error) {
if f == nil {
return nil, ErrDataTypes(set.ID, component.DataTypeMetrics, component.DataTypeMetrics)
return nil, ErrDataTypes(set.ID, pipeline.SignalMetrics, pipeline.SignalMetrics)
}
return f(ctx, set, cfg, nextConsumer)
}
@ -239,7 +240,7 @@ func (f CreateMetricsToLogsFunc) CreateMetricsToLogs(
nextConsumer consumer.Logs,
) (Metrics, error) {
if f == nil {
return nil, ErrDataTypes(set.ID, component.DataTypeMetrics, component.DataTypeLogs)
return nil, ErrDataTypes(set.ID, pipeline.SignalMetrics, pipeline.SignalLogs)
}
return f(ctx, set, cfg, nextConsumer)
}
@ -255,7 +256,7 @@ func (f CreateMetricsToProfilesFunc) CreateMetricsToProfiles(
nextConsumer consumerprofiles.Profiles,
) (Metrics, error) {
if f == nil {
return nil, ErrDataTypes(set.ID, component.DataTypeMetrics, componentprofiles.DataTypeProfiles)
return nil, ErrDataTypes(set.ID, pipeline.SignalMetrics, componentprofiles.SignalProfiles)
}
return f(ctx, set, cfg, nextConsumer)
}
@ -271,7 +272,7 @@ func (f CreateLogsToTracesFunc) CreateLogsToTraces(
nextConsumer consumer.Traces,
) (Logs, error) {
if f == nil {
return nil, ErrDataTypes(set.ID, component.DataTypeLogs, component.DataTypeTraces)
return nil, ErrDataTypes(set.ID, pipeline.SignalLogs, pipeline.SignalTraces)
}
return f(ctx, set, cfg, nextConsumer)
}
@ -287,7 +288,7 @@ func (f CreateLogsToMetricsFunc) CreateLogsToMetrics(
nextConsumer consumer.Metrics,
) (Logs, error) {
if f == nil {
return nil, ErrDataTypes(set.ID, component.DataTypeLogs, component.DataTypeMetrics)
return nil, ErrDataTypes(set.ID, pipeline.SignalLogs, pipeline.SignalMetrics)
}
return f(ctx, set, cfg, nextConsumer)
}
@ -303,7 +304,7 @@ func (f CreateLogsToLogsFunc) CreateLogsToLogs(
nextConsumer consumer.Logs,
) (Logs, error) {
if f == nil {
return nil, ErrDataTypes(set.ID, component.DataTypeLogs, component.DataTypeLogs)
return nil, ErrDataTypes(set.ID, pipeline.SignalLogs, pipeline.SignalLogs)
}
return f(ctx, set, cfg, nextConsumer)
}
@ -319,7 +320,7 @@ func (f CreateLogsToProfilesFunc) CreateLogsToProfiles(
nextConsumer consumerprofiles.Profiles,
) (Logs, error) {
if f == nil {
return nil, ErrDataTypes(set.ID, component.DataTypeLogs, componentprofiles.DataTypeProfiles)
return nil, ErrDataTypes(set.ID, pipeline.SignalLogs, componentprofiles.SignalProfiles)
}
return f(ctx, set, cfg, nextConsumer)
}
@ -335,7 +336,7 @@ func (f CreateProfilesToProfilesFunc) CreateProfilesToProfiles(
nextConsumer consumerprofiles.Profiles,
) (Profiles, error) {
if f == nil {
return nil, ErrDataTypes(set.ID, componentprofiles.DataTypeProfiles, componentprofiles.DataTypeProfiles)
return nil, ErrDataTypes(set.ID, componentprofiles.SignalProfiles, componentprofiles.SignalProfiles)
}
return f(ctx, set, cfg, nextConsumer)
}
@ -351,7 +352,7 @@ func (f CreateProfilesToTracesFunc) CreateProfilesToTraces(
nextConsumer consumer.Traces,
) (Profiles, error) {
if f == nil {
return nil, ErrDataTypes(set.ID, componentprofiles.DataTypeProfiles, component.DataTypeTraces)
return nil, ErrDataTypes(set.ID, componentprofiles.SignalProfiles, pipeline.SignalTraces)
}
return f(ctx, set, cfg, nextConsumer)
}
@ -367,7 +368,7 @@ func (f CreateProfilesToMetricsFunc) CreateProfilesToMetrics(
nextConsumer consumer.Metrics,
) (Profiles, error) {
if f == nil {
return nil, ErrDataTypes(set.ID, componentprofiles.DataTypeProfiles, component.DataTypeMetrics)
return nil, ErrDataTypes(set.ID, componentprofiles.SignalProfiles, pipeline.SignalMetrics)
}
return f(ctx, set, cfg, nextConsumer)
}
@ -383,7 +384,7 @@ func (f CreateProfilesToLogsFunc) CreateProfilesToLogs(
nextConsumer consumer.Logs,
) (Profiles, error) {
if f == nil {
return nil, ErrDataTypes(set.ID, componentprofiles.DataTypeProfiles, component.DataTypeLogs)
return nil, ErrDataTypes(set.ID, componentprofiles.SignalProfiles, pipeline.SignalLogs)
}
return f(ctx, set, cfg, nextConsumer)
}
@ -599,6 +600,6 @@ func WithProfilesToLogs(createProfilesToLogs CreateProfilesToLogsFunc, sl compon
})
}
func ErrDataTypes(id component.ID, from, to component.DataType) error {
return fmt.Errorf("connector %q cannot connect from %s to %s: %w", id, from, to, component.ErrDataTypeIsNotSupported)
func ErrDataTypes(id component.ID, from, to pipeline.Signal) error {
return fmt.Errorf("connector %q cannot connect from %s to %s: %w", id, from, to, pipeline.ErrSignalNotSupported)
}

View File

@ -8,31 +8,31 @@ import (
"go.uber.org/multierr"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/pipeline"
)
type BaseRouter[T any] struct {
fanout func([]T) T
Consumers map[component.ID]T
Consumers map[pipeline.ID]T
}
func NewBaseRouter[T any](fanout func([]T) T, cm map[component.ID]T) BaseRouter[T] {
consumers := make(map[component.ID]T, len(cm))
func NewBaseRouter[T any](fanout func([]T) T, cm map[pipeline.ID]T) BaseRouter[T] {
consumers := make(map[pipeline.ID]T, len(cm))
for k, v := range cm {
consumers[k] = v
}
return BaseRouter[T]{fanout: fanout, Consumers: consumers}
}
func (r *BaseRouter[T]) PipelineIDs() []component.ID {
ids := make([]component.ID, 0, len(r.Consumers))
func (r *BaseRouter[T]) PipelineIDs() []pipeline.ID {
ids := make([]pipeline.ID, 0, len(r.Consumers))
for id := range r.Consumers {
ids = append(ids, id)
}
return ids
}
func (r *BaseRouter[T]) Consumer(pipelineIDs ...component.ID) (T, error) {
func (r *BaseRouter[T]) Consumer(pipelineIDs ...pipeline.ID) (T, error) {
var ret T
if len(pipelineIDs) == 0 {
return ret, fmt.Errorf("missing consumers")

View File

@ -8,17 +8,17 @@ import (
"go.uber.org/multierr"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/connector/internal"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/internal/fanoutconsumer"
"go.opentelemetry.io/collector/pipeline"
)
// LogsRouterAndConsumer feeds the first consumer.Logs in each of the specified pipelines.
type LogsRouterAndConsumer interface {
consumer.Logs
Consumer(...component.ID) (consumer.Logs, error)
PipelineIDs() []component.ID
Consumer(...pipeline.ID) (consumer.Logs, error)
PipelineIDs() []pipeline.ID
privateFunc()
}
@ -27,7 +27,7 @@ type logsRouter struct {
internal.BaseRouter[consumer.Logs]
}
func NewLogsRouter(cm map[component.ID]consumer.Logs) LogsRouterAndConsumer {
func NewLogsRouter(cm map[pipeline.ID]consumer.Logs) LogsRouterAndConsumer {
consumers := make([]consumer.Logs, 0, len(cm))
for _, cons := range cm {
consumers = append(consumers, cons)
@ -38,15 +38,15 @@ func NewLogsRouter(cm map[component.ID]consumer.Logs) LogsRouterAndConsumer {
}
}
func (r *logsRouter) PipelineIDs() []component.ID {
ids := make([]component.ID, 0, len(r.Consumers))
func (r *logsRouter) PipelineIDs() []pipeline.ID {
ids := make([]pipeline.ID, 0, len(r.Consumers))
for id := range r.Consumers {
ids = append(ids, id)
}
return ids
}
func (r *logsRouter) Consumer(pipelineIDs ...component.ID) (consumer.Logs, error) {
func (r *logsRouter) Consumer(pipelineIDs ...pipeline.ID) (consumer.Logs, error) {
if len(pipelineIDs) == 0 {
return nil, fmt.Errorf("missing consumers")
}

View File

@ -12,11 +12,11 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/consumer/consumertest"
"go.opentelemetry.io/collector/pdata/plog"
"go.opentelemetry.io/collector/pdata/testdata"
"go.opentelemetry.io/collector/pipeline"
)
type mutatingLogsSink struct {
@ -43,13 +43,13 @@ func TestLogsRouterMultiplexing(t *testing.T) {
func fuzzLogs(numIDs, numCons, numLogs int) func(*testing.T) {
return func(t *testing.T) {
allIDs := make([]component.ID, 0, numCons)
allIDs := make([]pipeline.ID, 0, numCons)
allCons := make([]consumer.Logs, 0, numCons)
allConsMap := make(map[component.ID]consumer.Logs)
allConsMap := make(map[pipeline.ID]consumer.Logs)
// If any consumer is mutating, the router must report mutating
for i := 0; i < numCons; i++ {
allIDs = append(allIDs, component.MustNewIDWithName("sink", strconv.Itoa(numCons)))
allIDs = append(allIDs, pipeline.MustNewIDWithName("sink", strconv.Itoa(numCons)))
// Random chance for each consumer to be mutating
if (numCons+numLogs+i)%4 == 0 {
allCons = append(allCons, &mutatingLogsSink{LogsSink: new(consumertest.LogsSink)})
@ -64,11 +64,11 @@ func fuzzLogs(numIDs, numCons, numLogs int) func(*testing.T) {
// Keep track of how many logs each consumer should receive.
// This will be validated after every call to RouteLogs.
expected := make(map[component.ID]int, numCons)
expected := make(map[pipeline.ID]int, numCons)
for i := 0; i < numLogs; i++ {
// Build a random set of ids (no duplicates)
randCons := make(map[component.ID]bool, numIDs)
randCons := make(map[pipeline.ID]bool, numIDs)
for j := 0; j < numIDs; j++ {
// This number should be pretty random and less than numCons
conNum := (numCons + numIDs + i + j) % numCons
@ -76,7 +76,7 @@ func fuzzLogs(numIDs, numCons, numLogs int) func(*testing.T) {
}
// Convert to slice, update expectations
conIDs := make([]component.ID, 0, len(randCons))
conIDs := make([]pipeline.ID, 0, len(randCons))
for id := range randCons {
conIDs = append(conIDs, id)
expected[id]++
@ -109,16 +109,16 @@ func TestLogsRouterConsumers(t *testing.T) {
ctx := context.Background()
ld := testdata.GenerateLogs(1)
fooID := component.MustNewID("foo")
barID := component.MustNewID("bar")
fooID := pipeline.MustNewID("foo")
barID := pipeline.MustNewID("bar")
foo := new(consumertest.LogsSink)
bar := new(consumertest.LogsSink)
r := NewLogsRouter(map[component.ID]consumer.Logs{fooID: foo, barID: bar})
r := NewLogsRouter(map[pipeline.ID]consumer.Logs{fooID: foo, barID: bar})
rcs := r.PipelineIDs()
assert.Len(t, rcs, 2)
assert.ElementsMatch(t, []component.ID{fooID, barID}, rcs)
assert.ElementsMatch(t, []pipeline.ID{fooID, barID}, rcs)
assert.Empty(t, foo.AllLogs())
assert.Empty(t, bar.AllLogs())
@ -151,7 +151,7 @@ func TestLogsRouterConsumers(t *testing.T) {
assert.Nil(t, none)
require.Error(t, err)
fake, err := r.Consumer(component.MustNewID("fake"))
fake, err := r.Consumer(pipeline.MustNewID("fake"))
assert.Nil(t, fake)
assert.Error(t, err)
}

View File

@ -4,17 +4,17 @@
package connector // import "go.opentelemetry.io/collector/connector"
import (
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/connector/internal"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/internal/fanoutconsumer"
"go.opentelemetry.io/collector/pipeline"
)
// MetricsRouterAndConsumer feeds the first consumer.Metrics in each of the specified pipelines.
type MetricsRouterAndConsumer interface {
consumer.Metrics
Consumer(...component.ID) (consumer.Metrics, error)
PipelineIDs() []component.ID
Consumer(...pipeline.ID) (consumer.Metrics, error)
PipelineIDs() []pipeline.ID
privateFunc()
}
@ -23,7 +23,7 @@ type metricsRouter struct {
internal.BaseRouter[consumer.Metrics]
}
func NewMetricsRouter(cm map[component.ID]consumer.Metrics) MetricsRouterAndConsumer {
func NewMetricsRouter(cm map[pipeline.ID]consumer.Metrics) MetricsRouterAndConsumer {
consumers := make([]consumer.Metrics, 0, len(cm))
for _, cons := range cm {
consumers = append(consumers, cons)

View File

@ -12,11 +12,11 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/consumer/consumertest"
"go.opentelemetry.io/collector/pdata/pmetric"
"go.opentelemetry.io/collector/pdata/testdata"
"go.opentelemetry.io/collector/pipeline"
)
type mutatingMetricsSink struct {
@ -43,13 +43,13 @@ func TestMetricsRouterMultiplexing(t *testing.T) {
func fuzzMetrics(numIDs, numCons, numMetrics int) func(*testing.T) {
return func(t *testing.T) {
allIDs := make([]component.ID, 0, numCons)
allIDs := make([]pipeline.ID, 0, numCons)
allCons := make([]consumer.Metrics, 0, numCons)
allConsMap := make(map[component.ID]consumer.Metrics)
allConsMap := make(map[pipeline.ID]consumer.Metrics)
// If any consumer is mutating, the router must report mutating
for i := 0; i < numCons; i++ {
allIDs = append(allIDs, component.MustNewIDWithName("sink", strconv.Itoa(numCons)))
allIDs = append(allIDs, pipeline.MustNewIDWithName("sink", strconv.Itoa(numCons)))
// Random chance for each consumer to be mutating
if (numCons+numMetrics+i)%4 == 0 {
allCons = append(allCons, &mutatingMetricsSink{MetricsSink: new(consumertest.MetricsSink)})
@ -64,11 +64,11 @@ func fuzzMetrics(numIDs, numCons, numMetrics int) func(*testing.T) {
// Keep track of how many logs each consumer should receive.
// This will be validated after every call to RouteMetrics.
expected := make(map[component.ID]int, numCons)
expected := make(map[pipeline.ID]int, numCons)
for i := 0; i < numMetrics; i++ {
// Build a random set of ids (no duplicates)
randCons := make(map[component.ID]bool, numIDs)
randCons := make(map[pipeline.ID]bool, numIDs)
for j := 0; j < numIDs; j++ {
// This number should be pretty random and less than numCons
conNum := (numCons + numIDs + i + j) % numCons
@ -76,7 +76,7 @@ func fuzzMetrics(numIDs, numCons, numMetrics int) func(*testing.T) {
}
// Convert to slice, update expectations
conIDs := make([]component.ID, 0, len(randCons))
conIDs := make([]pipeline.ID, 0, len(randCons))
for id := range randCons {
conIDs = append(conIDs, id)
expected[id]++
@ -109,16 +109,16 @@ func TestMetricsRouterConsumers(t *testing.T) {
ctx := context.Background()
md := testdata.GenerateMetrics(1)
fooID := component.MustNewID("foo")
barID := component.MustNewID("bar")
fooID := pipeline.MustNewID("foo")
barID := pipeline.MustNewID("bar")
foo := new(consumertest.MetricsSink)
bar := new(consumertest.MetricsSink)
r := NewMetricsRouter(map[component.ID]consumer.Metrics{fooID: foo, barID: bar})
r := NewMetricsRouter(map[pipeline.ID]consumer.Metrics{fooID: foo, barID: bar})
rcs := r.PipelineIDs()
assert.Len(t, rcs, 2)
assert.ElementsMatch(t, []component.ID{fooID, barID}, rcs)
assert.ElementsMatch(t, []pipeline.ID{fooID, barID}, rcs)
assert.Empty(t, foo.AllMetrics())
assert.Empty(t, bar.AllMetrics())
@ -151,7 +151,7 @@ func TestMetricsRouterConsumers(t *testing.T) {
assert.Nil(t, none)
require.Error(t, err)
fake, err := r.Consumer(component.MustNewID("fake"))
fake, err := r.Consumer(pipeline.MustNewID("fake"))
assert.Nil(t, fake)
assert.Error(t, err)
}

View File

@ -4,17 +4,17 @@
package connector // import "go.opentelemetry.io/collector/connector"
import (
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/connector/internal"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/internal/fanoutconsumer"
"go.opentelemetry.io/collector/pipeline"
)
// TracesRouterAndConsumer feeds the first consumer.Traces in each of the specified pipelines.
type TracesRouterAndConsumer interface {
consumer.Traces
Consumer(...component.ID) (consumer.Traces, error)
PipelineIDs() []component.ID
Consumer(...pipeline.ID) (consumer.Traces, error)
PipelineIDs() []pipeline.ID
privateFunc()
}
@ -23,7 +23,7 @@ type tracesRouter struct {
internal.BaseRouter[consumer.Traces]
}
func NewTracesRouter(cm map[component.ID]consumer.Traces) TracesRouterAndConsumer {
func NewTracesRouter(cm map[pipeline.ID]consumer.Traces) TracesRouterAndConsumer {
consumers := make([]consumer.Traces, 0, len(cm))
for _, cons := range cm {
consumers = append(consumers, cons)

View File

@ -12,11 +12,11 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/consumer/consumertest"
"go.opentelemetry.io/collector/pdata/ptrace"
"go.opentelemetry.io/collector/pdata/testdata"
"go.opentelemetry.io/collector/pipeline"
)
type mutatingTracesSink struct {
@ -43,13 +43,13 @@ func TestTracesRouterMultiplexing(t *testing.T) {
func fuzzTraces(numIDs, numCons, numTraces int) func(*testing.T) {
return func(t *testing.T) {
allIDs := make([]component.ID, 0, numCons)
allIDs := make([]pipeline.ID, 0, numCons)
allCons := make([]consumer.Traces, 0, numCons)
allConsMap := make(map[component.ID]consumer.Traces)
allConsMap := make(map[pipeline.ID]consumer.Traces)
// If any consumer is mutating, the router must report mutating
for i := 0; i < numCons; i++ {
allIDs = append(allIDs, component.MustNewIDWithName("sink", strconv.Itoa(numCons)))
allIDs = append(allIDs, pipeline.MustNewIDWithName("sink", strconv.Itoa(numCons)))
// Random chance for each consumer to be mutating
if (numCons+numTraces+i)%4 == 0 {
allCons = append(allCons, &mutatingTracesSink{TracesSink: new(consumertest.TracesSink)})
@ -64,11 +64,11 @@ func fuzzTraces(numIDs, numCons, numTraces int) func(*testing.T) {
// Keep track of how many logs each consumer should receive.
// This will be validated after every call to RouteTraces.
expected := make(map[component.ID]int, numCons)
expected := make(map[pipeline.ID]int, numCons)
for i := 0; i < numTraces; i++ {
// Build a random set of ids (no duplicates)
randCons := make(map[component.ID]bool, numIDs)
randCons := make(map[pipeline.ID]bool, numIDs)
for j := 0; j < numIDs; j++ {
// This number should be pretty random and less than numCons
conNum := (numCons + numIDs + i + j) % numCons
@ -76,7 +76,7 @@ func fuzzTraces(numIDs, numCons, numTraces int) func(*testing.T) {
}
// Convert to slice, update expectations
conIDs := make([]component.ID, 0, len(randCons))
conIDs := make([]pipeline.ID, 0, len(randCons))
for id := range randCons {
conIDs = append(conIDs, id)
expected[id]++
@ -109,16 +109,16 @@ func TestTracesRouterConsumer(t *testing.T) {
ctx := context.Background()
td := testdata.GenerateTraces(1)
fooID := component.MustNewID("foo")
barID := component.MustNewID("bar")
fooID := pipeline.MustNewID("foo")
barID := pipeline.MustNewID("bar")
foo := new(consumertest.TracesSink)
bar := new(consumertest.TracesSink)
r := NewTracesRouter(map[component.ID]consumer.Traces{fooID: foo, barID: bar})
r := NewTracesRouter(map[pipeline.ID]consumer.Traces{fooID: foo, barID: bar})
rcs := r.PipelineIDs()
assert.Len(t, rcs, 2)
assert.ElementsMatch(t, []component.ID{fooID, barID}, rcs)
assert.ElementsMatch(t, []pipeline.ID{fooID, barID}, rcs)
assert.Empty(t, foo.AllTraces())
assert.Empty(t, bar.AllTraces())
@ -151,7 +151,7 @@ func TestTracesRouterConsumer(t *testing.T) {
assert.Nil(t, none)
require.Error(t, err)
fake, err := r.Consumer(component.MustNewID("fake"))
fake, err := r.Consumer(pipeline.MustNewID("fake"))
assert.Nil(t, fake)
assert.Error(t, err)
}

View File

@ -32,13 +32,16 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/component/componentprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/config/configretry v1.15.0 // indirect
go.opentelemetry.io/collector/consumer/consumerprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/consumer/consumertest v0.109.0 // indirect
go.opentelemetry.io/collector/exporter/exporterprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/extension v0.109.0 // indirect
go.opentelemetry.io/collector/extension/experimental/storage v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/collector/receiver v0.109.0 // indirect
go.opentelemetry.io/collector/receiver/receiverprofiles v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
@ -87,3 +90,9 @@ replace go.opentelemetry.io/collector/consumer/consumertest => ../../consumer/co
replace go.opentelemetry.io/collector/receiver/receiverprofiles => ../../receiver/receiverprofiles
replace go.opentelemetry.io/collector/exporter/exporterprofiles => ../exporterprofiles
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal
replace go.opentelemetry.io/collector/component/componentprofiles => ../../component/componentprofiles

View File

@ -21,6 +21,7 @@ import (
"go.opentelemetry.io/collector/exporter/exporterbatcher"
"go.opentelemetry.io/collector/exporter/exporterqueue" // BaseExporter contains common fields between different exporter types.
"go.opentelemetry.io/collector/exporter/internal"
"go.opentelemetry.io/collector/pipeline"
)
type ObsrepSenderFactory = func(obsrep *ObsReport) RequestSender
@ -35,7 +36,7 @@ type BaseExporter struct {
component.StartFunc
component.ShutdownFunc
Signal component.DataType
Signal pipeline.Signal
BatchMergeFunc exporterbatcher.BatchMergeFunc[internal.Request]
BatchMergeSplitfunc exporterbatcher.BatchMergeSplitFunc[internal.Request]
@ -66,8 +67,8 @@ type BaseExporter struct {
BatcherOpts []BatcherOption
}
func NewBaseExporter(set exporter.Settings, signal component.DataType, osf ObsrepSenderFactory, options ...Option) (*BaseExporter, error) {
obsReport, err := NewExporter(ObsReportSettings{ExporterID: set.ID, ExporterCreateSettings: set, DataType: signal})
func NewBaseExporter(set exporter.Settings, signal pipeline.Signal, osf ObsrepSenderFactory, options ...Option) (*BaseExporter, error) {
obsReport, err := NewExporter(ObsReportSettings{ExporterID: set.ID, ExporterCreateSettings: set, Signal: signal})
if err != nil {
return nil, err
}
@ -105,7 +106,7 @@ func NewBaseExporter(set exporter.Settings, signal component.DataType, osf Obsre
if be.QueueCfg.Enabled {
set := exporterqueue.Settings{
DataType: be.Signal,
Signal: be.Signal,
ExporterSettings: be.Set,
}
be.QueueSender = NewQueueSender(be.QueueFactory(context.Background(), set, be.QueueCfg), be.Set, be.QueueCfg.NumConsumers, be.ExportFailureMessage, be.Obsrep)
@ -234,7 +235,7 @@ func WithQueue(config QueueConfig) Option {
Unmarshaler: o.Unmarshaler,
})
q := qf(context.Background(), exporterqueue.Settings{
DataType: o.Signal,
Signal: o.Signal,
ExporterSettings: o.Set,
}, exporterqueue.Config{
Enabled: config.Enabled,

View File

@ -19,11 +19,12 @@ import (
"go.opentelemetry.io/collector/exporter/exporterqueue"
"go.opentelemetry.io/collector/exporter/exportertest"
"go.opentelemetry.io/collector/exporter/internal"
"go.opentelemetry.io/collector/pipeline"
)
var (
defaultType = component.MustNewType("test")
defaultDataType = component.DataTypeMetrics
defaultSignal = pipeline.SignalMetrics
defaultID = component.NewID(defaultType)
defaultSettings = func() exporter.Settings {
set := exportertest.NewNopSettings()
@ -37,7 +38,7 @@ func newNoopObsrepSender(*ObsReport) RequestSender {
}
func TestBaseExporter(t *testing.T) {
be, err := NewBaseExporter(defaultSettings, defaultDataType, newNoopObsrepSender)
be, err := NewBaseExporter(defaultSettings, defaultSignal, newNoopObsrepSender)
require.NoError(t, err)
require.NoError(t, be.Start(context.Background(), componenttest.NewNopHost()))
require.NoError(t, be.Shutdown(context.Background()))
@ -46,7 +47,7 @@ func TestBaseExporter(t *testing.T) {
func TestBaseExporterWithOptions(t *testing.T) {
want := errors.New("my error")
be, err := NewBaseExporter(
defaultSettings, defaultDataType, newNoopObsrepSender,
defaultSettings, defaultSignal, newNoopObsrepSender,
WithStart(func(context.Context, component.Host) error { return want }),
WithShutdown(func(context.Context) error { return want }),
WithTimeout(NewDefaultTimeoutConfig()),
@ -57,16 +58,16 @@ func TestBaseExporterWithOptions(t *testing.T) {
}
func TestQueueOptionsWithRequestExporter(t *testing.T) {
bs, err := NewBaseExporter(exportertest.NewNopSettings(), defaultDataType, newNoopObsrepSender,
bs, err := NewBaseExporter(exportertest.NewNopSettings(), defaultSignal, newNoopObsrepSender,
WithRetry(configretry.NewDefaultBackOffConfig()))
require.NoError(t, err)
require.Nil(t, bs.Marshaler)
require.Nil(t, bs.Unmarshaler)
_, err = NewBaseExporter(exportertest.NewNopSettings(), defaultDataType, newNoopObsrepSender,
_, err = NewBaseExporter(exportertest.NewNopSettings(), defaultSignal, newNoopObsrepSender,
WithRetry(configretry.NewDefaultBackOffConfig()), WithQueue(NewDefaultQueueConfig()))
require.Error(t, err)
_, err = NewBaseExporter(exportertest.NewNopSettings(), defaultDataType, newNoopObsrepSender,
_, err = NewBaseExporter(exportertest.NewNopSettings(), defaultSignal, newNoopObsrepSender,
WithMarshaler(mockRequestMarshaler), WithUnmarshaler(mockRequestUnmarshaler(&mockRequest{})),
WithRetry(configretry.NewDefaultBackOffConfig()),
WithRequestQueue(exporterqueue.NewDefaultConfig(), exporterqueue.NewMemoryQueueFactory[internal.Request]()))
@ -79,7 +80,7 @@ func TestBaseExporterLogging(t *testing.T) {
set.Logger = zap.New(logger)
rCfg := configretry.NewDefaultBackOffConfig()
rCfg.Enabled = false
bs, err := NewBaseExporter(set, defaultDataType, newNoopObsrepSender, WithRetry(rCfg))
bs, err := NewBaseExporter(set, defaultSignal, newNoopObsrepSender, WithRetry(rCfg))
require.NoError(t, err)
sendErr := bs.Send(context.Background(), newErrorRequest())
require.Error(t, sendErr)

View File

@ -211,7 +211,7 @@ func TestBatchSender_Disabled(t *testing.T) {
cfg := exporterbatcher.NewDefaultConfig()
cfg.Enabled = false
cfg.MaxSizeItems = 5
be, err := NewBaseExporter(defaultSettings, defaultDataType, newNoopObsrepSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newNoopObsrepSender,
WithBatcher(cfg, WithRequestBatchFuncs(fakeBatchMergeFunc, fakeBatchMergeSplitFunc)))
require.NotNil(t, be)
require.NoError(t, err)
@ -259,7 +259,7 @@ func TestBatchSender_InvalidMergeSplitFunc(t *testing.T) {
}
func TestBatchSender_PostShutdown(t *testing.T) {
be, err := NewBaseExporter(defaultSettings, defaultDataType, newNoopObsrepSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newNoopObsrepSender,
WithBatcher(exporterbatcher.NewDefaultConfig(), WithRequestBatchFuncs(fakeBatchMergeFunc,
fakeBatchMergeSplitFunc)))
require.NotNil(t, be)
@ -322,7 +322,7 @@ func TestBatchSender_ConcurrencyLimitReached(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
qCfg := exporterqueue.NewDefaultConfig()
qCfg.NumConsumers = 2
be, err := NewBaseExporter(defaultSettings, defaultDataType, newNoopObsrepSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newNoopObsrepSender,
WithBatcher(tt.batcherCfg, WithRequestBatchFuncs(fakeBatchMergeFunc, fakeBatchMergeSplitFunc)),
WithRequestQueue(qCfg, exporterqueue.NewMemoryQueueFactory[internal.Request]()))
require.NotNil(t, be)
@ -377,7 +377,7 @@ func TestBatchSender_ConcurrencyLimitReached(t *testing.T) {
func TestBatchSender_BatchBlocking(t *testing.T) {
bCfg := exporterbatcher.NewDefaultConfig()
bCfg.MinSizeItems = 3
be, err := NewBaseExporter(defaultSettings, defaultDataType, newNoopObsrepSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newNoopObsrepSender,
WithBatcher(bCfg, WithRequestBatchFuncs(fakeBatchMergeFunc, fakeBatchMergeSplitFunc)))
require.NotNil(t, be)
require.NoError(t, err)
@ -407,7 +407,7 @@ func TestBatchSender_BatchBlocking(t *testing.T) {
func TestBatchSender_BatchCancelled(t *testing.T) {
bCfg := exporterbatcher.NewDefaultConfig()
bCfg.MinSizeItems = 2
be, err := NewBaseExporter(defaultSettings, defaultDataType, newNoopObsrepSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newNoopObsrepSender,
WithBatcher(bCfg, WithRequestBatchFuncs(fakeBatchMergeFunc, fakeBatchMergeSplitFunc)))
require.NotNil(t, be)
require.NoError(t, err)
@ -442,7 +442,7 @@ func TestBatchSender_BatchCancelled(t *testing.T) {
func TestBatchSender_DrainActiveRequests(t *testing.T) {
bCfg := exporterbatcher.NewDefaultConfig()
bCfg.MinSizeItems = 2
be, err := NewBaseExporter(defaultSettings, defaultDataType, newNoopObsrepSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newNoopObsrepSender,
WithBatcher(bCfg, WithRequestBatchFuncs(fakeBatchMergeFunc, fakeBatchMergeSplitFunc)))
require.NotNil(t, be)
require.NoError(t, err)
@ -505,7 +505,7 @@ func TestBatchSender_WithBatcherOption(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
be, err := NewBaseExporter(defaultSettings, defaultDataType, newNoopObsrepSender, tt.opts...)
be, err := NewBaseExporter(defaultSettings, defaultSignal, newNoopObsrepSender, tt.opts...)
if tt.expectedErr {
assert.Nil(t, be)
assert.Error(t, err)
@ -518,7 +518,7 @@ func TestBatchSender_WithBatcherOption(t *testing.T) {
}
func TestBatchSender_UnstartedShutdown(t *testing.T) {
be, err := NewBaseExporter(defaultSettings, defaultDataType, newNoopObsrepSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newNoopObsrepSender,
WithBatcher(exporterbatcher.NewDefaultConfig(), WithRequestBatchFuncs(fakeBatchMergeFunc, fakeBatchMergeSplitFunc)))
require.NoError(t, err)
@ -542,7 +542,7 @@ func TestBatchSender_ShutdownDeadlock(t *testing.T) {
bCfg := exporterbatcher.NewDefaultConfig()
bCfg.FlushTimeout = 10 * time.Minute // high timeout to avoid the timeout to trigger
be, err := NewBaseExporter(defaultSettings, defaultDataType, newNoopObsrepSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newNoopObsrepSender,
WithBatcher(bCfg, WithRequestBatchFuncs(blockedBatchMergeFunc, fakeBatchMergeSplitFunc)))
require.NoError(t, err)
require.NoError(t, be.Start(context.Background(), componenttest.NewNopHost()))
@ -578,7 +578,7 @@ func TestBatchSenderWithTimeout(t *testing.T) {
bCfg.MinSizeItems = 10
tCfg := NewDefaultTimeoutConfig()
tCfg.Timeout = 50 * time.Millisecond
be, err := NewBaseExporter(defaultSettings, defaultDataType, newNoopObsrepSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newNoopObsrepSender,
WithBatcher(bCfg, WithRequestBatchFuncs(fakeBatchMergeFunc, fakeBatchMergeSplitFunc)),
WithTimeout(tCfg))
require.NoError(t, err)
@ -637,7 +637,7 @@ func TestBatchSenderTimerResetNoConflict(t *testing.T) {
bCfg := exporterbatcher.NewDefaultConfig()
bCfg.MinSizeItems = 8
bCfg.FlushTimeout = 50 * time.Millisecond
be, err := NewBaseExporter(defaultSettings, defaultDataType, newNoopObsrepSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newNoopObsrepSender,
WithBatcher(bCfg, WithRequestBatchFuncs(delayBatchMergeFunc, fakeBatchMergeSplitFunc)))
require.NoError(t, err)
require.NoError(t, be.Start(context.Background(), componenttest.NewNopHost()))
@ -668,7 +668,7 @@ func TestBatchSenderTimerFlush(t *testing.T) {
bCfg := exporterbatcher.NewDefaultConfig()
bCfg.MinSizeItems = 8
bCfg.FlushTimeout = 100 * time.Millisecond
be, err := NewBaseExporter(defaultSettings, defaultDataType, newNoopObsrepSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newNoopObsrepSender,
WithBatcher(bCfg, WithRequestBatchFuncs(fakeBatchMergeFunc, fakeBatchMergeSplitFunc)))
require.NoError(t, err)
require.NoError(t, be.Start(context.Background(), componenttest.NewNopHost()))
@ -705,7 +705,7 @@ func TestBatchSenderTimerFlush(t *testing.T) {
}
func queueBatchExporter(t *testing.T, batchOption Option) *BaseExporter {
be, err := NewBaseExporter(defaultSettings, defaultDataType, newNoopObsrepSender, batchOption,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newNoopObsrepSender, batchOption,
WithRequestQueue(exporterqueue.NewDefaultConfig(), exporterqueue.NewMemoryQueueFactory[internal.Request]()))
require.NotNil(t, be)
require.NoError(t, err)

View File

@ -14,13 +14,14 @@ import (
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/exporter"
"go.opentelemetry.io/collector/exporter/exporterhelper/internal/metadata"
"go.opentelemetry.io/collector/pipeline"
)
// ObsReport is a helper to add observability to an exporter.
type ObsReport struct {
spanNamePrefix string
tracer trace.Tracer
DataType component.DataType
Signal pipeline.Signal
otelAttrs []attribute.KeyValue
TelemetryBuilder *metadata.TelemetryBuilder
@ -30,7 +31,7 @@ type ObsReport struct {
type ObsReportSettings struct {
ExporterID component.ID
ExporterCreateSettings exporter.Settings
DataType component.DataType
Signal pipeline.Signal
}
func NewExporter(cfg ObsReportSettings) (*ObsReport, error) {
@ -42,7 +43,7 @@ func NewExporter(cfg ObsReportSettings) (*ObsReport, error) {
return &ObsReport{
spanNamePrefix: ExporterPrefix + cfg.ExporterID.String(),
tracer: cfg.ExporterCreateSettings.TracerProvider.Tracer(cfg.ExporterID.String()),
DataType: cfg.DataType,
Signal: cfg.Signal,
otelAttrs: []attribute.KeyValue{
attribute.String(ExporterKey, cfg.ExporterID.String()),
},
@ -60,7 +61,7 @@ func (or *ObsReport) StartTracesOp(ctx context.Context) context.Context {
// EndTracesOp completes the export operation that was started with startTracesOp.
func (or *ObsReport) EndTracesOp(ctx context.Context, numSpans int, err error) {
numSent, numFailedToSend := toNumItems(numSpans, err)
or.recordMetrics(context.WithoutCancel(ctx), component.DataTypeTraces, numSent, numFailedToSend)
or.recordMetrics(context.WithoutCancel(ctx), pipeline.SignalTraces, numSent, numFailedToSend)
endSpan(ctx, err, numSent, numFailedToSend, SentSpansKey, FailedToSendSpansKey)
}
@ -77,7 +78,7 @@ func (or *ObsReport) StartMetricsOp(ctx context.Context) context.Context {
// If needed, report your use case in https://github.com/open-telemetry/opentelemetry-collector/issues/10592.
func (or *ObsReport) EndMetricsOp(ctx context.Context, numMetricPoints int, err error) {
numSent, numFailedToSend := toNumItems(numMetricPoints, err)
or.recordMetrics(context.WithoutCancel(ctx), component.DataTypeMetrics, numSent, numFailedToSend)
or.recordMetrics(context.WithoutCancel(ctx), pipeline.SignalMetrics, numSent, numFailedToSend)
endSpan(ctx, err, numSent, numFailedToSend, SentMetricPointsKey, FailedToSendMetricPointsKey)
}
@ -91,7 +92,7 @@ func (or *ObsReport) StartLogsOp(ctx context.Context) context.Context {
// EndLogsOp completes the export operation that was started with startLogsOp.
func (or *ObsReport) EndLogsOp(ctx context.Context, numLogRecords int, err error) {
numSent, numFailedToSend := toNumItems(numLogRecords, err)
or.recordMetrics(context.WithoutCancel(ctx), component.DataTypeLogs, numSent, numFailedToSend)
or.recordMetrics(context.WithoutCancel(ctx), pipeline.SignalLogs, numSent, numFailedToSend)
endSpan(ctx, err, numSent, numFailedToSend, SentLogRecordsKey, FailedToSendLogRecordsKey)
}
@ -103,16 +104,16 @@ func (or *ObsReport) startOp(ctx context.Context, operationSuffix string) contex
return ctx
}
func (or *ObsReport) recordMetrics(ctx context.Context, dataType component.DataType, sent, failed int64) {
func (or *ObsReport) recordMetrics(ctx context.Context, signal pipeline.Signal, sent, failed int64) {
var sentMeasure, failedMeasure metric.Int64Counter
switch dataType {
case component.DataTypeTraces:
switch signal {
case pipeline.SignalTraces:
sentMeasure = or.TelemetryBuilder.ExporterSentSpans
failedMeasure = or.TelemetryBuilder.ExporterSendFailedSpans
case component.DataTypeMetrics:
case pipeline.SignalMetrics:
sentMeasure = or.TelemetryBuilder.ExporterSentMetricPoints
failedMeasure = or.TelemetryBuilder.ExporterSendFailedMetricPoints
case component.DataTypeLogs:
case pipeline.SignalLogs:
sentMeasure = or.TelemetryBuilder.ExporterSentLogRecords
failedMeasure = or.TelemetryBuilder.ExporterSendFailedLogRecords
}
@ -143,14 +144,14 @@ func toNumItems(numExportedItems int, err error) (int64, int64) {
return int64(numExportedItems), 0
}
func (or *ObsReport) RecordEnqueueFailure(ctx context.Context, dataType component.DataType, failed int64) {
func (or *ObsReport) RecordEnqueueFailure(ctx context.Context, signal pipeline.Signal, failed int64) {
var enqueueFailedMeasure metric.Int64Counter
switch dataType {
case component.DataTypeTraces:
switch signal {
case pipeline.SignalTraces:
enqueueFailedMeasure = or.TelemetryBuilder.ExporterEnqueueFailedSpans
case component.DataTypeMetrics:
case pipeline.SignalMetrics:
enqueueFailedMeasure = or.TelemetryBuilder.ExporterEnqueueFailedMetricPoints
case component.DataTypeLogs:
case pipeline.SignalLogs:
enqueueFailedMeasure = or.TelemetryBuilder.ExporterEnqueueFailedLogRecords
}

View File

@ -112,7 +112,7 @@ func (qs *QueueSender) Start(ctx context.Context, host component.Host) error {
return err
}
dataTypeAttr := attribute.String(DataTypeKey, qs.obsrep.DataType.String())
dataTypeAttr := attribute.String(DataTypeKey, qs.obsrep.Signal.String())
return multierr.Append(
qs.obsrep.TelemetryBuilder.InitExporterQueueSize(func() int64 { return int64(qs.queue.Size()) },
metric.WithAttributeSet(attribute.NewSet(qs.traceAttribute, dataTypeAttr))),

View File

@ -23,13 +23,14 @@ import (
"go.opentelemetry.io/collector/exporter/exportertest"
"go.opentelemetry.io/collector/exporter/internal"
"go.opentelemetry.io/collector/exporter/internal/queue"
"go.opentelemetry.io/collector/pipeline"
)
func TestQueuedRetry_StopWhileWaiting(t *testing.T) {
qCfg := NewDefaultQueueConfig()
qCfg.NumConsumers = 1
rCfg := configretry.NewDefaultBackOffConfig()
be, err := NewBaseExporter(defaultSettings, defaultDataType, newObservabilityConsumerSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newObservabilityConsumerSender,
WithMarshaler(mockRequestMarshaler), WithUnmarshaler(mockRequestUnmarshaler(&mockRequest{})),
WithRetry(rCfg), WithQueue(qCfg))
require.NoError(t, err)
@ -63,7 +64,7 @@ func TestQueuedRetry_DoNotPreserveCancellation(t *testing.T) {
qCfg := NewDefaultQueueConfig()
qCfg.NumConsumers = 1
rCfg := configretry.NewDefaultBackOffConfig()
be, err := NewBaseExporter(defaultSettings, defaultDataType, newObservabilityConsumerSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newObservabilityConsumerSender,
WithMarshaler(mockRequestMarshaler), WithUnmarshaler(mockRequestUnmarshaler(&mockRequest{})),
WithRetry(rCfg), WithQueue(qCfg))
require.NoError(t, err)
@ -95,7 +96,7 @@ func TestQueuedRetry_RejectOnFull(t *testing.T) {
set := exportertest.NewNopSettings()
logger, observed := observer.New(zap.ErrorLevel)
set.Logger = zap.New(logger)
be, err := NewBaseExporter(set, defaultDataType, newNoopObsrepSender,
be, err := NewBaseExporter(set, defaultSignal, newNoopObsrepSender,
WithMarshaler(mockRequestMarshaler), WithUnmarshaler(mockRequestUnmarshaler(&mockRequest{})),
WithQueue(qCfg))
require.NoError(t, err)
@ -168,7 +169,7 @@ func TestQueuedRetryHappyPath(t *testing.T) {
t.Cleanup(func() { require.NoError(t, tel.Shutdown(context.Background())) })
set := exporter.Settings{ID: defaultID, TelemetrySettings: tel.TelemetrySettings(), BuildInfo: component.NewDefaultBuildInfo()}
be, err := NewBaseExporter(set, defaultDataType, newObservabilityConsumerSender, tt.queueOptions...)
be, err := NewBaseExporter(set, defaultSignal, newObservabilityConsumerSender, tt.queueOptions...)
require.NoError(t, err)
ocs := be.ObsrepSender.(*observabilityConsumerSender)
@ -205,7 +206,7 @@ func TestQueuedRetryHappyPath(t *testing.T) {
}
func TestQueuedRetry_QueueMetricsReported(t *testing.T) {
dataTypes := []component.DataType{component.DataTypeLogs, component.DataTypeTraces, component.DataTypeMetrics}
dataTypes := []pipeline.Signal{pipeline.SignalLogs, pipeline.SignalTraces, pipeline.SignalMetrics}
for _, dataType := range dataTypes {
tt, err := componenttest.SetupTelemetry(defaultID)
require.NoError(t, err)
@ -299,7 +300,7 @@ func TestQueueRetryWithDisabledQueue(t *testing.T) {
set := exportertest.NewNopSettings()
logger, observed := observer.New(zap.ErrorLevel)
set.Logger = zap.New(logger)
be, err := NewBaseExporter(set, component.DataTypeLogs, newObservabilityConsumerSender, tt.queueOptions...)
be, err := NewBaseExporter(set, pipeline.SignalLogs, newObservabilityConsumerSender, tt.queueOptions...)
require.NoError(t, err)
require.NoError(t, be.Start(context.Background(), componenttest.NewNopHost()))
ocs := be.ObsrepSender.(*observabilityConsumerSender)
@ -323,7 +324,7 @@ func TestQueueFailedRequestDropped(t *testing.T) {
set := exportertest.NewNopSettings()
logger, observed := observer.New(zap.ErrorLevel)
set.Logger = zap.New(logger)
be, err := NewBaseExporter(set, component.DataTypeLogs, newNoopObsrepSender,
be, err := NewBaseExporter(set, pipeline.SignalLogs, newNoopObsrepSender,
WithRequestQueue(exporterqueue.NewDefaultConfig(), exporterqueue.NewMemoryQueueFactory[internal.Request]()))
require.NoError(t, err)
require.NoError(t, be.Start(context.Background(), componenttest.NewNopHost()))
@ -345,7 +346,7 @@ func TestQueuedRetryPersistenceEnabled(t *testing.T) {
qCfg.StorageID = &storageID // enable persistence
rCfg := configretry.NewDefaultBackOffConfig()
set := exporter.Settings{ID: defaultID, TelemetrySettings: tt.TelemetrySettings(), BuildInfo: component.NewDefaultBuildInfo()}
be, err := NewBaseExporter(set, defaultDataType, newObservabilityConsumerSender,
be, err := NewBaseExporter(set, defaultSignal, newObservabilityConsumerSender,
WithMarshaler(mockRequestMarshaler), WithUnmarshaler(mockRequestUnmarshaler(&mockRequest{})),
WithRetry(rCfg), WithQueue(qCfg))
require.NoError(t, err)
@ -371,7 +372,7 @@ func TestQueuedRetryPersistenceEnabledStorageError(t *testing.T) {
qCfg.StorageID = &storageID // enable persistence
rCfg := configretry.NewDefaultBackOffConfig()
set := exporter.Settings{ID: defaultID, TelemetrySettings: tt.TelemetrySettings(), BuildInfo: component.NewDefaultBuildInfo()}
be, err := NewBaseExporter(set, defaultDataType, newObservabilityConsumerSender, WithMarshaler(mockRequestMarshaler),
be, err := NewBaseExporter(set, defaultSignal, newObservabilityConsumerSender, WithMarshaler(mockRequestMarshaler),
WithUnmarshaler(mockRequestUnmarshaler(&mockRequest{})), WithRetry(rCfg), WithQueue(qCfg))
require.NoError(t, err)
@ -395,7 +396,7 @@ func TestQueuedRetryPersistentEnabled_NoDataLossOnShutdown(t *testing.T) {
rCfg.MaxElapsedTime = 0 // retry infinitely so shutdown can be triggered
mockReq := newErrorRequest()
be, err := NewBaseExporter(defaultSettings, defaultDataType, newNoopObsrepSender, WithMarshaler(mockRequestMarshaler),
be, err := NewBaseExporter(defaultSettings, defaultSignal, newNoopObsrepSender, WithMarshaler(mockRequestMarshaler),
WithUnmarshaler(mockRequestUnmarshaler(mockReq)), WithRetry(rCfg), WithQueue(qCfg))
require.NoError(t, err)
@ -419,7 +420,7 @@ func TestQueuedRetryPersistentEnabled_NoDataLossOnShutdown(t *testing.T) {
// start the exporter again replacing the preserved mockRequest in the unmarshaler with a new one that doesn't fail.
replacedReq := newMockRequest(1, nil)
be, err = NewBaseExporter(defaultSettings, defaultDataType, newNoopObsrepSender, WithMarshaler(mockRequestMarshaler),
be, err = NewBaseExporter(defaultSettings, defaultSignal, newNoopObsrepSender, WithMarshaler(mockRequestMarshaler),
WithUnmarshaler(mockRequestUnmarshaler(replacedReq)), WithRetry(rCfg), WithQueue(qCfg))
require.NoError(t, err)
require.NoError(t, be.Start(context.Background(), host))

View File

@ -16,7 +16,6 @@ import (
"go.uber.org/zap"
"go.uber.org/zap/zaptest/observer"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/component/componenttest"
"go.opentelemetry.io/collector/config/configretry"
"go.opentelemetry.io/collector/consumer/consumererror"
@ -24,6 +23,7 @@ import (
"go.opentelemetry.io/collector/exporter/exportertest"
"go.opentelemetry.io/collector/exporter/internal"
"go.opentelemetry.io/collector/pdata/testdata"
"go.opentelemetry.io/collector/pipeline"
)
func mockRequestUnmarshaler(mr internal.Request) exporterqueue.Unmarshaler[internal.Request] {
@ -40,7 +40,7 @@ func TestQueuedRetry_DropOnPermanentError(t *testing.T) {
qCfg := NewDefaultQueueConfig()
rCfg := configretry.NewDefaultBackOffConfig()
mockR := newMockRequest(2, consumererror.NewPermanent(errors.New("bad data")))
be, err := NewBaseExporter(defaultSettings, defaultDataType, newObservabilityConsumerSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newObservabilityConsumerSender,
WithMarshaler(mockRequestMarshaler), WithUnmarshaler(mockRequestUnmarshaler(mockR)), WithRetry(rCfg), WithQueue(qCfg))
require.NoError(t, err)
ocs := be.ObsrepSender.(*observabilityConsumerSender)
@ -64,7 +64,7 @@ func TestQueuedRetry_DropOnNoRetry(t *testing.T) {
qCfg := NewDefaultQueueConfig()
rCfg := configretry.NewDefaultBackOffConfig()
rCfg.Enabled = false
be, err := NewBaseExporter(defaultSettings, defaultDataType, newObservabilityConsumerSender, WithMarshaler(mockRequestMarshaler),
be, err := NewBaseExporter(defaultSettings, defaultSignal, newObservabilityConsumerSender, WithMarshaler(mockRequestMarshaler),
WithUnmarshaler(mockRequestUnmarshaler(newMockRequest(2, errors.New("transient error")))),
WithQueue(qCfg), WithRetry(rCfg))
require.NoError(t, err)
@ -91,7 +91,7 @@ func TestQueuedRetry_OnError(t *testing.T) {
qCfg.NumConsumers = 1
rCfg := configretry.NewDefaultBackOffConfig()
rCfg.InitialInterval = 0
be, err := NewBaseExporter(defaultSettings, defaultDataType, newObservabilityConsumerSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newObservabilityConsumerSender,
WithMarshaler(mockRequestMarshaler), WithUnmarshaler(mockRequestUnmarshaler(&mockRequest{})),
WithRetry(rCfg), WithQueue(qCfg))
require.NoError(t, err)
@ -121,7 +121,7 @@ func TestQueuedRetry_MaxElapsedTime(t *testing.T) {
rCfg := configretry.NewDefaultBackOffConfig()
rCfg.InitialInterval = time.Millisecond
rCfg.MaxElapsedTime = 100 * time.Millisecond
be, err := NewBaseExporter(defaultSettings, defaultDataType, newObservabilityConsumerSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newObservabilityConsumerSender,
WithMarshaler(mockRequestMarshaler), WithUnmarshaler(mockRequestUnmarshaler(&mockRequest{})),
WithRetry(rCfg), WithQueue(qCfg))
require.NoError(t, err)
@ -169,7 +169,7 @@ func TestQueuedRetry_ThrottleError(t *testing.T) {
qCfg.NumConsumers = 1
rCfg := configretry.NewDefaultBackOffConfig()
rCfg.InitialInterval = 10 * time.Millisecond
be, err := NewBaseExporter(defaultSettings, defaultDataType, newObservabilityConsumerSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newObservabilityConsumerSender,
WithMarshaler(mockRequestMarshaler), WithUnmarshaler(mockRequestUnmarshaler(&mockRequest{})),
WithRetry(rCfg), WithQueue(qCfg))
require.NoError(t, err)
@ -203,7 +203,7 @@ func TestQueuedRetry_RetryOnError(t *testing.T) {
qCfg.QueueSize = 1
rCfg := configretry.NewDefaultBackOffConfig()
rCfg.InitialInterval = 0
be, err := NewBaseExporter(defaultSettings, defaultDataType, newObservabilityConsumerSender,
be, err := NewBaseExporter(defaultSettings, defaultSignal, newObservabilityConsumerSender,
WithMarshaler(mockRequestMarshaler), WithUnmarshaler(mockRequestUnmarshaler(&mockRequest{})),
WithRetry(rCfg), WithQueue(qCfg))
require.NoError(t, err)
@ -230,7 +230,7 @@ func TestQueuedRetry_RetryOnError(t *testing.T) {
func TestQueueRetryWithNoQueue(t *testing.T) {
rCfg := configretry.NewDefaultBackOffConfig()
rCfg.MaxElapsedTime = time.Nanosecond // fail fast
be, err := NewBaseExporter(exportertest.NewNopSettings(), component.DataTypeLogs, newObservabilityConsumerSender, WithRetry(rCfg))
be, err := NewBaseExporter(exportertest.NewNopSettings(), pipeline.SignalLogs, newObservabilityConsumerSender, WithRetry(rCfg))
require.NoError(t, err)
require.NoError(t, be.Start(context.Background(), componenttest.NewNopHost()))
ocs := be.ObsrepSender.(*observabilityConsumerSender)
@ -251,7 +251,7 @@ func TestQueueRetryWithDisabledRetires(t *testing.T) {
set := exportertest.NewNopSettings()
logger, observed := observer.New(zap.ErrorLevel)
set.Logger = zap.New(logger)
be, err := NewBaseExporter(set, component.DataTypeLogs, newObservabilityConsumerSender, WithRetry(rCfg))
be, err := NewBaseExporter(set, pipeline.SignalLogs, newObservabilityConsumerSender, WithRetry(rCfg))
require.NoError(t, err)
require.NoError(t, be.Start(context.Background(), componenttest.NewNopHost()))
ocs := be.ObsrepSender.(*observabilityConsumerSender)

View File

@ -17,6 +17,7 @@ import (
"go.opentelemetry.io/collector/exporter/exporterqueue"
"go.opentelemetry.io/collector/exporter/internal/queue"
"go.opentelemetry.io/collector/pdata/plog"
"go.opentelemetry.io/collector/pipeline"
)
var logsMarshaler = &plog.ProtoMarshaler{}
@ -119,7 +120,7 @@ func NewLogsRequestExporter(
return nil, errNilLogsConverter
}
be, err := internal.NewBaseExporter(set, component.DataTypeLogs, newLogsExporterWithObservability, options...)
be, err := internal.NewBaseExporter(set, pipeline.SignalLogs, newLogsExporterWithObservability, options...)
if err != nil {
return nil, err
}
@ -134,7 +135,7 @@ func NewLogsRequestExporter(
}
sErr := be.Send(ctx, req)
if errors.Is(sErr, queue.ErrQueueIsFull) {
be.Obsrep.RecordEnqueueFailure(ctx, component.DataTypeLogs, int64(req.ItemsCount()))
be.Obsrep.RecordEnqueueFailure(ctx, pipeline.SignalLogs, int64(req.ItemsCount()))
}
return sErr
}, be.ConsumerOptions...)

View File

@ -17,6 +17,7 @@ import (
"go.opentelemetry.io/collector/exporter/exporterqueue"
"go.opentelemetry.io/collector/exporter/internal/queue"
"go.opentelemetry.io/collector/pdata/pmetric"
"go.opentelemetry.io/collector/pipeline"
)
var metricsMarshaler = &pmetric.ProtoMarshaler{}
@ -119,7 +120,7 @@ func NewMetricsRequestExporter(
return nil, errNilMetricsConverter
}
be, err := internal.NewBaseExporter(set, component.DataTypeMetrics, newMetricsSenderWithObservability, options...)
be, err := internal.NewBaseExporter(set, pipeline.SignalMetrics, newMetricsSenderWithObservability, options...)
if err != nil {
return nil, err
}
@ -134,7 +135,7 @@ func NewMetricsRequestExporter(
}
sErr := be.Send(ctx, req)
if errors.Is(sErr, queue.ErrQueueIsFull) {
be.Obsrep.RecordEnqueueFailure(ctx, component.DataTypeMetrics, int64(req.ItemsCount()))
be.Obsrep.RecordEnqueueFailure(ctx, pipeline.SignalMetrics, int64(req.ItemsCount()))
}
return sErr
}, be.ConsumerOptions...)

View File

@ -13,6 +13,7 @@ import (
"go.opentelemetry.io/collector/component/componenttest"
"go.opentelemetry.io/collector/exporter"
"go.opentelemetry.io/collector/exporter/exporterhelper/internal"
"go.opentelemetry.io/collector/pipeline"
)
var exporterID = component.MustNewID("fakeExporter")
@ -29,14 +30,14 @@ func TestExportEnqueueFailure(t *testing.T) {
require.NoError(t, err)
logRecords := int64(7)
obsrep.RecordEnqueueFailure(context.Background(), component.DataTypeLogs, logRecords)
obsrep.RecordEnqueueFailure(context.Background(), pipeline.SignalLogs, logRecords)
require.NoError(t, tt.CheckExporterEnqueueFailedLogs(logRecords))
spans := int64(12)
obsrep.RecordEnqueueFailure(context.Background(), component.DataTypeTraces, spans)
obsrep.RecordEnqueueFailure(context.Background(), pipeline.SignalTraces, spans)
require.NoError(t, tt.CheckExporterEnqueueFailedTraces(spans))
metricPoints := int64(21)
obsrep.RecordEnqueueFailure(context.Background(), component.DataTypeMetrics, metricPoints)
obsrep.RecordEnqueueFailure(context.Background(), pipeline.SignalMetrics, metricPoints)
require.NoError(t, tt.CheckExporterEnqueueFailedMetrics(metricPoints))
}

View File

@ -17,6 +17,7 @@ import (
"go.opentelemetry.io/collector/exporter/exporterqueue"
"go.opentelemetry.io/collector/exporter/internal/queue"
"go.opentelemetry.io/collector/pdata/ptrace"
"go.opentelemetry.io/collector/pipeline"
)
var tracesMarshaler = &ptrace.ProtoMarshaler{}
@ -119,7 +120,7 @@ func NewTracesRequestExporter(
return nil, errNilTracesConverter
}
be, err := internal.NewBaseExporter(set, component.DataTypeTraces, newTracesExporterWithObservability, options...)
be, err := internal.NewBaseExporter(set, pipeline.SignalTraces, newTracesExporterWithObservability, options...)
if err != nil {
return nil, err
}
@ -134,7 +135,7 @@ func NewTracesRequestExporter(
}
sErr := be.Send(ctx, req)
if errors.Is(sErr, queue.ErrQueueIsFull) {
be.Obsrep.RecordEnqueueFailure(ctx, component.DataTypeTraces, int64(req.ItemsCount()))
be.Obsrep.RecordEnqueueFailure(ctx, pipeline.SignalTraces, int64(req.ItemsCount()))
}
return sErr
}, be.ConsumerOptions...)

View File

@ -19,8 +19,10 @@ require (
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/consumer v0.109.0 // indirect
go.opentelemetry.io/collector/consumer/consumerprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
go.opentelemetry.io/otel/trace v1.30.0 // indirect
@ -62,3 +64,9 @@ replace go.opentelemetry.io/collector/consumer => ../../consumer
replace go.opentelemetry.io/collector/exporter => ../
replace go.opentelemetry.io/collector/receiver/receiverprofiles => ../../receiver/receiverprofiles
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal
replace go.opentelemetry.io/collector/component/componentprofiles => ../../component/componentprofiles

View File

@ -9,6 +9,8 @@ import (
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/exporter"
"go.opentelemetry.io/collector/exporter/internal/queue"
"go.opentelemetry.io/collector/internal/globalsignal"
"go.opentelemetry.io/collector/pipeline"
)
// ErrQueueIsFull is the error that Queue returns when full.
@ -24,7 +26,11 @@ type Queue[T any] queue.Queue[T]
// Settings defines settings for creating a queue.
type Settings struct {
DataType component.DataType
// Deprecated: [v0.110.0] Use Signal instead
DataType component.DataType // nolint
Signal pipeline.Signal
ExporterSettings exporter.Settings
}
@ -74,10 +80,14 @@ func NewPersistentQueueFactory[T itemsCounter](storageID *component.ID, factoryS
return NewMemoryQueueFactory[T]()
}
return func(_ context.Context, set Settings, cfg Config) Queue[T] {
signal := set.Signal
if set.DataType.String() != "" {
signal = globalsignal.MustNewSignal(set.DataType.String())
}
return queue.NewPersistentQueue[T](queue.PersistentQueueSettings[T]{
Sizer: sizerFromConfig[T](cfg),
Capacity: capacityFromConfig(cfg),
DataType: set.DataType,
Signal: signal,
StorageID: *storageID,
Marshaler: factorySettings.Marshaler,
Unmarshaler: factorySettings.Unmarshaler,

View File

@ -19,6 +19,7 @@ import (
"go.opentelemetry.io/collector/pdata/plog"
"go.opentelemetry.io/collector/pdata/pmetric"
"go.opentelemetry.io/collector/pdata/ptrace"
"go.opentelemetry.io/collector/pipeline"
"go.opentelemetry.io/collector/receiver"
"go.opentelemetry.io/collector/receiver/receivertest"
)
@ -33,7 +34,12 @@ type CheckConsumeContractParams struct {
T *testing.T
NumberOfTestElements int
// DataType to test for.
//
// Deprecated: [v0.110.0] Use Signal instead
// nolint
DataType component.DataType
Signal pipeline.Signal
// ExporterFactory to create an exporter to be tested.
ExporterFactory exporter.Factory
ExporterConfig component.Config
@ -84,18 +90,18 @@ func CheckConsumeContract(params CheckConsumeContractParams) {
func checkConsumeContractScenario(t *testing.T, params CheckConsumeContractParams, decisionFunc func() error, checkIfTestPassed func(*testing.T, int, requestCounter)) {
mockConsumerInstance := newMockConsumer(decisionFunc)
switch params.DataType {
case component.DataTypeLogs:
switch params.Signal {
case pipeline.SignalLogs:
r, err := params.ReceiverFactory.CreateLogsReceiver(context.Background(), receivertest.NewNopSettings(), params.ReceiverConfig, &mockConsumerInstance)
require.NoError(t, err)
require.NoError(t, r.Start(context.Background(), componenttest.NewNopHost()))
checkLogs(t, params, r, &mockConsumerInstance, checkIfTestPassed)
case component.DataTypeTraces:
case pipeline.SignalTraces:
r, err := params.ReceiverFactory.CreateTracesReceiver(context.Background(), receivertest.NewNopSettings(), params.ReceiverConfig, &mockConsumerInstance)
require.NoError(t, err)
require.NoError(t, r.Start(context.Background(), componenttest.NewNopHost()))
checkTraces(t, params, r, &mockConsumerInstance, checkIfTestPassed)
case component.DataTypeMetrics:
case pipeline.SignalMetrics:
r, err := params.ReceiverFactory.CreateMetricsReceiver(context.Background(), receivertest.NewNopSettings(), params.ReceiverConfig, &mockConsumerInstance)
require.NoError(t, err)
require.NoError(t, r.Start(context.Background(), componenttest.NewNopHost()))

View File

@ -13,6 +13,7 @@ import (
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/exporter"
"go.opentelemetry.io/collector/exporter/exporterhelper"
"go.opentelemetry.io/collector/pipeline"
"go.opentelemetry.io/collector/receiver"
)
@ -109,7 +110,7 @@ func TestCheckConsumeContractLogs(t *testing.T) {
params := CheckConsumeContractParams{
T: t,
ExporterFactory: newMockExporterFactory(mr),
DataType: component.DataTypeLogs,
Signal: pipeline.SignalLogs,
ExporterConfig: nopConfig{},
NumberOfTestElements: 10,
ReceiverFactory: newMockReceiverFactory(mr),
@ -123,7 +124,7 @@ func TestCheckConsumeContractMetrics(t *testing.T) {
CheckConsumeContract(CheckConsumeContractParams{
T: t,
ExporterFactory: newMockExporterFactory(mr),
DataType: component.DataTypeMetrics, // Change to the appropriate data type
Signal: pipeline.SignalMetrics, // Change to the appropriate data type
ExporterConfig: nopConfig{},
NumberOfTestElements: 10,
ReceiverFactory: newMockReceiverFactory(mr),
@ -135,7 +136,7 @@ func TestCheckConsumeContractTraces(t *testing.T) {
CheckConsumeContract(CheckConsumeContractParams{
T: t,
ExporterFactory: newMockExporterFactory(mr),
DataType: component.DataTypeTraces,
Signal: pipeline.SignalTraces,
ExporterConfig: nopConfig{},
NumberOfTestElements: 10,
ReceiverFactory: newMockReceiverFactory(mr),

View File

@ -15,9 +15,11 @@ require (
go.opentelemetry.io/collector/exporter/exporterprofiles v0.109.0
go.opentelemetry.io/collector/extension v0.109.0
go.opentelemetry.io/collector/extension/experimental/storage v0.109.0
go.opentelemetry.io/collector/internal/globalsignal v0.109.0
go.opentelemetry.io/collector/pdata v1.15.0
go.opentelemetry.io/collector/pdata/pprofile v0.109.0
go.opentelemetry.io/collector/pdata/testdata v0.109.0
go.opentelemetry.io/collector/pipeline v0.109.0
go.opentelemetry.io/collector/receiver v0.109.0
go.opentelemetry.io/otel v1.30.0
go.opentelemetry.io/otel/metric v1.30.0
@ -40,6 +42,7 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/component/componentprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/receiver/receiverprofiles v0.109.0 // indirect
golang.org/x/net v0.28.0 // indirect
golang.org/x/text v0.17.0 // indirect
@ -62,6 +65,8 @@ replace go.opentelemetry.io/collector/pdata/testdata => ../pdata/testdata
replace go.opentelemetry.io/collector/pdata/pprofile => ../pdata/pprofile
replace go.opentelemetry.io/collector/pipeline => ../pipeline
replace go.opentelemetry.io/collector/receiver => ../receiver
retract v0.76.0 // Depends on retracted pdata v1.0.0-rc10 module
@ -77,3 +82,7 @@ replace go.opentelemetry.io/collector/consumer/consumertest => ../consumer/consu
replace go.opentelemetry.io/collector/receiver/receiverprofiles => ../receiver/receiverprofiles
replace go.opentelemetry.io/collector/exporter/exporterprofiles => ./exporterprofiles
replace go.opentelemetry.io/collector/internal/globalsignal => ../internal/globalsignal
replace go.opentelemetry.io/collector/component/componentprofiles => ../component/componentprofiles

View File

@ -7,6 +7,7 @@ import (
"context"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/pipeline"
)
// Factory is a factory interface for exporters.
@ -17,7 +18,7 @@ type Factory interface {
// CreateTracesExporter creates a TracesExporter based on this config.
// If the exporter type does not support tracing,
// this function returns the error [component.ErrDataTypeIsNotSupported].
// this function returns the error [pipeline.ErrSignalNotSupported].
CreateTracesExporter(ctx context.Context, set Settings, cfg component.Config) (Traces, error)
// TracesExporterStability gets the stability level of the TracesExporter.
@ -25,7 +26,7 @@ type Factory interface {
// CreateMetricsExporter creates a MetricsExporter based on this config.
// If the exporter type does not support metrics,
// this function returns the error [component.ErrDataTypeIsNotSupported].
// this function returns the error [pipeline.ErrSignalNotSupported].
CreateMetricsExporter(ctx context.Context, set Settings, cfg component.Config) (Metrics, error)
// MetricsExporterStability gets the stability level of the MetricsExporter.
@ -33,7 +34,7 @@ type Factory interface {
// CreateLogsExporter creates a LogsExporter based on the config.
// If the exporter type does not support logs,
// this function returns the error [component.ErrDataTypeIsNotSupported].
// this function returns the error [pipeline.ErrSignalNotSupported].
CreateLogsExporter(ctx context.Context, set Settings, cfg component.Config) (Logs, error)
// LogsExporterStability gets the stability level of the LogsExporter.
@ -41,7 +42,7 @@ type Factory interface {
// CreateProfilesExporter creates a ProfilesExporter based on this config.
// If the exporter type does not support tracing,
// this function returns the error [component.ErrDataTypeIsNotSupported].
// this function returns the error [pipeline.ErrSignalNotSupported].
CreateProfilesExporter(ctx context.Context, set Settings, cfg component.Config) (Profiles, error)
// ProfilesExporterStability gets the stability level of the ProfilesExporter.
@ -71,7 +72,7 @@ type CreateTracesFunc func(context.Context, Settings, component.Config) (Traces,
// CreateTracesExporter implements ExporterFactory.CreateTracesExporter().
func (f CreateTracesFunc) CreateTracesExporter(ctx context.Context, set Settings, cfg component.Config) (Traces, error) {
if f == nil {
return nil, component.ErrDataTypeIsNotSupported
return nil, pipeline.ErrSignalNotSupported
}
return f(ctx, set, cfg)
}
@ -82,7 +83,7 @@ type CreateMetricsFunc func(context.Context, Settings, component.Config) (Metric
// CreateMetricsExporter implements ExporterFactory.CreateMetricsExporter().
func (f CreateMetricsFunc) CreateMetricsExporter(ctx context.Context, set Settings, cfg component.Config) (Metrics, error) {
if f == nil {
return nil, component.ErrDataTypeIsNotSupported
return nil, pipeline.ErrSignalNotSupported
}
return f(ctx, set, cfg)
}
@ -93,7 +94,7 @@ type CreateLogsFunc func(context.Context, Settings, component.Config) (Logs, err
// CreateLogsExporter implements Factory.CreateLogsExporter().
func (f CreateLogsFunc) CreateLogsExporter(ctx context.Context, set Settings, cfg component.Config) (Logs, error) {
if f == nil {
return nil, component.ErrDataTypeIsNotSupported
return nil, pipeline.ErrSignalNotSupported
}
return f(ctx, set, cfg)
}
@ -104,7 +105,7 @@ type CreateProfilesFunc func(context.Context, Settings, component.Config) (Profi
// CreateProfilesExporter implements ExporterFactory.CreateProfilesExporter().
func (f CreateProfilesFunc) CreateProfilesExporter(ctx context.Context, set Settings, cfg component.Config) (Profiles, error) {
if f == nil {
return nil, component.ErrDataTypeIsNotSupported
return nil, pipeline.ErrSignalNotSupported
}
return f(ctx, set, cfg)
}

View File

@ -18,6 +18,7 @@ import (
"go.opentelemetry.io/collector/exporter"
"go.opentelemetry.io/collector/exporter/internal/experr"
"go.opentelemetry.io/collector/extension/experimental/storage"
"go.opentelemetry.io/collector/pipeline"
)
// persistentQueue provides a persistent queue implementation backed by file storage extension
@ -85,7 +86,7 @@ var (
type PersistentQueueSettings[T any] struct {
Sizer Sizer[T]
Capacity int64
DataType component.DataType
Signal pipeline.Signal
StorageID component.ID
Marshaler func(req T) ([]byte, error)
Unmarshaler func([]byte) (T, error)
@ -104,7 +105,7 @@ func NewPersistentQueue[T any](set PersistentQueueSettings[T]) Queue[T] {
// Start starts the persistentQueue with the given number of consumers.
func (pq *persistentQueue[T]) Start(ctx context.Context, host component.Host) error {
storageClient, err := toStorageClient(ctx, pq.set.StorageID, host, pq.set.ExporterSettings.ID, pq.set.DataType)
storageClient, err := toStorageClient(ctx, pq.set.StorageID, host, pq.set.ExporterSettings.ID, pq.set.Signal)
if err != nil {
return err
}
@ -485,7 +486,7 @@ func (pq *persistentQueue[T]) itemDispatchingFinish(ctx context.Context, index u
return nil
}
func toStorageClient(ctx context.Context, storageID component.ID, host component.Host, ownerID component.ID, signal component.DataType) (storage.Client, error) {
func toStorageClient(ctx context.Context, storageID component.ID, host component.Host, ownerID component.ID, signal pipeline.Signal) (storage.Client, error) {
ext, found := host.GetExtensions()[storageID]
if !found {
return nil, errNoStorageClient

View File

@ -24,6 +24,7 @@ import (
"go.opentelemetry.io/collector/extension/extensiontest"
"go.opentelemetry.io/collector/pdata/pcommon"
"go.opentelemetry.io/collector/pdata/ptrace"
"go.opentelemetry.io/collector/pipeline"
)
type tracesRequest struct {
@ -60,7 +61,7 @@ func createAndStartTestPersistentQueue(t *testing.T, sizer Sizer[tracesRequest],
pq := NewPersistentQueue[tracesRequest](PersistentQueueSettings[tracesRequest]{
Sizer: sizer,
Capacity: capacity,
DataType: component.DataTypeTraces,
Signal: pipeline.SignalTraces,
StorageID: component.ID{},
Marshaler: marshalTracesRequest,
Unmarshaler: unmarshalTracesRequest,
@ -81,7 +82,7 @@ func createTestPersistentQueueWithClient(client storage.Client) *persistentQueue
pq := NewPersistentQueue[tracesRequest](PersistentQueueSettings[tracesRequest]{
Sizer: &RequestSizer[tracesRequest]{},
Capacity: 1000,
DataType: component.DataTypeTraces,
Signal: pipeline.SignalTraces,
StorageID: component.ID{},
Marshaler: marshalTracesRequest,
Unmarshaler: unmarshalTracesRequest,
@ -104,7 +105,7 @@ func createTestPersistentQueueWithCapacityLimiter(t testing.TB, ext storage.Exte
pq := NewPersistentQueue[tracesRequest](PersistentQueueSettings[tracesRequest]{
Sizer: sizer,
Capacity: capacity,
DataType: component.DataTypeTraces,
Signal: pipeline.SignalTraces,
StorageID: component.ID{},
Marshaler: marshalTracesRequest,
Unmarshaler: unmarshalTracesRequest,
@ -305,7 +306,7 @@ func TestToStorageClient(t *testing.T) {
ownerID := component.MustNewID("foo_exporter")
// execute
client, err := toStorageClient(context.Background(), storageID, host, ownerID, component.DataTypeTraces)
client, err := toStorageClient(context.Background(), storageID, host, ownerID, pipeline.SignalTraces)
// verify
if tt.expectedError != nil {
@ -335,7 +336,7 @@ func TestInvalidStorageExtensionType(t *testing.T) {
ownerID := component.MustNewID("foo_exporter")
// execute
client, err := toStorageClient(context.Background(), storageID, host, ownerID, component.DataTypeTraces)
client, err := toStorageClient(context.Background(), storageID, host, ownerID, pipeline.SignalTraces)
// we should get an error about the extension type
require.ErrorIs(t, err, errWrongExtensionType)

View File

@ -31,6 +31,7 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/component/componentprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/config/configretry v1.15.0 // indirect
go.opentelemetry.io/collector/consumer v0.109.0 // indirect
go.opentelemetry.io/collector/consumer/consumerprofiles v0.109.0 // indirect
@ -38,7 +39,9 @@ require (
go.opentelemetry.io/collector/exporter/exporterprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/extension v0.109.0 // indirect
go.opentelemetry.io/collector/extension/experimental/storage v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/collector/receiver v0.109.0 // indirect
go.opentelemetry.io/collector/receiver/receiverprofiles v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
@ -92,3 +95,9 @@ replace go.opentelemetry.io/collector/consumer/consumertest => ../../consumer/co
replace go.opentelemetry.io/collector/receiver/receiverprofiles => ../../receiver/receiverprofiles
replace go.opentelemetry.io/collector/exporter/exporterprofiles => ../exporterprofiles
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal
replace go.opentelemetry.io/collector/component/componentprofiles => ../../component/componentprofiles

View File

@ -28,11 +28,14 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/component/componentprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/consumer v0.109.0 // indirect
go.opentelemetry.io/collector/consumer/consumerprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/exporter/exporterprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/collector/receiver v0.109.0 // indirect
go.opentelemetry.io/collector/receiver/receiverprofiles v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
@ -82,3 +85,9 @@ replace go.opentelemetry.io/collector/consumer/consumertest => ../../consumer/co
replace go.opentelemetry.io/collector/receiver/receiverprofiles => ../../receiver/receiverprofiles
replace go.opentelemetry.io/collector/exporter/exporterprofiles => ../exporterprofiles
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal
replace go.opentelemetry.io/collector/component/componentprofiles => ../../component/componentprofiles

View File

@ -47,6 +47,7 @@ require (
github.com/mostynb/go-grpc-compression v1.2.3 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/client v1.15.0 // indirect
go.opentelemetry.io/collector/component/componentprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/config/confignet v0.109.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/config/internal v0.109.1-0.20240916143658-74729e731d3b // indirect
@ -58,7 +59,9 @@ require (
go.opentelemetry.io/collector/extension/experimental/storage v0.109.0 // indirect
go.opentelemetry.io/collector/featuregate v1.15.0 // indirect
go.opentelemetry.io/collector/internal/globalgates v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/collector/receiver v0.109.0 // indirect
go.opentelemetry.io/collector/receiver/receiverprofiles v0.109.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 // indirect
@ -136,3 +139,9 @@ replace go.opentelemetry.io/collector/receiver/receiverprofiles => ../../receive
replace go.opentelemetry.io/collector/exporter/exporterprofiles => ../exporterprofiles
replace go.opentelemetry.io/collector/internal/globalgates => ../../internal/globalgates
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal
replace go.opentelemetry.io/collector/component/componentprofiles => ../../component/componentprofiles

View File

@ -46,6 +46,7 @@ require (
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rs/cors v1.11.1 // indirect
go.opentelemetry.io/collector/client v1.15.0 // indirect
go.opentelemetry.io/collector/component/componentprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/config/configauth v0.109.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/config/internal v0.109.1-0.20240916143658-74729e731d3b // indirect
@ -57,7 +58,9 @@ require (
go.opentelemetry.io/collector/extension/experimental/storage v0.109.0 // indirect
go.opentelemetry.io/collector/featuregate v1.15.0 // indirect
go.opentelemetry.io/collector/internal/globalgates v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/collector/receiver v0.109.0 // indirect
go.opentelemetry.io/collector/receiver/receiverprofiles v0.109.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect
@ -133,3 +136,9 @@ replace go.opentelemetry.io/collector/receiver/receiverprofiles => ../../receive
replace go.opentelemetry.io/collector/exporter/exporterprofiles => ../exporterprofiles
replace go.opentelemetry.io/collector/internal/globalgates => ../../internal/globalgates
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal
replace go.opentelemetry.io/collector/component/componentprofiles => ../../component/componentprofiles

View File

@ -18,7 +18,9 @@ require (
github.com/google/uuid v1.6.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
go.opentelemetry.io/otel/sdk v1.30.0 // indirect
@ -41,3 +43,7 @@ replace go.opentelemetry.io/collector/extension => ../
replace go.opentelemetry.io/collector/pdata => ../../pdata
replace go.opentelemetry.io/collector/config/configtelemetry => ../../config/configtelemetry
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal

View File

@ -10,7 +10,9 @@ require (
require (
github.com/gogo/protobuf v1.3.2 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
go.opentelemetry.io/otel/trace v1.30.0 // indirect
@ -31,3 +33,7 @@ replace go.opentelemetry.io/collector/component => ../../../component
replace go.opentelemetry.io/collector/pdata => ../../../pdata
replace go.opentelemetry.io/collector/config/configtelemetry => ../../../config/configtelemetry
replace go.opentelemetry.io/collector/internal/globalsignal => ../../../internal/globalsignal
replace go.opentelemetry.io/collector/pipeline => ../../../pipeline

View File

@ -17,7 +17,9 @@ require (
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
go.opentelemetry.io/otel/trace v1.30.0 // indirect
@ -41,3 +43,7 @@ replace go.opentelemetry.io/collector/confmap => ../../confmap
replace go.opentelemetry.io/collector/config/configtelemetry => ../../config/configtelemetry
replace go.opentelemetry.io/collector/component => ../../component
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal

View File

@ -16,7 +16,9 @@ require (
github.com/gogo/protobuf v1.3.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
go.opentelemetry.io/otel/sdk v1.30.0 // indirect
@ -38,3 +40,7 @@ replace go.opentelemetry.io/collector/component => ../component
replace go.opentelemetry.io/collector/pdata => ../pdata
replace go.opentelemetry.io/collector/config/configtelemetry => ../config/configtelemetry
replace go.opentelemetry.io/collector/pipeline => ../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../internal/globalsignal

View File

@ -33,7 +33,9 @@ require (
github.com/tklauser/numcpus v0.6.1 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
go.opentelemetry.io/otel/sdk v1.30.0 // indirect
@ -72,3 +74,7 @@ replace go.opentelemetry.io/collector/consumer/consumerprofiles => ../../consume
replace go.opentelemetry.io/collector/consumer/consumertest => ../../consumer/consumertest
replace go.opentelemetry.io/collector/component/componentstatus => ../../component/componentstatus
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal

View File

@ -46,7 +46,9 @@ require (
go.opentelemetry.io/collector/extension/auth v0.109.0 // indirect
go.opentelemetry.io/collector/featuregate v1.15.0 // indirect
go.opentelemetry.io/collector/internal/globalgates v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
@ -109,3 +111,7 @@ replace go.opentelemetry.io/collector/client => ../../client
replace go.opentelemetry.io/collector/component/componentstatus => ../../component/componentstatus
replace go.opentelemetry.io/collector/internal/globalgates => ../../internal/globalgates
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal

6
go.mod
View File

@ -52,6 +52,8 @@ require (
github.com/tklauser/numcpus v0.6.1 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
go.opentelemetry.io/otel/sdk v1.30.0 // indirect
@ -92,3 +94,7 @@ retract (
replace go.opentelemetry.io/collector/pdata/pprofile => ./pdata/pprofile
replace go.opentelemetry.io/collector/consumer/consumerprofiles => ./consumer/consumerprofiles
replace go.opentelemetry.io/collector/pipeline => ./pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ./internal/globalsignal

View File

@ -15,6 +15,7 @@ import (
"go.opentelemetry.io/collector/exporter/exportertest"
"go.opentelemetry.io/collector/exporter/otlpexporter"
"go.opentelemetry.io/collector/internal/testutil"
"go.opentelemetry.io/collector/pipeline"
"go.opentelemetry.io/collector/receiver/otlpreceiver"
)
@ -48,7 +49,7 @@ func TestConsumeContractOtlpLogs(t *testing.T) {
T: t,
NumberOfTestElements: 10,
ExporterFactory: otlpexporter.NewFactory(),
DataType: component.DataTypeLogs,
Signal: pipeline.SignalLogs,
ExporterConfig: testExporterConfig(addr),
ReceiverFactory: otlpreceiver.NewFactory(),
ReceiverConfig: testReceiverConfig(addr),
@ -60,7 +61,7 @@ func TestConsumeContractOtlpTraces(t *testing.T) {
exportertest.CheckConsumeContract(exportertest.CheckConsumeContractParams{
T: t,
NumberOfTestElements: 10,
DataType: component.DataTypeTraces,
Signal: pipeline.SignalTraces,
ExporterFactory: otlpexporter.NewFactory(),
ExporterConfig: testExporterConfig(addr),
ReceiverFactory: otlpreceiver.NewFactory(),
@ -74,7 +75,7 @@ func TestConsumeContractOtlpMetrics(t *testing.T) {
T: t,
NumberOfTestElements: 10,
ExporterFactory: otlpexporter.NewFactory(),
DataType: component.DataTypeMetrics,
Signal: pipeline.SignalMetrics,
ExporterConfig: testExporterConfig(addr),
ReceiverFactory: otlpreceiver.NewFactory(),
ReceiverConfig: testReceiverConfig(addr),

View File

@ -23,6 +23,7 @@ require (
go.opentelemetry.io/collector/extension v0.109.0
go.opentelemetry.io/collector/pdata v1.15.0
go.opentelemetry.io/collector/pdata/testdata v0.109.0
go.opentelemetry.io/collector/pipeline v0.109.0
go.opentelemetry.io/collector/receiver v0.109.0
go.opentelemetry.io/collector/receiver/otlpreceiver v0.109.0
go.opentelemetry.io/collector/service v0.109.0
@ -84,6 +85,7 @@ require (
go.opentelemetry.io/collector/extension/extensioncapabilities v0.109.0 // indirect
go.opentelemetry.io/collector/featuregate v1.15.0 // indirect
go.opentelemetry.io/collector/internal/globalgates v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/collector/processor v0.109.0 // indirect
go.opentelemetry.io/collector/processor/processorprofiles v0.109.0 // indirect
@ -206,3 +208,7 @@ replace go.opentelemetry.io/collector/processor/processorprofiles => ../../proce
replace go.opentelemetry.io/collector/connector/connectorprofiles => ../../connector/connectorprofiles
replace go.opentelemetry.io/collector/exporter/exporterprofiles => ../../exporter/exporterprofiles
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../globalsignal

View File

@ -26,6 +26,7 @@ import (
"go.opentelemetry.io/collector/exporter/exportertest"
"go.opentelemetry.io/collector/extension"
"go.opentelemetry.io/collector/internal/sharedcomponent"
"go.opentelemetry.io/collector/pipeline"
"go.opentelemetry.io/collector/receiver"
"go.opentelemetry.io/collector/service"
"go.opentelemetry.io/collector/service/extensions"
@ -100,12 +101,12 @@ func Test_ComponentStatusReporting_SharedInstance(t *testing.T) {
Level: configtelemetry.LevelNone,
},
},
Pipelines: pipelines.Config{
component.MustNewID("traces"): {
PipelinesWithPipelineID: pipelines.ConfigWithPipelineID{
pipeline.MustNewID("traces"): {
Receivers: []component.ID{component.NewID(component.MustNewType("test"))},
Exporters: []component.ID{component.NewID(nopType)},
},
component.MustNewID("metrics"): {
pipeline.MustNewID("metrics"): {
Receivers: []component.ID{component.NewID(component.MustNewType("test"))},
Exporters: []component.ID{component.NewID(nopType)},
},
@ -127,7 +128,7 @@ func Test_ComponentStatusReporting_SharedInstance(t *testing.T) {
for instanceID, events := range eventsReceived {
pipelineIDs := ""
instanceID.AllPipelineIDs(func(id component.ID) bool {
instanceID.AllPipelineIDsWithPipelineIDs(func(id pipeline.ID) bool {
pipelineIDs += id.String() + ","
return true
})

View File

@ -9,10 +9,11 @@ import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestTotalMemory(t *testing.T) {
totalMemory, err := TotalMemory()
assert.NoError(t, err)
require.NoError(t, err)
assert.Positive(t, totalMemory)
}

View File

@ -119,6 +119,7 @@ func (cfg *Config) Validate() error {
}
// Check that all pipelines reference only configured components.
// nolint
for pipelineID, pipeline := range cfg.Service.Pipelines {
// Validate pipeline receiver name references.
for _, ref := range pipeline.Receivers {
@ -153,5 +154,41 @@ func (cfg *Config) Validate() error {
return fmt.Errorf("service::pipelines::%s: references exporter %q which is not configured", pipelineID, ref)
}
}
// Check that all pipelines reference only configured components.
for pipelineID, pipeline := range cfg.Service.PipelinesWithPipelineID {
// Validate pipeline receiver name references.
for _, ref := range pipeline.Receivers {
// Check that the name referenced in the pipeline's receivers exists in the top-level receivers.
if _, ok := cfg.Receivers[ref]; ok {
continue
}
if _, ok := cfg.Connectors[ref]; ok {
continue
}
return fmt.Errorf("service::pipelines::%s: references receiver %q which is not configured", pipelineID.String(), ref)
}
// Validate pipeline processor name references.
for _, ref := range pipeline.Processors {
// Check that the name referenced in the pipeline's processors exists in the top-level processors.
if cfg.Processors[ref] == nil {
return fmt.Errorf("service::pipelines::%s: references processor %q which is not configured", pipelineID.String(), ref)
}
}
// Validate pipeline exporter name references.
for _, ref := range pipeline.Exporters {
// Check that the name referenced in the pipeline's Exporters exists in the top-level Exporters.
if _, ok := cfg.Exporters[ref]; ok {
continue
}
if _, ok := cfg.Connectors[ref]; ok {
continue
}
return fmt.Errorf("service::pipelines::%s: references exporter %q which is not configured", pipelineID.String(), ref)
}
}
return nil
}

View File

@ -13,6 +13,7 @@ import (
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/configtelemetry"
"go.opentelemetry.io/collector/pipeline"
"go.opentelemetry.io/collector/service"
"go.opentelemetry.io/collector/service/pipelines"
"go.opentelemetry.io/collector/service/telemetry"
@ -98,7 +99,7 @@ func TestConfigValidate(t *testing.T) {
name: "invalid-receiver-reference",
cfgFn: func() *Config {
cfg := generateConfig()
pipe := cfg.Service.Pipelines[component.MustNewID("traces")]
pipe := cfg.Service.PipelinesWithPipelineID[pipeline.MustNewID("traces")]
pipe.Receivers = append(pipe.Receivers, component.MustNewIDWithName("nop", "2"))
return cfg
},
@ -108,7 +109,7 @@ func TestConfigValidate(t *testing.T) {
name: "invalid-processor-reference",
cfgFn: func() *Config {
cfg := generateConfig()
pipe := cfg.Service.Pipelines[component.MustNewID("traces")]
pipe := cfg.Service.PipelinesWithPipelineID[pipeline.MustNewID("traces")]
pipe.Processors = append(pipe.Processors, component.MustNewIDWithName("nop", "2"))
return cfg
},
@ -118,7 +119,7 @@ func TestConfigValidate(t *testing.T) {
name: "invalid-exporter-reference",
cfgFn: func() *Config {
cfg := generateConfig()
pipe := cfg.Service.Pipelines[component.MustNewID("traces")]
pipe := cfg.Service.PipelinesWithPipelineID[pipeline.MustNewID("traces")]
pipe.Exporters = append(pipe.Exporters, component.MustNewIDWithName("nop", "2"))
return cfg
},
@ -185,7 +186,7 @@ func TestConfigValidate(t *testing.T) {
cfg := generateConfig()
cfg.Receivers[component.MustNewID("nop2")] = &errConfig{}
cfg.Connectors[component.MustNewID("nop2")] = &errConfig{}
pipe := cfg.Service.Pipelines[component.MustNewID("traces")]
pipe := cfg.Service.PipelinesWithPipelineID[pipeline.MustNewID("traces")]
pipe.Receivers = append(pipe.Receivers, component.MustNewIDWithName("nop", "2"))
pipe.Exporters = append(pipe.Exporters, component.MustNewIDWithName("nop", "2"))
return cfg
@ -198,7 +199,7 @@ func TestConfigValidate(t *testing.T) {
cfg := generateConfig()
cfg.Exporters[component.MustNewID("nop2")] = &errConfig{}
cfg.Connectors[component.MustNewID("nop2")] = &errConfig{}
pipe := cfg.Service.Pipelines[component.MustNewID("traces")]
pipe := cfg.Service.PipelinesWithPipelineID[pipeline.MustNewID("traces")]
pipe.Receivers = append(pipe.Receivers, component.MustNewIDWithName("nop", "2"))
pipe.Exporters = append(pipe.Exporters, component.MustNewIDWithName("nop", "2"))
return cfg
@ -209,7 +210,7 @@ func TestConfigValidate(t *testing.T) {
name: "invalid-connector-reference-as-receiver",
cfgFn: func() *Config {
cfg := generateConfig()
pipe := cfg.Service.Pipelines[component.MustNewID("traces")]
pipe := cfg.Service.PipelinesWithPipelineID[pipeline.MustNewID("traces")]
pipe.Receivers = append(pipe.Receivers, component.MustNewIDWithName("nop", "conn2"))
return cfg
},
@ -219,7 +220,7 @@ func TestConfigValidate(t *testing.T) {
name: "invalid-connector-reference-as-receiver",
cfgFn: func() *Config {
cfg := generateConfig()
pipe := cfg.Service.Pipelines[component.MustNewID("traces")]
pipe := cfg.Service.PipelinesWithPipelineID[pipeline.MustNewID("traces")]
pipe.Exporters = append(pipe.Exporters, component.MustNewIDWithName("nop", "conn2"))
return cfg
},
@ -229,7 +230,7 @@ func TestConfigValidate(t *testing.T) {
name: "invalid-service-config",
cfgFn: func() *Config {
cfg := generateConfig()
cfg.Service.Pipelines = nil
cfg.Service.PipelinesWithPipelineID = nil
return cfg
},
expected: fmt.Errorf(`service::pipelines config validation failed: %w`, errors.New(`service must have at least one pipeline`)),
@ -279,8 +280,8 @@ func generateConfig() *Config {
},
},
Extensions: []component.ID{component.MustNewID("nop")},
Pipelines: pipelines.Config{
component.MustNewID("traces"): {
PipelinesWithPipelineID: pipelines.ConfigWithPipelineID{
pipeline.MustNewID("traces"): {
Receivers: []component.ID{component.MustNewID("nop")},
Processors: []component.ID{component.MustNewID("nop")},
Exporters: []component.ID{component.MustNewID("nop")},

View File

@ -11,6 +11,7 @@ import (
"go.opentelemetry.io/collector/exporter/exportertest"
"go.opentelemetry.io/collector/extension"
"go.opentelemetry.io/collector/extension/extensiontest"
"go.opentelemetry.io/collector/pipeline"
"go.opentelemetry.io/collector/processor"
"go.opentelemetry.io/collector/processor/processortest"
"go.opentelemetry.io/collector/receiver"
@ -37,7 +38,7 @@ func nopFactories() (Factories, error) {
factories.ExtensionModules[ext.Type()] = "go.opentelemetry.io/collector/extension/extensiontest v1.2.3"
}
if factories.Receivers, err = receiver.MakeFactoryMap(receivertest.NewNopFactory(), receivertest.NewNopFactoryForType(component.DataTypeLogs)); err != nil {
if factories.Receivers, err = receiver.MakeFactoryMap(receivertest.NewNopFactory(), receivertest.NewNopFactoryForTypeWithSignal(pipeline.SignalLogs)); err != nil {
return Factories{}, err
}
factories.ReceiverModules = make(map[component.Type]string, len(factories.Receivers))

View File

@ -13,6 +13,7 @@ require (
go.opentelemetry.io/collector/exporter v0.109.0
go.opentelemetry.io/collector/extension v0.109.0
go.opentelemetry.io/collector/featuregate v1.15.0
go.opentelemetry.io/collector/pipeline v0.109.0
go.opentelemetry.io/collector/processor v0.109.0
go.opentelemetry.io/collector/receiver v0.109.0
go.opentelemetry.io/collector/service v0.109.0
@ -71,6 +72,7 @@ require (
go.opentelemetry.io/collector/exporter/exporterprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/extension/extensioncapabilities v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalgates v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/collector/pdata/testdata v0.109.0 // indirect
@ -178,3 +180,7 @@ replace go.opentelemetry.io/collector/processor/processorprofiles => ../processo
replace go.opentelemetry.io/collector/connector/connectorprofiles => ../connector/connectorprofiles
replace go.opentelemetry.io/collector/exporter/exporterprofiles => ../exporter/exporterprofiles
replace go.opentelemetry.io/collector/pipeline => ../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../internal/globalsignal

View File

@ -11,6 +11,7 @@ import (
"github.com/stretchr/testify/require"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/pipeline"
"go.opentelemetry.io/collector/service/pipelines"
)
@ -48,14 +49,14 @@ func TestLoadConfig(t *testing.T) {
// Verify service.
require.Len(t, cfg.Service.Extensions, 1)
assert.Contains(t, cfg.Service.Extensions, component.MustNewID("nop"))
require.Len(t, cfg.Service.Pipelines, 1)
require.Len(t, cfg.Service.PipelinesWithPipelineID, 1)
assert.Equal(t,
&pipelines.PipelineConfig{
Receivers: []component.ID{component.MustNewID("nop")},
Processors: []component.ID{component.MustNewID("nop")},
Exporters: []component.ID{component.MustNewID("nop")},
},
cfg.Service.Pipelines[component.MustNewID("traces")],
cfg.Service.PipelinesWithPipelineID[pipeline.MustNewID("traces")],
"Did not load pipeline config correctly")
}

View File

@ -14,6 +14,7 @@ require (
go.opentelemetry.io/collector/exporter v0.109.0
go.opentelemetry.io/collector/extension v0.109.0
go.opentelemetry.io/collector/otelcol v0.109.0
go.opentelemetry.io/collector/pipeline v0.109.0
go.opentelemetry.io/collector/processor v0.109.0
go.opentelemetry.io/collector/receiver v0.109.0
go.opentelemetry.io/collector/service v0.109.0
@ -70,6 +71,7 @@ require (
go.opentelemetry.io/collector/extension/extensioncapabilities v0.109.0 // indirect
go.opentelemetry.io/collector/featuregate v1.15.0 // indirect
go.opentelemetry.io/collector/internal/globalgates v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/collector/pdata/testdata v0.109.0 // indirect
@ -193,3 +195,7 @@ replace go.opentelemetry.io/collector/processor/processorprofiles => ../../proce
replace go.opentelemetry.io/collector/connector/connectorprofiles => ../../connector/connectorprofiles
replace go.opentelemetry.io/collector/exporter/exporterprofiles => ../../exporter/exporterprofiles
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal

View File

@ -134,7 +134,7 @@ func TestPipelineConfigUnmarshalError(t *testing.T) {
for _, tt := range testCases {
t.Run(tt.name, func(t *testing.T) {
pips := new(pipelines.Config)
pips := new(pipelines.ConfigWithPipelineID)
err := tt.conf.Unmarshal(&pips)
require.Error(t, err)
assert.Contains(t, err.Error(), tt.expectError)

View File

@ -4,6 +4,8 @@
package pipeline // import "go.opentelemetry.io/collector/pipeline"
import (
"errors"
"go.opentelemetry.io/collector/internal/globalsignal"
)
@ -11,6 +13,8 @@ import (
// collecting metrics, traces and logs, this can expand in the future.
type Signal = globalsignal.Signal
var ErrSignalNotSupported = errors.New("telemetry type is not supported")
var (
SignalTraces = globalsignal.MustNewSignal("traces")
SignalMetrics = globalsignal.MustNewSignal("metrics")

View File

@ -39,7 +39,9 @@ require (
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/component/componentstatus v0.109.0 // indirect
go.opentelemetry.io/collector/consumer/consumerprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/collector/processor/processorprofiles v0.109.0 // indirect
go.opentelemetry.io/otel/sdk v1.30.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
@ -82,3 +84,7 @@ replace go.opentelemetry.io/collector/consumer/consumertest => ../../consumer/co
replace go.opentelemetry.io/collector/component/componentstatus => ../../component/componentstatus
replace go.opentelemetry.io/collector/processor/processorprofiles => ../processorprofiles
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal

View File

@ -14,6 +14,7 @@ require (
go.opentelemetry.io/collector/pdata v1.15.0
go.opentelemetry.io/collector/pdata/pprofile v0.109.0
go.opentelemetry.io/collector/pdata/testdata v0.109.0
go.opentelemetry.io/collector/pipeline v0.109.0
go.opentelemetry.io/collector/processor/processorprofiles v0.109.0
go.opentelemetry.io/otel v1.30.0
go.opentelemetry.io/otel/metric v1.30.0
@ -31,6 +32,7 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/otel/sdk v1.30.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
@ -62,3 +64,7 @@ replace go.opentelemetry.io/collector/consumer/consumertest => ../consumer/consu
replace go.opentelemetry.io/collector/component/componentstatus => ../component/componentstatus
replace go.opentelemetry.io/collector/processor/processorprofiles => ./processorprofiles
replace go.opentelemetry.io/collector/pipeline => ../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../internal/globalsignal

View File

@ -9,6 +9,7 @@ import (
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/consumer/consumerprofiles"
"go.opentelemetry.io/collector/pipeline"
)
// Factory is a Factory interface for processors.
@ -20,7 +21,7 @@ type Factory interface {
// CreateTracesProcessor creates a TracesProcessor based on this config.
// If the processor type does not support traces,
// this function returns the error [component.ErrDataTypeIsNotSupported].
// this function returns the error [pipeline.ErrSignalNotSupported].
// Implementers can assume `nextConsumer` is never nil.
CreateTracesProcessor(ctx context.Context, set Settings, cfg component.Config, nextConsumer consumer.Traces) (Traces, error)
@ -29,7 +30,7 @@ type Factory interface {
// CreateMetricsProcessor creates a MetricsProcessor based on this config.
// If the processor type does not support metrics,
// this function returns the error [component.ErrDataTypeIsNotSupported].
// this function returns the error [pipeline.ErrSignalNotSupported].
// Implementers can assume `nextConsumer` is never nil.
CreateMetricsProcessor(ctx context.Context, set Settings, cfg component.Config, nextConsumer consumer.Metrics) (Metrics, error)
@ -38,7 +39,7 @@ type Factory interface {
// CreateLogsProcessor creates a LogsProcessor based on the config.
// If the processor type does not support logs,
// this function returns the error [component.ErrDataTypeIsNotSupported].
// this function returns the error [pipeline.ErrSignalNotSupported].
// Implementers can assume `nextConsumer` is never nil.
CreateLogsProcessor(ctx context.Context, set Settings, cfg component.Config, nextConsumer consumer.Logs) (Logs, error)
@ -81,7 +82,7 @@ func (f CreateTracesFunc) CreateTracesProcessor(
cfg component.Config,
nextConsumer consumer.Traces) (Traces, error) {
if f == nil {
return nil, component.ErrDataTypeIsNotSupported
return nil, pipeline.ErrSignalNotSupported
}
return f(ctx, set, cfg, nextConsumer)
}
@ -97,7 +98,7 @@ func (f CreateMetricsFunc) CreateMetricsProcessor(
nextConsumer consumer.Metrics,
) (Metrics, error) {
if f == nil {
return nil, component.ErrDataTypeIsNotSupported
return nil, pipeline.ErrSignalNotSupported
}
return f(ctx, set, cfg, nextConsumer)
}
@ -113,7 +114,7 @@ func (f CreateLogsFunc) CreateLogsProcessor(
nextConsumer consumer.Logs,
) (Logs, error) {
if f == nil {
return nil, component.ErrDataTypeIsNotSupported
return nil, pipeline.ErrSignalNotSupported
}
return f(ctx, set, cfg, nextConsumer)
}
@ -128,7 +129,7 @@ func (f CreateProfilesFunc) CreateProfilesProcessor(
cfg component.Config,
nextConsumer consumerprofiles.Profiles) (Profiles, error) {
if f == nil {
return nil, component.ErrDataTypeIsNotSupported
return nil, pipeline.ErrSignalNotSupported
}
return f(ctx, set, cfg, nextConsumer)
}

View File

@ -40,8 +40,10 @@ require (
go.opentelemetry.io/collector/component/componentstatus v0.109.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/consumer/consumerprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/collector/pdata/testdata v0.109.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/collector/processor/processorprofiles v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
@ -89,3 +91,7 @@ replace go.opentelemetry.io/collector/consumer/consumertest => ../../consumer/co
replace go.opentelemetry.io/collector/component/componentstatus => ../../component/componentstatus
replace go.opentelemetry.io/collector/processor/processorprofiles => ../processorprofiles
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal

View File

@ -11,6 +11,7 @@ import (
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/pipeline"
"go.opentelemetry.io/collector/processor"
"go.opentelemetry.io/collector/processor/internal"
"go.opentelemetry.io/collector/processor/processorhelper/internal/metadata"
@ -65,18 +66,18 @@ func (or *ObsReport) recordInOut(ctx context.Context, incoming, outgoing int) {
or.telemetryBuilder.ProcessorOutgoingItems.Add(ctx, int64(outgoing), metric.WithAttributes(or.otelAttrs...))
}
func (or *ObsReport) recordData(ctx context.Context, dataType component.DataType, accepted, refused, dropped int64) {
func (or *ObsReport) recordData(ctx context.Context, signal pipeline.Signal, accepted, refused, dropped int64) {
var acceptedCount, refusedCount, droppedCount metric.Int64Counter
switch dataType {
case component.DataTypeTraces:
switch signal {
case pipeline.SignalTraces:
acceptedCount = or.telemetryBuilder.ProcessorAcceptedSpans
refusedCount = or.telemetryBuilder.ProcessorRefusedSpans
droppedCount = or.telemetryBuilder.ProcessorDroppedSpans
case component.DataTypeMetrics:
case pipeline.SignalMetrics:
acceptedCount = or.telemetryBuilder.ProcessorAcceptedMetricPoints
refusedCount = or.telemetryBuilder.ProcessorRefusedMetricPoints
droppedCount = or.telemetryBuilder.ProcessorDroppedMetricPoints
case component.DataTypeLogs:
case pipeline.SignalLogs:
acceptedCount = or.telemetryBuilder.ProcessorAcceptedLogRecords
refusedCount = or.telemetryBuilder.ProcessorRefusedLogRecords
droppedCount = or.telemetryBuilder.ProcessorDroppedLogRecords
@ -91,61 +92,61 @@ func (or *ObsReport) recordData(ctx context.Context, dataType component.DataType
//
// Deprecated: [v0.110.0] Processor helper automatically calculates incoming/outgoing metrics only.
func (or *ObsReport) TracesAccepted(ctx context.Context, numSpans int) {
or.recordData(ctx, component.DataTypeTraces, int64(numSpans), int64(0), int64(0))
or.recordData(ctx, pipeline.SignalTraces, int64(numSpans), int64(0), int64(0))
}
// TracesRefused reports that the trace data was refused.
//
// Deprecated: [v0.110.0] Processor helper automatically calculates incoming/outgoing metrics only.
func (or *ObsReport) TracesRefused(ctx context.Context, numSpans int) {
or.recordData(ctx, component.DataTypeTraces, int64(0), int64(numSpans), int64(0))
or.recordData(ctx, pipeline.SignalTraces, int64(0), int64(numSpans), int64(0))
}
// TracesDropped reports that the trace data was dropped.
//
// Deprecated: [v0.110.0] Processor helper automatically calculates incoming/outgoing metrics only.
func (or *ObsReport) TracesDropped(ctx context.Context, numSpans int) {
or.recordData(ctx, component.DataTypeTraces, int64(0), int64(0), int64(numSpans))
or.recordData(ctx, pipeline.SignalTraces, int64(0), int64(0), int64(numSpans))
}
// MetricsAccepted reports that the metrics were accepted.
//
// Deprecated: [v0.110.0] Processor helper automatically calculates incoming/outgoing metrics only.
func (or *ObsReport) MetricsAccepted(ctx context.Context, numPoints int) {
or.recordData(ctx, component.DataTypeMetrics, int64(numPoints), int64(0), int64(0))
or.recordData(ctx, pipeline.SignalMetrics, int64(numPoints), int64(0), int64(0))
}
// MetricsRefused reports that the metrics were refused.
//
// Deprecated: [v0.110.0] Processor helper automatically calculates incoming/outgoing metrics only.
func (or *ObsReport) MetricsRefused(ctx context.Context, numPoints int) {
or.recordData(ctx, component.DataTypeMetrics, int64(0), int64(numPoints), int64(0))
or.recordData(ctx, pipeline.SignalMetrics, int64(0), int64(numPoints), int64(0))
}
// MetricsDropped reports that the metrics were dropped.
//
// Deprecated: [v0.110.0] Processor helper automatically calculates incoming/outgoing metrics only.
func (or *ObsReport) MetricsDropped(ctx context.Context, numPoints int) {
or.recordData(ctx, component.DataTypeMetrics, int64(0), int64(0), int64(numPoints))
or.recordData(ctx, pipeline.SignalMetrics, int64(0), int64(0), int64(numPoints))
}
// LogsAccepted reports that the logs were accepted.
//
// Deprecated: [v0.110.0] Processor helper automatically calculates incoming/outgoing metrics only.
func (or *ObsReport) LogsAccepted(ctx context.Context, numRecords int) {
or.recordData(ctx, component.DataTypeLogs, int64(numRecords), int64(0), int64(0))
or.recordData(ctx, pipeline.SignalLogs, int64(numRecords), int64(0), int64(0))
}
// LogsRefused reports that the logs were refused.
//
// Deprecated: [v0.110.0] Processor helper automatically calculates incoming/outgoing metrics only.
func (or *ObsReport) LogsRefused(ctx context.Context, numRecords int) {
or.recordData(ctx, component.DataTypeLogs, int64(0), int64(numRecords), int64(0))
or.recordData(ctx, pipeline.SignalLogs, int64(0), int64(numRecords), int64(0))
}
// LogsDropped reports that the logs were dropped.
//
// Deprecated: [v0.110.0] Processor helper automatically calculates incoming/outgoing metrics only.
func (or *ObsReport) LogsDropped(ctx context.Context, numRecords int) {
or.recordData(ctx, component.DataTypeLogs, int64(0), int64(0), int64(numRecords))
or.recordData(ctx, pipeline.SignalLogs, int64(0), int64(0), int64(numRecords))
}

View File

@ -19,8 +19,10 @@ require (
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/consumer v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
go.opentelemetry.io/otel/trace v1.30.0 // indirect
@ -54,3 +56,7 @@ replace go.opentelemetry.io/collector/consumer/consumerprofiles => ../../consume
replace go.opentelemetry.io/collector/consumer/consumertest => ../../consumer/consumertest
replace go.opentelemetry.io/collector/component/componentstatus => ../../component/componentstatus
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal

View File

@ -15,6 +15,7 @@ import (
"go.opentelemetry.io/collector/component/componenttest"
"go.opentelemetry.io/collector/consumer/consumertest"
"go.opentelemetry.io/collector/pdata/testdata"
"go.opentelemetry.io/collector/pipeline"
"go.opentelemetry.io/collector/processor"
)
@ -22,7 +23,7 @@ func verifyTracesDoesNotProduceAfterShutdown(t *testing.T, factory processor.Fac
// Create a proc and output its produce to a sink.
nextSink := new(consumertest.TracesSink)
proc, err := factory.CreateTracesProcessor(context.Background(), NewNopSettings(), cfg, nextSink)
if errors.Is(err, component.ErrDataTypeIsNotSupported) {
if errors.Is(err, pipeline.ErrSignalNotSupported) {
return
}
require.NoError(t, err)
@ -46,7 +47,7 @@ func verifyLogsDoesNotProduceAfterShutdown(t *testing.T, factory processor.Facto
// Create a proc and output its produce to a sink.
nextSink := new(consumertest.LogsSink)
proc, err := factory.CreateLogsProcessor(context.Background(), NewNopSettings(), cfg, nextSink)
if errors.Is(err, component.ErrDataTypeIsNotSupported) {
if errors.Is(err, pipeline.ErrSignalNotSupported) {
return
}
require.NoError(t, err)
@ -70,7 +71,7 @@ func verifyMetricsDoesNotProduceAfterShutdown(t *testing.T, factory processor.Fa
// Create a proc and output its produce to a sink.
nextSink := new(consumertest.MetricsSink)
proc, err := factory.CreateMetricsProcessor(context.Background(), NewNopSettings(), cfg, nextSink)
if errors.Is(err, component.ErrDataTypeIsNotSupported) {
if errors.Is(err, pipeline.ErrSignalNotSupported) {
return
}
require.NoError(t, err)

View File

@ -6,11 +6,14 @@ require (
github.com/google/uuid v1.6.0
github.com/stretchr/testify v1.9.0
go.opentelemetry.io/collector/component v0.109.0
go.opentelemetry.io/collector/component/componentprofiles v0.109.0
go.opentelemetry.io/collector/config/configtelemetry v0.109.0
go.opentelemetry.io/collector/consumer v0.109.0
go.opentelemetry.io/collector/consumer/consumerprofiles v0.109.0
go.opentelemetry.io/collector/consumer/consumertest v0.109.0
go.opentelemetry.io/collector/internal/globalsignal v0.109.0
go.opentelemetry.io/collector/pdata v1.15.0
go.opentelemetry.io/collector/pipeline v0.109.0
go.opentelemetry.io/collector/receiver/receiverprofiles v0.109.0
go.opentelemetry.io/otel v1.30.0
go.opentelemetry.io/otel/metric v1.30.0
@ -60,3 +63,9 @@ replace go.opentelemetry.io/collector/consumer/consumertest => ../consumer/consu
replace go.opentelemetry.io/collector/receiver/receiverprofiles => ./receiverprofiles
retract v0.76.0 // Depends on retracted pdata v1.0.0-rc10 module
replace go.opentelemetry.io/collector/pipeline => ../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../internal/globalsignal
replace go.opentelemetry.io/collector/component/componentprofiles => ../component/componentprofiles

View File

@ -9,6 +9,7 @@ import (
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/consumer/consumerprofiles"
"go.opentelemetry.io/collector/pipeline"
)
// Factory is a factory interface for receivers.
@ -20,7 +21,7 @@ type Factory interface {
// CreateTracesReceiver creates a TracesReceiver based on this config.
// If the receiver type does not support traces,
// this function returns the error [component.ErrDataTypeIsNotSupported].
// this function returns the error [pipeline.ErrSignalNotSupported].
// Implementers can assume `nextConsumer` is never nil.
CreateTracesReceiver(ctx context.Context, set Settings, cfg component.Config, nextConsumer consumer.Traces) (Traces, error)
@ -29,7 +30,7 @@ type Factory interface {
// CreateMetricsReceiver creates a MetricsReceiver based on this config.
// If the receiver type does not support metrics,
// this function returns the error [component.ErrDataTypeIsNotSupported].
// this function returns the error [pipeline.ErrSignalNotSupported].
// Implementers can assume `nextConsumer` is never nil.
CreateMetricsReceiver(ctx context.Context, set Settings, cfg component.Config, nextConsumer consumer.Metrics) (Metrics, error)
@ -38,7 +39,7 @@ type Factory interface {
// CreateLogsReceiver creates a LogsReceiver based on this config.
// If the receiver type does not support logs,
// this function returns the error [component.ErrDataTypeIsNotSupported].
// this function returns the error [pipeline.ErrSignalNotSupported].
// Implementers can assume `nextConsumer` is never nil.
CreateLogsReceiver(ctx context.Context, set Settings, cfg component.Config, nextConsumer consumer.Logs) (Logs, error)
@ -79,7 +80,7 @@ func (f CreateTracesFunc) CreateTracesReceiver(
cfg component.Config,
nextConsumer consumer.Traces) (Traces, error) {
if f == nil {
return nil, component.ErrDataTypeIsNotSupported
return nil, pipeline.ErrSignalNotSupported
}
return f(ctx, set, cfg, nextConsumer)
}
@ -95,7 +96,7 @@ func (f CreateMetricsFunc) CreateMetricsReceiver(
nextConsumer consumer.Metrics,
) (Metrics, error) {
if f == nil {
return nil, component.ErrDataTypeIsNotSupported
return nil, pipeline.ErrSignalNotSupported
}
return f(ctx, set, cfg, nextConsumer)
}
@ -111,7 +112,7 @@ func (f CreateLogsFunc) CreateLogsReceiver(
nextConsumer consumer.Logs,
) (Logs, error) {
if f == nil {
return nil, component.ErrDataTypeIsNotSupported
return nil, pipeline.ErrSignalNotSupported
}
return f(ctx, set, cfg, nextConsumer)
}
@ -126,7 +127,7 @@ func (f CreateProfilesFunc) CreateProfilesReceiver(
cfg component.Config,
nextConsumer consumerprofiles.Profiles) (Profiles, error) {
if f == nil {
return nil, component.ErrDataTypeIsNotSupported
return nil, pipeline.ErrSignalNotSupported
}
return f(ctx, set, cfg, nextConsumer)
}

View File

@ -28,10 +28,13 @@ require (
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/component/componentprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/consumer/consumerprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/collector/receiver/receiverprofiles v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
@ -70,3 +73,9 @@ replace go.opentelemetry.io/collector/consumer/consumerprofiles => ../../consume
replace go.opentelemetry.io/collector/consumer/consumertest => ../../consumer/consumertest
replace go.opentelemetry.io/collector/receiver/receiverprofiles => ../receiverprofiles
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal
replace go.opentelemetry.io/collector/component/componentprofiles => ../../component/componentprofiles

View File

@ -53,6 +53,7 @@ require (
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rs/cors v1.11.1 // indirect
go.opentelemetry.io/collector/client v1.15.0 // indirect
go.opentelemetry.io/collector/component/componentprofiles v0.109.0 // indirect
go.opentelemetry.io/collector/config/configcompression v1.15.0 // indirect
go.opentelemetry.io/collector/config/configopaque v1.15.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
@ -60,6 +61,8 @@ require (
go.opentelemetry.io/collector/extension v0.109.0 // indirect
go.opentelemetry.io/collector/extension/auth v0.109.0 // indirect
go.opentelemetry.io/collector/featuregate v1.15.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
@ -130,3 +133,9 @@ retract (
v0.76.0 // Depends on retracted pdata v1.0.0-rc10 module, use v0.76.1
v0.69.0 // Release failed, use v0.69.1
)
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal
replace go.opentelemetry.io/collector/component/componentprofiles => ../../component/componentprofiles

View File

@ -14,6 +14,7 @@ import (
"go.opentelemetry.io/otel/trace"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/pipeline"
"go.opentelemetry.io/collector/receiver"
"go.opentelemetry.io/collector/receiver/internal"
"go.opentelemetry.io/collector/receiver/receiverhelper/internal/metadata"
@ -82,7 +83,7 @@ func (rec *ObsReport) EndTracesOp(
numReceivedSpans int,
err error,
) {
rec.endOp(receiverCtx, format, numReceivedSpans, err, component.DataTypeTraces)
rec.endOp(receiverCtx, format, numReceivedSpans, err, pipeline.SignalTraces)
}
// StartLogsOp is called when a request is received from a client.
@ -100,7 +101,7 @@ func (rec *ObsReport) EndLogsOp(
numReceivedLogRecords int,
err error,
) {
rec.endOp(receiverCtx, format, numReceivedLogRecords, err, component.DataTypeLogs)
rec.endOp(receiverCtx, format, numReceivedLogRecords, err, pipeline.SignalLogs)
}
// StartMetricsOp is called when a request is received from a client.
@ -118,7 +119,7 @@ func (rec *ObsReport) EndMetricsOp(
numReceivedPoints int,
err error,
) {
rec.endOp(receiverCtx, format, numReceivedPoints, err, component.DataTypeMetrics)
rec.endOp(receiverCtx, format, numReceivedPoints, err, pipeline.SignalMetrics)
}
// startOp creates the span used to trace the operation. Returning
@ -152,7 +153,7 @@ func (rec *ObsReport) endOp(
format string,
numReceivedItems int,
err error,
dataType component.DataType,
signal pipeline.Signal,
) {
numAccepted := numReceivedItems
numRefused := 0
@ -163,19 +164,19 @@ func (rec *ObsReport) endOp(
span := trace.SpanFromContext(receiverCtx)
rec.recordMetrics(receiverCtx, dataType, numAccepted, numRefused)
rec.recordMetrics(receiverCtx, signal, numAccepted, numRefused)
// end span according to errors
if span.IsRecording() {
var acceptedItemsKey, refusedItemsKey string
switch dataType {
case component.DataTypeTraces:
switch signal {
case pipeline.SignalTraces:
acceptedItemsKey = internal.AcceptedSpansKey
refusedItemsKey = internal.RefusedSpansKey
case component.DataTypeMetrics:
case pipeline.SignalMetrics:
acceptedItemsKey = internal.AcceptedMetricPointsKey
refusedItemsKey = internal.RefusedMetricPointsKey
case component.DataTypeLogs:
case pipeline.SignalLogs:
acceptedItemsKey = internal.AcceptedLogRecordsKey
refusedItemsKey = internal.RefusedLogRecordsKey
}
@ -192,16 +193,16 @@ func (rec *ObsReport) endOp(
span.End()
}
func (rec *ObsReport) recordMetrics(receiverCtx context.Context, dataType component.DataType, numAccepted, numRefused int) {
func (rec *ObsReport) recordMetrics(receiverCtx context.Context, signal pipeline.Signal, numAccepted, numRefused int) {
var acceptedMeasure, refusedMeasure metric.Int64Counter
switch dataType {
case component.DataTypeTraces:
switch signal {
case pipeline.SignalTraces:
acceptedMeasure = rec.telemetryBuilder.ReceiverAcceptedSpans
refusedMeasure = rec.telemetryBuilder.ReceiverRefusedSpans
case component.DataTypeMetrics:
case pipeline.SignalMetrics:
acceptedMeasure = rec.telemetryBuilder.ReceiverAcceptedMetricPoints
refusedMeasure = rec.telemetryBuilder.ReceiverRefusedMetricPoints
case component.DataTypeLogs:
case pipeline.SignalLogs:
acceptedMeasure = rec.telemetryBuilder.ReceiverAcceptedLogRecords
refusedMeasure = rec.telemetryBuilder.ReceiverRefusedLogRecords
}

View File

@ -19,8 +19,10 @@ require (
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.109.0 // indirect
go.opentelemetry.io/collector/consumer v0.109.0 // indirect
go.opentelemetry.io/collector/internal/globalsignal v0.109.0 // indirect
go.opentelemetry.io/collector/pdata v1.15.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.109.0 // indirect
go.opentelemetry.io/collector/pipeline v0.109.0 // indirect
go.opentelemetry.io/otel v1.30.0 // indirect
go.opentelemetry.io/otel/metric v1.30.0 // indirect
go.opentelemetry.io/otel/trace v1.30.0 // indirect
@ -52,3 +54,9 @@ replace go.opentelemetry.io/collector/pdata/pprofile => ../../pdata/pprofile
replace go.opentelemetry.io/collector/pdata => ../../pdata
replace go.opentelemetry.io/collector/consumer/consumertest => ../../consumer/consumertest
replace go.opentelemetry.io/collector/pipeline => ../../pipeline
replace go.opentelemetry.io/collector/internal/globalsignal => ../../internal/globalsignal
replace go.opentelemetry.io/collector/component/componentprofiles => ../../component/componentprofiles

View File

@ -17,6 +17,7 @@ import (
"github.com/stretchr/testify/require"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/component/componentprofiles"
"go.opentelemetry.io/collector/component/componenttest"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/consumer/consumererror"
@ -24,6 +25,7 @@ import (
"go.opentelemetry.io/collector/pdata/plog"
"go.opentelemetry.io/collector/pdata/pmetric"
"go.opentelemetry.io/collector/pdata/ptrace"
"go.opentelemetry.io/collector/pipeline"
"go.opentelemetry.io/collector/receiver"
)
@ -54,8 +56,13 @@ type CheckConsumeContractParams struct {
T *testing.T
// Factory that allows to create a receiver.
Factory receiver.Factory
// DataType to test for.
DataType component.DataType
//
// Deprecated: [v0.110.0] Use Signal instead.
DataType component.DataType // nolint
Signal pipeline.Signal
// Config of the receiver to use.
Config component.Config
// Generator that can send data to the receiver.
@ -111,12 +118,26 @@ func checkConsumeContractScenario(params CheckConsumeContractParams, decisionFun
// Create and start the receiver.
var receiver component.Component
var err error
s := params.Signal
// nolint
switch params.DataType {
case component.DataTypeLogs:
receiver, err = params.Factory.CreateLogsReceiver(ctx, NewNopSettings(), params.Config, consumer)
case component.DataTypeTraces:
receiver, err = params.Factory.CreateTracesReceiver(ctx, NewNopSettings(), params.Config, consumer)
s = pipeline.SignalTraces
case component.DataTypeMetrics:
s = pipeline.SignalMetrics
case component.DataTypeLogs:
s = pipeline.SignalLogs
case componentprofiles.DataTypeProfiles:
s = componentprofiles.SignalProfiles
}
switch s {
case pipeline.SignalLogs:
receiver, err = params.Factory.CreateLogsReceiver(ctx, NewNopSettings(), params.Config, consumer)
case pipeline.SignalTraces:
receiver, err = params.Factory.CreateTracesReceiver(ctx, NewNopSettings(), params.Config, consumer)
case pipeline.SignalMetrics:
receiver, err = params.Factory.CreateMetricsReceiver(ctx, NewNopSettings(), params.Config, consumer)
default:
require.FailNow(params.T, "must specify a valid DataType to test for")

View File

@ -18,6 +18,7 @@ import (
"go.opentelemetry.io/collector/pdata/plog"
"go.opentelemetry.io/collector/pdata/pmetric"
"go.opentelemetry.io/collector/pdata/ptrace"
"go.opentelemetry.io/collector/pipeline"
"go.opentelemetry.io/collector/receiver"
)
@ -239,7 +240,7 @@ func TestConsumeContract(t *testing.T) {
params := CheckConsumeContractParams{
T: t,
Factory: newExampleFactory(),
DataType: component.DataTypeLogs,
Signal: pipeline.SignalLogs,
Config: cfg,
Generator: generator,
GenerateCount: logsPerTest,
@ -262,7 +263,7 @@ func TestConsumeMetricsContract(t *testing.T) {
params := CheckConsumeContractParams{
T: t,
Factory: newExampleFactory(),
DataType: component.DataTypeMetrics,
Signal: pipeline.SignalMetrics,
Config: cfg,
Generator: generator,
GenerateCount: metricsPerTest,
@ -285,7 +286,7 @@ func TestConsumeTracesContract(t *testing.T) {
params := CheckConsumeContractParams{
T: t,
Factory: newExampleFactory(),
DataType: component.DataTypeTraces,
Signal: pipeline.SignalTraces,
Config: cfg,
Generator: generator,
GenerateCount: spansPerTest,

View File

@ -12,6 +12,8 @@ import (
"go.opentelemetry.io/collector/component/componenttest"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/consumer/consumerprofiles"
"go.opentelemetry.io/collector/internal/globalsignal"
"go.opentelemetry.io/collector/pipeline"
"go.opentelemetry.io/collector/receiver"
"go.opentelemetry.io/collector/receiver/receiverprofiles"
)
@ -41,20 +43,28 @@ func NewNopFactory() receiver.Factory {
// NewNopFactoryForType returns a receiver.Factory that constructs nop receivers supporting only the
// given data type.
//
// Deprecated: [v0.110.0] Use NewNopFactoryForTypeWithSignal instead
func NewNopFactoryForType(dataType component.DataType) receiver.Factory {
return NewNopFactoryForTypeWithSignal(globalsignal.MustNewSignal(dataType.String()))
}
// NewNopFactoryForTypeWithSignal returns a receiver.Factory that constructs nop receivers supporting only the
// given signal.
func NewNopFactoryForTypeWithSignal(signal pipeline.Signal) receiver.Factory {
var factoryOpt receiver.FactoryOption
switch dataType {
case component.DataTypeTraces:
switch signal {
case pipeline.SignalTraces:
factoryOpt = receiver.WithTraces(createTraces, component.StabilityLevelStable)
case component.DataTypeMetrics:
case pipeline.SignalMetrics:
factoryOpt = receiver.WithMetrics(createMetrics, component.StabilityLevelStable)
case component.DataTypeLogs:
case pipeline.SignalLogs:
factoryOpt = receiver.WithLogs(createLogs, component.StabilityLevelStable)
default:
panic("unsupported data type for creating nop receiver factory: " + dataType.String())
panic("unsupported data type for creating nop receiver factory: " + signal.String())
}
componentType := component.MustNewType(defaultComponentType.String() + "_" + dataType.String())
componentType := component.MustNewType(defaultComponentType.String() + "_" + signal.String())
return receiver.NewFactory(componentType, func() component.Config { return &nopConfig{} }, factoryOpt)
}

View File

@ -13,6 +13,7 @@ import (
"go.opentelemetry.io/otel/trace"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/pipeline"
"go.opentelemetry.io/collector/receiver"
"go.opentelemetry.io/collector/receiver/internal"
"go.opentelemetry.io/collector/receiver/scrapererror"
@ -88,7 +89,7 @@ func (s *obsReport) EndMetricsOp(
// end span according to errors
if span.IsRecording() {
span.SetAttributes(
attribute.String(internal.FormatKey, component.DataTypeMetrics.String()),
attribute.String(internal.FormatKey, pipeline.SignalMetrics.String()),
attribute.Int64(internal.ScrapedMetricPointsKey, int64(numScrapedMetrics)),
attribute.Int64(internal.ErroredMetricPointsKey, int64(numErroredMetrics)),
)

View File

@ -20,12 +20,28 @@ type Config struct {
Extensions extensions.Config `mapstructure:"extensions"`
// Pipelines are the set of data pipelines configured for the service.
Pipelines pipelines.Config `mapstructure:"pipelines"`
//
// Deprecated: [v0.110.0] Use PipelinesWithPipelineID instead
// nolint
Pipelines pipelines.Config `mapstructure:"-"`
// Pipelines are the set of data pipelines configured for the service.
PipelinesWithPipelineID pipelines.ConfigWithPipelineID `mapstructure:"pipelines"`
}
func (cfg *Config) Validate() error {
if err := cfg.Pipelines.Validate(); err != nil {
return fmt.Errorf("service::pipelines config validation failed: %w", err)
if len(cfg.Pipelines) > 0 && len(cfg.PipelinesWithPipelineID) > 0 {
return fmt.Errorf("service::pipelines config validation failed: cannot configure both Pipelines and PipelinesWithPipelineID")
}
if len(cfg.Pipelines) > 0 {
if err := cfg.Pipelines.Validate(); err != nil {
return fmt.Errorf("service::pipelines config validation failed: %w", err)
}
} else {
if err := cfg.PipelinesWithPipelineID.Validate(); err != nil {
return fmt.Errorf("service::pipelines config validation failed: %w", err)
}
}
if err := cfg.Telemetry.Validate(); err != nil {

Some files were not shown because too many files have changed in this diff Show More