Skip to content

Commit 1cd241d

Browse files
committed
Support spans with manually specified trace and span ids
1 parent c5d2a22 commit 1cd241d

File tree

3 files changed

+69
-1
lines changed

3 files changed

+69
-1
lines changed

Diff for: .gitignore

+6
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,9 @@
33
/bash_completion.sh
44
cabal.project.*
55
dist-newstyle
6+
*.tracy
7+
*.eventlog
8+
*.trace.json
9+
*.gif
10+
*.webm
11+
*.log

Diff for: opentelemetry-extra/src/OpenTelemetry/EventlogStreaming_Internal.hs

+48-1
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,13 @@ data State = S
7474
threadMap :: IM.IntMap ThreadId,
7575
spanStacks :: HM.HashMap ThreadId (NonEmpty Span),
7676
traceMap :: HM.HashMap ThreadId TraceId,
77+
specificSpans :: HM.HashMap Word64 Span,
7778
randomGen :: R.SMGen
7879
}
7980
deriving (Show)
8081

8182
initialState :: Word64 -> R.SMGen -> State
82-
initialState timestamp = S timestamp mempty mempty mempty
83+
initialState timestamp = S timestamp mempty mempty mempty mempty
8384

8485
processEvent :: Event -> State -> (State, [Span])
8586
processEvent (Event ts ev m_cap) st@(S {..}) =
@@ -102,6 +103,14 @@ processEvent (Event ts ev m_cap) st@(S {..}) =
102103
(HeapAllocated {allocBytes}, _, Just tid) ->
103104
(modifySpan tid (addEvent now "heap_alloc_bytes" (showT allocBytes)) st, [])
104105
(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
105114
("ot1" : "begin" : "span" : name) ->
106115
(pushSpan tid (T.intercalate " " name) now st, [])
107116
("ot1" : "end" : "span" : _) -> popSpan tid now st
@@ -175,6 +184,44 @@ modifySpan tid f st =
175184
HM.update (\(sp :| sps) -> Just (f sp :| sps)) tid (spanStacks st)
176185
}
177186

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+
178225
pushSpan :: HasCallStack => ThreadId -> T.Text -> OTel.Timestamp -> State -> State
179226
pushSpan tid name timestamp st = st {spanStacks = new_stacks, randomGen = new_randomGen, traceMap = new_traceMap}
180227
where

Diff for: opentelemetry/src/OpenTelemetry/Eventlog.hs

+15
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,18 @@ withSpan operation action =
5252
liftIO endSpan
5353
)
5454
(\_span -> action)
55+
56+
-- These two are supposed to be used when you have some custom control flow
57+
-- and a given span can begin on one thread and end on another. In this case
58+
-- the ordinary `beginSpan` and `endSpan` functions would assume a wrong thing
59+
-- and result in
60+
61+
beginSpecificSpan :: TraceId -> SpanId -> String -> IO ()
62+
beginSpecificSpan (TId tid) (SId sid) k =
63+
Debug.Trace.traceEventIO $
64+
printf "ot1 begin specific span %d %d %s" tid sid k
65+
66+
endSpecificSpan :: TraceId -> SpanId -> String -> IO ()
67+
endSpecificSpan (TId tid) (SId sid) k =
68+
Debug.Trace.traceEventIO $
69+
printf "ot1 end specific span %d %d %s" tid sid k

0 commit comments

Comments
 (0)