From c029b3817e4c412f17d45018fb3f449dc7a03fa4 Mon Sep 17 00:00:00 2001 From: James Ritchie Date: Tue, 18 Feb 2025 15:36:43 +0000 Subject: [PATCH 1/5] Adds more Prisma documentation --- docs/config/config-file.mdx | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/docs/config/config-file.mdx b/docs/config/config-file.mdx index f5ff2a14f0..28903af710 100644 --- a/docs/config/config-file.mdx +++ b/docs/config/config-file.mdx @@ -397,10 +397,12 @@ This is usually required if you are using certain ORMs, like TypeORM, that requi If you are using Prisma, you should use the prisma build extension. -- Automatically handles copying prisma files to the build directory. -- Generates the prisma client during the deploy process +- Automatically handles copying Prisma files to the build directory +- Generates the Prisma client during the deploy process - Optionally will migrate the database during the deploy process -- Support for TypedSQL and multiple schema files. +- Support for TypedSQL and multiple schema files +- You can use `prismaSchemaFolder` to specify just the directory containing your schema file, instead of the full path +- You can add the extension twice if you have multiple separate schemas in the same project (example below) You can use it for a simple Prisma setup like this: @@ -522,6 +524,21 @@ These environment variables are only used during the build process and are not e +If you have multiple separate schemas in the same project you can add the extension multiple times: + +```ts +prismaExtension({ + schema: 'prisma/schema/main.prisma', + version: '6.2.0', + migrate: false, +}), +prismaExtension({ + schema: 'prisma/schema/secondary.prisma', + version: '6.2.0', + migrate: false, +}), +``` + #### syncEnvVars The `syncEnvVars` build extension replaces the deprecated `resolveEnvVars` export. Check out our [syncEnvVars documentation](/deploy-environment-variables#sync-env-vars-from-another-service) for more information. From b5c5b678a77c899efc984060f886eee501978255 Mon Sep 17 00:00:00 2001 From: James Ritchie Date: Tue, 18 Feb 2025 17:00:04 +0000 Subject: [PATCH 2/5] Adds more info and a diagram to improve idempotencyKeyTTLs --- docs/idempotency.mdx | 8 ++++++++ docs/images/idempotency-key-ttl.png | Bin 0 -> 38984 bytes 2 files changed, 8 insertions(+) create mode 100644 docs/images/idempotency-key-ttl.png diff --git a/docs/idempotency.mdx b/docs/idempotency.mdx index 7e3743fff6..e9400a77eb 100644 --- a/docs/idempotency.mdx +++ b/docs/idempotency.mdx @@ -94,6 +94,14 @@ await tasks.batchTrigger("my-task", [ ## `idempotencyKeyTTL` option +The `idempotencyKeyTTL` option defines a time window during which a task with the same idempotency key will only run once. Here's how it works: + +1. When you trigger a task with an idempotency key and set `idempotencyKeyTTL: "5m"`, it creates a 5-minute window. +2. During this window, any subsequent triggers with the same idempotency key will return the original task run instead of creating a new one. +3. Once the TTL window expires, the next trigger with that idempotency key will create a new task run and start a new time window. + +![idempotency-key-ttl](/images/idempotency-key-ttl.png) + By default idempotency keys are stored for 30 days. You can change this by passing the `idempotencyKeyTTL` option when triggering a task: ```ts diff --git a/docs/images/idempotency-key-ttl.png b/docs/images/idempotency-key-ttl.png new file mode 100644 index 0000000000000000000000000000000000000000..2da392940fc4ffb0ec57525fd759ef4dfce17b74 GIT binary patch literal 38984 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%0A)ztiGsQySaIF&`m4V19(sZ!&T5-^1wu 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 literal 0 HcmV?d00001 From d5c25e66d3b226c1d24ace45737f723c58b57862 Mon Sep 17 00:00:00 2001 From: James Ritchie Date: Tue, 18 Feb 2025 17:11:02 +0000 Subject: [PATCH 3/5] Adds more clarity to the run with TTL docs section --- docs/runs.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/runs.mdx b/docs/runs.mdx index 9ffe6d05c4..6de858b682 100644 --- a/docs/runs.mdx +++ b/docs/runs.mdx @@ -133,7 +133,9 @@ You can set a TTL when triggering a run: await yourTask.trigger({ foo: "bar" }, { ttl: "10m" }); ``` -If the run hasn't started within the specified TTL, it will automatically expire. This is useful for time-sensitive tasks. Note that dev runs automatically have a 10-minute TTL. +If the run hasn't started within the specified TTL, it will automatically expire, returning the status `Expired`. This is useful for time-sensitive tasks where immediate execution is important. For example, when you queue many runs simultaneously and exceed your concurrency limits, some runs might be delayed - using TTL ensures they only execute if they can start within your specified timeframe. + +Note that dev runs automatically have a 10-minute TTL. In Staging and Production environments, no TTL is set by default. ![Run with TTL](/images/run-with-ttl.png) From 971995b219be1687bef6043083727b5e4e89bb8b Mon Sep 17 00:00:00 2001 From: James Ritchie Date: Wed, 19 Feb 2025 10:41:32 +0000 Subject: [PATCH 4/5] Limits page copy improvements --- docs/limits.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/limits.mdx b/docs/limits.mdx index 3e64745cd3..fe1522b051 100644 --- a/docs/limits.mdx +++ b/docs/limits.mdx @@ -114,7 +114,7 @@ We limit the size of logs to prevent oversized data potentially causing issues. ## Alerts -An alert destination is a single email address, Slack channel, or webhook URL that you want to send alerts to. If you're on the Pro and need more than 100 alert destinations, you can request more by contacting us via [email](https://trigger.dev/contact) or [Discord](https://trigger.dev/discord). +An alert destination is a single email address, Slack channel, or webhook URL that you want to send alerts to. If you're on the Pro plan and need more than the plan limit, you can request more by contacting us via [email](https://trigger.dev/contact) or [Discord](https://trigger.dev/discord). | Pricing tier | Limit | | :----------- | :---------------------- | From fb4a21d5d8ba7e04c115c3d03ae99e01a89c4614 Mon Sep 17 00:00:00 2001 From: James Ritchie Date: Wed, 19 Feb 2025 10:42:15 +0000 Subject: [PATCH 5/5] Adds schema properties to the alert webhooks --- docs/troubleshooting-alerts.mdx | 289 ++++++++++++++++++++++++++++++++ 1 file changed, 289 insertions(+) diff --git a/docs/troubleshooting-alerts.mdx b/docs/troubleshooting-alerts.mdx index 2bbd8e8233..b79ddb05cf 100644 --- a/docs/troubleshooting-alerts.mdx +++ b/docs/troubleshooting-alerts.mdx @@ -94,3 +94,292 @@ export async function action({ request }: ActionFunctionArgs) { } } ``` + +### Common properties + +When you create a webhook alert, you'll receive different payloads depending on the type of alert. All webhooks share some common properties: + + + A unique identifier for this webhook event + + + + When this webhook event was created + + + + The version of the webhook payload format + + + + The type of alert webhook. One of: `alert.run.failed`, `alert.deployment.success`, or `alert.deployment.failed` + + +### Run Failed Alert + +This webhook is sent when a run fails. The payload is available on the `object` property: + + + Unique identifier for the task + + + + File path where the task is defined + + + + Name of the exported task function + + + + Version of the task + + + + Version of the SDK used + + + + Version of the CLI used + + + + Unique identifier for the run + + + + Run number + + + + Current status of the run + + + + When the run was created + + + + When the run started executing + + + + When the run finished executing + + + + Whether this is a test run + + + + Idempotency key for the run + + + + Associated tags + + + + Error information + + + + Whether the run was an out-of-memory error + + + + Machine preset used for the run + + + + URL to view the run in the dashboard + + + + Environment ID + + + + Environment type (STAGING or PRODUCTION) + + + + Environment slug + + + + Organization ID + + + + Organization slug + + + + Organization name + + + + Project ID + + + + Project reference + + + + Project slug + + + + Project name + + +### Deployment Success Alert + +This webhook is sent when a deployment succeeds. The payload is available on the `object` property: + + + Deployment ID + + + + Deployment status + + + + Deployment version + + + + Short code identifier + + + + When the deployment completed + + + + Array of deployed tasks with properties: id, filePath, exportName, and triggerSource + + + + Environment ID + + + + Environment type (STAGING or PRODUCTION) + + + + Environment slug + + + + Organization ID + + + + Organization slug + + + + Organization name + + + + Project ID + + + + Project reference + + + + Project slug + + + + Project name + + +### Deployment Failed Alert + +This webhook is sent when a deployment fails. The payload is available on the `object` property: + + + Deployment ID + + + + Deployment status + + + + Deployment version + + + + Short code identifier + + + + When the deployment failed + + + + Error name + + + + Error message + + + + Error stack trace (optional) + + + + Standard error output (optional) + + + + Environment ID + + + + Environment type (STAGING or PRODUCTION) + + + + Environment slug + + + + Organization ID + + + + Organization slug + + + + Organization name + + + + Project ID + + + + Project reference + + + + Project slug + + + + Project name + +