git.iko.soy/rowtype-yoga/purescript-yoga-opentelemetry-om
on main help sign in
Initial: yoga-opentelemetry-om
commitf379bb5c2292837507fca85e97c1883a00b2dfb0 authorMark <mark.eibes@gmail.com> dateWed 4 Feb 2026, 21:58 (8 months ago)
5 files changed+95
.github/workflows/ci.yml+9 .gitignore+3 package.json+12 spago.yaml+19 src/Yoga/OpenTelemetry/OpenTelemetryOm.purs+52
.github/workflows/ci.ymlnew file+9
@@ -0,0 +1,9 @@
1+name: CI
2+on: [push, pull_request]
3+jobs:
4+ build:
5+ runs-on: ubuntu-latest
6+ steps:
7+ - uses: actions/checkout@v4
8+ - uses: rowtype-yoga/purescript-yoga-actions/.github/actions/setup@main
9+ - run: spago build
.gitignorenew file+3
@@ -0,0 +1,3 @@
1+node_modules/
2+.spago/
3+output*/
package.jsonnew file+12
@@ -0,0 +1,12 @@
1+{
2+ "name": "purescript-yoga-opentelemetry-om",
3+ "version": "0.1.0",
4+ "description": "Om-wrapped OpenTelemetry operations",
5+ "license": "MIT",
6+ "repository": {
7+ "type": "git",
8+ "url": "https://github.com/rowtype-yoga/purescript-yoga-backend-stack.git",
9+ "directory": "packages/yoga-opentelemetry-om"
10+ },
11+ "keywords": ["purescript", "ffi", "bindings", "yoga"]
12+}
spago.yamlnew file+19
@@ -0,0 +1,19 @@
1+workspace:
2+ package_set:
3+ registry: 51.1.0
4+
5+package:
6+ name: yoga-opentelemetry-om
7+ publish:
8+ version: 0.1.0
9+ license: MIT
10+ location:
11+ githubOwner: rowtype-yoga
12+ githubRepo: purescript-yoga-opentelemetry-om
13+ dependencies:
14+ - yoga-opentelemetry: "*"
15+ - yoga-om-core: ">=1.0.0 <2.0.0"
16+ - yoga-om-layer: ">=1.0.0 <2.0.0"
17+ - aff: ">=7.0.0 <8.0.0"
18+ - effect: ">=4.0.0 <5.0.0"
19+ - prelude: ">=6.0.0 <7.0.0"
src/Yoga/OpenTelemetry/OpenTelemetryOm.pursnew file+52
@@ -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