@@ -7,22 +7,25 @@ import (
77 "context"
88 "errors"
99 "fmt"
10+ "runtime"
1011 "sort"
1112 "strings"
1213 "sync"
1314
15+ arrowPkg "github.com/apache/arrow/go/v16/arrow"
1416 "go.opentelemetry.io/collector/client"
1517 "go.opentelemetry.io/collector/component"
16- "go.opentelemetry.io/collector/consumer"
1718 "go.opentelemetry.io/collector/consumer/consumererror"
1819 "go.opentelemetry.io/collector/exporter"
19- "go.opentelemetry.io/collector/exporter/exporterhelper"
2020 "go.opentelemetry.io/collector/pdata/plog"
2121 "go.opentelemetry.io/collector/pdata/pmetric"
2222 "go.opentelemetry.io/collector/pdata/ptrace"
2323 "go.opentelemetry.io/otel/attribute"
2424 "go.uber.org/multierr"
2525 "google.golang.org/grpc/metadata"
26+
27+ "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/compression/zstd"
28+ "github.com/open-telemetry/opentelemetry-collector-contrib/internal/otelarrow/netstats"
2629)
2730
2831var (
@@ -38,6 +41,10 @@ type metadataExporter struct {
3841
3942 metadataKeys []string
4043 exporters sync.Map
44+ netReporter * netstats.NetworkReporter
45+
46+ // Default user-agent header.
47+ userAgent string
4148
4249 // Guards the size and the storing logic to ensure no more than limit items are stored.
4350 // If we are willing to allow "some" extra items than the limit this can be removed and size can be made atomic.
@@ -49,20 +56,40 @@ var _ exp = (*metadataExporter)(nil)
4956
5057func newMetadataExporter (cfg component.Config , set exporter.Settings , streamClientFactory streamClientFactory ) (exp , error ) {
5158 oCfg := cfg .(* Config )
59+ if oCfg .Endpoint == "" {
60+ return nil , errors .New ("OTLP exporter config requires an Endpoint" )
61+ }
62+
63+ netReporter , err := netstats .NewExporterNetworkReporter (set )
64+ if err != nil {
65+ return nil , err
66+ }
67+ userAgent := fmt .Sprintf ("%s/%s (%s/%s)" ,
68+ set .BuildInfo .Description , set .BuildInfo .Version , runtime .GOOS , runtime .GOARCH )
69+
70+ if ! oCfg .Arrow .Disabled {
71+ // Ignoring an error because Validate() was called.
72+ _ = zstd .SetEncoderConfig (oCfg .Arrow .Zstd )
73+
74+ userAgent += fmt .Sprintf (" ApacheArrow/%s (NumStreams/%d)" , arrowPkg .PkgVersion , oCfg .Arrow .NumStreams )
75+ }
76+
5277 // use lower-case, to be consistent with http/2 headers.
5378 mks := make ([]string , len (oCfg .MetadataKeys ))
5479 for i , k := range oCfg .MetadataKeys {
5580 mks [i ] = strings .ToLower (k )
5681 }
5782 sort .Strings (mks )
5883 if len (mks ) == 0 {
59- return newExporter (cfg , set , streamClientFactory )
84+ return newExporter (cfg , set , streamClientFactory , userAgent , netReporter )
6085 }
6186 return & metadataExporter {
6287 config : oCfg ,
6388 settings : set ,
6489 scf : streamClientFactory ,
6590 metadataKeys : mks ,
91+ userAgent : userAgent ,
92+ netReporter : netReporter ,
6693 }, nil
6794}
6895
@@ -74,17 +101,6 @@ func (e *metadataExporter) getConfig() component.Config {
74101 return e .config
75102}
76103
77- func (e * metadataExporter ) helperOptions () []exporterhelper.Option {
78- return []exporterhelper.Option {
79- exporterhelper .WithCapabilities (consumer.Capabilities {MutatesData : false }),
80- exporterhelper .WithTimeout (e .config .TimeoutSettings ),
81- exporterhelper .WithRetry (e .config .RetryConfig ),
82- exporterhelper .WithQueue (e .config .QueueSettings ),
83- exporterhelper .WithStart (e .start ),
84- exporterhelper .WithShutdown (e .shutdown ),
85- }
86- }
87-
88104func (e * metadataExporter ) start (_ context.Context , host component.Host ) (err error ) {
89105 e .host = host
90106 return nil
@@ -145,7 +161,7 @@ func (e *metadataExporter) getOrCreateExporter(ctx context.Context, s attribute.
145161 return nil , errTooManyExporters
146162 }
147163
148- newExp , err := newExporter (e .config , e .settings , e .scf )
164+ newExp , err := newExporter (e .config , e .settings , e .scf , e . userAgent , e . netReporter )
149165 if err != nil {
150166 return nil , fmt .Errorf ("failed to create exporter: %w" , err )
151167 }
0 commit comments