@@ -23,6 +23,7 @@ var isColdStart = true
2323// LogSender interface which needs to be implemented to send logs
2424type LogSender interface {
2525 SendLogs (context.Context , []byte ) error
26+ SendAllLogs (context.Context , [][]byte ) error
2627 FlushAll ([][]byte ) error
2728}
2829
@@ -279,8 +280,61 @@ func (s *sumoLogicClient) SendLogs(ctx context.Context, rawmsg []byte) error {
279280 return nil
280281}
281282
283+ func (s * sumoLogicClient ) SendAllLogs (ctx context.Context , allMessages [][]byte ) error {
284+ if (len (allMessages ) == 0 ) {
285+ s .logger .Debugf ("SendAllLogs: No messages to send" )
286+ return nil
287+ }
288+
289+ s .logger .Debugf ("SendAllLogs: Attempting to send %d payloads from dataqueue to SumoLogic" , len (allMessages ))
290+
291+ var errorCount int = 0
292+ var totalitems int = 0
293+ var payload responseBody
294+ for _ , rawmsg := range allMessages {
295+ // converting to arr of maps
296+ msgArr , err := s .transformBytesToArrayOfMap (rawmsg )
297+ if err != nil {
298+ s .logger .Error ("SendAllLogs: Error in transforming bytes to array of struct" , err .Error ())
299+ errorCount ++
300+ continue
301+ }
302+
303+ if len (msgArr ) > 0 {
304+ // enhancing logs
305+ s .enhanceLogs (msgArr )
306+ totalitems += len (msgArr )
307+ // converting back to string
308+ for _ , item := range msgArr {
309+ payload = append (payload , item )
310+ }
311+ }
312+ }
313+ s .logger .Debugf ("SendAllLogs: Enhanced TotalLogItems - %d \n " , totalitems )
314+ // converting back to chunks of string
315+ chunks , err := s .createChunks (payload )
316+ if err != nil {
317+ return fmt .Errorf ("SendAllLogs: CreateChunks failed - %v" , err )
318+ }
319+ for _ , strobj := range chunks {
320+ err := s .postToSumo (ctx , & strobj )
321+ if err != nil {
322+ errorCount ++
323+ }
324+ }
325+ if errorCount > 0 {
326+ err = fmt .Errorf ("SendAllLogs: Errors during postToSumo - %d" , errorCount )
327+ return err
328+ } else {
329+ s .logger .Debugf ("SendAllLogs: Sent TotalChunks - %d \n " , totalitems )
330+ }
331+
332+ return nil
333+ }
334+
282335func (s * sumoLogicClient ) postToSumo (ctx context.Context , logStringToSend * string ) error {
283- s .logger .Debug ("Attempting to send to Sumo Endpoint" )
336+
337+ s .logger .Debug ("postToSumo: Attempting to send to Sumo Endpoint" )
284338
285339 // compressing here because Sumo recommends payload size of 1MB before compression
286340 bytedata := utils .Compress (logStringToSend )
@@ -295,39 +349,39 @@ func (s *sumoLogicClient) postToSumo(ctx context.Context, logStringToSend *strin
295349 defer response .Body .Close ()
296350 }
297351 if (err != nil ) || (response .StatusCode != 200 && response .StatusCode != 302 && response .StatusCode < 500 ) {
298- s .logger .Errorf ("Not able to post statuscode: %v %v\n " , err , response )
352+ s .logger .Errorf ("postToSumo: Not able to post statuscode - %v %v\n " , err , response )
299353 err := utils .Retry (func (attempt int ) (bool , error ) {
300- s .logger .Debugf ("Waiting for %v ms for retry attempt: %v\n " , s .config .RetrySleepTime , attempt )
354+ s .logger .Debugf ("postToSumo: Waiting for %v ms for retry attempt - %v\n " , s .config .RetrySleepTime , attempt )
301355 time .Sleep (s .config .RetrySleepTime )
302356 buf := createBuffer ()
303357 retryResponse , errRetry := s .makeRequest (ctx , buf )
304358 if (errRetry != nil ) || (retryResponse .StatusCode != 200 && retryResponse .StatusCode != 302 && retryResponse .StatusCode < 500 ) {
305359 if errRetry == nil {
306360 errRetry = fmt .Errorf ("statuscode %v" , retryResponse .StatusCode )
307361 }
308- s .logger .Error ("Not able to post: " , errRetry )
362+ s .logger .Error ("postToSumo: Not able to post - " , errRetry )
309363 return attempt < s .config .MaxRetryAttempts , errRetry
310364 } else if retryResponse .StatusCode == 200 {
311- s .logger .Debugf ("Post of logs successful after retry %v attempts\n " , attempt )
365+ s .logger .Debugf ("postToSumo: Post of logs successful after retry %v attempts\n " , attempt )
312366 return true , nil
313367 }
314368 return attempt < s .config .MaxRetryAttempts , errRetry
315369 }, s .config .NumRetry )
316370 if err != nil {
317- s .logger .Error ("Finished retrying Error: " , err )
371+ s .logger .Error ("postToSumo: Finished retrying Error - " , err )
318372 if s .config .EnableFailover {
319373 buf = createBuffer ()
320374 err := s .failoverHandler (buf )
321375 if err != nil {
322- s .logger .Errorf ("Dropping messages as post to S3 failed: %v\n " , err )
376+ s .logger .Errorf ("postToSumo: Dropping messages as post to S3 failed - %v\n " , err )
323377 return err
324378 }
325379 } else {
326- s .logger .Info ("Dropping messages as no failover enabled." )
380+ s .logger .Info ("postToSumo: Dropping messages as no failover enabled." )
327381 }
328382 }
329383 } else if response .StatusCode == 200 {
330- s .logger .Debugf ("Post of logs successful" )
384+ s .logger .Debugf ("postToSumo: Post of logs successful" )
331385 }
332386
333387 return nil
0 commit comments