Fix 3rd party otel propagation from breaking our Task Events data from being properly correlated to the correct trace

This commit is contained in:
Eric Allam
2024-05-16 12:07:21 +01:00
parent c0b815c363
commit 6a379e4e91
8 changed files with 303 additions and 148 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"@trigger.dev/core": patch
---
Fix 3rd party otel propagation from breaking our Task Events data from being properly correlated to the correct trace
@@ -11,9 +11,10 @@ const ParamsSchema = z.object({
});
export const HeadersSchema = z.object({
"idempotency-key": z.string().optional().nullable(),
"trigger-version": z.string().optional().nullable(),
"x-trigger-span-parent-as-link": z.coerce.number().optional().nullable(),
"idempotency-key": z.string().nullish(),
"trigger-version": z.string().nullish(),
"x-trigger-span-parent-as-link": z.coerce.number().nullish(),
"x-trigger-worker": z.string().nullish(),
traceparent: z.string().optional(),
tracestate: z.string().optional(),
});
@@ -45,6 +46,7 @@ export async function action({ request, params }: ActionFunctionArgs) {
"x-trigger-span-parent-as-link": spanParentAsLink,
traceparent,
tracestate,
"x-trigger-worker": isFromWorker,
} = headers.data;
const { taskId } = ParamsSchema.parse(params);
@@ -58,20 +60,31 @@ export async function action({ request, params }: ActionFunctionArgs) {
return json({ error: "Invalid request body" }, { status: 400 });
}
logger.debug("Triggering task", {
taskId,
idempotencyKey,
triggerVersion,
body: body.data,
});
const service = new TriggerTaskService();
try {
const traceContext = traceparent
? !triggerVersion // If the trigger version is NOT set, we are in an older version of the SDK
? { traceparent, tracestate }
: isFromWorker // If the trigger version is set, and the request is from a worker, we should pass the trace context
? { traceparent, tracestate }
: undefined
: undefined;
logger.debug("Triggering task", {
taskId,
idempotencyKey,
triggerVersion,
headers: Object.fromEntries(request.headers),
body: body.data,
isFromWorker,
traceContext,
});
const run = await service.call(taskId, authenticationResult.environment, body.data, {
idempotencyKey: idempotencyKey ?? undefined,
triggerVersion: triggerVersion ?? undefined,
traceContext: traceparent ? { traceparent, tracestate } : undefined,
traceContext,
spanParentAsLink: spanParentAsLink === 1,
});
+3
View File
@@ -22,6 +22,7 @@ import { taskContext } from "../task-context-api";
import { getEnvVar } from "../utils/getEnv";
import { SafeAsyncLocalStorage } from "../utils/safeAsyncLocalStorage";
import { APIError } from "../apiErrors";
import { version } from "../../../package.json";
export type TriggerOptions = {
spanParentAsLink?: boolean;
@@ -239,10 +240,12 @@ export class ApiClient {
const headers: Record<string, string> = {
"Content-Type": "application/json",
Authorization: `Bearer ${this.accessToken}`,
"trigger-version": version,
};
// Only inject the context if we are inside a task
if (taskContext.isInsideTask) {
headers["x-trigger-worker"] = "true";
propagation.inject(context.active(), headers);
if (spanParentAsLink) {
+138 -48
View File
@@ -3123,6 +3123,48 @@ importers:
specifier: ^2.3.12
version: 2.3.12
devDependencies:
'@opentelemetry/core':
specifier: ^1.22.0
version: 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/exporter-logs-otlp-http':
specifier: ^0.49.1
version: 0.49.1(@opentelemetry/api@1.8.0)
'@opentelemetry/exporter-trace-otlp-http':
specifier: ^0.49.1
version: 0.49.1(@opentelemetry/api@1.8.0)
'@opentelemetry/instrumentation':
specifier: ^0.49.1
version: 0.49.1(@opentelemetry/api@1.8.0)
'@opentelemetry/instrumentation-express':
specifier: ^0.36.1
version: 0.36.1(@opentelemetry/api@1.8.0)
'@opentelemetry/instrumentation-fetch':
specifier: ^0.49.1
version: 0.49.1(@opentelemetry/api@1.8.0)
'@opentelemetry/instrumentation-http':
specifier: ^0.49.1
version: 0.49.1(@opentelemetry/api@1.8.0)
'@opentelemetry/instrumentation-undici':
specifier: 0.2.0
version: 0.2.0(@opentelemetry/api@1.8.0)
'@opentelemetry/resources':
specifier: ^1.22.0
version: 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/sdk-logs':
specifier: ^0.49.1
version: 0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.8.0)
'@opentelemetry/sdk-node':
specifier: ^0.49.1
version: 0.49.1(@opentelemetry/api@1.8.0)
'@opentelemetry/sdk-trace-base':
specifier: ^1.22.0
version: 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/sdk-trace-node':
specifier: ^1.22.0
version: 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/semantic-conventions':
specifier: ^1.22.0
version: 1.22.0
'@trigger.dev/tsconfig':
specifier: workspace:*
version: link:../../config-packages/tsconfig
@@ -7687,7 +7729,6 @@ packages:
dependencies:
'@grpc/proto-loader': 0.7.7
'@types/node': 18.19.20
dev: false
/@grpc/proto-loader@0.7.7:
resolution: {integrity: sha512-1TIeXOi8TuSCQprPItwoMymZXxWT0CPxUhkrkeCUH+D8U7QDwQ6b7SUz2MaLuWM2llT+J/TVFLmQI5KtML3BhQ==}
@@ -7699,7 +7740,6 @@ packages:
long: 4.0.0
protobufjs: 7.2.6
yargs: 17.7.2
dev: false
/@hapi/boom@10.0.1:
resolution: {integrity: sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA==}
@@ -9242,12 +9282,17 @@ packages:
engines: {node: '>=14'}
dependencies:
'@opentelemetry/api': 1.8.0
dev: false
/@opentelemetry/api-logs@0.51.1:
resolution: {integrity: sha512-E3skn949Pk1z2XtXu/lxf6QAZpawuTM/IUEXcAzpiUkTd73Hmvw26FiN3cJuTmkpM5hZzHwkomVdtrh/n/zzwA==}
engines: {node: '>=14'}
dependencies:
'@opentelemetry/api': 1.8.0
dev: true
/@opentelemetry/api@1.8.0:
resolution: {integrity: sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w==}
engines: {node: '>=8.0.0'}
dev: false
/@opentelemetry/context-async-hooks@1.22.0(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-Nfdxyg8YtWqVWkyrCukkundAjPhUXi93JtVQmqDT1mZRVKqA7e2r7eJCrI+F651XUBMp0hsOJSGiFk3QSpaIJw==}
@@ -9256,7 +9301,6 @@ packages:
'@opentelemetry/api': '>=1.0.0 <1.9.0'
dependencies:
'@opentelemetry/api': 1.8.0
dev: false
/@opentelemetry/core@1.22.0(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-0VoAlT6x+Xzik1v9goJ3pZ2ppi6+xd3aUfg4brfrLkDBHRIVjMP0eBHrKrhB+NKcDyMAg8fAbGL3Npg/F6AwWA==}
@@ -9266,7 +9310,6 @@ packages:
dependencies:
'@opentelemetry/api': 1.8.0
'@opentelemetry/semantic-conventions': 1.22.0
dev: false
/@opentelemetry/exporter-logs-otlp-http@0.49.1(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-3QoBnIGCmEkujynUP0mK155QtOM0MSf9FNrEw7u9ieCFsoMiyatg2hPp+alEDONJ8N8wGEK+wP2q3icgXBiggw==}
@@ -9280,7 +9323,6 @@ packages:
'@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.8.0)
'@opentelemetry/otlp-transformer': 0.49.1(@opentelemetry/api@1.8.0)
'@opentelemetry/sdk-logs': 0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.8.0)
dev: false
/@opentelemetry/exporter-trace-otlp-grpc@0.49.1(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-Zbd7f3zF7fI2587MVhBizaW21cO/SordyrZGtMtvhoxU6n4Qb02Gx71X4+PzXH620e0+JX+Pcr9bYb1HTeVyJA==}
@@ -9295,7 +9337,6 @@ packages:
'@opentelemetry/otlp-transformer': 0.49.1(@opentelemetry/api@1.8.0)
'@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0)
dev: false
/@opentelemetry/exporter-trace-otlp-http@0.49.1(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-KOLtZfZvIrpGZLVvblKsiVQT7gQUZNKcUUH24Zz6Xbi7LJb9Vt6xtUZFYdR5IIjvt47PIqBKDWUQlU0o1wAsRw==}
@@ -9309,7 +9350,6 @@ packages:
'@opentelemetry/otlp-transformer': 0.49.1(@opentelemetry/api@1.8.0)
'@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0)
dev: false
/@opentelemetry/exporter-trace-otlp-proto@0.49.1(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-n8ON/c9pdMyYAfSFWKkgsPwjYoxnki+6Olzo+klKfW7KqLWoyEkryNkbcMIYnGGNXwdkMIrjoaP0VxXB26Oxcg==}
@@ -9324,7 +9364,6 @@ packages:
'@opentelemetry/otlp-transformer': 0.49.1(@opentelemetry/api@1.8.0)
'@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0)
dev: false
/@opentelemetry/exporter-zipkin@1.22.0(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-XcFs6rGvcTz0qW5uY7JZDYD0yNEXdekXAb6sFtnZgY/cHY6BQ09HMzOjv9SX+iaXplRDcHr1Gta7VQKM1XXM6g==}
@@ -9337,7 +9376,6 @@ packages:
'@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/semantic-conventions': 1.22.0
dev: false
/@opentelemetry/instrumentation-express@0.36.1(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-ltIE4kIMa+83QjW/p7oe7XCESF29w3FQ9/T1VgShdX7fzm56K2a0xfEX1vF8lnHRGERYxIWX9D086C6gJOjVGA==}
@@ -9351,7 +9389,6 @@ packages:
'@opentelemetry/semantic-conventions': 1.22.0
transitivePeerDependencies:
- supports-color
dev: false
/@opentelemetry/instrumentation-fetch@0.49.1(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-hizhULZXlq02y8YC0vPQ4WtUWiXcwxPdEqHBy8p75jzF9rAuP/ldrVr0Oxvz5Xr9qQcdEOFLvEl0ZxbVL76WKw==}
@@ -9366,7 +9403,6 @@ packages:
'@opentelemetry/semantic-conventions': 1.22.0
transitivePeerDependencies:
- supports-color
dev: false
/@opentelemetry/instrumentation-http@0.49.1(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-Yib5zrW2s0V8wTeUK/B3ZtpyP4ldgXj9L3Ws/axXrW1dW0/mEFKifK50MxMQK9g5NNJQS9dWH7rvcEGZdWdQDA==}
@@ -9381,7 +9417,19 @@ packages:
semver: 7.5.4
transitivePeerDependencies:
- supports-color
dev: false
/@opentelemetry/instrumentation-undici@0.2.0(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-RH9WdVRtpnyp8kvya2RYqKsJouPxvHl7jKPsIfrbL8u2QCKloAGi0uEqDHoOS15ZRYPQTDXZ7d8jSpUgSQmvpA==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.7.0
dependencies:
'@opentelemetry/api': 1.8.0
'@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/instrumentation': 0.51.1(@opentelemetry/api@1.8.0)
transitivePeerDependencies:
- supports-color
dev: true
/@opentelemetry/instrumentation@0.48.0(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-sjtZQB5PStIdCw5ovVTDGwnmQC+GGYArJNgIcydrDSqUTdYBnMrN9P4pwQZgS3vTGIp+TU1L8vMXGe51NVmIKQ==}
@@ -9414,7 +9462,23 @@ packages:
shimmer: 1.2.1
transitivePeerDependencies:
- supports-color
dev: false
/@opentelemetry/instrumentation@0.51.1(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-JIrvhpgqY6437QIqToyozrUG1h5UhwHkaGK/WAX+fkrpyPtc+RO5FkRtUd9BH0MibabHHvqsnBGKfKVijbmp8w==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.3.0
dependencies:
'@opentelemetry/api': 1.8.0
'@opentelemetry/api-logs': 0.51.1
'@types/shimmer': 1.0.2
import-in-the-middle: 1.7.4
require-in-the-middle: 7.1.1
semver: 7.5.4
shimmer: 1.2.1
transitivePeerDependencies:
- supports-color
dev: true
/@opentelemetry/otlp-exporter-base@0.49.1(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-z6sHliPqDgJU45kQatAettY9/eVF58qVPaTuejw9YWfSRqid9pXPYeegDCSdyS47KAUgAtm+nC28K3pfF27HWg==}
@@ -9424,7 +9488,6 @@ packages:
dependencies:
'@opentelemetry/api': 1.8.0
'@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0)
dev: false
/@opentelemetry/otlp-grpc-exporter-base@0.49.1(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-DNDNUWmOqtKTFJAyOyHHKotVox0NQ/09ETX8fUOeEtyNVHoGekAVtBbvIA3AtK+JflP7LC0PTjlLfruPM3Wy6w==}
@@ -9437,7 +9500,6 @@ packages:
'@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.8.0)
protobufjs: 7.2.6
dev: false
/@opentelemetry/otlp-proto-exporter-base@0.49.1(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-x1qB4EUC7KikUl2iNuxCkV8yRzrSXSyj4itfpIO674H7dhI7Zv37SFaOJTDN+8Z/F50gF2ISFH9CWQ4KCtGm2A==}
@@ -9449,7 +9511,6 @@ packages:
'@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/otlp-exporter-base': 0.49.1(@opentelemetry/api@1.8.0)
protobufjs: 7.2.6
dev: false
/@opentelemetry/otlp-transformer@0.49.1(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-Z+koA4wp9L9e3jkFacyXTGphSWTbOKjwwXMpb0CxNb0kjTHGUxhYRN8GnkLFsFo5NbZPjP07hwAqeEG/uCratQ==}
@@ -9464,7 +9525,6 @@ packages:
'@opentelemetry/sdk-logs': 0.49.1(@opentelemetry/api-logs@0.49.1)(@opentelemetry/api@1.8.0)
'@opentelemetry/sdk-metrics': 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0)
dev: false
/@opentelemetry/propagator-b3@1.22.0(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-qBItJm9ygg/jCB5rmivyGz1qmKZPsL/sX715JqPMFgq++Idm0x+N9sLQvWFHFt2+ZINnCSojw7FVBgFW6izcXA==}
@@ -9474,7 +9534,6 @@ packages:
dependencies:
'@opentelemetry/api': 1.8.0
'@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0)
dev: false
/@opentelemetry/propagator-jaeger@1.22.0(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-pMLgst3QIwrUfepraH5WG7xfpJ8J3CrPKrtINK0t7kBkuu96rn+HDYQ8kt3+0FXvrZI8YJE77MCQwnJWXIrgpA==}
@@ -9484,7 +9543,6 @@ packages:
dependencies:
'@opentelemetry/api': 1.8.0
'@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0)
dev: false
/@opentelemetry/resources@1.22.0(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-+vNeIFPH2hfcNL0AJk/ykJXoUCtR1YaDUZM+p3wZNU4Hq98gzq+7b43xbkXjadD9VhWIUQqEwXyY64q6msPj6A==}
@@ -9495,7 +9553,6 @@ packages:
'@opentelemetry/api': 1.8.0
'@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/semantic-conventions': 1.22.0
dev: false
/@opentelemetry/sdk-logs@0.49.1(@opentelemetry/api-logs@0.48.0)(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-gCzYWsJE0h+3cuh3/cK+9UwlVFyHvj3PReIOCDOmdeXOp90ZjKRoDOJBc3mvk1LL6wyl1RWIivR8Rg9OToyesw==}
@@ -9521,7 +9578,6 @@ packages:
'@opentelemetry/api-logs': 0.49.1
'@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0)
dev: false
/@opentelemetry/sdk-metrics@1.22.0(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-k6iIx6H3TZ+BVMr2z8M16ri2OxWaljg5h8ihGJxi/KQWcjign6FEaEzuigXt5bK9wVEhqAcWLCfarSftaNWkkg==}
@@ -9533,7 +9589,6 @@ packages:
'@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0)
lodash.merge: 4.6.2
dev: false
/@opentelemetry/sdk-node@0.49.1(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-feBIT85ndiSHXsQ2gfGpXC/sNeX4GCHLksC4A9s/bfpUbbgbCSl0RvzZlmEpCHarNrkZMwFRi4H0xFfgvJEjrg==}
@@ -9557,7 +9612,6 @@ packages:
'@opentelemetry/semantic-conventions': 1.22.0
transitivePeerDependencies:
- supports-color
dev: false
/@opentelemetry/sdk-trace-base@1.22.0(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-pfTuSIpCKONC6vkTpv6VmACxD+P1woZf4q0K46nSUvXFvOFqjBYKFaAMkKD3M1mlKUUh0Oajwj35qNjMl80m1Q==}
@@ -9569,7 +9623,6 @@ packages:
'@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/resources': 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/semantic-conventions': 1.22.0
dev: false
/@opentelemetry/sdk-trace-node@1.22.0(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-gTGquNz7ue8uMeiWPwp3CU321OstQ84r7PCDtOaCicjbJxzvO8RZMlEC4geOipTeiF88kss5n6w+//A0MhP1lQ==}
@@ -9584,7 +9637,6 @@ packages:
'@opentelemetry/propagator-jaeger': 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0)
semver: 7.5.4
dev: false
/@opentelemetry/sdk-trace-web@1.22.0(@opentelemetry/api@1.8.0):
resolution: {integrity: sha512-id5bUhWYg475xbm4hjwWA4PnWM4duNK1EyFRkZxa3BZNuCITwiKCLvDkVhlE9RK2kvuDOPmcRxgSbU1apF9/1w==}
@@ -9596,12 +9648,10 @@ packages:
'@opentelemetry/core': 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/sdk-trace-base': 1.22.0(@opentelemetry/api@1.8.0)
'@opentelemetry/semantic-conventions': 1.22.0
dev: false
/@opentelemetry/semantic-conventions@1.22.0:
resolution: {integrity: sha512-CAOgFOKLybd02uj/GhCdEeeBjOS0yeoDeo/CA7ASBSmenpZHAKGB3iDm/rv3BQLcabb/OprDEsSQ1y0P8A7Siw==}
engines: {node: '>=14'}
dev: false
/@peculiar/asn1-schema@2.3.6:
resolution: {integrity: sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA==}
@@ -13201,7 +13251,7 @@ packages:
eslint: 8.45.0
eslint-import-resolver-node: 0.3.7
eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.6)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.45.0)
eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.6)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0)
eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.6)(eslint@8.45.0)
eslint-plugin-jest: 26.9.0(@typescript-eslint/eslint-plugin@5.59.6)(eslint@8.45.0)(typescript@4.9.5)
eslint-plugin-jest-dom: 4.0.3(eslint@8.45.0)
eslint-plugin-jsx-a11y: 6.7.1(eslint@8.45.0)
@@ -15305,7 +15355,6 @@ packages:
/@types/long@4.0.2:
resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==}
dev: false
/@types/marked@4.0.8:
resolution: {integrity: sha512-HVNzMT5QlWCOdeuBsgXP8EZzKUf0+AXzN+sLmjvaB3ZlLqO+e4u0uXrdw9ub69wBKFs+c6/pA4r9sy6cCDvImw==}
@@ -15595,7 +15644,6 @@ packages:
/@types/shimmer@1.0.2:
resolution: {integrity: sha512-dKkr1bTxbEsFlh2ARpKzcaAmsYixqt9UyCdoEZk8rHyE4iQYcDCyvSjDSf7JUWJHlJiTtbIoQjxKh6ViywqDAg==}
dev: false
/@types/simple-oauth2@5.0.4:
resolution: {integrity: sha512-4SvTfmAa1fGUa1d07j9vIiC4o92bGh0ihPXmtS05udMMmNwVIaU2nZ706cC4wI8cJxOlHD4P/d5tzqvWYd+KxA==}
@@ -15755,7 +15803,7 @@ packages:
grapheme-splitter: 1.0.4
ignore: 5.2.4
natural-compare-lite: 1.4.0
semver: 7.5.0
semver: 7.5.4
tsutils: 3.21.0(typescript@4.9.5)
typescript: 4.9.5
transitivePeerDependencies:
@@ -15783,7 +15831,7 @@ packages:
grapheme-splitter: 1.0.4
ignore: 5.2.4
natural-compare-lite: 1.4.0
semver: 7.5.0
semver: 7.5.4
tsutils: 3.21.0(typescript@5.2.2)
typescript: 5.2.2
transitivePeerDependencies:
@@ -15897,6 +15945,7 @@ packages:
typescript: 4.9.5
transitivePeerDependencies:
- supports-color
dev: true
/@typescript-eslint/parser@5.59.6(eslint@8.45.0)(typescript@5.1.6):
resolution: {integrity: sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==}
@@ -15916,7 +15965,6 @@ packages:
typescript: 5.1.6
transitivePeerDependencies:
- supports-color
dev: false
/@typescript-eslint/parser@5.59.6(eslint@8.45.0)(typescript@5.2.2):
resolution: {integrity: sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==}
@@ -16082,6 +16130,7 @@ packages:
typescript: 4.9.5
transitivePeerDependencies:
- supports-color
dev: true
/@typescript-eslint/typescript-estree@5.59.6(typescript@5.0.4):
resolution: {integrity: sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==}
@@ -16123,7 +16172,6 @@ packages:
typescript: 5.1.6
transitivePeerDependencies:
- supports-color
dev: false
/@typescript-eslint/typescript-estree@5.59.6(typescript@5.2.2):
resolution: {integrity: sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==}
@@ -16728,6 +16776,14 @@ packages:
dependencies:
acorn: 8.10.0
/acorn-import-attributes@1.9.5(acorn@8.10.0):
resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==}
peerDependencies:
acorn: ^8
dependencies:
acorn: 8.10.0
dev: true
/acorn-jsx@5.3.2(acorn@8.10.0):
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
@@ -20456,7 +20512,7 @@ packages:
eslint: 8.45.0
eslint-import-resolver-node: 0.3.7
eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.6)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.45.0)
eslint-plugin-import: 2.27.5(eslint@8.45.0)
eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.6)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0)
eslint-plugin-jsx-a11y: 6.7.1(eslint@8.45.0)
eslint-plugin-react: 7.32.2(eslint@8.45.0)
eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.45.0)
@@ -20746,7 +20802,7 @@ packages:
eslint-import-resolver-webpack:
optional: true
dependencies:
'@typescript-eslint/parser': 5.59.6(eslint@8.45.0)(typescript@4.9.5)
'@typescript-eslint/parser': 5.59.6(eslint@8.45.0)(typescript@5.1.6)
debug: 3.2.7(supports-color@5.5.0)
eslint: 8.45.0
eslint-import-resolver-node: 0.3.7
@@ -20754,6 +20810,35 @@ packages:
transitivePeerDependencies:
- supports-color
/eslint-module-utils@2.7.4(@typescript-eslint/parser@5.59.6)(eslint-import-resolver-node@0.3.7)(eslint@8.45.0):
resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
engines: {node: '>=4'}
peerDependencies:
'@typescript-eslint/parser': '*'
eslint: '*'
eslint-import-resolver-node: '*'
eslint-import-resolver-typescript: '*'
eslint-import-resolver-webpack: '*'
peerDependenciesMeta:
'@typescript-eslint/parser':
optional: true
eslint:
optional: true
eslint-import-resolver-node:
optional: true
eslint-import-resolver-typescript:
optional: true
eslint-import-resolver-webpack:
optional: true
dependencies:
'@typescript-eslint/parser': 5.59.6(eslint@8.45.0)(typescript@4.9.5)
debug: 3.2.7(supports-color@5.5.0)
eslint: 8.45.0
eslint-import-resolver-node: 0.3.7
transitivePeerDependencies:
- supports-color
dev: true
/eslint-plugin-es@3.0.1(eslint@8.31.0):
resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==}
engines: {node: '>=8.10.0'}
@@ -20863,7 +20948,7 @@ packages:
'@typescript-eslint/parser':
optional: true
dependencies:
'@typescript-eslint/parser': 5.59.6(eslint@8.45.0)(typescript@4.9.5)
'@typescript-eslint/parser': 5.59.6(eslint@8.45.0)(typescript@5.1.6)
array-includes: 3.1.6
array.prototype.flat: 1.3.1
array.prototype.flatmap: 1.3.1
@@ -20885,7 +20970,7 @@ packages:
- eslint-import-resolver-webpack
- supports-color
/eslint-plugin-import@2.27.5(eslint@8.45.0):
/eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.59.6)(eslint@8.45.0):
resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==}
engines: {node: '>=4'}
peerDependencies:
@@ -20895,6 +20980,7 @@ packages:
'@typescript-eslint/parser':
optional: true
dependencies:
'@typescript-eslint/parser': 5.59.6(eslint@8.45.0)(typescript@4.9.5)
array-includes: 3.1.6
array.prototype.flat: 1.3.1
array.prototype.flatmap: 1.3.1
@@ -20902,7 +20988,7 @@ packages:
doctrine: 2.1.0
eslint: 8.45.0
eslint-import-resolver-node: 0.3.7
eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.59.6)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0)
eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.59.6)(eslint-import-resolver-node@0.3.7)(eslint@8.45.0)
has: 1.0.3
is-core-module: 2.13.0
is-glob: 4.0.3
@@ -20915,7 +21001,7 @@ packages:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
dev: false
dev: true
/eslint-plugin-jest-dom@4.0.3(eslint@8.31.0):
resolution: {integrity: sha512-9j+n8uj0+V0tmsoS7bYC7fLhQmIvjRqRYEcbDSi+TKPsTThLLXCyj5swMSSf/hTleeMktACnn+HFqXBr5gbcbA==}
@@ -23490,7 +23576,15 @@ packages:
acorn-import-assertions: 1.9.0(acorn@8.10.0)
cjs-module-lexer: 1.2.3
module-details-from-path: 1.0.3
dev: false
/import-in-the-middle@1.7.4:
resolution: {integrity: sha512-Lk+qzWmiQuRPPulGQeK5qq0v32k2bHnWrRPFgqyvhw7Kkov5L6MOLOIU3pcWeujc9W4q54Cp3Q2WV16eQkc7Bg==}
dependencies:
acorn: 8.10.0
acorn-import-attributes: 1.9.5(acorn@8.10.0)
cjs-module-lexer: 1.2.3
module-details-from-path: 1.0.3
dev: true
/import-lazy@4.0.0:
resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
@@ -25497,7 +25591,6 @@ packages:
/long@4.0.0:
resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==}
dev: false
/long@5.2.3:
resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==}
@@ -26697,7 +26790,6 @@ packages:
/module-details-from-path@1.0.3:
resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==}
dev: false
/morgan@1.10.0:
resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==}
@@ -30630,7 +30722,6 @@ packages:
resolve: 1.22.4
transitivePeerDependencies:
- supports-color
dev: false
/require-like@0.1.2:
resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==}
@@ -31284,7 +31375,6 @@ packages:
/shimmer@1.2.1:
resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==}
dev: false
/side-channel@1.0.4:
resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
@@ -33489,6 +33579,7 @@ packages:
dependencies:
tslib: 1.14.1
typescript: 4.9.5
dev: true
/tsutils@3.21.0(typescript@5.0.4):
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
@@ -33508,7 +33599,6 @@ packages:
dependencies:
tslib: 1.14.1
typescript: 5.1.6
dev: false
/tsutils@3.21.0(typescript@5.2.2):
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+16 -1
View File
@@ -36,6 +36,21 @@
"trigger.dev": "workspace:*",
"ts-node": "^10.9.2",
"tsconfig-paths": "^4.2.0",
"typescript": "^5.3.0"
"typescript": "^5.3.0",
"@opentelemetry/api": "^1.8.0",
"@opentelemetry/core": "^1.22.0",
"@opentelemetry/exporter-logs-otlp-http": "^0.49.1",
"@opentelemetry/exporter-trace-otlp-http": "^0.49.1",
"@opentelemetry/instrumentation": "^0.49.1",
"@opentelemetry/instrumentation-express": "^0.36.1",
"@opentelemetry/instrumentation-http": "^0.49.1",
"@opentelemetry/resources": "^1.22.0",
"@opentelemetry/sdk-logs": "^0.49.1",
"@opentelemetry/sdk-node": "^0.49.1",
"@opentelemetry/sdk-trace-base": "^1.22.0",
"@opentelemetry/sdk-trace-node": "^1.22.0",
"@opentelemetry/semantic-conventions": "^1.22.0",
"@opentelemetry/instrumentation-fetch": "^0.49.1",
"@opentelemetry/instrumentation-undici": "0.2.0"
}
}
+74 -67
View File
@@ -1,3 +1,4 @@
import { tracer } from "./tracer";
import { APIError, configure, runs, schedules } from "@trigger.dev/sdk/v3";
import { simpleChildTask } from "./trigger/subtasks";
import dotenv from "dotenv";
@@ -6,79 +7,85 @@ import { firstScheduledTask } from "./trigger/scheduled";
dotenv.config();
export async function run() {
try {
const run = await simpleChildTask.trigger({ message: "Hello, World!" });
await tracer.startActiveSpan("run", async (span) => {
try {
const run = await simpleChildTask.trigger({ message: "Hello, World!" });
const retrievedRun = await runs.retrieve(run.id);
console.log("retrieved run", retrievedRun);
const retrievedRun = await runs.retrieve(run.id);
console.log("retrieved run", retrievedRun);
const canceled = await runs.cancel(run.id);
console.log("canceled run", canceled);
const canceled = await runs.cancel(run.id);
console.log("canceled run", canceled);
const replayed = await runs.replay(run.id);
console.log("replayed run", replayed);
const replayed = await runs.replay(run.id);
console.log("replayed run", replayed);
const run2 = await simpleChildTask.trigger(
{ message: "Hello, World!" },
{
idempotencyKey: "mmvlgwcidiklyeygen4",
const run2 = await simpleChildTask.trigger(
{ message: "Hello, World!" },
{
idempotencyKey: "mmvlgwcidiklyeygen4",
}
);
const run3 = await simpleChildTask.trigger(
{ message: "Hello, World again!" },
{
idempotencyKey: "mmvlgwcidiklyeygen4",
}
);
console.log("run2", run2);
console.log("run3", run3);
const allSchedules = await schedules.list();
console.log("all schedules", allSchedules);
// Create a schedule
const createdSchedule = await schedules.create({
task: firstScheduledTask.id,
cron: "0 0 * * *",
externalId: "ext_1234444",
deduplicationKey: "dedup_1234444",
});
console.log("created schedule", createdSchedule);
const retrievedSchedule = await schedules.retrieve(createdSchedule.id);
console.log("retrieved schedule", retrievedSchedule);
const updatedSchedule = await schedules.update(createdSchedule.id, {
task: firstScheduledTask.id,
cron: "0 0 1 * *",
externalId: "ext_1234444",
});
console.log("updated schedule", updatedSchedule);
const deactivatedSchedule = await schedules.deactivate(createdSchedule.id);
console.log("deactivated schedule", deactivatedSchedule);
const activatedSchedule = await schedules.activate(createdSchedule.id);
console.log("activated schedule", activatedSchedule);
const deletedSchedule = await schedules.del(createdSchedule.id);
console.log("deleted schedule", deletedSchedule);
} catch (error) {
span.recordException(error as Error);
if (error instanceof APIError) {
console.error("APIError", error);
} else {
console.error("Unknown error", error);
}
);
const run3 = await simpleChildTask.trigger(
{ message: "Hello, World again!" },
{
idempotencyKey: "mmvlgwcidiklyeygen4",
}
);
console.log("run2", run2);
console.log("run3", run3);
const allSchedules = await schedules.list();
console.log("all schedules", allSchedules);
// Create a schedule
const createdSchedule = await schedules.create({
task: firstScheduledTask.id,
cron: "0 0 * * *",
externalId: "ext_1234444",
deduplicationKey: "dedup_1234444",
});
console.log("created schedule", createdSchedule);
const retrievedSchedule = await schedules.retrieve(createdSchedule.id);
console.log("retrieved schedule", retrievedSchedule);
const updatedSchedule = await schedules.update(createdSchedule.id, {
task: firstScheduledTask.id,
cron: "0 0 1 * *",
externalId: "ext_1234444",
});
console.log("updated schedule", updatedSchedule);
const deactivatedSchedule = await schedules.deactivate(createdSchedule.id);
console.log("deactivated schedule", deactivatedSchedule);
const activatedSchedule = await schedules.activate(createdSchedule.id);
console.log("activated schedule", activatedSchedule);
const deletedSchedule = await schedules.del(createdSchedule.id);
console.log("deleted schedule", deletedSchedule);
} catch (error) {
if (error instanceof APIError) {
console.error("APIError", error);
} else {
console.error("Unknown error", error);
} finally {
span.end();
}
}
});
}
run();
+40
View File
@@ -0,0 +1,40 @@
import { DiagConsoleLogger, DiagLogLevel, diag } from "@opentelemetry/api";
import { InstrumentationOption, registerInstrumentations } from "@opentelemetry/instrumentation";
import { FetchInstrumentation } from "@opentelemetry/instrumentation-fetch";
import { HttpInstrumentation } from "@opentelemetry/instrumentation-http";
import { UndiciInstrumentation } from "@opentelemetry/instrumentation-undici";
import { Resource } from "@opentelemetry/resources";
import { ConsoleSpanExporter, SimpleSpanProcessor } from "@opentelemetry/sdk-trace-base";
import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
import { SEMRESATTRS_SERVICE_NAME } from "@opentelemetry/semantic-conventions";
export const tracer = getTracer();
function getTracer() {
diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ERROR);
const provider = new NodeTracerProvider({
forceFlushTimeoutMillis: 500,
resource: new Resource({
[SEMRESATTRS_SERVICE_NAME]: "v3-catalog",
}),
});
const loggerExporter = new ConsoleSpanExporter();
provider.addSpanProcessor(new SimpleSpanProcessor(loggerExporter));
provider.register();
let instrumentations: InstrumentationOption[] = [
new HttpInstrumentation(),
new FetchInstrumentation(),
new UndiciInstrumentation(),
];
registerInstrumentations({
tracerProvider: provider,
instrumentations,
});
return provider.getTracer("v3-catalog", "3.0.0.dp.1");
}
+3 -21
View File
@@ -1,33 +1,13 @@
import { logger, task } from "@trigger.dev/sdk/v3";
import { logger, task, wait } from "@trigger.dev/sdk/v3";
import { taskWithRetries } from "./retries";
export const simpleParentTask = task({
id: "simple-parent-task",
run: async (payload: { message: string }) => {
const result = await simpleChildTask.trigger({
message: `${payload.message} - 2.a`,
});
await simpleChildTask.triggerAndWait({
message: `${payload.message} - 2.b`,
});
await simpleChildTask.batchTrigger([
{
payload: {
message: `${payload.message} - 2.c`,
},
},
]);
await simpleChildTask.batchTriggerAndWait([
{
payload: {
message: `${payload.message} - 2.d`,
},
},
]);
return {
hello: "world",
};
@@ -38,6 +18,8 @@ export const simpleChildTask = task({
id: "simple-child-task",
run: async (payload: { message: string }, { ctx }) => {
logger.log("Simple child task payload", { payload, ctx });
await wait.for({ seconds: 6 });
},
});