4f95c9de4e
* v3: cancel subtasks when parent task runs are cancelled * v3: recover from server rate limiting errors in a more reliable way - Changing from sliding window to token bucket in the API rate limiter, to help smooth out traffic - Adding spans to the API Client core & SDK functions - Added waiting spans when retrying in the API Client - Retrying in the API Client now respects the x-ratelimit-reset - Retrying ApiError’s in tasks now respects the x-ratelimit-reset - Added AbortTaskRunError that when thrown will stop retries - Added idempotency keys SDK functions and automatically injecting the run ID when inside a task - Added the ability to configure ApiRequestOptions (retries only for now) globally and on specific calls - Implement the maxAttempts TaskRunOption (it wasn’t doing anything before) * Adding some docs about the request options * Fix type error * Remove context propagation through graphile jobs * Remove logger * only select a subset of task run columns * limit columns selected in batchTrigger as well * added idempotency doc * allow scoped idempotency keys, and fixed an issue with the unique index on BatchTaskRun and TaskRun * Removed old cancel task run children code
46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
import { Span, SpanKind } from "@opentelemetry/api";
|
|
import { PrismaClientOrTransaction, prisma } from "~/db.server";
|
|
import { AuthenticatedEnvironment } from "~/services/apiAuth.server";
|
|
import { attributesFromAuthenticatedEnv, tracer } from "../tracer.server";
|
|
|
|
export abstract class BaseService {
|
|
constructor(protected readonly _prisma: PrismaClientOrTransaction = prisma) {}
|
|
|
|
protected async traceWithEnv<T>(
|
|
trace: string,
|
|
env: AuthenticatedEnvironment,
|
|
fn: (span: Span) => Promise<T>
|
|
): Promise<T> {
|
|
return tracer.startActiveSpan(
|
|
`${this.constructor.name}.${trace}`,
|
|
{ attributes: attributesFromAuthenticatedEnv(env), kind: SpanKind.SERVER },
|
|
async (span) => {
|
|
try {
|
|
return await fn(span);
|
|
} catch (e) {
|
|
if (e instanceof ServiceValidationError) {
|
|
throw e;
|
|
}
|
|
|
|
if (e instanceof Error) {
|
|
span.recordException(e);
|
|
} else {
|
|
span.recordException(new Error(String(e)));
|
|
}
|
|
|
|
throw e;
|
|
} finally {
|
|
span.end();
|
|
}
|
|
}
|
|
);
|
|
}
|
|
}
|
|
|
|
export class ServiceValidationError extends Error {
|
|
constructor(message: string, public status?: number) {
|
|
super(message);
|
|
this.name = "ServiceValidationError";
|
|
}
|
|
}
|