Skip to content

Commit d69e382

Browse files
committed
Merge branch 'main' into self-hosting-docs-updates
2 parents e5e7142 + c063dad commit d69e382

File tree

25 files changed

+201
-50
lines changed

25 files changed

+201
-50
lines changed

.changeset/heavy-jobs-push.md

Lines changed: 0 additions & 5 deletions
This file was deleted.

.changeset/real-bags-joke.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@trigger.dev/build": patch
3+
---
4+
5+
Puppeteer extension: set the PUPPETEER_EXECUTABLE_PATH env var

.changeset/short-tomatoes-beam.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@trigger.dev/core": patch
3+
---
4+
5+
Add otel propagation headers "below" the API fetch span, to attribute the child runs with the proper parent span ID

.changeset/yellow-knives-attack.md

Lines changed: 0 additions & 5 deletions
This file was deleted.

apps/webapp/app/models/orgIntegration.server.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,15 @@ export class OrgIntegrationRepository {
6969
return new WebClient(
7070
options?.forceBotToken
7171
? secret.botAccessToken
72-
: secret.userAccessToken ?? secret.botAccessToken
72+
: secret.userAccessToken ?? secret.botAccessToken,
73+
{
74+
retryConfig: {
75+
retries: 2,
76+
randomize: true,
77+
maxTimeout: 5000,
78+
maxRetryTime: 10000,
79+
},
80+
}
7381
) as AuthenticatedClientForIntegration<TService>;
7482
}
7583
default: {

apps/webapp/app/v3/eventRepository.server.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -835,7 +835,8 @@ export class EventRepository {
835835
options: TraceEventOptions & { incomplete?: boolean },
836836
callback: (
837837
e: EventBuilder,
838-
traceContext: Record<string, string | undefined>
838+
traceContext: Record<string, string | undefined>,
839+
traceparent?: { traceId: string; spanId: string }
839840
) => Promise<TResult>
840841
): Promise<TResult> {
841842
const propagatedContext = extractContextFromCarrier(options.context ?? {});
@@ -892,7 +893,7 @@ export class EventRepository {
892893
},
893894
};
894895

895-
const result = await callback(eventBuilder, traceContext);
896+
const result = await callback(eventBuilder, traceContext, propagatedContext?.traceparent);
896897

897898
const duration = process.hrtime.bigint() - start;
898899

apps/webapp/app/v3/services/alerts/deliverAlert.server.ts

Lines changed: 58 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ type FoundAlert = Prisma.Result<
7373
>;
7474
};
7575

76+
class SkipRetryError extends Error {}
77+
7678
export class DeliverAlertService extends BaseService {
7779
public async call(alertId: string) {
7880
const alert: FoundAlert | null = await this._prisma.projectAlert.findFirst({
@@ -136,22 +138,34 @@ export class DeliverAlertService extends BaseService {
136138
alert.failedAttempt = finishedAttempt;
137139
}
138140

139-
switch (alert.channel.type) {
140-
case "EMAIL": {
141-
await this.#sendEmail(alert);
142-
break;
143-
}
144-
case "SLACK": {
145-
await this.#sendSlack(alert);
146-
break;
147-
}
148-
case "WEBHOOK": {
149-
await this.#sendWebhook(alert);
150-
break;
141+
try {
142+
switch (alert.channel.type) {
143+
case "EMAIL": {
144+
await this.#sendEmail(alert);
145+
break;
146+
}
147+
case "SLACK": {
148+
await this.#sendSlack(alert);
149+
break;
150+
}
151+
case "WEBHOOK": {
152+
await this.#sendWebhook(alert);
153+
break;
154+
}
155+
default: {
156+
assertNever(alert.channel.type);
157+
}
151158
}
152-
default: {
153-
assertNever(alert.channel.type);
159+
} catch (error) {
160+
if (error instanceof SkipRetryError) {
161+
logger.error("[DeliverAlert] Skipping retry", {
162+
reason: error.message,
163+
});
164+
165+
return;
154166
}
167+
168+
throw error;
155169
}
156170

157171
await this._prisma.projectAlert.update({
@@ -617,7 +631,7 @@ export class DeliverAlertService extends BaseService {
617631
type: "section",
618632
text: {
619633
type: "mrkdwn",
620-
text: `\`\`\`${error.stackTrace ?? error.message}\`\`\``,
634+
text: this.#wrapInCodeBlock(error.stackTrace ?? error.message),
621635
},
622636
},
623637
{
@@ -729,7 +743,7 @@ export class DeliverAlertService extends BaseService {
729743
type: "section",
730744
text: {
731745
type: "mrkdwn",
732-
text: `\`\`\`${error.stackTrace ?? error.message}\`\`\``,
746+
text: this.#wrapInCodeBlock(error.stackTrace ?? error.message),
733747
},
734748
},
735749
{
@@ -829,7 +843,7 @@ export class DeliverAlertService extends BaseService {
829843
type: "section",
830844
text: {
831845
type: "mrkdwn",
832-
text: `\`\`\`${preparedError.stack ?? preparedError.message}\`\`\``,
846+
text: this.#wrapInCodeBlock(preparedError.stack ?? preparedError.message),
833847
},
834848
},
835849
{
@@ -1010,6 +1024,14 @@ export class DeliverAlertService extends BaseService {
10101024
message,
10111025
});
10121026

1027+
if (error.data.error === "invalid_blocks") {
1028+
logger.error("[DeliverAlert] Slack invalid blocks", {
1029+
error,
1030+
});
1031+
1032+
throw new SkipRetryError("Slack invalid blocks");
1033+
}
1034+
10131035
throw new Error("Slack platform error");
10141036
}
10151037

@@ -1047,6 +1069,25 @@ export class DeliverAlertService extends BaseService {
10471069
};
10481070
}
10491071

1072+
#wrapInCodeBlock(text: string, maxLength = 3000) {
1073+
return `\`\`\`${this.#truncateSlackText(text, maxLength - 10)}\`\`\``;
1074+
}
1075+
1076+
#truncateSlackText(text: string, length = 3000) {
1077+
if (text.length > length) {
1078+
logger.debug("[DeliverAlert] Truncating slack text", {
1079+
length,
1080+
originalLength: text.length,
1081+
});
1082+
1083+
const truncationSuffix = "\n\ntruncated - check dashboard for complete error message";
1084+
1085+
return text.slice(0, length - truncationSuffix.length) + truncationSuffix;
1086+
}
1087+
1088+
return text;
1089+
}
1090+
10501091
static async enqueue(
10511092
alertId: string,
10521093
tx: PrismaClientOrTransaction,

apps/webapp/app/v3/services/triggerTask.server.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ export class TriggerTaskService extends BaseService {
240240
incomplete: true,
241241
immediate: true,
242242
},
243-
async (event, traceContext) => {
243+
async (event, traceContext, traceparent) => {
244244
const run = await autoIncrementCounter.incrementInTransaction(
245245
`v3-run:${environment.id}:${taskId}`,
246246
async (num, tx) => {
@@ -307,6 +307,8 @@ export class TriggerTaskService extends BaseService {
307307
traceContext: traceContext,
308308
traceId: event.traceId,
309309
spanId: event.spanId,
310+
parentSpanId:
311+
options.parentAsLinkType === "replay" ? undefined : traceparent?.spanId,
310312
lockedToVersionId: lockedToBackgroundWorker?.id,
311313
concurrencyKey: body.options?.concurrencyKey,
312314
queue: queueName,

packages/build/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# @trigger.dev/build
22

3+
## 3.0.7
4+
5+
### Patch Changes
6+
7+
- Updated dependencies:
8+
- `@trigger.dev/core@3.0.7`
9+
310
## 3.0.6
411

512
### Patch Changes

packages/build/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@trigger.dev/build",
3-
"version": "3.0.6",
3+
"version": "3.0.7",
44
"description": "trigger.dev build extensions",
55
"license": "MIT",
66
"publishConfig": {
@@ -65,7 +65,7 @@
6565
"check-exports": "attw --pack ."
6666
},
6767
"dependencies": {
68-
"@trigger.dev/core": "workspace:3.0.6",
68+
"@trigger.dev/core": "workspace:3.0.7",
6969
"pkg-types": "^1.1.3",
7070
"tinyglobby": "^0.2.2",
7171
"tsconfck": "3.1.3"

packages/build/src/extensions/puppeteer.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ class PuppeteerExtension implements BuildExtension {
2929
image: {
3030
instructions,
3131
},
32+
deploy: {
33+
env: {
34+
PUPPETEER_EXECUTABLE_PATH: "/usr/bin/google-chrome-stable",
35+
},
36+
override: true,
37+
},
3238
});
3339
}
3440
}

packages/cli-v3/CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
# trigger.dev
22

3+
## 3.0.7
4+
5+
### Patch Changes
6+
7+
- Fix resolving external packages that are ESM only by falling back to mlly resolvePathSync. This will fix mupdf ([#1346](https://github.com/triggerdotdev/trigger.dev/pull/1346))
8+
- Add the "dev.vars" file to the list of auto-loaded dotenv files in the dev CLI command ([#1340](https://github.com/triggerdotdev/trigger.dev/pull/1340))
9+
- Updated dependencies:
10+
- `@trigger.dev/build@3.0.7`
11+
- `@trigger.dev/core@3.0.7`
12+
313
## 3.0.6
414

515
### Patch Changes

packages/cli-v3/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "trigger.dev",
3-
"version": "3.0.6",
3+
"version": "3.0.7",
44
"description": "A Command-Line Interface for Trigger.dev (v3) projects",
55
"type": "module",
66
"license": "MIT",
@@ -87,8 +87,8 @@
8787
"@opentelemetry/sdk-trace-base": "1.25.1",
8888
"@opentelemetry/sdk-trace-node": "1.25.1",
8989
"@opentelemetry/semantic-conventions": "1.25.1",
90-
"@trigger.dev/build": "workspace:3.0.6",
91-
"@trigger.dev/core": "workspace:3.0.6",
90+
"@trigger.dev/build": "workspace:3.0.7",
91+
"@trigger.dev/core": "workspace:3.0.7",
9292
"c12": "^1.11.1",
9393
"chalk": "^5.2.0",
9494
"cli-table3": "^0.6.3",

packages/cli-v3/src/config.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ function validateConfig(config: TriggerConfig, warn = true) {
228228
if (config.additionalFiles && config.additionalFiles.length > 0) {
229229
warn &&
230230
prettyWarning(
231-
`The "additionalFiles" option is deprecated and will be removed. Use the "additionalFiles" build extension instead. See https://trigger.dev/docs/guides/new-build-system-preview#additionalfiles for more information.`
231+
`The "additionalFiles" option is deprecated and will be removed. Use the "additionalFiles" build extension instead. See https://trigger.dev/docs/config/config-file#additionalfiles for more information.`
232232
);
233233

234234
config.build ??= {};
@@ -239,7 +239,7 @@ function validateConfig(config: TriggerConfig, warn = true) {
239239
if (config.additionalPackages && config.additionalPackages.length > 0) {
240240
warn &&
241241
prettyWarning(
242-
`The "additionalPackages" option is deprecated and will be removed. Use the "additionalPackages" build extension instead. See https://trigger.dev/docs/guides/new-build-system-preview#additionalpackages for more information.`
242+
`The "additionalPackages" option is deprecated and will be removed. Use the "additionalPackages" build extension instead. See https://trigger.dev/docs/config/config-file#additionalpackages for more information.`
243243
);
244244

245245
config.build ??= {};
@@ -275,7 +275,7 @@ function validateConfig(config: TriggerConfig, warn = true) {
275275
if ("resolveEnvVars" in config && typeof config.resolveEnvVars === "function") {
276276
warn &&
277277
prettyWarning(
278-
`The "resolveEnvVars" option is deprecated and will be removed. Use the "syncEnvVars" build extension instead. See https://trigger.dev/docs/guides/new-build-system-preview#resolveenvvars for more information.`
278+
`The "resolveEnvVars" option is deprecated and will be removed. Use the "syncEnvVars" build extension instead. See https://trigger.dev/docs/config/config-file#syncenvvars for more information.`
279279
);
280280

281281
const resolveEnvVarsFn = config.resolveEnvVars as ResolveEnvironmentVariablesFunction;

packages/core/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# internal-platform
22

3+
## 3.0.7
4+
35
## 3.0.6
46

57
### Patch Changes

packages/core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@trigger.dev/core",
3-
"version": "3.0.6",
3+
"version": "3.0.7",
44
"description": "Core code used across the Trigger.dev SDK and platform",
55
"license": "MIT",
66
"publishConfig": {

packages/core/src/v3/apiClient/core.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { RetryOptions } from "../schemas/index.js";
44
import { calculateNextRetryDelay } from "../utils/retries.js";
55
import { ApiConnectionError, ApiError, ApiSchemaValidationError } from "./errors.js";
66

7-
import { Attributes, Span } from "@opentelemetry/api";
7+
import { Attributes, Span, context, propagation } from "@opentelemetry/api";
88
import { SemanticInternalAttributes } from "../semanticInternalAttributes.js";
99
import { TriggerTracer } from "../tracer.js";
1010
import { accessoryAttributes } from "../utils/styleAttributes.js";
@@ -184,9 +184,11 @@ async function _doZodFetch<TResponseBodySchema extends z.ZodTypeAny>(
184184
requestInit?: PromiseOrValue<RequestInit>,
185185
options?: ZodFetchOptions
186186
): Promise<ZodFetchResult<z.output<TResponseBodySchema>>> {
187-
const $requestInit = await requestInit;
187+
let $requestInit = await requestInit;
188188

189189
return traceZodFetch({ url, requestInit: $requestInit, options }, async (span) => {
190+
$requestInit = injectPropagationHeadersIfInWorker($requestInit);
191+
190192
const result = await _doZodFetchWithRetries(schema, url, $requestInit, options);
191193

192194
if (options?.onResponseBody && span) {
@@ -577,3 +579,23 @@ export function isEmptyObj(obj: Object | null | undefined): boolean {
577579
export function hasOwn(obj: Object, key: string): boolean {
578580
return Object.prototype.hasOwnProperty.call(obj, key);
579581
}
582+
583+
// If the requestInit has a header x-trigger-worker = true, then we will do
584+
// propagation.inject(context.active(), headers);
585+
// and return the new requestInit.
586+
function injectPropagationHeadersIfInWorker(requestInit?: RequestInit): RequestInit | undefined {
587+
const headers = new Headers(requestInit?.headers);
588+
589+
if (headers.get("x-trigger-worker") !== "true") {
590+
return requestInit;
591+
}
592+
593+
const headersObject = Object.fromEntries(headers.entries());
594+
595+
propagation.inject(context.active(), headersObject);
596+
597+
return {
598+
...requestInit,
599+
headers: new Headers(headersObject),
600+
};
601+
}

packages/core/src/v3/apiClient/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { context, propagation } from "@opentelemetry/api";
21
import { z } from "zod";
32
import {
43
AddTagsRequestBody,
@@ -509,7 +508,6 @@ export class ApiClient {
509508
// Only inject the context if we are inside a task
510509
if (taskContext.isInsideTask) {
511510
headers["x-trigger-worker"] = "true";
512-
propagation.inject(context.active(), headers);
513511

514512
if (spanParentAsLink) {
515513
headers["x-trigger-span-parent-as-link"] = "1";

0 commit comments

Comments
 (0)