@@ -35,12 +35,14 @@ data WatDoOnEOF = StopOnEOF | SleepAndRetryOnEOF
35
35
36
36
data State = S
37
37
{ originTimestamp :: ! Timestamp ,
38
- threadMap :: IM. IntMap ThreadId ,
38
+ cap2thread :: IM. IntMap ThreadId ,
39
39
spans :: HM. HashMap SpanId Span ,
40
40
instrumentMap :: HM. HashMap InstrumentId CaptureInstrument ,
41
41
traceMap :: HM. HashMap ThreadId TraceId ,
42
42
serial2sid :: HM. HashMap Word64 SpanId ,
43
43
thread2sid :: HM. HashMap ThreadId SpanId ,
44
+ thread2displayThread :: HM. HashMap ThreadId ThreadId , -- https://github.com/ethercrow/opentelemetry-haskell/issues/40
45
+ nextFreeDisplayThread :: ThreadId ,
44
46
gcRequestedAt :: ! Timestamp ,
45
47
gcStartedAt :: ! Timestamp ,
46
48
gcGeneration :: ! Int ,
@@ -52,7 +54,7 @@ data State = S
52
54
deriving (Show )
53
55
54
56
initialState :: Word64 -> R. SMGen -> State
55
- initialState timestamp = S timestamp mempty mempty mempty mempty mempty mempty 0 0 0 0 0 0
57
+ initialState timestamp = S timestamp mempty mempty mempty mempty mempty mempty mempty 1 0 0 0 0 0 0
56
58
57
59
data EventSource
58
60
= EventLogHandle Handle WatDoOnEOF
@@ -142,9 +144,9 @@ parseOpenTelemetry UserBinaryMessage {payload} = parseByteString payload
142
144
parseOpenTelemetry _ = Nothing
143
145
144
146
processEvent :: Event -> State -> (State , [Span ], [Metric ])
145
- processEvent (Event ts ev m_cap) st@ ( S {.. }) =
147
+ processEvent (Event ts ev m_cap) st@ S {.. } =
146
148
let now = originTimestamp + ts
147
- m_thread_id = m_cap >>= flip IM. lookup threadMap
149
+ m_thread_id = m_cap >>= flip IM. lookup cap2thread
148
150
m_trace_id = m_thread_id >>= flip HM. lookup traceMap
149
151
in case (ev, m_cap, m_thread_id) of
150
152
(WallClockTime {sec, nsec}, _, _) ->
@@ -158,16 +160,21 @@ processEvent (Event ts ev m_cap) st@(S {..}) =
158
160
[Metric threadsI [MetricDatapoint now 1 ]]
159
161
)
160
162
(RunThread tid, Just cap, _) ->
161
- (st {threadMap = IM. insert cap tid threadMap }, [] , [] )
163
+ (st {cap2thread = IM. insert cap tid cap2thread }, [] , [] )
162
164
(StopThread tid tstatus, Just cap, _)
163
165
| isTerminalThreadStatus tstatus ->
164
- ( st
165
- { threadMap = IM. delete cap threadMap,
166
- traceMap = HM. delete tid traceMap
167
- },
168
- [] ,
169
- [Metric threadsI [MetricDatapoint now (- 1 )]]
170
- )
166
+ let (t2dt, nfdt) = case HM. lookup tid thread2displayThread of
167
+ Nothing -> (thread2displayThread, nextFreeDisplayThread)
168
+ Just _ -> (HM. delete tid thread2displayThread, nextFreeDisplayThread - 1 )
169
+ in ( st
170
+ { cap2thread = IM. delete cap cap2thread,
171
+ traceMap = HM. delete tid traceMap,
172
+ thread2displayThread = t2dt,
173
+ nextFreeDisplayThread = nfdt
174
+ },
175
+ [] ,
176
+ [Metric threadsI [MetricDatapoint now (- 1 )]]
177
+ )
171
178
(RequestSeqGC , _, _) ->
172
179
(st {gcRequestedAt = now}, [] , [] )
173
180
(RequestParGC , _, _) ->
@@ -187,6 +194,7 @@ processEvent (Event ts ev m_cap) st@(S {..}) =
187
194
spanStartedAt = gcStartedAt,
188
195
spanFinishedAt = now,
189
196
spanThreadId = maxBound ,
197
+ spanDisplayThreadId = maxBound ,
190
198
spanTags = mempty ,
191
199
spanEvents = [] ,
192
200
spanParentId = Nothing ,
@@ -200,6 +208,7 @@ processEvent (Event ts ev m_cap) st@(S {..}) =
200
208
spanStartedAt = gcRequestedAt,
201
209
spanFinishedAt = gcStartedAt,
202
210
spanThreadId = maxBound ,
211
+ spanDisplayThreadId = maxBound ,
203
212
spanTags = mempty ,
204
213
spanEvents = [] ,
205
214
spanParentId = Nothing ,
@@ -284,12 +293,14 @@ handleOpenTelemetryEventlogEvent m st (tid, now, m_trace_id) =
284
293
case HM. lookup serial $ serial2sid st of
285
294
Nothing ->
286
295
let (st', span_id) = inventSpanId serial st
296
+ (st'', display_tid) = inventDisplayTid tid st'
287
297
parent = HM. lookup tid (thread2sid st)
288
298
sp =
289
299
Span
290
300
{ spanContext = SpanContext span_id (fromMaybe (TId 42 ) m_trace_id),
291
301
spanOperation = " " ,
292
302
spanThreadId = tid,
303
+ spanDisplayThreadId = display_tid,
293
304
spanStartedAt = 0 ,
294
305
spanFinishedAt = now,
295
306
spanTags = mempty ,
@@ -298,7 +309,7 @@ handleOpenTelemetryEventlogEvent m st (tid, now, m_trace_id) =
298
309
spanNanosecondsSpentInGC = 0 ,
299
310
spanParentId = parent
300
311
}
301
- in (createSpan span_id sp st', [] , [] )
312
+ in (createSpan span_id sp st'' , [] , [] )
302
313
Just span_id ->
303
314
let (st', sp) = emitSpan serial span_id st
304
315
in (st', [sp {spanFinishedAt = now}], [] )
@@ -307,11 +318,13 @@ handleOpenTelemetryEventlogEvent m st (tid, now, m_trace_id) =
307
318
Nothing ->
308
319
let (st', span_id) = inventSpanId serial st
309
320
parent = HM. lookup tid (thread2sid st)
321
+ (st'', display_tid) = inventDisplayTid tid st'
310
322
sp =
311
323
Span
312
324
{ spanContext = SpanContext span_id (fromMaybe (TId 42 ) m_trace_id),
313
325
spanOperation = operation,
314
326
spanThreadId = tid,
327
+ spanDisplayThreadId = display_tid,
315
328
spanStartedAt = now,
316
329
spanFinishedAt = 0 ,
317
330
spanTags = mempty ,
@@ -320,10 +333,10 @@ handleOpenTelemetryEventlogEvent m st (tid, now, m_trace_id) =
320
333
spanNanosecondsSpentInGC = 0 ,
321
334
spanParentId = parent
322
335
}
323
- in (createSpan span_id sp st', [] , [] )
336
+ in (createSpan span_id sp st'' , [] , [] )
324
337
Just span_id ->
325
338
let (st', sp) = emitSpan serial span_id st
326
- in (st', [sp {spanOperation = operation, spanStartedAt = now, spanThreadId = tid }], [] )
339
+ in (st', [sp {spanOperation = operation, spanStartedAt = now}], [] )
327
340
DeclareInstrumentEv iType iId iName ->
328
341
(st {instrumentMap = HM. insert iId (CaptureInstrument iType iName) (instrumentMap st)}, [] , [] )
329
342
MetricCaptureEv instrumentId val -> case HM. lookup instrumentId (instrumentMap st) of
@@ -396,6 +409,14 @@ inventSpanId serial st = (st', sid)
396
409
(SId -> sid, randomGen') = R. nextWord64 randomGen
397
410
st' = st {serial2sid = HM. insert serial sid serial2sid, randomGen = randomGen'}
398
411
412
+ inventDisplayTid :: ThreadId -> State -> (State , ThreadId )
413
+ inventDisplayTid tid st@ (S {thread2displayThread, nextFreeDisplayThread}) =
414
+ case HM. lookup tid thread2displayThread of
415
+ Nothing ->
416
+ let new_dtid = nextFreeDisplayThread
417
+ in (st {thread2displayThread = HM. insert tid new_dtid thread2displayThread, nextFreeDisplayThread = new_dtid + 1 }, new_dtid)
418
+ Just dtid -> (st, dtid)
419
+
399
420
parseText :: [T. Text ] -> Maybe OpenTelemetryEventlogEvent
400
421
parseText =
401
422
\ case
0 commit comments