@trigger.dev/core 4.4.0 → 4.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/commonjs/v3/config.d.ts +13 -0
  2. package/dist/commonjs/v3/index.d.ts +1 -0
  3. package/dist/commonjs/v3/index.js +4 -1
  4. package/dist/commonjs/v3/index.js.map +1 -1
  5. package/dist/commonjs/v3/otel/diskIoMetrics.d.ts +2 -0
  6. package/dist/commonjs/v3/otel/diskIoMetrics.js +94 -0
  7. package/dist/commonjs/v3/otel/diskIoMetrics.js.map +1 -0
  8. package/dist/commonjs/v3/otel/filesystemMetrics.d.ts +2 -0
  9. package/dist/commonjs/v3/otel/filesystemMetrics.js +137 -0
  10. package/dist/commonjs/v3/otel/filesystemMetrics.js.map +1 -0
  11. package/dist/commonjs/v3/otel/machineId.d.ts +1 -0
  12. package/dist/commonjs/v3/otel/machineId.js +7 -0
  13. package/dist/commonjs/v3/otel/machineId.js.map +1 -0
  14. package/dist/commonjs/v3/otel/nodejsRuntimeMetrics.d.ts +2 -0
  15. package/dist/commonjs/v3/otel/nodejsRuntimeMetrics.js +69 -0
  16. package/dist/commonjs/v3/otel/nodejsRuntimeMetrics.js.map +1 -0
  17. package/dist/commonjs/v3/otel/tracingSDK.d.ts +16 -0
  18. package/dist/commonjs/v3/otel/tracingSDK.js +75 -6
  19. package/dist/commonjs/v3/otel/tracingSDK.js.map +1 -1
  20. package/dist/commonjs/v3/schemas/messages.d.ts +3 -0
  21. package/dist/commonjs/v3/schemas/messages.js +1 -0
  22. package/dist/commonjs/v3/schemas/messages.js.map +1 -1
  23. package/dist/commonjs/v3/semanticInternalAttributes.d.ts +2 -0
  24. package/dist/commonjs/v3/semanticInternalAttributes.js +2 -0
  25. package/dist/commonjs/v3/semanticInternalAttributes.js.map +1 -1
  26. package/dist/commonjs/v3/taskContext/index.d.ts +2 -0
  27. package/dist/commonjs/v3/taskContext/index.js +7 -2
  28. package/dist/commonjs/v3/taskContext/index.js.map +1 -1
  29. package/dist/commonjs/v3/taskContext/otelProcessors.d.ts +24 -0
  30. package/dist/commonjs/v3/taskContext/otelProcessors.js +173 -1
  31. package/dist/commonjs/v3/taskContext/otelProcessors.js.map +1 -1
  32. package/dist/commonjs/v3/workers/index.d.ts +1 -1
  33. package/dist/commonjs/v3/workers/index.js +2 -1
  34. package/dist/commonjs/v3/workers/index.js.map +1 -1
  35. package/dist/commonjs/version.js +1 -1
  36. package/dist/esm/v3/config.d.ts +13 -0
  37. package/dist/esm/v3/index.d.ts +1 -0
  38. package/dist/esm/v3/index.js +1 -0
  39. package/dist/esm/v3/index.js.map +1 -1
  40. package/dist/esm/v3/otel/diskIoMetrics.d.ts +2 -0
  41. package/dist/esm/v3/otel/diskIoMetrics.js +68 -0
  42. package/dist/esm/v3/otel/diskIoMetrics.js.map +1 -0
  43. package/dist/esm/v3/otel/filesystemMetrics.d.ts +2 -0
  44. package/dist/esm/v3/otel/filesystemMetrics.js +111 -0
  45. package/dist/esm/v3/otel/filesystemMetrics.js.map +1 -0
  46. package/dist/esm/v3/otel/machineId.d.ts +1 -0
  47. package/dist/esm/v3/otel/machineId.js +4 -0
  48. package/dist/esm/v3/otel/machineId.js.map +1 -0
  49. package/dist/esm/v3/otel/nodejsRuntimeMetrics.d.ts +2 -0
  50. package/dist/esm/v3/otel/nodejsRuntimeMetrics.js +66 -0
  51. package/dist/esm/v3/otel/nodejsRuntimeMetrics.js.map +1 -0
  52. package/dist/esm/v3/otel/tracingSDK.d.ts +16 -0
  53. package/dist/esm/v3/otel/tracingSDK.js +77 -8
  54. package/dist/esm/v3/otel/tracingSDK.js.map +1 -1
  55. package/dist/esm/v3/schemas/messages.d.ts +3 -0
  56. package/dist/esm/v3/schemas/messages.js +1 -0
  57. package/dist/esm/v3/schemas/messages.js.map +1 -1
  58. package/dist/esm/v3/semanticInternalAttributes.d.ts +2 -0
  59. package/dist/esm/v3/semanticInternalAttributes.js +2 -0
  60. package/dist/esm/v3/semanticInternalAttributes.js.map +1 -1
  61. package/dist/esm/v3/taskContext/index.d.ts +2 -0
  62. package/dist/esm/v3/taskContext/index.js +8 -3
  63. package/dist/esm/v3/taskContext/index.js.map +1 -1
  64. package/dist/esm/v3/taskContext/otelProcessors.d.ts +24 -0
  65. package/dist/esm/v3/taskContext/otelProcessors.js +170 -0
  66. package/dist/esm/v3/taskContext/otelProcessors.js.map +1 -1
  67. package/dist/esm/v3/workers/index.d.ts +1 -1
  68. package/dist/esm/v3/workers/index.js +1 -1
  69. package/dist/esm/v3/workers/index.js.map +1 -1
  70. package/dist/esm/version.js +1 -1
  71. package/package.json +4 -1
@@ -1,5 +1,6 @@
1
1
  import type { Instrumentation } from "@opentelemetry/instrumentation";
2
2
  import type { SpanExporter } from "@opentelemetry/sdk-trace-base";
3
+ import type { MetricReader, PushMetricExporter } from "@opentelemetry/sdk-metrics";
3
4
  import type { BuildExtension } from "./build/extensions.js";
4
5
  import type { AnyOnFailureHookFunction, AnyOnInitHookFunction, AnyOnStartHookFunction, AnyOnSuccessHookFunction, BuildRuntime, RetryOptions } from "./index.js";
5
6
  import type { LogLevel } from "./logger/taskLogger.js";
@@ -87,6 +88,18 @@ export type TriggerConfig = {
87
88
  * @see https://trigger.dev/docs/config/config-file#exporters
88
89
  */
89
90
  logExporters?: Array<LogRecordExporter>;
91
+ /**
92
+ * Metric exporters to use for OpenTelemetry. This is useful if you want to export metrics to external services.
93
+ * Each exporter is automatically wrapped in a PeriodicExportingMetricReader.
94
+ *
95
+ * For more control over the reader configuration, use `metricReaders` instead.
96
+ */
97
+ metricExporters?: Array<PushMetricExporter>;
98
+ /**
99
+ * Metric readers for OpenTelemetry. Add custom metric readers to export
100
+ * metrics to external services alongside the default Trigger.dev exporter.
101
+ */
102
+ metricReaders?: Array<MetricReader>;
90
103
  /**
91
104
  * Resource to use for OpenTelemetry. This is useful if you want to add custom resources to your tasks.
92
105
  *
@@ -35,6 +35,7 @@ export type { LogLevel } from "./logger/taskLogger.js";
35
35
  export { eventFilterMatches } from "../eventFilterMatches.js";
36
36
  export { flattenAttributes, primitiveValueOrflattenedAttributes, unflattenAttributes, NULL_SENTINEL, } from "./utils/flattenAttributes.js";
37
37
  export { omit } from "./utils/omit.js";
38
+ export { generateFriendlyId, fromFriendlyId } from "./isomorphic/friendlyId.js";
38
39
  export { calculateNextRetryDelay, calculateResetAt, defaultFetchRetryOptions, defaultRetryOptions, } from "./utils/retries.js";
39
40
  export { accessoryAttributes } from "./utils/styleAttributes.js";
40
41
  export { conditionallyExportPacket, conditionallyImportPacket, createPacketAttributes, createPacketAttributesAsJson, packetRequiresOffloading, parsePacket, prettyPrintPacket, stringifyIO, type IOPacket, } from "./utils/ioSerialization.js";
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.CORE_VERSION = exports.isSchemaArkTypeEsque = exports.isSchemaValibotEsque = exports.isSchemaZodEsque = exports.getSchemaParseFn = exports.stringifyIO = exports.prettyPrintPacket = exports.parsePacket = exports.packetRequiresOffloading = exports.createPacketAttributesAsJson = exports.createPacketAttributes = exports.conditionallyImportPacket = exports.conditionallyExportPacket = exports.accessoryAttributes = exports.defaultRetryOptions = exports.defaultFetchRetryOptions = exports.calculateResetAt = exports.calculateNextRetryDelay = exports.omit = exports.NULL_SENTINEL = exports.unflattenAttributes = exports.primitiveValueOrflattenedAttributes = exports.flattenAttributes = exports.eventFilterMatches = exports.nanosecondsToMilliseconds = exports.millisecondsToNanoseconds = exports.formatDurationNanoseconds = exports.formatDurationMilliseconds = exports.formatDurationInDays = exports.formatDuration = exports.links = exports.SemanticInternalAttributes = void 0;
17
+ exports.CORE_VERSION = exports.isSchemaArkTypeEsque = exports.isSchemaValibotEsque = exports.isSchemaZodEsque = exports.getSchemaParseFn = exports.stringifyIO = exports.prettyPrintPacket = exports.parsePacket = exports.packetRequiresOffloading = exports.createPacketAttributesAsJson = exports.createPacketAttributes = exports.conditionallyImportPacket = exports.conditionallyExportPacket = exports.accessoryAttributes = exports.defaultRetryOptions = exports.defaultFetchRetryOptions = exports.calculateResetAt = exports.calculateNextRetryDelay = exports.fromFriendlyId = exports.generateFriendlyId = exports.omit = exports.NULL_SENTINEL = exports.unflattenAttributes = exports.primitiveValueOrflattenedAttributes = exports.flattenAttributes = exports.eventFilterMatches = exports.nanosecondsToMilliseconds = exports.millisecondsToNanoseconds = exports.formatDurationNanoseconds = exports.formatDurationMilliseconds = exports.formatDurationInDays = exports.formatDuration = exports.links = exports.SemanticInternalAttributes = void 0;
18
18
  __exportStar(require("./apiClient/index.js"), exports);
19
19
  __exportStar(require("./apiClient/types.js"), exports);
20
20
  __exportStar(require("./apiClient/pagination.js"), exports);
@@ -64,6 +64,9 @@ Object.defineProperty(exports, "unflattenAttributes", { enumerable: true, get: f
64
64
  Object.defineProperty(exports, "NULL_SENTINEL", { enumerable: true, get: function () { return flattenAttributes_js_1.NULL_SENTINEL; } });
65
65
  var omit_js_1 = require("./utils/omit.js");
66
66
  Object.defineProperty(exports, "omit", { enumerable: true, get: function () { return omit_js_1.omit; } });
67
+ var friendlyId_js_1 = require("./isomorphic/friendlyId.js");
68
+ Object.defineProperty(exports, "generateFriendlyId", { enumerable: true, get: function () { return friendlyId_js_1.generateFriendlyId; } });
69
+ Object.defineProperty(exports, "fromFriendlyId", { enumerable: true, get: function () { return friendlyId_js_1.fromFriendlyId; } });
67
70
  var retries_js_1 = require("./utils/retries.js");
68
71
  Object.defineProperty(exports, "calculateNextRetryDelay", { enumerable: true, get: function () { return retries_js_1.calculateNextRetryDelay; } });
69
72
  Object.defineProperty(exports, "calculateResetAt", { enumerable: true, get: function () { return retries_js_1.calculateResetAt; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/v3/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,uDAAqC;AACrC,4DAA0C;AAE1C,wDAAsC;AACtC,iDAA+B;AAC/B,8CAA4B;AAC5B,8CAA4B;AAC5B,kDAAgC;AAChC,mDAAiC;AACjC,wDAAsC;AACtC,yDAAuC;AACvC,4DAA0C;AAC1C,iDAA+B;AAC/B,wDAAsC;AACtC,sDAAoC;AACpC,mDAAiC;AACjC,gEAA8C;AAC9C,2DAAyC;AACzC,kDAAgC;AAChC,sDAAoC;AACpC,4DAA0C;AAC1C,qDAAmC;AACnC,iFAA6E;AAApE,2IAAA,0BAA0B,OAAA;AACnC,4DAA0C;AAC1C,mDAAiC;AACjC,uCAAmC;AAA1B,iGAAA,KAAK,OAAA;AACd,2CAAyB;AACzB,uDAAqC;AACrC,mEAAiD;AACjD,oDAAkC;AAClC,gDAA8B;AAC9B,qDAO8B;AAN5B,8GAAA,cAAc,OAAA;AACd,oHAAA,oBAAoB,OAAA;AACpB,0HAAA,0BAA0B,OAAA;AAC1B,yHAAA,yBAAyB,OAAA;AACzB,yHAAA,yBAAyB,OAAA;AACzB,yHAAA,yBAAyB,OAAA;AAK3B,kEAA8D;AAArD,2HAAA,kBAAkB,OAAA;AAC3B,qEAKsC;AAJpC,yHAAA,iBAAiB,OAAA;AACjB,2IAAA,mCAAmC,OAAA;AACnC,2HAAA,mBAAmB,OAAA;AACnB,qHAAA,aAAa,OAAA;AAEf,2CAAuC;AAA9B,+FAAA,IAAI,OAAA;AACb,iDAK4B;AAJ1B,qHAAA,uBAAuB,OAAA;AACvB,8GAAA,gBAAgB,OAAA;AAChB,sHAAA,wBAAwB,OAAA;AACxB,iHAAA,mBAAmB,OAAA;AAErB,iEAAiE;AAAxD,yHAAA,mBAAmB,OAAA;AAE5B,iEAUoC;AATlC,+HAAA,yBAAyB,OAAA;AACzB,+HAAA,yBAAyB,OAAA;AACzB,4HAAA,sBAAsB,OAAA;AACtB,kIAAA,4BAA4B,OAAA;AAC5B,8HAAA,wBAAwB,OAAA;AACxB,iHAAA,WAAW,OAAA;AACX,uHAAA,iBAAiB,OAAA;AACjB,iHAAA,WAAW,OAAA;AAIb,sDAAoC;AACpC,sDAAoC;AAEpC,8CAA4B;AAC5B,iDAO4B;AAN1B,8GAAA,gBAAgB,OAAA;AAGhB,8GAAA,gBAAgB,OAAA;AAChB,kHAAA,oBAAoB,OAAA;AACpB,kHAAA,oBAAoB,OAAA;AAGtB,8CAAwC;AAEpB,6FAFX,oBAAO,OAEgB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/v3/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,uDAAqC;AACrC,4DAA0C;AAE1C,wDAAsC;AACtC,iDAA+B;AAC/B,8CAA4B;AAC5B,8CAA4B;AAC5B,kDAAgC;AAChC,mDAAiC;AACjC,wDAAsC;AACtC,yDAAuC;AACvC,4DAA0C;AAC1C,iDAA+B;AAC/B,wDAAsC;AACtC,sDAAoC;AACpC,mDAAiC;AACjC,gEAA8C;AAC9C,2DAAyC;AACzC,kDAAgC;AAChC,sDAAoC;AACpC,4DAA0C;AAC1C,qDAAmC;AACnC,iFAA6E;AAApE,2IAAA,0BAA0B,OAAA;AACnC,4DAA0C;AAC1C,mDAAiC;AACjC,uCAAmC;AAA1B,iGAAA,KAAK,OAAA;AACd,2CAAyB;AACzB,uDAAqC;AACrC,mEAAiD;AACjD,oDAAkC;AAClC,gDAA8B;AAC9B,qDAO8B;AAN5B,8GAAA,cAAc,OAAA;AACd,oHAAA,oBAAoB,OAAA;AACpB,0HAAA,0BAA0B,OAAA;AAC1B,yHAAA,yBAAyB,OAAA;AACzB,yHAAA,yBAAyB,OAAA;AACzB,yHAAA,yBAAyB,OAAA;AAK3B,kEAA8D;AAArD,2HAAA,kBAAkB,OAAA;AAC3B,qEAKsC;AAJpC,yHAAA,iBAAiB,OAAA;AACjB,2IAAA,mCAAmC,OAAA;AACnC,2HAAA,mBAAmB,OAAA;AACnB,qHAAA,aAAa,OAAA;AAEf,2CAAuC;AAA9B,+FAAA,IAAI,OAAA;AACb,4DAAgF;AAAvE,mHAAA,kBAAkB,OAAA;AAAE,+GAAA,cAAc,OAAA;AAC3C,iDAK4B;AAJ1B,qHAAA,uBAAuB,OAAA;AACvB,8GAAA,gBAAgB,OAAA;AAChB,sHAAA,wBAAwB,OAAA;AACxB,iHAAA,mBAAmB,OAAA;AAErB,iEAAiE;AAAxD,yHAAA,mBAAmB,OAAA;AAE5B,iEAUoC;AATlC,+HAAA,yBAAyB,OAAA;AACzB,+HAAA,yBAAyB,OAAA;AACzB,4HAAA,sBAAsB,OAAA;AACtB,kIAAA,4BAA4B,OAAA;AAC5B,8HAAA,wBAAwB,OAAA;AACxB,iHAAA,WAAW,OAAA;AACX,uHAAA,iBAAiB,OAAA;AACjB,iHAAA,WAAW,OAAA;AAIb,sDAAoC;AACpC,sDAAoC;AAEpC,8CAA4B;AAC5B,iDAO4B;AAN1B,8GAAA,gBAAgB,OAAA;AAGhB,8GAAA,gBAAgB,OAAA;AAChB,kHAAA,oBAAoB,OAAA;AACpB,kHAAA,oBAAoB,OAAA;AAGtB,8CAAwC;AAEpB,6FAFX,oBAAO,OAEgB"}
@@ -0,0 +1,2 @@
1
+ import { type MeterProvider } from "@opentelemetry/sdk-metrics";
2
+ export declare function startDiskIoMetrics(meterProvider: MeterProvider): void;
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.startDiskIoMetrics = startDiskIoMetrics;
27
+ const fs = __importStar(require("node:fs"));
28
+ const fsPromises = __importStar(require("node:fs/promises"));
29
+ const SECTOR_SIZE = 512;
30
+ const FILTERED_DEVICE_PREFIXES = ["loop", "ram", "dm-"];
31
+ function parseProcDiskstats(content) {
32
+ const entries = [];
33
+ for (const line of content.split("\n")) {
34
+ const trimmed = line.trim();
35
+ if (!trimmed)
36
+ continue;
37
+ const fields = trimmed.split(/\s+/);
38
+ if (fields.length < 14)
39
+ continue;
40
+ const device = fields[2];
41
+ if (FILTERED_DEVICE_PREFIXES.some((prefix) => device.startsWith(prefix))) {
42
+ continue;
43
+ }
44
+ entries.push({
45
+ device,
46
+ readsCompleted: parseInt(fields[3], 10),
47
+ sectorsRead: parseInt(fields[5], 10),
48
+ writesCompleted: parseInt(fields[7], 10),
49
+ sectorsWritten: parseInt(fields[9], 10),
50
+ });
51
+ }
52
+ return entries;
53
+ }
54
+ function startDiskIoMetrics(meterProvider) {
55
+ try {
56
+ fs.accessSync("/proc/diskstats", fs.constants.R_OK);
57
+ }
58
+ catch {
59
+ return;
60
+ }
61
+ const meter = meterProvider.getMeter("system-disk", "1.0.0");
62
+ const ioCounter = meter.createObservableCounter("system.disk.io", {
63
+ description: "Disk I/O bytes read and written per device",
64
+ unit: "By",
65
+ });
66
+ const opsCounter = meter.createObservableCounter("system.disk.operations", {
67
+ description: "Disk read/write operation counts per device",
68
+ unit: "{operation}",
69
+ });
70
+ meter.addBatchObservableCallback(async (obs) => {
71
+ try {
72
+ const content = await fsPromises.readFile("/proc/diskstats", "utf-8");
73
+ const stats = parseProcDiskstats(content);
74
+ for (const entry of stats) {
75
+ const readAttrs = {
76
+ "system.device": entry.device,
77
+ "disk.io.direction": "read",
78
+ };
79
+ const writeAttrs = {
80
+ "system.device": entry.device,
81
+ "disk.io.direction": "write",
82
+ };
83
+ obs.observe(ioCounter, entry.sectorsRead * SECTOR_SIZE, readAttrs);
84
+ obs.observe(ioCounter, entry.sectorsWritten * SECTOR_SIZE, writeAttrs);
85
+ obs.observe(opsCounter, entry.readsCompleted, readAttrs);
86
+ obs.observe(opsCounter, entry.writesCompleted, writeAttrs);
87
+ }
88
+ }
89
+ catch {
90
+ // Skip entire cycle on failure
91
+ }
92
+ }, [ioCounter, opsCounter]);
93
+ }
94
+ //# sourceMappingURL=diskIoMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diskIoMetrics.js","sourceRoot":"","sources":["../../../../src/v3/otel/diskIoMetrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type MeterProvider } from "@opentelemetry/sdk-metrics";
2
+ export declare function startFilesystemMetrics(meterProvider: MeterProvider): void;
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.startFilesystemMetrics = startFilesystemMetrics;
27
+ const fs = __importStar(require("node:fs"));
28
+ const fsPromises = __importStar(require("node:fs/promises"));
29
+ const VIRTUAL_FS_TYPES = new Set([
30
+ "proc",
31
+ "sysfs",
32
+ "devpts",
33
+ "tmpfs",
34
+ "devtmpfs",
35
+ "cgroup",
36
+ "cgroup2",
37
+ "squashfs",
38
+ "autofs",
39
+ "debugfs",
40
+ "securityfs",
41
+ "pstore",
42
+ "bpf",
43
+ "tracefs",
44
+ "hugetlbfs",
45
+ "mqueue",
46
+ "fusectl",
47
+ "configfs",
48
+ "binfmt_misc",
49
+ ]);
50
+ function parseProcMounts(content) {
51
+ const entries = [];
52
+ for (const line of content.split("\n")) {
53
+ if (!line.trim())
54
+ continue;
55
+ const parts = line.split(" ");
56
+ if (parts.length < 4)
57
+ continue;
58
+ const fsType = parts[2];
59
+ if (VIRTUAL_FS_TYPES.has(fsType))
60
+ continue;
61
+ entries.push({
62
+ device: parts[0],
63
+ mountpoint: unescapeMountPath(parts[1]),
64
+ fsType,
65
+ options: parts[3],
66
+ });
67
+ }
68
+ return entries;
69
+ }
70
+ function unescapeMountPath(path) {
71
+ return path.replace(/\\040/g, " ").replace(/\\011/g, "\t");
72
+ }
73
+ function startFilesystemMetrics(meterProvider) {
74
+ try {
75
+ fs.accessSync("/proc/mounts", fs.constants.R_OK);
76
+ }
77
+ catch {
78
+ return;
79
+ }
80
+ if (typeof fsPromises.statfs !== "function") {
81
+ return;
82
+ }
83
+ const meter = meterProvider.getMeter("system-filesystem", "1.0.0");
84
+ const usageCounter = meter.createObservableUpDownCounter("system.filesystem.usage", {
85
+ description: "Filesystem bytes used, free, and reserved per mountpoint",
86
+ unit: "By",
87
+ });
88
+ const utilizationGauge = meter.createObservableGauge("system.filesystem.utilization", {
89
+ description: "Fraction of filesystem space used (0-1)",
90
+ unit: "1",
91
+ });
92
+ meter.addBatchObservableCallback(async (obs) => {
93
+ try {
94
+ const mountsContent = await fsPromises.readFile("/proc/mounts", "utf-8");
95
+ const mounts = parseProcMounts(mountsContent);
96
+ for (const mount of mounts) {
97
+ try {
98
+ const stats = await fsPromises.statfs(mount.mountpoint);
99
+ const bsize = stats.bsize;
100
+ const total = stats.blocks * bsize;
101
+ const free = stats.bavail * bsize;
102
+ const reserved = (stats.bfree - stats.bavail) * bsize;
103
+ const used = total - stats.bfree * bsize;
104
+ const mode = mount.options.startsWith("ro") ? "ro" : "rw";
105
+ const baseAttrs = {
106
+ "system.device": mount.device,
107
+ "system.filesystem.type": mount.fsType,
108
+ "system.filesystem.mountpoint": mount.mountpoint,
109
+ "system.filesystem.mode": mode,
110
+ };
111
+ obs.observe(usageCounter, used, {
112
+ ...baseAttrs,
113
+ "system.filesystem.state": "used",
114
+ });
115
+ obs.observe(usageCounter, free, {
116
+ ...baseAttrs,
117
+ "system.filesystem.state": "free",
118
+ });
119
+ obs.observe(usageCounter, reserved, {
120
+ ...baseAttrs,
121
+ "system.filesystem.state": "reserved",
122
+ });
123
+ if (total > 0) {
124
+ obs.observe(utilizationGauge, used / total, baseAttrs);
125
+ }
126
+ }
127
+ catch {
128
+ // Skip this mount on statfs failure
129
+ }
130
+ }
131
+ }
132
+ catch {
133
+ // Skip entire cycle on failure
134
+ }
135
+ }, [usageCounter, utilizationGauge]);
136
+ }
137
+ //# sourceMappingURL=filesystemMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystemMetrics.js","sourceRoot":"","sources":["../../../../src/v3/otel/filesystemMetrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const machineId: string;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.machineId = void 0;
4
+ const friendlyId_js_1 = require("../isomorphic/friendlyId.js");
5
+ const getEnv_js_1 = require("../utils/getEnv.js");
6
+ exports.machineId = (0, getEnv_js_1.getEnvVar)("TRIGGER_MACHINE_ID") ?? (0, friendlyId_js_1.generateFriendlyId)("machine");
7
+ //# sourceMappingURL=machineId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machineId.js","sourceRoot":"","sources":["../../../../src/v3/otel/machineId.ts"],"names":[],"mappings":";;;AAAA,+DAAiE;AACjE,kDAA+C;AAElC,QAAA,SAAS,GAAG,IAAA,qBAAS,EAAC,oBAAoB,CAAC,IAAI,IAAA,kCAAkB,EAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type MeterProvider } from "@opentelemetry/sdk-metrics";
2
+ export declare function startNodejsRuntimeMetrics(meterProvider: MeterProvider): void;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startNodejsRuntimeMetrics = startNodejsRuntimeMetrics;
4
+ const node_perf_hooks_1 = require("node:perf_hooks");
5
+ function tryMonitorEventLoopDelay() {
6
+ try {
7
+ const eld = (0, node_perf_hooks_1.monitorEventLoopDelay)({ resolution: 20 });
8
+ eld.enable();
9
+ return eld;
10
+ }
11
+ catch {
12
+ // monitorEventLoopDelay is not implemented in Bun
13
+ return undefined;
14
+ }
15
+ }
16
+ function startNodejsRuntimeMetrics(meterProvider) {
17
+ const meter = meterProvider.getMeter("nodejs-runtime", "1.0.0");
18
+ // Event loop utilization (diff between collection intervals)
19
+ let lastElu = node_perf_hooks_1.performance.eventLoopUtilization();
20
+ const eluGauge = meter.createObservableGauge("nodejs.event_loop.utilization", {
21
+ description: "Event loop utilization over the last collection interval",
22
+ unit: "1",
23
+ });
24
+ // Event loop delay histogram (from perf_hooks) — not available in Bun
25
+ const eld = tryMonitorEventLoopDelay();
26
+ const observables = [eluGauge];
27
+ let eldP95;
28
+ let eldMax;
29
+ if (eld) {
30
+ eldP95 = meter.createObservableGauge("nodejs.event_loop.delay.p95", {
31
+ description: "p95 event loop delay",
32
+ unit: "s",
33
+ });
34
+ eldMax = meter.createObservableGauge("nodejs.event_loop.delay.max", {
35
+ description: "Max event loop delay",
36
+ unit: "s",
37
+ });
38
+ observables.push(eldP95, eldMax);
39
+ }
40
+ // Heap metrics
41
+ const heapUsed = meter.createObservableGauge("nodejs.heap.used", {
42
+ description: "V8 heap used",
43
+ unit: "By",
44
+ });
45
+ const heapTotal = meter.createObservableGauge("nodejs.heap.total", {
46
+ description: "V8 heap total allocated",
47
+ unit: "By",
48
+ });
49
+ observables.push(heapUsed, heapTotal);
50
+ // Single batch callback for all metrics
51
+ meter.addBatchObservableCallback((obs) => {
52
+ // ELU
53
+ const currentElu = node_perf_hooks_1.performance.eventLoopUtilization();
54
+ const diff = node_perf_hooks_1.performance.eventLoopUtilization(currentElu, lastElu);
55
+ lastElu = currentElu;
56
+ obs.observe(eluGauge, diff.utilization);
57
+ // Event loop delay (nanoseconds -> seconds)
58
+ if (eld && eldP95 && eldMax) {
59
+ obs.observe(eldP95, eld.percentile(95) / 1e9);
60
+ obs.observe(eldMax, eld.max / 1e9);
61
+ eld.reset();
62
+ }
63
+ // Heap
64
+ const mem = process.memoryUsage();
65
+ obs.observe(heapUsed, mem.heapUsed);
66
+ obs.observe(heapTotal, mem.heapTotal);
67
+ }, observables);
68
+ }
69
+ //# sourceMappingURL=nodejsRuntimeMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodejsRuntimeMetrics.js","sourceRoot":"","sources":["../../../../src/v3/otel/nodejsRuntimeMetrics.ts"],"names":[],"mappings":"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"}
@@ -2,22 +2,38 @@ import { TracerProvider } from "@opentelemetry/api";
2
2
  import { type Instrumentation } from "@opentelemetry/instrumentation";
3
3
  import { Resource } from "@opentelemetry/resources";
4
4
  import { LogRecordExporter, LoggerProvider } from "@opentelemetry/sdk-logs";
5
+ import { type MetricReader, type PushMetricExporter } from "@opentelemetry/sdk-metrics";
5
6
  import { SpanExporter } from "@opentelemetry/sdk-trace-node";
6
7
  export type TracingDiagnosticLogLevel = "none" | "error" | "warn" | "info" | "debug" | "verbose" | "all";
7
8
  export type TracingSDKConfig = {
8
9
  url: string;
10
+ metricsUrl?: string;
9
11
  forceFlushTimeoutMillis?: number;
10
12
  instrumentations?: Instrumentation[];
11
13
  exporters?: SpanExporter[];
12
14
  logExporters?: LogRecordExporter[];
15
+ metricExporters?: PushMetricExporter[];
16
+ metricReaders?: MetricReader[];
13
17
  diagLogLevel?: TracingDiagnosticLogLevel;
14
18
  resource?: Resource;
19
+ hostMetrics?: boolean;
20
+ /** Limit host metrics collection to specific groups (e.g. ["process.cpu", "process.memory"]) */
21
+ hostMetricGroups?: string[];
22
+ /** Enable Node.js runtime metrics (event loop utilization, heap usage, etc.) */
23
+ nodejsRuntimeMetrics?: boolean;
24
+ /** Enable filesystem metrics (Linux only, reads /proc/mounts + fs.statfs) */
25
+ filesystemMetrics?: boolean;
26
+ /** Enable disk I/O metrics (Linux only, reads /proc/diskstats) */
27
+ diskIoMetrics?: boolean;
28
+ /** Metric instrument name patterns to drop (supports wildcards, e.g. "system.cpu.*") */
29
+ droppedMetrics?: string[];
15
30
  };
16
31
  export declare class TracingSDK {
17
32
  private readonly config;
18
33
  private readonly _logProvider;
19
34
  private readonly _spanExporter;
20
35
  private readonly _traceProvider;
36
+ private readonly _meterProvider;
21
37
  readonly getLogger: LoggerProvider["getLogger"];
22
38
  readonly getTracer: TracerProvider["getTracer"];
23
39
  constructor(config: TracingSDKConfig);
@@ -7,12 +7,14 @@ const api_logs_1 = require("@opentelemetry/api-logs");
7
7
  const core_1 = require("@opentelemetry/core");
8
8
  const exporter_logs_otlp_http_1 = require("@opentelemetry/exporter-logs-otlp-http");
9
9
  const exporter_trace_otlp_http_1 = require("@opentelemetry/exporter-trace-otlp-http");
10
+ const exporter_metrics_otlp_http_1 = require("@opentelemetry/exporter-metrics-otlp-http");
11
+ const host_metrics_1 = require("@opentelemetry/host-metrics");
10
12
  const instrumentation_1 = require("@opentelemetry/instrumentation");
11
13
  const resources_1 = require("@opentelemetry/resources");
12
14
  const sdk_logs_1 = require("@opentelemetry/sdk-logs");
15
+ const sdk_metrics_1 = require("@opentelemetry/sdk-metrics");
13
16
  const sdk_trace_base_1 = require("@opentelemetry/sdk-trace-base");
14
17
  const sdk_trace_node_1 = require("@opentelemetry/sdk-trace-node");
15
- const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
16
18
  const version_js_1 = require("../../version.js");
17
19
  const limits_js_1 = require("../limits.js");
18
20
  const semanticInternalAttributes_js_1 = require("../semanticInternalAttributes.js");
@@ -20,12 +22,17 @@ const task_context_api_js_1 = require("../task-context-api.js");
20
22
  const otelProcessors_js_1 = require("../taskContext/otelProcessors.js");
21
23
  const trace_context_api_js_1 = require("../trace-context-api.js");
22
24
  const getEnv_js_1 = require("../utils/getEnv.js");
25
+ const machineId_js_1 = require("./machineId.js");
26
+ const diskIoMetrics_js_1 = require("./diskIoMetrics.js");
27
+ const filesystemMetrics_js_1 = require("./filesystemMetrics.js");
28
+ const nodejsRuntimeMetrics_js_1 = require("./nodejsRuntimeMetrics.js");
23
29
  const idGenerator = new sdk_trace_base_1.RandomIdGenerator();
24
30
  class TracingSDK {
25
31
  config;
26
32
  _logProvider;
27
33
  _spanExporter;
28
34
  _traceProvider;
35
+ _meterProvider;
29
36
  getLogger;
30
37
  getTracer;
31
38
  constructor(config) {
@@ -40,12 +47,13 @@ class TracingSDK {
40
47
  detectors: [resources_1.processDetector],
41
48
  })
42
49
  .merge((0, resources_1.resourceFromAttributes)({
43
- [semantic_conventions_1.SemanticResourceAttributes.CLOUD_PROVIDER]: "trigger.dev",
44
- [semantic_conventions_1.SemanticResourceAttributes.SERVICE_NAME]: (0, getEnv_js_1.getEnvVar)("TRIGGER_OTEL_SERVICE_NAME") ?? "trigger.dev",
50
+ "cloud.provider": "trigger.dev",
51
+ "service.name": (0, getEnv_js_1.getEnvVar)("TRIGGER_OTEL_SERVICE_NAME") ?? "trigger.dev",
45
52
  [semanticInternalAttributes_js_1.SemanticInternalAttributes.TRIGGER]: true,
46
53
  [semanticInternalAttributes_js_1.SemanticInternalAttributes.CLI_VERSION]: version_js_1.VERSION,
47
54
  [semanticInternalAttributes_js_1.SemanticInternalAttributes.SDK_VERSION]: version_js_1.VERSION,
48
55
  [semanticInternalAttributes_js_1.SemanticInternalAttributes.SDK_LANGUAGE]: "typescript",
56
+ [semanticInternalAttributes_js_1.SemanticInternalAttributes.MACHINE_ID]: machineId_js_1.machineId,
49
57
  }))
50
58
  .merge((0, resources_1.resourceFromAttributes)(envResourceAttributes))
51
59
  .merge((0, resources_1.resourceFromAttributes)(customEnvResourceAttributes))
@@ -130,14 +138,75 @@ class TracingSDK {
130
138
  this._spanExporter = spanExporter;
131
139
  this._traceProvider = traceProvider;
132
140
  api_logs_1.logs.setGlobalLoggerProvider(loggerProvider);
141
+ // Metrics setup
142
+ const metricsUrl = config.metricsUrl ??
143
+ (0, getEnv_js_1.getEnvVar)("TRIGGER_OTEL_METRICS_ENDPOINT") ??
144
+ `${config.url}/v1/metrics`;
145
+ const rawMetricExporter = new exporter_metrics_otlp_http_1.OTLPMetricExporter({
146
+ url: metricsUrl,
147
+ timeoutMillis: config.forceFlushTimeoutMillis,
148
+ });
149
+ const collectionIntervalMs = parseInt((0, getEnv_js_1.getEnvVar)("TRIGGER_OTEL_METRICS_COLLECTION_INTERVAL_MILLIS") ?? "10000");
150
+ const exportIntervalMs = parseInt((0, getEnv_js_1.getEnvVar)("TRIGGER_OTEL_METRICS_EXPORT_INTERVAL_MILLIS") ?? "30000");
151
+ // Chain: PeriodicReader(10s) → TaskContextMetricExporter → BufferingMetricExporter(30s) → OTLP
152
+ const bufferingExporter = new otelProcessors_js_1.BufferingMetricExporter(rawMetricExporter, exportIntervalMs);
153
+ const metricExporter = new otelProcessors_js_1.TaskContextMetricExporter(bufferingExporter);
154
+ const exportTimeoutMillis = parseInt((0, getEnv_js_1.getEnvVar)("TRIGGER_OTEL_METRICS_EXPORT_TIMEOUT_MILLIS") ?? "30000");
155
+ const metricReaders = [
156
+ new sdk_metrics_1.PeriodicExportingMetricReader({
157
+ exporter: metricExporter,
158
+ exportIntervalMillis: collectionIntervalMs,
159
+ exportTimeoutMillis: Math.min(exportTimeoutMillis, collectionIntervalMs),
160
+ }),
161
+ ...(config.metricExporters ?? []).map((exporter) => new sdk_metrics_1.PeriodicExportingMetricReader({
162
+ exporter,
163
+ exportIntervalMillis: collectionIntervalMs,
164
+ exportTimeoutMillis: Math.min(exportTimeoutMillis, collectionIntervalMs),
165
+ })),
166
+ ...(config.metricReaders ?? []),
167
+ ];
168
+ const meterProvider = new sdk_metrics_1.MeterProvider({
169
+ resource: commonResources,
170
+ readers: metricReaders,
171
+ views: (config.droppedMetrics ?? []).map((pattern) => ({
172
+ instrumentName: pattern,
173
+ aggregation: { type: sdk_metrics_1.AggregationType.DROP },
174
+ })),
175
+ });
176
+ this._meterProvider = meterProvider;
177
+ api_1.metrics.setGlobalMeterProvider(meterProvider);
178
+ if (config.hostMetrics) {
179
+ const hostMetrics = new host_metrics_1.HostMetrics({
180
+ meterProvider,
181
+ metricGroups: config.hostMetricGroups,
182
+ });
183
+ hostMetrics.start();
184
+ }
185
+ if (config.nodejsRuntimeMetrics) {
186
+ (0, nodejsRuntimeMetrics_js_1.startNodejsRuntimeMetrics)(meterProvider);
187
+ }
188
+ if (config.filesystemMetrics) {
189
+ (0, filesystemMetrics_js_1.startFilesystemMetrics)(meterProvider);
190
+ }
191
+ if (config.diskIoMetrics) {
192
+ (0, diskIoMetrics_js_1.startDiskIoMetrics)(meterProvider);
193
+ }
133
194
  this.getLogger = loggerProvider.getLogger.bind(loggerProvider);
134
195
  this.getTracer = traceProvider.getTracer.bind(traceProvider);
135
196
  }
136
197
  async flush() {
137
- await Promise.all([this._traceProvider.forceFlush(), this._logProvider.forceFlush()]);
198
+ await Promise.all([
199
+ this._traceProvider.forceFlush(),
200
+ this._logProvider.forceFlush(),
201
+ this._meterProvider.forceFlush(),
202
+ ]);
138
203
  }
139
204
  async shutdown() {
140
- await Promise.all([this._traceProvider.shutdown(), this._logProvider.shutdown()]);
205
+ await Promise.all([
206
+ this._traceProvider.shutdown(),
207
+ this._logProvider.shutdown(),
208
+ this._meterProvider.shutdown(),
209
+ ]);
141
210
  }
142
211
  }
143
212
  exports.TracingSDK = TracingSDK;
@@ -304,7 +373,7 @@ function isSpanInternalOnly(span) {
304
373
  if (typeof urlPath === "string" && urlPath === "/api/v1/usage/ingest") {
305
374
  return true;
306
375
  }
307
- const httpUrl = span.attributes[semantic_conventions_1.SEMATTRS_HTTP_URL] ?? span.attributes["url.full"];
376
+ const httpUrl = span.attributes["http.url"] ?? span.attributes["url.full"];
308
377
  const url = safeParseUrl(httpUrl);
309
378
  if (!url) {
310
379
  return false;