@@ -0,0 +1,52 @@
1+module Yoga.OpenTelemetry.OpenTelemetryOm
2+ ( startSpan
3+ , startSpanWithAttributes
4+ , endSpan
5+ , setAttribute
6+ , addEvent
7+ , setStatus
8+ , recordException
9+ , withSpan
10+ ) where
11+
12+import Prelude
13+
14+import Effect.Class (liftEffect)
15+import Yoga.OpenTelemetry.OpenTelemetry as OTel
16+import Type.Row.Homogeneous (class Homogeneous)
17+import Yoga.Om as Om
18+
19+-- All tracing functions automatically get tracer from Om context!
20+
21+startSpan :: forall r err. String -> Om.Om { tracer :: OTel.Tracer | r } err OTel.Span
22+startSpan name = do
23+ { tracer } <- Om.ask
24+ liftEffect $ OTel.startSpan (OTel.SpanName name) tracer
25+
26+startSpanWithAttributes :: forall r attrs err. Homogeneous attrs OTel.AttributeValue => String -> { | attrs } -> Om.Om { tracer :: OTel.Tracer | r } err OTel.Span
27+startSpanWithAttributes name attrs = do
28+ { tracer } <- Om.ask
29+ liftEffect $ OTel.startSpanWithAttributes (OTel.SpanName name) attrs tracer
30+
31+endSpan :: forall r err. OTel.Span -> Om.Om r err Unit
32+endSpan span = liftEffect $ OTel.endSpan span
33+
34+setAttribute :: forall r err. String -> OTel.AttributeValue -> OTel.Span -> Om.Om r err Unit
35+setAttribute key value span = liftEffect $ OTel.setAttribute key value span
36+
37+addEvent :: forall r err. String -> OTel.Span -> Om.Om r err Unit
38+addEvent name span = liftEffect $ OTel.addEvent name span
39+
40+setStatus :: forall r err. OTel.SpanStatusCode -> OTel.Span -> Om.Om r err Unit
41+setStatus status span = liftEffect $ OTel.setStatus status span
42+
43+recordException :: forall r err. String -> OTel.Span -> Om.Om r err Unit
44+recordException error span = liftEffect $ OTel.recordException error span
45+
46+-- Helper: Run an action within a span (automatically ends it)
47+withSpan :: forall r err a. String -> Om.Om { tracer :: OTel.Tracer | r } err a -> Om.Om { tracer :: OTel.Tracer | r } err a
48+withSpan name action = do
49+ span <- startSpan name
50+ result <- action
51+ endSpan span
52+ pure result