Skip to content

Commit 468b35b

Browse files
authored
Add resource processor extractor (#330)
* Add resource processor extractor * avoid needing to change deps * Reset the go mods to original * More reverts
1 parent 4140f6d commit 468b35b

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

processor/loghouseprocessor/processor.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ func (p *logProcessor) ConsumeLogs(ctx context.Context, l plog.Logs) error {
5555
if err != nil {
5656
p.logger.Debug("failed to parse log line", zap.Error(err))
5757
}
58+
// This does have a "last line wins" if we have somehow set the same key with different values.
59+
// We are just going to ignore this case for now though.
60+
promoteResourceAttrs(&logLine, &rlogs)
5861
}
5962
}
6063
}
@@ -144,6 +147,28 @@ func processJSONLog(l *plog.LogRecord) {
144147
}
145148
}
146149

150+
func promoteResourceAttrs(l *plog.LogRecord, rlogs *plog.ResourceLogs) {
151+
attributes, ok := l.Attributes().Get("resource")
152+
if !ok {
153+
return
154+
}
155+
merged := MergeRawMaps(rlogs.Resource().Attributes().AsRaw(), attributes.Map().AsRaw())
156+
rlogs.Resource().Attributes().FromRaw(merged)
157+
}
158+
159+
// MergeRawMaps merges n maps with a later map's keys overriding earlier maps. (copied to avoid dep hell)
160+
func MergeRawMaps(maps ...map[string]any) map[string]any {
161+
ret := map[string]any{}
162+
163+
for _, m := range maps {
164+
for k, v := range m {
165+
ret[k] = v
166+
}
167+
}
168+
169+
return ret
170+
}
171+
147172
// Both funcs copied from: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/ottl/contexts/internal/ids.go#L25
148173

149174
func ParseSpanID(spanIDStr string) (pcommon.SpanID, error) {

processor/loghouseprocessor/processor_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,3 +286,66 @@ func Test_promoteTraceAndSpan(t *testing.T) {
286286
})
287287
}
288288
}
289+
290+
func Test_promoteResourceAttrs(t *testing.T) {
291+
t.Run("single log", func(t *testing.T) {
292+
rl := plog.NewResourceLogs()
293+
l := plog.NewLogRecord()
294+
l.Attributes().FromRaw(map[string]any{"resource": map[string]any{"r1": "v1"}})
295+
296+
promoteResourceAttrs(&l, &rl)
297+
298+
val, ok := rl.Resource().Attributes().Get("r1")
299+
assert.True(t, ok)
300+
assert.Equal(t, "v1", val.Str())
301+
})
302+
303+
t.Run("two logs", func(t *testing.T) {
304+
rl := plog.NewResourceLogs()
305+
l1 := plog.NewLogRecord()
306+
l1.Attributes().FromRaw(map[string]any{"resource": map[string]any{"r1": "v1"}})
307+
l2 := plog.NewLogRecord()
308+
l2.Attributes().FromRaw(map[string]any{"resource": map[string]any{"r2": "v2"}})
309+
310+
promoteResourceAttrs(&l1, &rl)
311+
promoteResourceAttrs(&l2, &rl)
312+
313+
v1, ok := rl.Resource().Attributes().Get("r1")
314+
assert.True(t, ok)
315+
assert.Equal(t, "v1", v1.Str())
316+
317+
v2, ok := rl.Resource().Attributes().Get("r2")
318+
assert.True(t, ok)
319+
assert.Equal(t, "v2", v2.Str())
320+
})
321+
322+
t.Run("last wins", func(t *testing.T) {
323+
rl := plog.NewResourceLogs()
324+
l1 := plog.NewLogRecord()
325+
l1.Attributes().FromRaw(map[string]any{"resource": map[string]any{"r1": "v1"}})
326+
l2 := plog.NewLogRecord()
327+
l2.Attributes().FromRaw(map[string]any{"resource": map[string]any{"r1": "v2"}})
328+
329+
promoteResourceAttrs(&l1, &rl)
330+
promoteResourceAttrs(&l2, &rl)
331+
332+
v2, ok := rl.Resource().Attributes().Get("r1")
333+
assert.True(t, ok)
334+
assert.Equal(t, "v2", v2.Str())
335+
})
336+
337+
t.Run("overwrite original", func(t *testing.T) {
338+
rl := plog.NewResourceLogs()
339+
rl.Resource().Attributes().FromRaw(map[string]any{"r1": "original"})
340+
l1 := plog.NewLogRecord()
341+
l1.Attributes().FromRaw(map[string]any{"resource": map[string]any{"r1": "v1"}})
342+
343+
promoteResourceAttrs(&l1, &rl)
344+
345+
v1, ok := rl.Resource().Attributes().Get("r1")
346+
assert.True(t, ok)
347+
assert.Equal(t, "v1", v1.Str())
348+
349+
})
350+
351+
}

0 commit comments

Comments
 (0)