Skip to content

Commit bf7f10a

Browse files
juliusmarmingecodex
andcommitted
Simplify relay observability to HTTP traces
Co-authored-by: codex <codex@users.noreply.github.com>
1 parent 722125f commit bf7f10a

22 files changed

Lines changed: 152 additions & 1028 deletions

infra/relay/src/api.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ import * as EnvironmentCredentials from "./persistence/EnvironmentCredentials.ts
5858
import * as EnvironmentLinks from "./persistence/EnvironmentLinks.ts";
5959
import * as LiveActivities from "./persistence/LiveActivities.ts";
6060
import * as Settings from "./settings.ts";
61-
import { increment, relayEnvironmentLinksTotal } from "./observability/Metrics.ts";
6261
import * as AgentActivityPublisher from "./services/AgentActivityPublisher.ts";
6362
import * as EnvironmentConnector from "./services/EnvironmentConnector.ts";
6463
import * as EnvironmentLinker from "./services/EnvironmentLinker.ts";
@@ -377,7 +376,7 @@ export const clientApi = HttpApiBuilder.group(RelayApi, "client", (handlers) =>
377376
endpointRuntime: result.endpointRuntime,
378377
relayIssuer: settings.relayIssuer,
379378
environmentCredential: result.environmentCredential,
380-
cloudMintPublicKey: Redacted.value(settings.cloudMintPublicKey),
379+
cloudMintPublicKey: settings.cloudMintPublicKey,
381380
};
382381
},
383382
mapRelayCommonApiErrors("not_authorized"),
@@ -472,10 +471,6 @@ export const clientApi = HttpApiBuilder.group(RelayApi, "client", (handlers) =>
472471
environmentId: params.environmentId,
473472
});
474473
if (unlinked) {
475-
yield* increment(relayEnvironmentLinksTotal, {
476-
operation: "unlink",
477-
endpointProviderKind: link.endpoint.providerKind,
478-
});
479474
yield* credentials.revokeForEnvironmentPublicKey({
480475
environmentId: link.environmentId,
481476
environmentPublicKey: link.environmentPublicKey,

infra/relay/src/apns.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,10 @@ function makeApnsJwt(input: {
7373
}): Effect.Effect<string, ApnsSigningError> {
7474
return Effect.try({
7575
try: () => {
76-
const keyId = Redacted.value(input.keyId);
77-
const teamId = Redacted.value(input.teamId);
7876
const privateKey = Redacted.value(input.privateKey);
79-
const header = Encoding.encodeBase64Url(JSON.stringify({ alg: "ES256", kid: keyId }));
77+
const header = Encoding.encodeBase64Url(JSON.stringify({ alg: "ES256", kid: input.keyId }));
8078
const payload = Encoding.encodeBase64Url(
81-
JSON.stringify({ iss: teamId, iat: input.issuedAtUnixSeconds }),
79+
JSON.stringify({ iss: input.teamId, iat: input.issuedAtUnixSeconds }),
8280
);
8381
const signingInput = `${header}.${payload}`;
8482
const signature = NodeCrypto.createSign("sha256")
@@ -215,7 +213,7 @@ export function sendLiveActivityRequest(input: {
215213
authorization: `bearer ${jwt}`,
216214
"apns-priority": input.request.priority,
217215
"apns-push-type": "liveactivity",
218-
"apns-topic": `${Redacted.value(input.credentials.bundleId)}.push-type.liveactivity`,
216+
"apns-topic": `${input.credentials.bundleId}.push-type.liveactivity`,
219217
}),
220218
HttpClientRequest.bodyJson(input.request.payload),
221219
Effect.flatMap(httpClient.execute),
@@ -254,7 +252,7 @@ export function sendPushNotificationRequest(input: {
254252
authorization: `bearer ${jwt}`,
255253
"apns-priority": input.request.priority,
256254
"apns-push-type": "alert",
257-
"apns-topic": Redacted.value(input.credentials.bundleId),
255+
"apns-topic": input.credentials.bundleId,
258256
}),
259257
HttpClientRequest.bodyJson(input.request.payload),
260258
Effect.flatMap(httpClient.execute),
Lines changed: 9 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,28 @@
11
import { describe, expect, it } from "vitest";
22

33
import {
4-
RELAY_AXIOM_DATASETS,
5-
makeRelayDashboardCharts,
6-
makeRelayDashboardLayout,
4+
RELAY_AXIOM_TRACE_DATASET,
75
relayAxiomIngestDatasetCapabilities,
86
relayAxiomQueryDatasetCapabilities,
7+
relayTraceQuery,
98
} from "./RelayObservability.ts";
109

1110
describe("RelayObservability", () => {
12-
it("scopes the ingest token to create-only ingest across relay datasets", () => {
11+
it("scopes the ingest token only to HTTP span ingestion", () => {
1312
expect(relayAxiomIngestDatasetCapabilities()).toEqual({
14-
[RELAY_AXIOM_DATASETS.events]: { ingest: ["create"] },
15-
[RELAY_AXIOM_DATASETS.metrics]: { ingest: ["create"] },
13+
[RELAY_AXIOM_TRACE_DATASET]: { ingest: ["create"] },
1614
});
1715
});
1816

19-
it("scopes the diagnostics query token to read-only query across relay datasets", () => {
17+
it("scopes the diagnostics query token only to HTTP spans", () => {
2018
expect(relayAxiomQueryDatasetCapabilities()).toEqual({
21-
[RELAY_AXIOM_DATASETS.events]: { query: ["read"] },
22-
[RELAY_AXIOM_DATASETS.metrics]: { query: ["read"] },
19+
[RELAY_AXIOM_TRACE_DATASET]: { query: ["read"] },
2320
});
2421
});
2522

26-
it("keeps dashboard layout cells in sync with declared charts", () => {
27-
const charts = makeRelayDashboardCharts();
28-
const chartIds = new Set(charts.map((chart) => chart.id));
29-
const layout = makeRelayDashboardLayout(charts);
30-
31-
expect(layout).toHaveLength(charts.length);
32-
for (const cell of layout) {
33-
expect(chartIds.has(cell.i)).toBe(true);
34-
}
35-
});
36-
37-
it("builds log APL and metrics MPL dashboard queries", () => {
38-
const charts = makeRelayDashboardCharts({
39-
events: "relay-events-test",
40-
metrics: "relay-metrics-test",
41-
});
42-
const recentFailures = charts.find((chart) => chart.id === "recent-failures");
43-
const activeTunnels = charts.find((chart) => chart.id === "active-managed-tunnels");
44-
if (
45-
!recentFailures ||
46-
!("query" in recentFailures) ||
47-
!activeTunnels ||
48-
!("query" in activeTunnels)
49-
) {
50-
throw new Error("Expected query-backed relay charts.");
51-
}
52-
53-
expect(recentFailures.query.apl).toContain("['relay-events-test']");
54-
expect(recentFailures.query.apl).toContain("column_ifexists('severityText', '')");
55-
expect(recentFailures.query.apl).not.toContain("severity_text");
56-
expect(activeTunnels.query.apl).toContain(
57-
"`relay-metrics-test`:`relay_managed_tunnels_active`",
23+
it("builds APL queries for the trace dataset", () => {
24+
expect(relayTraceQuery("| where name == 'GET /health'", "relay-traces-test")).toBe(
25+
"['relay-traces-test']\n| where name == 'GET /health'",
5826
);
59-
expect(activeTunnels.query.apl).toContain("| group using sum");
60-
expect(activeTunnels.query.apl).not.toContain("['relay-metrics-test']");
6127
});
6228
});

0 commit comments

Comments
 (0)