Skip to content

Commit 37ca592

Browse files
authoredMar 21, 2024··
add fiber ref for disabling the tracer (#2381)
1 parent 6fbac51 commit 37ca592

File tree

9 files changed

+127
-11
lines changed

9 files changed

+127
-11
lines changed
 

‎.changeset/hip-bags-smell.md

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
"effect": patch
3+
---
4+
5+
add fiber ref for disabling the tracer
6+
7+
You can use it with the Effect.withTracerEnabled api:
8+
9+
```ts
10+
import { Effect } from "effect";
11+
12+
Effect.succeed(42).pipe(
13+
Effect.withSpan("my-span"),
14+
// the span will not be registered with the tracer
15+
Effect.withTracerEnabled(false),
16+
);
17+
```

‎packages/effect/src/Effect.ts

+19
Original file line numberDiff line numberDiff line change
@@ -5061,6 +5061,25 @@ export const withTracer: {
50615061
export const withTracerScoped: (value: Tracer.Tracer) => Effect<void, never, Scope.Scope> =
50625062
fiberRuntime.withTracerScoped
50635063

5064+
/**
5065+
* Disable the tracer for the given Effect.
5066+
*
5067+
* @since 2.0.0
5068+
* @category tracing
5069+
* @example
5070+
* import { Effect } from "effect"
5071+
*
5072+
* Effect.succeed(42).pipe(
5073+
* Effect.withSpan("my-span"),
5074+
* // the span will not be registered with the tracer
5075+
* Effect.withTracerEnabled(false)
5076+
* )
5077+
*/
5078+
export const withTracerEnabled: {
5079+
(enabled: boolean): <A, E, R>(effect: Effect<A, E, R>) => Effect<A, E, R>
5080+
<A, E, R>(effect: Effect<A, E, R>, enabled: boolean): Effect<A, E, R>
5081+
} = core.withTracerEnabled
5082+
50645083
/**
50655084
* @since 2.0.0
50665085
* @category tracing

‎packages/effect/src/FiberRef.ts

+6
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,12 @@ export const currentSupervisor: FiberRef<Supervisor.Supervisor<any>> = fiberRunt
373373
*/
374374
export const currentMetricLabels: FiberRef<ReadonlyArray<MetricLabel.MetricLabel>> = core.currentMetricLabels
375375

376+
/**
377+
* @since 2.0.0
378+
* @category fiberRefs
379+
*/
380+
export const currentTracerEnabled: FiberRef<boolean> = core.currentTracerEnabled
381+
376382
/**
377383
* @since 2.0.0
378384
* @category fiberRefs

‎packages/effect/src/Layer.ts

+9
Original file line numberDiff line numberDiff line change
@@ -979,6 +979,15 @@ export const span: (
979979
*/
980980
export const setTracer: (tracer: Tracer.Tracer) => Layer<never> = circularLayer.setTracer
981981

982+
/**
983+
* @since 2.0.0
984+
* @category tracing
985+
*/
986+
export const setTracerEnabled: (enabled: boolean) => Layer<never> = (enabled: boolean) =>
987+
scopedDiscard(
988+
fiberRuntime.fiberRefLocallyScoped(core.currentTracerEnabled, enabled)
989+
)
990+
982991
/**
983992
* @since 2.0.0
984993
* @category tracing

‎packages/effect/src/internal/core-effect.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -2051,6 +2051,11 @@ export const makeSpan = (
20512051
): Effect.Effect<Tracer.Span> =>
20522052
core.flatMap(fiberRefs, (fiberRefs) =>
20532053
core.sync(() => {
2054+
const enabled = FiberRefs.getOrDefault(fiberRefs, core.currentTracerEnabled)
2055+
if (enabled === false) {
2056+
return core.noopSpan
2057+
}
2058+
20542059
const context = FiberRefs.getOrDefault(fiberRefs, core.currentContext)
20552060
const services = FiberRefs.getOrDefault(fiberRefs, defaultServices.currentServices)
20562061

@@ -2131,10 +2136,12 @@ export const useSpan: {
21312136
makeSpan(name, options),
21322137
evaluate,
21332138
(span, exit) =>
2134-
core.flatMap(
2135-
currentTimeNanosTracing,
2136-
(endTime) => core.sync(() => span.end(endTime, exit))
2137-
)
2139+
span.status._tag === "Ended" ?
2140+
core.unit :
2141+
core.flatMap(
2142+
currentTimeNanosTracing,
2143+
(endTime) => core.sync(() => span.end(endTime, exit))
2144+
)
21382145
)
21392146
}
21402147

‎packages/effect/src/internal/core.ts

+39
Original file line numberDiff line numberDiff line change
@@ -1372,6 +1372,17 @@ export const withRuntimeFlags = dual<
13721372
return effect
13731373
})
13741374

1375+
/** @internal */
1376+
export const withTracerEnabled = dual<
1377+
(enabled: boolean) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>,
1378+
<A, E, R>(effect: Effect.Effect<A, E, R>, enabled: boolean) => Effect.Effect<A, E, R>
1379+
>(2, (effect, enabled) =>
1380+
fiberRefLocally(
1381+
effect,
1382+
currentTracerEnabled,
1383+
enabled
1384+
))
1385+
13751386
/** @internal */
13761387
export const withTracerTiming = dual<
13771388
(enabled: boolean) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>,
@@ -2015,6 +2026,12 @@ export const currentInterruptedCause: FiberRef.FiberRef<Cause.Cause<never>> = gl
20152026
})
20162027
)
20172028

2029+
/** @internal */
2030+
export const currentTracerEnabled: FiberRef.FiberRef<boolean> = globalValue(
2031+
Symbol.for("effect/FiberRef/currentTracerEnabled"),
2032+
() => fiberRefUnsafeMake(true)
2033+
)
2034+
20182035
/** @internal */
20192036
export const currentTracerTimingEnabled: FiberRef.FiberRef<boolean> = globalValue(
20202037
Symbol.for("effect/FiberRef/currentTracerTiming"),
@@ -3073,3 +3090,25 @@ export const currentSpanFromFiber = <A, E>(fiber: Fiber.RuntimeFiber<A, E>): Opt
30733090
| undefined
30743091
return span !== undefined && span._tag === "Span" ? Option.some(span) : Option.none()
30753092
}
3093+
3094+
/** @internal */
3095+
export const noopSpan: Tracer.Span = globalValue("effect/Tracer/noopSpan", () => ({
3096+
_tag: "Span",
3097+
spanId: "noop",
3098+
traceId: "noop",
3099+
name: "noop",
3100+
sampled: false,
3101+
parent: Option.none(),
3102+
context: Context.empty(),
3103+
status: {
3104+
_tag: "Ended",
3105+
startTime: BigInt(0),
3106+
endTime: BigInt(0),
3107+
exit: exitUnit
3108+
},
3109+
attributes: new Map(),
3110+
links: [],
3111+
attribute() {},
3112+
event() {},
3113+
end() {}
3114+
}))

‎packages/effect/src/internal/fiberRuntime.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -3505,10 +3505,12 @@ export const makeSpanScoped = (
35053505
acquireRelease(
35063506
internalEffect.makeSpan(name, options),
35073507
(span, exit) =>
3508-
core.flatMap(
3509-
internalEffect.currentTimeNanosTracing,
3510-
(endTime) => core.sync(() => span.end(endTime, exit))
3511-
)
3508+
span.status._tag === "Ended" ?
3509+
core.unit :
3510+
core.flatMap(
3511+
internalEffect.currentTimeNanosTracing,
3512+
(endTime) => core.sync(() => span.end(endTime, exit))
3513+
)
35123514
)
35133515

35143516
/* @internal */

‎packages/effect/src/internal/tracer.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export class NativeSpan implements Tracer.Span {
5959
this.spanId = `span${randomString(16)}`
6060
}
6161

62-
end = (endTime: bigint, exit: Exit.Exit<unknown, unknown>): void => {
62+
end(endTime: bigint, exit: Exit.Exit<unknown, unknown>): void {
6363
this.status = {
6464
_tag: "Ended",
6565
endTime,
@@ -68,11 +68,11 @@ export class NativeSpan implements Tracer.Span {
6868
}
6969
}
7070

71-
attribute = (key: string, value: unknown): void => {
71+
attribute(key: string, value: unknown): void {
7272
this.attributes.set(key, value)
7373
}
7474

75-
event = (name: string, startTime: bigint, attributes?: Record<string, unknown>): void => {
75+
event(name: string, startTime: bigint, attributes?: Record<string, unknown>): void {
7676
this.events.push([name, startTime, attributes ?? {}])
7777
}
7878
}

‎packages/effect/test/Tracer.test.ts

+17
Original file line numberDiff line numberDiff line change
@@ -258,4 +258,21 @@ describe("Tracer", () => {
258258
assert.strictEqual(onEndCalled, true)
259259
}))
260260
})
261+
262+
it.effect("withTracerEnabled", () =>
263+
Effect.gen(function*($) {
264+
const span = yield* $(
265+
Effect.currentSpan,
266+
Effect.withSpan("A"),
267+
Effect.withTracerEnabled(false)
268+
)
269+
const spanB = yield* $(
270+
Effect.currentSpan,
271+
Effect.withSpan("B"),
272+
Effect.withTracerEnabled(true)
273+
)
274+
275+
assert.deepEqual(span.name, "noop")
276+
assert.deepEqual(spanB.name, "B")
277+
}))
261278
})

0 commit comments

Comments
 (0)
Please sign in to comment.