1import { expect, it } from "@effect/vitest";
2import * as Effect from "effect/Effect";
3import * as Tracer from "effect/Tracer";
4
5import * as EnvironmentConnector from "./environments/EnvironmentConnector.ts";
6import * as Observability from "./observability.ts";
7
8it.effect("adds schema error fields to spans on the current tracer", () =>
9 Effect.gen(function* () {
10 const spans: Array<Tracer.NativeSpan> = [];
11 const tracer = Tracer.make({
12 span: (options) => {
13 const span = new Tracer.NativeSpan(options);
14 spans.push(span);
15 return span;
16 },
17 });
18
19 yield* Effect.fail(
20 new EnvironmentConnector.EnvironmentConnectNotAuthorized({
21 environmentId: "environment-1",
22 operation: "connect",
23 reason: "managed_endpoint_allocation_not_ready",
24 }),
25 ).pipe(
26 Effect.withSpan("relay.test.schema_error"),
27 Effect.exit,
28 Observability.withSchemaErrorSpanAttributes,
29 Effect.withTracer(tracer),
30 );
31
32 expect(spans.map((span) => span.name)).toEqual(["relay.test.schema_error"]);
33 expect(Object.fromEntries(spans[0]!.attributes)).toMatchObject({
34 "error.type": "EnvironmentConnectNotAuthorized",
35 "error.environmentId": "environment-1",
36 "error.operation": "connect",
37 "error.reason": "managed_endpoint_allocation_not_ready",
38 });
39 }),
40);