Skip to content

Commit 7e64a51

Browse files
carderneTrigger.dev RepoOps
authored andcommitted
chore(webapp): remove temporary session authorization telemetry
Remove temporary session authorization telemetry without changing permission checks or API responses. Mono-RevId: b8095b2df4071a598d68cdf4251f600b8ea1058c
1 parent 2a7beda commit 7e64a51

3 files changed

Lines changed: 3 additions & 138 deletions

File tree

‎apps/webapp/app/routes/api.v1.sessions.ts‎

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,7 @@ import {
3232
createLoaderApiRoute,
3333
everyResource,
3434
} from "~/services/routeBuilders/apiBuilder.server";
35-
import {
36-
recordSessionCreateAuthorization,
37-
sessionCreateAuthorizationOutcome,
38-
} from "~/services/sessionAuthorizationTelemetry.server";
35+
import { sessionCreateAuthorizationOutcome } from "~/services/sessionAuthorizationTelemetry.server";
3936
import { ServiceValidationError } from "~/v3/services/common.server";
4037
import { runStore } from "~/v3/runStore.server";
4138

@@ -163,7 +160,7 @@ const { action } = createActionApiRoute(
163160
},
164161
corsStrategy: "all",
165162
},
166-
async ({ authentication, body, ability, request }) => {
163+
async ({ authentication, body, ability }) => {
167164
try {
168165
if (body.externalId && !isSafeSessionExternalId(body.externalId)) {
169166
return json(
@@ -229,7 +226,6 @@ const { action } = createActionApiRoute(
229226
);
230227
}
231228

232-
recordSessionCreateAuthorization(ability, session, request, authentication.environment);
233229
if (
234230
sessionCreateAuthorizationOutcome(
235231
ability,
Lines changed: 1 addition & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,6 @@
1-
import { trace } from "@opentelemetry/api";
2-
import {
3-
BasicTracerProvider,
4-
InMemorySpanExporter,
5-
SimpleSpanProcessor,
6-
} from "@opentelemetry/sdk-trace-base";
71
import { buildJwtAbility, withActionAliases } from "@trigger.dev/rbac";
82
import { describe, expect, it } from "vitest";
9-
import {
10-
recordSessionCreateAuthorization,
11-
sessionCreateAuthorizationOutcome,
12-
} from "~/services/sessionAuthorizationTelemetry.server";
3+
import { sessionCreateAuthorizationOutcome } from "~/services/sessionAuthorizationTelemetry.server";
134

145
describe("session creation authorization observation", () => {
156
it.each([
@@ -44,62 +35,4 @@ describe("session creation authorization observation", () => {
4435
);
4536
}
4637
);
47-
48-
it("attributes only would-deny events without exporting the credential or task", async () => {
49-
const exporter = new InMemorySpanExporter();
50-
const provider = new BasicTracerProvider({
51-
spanProcessors: [new SimpleSpanProcessor(exporter)],
52-
});
53-
trace.setGlobalTracerProvider(provider);
54-
const credential = `tr_prod_sk_${"a".repeat(24)}`;
55-
const request = new Request("https://example.com/api/v1/sessions", {
56-
method: "POST",
57-
headers: { Authorization: `Bearer ${credential}` },
58-
body: JSON.stringify({ taskIdentifier: "requested-task" }),
59-
});
60-
const environment = {
61-
id: "env-1",
62-
organizationId: "org-1",
63-
projectId: "project-1",
64-
type: "PRODUCTION" as const,
65-
};
66-
67-
try {
68-
recordSessionCreateAuthorization(
69-
withActionAliases(buildJwtAbility(["write:tasks:chat"])),
70-
{ taskIdentifier: "chat" },
71-
request,
72-
environment
73-
);
74-
recordSessionCreateAuthorization(
75-
buildJwtAbility(["admin"]),
76-
{ taskIdentifier: "chat" },
77-
request,
78-
environment
79-
);
80-
recordSessionCreateAuthorization(
81-
withActionAliases(buildJwtAbility(["write:sessions", "trigger:tasks:requested-task"])),
82-
{ taskIdentifier: "stored-task" },
83-
request,
84-
environment
85-
);
86-
const spans = exporter.getFinishedSpans();
87-
expect(spans).toHaveLength(2);
88-
expect(spans[1].attributes["session.authorization.outcome"]).toBe("missing_task_trigger");
89-
expect(spans[0].name).toBe("session.create.authorization_would_deny");
90-
expect(spans[0].attributes).toMatchObject({
91-
forceRecording: true,
92-
"$trigger.org.id": "org-1",
93-
"$trigger.project.id": "project-1",
94-
"$trigger.env.id": "env-1",
95-
"session.authorization.credential_kind": "additional_api_key",
96-
"session.authorization.outcome": "missing_session_write",
97-
});
98-
expect(JSON.stringify(spans[0].attributes)).not.toContain(credential);
99-
expect(Object.values(spans[0].attributes)).not.toContain("chat");
100-
} finally {
101-
trace.disable();
102-
await provider.shutdown();
103-
}
104-
});
10538
});
Lines changed: 0 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,4 @@
1-
import { getMeter, getTracer, ROOT_CONTEXT } from "@internal/tracing";
2-
import type { AuthenticatedEnvironment } from "@trigger.dev/core/v3/auth/environment";
3-
import { isAdditionalApiKey } from "@trigger.dev/core/v3/apiKeys";
4-
import { isPublicJWT } from "@trigger.dev/core/v3/jwt";
51
import type { RbacAbility } from "@trigger.dev/rbac";
6-
import { singleton } from "~/utils/singleton";
7-
import { logger } from "~/services/logger.server";
8-
9-
const checks = singleton("sessionCreateAuthorizationChecks", () =>
10-
getMeter("session-authorization").createCounter("session.create.authorization_checks", {
11-
description:
12-
"Session creation requests admitted by current authorization, by proposed permission outcome",
13-
})
14-
);
152

163
export function sessionCreateAuthorizationOutcome(
174
ability: RbacAbility,
@@ -27,54 +14,3 @@ export function sessionCreateAuthorizationOutcome(
2714
if (!sessionWrite && !taskTrigger) return "missing_both";
2815
return sessionWrite ? "missing_task_trigger" : "missing_session_write";
2916
}
30-
31-
export function recordSessionCreateAuthorization(
32-
ability: RbacAbility,
33-
session: { taskIdentifier: string; friendlyId?: string; externalId?: string | null },
34-
request: Request,
35-
environment: Pick<AuthenticatedEnvironment, "id" | "organizationId" | "projectId" | "type">
36-
) {
37-
const token =
38-
request.headers
39-
.get("Authorization")
40-
?.replace(/^Bearer /, "")
41-
.trim() ?? "";
42-
const credentialKind = isPublicJWT(token)
43-
? "public_jwt"
44-
: isAdditionalApiKey(token)
45-
? "additional_api_key"
46-
: token.startsWith("tr_")
47-
? "root_api_key"
48-
: "unknown";
49-
50-
try {
51-
const outcome = sessionCreateAuthorizationOutcome(
52-
ability,
53-
session.taskIdentifier,
54-
[session.friendlyId, session.externalId].filter((id): id is string => !!id)
55-
);
56-
checks.add(1, { credential_kind: credentialKind, outcome });
57-
if (outcome === "both_allowed") return;
58-
59-
// Force-record an independent root span so request sampling cannot hide affected tenants.
60-
getTracer("session-authorization")
61-
.startSpan(
62-
"session.create.authorization_would_deny",
63-
{
64-
attributes: {
65-
forceRecording: true,
66-
"$trigger.org.id": environment.organizationId,
67-
"$trigger.project.id": environment.projectId,
68-
"$trigger.env.id": environment.id,
69-
"$trigger.env.type": environment.type,
70-
"session.authorization.credential_kind": credentialKind,
71-
"session.authorization.outcome": outcome,
72-
},
73-
},
74-
ROOT_CONTEXT
75-
)
76-
.end();
77-
} catch {
78-
logger.debug("Session authorization observation failed");
79-
}
80-
}

0 commit comments

Comments
 (0)