Skip to content

Commit 0573e04

Browse files
committed
Initial commit
1 parent 72f7302 commit 0573e04

File tree

3 files changed

+57
-21
lines changed

3 files changed

+57
-21
lines changed

stacktrace_processor.go

+45-20
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,40 @@ import (
1616

1717
type stackTraceProcessor struct {
1818
nextConsumer consumer.Traces
19+
sourceMaps map[string][]byte
1920
}
2021

2122
func (s *stackTraceProcessor) Start(ctx context.Context, host component.Host) error {
23+
s.sourceMaps = make(map[string][]byte)
24+
files, err := os.ReadDir("testdata")
25+
if err != nil {
26+
return err
27+
}
28+
for _, file := range files {
29+
if strings.HasSuffix(file.Name(), ".map") {
30+
err := s.ReadSourceMap("testdata", file.Name())
31+
if err != nil {
32+
return err
33+
}
34+
}
35+
}
36+
return nil
37+
}
38+
39+
func (s *stackTraceProcessor) ReadSourceMap(path string, name string) error {
40+
fullPath := fmt.Sprintf("%s/%s", path, name)
41+
if path == "" {
42+
fullPath = name
43+
}
44+
file, err := os.Open(fullPath)
45+
if err != nil {
46+
return err
47+
}
48+
b, err := io.ReadAll(file)
49+
if err != nil {
50+
return err
51+
}
52+
s.sourceMaps[name] = b
2253
return nil
2354
}
2455

@@ -35,36 +66,36 @@ func (s *stackTraceProcessor) ConsumeTraces(ctx context.Context, td ptrace.Trace
3566
resourceSpan := td.ResourceSpans().At(resourceSpanId)
3667
sdkLanguage, valid := resourceSpan.Resource().Attributes().Get("telemetry.sdk.language")
3768
if valid && sdkLanguage.Str() == "webjs" {
38-
ConsumeScopeSpans(resourceSpan.ScopeSpans())
69+
s.ConsumeScopeSpans(resourceSpan.ScopeSpans())
3970
}
4071
}
4172
return s.nextConsumer.ConsumeTraces(ctx, td)
4273
}
4374

44-
func ConsumeScopeSpans(scopeSpans ptrace.ScopeSpansSlice) {
75+
func (s *stackTraceProcessor) ConsumeScopeSpans(scopeSpans ptrace.ScopeSpansSlice) {
4576
for scopeSpanId := 0; scopeSpanId < scopeSpans.Len(); scopeSpanId++ {
4677
spans := scopeSpans.At(scopeSpanId).Spans()
47-
ConsumeSpans(spans)
78+
s.ConsumeSpans(spans)
4879
}
4980
}
5081

51-
func ConsumeSpans(spans ptrace.SpanSlice) {
82+
func (s *stackTraceProcessor) ConsumeSpans(spans ptrace.SpanSlice) {
5283
for spanId := 0; spanId < spans.Len(); spanId++ {
5384
span := spans.At(spanId)
54-
ConsumeSpan(span)
85+
s.ConsumeSpan(span)
5586
}
5687
}
5788

58-
func ConsumeSpan(span ptrace.Span) {
89+
func (s *stackTraceProcessor) ConsumeSpan(span ptrace.Span) {
5990
for eventId := 0; eventId < span.Events().Len(); eventId++ {
6091
event := span.Events().At(eventId)
6192
if event.Name() == "exception" {
62-
ConsumeException(event)
93+
s.ConsumeException(event)
6394
}
6495
}
6596
}
6697

67-
func ConsumeException(event ptrace.SpanEvent) {
98+
func (s *stackTraceProcessor) ConsumeException(event ptrace.SpanEvent) {
6899
stacktrace, valid := event.Attributes().Get("exception.stacktrace")
69100
if valid != true {
70101
return
@@ -93,27 +124,21 @@ func ConsumeException(event ptrace.SpanEvent) {
93124
res = append(res, line)
94125
continue
95126
}
96-
file, err := os.Open(fmt.Sprintf("%s.map", sourceFile))
127+
mapFileName := fmt.Sprintf("%s.map", sourceFile)
128+
129+
smap, err := sourcemap.Parse(sourceFile, s.sourceMaps[mapFileName])
97130
if err != nil {
98131
res = append(res, line)
99132
continue
100133
}
101-
b, err := io.ReadAll(file)
102-
if err != nil {
134+
135+
finalFile, _, sourceLine, sourceColumn, ok := smap.Source(mapLine, mapColumn)
136+
if ok != true {
103137
res = append(res, line)
104138
continue
105139
}
106-
107-
smap, err := sourcemap.Parse(sourceFile, b)
108-
if err != nil {
109-
panic(err)
110-
}
111-
112-
finalFile, fn, sourceLine, sourceColumn, ok := smap.Source(mapLine, mapColumn)
113-
fmt.Println(finalFile, fn, sourceLine, sourceColumn, ok)
114140
res = append(res, fmt.Sprintf("%s@%s:%d:%d", trace, finalFile, sourceLine, sourceColumn))
115141
}
116-
fmt.Println(res)
117142
event.Attributes().PutStr("exception.stacktrace", strings.Join(res, "\n"))
118143
}
119144

stacktrace_processor_test.go

+11-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,16 @@ func TestBatchProcessorSpansDeliveredEnforceBatchSize(t *testing.T) {
2424

2525
td := GenerateTraces()
2626
assert.NoError(t, processor.ConsumeTraces(context.Background(), td))
27+
for {
28+
if sink.SpanCount() == 1 {
29+
break
30+
}
31+
}
32+
traces := sink.AllTraces()
33+
event := traces[0].ResourceSpans().At(0).ScopeSpans().At(0).Spans().At(0).Events().At(0)
34+
stackTrace, valid := event.Attributes().Get("exception.stacktrace")
35+
assert.True(t, valid)
36+
assert.Equal(t, "padStart@lib/lineSlicer.js:11:53\npadStart@http://localhost:4203/lineSlicers.min.js:1:228\n", stackTrace.Str())
2737

2838
require.NoError(t, processor.Shutdown(context.Background()))
2939
}
@@ -56,6 +66,6 @@ func fillExceptionSpan(span ptrace.Span) {
5666
ev0.SetName("exception")
5767
ev0.Attributes().PutStr("exception.type", "TypeError")
5868
ev0.Attributes().PutStr("exception.message", "symbol.viewBox.baseVal is null")
59-
ev0.Attributes().PutStr("exception.stacktrace", "loadSvg@http://localhost:4203/main.js:1514:21\nngOnInit/this.svgDefinition$<@http://localhost:4203/main.js:1397:23\nmap/</<@http://localhost:4203/vendor.js:47989:31\nOperatorSubscriber/this._next<@http://localhost:4203/vendor.js:47268:15\nnext@http://localhost:4203/vendor.js:46165:12\n_next@http://localhost:4203/vendor.js:46192:22\nnext@http://localhost:4203/vendor.js:46165:12\nmap/</<@http://localhost:4203/vendor.js:47989:18\nOperatorSubscriber/this._next<@http://localhost:4203/vendor.js:47268:15\nnext@http://localhost:4203/vendor.js:46165:12\nfilter/</<@http://localhost:4203/vendor.js:47771:175\nOperatorSubscriber/this._next<@http://localhost:4203/vendor.js:47268:15\nnext@http://localhost:4203/vendor.js:46165:12\ndoInnerSub/<@http://localhost:4203/vendor.js:48106:20\nOperatorSubscriber/this._next<@http://localhost:4203/vendor.js:47268:15\nnext@http://localhost:4203/vendor.js:46165:12\nswitchMap/</</innerSubscriber<@http://localhost:4203/vendor.js:48637:243\nOperatorSubscriber/this._next<@http://localhost:4203/vendor.js:47268:15\nnext@http://localhost:4203/vendor.js:46165:12\nonLoad@http://localhost:4203/vendor.js:83794:22\ninvokeTask@http://localhost:4203/polyfills.js:8205:171\nonInvokeTask@http://localhost:4203/vendor.js:110067:22\ninvokeTask@http://localhost:4203/polyfills.js:8205:54\nonInvokeTask@http://localhost:4203/vendor.js:110367:25\ninvokeTask@http://localhost:4203/polyfills.js:8205:54\nrunTask@http://localhost:4203/polyfills.js:8007:37\npatchRunTask@http://localhost:4203/vendor.js:3777:27\ninvokeTask@http://localhost:4203/polyfills.js:8282:26\ninvokeTask@http://localhost:4203/polyfills.js:9406:12\nglobalCallback@http://localhost:4203/polyfills.js:9447:33\nglobalZoneAwareCallback@http://localhost:4203/polyfills.js:9467:12\nEventListener.handleEvent*customScheduleGlobal@http://localhost:4203/polyfills.js:9555:37\nscheduleTask@http://localhost:4203/polyfills.js:8195:16\nonScheduleTask@http://localhost:4203/vendor.js:110060:21\nscheduleTask@http://localhost:4203/polyfills.js:8190:43\nonScheduleTask@http://localhost:4203/polyfills.js:8107:61\nscheduleTask@http://localhost:4203/polyfills.js:8190:43\nscheduleTask@http://localhost:4203/polyfills.js:8046:35\npatchScheduleTask@http://localhost:4203/vendor.js:3740:25\nscheduleEventTask@http://localhost:4203/polyfills.js:8071:19\nmakeAddListener/<@http://localhost:4203/polyfills.js:9706:27\nhandle/</<@http://localhost:4203/vendor.js:83881:13\n_trySubscribe@http://localhost:4203/vendor.js:45790:19\nsubscribe/<@http://localhost:4203/vendor.js:45784:113\nerrorContext@http://localhost:4203/vendor.js:50241:5\nsubscribe@http://localhost:4203/vendor.js:45779:69\nswitchMap/</<@http://localhost:4203/vendor.js:48637:100\nOperatorSubscriber/this._next<@http://localhost:4203/vendor.js:47268:15\nnext@http://localhost:4203/vendor.js:46165:12\nfromArrayLike/<@http://localhost:4203/vendor.js:46991:18\n_trySubscribe@http://localhost:4203/vendor.js:45790:19\nsubscribe/<@http://localhost:4203/vendor.js:45784:113\nerrorContext@http://localhost:4203/vendor.js:50241:5\nsubscribe@http://localhost:4203/vendor.js:45779:69\nswitchMap/<@http://localhost:4203/vendor.js:48633:12\noperate/</<@http://localhost:4203/vendor.js:50530:18\nsubscribe/<@http://localhost:4203/vendor.js:45784:42\nerrorContext@http://localhost:4203/vendor.js:50241:5\nsubscribe@http://localhost:4203/vendor.js:45779:69\ndoInnerSub@http://localhost:4203/vendor.js:48101:95\nouterNext@http://localhost:4203/vendor.js:48096:52\nOperatorSubscriber/this._next<@http://localhost:4203/vendor.js:47268:15\nnext@http://localhost:4203/vendor.js:46165:12\nfromArrayLike/<@http://localhost:4203/vendor.js:46991:18\n_trySubscribe@http://localhost:4203/vendor.js:45790:19\nsubscribe/<@http://localhost:4203/vendor.js:45784:113\nerrorContext@http://localhost:4203/vendor.js:50241:5\nsubscribe@http://localhost:4203/vendor.js:45779:69\nmergeInternals@http://localhost:4203/vendor.js:48129:10\nmergeMap/<@http://localhost:4203/vendor.js:48167:149\noperate/</<@http://localhost:4203/vendor.js:50530:18\nsubscribe/<@http://localhost:4203/vendor.js:45784:42\nerrorContext@http://localhost:4203/vendor.js:50241:5\nsubscribe@http://localhost:4203/vendor.js:45779:69\nfilter/<@http://localhost:4203/vendor.js:47771:12\noperate/</<@http://localhost:4203/vendor.js:50530:18\nsubscribe/<@http://localhost:4203/vendor.js:45784:42\nerrorContext@http://localhost:4203/vendor.js:50241:5\nsubscribe@http://localhost:4203/vendor.js:45779:69\nmap/<@http://localhost:4203/vendor.js:47988:12\noperate/</<@http://localhost:4203/vendor.js:50530:18\nsubscribe/<@http://localhost:4203/vendor.js:45784:42\nerrorContext@http://localhost:4203/vendor.js:50241:5\nsubscribe@http://localhost:4203/vendor.js:45779:69\ncatchError/<@http://localhost:4203/vendor.js:47404:23\noperate/</<@http://localhost:4203/vendor.js:50530:18\nsubscribe/<@http://localhost:4203/vendor.js:45784:42\nerrorContext@http://localhost:4203/vendor.js:50241:5\nsubscribe@http://localhost:4203/vendor.js:45779:69\ncatchError/</innerSub<@http://localhost:4203/vendor.js:47409:23\nOperatorSubscriber/this._error<@http://localhost:4203/vendor.js:47275:16\nerror@http://localhost:4203/vendor.js:46173:12\n_error@http://localhost:4203/vendor.js:46196:24\nerror@http://localhost:4203/vendor.js:46173:12\n_error@http://localhost:4203/vendor.js:46196:24\nerror@http://localhost:4203/vendor.js:46173:12\n_error@http://localhost:4203/vendor.js:46196:24\nerror@http://localhost:4203/vendor.js:46173:12\n_error@http://localhost:4203/vendor.js:46196:24\nerror@http://localhost:4203/vendor.js:46173:12\ninit@http://localhost:4203/vendor.js:47189:41\n_trySubscribe@http://localhost:4203/vendor.js:45790:19\nsubscribe/<@http://localhost:4203/vendor.js:45784:113\nerrorContext@http://localhost:4203/vendor.js:50241:5\nsubscribe@http://localhost:4203/vendor.js:45779:69\ncatchError/</innerSub<@http://localhost:4203/vendor.js:47409:23\nOperatorSubscriber/this._error<@http://localhost:4203/vendor.js:47275:16\nerror@http://localhost:4203/vendor.js:46173:12\ninit@http://localhost:4203/vendor.js:47189:41\n_trySubscribe@http://localhost:4203/vendor.js:45790:19\nsubscribe/<@http://localhost:4203/vendor.js:45784:113\nerrorContext@http://localhost:4203/vendor.js:50241:5\nsubscribe@http://localhost:4203/vendor.js:45779:69\ncatchError/</innerSub<@http://localhost:4203/vendor.js:47409:23\nOperatorSubscriber/this._error<@http://localhost:4203/vendor.js:47275:16\nerror@http://localhost:4203/vendor.js:46173:12\n_error@http://localhost:4203/vendor.js:46196:24\nerror@http://localhost:4203/vendor.js:46173:12\nonLoad@http://localhost:4203/vendor.js:83806:22\ninvokeTask@http://localhost:4203/polyfills.js:8205:171\nonInvokeTask@http://localhost:4203/vendor.js:110067:22\ninvokeTask@http://localhost:4203/polyfills.js:8205:54\nonInvokeTask@http://localhost:4203/vendor.js:110367:25\ninvokeTask@http://localhost:4203/polyfills.js:8205:54\nrunTask@http://localhost:4203/polyfills.js:8007:37\npatchRunTask@http://localhost:4203/vendor.js:3777:27\ninvokeTask@http://localhost:4203/polyfills.js:8282:26\ninvokeTask@http://localhost:4203/polyfills.js:9406:12\nglobalCallback@http://localhost:4203/polyfills.js:9447:33\n")
69+
ev0.Attributes().PutStr("exception.stacktrace", "padStart@http://localhost:4203/lineSlicer.min.js:1:228\npadStart@http://localhost:4203/lineSlicers.min.js:1:228\n")
6070
span.Status().SetCode(2)
6171
}

testdata/lineSlicer.min.js.map

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)