History

fix(relay): scope Axiom resources by stage

Julius Marminge committed 5 months ago

Commit fe2e5571 parent 4d31e084 files · +24 −4Browse files

Unified · Split

4 files
  1. docs/relay-observability.md +3 −1
  2. infra/relay/src/deploymentConfig.test.ts +10 −0
  3. infra/relay/src/deploymentConfig.ts +4 −0
  4. infra/relay/src/observability.ts +7 −3
docs/relay-observability.md+3−1
@@ -4,9 +4,11 @@ The relay Alchemy stack owns a focused Axiom trace setup: · 3 unmodified lines
44
55 - `t3-code-relay-traces`, an OpenTelemetry trace dataset for Worker requests
66 - `t3-code-relay-otel-ingest`, a dataset-scoped ingest token bound to the Worker
7−- `t3-code-relay-readonly-query`, a dataset-scoped token for scripted diagnostics
87 - `t3-code-relay-recent-spans`, a view of recent request and endpoint spans
98
9+These are the production names. Non-production Alchemy stages append their sanitized stage name,
10+for example `t3-code-relay-traces-dev-julius`.
11+
1012 Deploy from `infra/relay` with the normal Alchemy workflow:
1113
1214 ```sh
infra/relay/src/deploymentConfig.test.ts+10−0
@@ -5,6 +5,7 @@ import { · 4 unmodified lines
55 managedEndpointHostname,
66 managedEndpointTunnelName,
77 relayPublicDomainForStage,
8+ relayResourceNameForStage,
89 relayStageSlug,
910 } from "./deploymentConfig.ts";
1011
@@ -26,6 +27,15 @@ describe("relayPublicDomainForStage", () => { · 15 unmodified lines
2627 });
2728 });
2829
30+describe("relayResourceNameForStage", () => {
31+ it("preserves production names and isolates personal stages", () => {
32+ expect(relayResourceNameForStage("t3-code-relay-traces", "prod")).toBe("t3-code-relay-traces");
33+ expect(relayResourceNameForStage("t3-code-relay-traces", "dev_julius")).toBe(
34+ "t3-code-relay-traces-dev-julius",
35+ );
36+ });
37+});
38+
2939 describe("managed endpoint names", () => {
3040 it("uses the stage slug and a stable stage-scoped digest suffix", () => {
3141 const hash = "ABCDEF0123456789ABCDEF0123456789";
infra/relay/src/deploymentConfig.ts+4−0
@@ -33,6 +33,10 @@ export function relayStageSlug(stage: string): string { · 32 unmodified lines
3333 .replace(/^-+|-+$/g, "");
3434 }
3535
36+export function relayResourceNameForStage(name: string, stage: string): string {
37+ return stage === "prod" ? name : `${name}-${relayStageSlug(stage)}`;
38+}
39+
3640 export function relayPublicDomainForStage(stage: string, zoneName: string): string {
3741 const stageSlug = relayStageSlug(stage);
3842 const relayLabel = stage === "prod" ? "relay" : `relay-${stageSlug}`;
infra/relay/src/observability.ts+7−3
@@ -1,3 +1,4 @@
1+import * as Alchemy from "alchemy";
12 import * as Axiom from "alchemy/Axiom";
23 import * as Output from "alchemy/Output";
34 import * as Layer from "effect/Layer";
@@ -5,6 +6,8 @@ import * as Effect from "effect/Effect"; · 1 unmodified line
56 import * as Redacted from "effect/Redacted";
67 import { OtlpSerialization, OtlpTracer } from "effect/unstable/observability";
78
9+import { relayResourceNameForStage } from "./deploymentConfig.ts";
10+
811 const relayRecentSpansQuery = (dataset: string) =>
912 [
1013 `['${dataset}']`,
@@ -17,8 +20,9 @@ const relayRecentSpansQuery = (dataset: string) => · 6 unmodified lines
1720 ].join("\n");
1821
1922 export const RelayObservability = Effect.gen(function* () {
23+ const stage = yield* Alchemy.Stage;
2024 const traces = yield* Axiom.Dataset("RelayTracesDataset", {
21− name: "t3-code-relay-traces",
25+ name: relayResourceNameForStage("t3-code-relay-traces", stage),
2226 kind: "otel:traces:v1",
2327 description: "T3 Code relay Worker HTTP request spans.",
2428 retentionDays: 30,
@@ -26,7 +30,7 @@ export const RelayObservability = Effect.gen(function* () { · 1 unmodified line
2630 });
2731
2832 const ingestToken = yield* Axiom.ApiToken("RelayAxiomIngestToken", {
29− name: "t3-code-relay-otel-ingest",
33+ name: relayResourceNameForStage("t3-code-relay-otel-ingest", stage),
3034 description: "Owned by Alchemy. Scoped OTLP ingest token for relay HTTP spans.",
3135 datasetCapabilities: Output.map(traces.name, (dataset) => ({
3236 [dataset]: { ingest: ["create" as const] },
@@ -34,7 +38,7 @@ export const RelayObservability = Effect.gen(function* () { · 1 unmodified line
3438 });
3539
3640 yield* Axiom.View("RelayRecentSpansView", {
37− name: "t3-code-relay-recent-spans",
41+ name: relayResourceNameForStage("t3-code-relay-recent-spans", stage),
3842 description: "Recent relay HTTP request spans.",
3943 datasets: [traces.name],
4044 aplQuery: Output.map(traces.name, relayRecentSpansQuery),