@@ -39,6 +39,7 @@ type emfExporter struct {
3939 pusherMap map [cwlogs.StreamKey ]cwlogs.Pusher
4040 svcStructuredLog * cwlogs.Client
4141 config * Config
42+ set exporter.Settings
4243
4344 metricTranslator metricTranslator
4445
@@ -57,42 +58,23 @@ func newEmfExporter(config *Config, set exporter.Settings) (*emfExporter, error)
5758
5859 config .logger = set .Logger
5960
60- // create AWS session
61- awsConfig , session , err := awsutil .GetAWSConfigSession (set .Logger , & awsutil.Conn {}, & config .AWSSessionSettings )
62- if err != nil {
63- return nil , err
64- }
65-
66- // create CWLogs client with aws session config
67- svcStructuredLog := cwlogs .NewClient (set .Logger ,
68- awsConfig ,
69- set .BuildInfo ,
70- config .LogGroupName ,
71- config .LogRetention ,
72- config .Tags ,
73- session ,
74- cwlogs .WithEnabledContainerInsights (config .IsEnhancedContainerInsights ()),
75- cwlogs .WithEnabledAppSignals (config .IsAppSignalsEnabled ()),
76- )
77-
7861 collectorIdentifier , err := uuid .NewRandom ()
7962 if err != nil {
8063 return nil , err
8164 }
8265
66+ // Initialize emfExporter without AWS session and structured logs
8367 emfExporter := & emfExporter {
84- svcStructuredLog : svcStructuredLog ,
8568 config : config ,
8669 metricTranslator : newMetricTranslator (* config ),
87- retryCnt : * awsConfig .MaxRetries ,
70+ retryCnt : config . AWSSessionSettings .MaxRetries ,
8871 collectorID : collectorIdentifier .String (),
8972 pusherMap : map [cwlogs.StreamKey ]cwlogs.Pusher {},
9073 processResourceLabels : func (map [string ]string ) {},
9174 }
9275
9376 if config .IsAppSignalsEnabled () {
9477 userAgent := appsignals .NewUserAgent ()
95- svcStructuredLog .Handlers ().Build .PushBackNamed (userAgent .Handler ())
9678 emfExporter .processResourceLabels = userAgent .Process
9779 }
9880
@@ -148,7 +130,10 @@ func (emf *emfExporter) pushMetricsData(_ context.Context, md pmetric.Metrics) e
148130 fmt .Println (* putLogEvent .InputLogEvent .Message )
149131 }
150132 } else if strings .EqualFold (outputDestination , outputDestinationCloudWatch ) {
151- emfPusher := emf .getPusher (putLogEvent .StreamKey )
133+ emfPusher , err := emf .getPusher (putLogEvent .StreamKey )
134+ if err != nil {
135+ return fmt .Errorf ("failed to get pusher: %w" , err )
136+ }
152137 if emfPusher != nil {
153138 returnError := emfPusher .AddLogEntry (putLogEvent )
154139 if returnError != nil {
@@ -177,12 +162,24 @@ func (emf *emfExporter) pushMetricsData(_ context.Context, md pmetric.Metrics) e
177162 return nil
178163}
179164
180- func (emf * emfExporter ) getPusher (key cwlogs.StreamKey ) cwlogs.Pusher {
181- var ok bool
182- if _ , ok = emf .pusherMap [key ]; ! ok {
183- emf .pusherMap [key ] = cwlogs .NewPusher (key , emf .retryCnt , * emf .svcStructuredLog , emf .config .logger )
165+ func (emf * emfExporter ) getPusher (key cwlogs.StreamKey ) (cwlogs.Pusher , error ) {
166+ emf .pusherMapLock .Lock ()
167+ defer emf .pusherMapLock .Unlock ()
168+
169+ if emf .svcStructuredLog == nil {
170+ return nil , errors .New ("CloudWatch Logs client not initialized" )
184171 }
185- return emf .pusherMap [key ]
172+
173+ pusher , exists := emf .pusherMap [key ]
174+ if ! exists {
175+ if emf .set .Logger != nil {
176+ pusher = cwlogs .NewPusher (key , emf .retryCnt , * emf .svcStructuredLog , emf .set .Logger )
177+ } else {
178+ pusher = cwlogs .NewPusher (key , emf .retryCnt , * emf .svcStructuredLog , emf .config .logger )
179+ }
180+ emf .pusherMap [key ] = pusher
181+ }
182+ return pusher , nil
186183}
187184
188185func (emf * emfExporter ) listPushers () []cwlogs.Pusher {
@@ -197,9 +194,32 @@ func (emf *emfExporter) listPushers() []cwlogs.Pusher {
197194}
198195
199196func (emf * emfExporter ) start (_ context.Context , host component.Host ) error {
197+ // Create AWS session here
198+ awsConfig , session , err := awsutil .GetAWSConfigSession (emf .config .logger , & awsutil.Conn {}, & emf .config .AWSSessionSettings )
199+ if err != nil {
200+ return err
201+ }
202+
203+ // create CWLogs client with aws session config
204+ svcStructuredLog := cwlogs .NewClient (emf .config .logger ,
205+ awsConfig ,
206+ emf .set .BuildInfo ,
207+ emf .config .LogGroupName ,
208+ emf .config .LogRetention ,
209+ emf .config .Tags ,
210+ session ,
211+ cwlogs .WithEnabledContainerInsights (emf .config .IsEnhancedContainerInsights ()),
212+ cwlogs .WithEnabledAppSignals (emf .config .IsAppSignalsEnabled ()),
213+ )
214+
215+ // Assign to the struct
216+ emf .svcStructuredLog = svcStructuredLog
217+
218+ // Optionally configure middleware
200219 if emf .config .MiddlewareID != nil {
201- awsmiddleware .TryConfigure (emf .config .logger , host , * emf .config .MiddlewareID , awsmiddleware .SDKv1 (emf . svcStructuredLog .Handlers ()))
220+ awsmiddleware .TryConfigure (emf .config .logger , host , * emf .config .MiddlewareID , awsmiddleware .SDKv1 (svcStructuredLog .Handlers ()))
202221 }
222+
203223 return nil
204224}
205225
0 commit comments