@@ -8,104 +8,124 @@ import (
88 "errors"
99
1010 "go.opentelemetry.io/collector/exporter/exporterbatcher"
11+ "go.opentelemetry.io/collector/exporter/exporterhelper/internal/sizer"
1112 "go.opentelemetry.io/collector/pdata/plog"
1213)
1314
15+ func sizerFromConfig (cfg exporterbatcher.SizeConfig ) sizer.LogsSizer {
16+ switch cfg .Sizer {
17+ case exporterbatcher .SizerTypeItems :
18+ return & sizer.LogsCountSizer {}
19+ case exporterbatcher .SizerTypeBytes :
20+ return & sizer.LogsBytesSizer {}
21+ default :
22+ return & sizer.LogsCountSizer {}
23+ }
24+ }
25+
1426// MergeSplit splits and/or merges the provided logs request and the current request into one or more requests
1527// conforming with the MaxSizeConfig.
1628func (req * logsRequest ) MergeSplit (_ context.Context , cfg exporterbatcher.SizeConfig , r2 Request ) ([]Request , error ) {
29+ sizer := sizerFromConfig (cfg )
1730 if r2 != nil {
1831 req2 , ok := r2 .(* logsRequest )
1932 if ! ok {
2033 return nil , errors .New ("invalid input type" )
2134 }
22- req2 .mergeTo (req )
35+ req2 .mergeTo (req , sizer )
2336 }
2437
2538 // If no limit we can simply merge the new request into the current and return.
2639 if cfg .MaxSize == 0 {
2740 return []Request {req }, nil
2841 }
29- return req .split (cfg )
42+
43+ return req .split (cfg .MaxSize , sizer ), nil
3044}
3145
32- func (req * logsRequest ) mergeTo (dst * logsRequest ) {
33- dst .setCachedItemsCount (dst .ItemsCount () + req .ItemsCount ())
34- req .setCachedItemsCount (0 )
46+ func (req * logsRequest ) mergeTo (dst * logsRequest , sizer sizer.LogsSizer ) {
47+ if sizer != nil {
48+ dst .setCachedSize (dst .Size (sizer ) + req .Size (sizer ))
49+ req .setCachedSize (0 )
50+ }
3551 req .ld .ResourceLogs ().MoveAndAppendTo (dst .ld .ResourceLogs ())
3652}
3753
38- func (req * logsRequest ) split (cfg exporterbatcher. SizeConfig ) ( []Request , error ) {
54+ func (req * logsRequest ) split (maxSize int , sizer sizer. LogsSizer ) []Request {
3955 var res []Request
40- for req .ItemsCount ( ) > cfg . MaxSize {
41- ld := extractLogs (req .ld , cfg . MaxSize )
42- size := ld . LogRecordCount ( )
43- req .setCachedItemsCount (req .ItemsCount ( ) - size )
44- res = append (res , & logsRequest {ld : ld , pusher : req .pusher , cachedItemsCount : size })
56+ for req .Size ( sizer ) > maxSize {
57+ ld := extractLogs (req .ld , maxSize , sizer )
58+ size := sizer . LogsSize ( ld )
59+ req .setCachedSize (req .Size ( sizer ) - size )
60+ res = append (res , & logsRequest {ld : ld , pusher : req .pusher , cachedSize : size })
4561 }
4662 res = append (res , req )
47- return res , nil
63+ return res
4864}
4965
5066// extractLogs extracts logs from the input logs and returns a new logs with the specified number of log records.
51- func extractLogs (srcLogs plog.Logs , count int ) plog.Logs {
67+ func extractLogs (srcLogs plog.Logs , capacity int , sizer sizer.LogsSizer ) plog.Logs {
68+ capacityReached := false
5269 destLogs := plog .NewLogs ()
70+ capacityLeft := capacity - sizer .LogsSize (destLogs )
5371 srcLogs .ResourceLogs ().RemoveIf (func (srcRL plog.ResourceLogs ) bool {
54- if count == 0 {
72+ if capacityReached {
5573 return false
5674 }
57- needToExtract := resourceLogsCount (srcRL ) > count
75+ needToExtract := sizer . ResourceLogsSize (srcRL ) > capacityLeft
5876 if needToExtract {
59- srcRL = extractResourceLogs (srcRL , count )
77+ srcRL , capacityReached = extractResourceLogs (srcRL , capacityLeft , sizer )
78+ if srcRL .ScopeLogs ().Len () == 0 {
79+ return false
80+ }
6081 }
61- count -= resourceLogsCount ( srcRL )
82+ capacityLeft -= sizer . DeltaSize ( sizer . ResourceLogsSize ( srcRL ) )
6283 srcRL .MoveTo (destLogs .ResourceLogs ().AppendEmpty ())
6384 return ! needToExtract
6485 })
6586 return destLogs
6687}
6788
6889// extractResourceLogs extracts resource logs and returns a new resource logs with the specified number of log records.
69- func extractResourceLogs (srcRL plog.ResourceLogs , count int ) plog.ResourceLogs {
90+ func extractResourceLogs (srcRL plog.ResourceLogs , capacity int , sizer sizer.LogsSizer ) (plog.ResourceLogs , bool ) {
91+ capacityReached := false
7092 destRL := plog .NewResourceLogs ()
7193 destRL .SetSchemaUrl (srcRL .SchemaUrl ())
7294 srcRL .Resource ().CopyTo (destRL .Resource ())
95+ capacityLeft := capacity - sizer .ResourceLogsSize (destRL )
7396 srcRL .ScopeLogs ().RemoveIf (func (srcSL plog.ScopeLogs ) bool {
74- if count == 0 {
97+ if capacityReached {
7598 return false
7699 }
77- needToExtract := srcSL . LogRecords (). Len () > count
100+ needToExtract := sizer . ScopeLogsSize ( srcSL ) > capacityLeft
78101 if needToExtract {
79- srcSL = extractScopeLogs (srcSL , count )
102+ srcSL , capacityReached = extractScopeLogs (srcSL , capacityLeft , sizer )
103+ if srcSL .LogRecords ().Len () == 0 {
104+ return false
105+ }
80106 }
81- count -= srcSL . LogRecords (). Len ( )
107+ capacityLeft -= sizer . DeltaSize ( sizer . ScopeLogsSize ( srcSL ) )
82108 srcSL .MoveTo (destRL .ScopeLogs ().AppendEmpty ())
83109 return ! needToExtract
84110 })
85- return destRL
111+ return destRL , capacityReached
86112}
87113
88114// extractScopeLogs extracts scope logs and returns a new scope logs with the specified number of log records.
89- func extractScopeLogs (srcSL plog.ScopeLogs , count int ) plog.ScopeLogs {
115+ func extractScopeLogs (srcSL plog.ScopeLogs , capacity int , sizer sizer.LogsSizer ) (plog.ScopeLogs , bool ) {
116+ capacityReached := false
90117 destSL := plog .NewScopeLogs ()
91118 destSL .SetSchemaUrl (srcSL .SchemaUrl ())
92119 srcSL .Scope ().CopyTo (destSL .Scope ())
120+ capacityLeft := capacity - sizer .ScopeLogsSize (destSL )
93121 srcSL .LogRecords ().RemoveIf (func (srcLR plog.LogRecord ) bool {
94- if count == 0 {
122+ if capacityReached || sizer .LogRecordSize (srcLR ) > capacityLeft {
123+ capacityReached = true
95124 return false
96125 }
126+ capacityLeft -= sizer .DeltaSize (sizer .LogRecordSize (srcLR ))
97127 srcLR .MoveTo (destSL .LogRecords ().AppendEmpty ())
98- count --
99128 return true
100129 })
101- return destSL
102- }
103-
104- // resourceLogsCount calculates the total number of log records in the plog.ResourceLogs.
105- func resourceLogsCount (rl plog.ResourceLogs ) int {
106- count := 0
107- for k := 0 ; k < rl .ScopeLogs ().Len (); k ++ {
108- count += rl .ScopeLogs ().At (k ).LogRecords ().Len ()
109- }
110- return count
130+ return destSL , capacityReached
111131}
0 commit comments