Files
2026-07-13 13:32:57 +08:00

51 lines
1.7 KiB
TypeScript

import { SpanStatusCode } from "@opentelemetry/api";
import { type WorkerDeploymentStatus } from "@trigger.dev/database";
import { logger } from "~/services/logger.server";
import { tracer } from "~/v3/tracer.server";
type TerminalDeploymentStatus = Extract<
WorkerDeploymentStatus,
"DEPLOYED" | "FAILED" | "TIMED_OUT"
>;
/**
* Records a deployment's terminal status as a `deployment.outcome` span so
* deploy success/failure is queryable from traces (no DB read). Call after each
* terminal-status write. Org/project/env are best-effort; never throws.
*/
export function recordDeploymentOutcome(params: {
status: TerminalDeploymentStatus;
deploymentFriendlyId: string;
organizationId?: string;
projectId?: string;
environmentId?: string;
environmentType?: string;
reason?: string;
}): void {
try {
const span = tracer.startSpan("deployment.outcome", {
attributes: {
"$trigger.org.id": params.organizationId,
"$trigger.project.id": params.projectId,
"$trigger.env.id": params.environmentId,
"$trigger.env.type": params.environmentType,
"deployment.outcome.status": params.status,
"deployment.outcome.success": params.status === "DEPLOYED",
"deployment.outcome.deployment_id": params.deploymentFriendlyId,
"deployment.outcome.reason": params.reason,
},
});
if (params.status !== "DEPLOYED") {
span.setStatus({ code: SpanStatusCode.ERROR, message: params.reason });
}
span.end();
} catch (error) {
logger.debug("recordDeploymentOutcome failed", {
deploymentFriendlyId: params.deploymentFriendlyId,
error: error instanceof Error ? error.message : String(error),
});
}
}