@@ -16,18 +16,19 @@ import (
16
16
"go.opentelemetry.io/collector/confmap"
17
17
"go.opentelemetry.io/collector/extension"
18
18
"go.opentelemetry.io/collector/service/internal/components"
19
- "go.opentelemetry.io/collector/service/internal/servicetelemetry "
19
+ "go.opentelemetry.io/collector/service/internal/status "
20
20
"go.opentelemetry.io/collector/service/internal/zpages"
21
21
)
22
22
23
23
const zExtensionName = "zextensionname"
24
24
25
25
// Extensions is a map of extensions created from extension configs.
26
26
type Extensions struct {
27
- telemetry servicetelemetry .TelemetrySettings
27
+ telemetry component .TelemetrySettings
28
28
extMap map [component.ID ]extension.Extension
29
29
instanceIDs map [component.ID ]* component.InstanceID
30
30
extensionIDs []component.ID // start order (and reverse stop order)
31
+ reporter status.Reporter
31
32
}
32
33
33
34
// Start starts all extensions.
@@ -38,20 +39,20 @@ func (bes *Extensions) Start(ctx context.Context, host component.Host) error {
38
39
extLogger .Info ("Extension is starting..." )
39
40
instanceID := bes .instanceIDs [extID ]
40
41
ext := bes .extMap [extID ]
41
- bes .telemetry . Status .ReportStatus (
42
+ bes .reporter .ReportStatus (
42
43
instanceID ,
43
44
component .NewStatusEvent (component .StatusStarting ),
44
45
)
45
46
if err := ext .Start (ctx , host ); err != nil {
46
- bes .telemetry . Status .ReportStatus (
47
+ bes .reporter .ReportStatus (
47
48
instanceID ,
48
49
component .NewPermanentErrorEvent (err ),
49
50
)
50
51
// We log with zap.AddStacktrace(zap.DPanicLevel) to avoid adding the stack trace to the error log
51
52
extLogger .WithOptions (zap .AddStacktrace (zap .DPanicLevel )).Error ("Failed to start extension" , zap .Error (err ))
52
53
return err
53
54
}
54
- bes .telemetry . Status .ReportOKIfStarting (instanceID )
55
+ bes .reporter .ReportOKIfStarting (instanceID )
55
56
extLogger .Info ("Extension started." )
56
57
}
57
58
return nil
@@ -65,19 +66,19 @@ func (bes *Extensions) Shutdown(ctx context.Context) error {
65
66
extID := bes .extensionIDs [i ]
66
67
instanceID := bes .instanceIDs [extID ]
67
68
ext := bes .extMap [extID ]
68
- bes .telemetry . Status .ReportStatus (
69
+ bes .reporter .ReportStatus (
69
70
instanceID ,
70
71
component .NewStatusEvent (component .StatusStopping ),
71
72
)
72
73
if err := ext .Shutdown (ctx ); err != nil {
73
- bes .telemetry . Status .ReportStatus (
74
+ bes .reporter .ReportStatus (
74
75
instanceID ,
75
76
component .NewPermanentErrorEvent (err ),
76
77
)
77
78
errs = multierr .Append (errs , err )
78
79
continue
79
80
}
80
- bes .telemetry . Status .ReportStatus (
81
+ bes .reporter .ReportStatus (
81
82
instanceID ,
82
83
component .NewStatusEvent (component .StatusStopped ),
83
84
)
@@ -166,31 +167,46 @@ func (bes *Extensions) HandleZPages(w http.ResponseWriter, r *http.Request) {
166
167
167
168
// Settings holds configuration for building Extensions.
168
169
type Settings struct {
169
- Telemetry servicetelemetry .TelemetrySettings
170
+ Telemetry component .TelemetrySettings
170
171
BuildInfo component.BuildInfo
171
172
172
173
// Extensions builder for extensions.
173
174
Extensions * extension.Builder
174
175
}
175
176
177
+ type Option func (* Extensions )
178
+
179
+ func WithReporter (reporter status.Reporter ) Option {
180
+ return func (e * Extensions ) {
181
+ e .reporter = reporter
182
+ }
183
+ }
184
+
176
185
// New creates a new Extensions from Config.
177
- func New (ctx context.Context , set Settings , cfg Config ) (* Extensions , error ) {
186
+ func New (ctx context.Context , set Settings , cfg Config , options ... Option ) (* Extensions , error ) {
178
187
exts := & Extensions {
179
188
telemetry : set .Telemetry ,
180
189
extMap : make (map [component.ID ]extension.Extension ),
181
190
instanceIDs : make (map [component.ID ]* component.InstanceID ),
182
191
extensionIDs : make ([]component.ID , 0 , len (cfg )),
192
+ reporter : & nopReporter {},
193
+ }
194
+
195
+ for _ , opt := range options {
196
+ opt (exts )
183
197
}
198
+
184
199
for _ , extID := range cfg {
185
200
instanceID := & component.InstanceID {
186
201
ID : extID ,
187
202
Kind : component .KindExtension ,
188
203
}
189
204
extSet := extension.Settings {
190
205
ID : extID ,
191
- TelemetrySettings : set .Telemetry . ToComponentTelemetrySettings ( instanceID ) ,
206
+ TelemetrySettings : set .Telemetry ,
192
207
BuildInfo : set .BuildInfo ,
193
208
}
209
+ extSet .TelemetrySettings .ReportStatus = status .NewReportStatusFunc (instanceID , exts .reporter .ReportStatus )
194
210
extSet .TelemetrySettings .Logger = components .ExtensionLogger (set .Telemetry .Logger , extID )
195
211
196
212
ext , err := set .Extensions .Create (ctx , extSet )
@@ -213,3 +229,11 @@ func New(ctx context.Context, set Settings, cfg Config) (*Extensions, error) {
213
229
exts .extensionIDs = order
214
230
return exts , nil
215
231
}
232
+
233
+ type nopReporter struct {}
234
+
235
+ func (r * nopReporter ) Ready () {}
236
+
237
+ func (r * nopReporter ) ReportStatus (* component.InstanceID , * component.StatusEvent ) {}
238
+
239
+ func (r * nopReporter ) ReportOKIfStarting (* component.InstanceID ) {}
0 commit comments