51 lines
1.7 KiB
TypeScript
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),
|
|
});
|
|
}
|
|
}
|