@@ -5,215 +5,20 @@ package graph // import "go.opentelemetry.io/collector/service/internal/graph"
5
5
6
6
import (
7
7
"context"
8
- "fmt"
9
- "hash/fnv"
10
- "strings"
11
8
12
9
"go.opentelemetry.io/collector/component"
13
10
"go.opentelemetry.io/collector/component/componentprofiles"
14
11
"go.opentelemetry.io/collector/connector"
15
12
"go.opentelemetry.io/collector/connector/connectorprofiles"
16
13
"go.opentelemetry.io/collector/consumer"
17
14
"go.opentelemetry.io/collector/consumer/consumerprofiles"
18
- "go.opentelemetry.io/collector/exporter"
19
- "go.opentelemetry.io/collector/internal/fanoutconsumer"
20
15
"go.opentelemetry.io/collector/pipeline"
21
- "go.opentelemetry.io/collector/processor"
22
- "go.opentelemetry.io/collector/receiver"
23
16
"go.opentelemetry.io/collector/service/internal/builders"
24
17
"go.opentelemetry.io/collector/service/internal/capabilityconsumer"
25
18
"go.opentelemetry.io/collector/service/internal/components"
26
19
)
27
20
28
- const (
29
- receiverSeed = "receiver"
30
- processorSeed = "processor"
31
- exporterSeed = "exporter"
32
- connectorSeed = "connector"
33
- capabilitiesSeed = "capabilities"
34
- fanOutToExporters = "fanout_to_exporters"
35
- )
36
-
37
- // baseConsumer redeclared here since not public in consumer package. May consider to make that public.
38
- type baseConsumer interface {
39
- Capabilities () consumer.Capabilities
40
- }
41
-
42
- type nodeID int64
43
-
44
- func (n nodeID ) ID () int64 {
45
- return int64 (n )
46
- }
47
-
48
- func newNodeID (parts ... string ) nodeID {
49
- h := fnv .New64a ()
50
- h .Write ([]byte (strings .Join (parts , "|" )))
51
- return nodeID (h .Sum64 ())
52
- }
53
-
54
- type consumerNode interface {
55
- getConsumer () baseConsumer
56
- }
57
-
58
- // A receiver instance can be shared by multiple pipelines of the same type.
59
- // Therefore, nodeID is derived from "pipeline type" and "component ID".
60
- type receiverNode struct {
61
- nodeID
62
- componentID component.ID
63
- pipelineType pipeline.Signal
64
- component.Component
65
- }
66
-
67
- func newReceiverNode (pipelineType pipeline.Signal , recvID component.ID ) * receiverNode {
68
- return & receiverNode {
69
- nodeID : newNodeID (receiverSeed , pipelineType .String (), recvID .String ()),
70
- componentID : recvID ,
71
- pipelineType : pipelineType ,
72
- }
73
- }
74
-
75
- func (n * receiverNode ) buildComponent (ctx context.Context ,
76
- tel component.TelemetrySettings ,
77
- info component.BuildInfo ,
78
- builder * builders.ReceiverBuilder ,
79
- nexts []baseConsumer ,
80
- ) error {
81
- tel .Logger = components .ReceiverLogger (tel .Logger , n .componentID , n .pipelineType )
82
- set := receiver.Settings {ID : n .componentID , TelemetrySettings : tel , BuildInfo : info }
83
- var err error
84
- switch n .pipelineType {
85
- case pipeline .SignalTraces :
86
- var consumers []consumer.Traces
87
- for _ , next := range nexts {
88
- consumers = append (consumers , next .(consumer.Traces ))
89
- }
90
- n .Component , err = builder .CreateTraces (ctx , set , fanoutconsumer .NewTraces (consumers ))
91
- case pipeline .SignalMetrics :
92
- var consumers []consumer.Metrics
93
- for _ , next := range nexts {
94
- consumers = append (consumers , next .(consumer.Metrics ))
95
- }
96
- n .Component , err = builder .CreateMetrics (ctx , set , fanoutconsumer .NewMetrics (consumers ))
97
- case pipeline .SignalLogs :
98
- var consumers []consumer.Logs
99
- for _ , next := range nexts {
100
- consumers = append (consumers , next .(consumer.Logs ))
101
- }
102
- n .Component , err = builder .CreateLogs (ctx , set , fanoutconsumer .NewLogs (consumers ))
103
- case componentprofiles .SignalProfiles :
104
- var consumers []consumerprofiles.Profiles
105
- for _ , next := range nexts {
106
- consumers = append (consumers , next .(consumerprofiles.Profiles ))
107
- }
108
- n .Component , err = builder .CreateProfiles (ctx , set , fanoutconsumer .NewProfiles (consumers ))
109
- default :
110
- return fmt .Errorf ("error creating receiver %q for data type %q is not supported" , set .ID , n .pipelineType )
111
- }
112
- if err != nil {
113
- return fmt .Errorf ("failed to create %q receiver for data type %q: %w" , set .ID , n .pipelineType , err )
114
- }
115
- return nil
116
- }
117
-
118
- var _ consumerNode = (* processorNode )(nil )
119
-
120
- // Every processor instance is unique to one pipeline.
121
- // Therefore, nodeID is derived from "pipeline ID" and "component ID".
122
- type processorNode struct {
123
- nodeID
124
- componentID component.ID
125
- pipelineID pipeline.ID
126
- component.Component
127
- }
128
-
129
- func newProcessorNode (pipelineID pipeline.ID , procID component.ID ) * processorNode {
130
- return & processorNode {
131
- nodeID : newNodeID (processorSeed , pipelineID .String (), procID .String ()),
132
- componentID : procID ,
133
- pipelineID : pipelineID ,
134
- }
135
- }
136
-
137
- func (n * processorNode ) getConsumer () baseConsumer {
138
- return n .Component .(baseConsumer )
139
- }
140
-
141
- func (n * processorNode ) buildComponent (ctx context.Context ,
142
- tel component.TelemetrySettings ,
143
- info component.BuildInfo ,
144
- builder * builders.ProcessorBuilder ,
145
- next baseConsumer ,
146
- ) error {
147
- tel .Logger = components .ProcessorLogger (tel .Logger , n .componentID , n .pipelineID )
148
- set := processor.Settings {ID : n .componentID , TelemetrySettings : tel , BuildInfo : info }
149
- var err error
150
- switch n .pipelineID .Signal () {
151
- case pipeline .SignalTraces :
152
- n .Component , err = builder .CreateTraces (ctx , set , next .(consumer.Traces ))
153
- case pipeline .SignalMetrics :
154
- n .Component , err = builder .CreateMetrics (ctx , set , next .(consumer.Metrics ))
155
- case pipeline .SignalLogs :
156
- n .Component , err = builder .CreateLogs (ctx , set , next .(consumer.Logs ))
157
- case componentprofiles .SignalProfiles :
158
- n .Component , err = builder .CreateProfiles (ctx , set , next .(consumerprofiles.Profiles ))
159
- default :
160
- return fmt .Errorf ("error creating processor %q in pipeline %q, data type %q is not supported" , set .ID , n .pipelineID .String (), n .pipelineID .Signal ())
161
- }
162
- if err != nil {
163
- return fmt .Errorf ("failed to create %q processor, in pipeline %q: %w" , set .ID , n .pipelineID .String (), err )
164
- }
165
- return nil
166
- }
167
-
168
- var _ consumerNode = (* exporterNode )(nil )
169
-
170
- // An exporter instance can be shared by multiple pipelines of the same type.
171
- // Therefore, nodeID is derived from "pipeline type" and "component ID".
172
- type exporterNode struct {
173
- nodeID
174
- componentID component.ID
175
- pipelineType pipeline.Signal
176
- component.Component
177
- }
178
-
179
- func newExporterNode (pipelineType pipeline.Signal , exprID component.ID ) * exporterNode {
180
- return & exporterNode {
181
- nodeID : newNodeID (exporterSeed , pipelineType .String (), exprID .String ()),
182
- componentID : exprID ,
183
- pipelineType : pipelineType ,
184
- }
185
- }
186
-
187
- func (n * exporterNode ) getConsumer () baseConsumer {
188
- return n .Component .(baseConsumer )
189
- }
190
-
191
- func (n * exporterNode ) buildComponent (
192
- ctx context.Context ,
193
- tel component.TelemetrySettings ,
194
- info component.BuildInfo ,
195
- builder * builders.ExporterBuilder ,
196
- ) error {
197
- tel .Logger = components .ExporterLogger (tel .Logger , n .componentID , n .pipelineType )
198
- set := exporter.Settings {ID : n .componentID , TelemetrySettings : tel , BuildInfo : info }
199
- var err error
200
- switch n .pipelineType {
201
- case pipeline .SignalTraces :
202
- n .Component , err = builder .CreateTraces (ctx , set )
203
- case pipeline .SignalMetrics :
204
- n .Component , err = builder .CreateMetrics (ctx , set )
205
- case pipeline .SignalLogs :
206
- n .Component , err = builder .CreateLogs (ctx , set )
207
- case componentprofiles .SignalProfiles :
208
- n .Component , err = builder .CreateProfiles (ctx , set )
209
- default :
210
- return fmt .Errorf ("error creating exporter %q for data type %q is not supported" , set .ID , n .pipelineType )
211
- }
212
- if err != nil {
213
- return fmt .Errorf ("failed to create %q exporter for data type %q: %w" , set .ID , n .pipelineType , err )
214
- }
215
- return nil
216
- }
21
+ const connectorSeed = "connector"
217
22
218
23
var _ consumerNode = (* connectorNode )(nil )
219
24
@@ -420,52 +225,3 @@ func (n *connectorNode) buildComponent(
420
225
}
421
226
return nil
422
227
}
423
-
424
- var _ consumerNode = (* capabilitiesNode )(nil )
425
-
426
- // Every pipeline has a "virtual" capabilities node immediately after the receiver(s).
427
- // There are two purposes for this node:
428
- // 1. Present aggregated capabilities to receivers, such as whether the pipeline mutates data.
429
- // 2. Present a consistent "first consumer" for each pipeline.
430
- // The nodeID is derived from "pipeline ID".
431
- type capabilitiesNode struct {
432
- nodeID
433
- pipelineID pipeline.ID
434
- baseConsumer
435
- consumer.ConsumeTracesFunc
436
- consumer.ConsumeMetricsFunc
437
- consumer.ConsumeLogsFunc
438
- consumerprofiles.ConsumeProfilesFunc
439
- }
440
-
441
- func newCapabilitiesNode (pipelineID pipeline.ID ) * capabilitiesNode {
442
- return & capabilitiesNode {
443
- nodeID : newNodeID (capabilitiesSeed , pipelineID .String ()),
444
- pipelineID : pipelineID ,
445
- }
446
- }
447
-
448
- func (n * capabilitiesNode ) getConsumer () baseConsumer {
449
- return n
450
- }
451
-
452
- var _ consumerNode = (* fanOutNode )(nil )
453
-
454
- // Each pipeline has one fan-out node before exporters.
455
- // Therefore, nodeID is derived from "pipeline ID".
456
- type fanOutNode struct {
457
- nodeID
458
- pipelineID pipeline.ID
459
- baseConsumer
460
- }
461
-
462
- func newFanOutNode (pipelineID pipeline.ID ) * fanOutNode {
463
- return & fanOutNode {
464
- nodeID : newNodeID (fanOutToExporters , pipelineID .String ()),
465
- pipelineID : pipelineID ,
466
- }
467
- }
468
-
469
- func (n * fanOutNode ) getConsumer () baseConsumer {
470
- return n .baseConsumer
471
- }
0 commit comments