@@ -28,8 +28,6 @@ import (
2828var (
2929 // errTooManyExporters is returned when the MetadataCardinalityLimit has been reached.
3030 errTooManyExporters = consumererror .NewPermanent (errors .New ("too many exporter metadata-value combinations" ))
31- // errUnexpectedType is returned when the object in the map isn't the expected type
32- errUnexpectedType = errors .New ("unexpected type in map" )
3331)
3432
3533type metadataExporter struct {
@@ -95,11 +93,7 @@ func (e *metadataExporter) start(_ context.Context, host component.Host) (err er
9593func (e * metadataExporter ) shutdown (ctx context.Context ) error {
9694 var err error
9795 e .exporters .Range (func (_ any , value any ) bool {
98- be , ok := value .(exp )
99- if ! ok {
100- err = multierr .Append (err , fmt .Errorf ("%w: %T" , errUnexpectedType , value ))
101- return true
102- }
96+ be := value .(exp )
10397 err = multierr .Append (err , be .shutdown (ctx ))
10498 return true
10599 })
@@ -140,45 +134,42 @@ func (e *metadataExporter) pushLogs(ctx context.Context, ld plog.Logs) error {
140134
141135func (e * metadataExporter ) getOrCreateExporter (ctx context.Context , s attribute.Set , md metadata.MD ) (exp , error ) {
142136 v , ok := e .exporters .Load (s )
143- if ! ok {
144- e .lock .Lock ()
145- if e .config .MetadataCardinalityLimit != 0 && e .size >= int (e .config .MetadataCardinalityLimit ) {
146- e .lock .Unlock ()
147- return nil , errTooManyExporters
148- }
137+ if ok {
138+ return v .(exp ), nil
139+ }
149140
150- newExp , err := newExporter (e .config , e .settings , e .scf )
151- if err != nil {
152- return nil , fmt .Errorf ("failed to create exporter: %w" , err )
153- }
141+ e .lock .Lock ()
142+ defer e .lock .Unlock ()
154143
155- var loaded bool
156- v , loaded = e .exporters .LoadOrStore (s , newExp )
157- if ! loaded {
158- // Start the goroutine only if we added the object to the map, otherwise is already started.
159- be , valid := newExp .(* baseExporter )
160- if ! valid {
161- return nil , fmt .Errorf ("%w: %T" , errUnexpectedType , newExp )
162- }
163- // set metadata keys for base exporter to add them to the outgoing context.
164- be .setMetadata (md )
165-
166- err = newExp .start (ctx , e .host )
167- if err != nil {
168- e .exporters .Delete (s )
169- return nil , fmt .Errorf ("failed to start exporter: %w" , err )
170- }
171- e .size ++
172- }
173- e .lock .Unlock ()
144+ if e .config .MetadataCardinalityLimit != 0 && e .size >= int (e .config .MetadataCardinalityLimit ) {
145+ return nil , errTooManyExporters
146+ }
147+
148+ newExp , err := newExporter (e .config , e .settings , e .scf )
149+ if err != nil {
150+ return nil , fmt .Errorf ("failed to create exporter: %w" , err )
174151 }
175- val , ok := v .(exp )
176- if ! ok {
177- return nil , fmt .Errorf ("%w: %T" , errUnexpectedType , v )
152+
153+ var loaded bool
154+ v , loaded = e .exporters .LoadOrStore (s , newExp )
155+ if ! loaded {
156+ // set metadata keys for base exporter to add them to the outgoing context.
157+ newExp .(* baseExporter ).setMetadata (md )
158+
159+ // Start the goroutine only if we added the object to the map, otherwise is already started.
160+ err = newExp .start (ctx , e .host )
161+ if err != nil {
162+ e .exporters .Delete (s )
163+ return nil , fmt .Errorf ("failed to start exporter: %w" , err )
164+ }
165+ e .size ++
178166 }
179- return val , nil
167+
168+ return v .(exp ), nil
180169}
181170
171+ // getAttrSet is code taken from the core collector's batchprocessor multibatch logic.
172+ // https://github.com/open-telemetry/opentelemetry-collector/blob/v0.107.0/processor/batchprocessor/batch_processor.go#L298
182173func (e * metadataExporter ) getAttrSet (ctx context.Context , keys []string ) (attribute.Set , metadata.MD ) {
183174 // Get each metadata key value, form the corresponding
184175 // attribute set for use as a map lookup key.
0 commit comments