@@ -74,12 +74,13 @@ data State = S
74
74
threadMap :: IM. IntMap ThreadId ,
75
75
spanStacks :: HM. HashMap ThreadId (NonEmpty Span ),
76
76
traceMap :: HM. HashMap ThreadId TraceId ,
77
+ specificSpans :: HM. HashMap Word64 Span ,
77
78
randomGen :: R. SMGen
78
79
}
79
80
deriving (Show )
80
81
81
82
initialState :: Word64 -> R. SMGen -> State
82
- initialState timestamp = S timestamp mempty mempty mempty
83
+ initialState timestamp = S timestamp mempty mempty mempty mempty
83
84
84
85
processEvent :: Event -> State -> (State , [Span ])
85
86
processEvent (Event ts ev m_cap) st@ (S {.. }) =
@@ -102,6 +103,14 @@ processEvent (Event ts ev m_cap) st@(S {..}) =
102
103
(HeapAllocated {allocBytes}, _, Just tid) ->
103
104
(modifySpan tid (addEvent now " heap_alloc_bytes" (showT allocBytes)) st, [] )
104
105
(UserMessage {msg}, _, fromMaybe 1 -> tid) -> case T. words msg of
106
+ (" ot1" : " begin" : " specific" : " span" : trace_id_text : span_id_text : name) ->
107
+ let trace_id = TId (read (" 0x" <> T. unpack trace_id_text))
108
+ span_id = SId (read (" 0x" <> T. unpack span_id_text))
109
+ in beginSpecificSpan trace_id span_id (T. intercalate " " name) now st
110
+ (" ot1" : " end" : " specific" : " span" : trace_id_text : span_id_text : _) ->
111
+ let trace_id = TId (read (" 0x" <> T. unpack trace_id_text))
112
+ span_id = SId (read (" 0x" <> T. unpack span_id_text))
113
+ in endSpecificSpan span_id now st
105
114
(" ot1" : " begin" : " span" : name) ->
106
115
(pushSpan tid (T. intercalate " " name) now st, [] )
107
116
(" ot1" : " end" : " span" : _) -> popSpan tid now st
@@ -175,6 +184,44 @@ modifySpan tid f st =
175
184
HM. update (\ (sp :| sps) -> Just (f sp :| sps)) tid (spanStacks st)
176
185
}
177
186
187
+ beginSpecificSpan :: TraceId -> SpanId -> T. Text -> OTel. Timestamp -> State -> (State , [Span ])
188
+ beginSpecificSpan trace_id span_id@ (SId s) name timestamp st =
189
+ case HM. lookup s (specificSpans st) of
190
+ Just sp -> (st {specificSpans = HM. delete s (specificSpans st)}, [sp {spanStartedAt = timestamp, spanOperation = name, spanContext = SpanContext span_id trace_id}])
191
+ Nothing ->
192
+ (st {specificSpans = HM. insert s sp (specificSpans st)}, [] )
193
+ where
194
+ sp =
195
+ Span
196
+ { spanContext = SpanContext span_id trace_id,
197
+ spanOperation = name,
198
+ spanStartedAt = timestamp,
199
+ spanFinishedAt = 0 ,
200
+ spanTags = mempty ,
201
+ spanEvents = mempty ,
202
+ spanStatus = OK ,
203
+ spanParentId = Nothing
204
+ }
205
+
206
+ endSpecificSpan :: SpanId -> OTel. Timestamp -> State -> (State , [Span ])
207
+ endSpecificSpan span_id@ (SId s) timestamp st =
208
+ case HM. lookup s (specificSpans st) of
209
+ Just sp -> (st {specificSpans = HM. delete s (specificSpans st)}, [sp {spanFinishedAt = timestamp}])
210
+ Nothing ->
211
+ (st {specificSpans = HM. insert s sp (specificSpans st)}, [] )
212
+ where
213
+ sp =
214
+ Span
215
+ { spanContext = SpanContext span_id (TId 0 ),
216
+ spanOperation = " unknown" ,
217
+ spanStartedAt = 0 ,
218
+ spanFinishedAt = timestamp,
219
+ spanTags = mempty ,
220
+ spanEvents = mempty ,
221
+ spanStatus = OK ,
222
+ spanParentId = Nothing
223
+ }
224
+
178
225
pushSpan :: HasCallStack => ThreadId -> T. Text -> OTel. Timestamp -> State -> State
179
226
pushSpan tid name timestamp st = st {spanStacks = new_stacks, randomGen = new_randomGen, traceMap = new_traceMap}
180
227
where
0 commit comments