@@ -44,6 +44,33 @@ type Arguments interface {
44
44
DebugMetricsConfig () otelcol.DebugMetricsArguments
45
45
}
46
46
47
+ // TypeSignal is a bit field to indicate which telemetry signals the exporter supports.
48
+ type TypeSignal byte
49
+
50
+ const (
51
+ TypeLogs TypeSignal = 1 << iota // 1
52
+ TypeMetrics // 2
53
+ TypeTraces // 4
54
+ )
55
+
56
+ // TypeAll indicates that the exporter supports all telemetry signals.
57
+ const TypeAll = TypeLogs | TypeMetrics | TypeTraces
58
+
59
+ // SupportsLogs returns true if the exporter supports logs.
60
+ func (s TypeSignal ) SupportsLogs () bool {
61
+ return s & TypeLogs != 0
62
+ }
63
+
64
+ // SupportsMetrics returns true if the exporter supports metrics.
65
+ func (s TypeSignal ) SupportsMetrics () bool {
66
+ return s & TypeMetrics != 0
67
+ }
68
+
69
+ // SupportsTraces returns true if the exporter supports traces.
70
+ func (s TypeSignal ) SupportsTraces () bool {
71
+ return s & TypeTraces != 0
72
+ }
73
+
47
74
// Exporter is a Flow component shim which manages an OpenTelemetry Collector
48
75
// exporter component.
49
76
type Exporter struct {
@@ -56,6 +83,10 @@ type Exporter struct {
56
83
57
84
sched * scheduler.Scheduler
58
85
collector * lazycollector.Collector
86
+
87
+ // Signals which the exporter is able to export.
88
+ // Can be logs, metrics, traces or any combination of them.
89
+ supportedSignals TypeSignal
59
90
}
60
91
61
92
var (
69
100
//
70
101
// The registered component must be registered to export the
71
102
// otelcol.ConsumerExports type, otherwise New will panic.
72
- func New (opts component.Options , f otelexporter.Factory , args Arguments ) (* Exporter , error ) {
103
+ func New (opts component.Options , f otelexporter.Factory , args Arguments , supportedSignals TypeSignal ) (* Exporter , error ) {
73
104
ctx , cancel := context .WithCancel (context .Background ())
74
105
75
106
consumer := lazyconsumer .New (ctx )
@@ -96,6 +127,8 @@ func New(opts component.Options, f otelexporter.Factory, args Arguments) (*Expor
96
127
97
128
sched : scheduler .New (opts .Logger ),
98
129
collector : collector ,
130
+
131
+ supportedSignals : supportedSignals ,
99
132
}
100
133
if err := e .Update (args ); err != nil {
101
134
return nil , err
@@ -162,25 +195,34 @@ func (e *Exporter) Update(args component.Arguments) error {
162
195
// supported telemetry signals.
163
196
var components []otelcomponent.Component
164
197
165
- tracesExporter , err := e .factory .CreateTracesExporter (e .ctx , settings , exporterConfig )
166
- if err != nil && ! errors .Is (err , otelcomponent .ErrDataTypeIsNotSupported ) {
167
- return err
168
- } else if tracesExporter != nil {
169
- components = append (components , tracesExporter )
198
+ var tracesExporter otelexporter.Traces
199
+ if e .supportedSignals .SupportsTraces () {
200
+ tracesExporter , err = e .factory .CreateTracesExporter (e .ctx , settings , exporterConfig )
201
+ if err != nil && ! errors .Is (err , otelcomponent .ErrDataTypeIsNotSupported ) {
202
+ return err
203
+ } else if tracesExporter != nil {
204
+ components = append (components , tracesExporter )
205
+ }
170
206
}
171
207
172
- metricsExporter , err := e .factory .CreateMetricsExporter (e .ctx , settings , exporterConfig )
173
- if err != nil && ! errors .Is (err , otelcomponent .ErrDataTypeIsNotSupported ) {
174
- return err
175
- } else if metricsExporter != nil {
176
- components = append (components , metricsExporter )
208
+ var metricsExporter otelexporter.Metrics
209
+ if e .supportedSignals .SupportsMetrics () {
210
+ metricsExporter , err = e .factory .CreateMetricsExporter (e .ctx , settings , exporterConfig )
211
+ if err != nil && ! errors .Is (err , otelcomponent .ErrDataTypeIsNotSupported ) {
212
+ return err
213
+ } else if metricsExporter != nil {
214
+ components = append (components , metricsExporter )
215
+ }
177
216
}
178
217
179
- logsExporter , err := e .factory .CreateLogsExporter (e .ctx , settings , exporterConfig )
180
- if err != nil && ! errors .Is (err , otelcomponent .ErrDataTypeIsNotSupported ) {
181
- return err
182
- } else if logsExporter != nil {
183
- components = append (components , logsExporter )
218
+ var logsExporter otelexporter.Logs
219
+ if e .supportedSignals .SupportsLogs () {
220
+ logsExporter , err = e .factory .CreateLogsExporter (e .ctx , settings , exporterConfig )
221
+ if err != nil && ! errors .Is (err , otelcomponent .ErrDataTypeIsNotSupported ) {
222
+ return err
223
+ } else if logsExporter != nil {
224
+ components = append (components , logsExporter )
225
+ }
184
226
}
185
227
186
228
// Schedule the components to run once our component is running.
0 commit comments