Skip to content
Source
Sign inSign up

relayTracing.test.ts

74 lines2.5 KB

1import { describe, expect, it } from "@effect/vitest";
2import * as Effect from "effect/Effect";
3import * as Option from "effect/Option";
4import * as Tracer from "effect/Tracer";
5​
6import { RelayClientTracer, withLocalTracing, withRelayClientTracing } from "./relayTracing.ts";
7​
8function collectingTracer(spans: Array<string>): Tracer.Tracer {
9 return Tracer.make({
10 span: (options) => {
11 const span = new Tracer.NativeSpan(options);
12 const end = span.end.bind(span);
13 span.end = (endTime, exit) => {
14 end(endTime, exit);
15 spans.push(span.name);
16 };
17 return span;
18 },
19 });
21​
22describe("withRelayClientTracing", () => {
23 it.effect("uses the product tracer only for relay operations", () =>
24 Effect.gen(function* () {
25 const userSpans: Array<string> = [];
26 const productSpans: Array<string> = [];
27 const userTracer = collectingTracer(userSpans);
28 const productTracer = collectingTracer(productSpans);
29​
30 yield* Effect.void.pipe(Effect.withSpan("user.operation"), Effect.withTracer(userTracer));
31 yield* Effect.void.pipe(
32 Effect.withSpan("relay.operation"),
33 withRelayClientTracing,
34 Effect.provideService(RelayClientTracer, Option.some(productTracer)),
35 Effect.withTracer(userTracer),
36 );
37​
38 expect(userSpans).toEqual(["user.operation"]);
39 expect(productSpans).toEqual(["relay.operation"]);
40 }),
41 );
42});
43​
44describe("withLocalTracing", () => {
45 it.effect("keeps local work inside a relay span off the product tracer", () =>
46 Effect.gen(function* () {
47 const localSpans: Array<string> = [];
48 const productSpans: Array<string> = [];
49 const localTracer = collectingTracer(localSpans);
50 const productTracer = collectingTracer(productSpans);
51​
52 yield* Effect.void.pipe(
53 Effect.withSpan("relay.connection.nested"),
54 Effect.andThen(
55 Effect.void.pipe(
56 Effect.withSpan("sql.execute"),
57 Effect.withSpan("ServerSecretStore.get"),
58 withLocalTracing,
59 ),
60 ),
61 Effect.withSpan("environment.orchestration.threadSnapshot"),
62 withRelayClientTracing,
63 Effect.provideService(RelayClientTracer, Option.some(productTracer)),
64 Effect.withTracer(localTracer),
65 );
66​
67 expect(productSpans).toEqual([
68 "relay.connection.nested",
69 "environment.orchestration.threadSnapshot",
70 ]);
71 expect(localSpans).toEqual(["sql.execute", "ServerSecretStore.get"]);
72 }),
73 );
74});