@@ -7,17 +7,27 @@ import { assert, describe, expect, it } from "@effect/vitest"
77import * as OtelApi from "@opentelemetry/api"
88import { AsyncHooksContextManager } from "@opentelemetry/context-async-hooks"
99import { InMemorySpanExporter , SimpleSpanProcessor } from "@opentelemetry/sdk-trace-base"
10+ import * as Console from "effect/Console"
1011import * as Effect from "effect/Effect"
12+ import * as FiberRef from "effect/FiberRef"
1113import * as Layer from "effect/Layer"
1214import * as Runtime from "effect/Runtime"
1315import { OtelSpan } from "../src/internal/tracer.js"
1416
15- const TracingLive = NodeSdk . layer ( Effect . sync ( ( ) => ( {
16- resource : {
17- serviceName : "test"
18- } ,
19- spanProcessor : [ new SimpleSpanProcessor ( new InMemorySpanExporter ( ) ) ]
20- } ) ) )
17+ class Exporter extends Effect . Service < Exporter > ( ) ( "Exporter" , {
18+ effect : Effect . sync ( ( ) => ( { exporter : new InMemorySpanExporter ( ) } ) )
19+ } ) { }
20+
21+ const TracingLive = Layer . unwrapEffect ( Effect . gen ( function * ( ) {
22+ const { exporter } = yield * Exporter
23+
24+ return NodeSdk . layer ( Effect . sync ( ( ) => ( {
25+ resource : {
26+ serviceName : "test"
27+ } ,
28+ spanProcessor : [ new SimpleSpanProcessor ( exporter ) ]
29+ } ) ) )
30+ } ) ) . pipe ( Layer . provideMerge ( Exporter . Default ) )
2131
2232// needed to test context propagation
2333const contextManager = new AsyncHooksContextManager ( )
@@ -227,4 +237,59 @@ describe("Tracer", () => {
227237 OtlpTracingLive
228238 ) )
229239 } )
240+
241+ describe ( "Log Attributes" , ( ) => {
242+ it . effect ( "propagates attributes with Effect.fnUntraced" , ( ) =>
243+ Effect . gen ( function * ( ) {
244+ const f = Effect . fnUntraced ( function * ( ) {
245+ yield * Effect . logWarning ( "FooBar" )
246+ return yield * Effect . fail ( "Oops" )
247+ } )
248+
249+ const p = f ( ) . pipe ( Effect . withSpan ( "p" ) )
250+
251+ yield * Effect . ignore ( p )
252+
253+ const { exporter } = yield * Exporter
254+
255+ assert . isNotEmpty ( exporter . getFinishedSpans ( ) [ 0 ] . events . filter ( ( _ ) => _ . name === "FooBar" ) )
256+ assert . isNotEmpty ( exporter . getFinishedSpans ( ) [ 0 ] . events . filter ( ( _ ) => _ . name === "exception" ) )
257+ } ) . pipe ( Effect . provide ( TracingLive ) ) )
258+
259+ it . effect ( "propagates attributes with Effect.fn(name)" , ( ) =>
260+ Effect . gen ( function * ( ) {
261+ const f = Effect . fn ( "f" ) ( function * ( ) {
262+ yield * Effect . logWarning ( "FooBar" )
263+ return yield * Effect . fail ( "Oops" )
264+ } )
265+
266+ const p = f ( ) . pipe ( Effect . withSpan ( "p" ) )
267+
268+ yield * Effect . ignore ( p )
269+
270+ const { exporter } = yield * Exporter
271+
272+ assert . isNotEmpty ( exporter . getFinishedSpans ( ) [ 0 ] . events . filter ( ( _ ) => _ . name === "FooBar" ) )
273+ assert . isNotEmpty ( exporter . getFinishedSpans ( ) [ 0 ] . events . filter ( ( _ ) => _ . name === "exception" ) )
274+ } ) . pipe ( Effect . provide ( TracingLive ) ) )
275+
276+ it . effect ( "propagates attributes with Effect.fn" , ( ) =>
277+ Effect . gen ( function * ( ) {
278+ const f = Effect . fn ( function * ( ) {
279+ yield * Effect . logWarning ( "FooBar" )
280+ return yield * Effect . fail ( "Oops" )
281+ } )
282+
283+ const p = f ( ) . pipe ( Effect . withSpan ( "p" ) )
284+
285+ yield * Effect . ignore ( p )
286+
287+ const { exporter } = yield * Exporter
288+
289+ yield * Console . log ( Array . from ( yield * FiberRef . get ( FiberRef . currentLoggers ) ) )
290+
291+ assert . isNotEmpty ( exporter . getFinishedSpans ( ) [ 0 ] . events . filter ( ( _ ) => _ . name === "FooBar" ) )
292+ assert . isNotEmpty ( exporter . getFinishedSpans ( ) [ 0 ] . events . filter ( ( _ ) => _ . name === "exception" ) )
293+ } ) . pipe ( Effect . provide ( TracingLive ) ) )
294+ } )
230295} )
0 commit comments