duron 0.3.0-beta.9 → 0.3.0

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 (91) hide show
  1. package/dist/action-job.d.ts +33 -2
  2. package/dist/action-job.d.ts.map +1 -1
  3. package/dist/action-job.js +88 -23
  4. package/dist/action-manager.d.ts +44 -2
  5. package/dist/action-manager.d.ts.map +1 -1
  6. package/dist/action-manager.js +64 -3
  7. package/dist/action.d.ts +388 -7
  8. package/dist/action.d.ts.map +1 -1
  9. package/dist/action.js +44 -23
  10. package/dist/adapters/adapter.d.ts +365 -8
  11. package/dist/adapters/adapter.d.ts.map +1 -1
  12. package/dist/adapters/adapter.js +221 -15
  13. package/dist/adapters/postgres/base.d.ts +184 -6
  14. package/dist/adapters/postgres/base.d.ts.map +1 -1
  15. package/dist/adapters/postgres/base.js +436 -75
  16. package/dist/adapters/postgres/pglite.d.ts +37 -0
  17. package/dist/adapters/postgres/pglite.d.ts.map +1 -1
  18. package/dist/adapters/postgres/pglite.js +38 -0
  19. package/dist/adapters/postgres/postgres.d.ts +35 -0
  20. package/dist/adapters/postgres/postgres.d.ts.map +1 -1
  21. package/dist/adapters/postgres/postgres.js +42 -0
  22. package/dist/adapters/postgres/schema.d.ts +150 -37
  23. package/dist/adapters/postgres/schema.d.ts.map +1 -1
  24. package/dist/adapters/postgres/schema.default.d.ts +151 -38
  25. package/dist/adapters/postgres/schema.default.d.ts.map +1 -1
  26. package/dist/adapters/postgres/schema.default.js +2 -2
  27. package/dist/adapters/postgres/schema.js +60 -23
  28. package/dist/adapters/schemas.d.ts +124 -80
  29. package/dist/adapters/schemas.d.ts.map +1 -1
  30. package/dist/adapters/schemas.js +139 -26
  31. package/dist/client.d.ts +426 -22
  32. package/dist/client.d.ts.map +1 -1
  33. package/dist/client.js +370 -20
  34. package/dist/constants.js +6 -0
  35. package/dist/errors.d.ts +140 -3
  36. package/dist/errors.d.ts.map +1 -1
  37. package/dist/errors.js +152 -9
  38. package/dist/index.d.ts +2 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/server.d.ts +99 -37
  41. package/dist/server.d.ts.map +1 -1
  42. package/dist/server.js +84 -25
  43. package/dist/step-manager.d.ts +111 -4
  44. package/dist/step-manager.d.ts.map +1 -1
  45. package/dist/step-manager.js +403 -75
  46. package/dist/telemetry/index.d.ts +1 -4
  47. package/dist/telemetry/index.d.ts.map +1 -1
  48. package/dist/telemetry/index.js +2 -4
  49. package/dist/telemetry/local-span-exporter.d.ts +56 -0
  50. package/dist/telemetry/local-span-exporter.d.ts.map +1 -0
  51. package/dist/telemetry/local-span-exporter.js +118 -0
  52. package/dist/utils/p-retry.d.ts +5 -0
  53. package/dist/utils/p-retry.d.ts.map +1 -1
  54. package/dist/utils/p-retry.js +8 -0
  55. package/dist/utils/wait-for-abort.d.ts +1 -0
  56. package/dist/utils/wait-for-abort.d.ts.map +1 -1
  57. package/dist/utils/wait-for-abort.js +1 -0
  58. package/migrations/postgres/{20260119153838_flimsy_thor_girl → 20260121160012_normal_bloodstrike}/migration.sql +32 -20
  59. package/migrations/postgres/{20260119153838_flimsy_thor_girl → 20260121160012_normal_bloodstrike}/snapshot.json +241 -66
  60. package/package.json +42 -26
  61. package/src/action-job.ts +33 -29
  62. package/src/action-manager.ts +5 -5
  63. package/src/action.ts +317 -149
  64. package/src/adapters/adapter.ts +54 -54
  65. package/src/adapters/postgres/base.ts +266 -86
  66. package/src/adapters/postgres/schema.default.ts +2 -2
  67. package/src/adapters/postgres/schema.ts +52 -24
  68. package/src/adapters/schemas.ts +91 -36
  69. package/src/client.ts +322 -68
  70. package/src/errors.ts +84 -12
  71. package/src/index.ts +2 -0
  72. package/src/server.ts +39 -37
  73. package/src/step-manager.ts +246 -95
  74. package/src/telemetry/index.ts +2 -20
  75. package/src/telemetry/local-span-exporter.ts +148 -0
  76. package/dist/telemetry/adapter.d.ts +0 -107
  77. package/dist/telemetry/adapter.d.ts.map +0 -1
  78. package/dist/telemetry/adapter.js +0 -134
  79. package/dist/telemetry/local.d.ts +0 -22
  80. package/dist/telemetry/local.d.ts.map +0 -1
  81. package/dist/telemetry/local.js +0 -243
  82. package/dist/telemetry/noop.d.ts +0 -17
  83. package/dist/telemetry/noop.d.ts.map +0 -1
  84. package/dist/telemetry/noop.js +0 -66
  85. package/dist/telemetry/opentelemetry.d.ts +0 -25
  86. package/dist/telemetry/opentelemetry.d.ts.map +0 -1
  87. package/dist/telemetry/opentelemetry.js +0 -312
  88. package/src/telemetry/adapter.ts +0 -642
  89. package/src/telemetry/local.ts +0 -429
  90. package/src/telemetry/noop.ts +0 -141
  91. package/src/telemetry/opentelemetry.ts +0 -453
@@ -1,5 +1,2 @@
1
- export { type AddSpanAttributeOptions, type AddSpanEventOptions, type EndSpanOptions, type ObserveContext, type RecordMetricOptions, type Span, type StartDatabaseSpanOptions, type StartJobSpanOptions, type StartSpanOptions, type StartStepSpanOptions, TelemetryAdapter, type Tracer, type TracerSpan, } from './adapter.js';
2
- export { LocalTelemetryAdapter, type LocalTelemetryAdapterOptions, localTelemetryAdapter } from './local.js';
3
- export { NoopTelemetryAdapter, noopTelemetryAdapter } from './noop.js';
4
- export { OpenTelemetryAdapter, type OpenTelemetryAdapterOptions, openTelemetryAdapter } from './opentelemetry.js';
1
+ export { LocalSpanExporter, type LocalSpanExporterOptions } from './local-span-exporter.js';
5
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,IAAI,EACT,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,gBAAgB,EAChB,KAAK,MAAM,EACX,KAAK,UAAU,GAChB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,qBAAqB,EAAE,KAAK,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAC5G,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AACtE,OAAO,EAAE,oBAAoB,EAAE,KAAK,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,KAAK,wBAAwB,EAAE,MAAM,0BAA0B,CAAA"}
@@ -1,4 +1,2 @@
1
- export { TelemetryAdapter, } from './adapter.js';
2
- export { LocalTelemetryAdapter, localTelemetryAdapter } from './local.js';
3
- export { NoopTelemetryAdapter, noopTelemetryAdapter } from './noop.js';
4
- export { OpenTelemetryAdapter, openTelemetryAdapter } from './opentelemetry.js';
1
+ // OpenTelemetry-based span exporter for local database persistence
2
+ export { LocalSpanExporter } from './local-span-exporter.js';
@@ -0,0 +1,56 @@
1
+ import { type ExportResult } from '@opentelemetry/core';
2
+ import type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base';
3
+ import type { Adapter } from '../adapters/adapter.js';
4
+ /**
5
+ * Configuration options for the LocalSpanExporter.
6
+ */
7
+ export interface LocalSpanExporterOptions {
8
+ /**
9
+ * The database adapter to use for storing spans.
10
+ * This is the same adapter used by the Duron Client.
11
+ */
12
+ adapter: Adapter;
13
+ }
14
+ /**
15
+ * A custom OpenTelemetry SpanExporter that stores spans locally in the database.
16
+ *
17
+ * This exporter converts OpenTelemetry ReadableSpan objects into database records
18
+ * and inserts them via the Duron Adapter interface.
19
+ *
20
+ * It extracts `duron.job.id` and `duron.step.id` from span attributes to link
21
+ * spans to Duron jobs and steps.
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * import { LocalSpanExporter } from 'duron/telemetry'
26
+ * import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base'
27
+ *
28
+ * const exporter = new LocalSpanExporter({ adapter })
29
+ * const processor = new BatchSpanProcessor(exporter)
30
+ * ```
31
+ */
32
+ export declare class LocalSpanExporter implements SpanExporter {
33
+ #private;
34
+ constructor(options: LocalSpanExporterOptions);
35
+ /**
36
+ * Export spans to the local database.
37
+ *
38
+ * Converts ReadableSpan objects to database records and inserts them.
39
+ * Follows OpenTelemetry exporter rules:
40
+ * - Does not throw exceptions
41
+ * - Does not modify received spans
42
+ * - Does not implement queuing/batching (handled by SpanProcessor)
43
+ */
44
+ export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void;
45
+ /**
46
+ * Shutdown the exporter.
47
+ * After shutdown, no more spans will be exported.
48
+ */
49
+ shutdown(): Promise<void>;
50
+ /**
51
+ * Force flush any pending exports.
52
+ * Since we export synchronously to the database, this is a no-op.
53
+ */
54
+ forceFlush(): Promise<void>;
55
+ }
56
+ //# sourceMappingURL=local-span-exporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-span-exporter.d.ts","sourceRoot":"","sources":["../../src/telemetry/local-span-exporter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,qBAAqB,CAAA;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAE/E,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,wBAAwB,CAAA;AAExE;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,iBAAkB,YAAW,YAAY;;gBAIxC,OAAO,EAAE,wBAAwB;IAI7C;;;;;;;;OAQG;IACH,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAenF;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAoElC"}
@@ -0,0 +1,118 @@
1
+ import { ExportResultCode } from '@opentelemetry/core';
2
+ /**
3
+ * A custom OpenTelemetry SpanExporter that stores spans locally in the database.
4
+ *
5
+ * This exporter converts OpenTelemetry ReadableSpan objects into database records
6
+ * and inserts them via the Duron Adapter interface.
7
+ *
8
+ * It extracts `duron.job.id` and `duron.step.id` from span attributes to link
9
+ * spans to Duron jobs and steps.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * import { LocalSpanExporter } from 'duron/telemetry'
14
+ * import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base'
15
+ *
16
+ * const exporter = new LocalSpanExporter({ adapter })
17
+ * const processor = new BatchSpanProcessor(exporter)
18
+ * ```
19
+ */
20
+ export class LocalSpanExporter {
21
+ #adapter;
22
+ #shutdown = false;
23
+ constructor(options) {
24
+ this.#adapter = options.adapter;
25
+ }
26
+ /**
27
+ * Export spans to the local database.
28
+ *
29
+ * Converts ReadableSpan objects to database records and inserts them.
30
+ * Follows OpenTelemetry exporter rules:
31
+ * - Does not throw exceptions
32
+ * - Does not modify received spans
33
+ * - Does not implement queuing/batching (handled by SpanProcessor)
34
+ */
35
+ export(spans, resultCallback) {
36
+ if (this.#shutdown) {
37
+ resultCallback({ code: ExportResultCode.FAILED, error: new Error('Exporter has been shutdown') });
38
+ return;
39
+ }
40
+ this.#exportSpans(spans)
41
+ .then(() => {
42
+ resultCallback({ code: ExportResultCode.SUCCESS });
43
+ })
44
+ .catch((error) => {
45
+ resultCallback({ code: ExportResultCode.FAILED, error });
46
+ });
47
+ }
48
+ /**
49
+ * Shutdown the exporter.
50
+ * After shutdown, no more spans will be exported.
51
+ */
52
+ async shutdown() {
53
+ this.#shutdown = true;
54
+ }
55
+ /**
56
+ * Force flush any pending exports.
57
+ * Since we export synchronously to the database, this is a no-op.
58
+ */
59
+ async forceFlush() {
60
+ // No-op: we don't buffer spans, they're exported immediately
61
+ }
62
+ /**
63
+ * Internal method to export spans to the database.
64
+ */
65
+ async #exportSpans(spans) {
66
+ if (spans.length === 0) {
67
+ return;
68
+ }
69
+ const records = spans.map((span) => this.#readableSpanToRecord(span));
70
+ await this.#adapter.insertSpans(records);
71
+ }
72
+ /**
73
+ * Convert a ReadableSpan to an InsertSpanOptions record.
74
+ */
75
+ #readableSpanToRecord(span) {
76
+ const spanContext = span.spanContext();
77
+ // Extract Duron-specific attributes
78
+ const jobId = span.attributes['duron.job.id'];
79
+ const stepId = span.attributes['duron.step.id'];
80
+ // Convert attributes to plain object, excluding only job.id and step.id
81
+ // (those are stored in separate columns)
82
+ const attributes = {};
83
+ for (const [key, value] of Object.entries(span.attributes)) {
84
+ if (key !== 'duron.job.id' && key !== 'duron.step.id') {
85
+ attributes[key] = value;
86
+ }
87
+ }
88
+ // Convert events
89
+ const events = span.events.map((event) => ({
90
+ name: event.name,
91
+ timeUnixNano: this.#hrTimeToNanos(event.time).toString(),
92
+ attributes: event.attributes,
93
+ }));
94
+ // Get parent span ID from parentSpanContext if available
95
+ const parentSpanId = span.parentSpanContext?.spanId || null;
96
+ return {
97
+ traceId: spanContext.traceId,
98
+ spanId: spanContext.spanId,
99
+ parentSpanId,
100
+ jobId: jobId || null,
101
+ stepId: stepId || null,
102
+ name: span.name,
103
+ kind: span.kind,
104
+ startTimeUnixNano: this.#hrTimeToNanos(span.startTime),
105
+ endTimeUnixNano: span.endTime ? this.#hrTimeToNanos(span.endTime) : null,
106
+ statusCode: span.status.code,
107
+ statusMessage: span.status.message || null,
108
+ attributes,
109
+ events,
110
+ };
111
+ }
112
+ /**
113
+ * Convert HrTime [seconds, nanoseconds] to bigint nanoseconds.
114
+ */
115
+ #hrTimeToNanos(hrTime) {
116
+ return BigInt(hrTime[0]) * BigInt(1_000_000_000) + BigInt(hrTime[1]);
117
+ }
118
+ }
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @author github.com/sindresorhus
3
+ * @license MIT
4
+ * @description A refactor version of p-retry remove unnecessary code and add the necessary context to the retry function.
5
+ */
1
6
  interface RetryOptions {
2
7
  retries: number;
3
8
  factor: number;
@@ -1 +1 @@
1
- {"version":3,"file":"p-retry.d.ts","sourceRoot":"","sources":["../../src/utils/p-retry.ts"],"names":[],"mappings":"AAMA,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE,WAAW,CAAA;IACnB,eAAe,EAAE,CAAC,OAAO,EAAE;QACzB,KAAK,EAAE,KAAK,CAAA;QACZ,aAAa,EAAE,MAAM,CAAA;QACrB,WAAW,EAAE,MAAM,CAAA;QACnB,eAAe,EAAE,MAAM,CAAA;QACvB,UAAU,EAAE,MAAM,CAAA;KACnB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACpB;AA6HD,wBAA8B,MAAM,CAAC,OAAO,EAC1C,KAAK,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAClD,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,OAAO,CAAC,CA4DlB"}
1
+ {"version":3,"file":"p-retry.d.ts","sourceRoot":"","sources":["../../src/utils/p-retry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE,WAAW,CAAA;IACnB,eAAe,EAAE,CAAC,OAAO,EAAE;QACzB,KAAK,EAAE,KAAK,CAAA;QACZ,aAAa,EAAE,MAAM,CAAA;QACrB,WAAW,EAAE,MAAM,CAAA;QACnB,eAAe,EAAE,MAAM,CAAA;QACvB,UAAU,EAAE,MAAM,CAAA;KACnB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACpB;AA6HD,wBAA8B,MAAM,CAAC,OAAO,EAC1C,KAAK,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAClD,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,OAAO,CAAC,CA4DlB"}
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @author github.com/sindresorhus
3
+ * @license MIT
4
+ * @description A refactor version of p-retry remove unnecessary code and add the necessary context to the retry function.
5
+ */
1
6
  function validateRetries(retries) {
2
7
  if (typeof retries === 'number') {
3
8
  if (retries < 0) {
@@ -95,10 +100,12 @@ export default async function pRetry(input, options) {
95
100
  options.maxTimeout ??= Number.POSITIVE_INFINITY;
96
101
  options.maxRetryTime ??= Number.POSITIVE_INFINITY;
97
102
  options.randomize ??= false;
103
+ // Validate numeric options and normalize edge cases
98
104
  validateNumberOption('factor', options.factor, { min: 0, allowInfinity: false });
99
105
  validateNumberOption('minTimeout', options.minTimeout, { min: 0, allowInfinity: false });
100
106
  validateNumberOption('maxTimeout', options.maxTimeout, { min: 0, allowInfinity: true });
101
107
  validateNumberOption('maxRetryTime', options.maxRetryTime, { min: 0, allowInfinity: true });
108
+ // Treat non-positive factor as 1 to avoid zero backoff or negative behavior
102
109
  if (!(options.factor > 0)) {
103
110
  options.factor = 1;
104
111
  }
@@ -125,5 +132,6 @@ export default async function pRetry(input, options) {
125
132
  retriesConsumed++;
126
133
  }
127
134
  }
135
+ // Should not reach here, but in case it does, throw an error
128
136
  throw new Error('Retry attempts exhausted without throwing an error.');
129
137
  }
@@ -1,3 +1,4 @@
1
+ /** biome-ignore-all lint/suspicious/noConfusingVoidType: do not care */
1
2
  export default function waitForAbort(signal: AbortSignal): {
2
3
  promise: Promise<unknown>;
3
4
  release: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"wait-for-abort.d.ts","sourceRoot":"","sources":["../../src/utils/wait-for-abort.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,MAAM,EAAE,WAAW;;;EAqCvD"}
1
+ {"version":3,"file":"wait-for-abort.d.ts","sourceRoot":"","sources":["../../src/utils/wait-for-abort.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAExE,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,MAAM,EAAE,WAAW;;;EAqCvD"}
@@ -1,3 +1,4 @@
1
+ /** biome-ignore-all lint/suspicious/noConfusingVoidType: do not care */
1
2
  export default function waitForAbort(signal) {
2
3
  let done = false;
3
4
  let globalResolve = null;
@@ -27,6 +27,7 @@ CREATE TABLE "duron"."jobs" (
27
27
  "id" uuid PRIMARY KEY DEFAULT gen_random_uuid(),
28
28
  "action_name" text NOT NULL,
29
29
  "group_key" text NOT NULL,
30
+ "description" text,
30
31
  "status" text DEFAULT 'created' NOT NULL,
31
32
  "checksum" text NOT NULL,
32
33
  "input" jsonb DEFAULT '{}' NOT NULL,
@@ -37,23 +38,30 @@ CREATE TABLE "duron"."jobs" (
37
38
  "started_at" timestamp with time zone,
38
39
  "finished_at" timestamp with time zone,
39
40
  "client_id" text,
40
- "concurrency_limit" integer DEFAULT 10 NOT NULL,
41
+ "concurrency_limit" integer NOT NULL,
42
+ "concurrency_step_limit" integer NOT NULL,
41
43
  "created_at" timestamp with time zone DEFAULT now() NOT NULL,
42
44
  "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
43
45
  CONSTRAINT "jobs_status_check" CHECK ("status" IN ('created','active','completed','failed','cancelled'))
44
46
  );
45
47
  --> statement-breakpoint
46
- CREATE TABLE "duron"."metrics" (
47
- "id" uuid PRIMARY KEY DEFAULT gen_random_uuid(),
48
- "job_id" uuid NOT NULL,
48
+ CREATE TABLE "duron"."spans" (
49
+ "id" bigserial PRIMARY KEY,
50
+ "trace_id" text NOT NULL,
51
+ "span_id" text NOT NULL,
52
+ "parent_span_id" text,
53
+ "job_id" uuid,
49
54
  "step_id" uuid,
50
55
  "name" text NOT NULL,
51
- "value" double precision NOT NULL,
56
+ "kind" integer DEFAULT 0 NOT NULL,
57
+ "start_time_unix_nano" bigint NOT NULL,
58
+ "end_time_unix_nano" bigint,
59
+ "status_code" integer DEFAULT 0 NOT NULL,
60
+ "status_message" text,
52
61
  "attributes" jsonb DEFAULT '{}' NOT NULL,
53
- "type" text NOT NULL,
54
- "timestamp" timestamp with time zone DEFAULT now() NOT NULL,
55
- "created_at" timestamp with time zone DEFAULT now() NOT NULL,
56
- CONSTRAINT "metrics_type_check" CHECK ("type" IN ('metric', 'span_event', 'span_attribute'))
62
+ "events" jsonb DEFAULT '[]' NOT NULL,
63
+ CONSTRAINT "spans_kind_check" CHECK ("kind" IN (0, 1, 2, 3, 4)),
64
+ CONSTRAINT "spans_status_code_check" CHECK ("status_code" IN (0, 1, 2))
57
65
  );
58
66
  --> statement-breakpoint
59
67
  CREATE INDEX "idx_job_steps_job_id" ON "duron"."job_steps" ("job_id");--> statement-breakpoint
@@ -67,25 +75,29 @@ CREATE INDEX "idx_job_steps_output_fts" ON "duron"."job_steps" USING gin (to_tsv
67
75
  CREATE INDEX "idx_jobs_action_name" ON "duron"."jobs" ("action_name");--> statement-breakpoint
68
76
  CREATE INDEX "idx_jobs_status" ON "duron"."jobs" ("status");--> statement-breakpoint
69
77
  CREATE INDEX "idx_jobs_group_key" ON "duron"."jobs" ("group_key");--> statement-breakpoint
78
+ CREATE INDEX "idx_jobs_description" ON "duron"."jobs" ("description");--> statement-breakpoint
70
79
  CREATE INDEX "idx_jobs_started_at" ON "duron"."jobs" ("started_at");--> statement-breakpoint
71
80
  CREATE INDEX "idx_jobs_finished_at" ON "duron"."jobs" ("finished_at");--> statement-breakpoint
72
81
  CREATE INDEX "idx_jobs_expires_at" ON "duron"."jobs" ("expires_at");--> statement-breakpoint
73
82
  CREATE INDEX "idx_jobs_client_id" ON "duron"."jobs" ("client_id");--> statement-breakpoint
74
83
  CREATE INDEX "idx_jobs_checksum" ON "duron"."jobs" ("checksum");--> statement-breakpoint
75
84
  CREATE INDEX "idx_jobs_concurrency_limit" ON "duron"."jobs" ("concurrency_limit");--> statement-breakpoint
85
+ CREATE INDEX "idx_jobs_concurrency_step_limit" ON "duron"."jobs" ("concurrency_step_limit");--> statement-breakpoint
76
86
  CREATE INDEX "idx_jobs_action_status" ON "duron"."jobs" ("action_name","status");--> statement-breakpoint
77
87
  CREATE INDEX "idx_jobs_action_group" ON "duron"."jobs" ("action_name","group_key");--> statement-breakpoint
78
88
  CREATE INDEX "idx_jobs_input_fts" ON "duron"."jobs" USING gin (to_tsvector('english', "input"::text));--> statement-breakpoint
79
89
  CREATE INDEX "idx_jobs_output_fts" ON "duron"."jobs" USING gin (to_tsvector('english', "output"::text));--> statement-breakpoint
80
- CREATE INDEX "idx_metrics_job_id" ON "duron"."metrics" ("job_id");--> statement-breakpoint
81
- CREATE INDEX "idx_metrics_step_id" ON "duron"."metrics" ("step_id");--> statement-breakpoint
82
- CREATE INDEX "idx_metrics_name" ON "duron"."metrics" ("name");--> statement-breakpoint
83
- CREATE INDEX "idx_metrics_type" ON "duron"."metrics" ("type");--> statement-breakpoint
84
- CREATE INDEX "idx_metrics_timestamp" ON "duron"."metrics" ("timestamp");--> statement-breakpoint
85
- CREATE INDEX "idx_metrics_job_step" ON "duron"."metrics" ("job_id","step_id");--> statement-breakpoint
86
- CREATE INDEX "idx_metrics_job_name" ON "duron"."metrics" ("job_id","name");--> statement-breakpoint
87
- CREATE INDEX "idx_metrics_job_type" ON "duron"."metrics" ("job_id","type");--> statement-breakpoint
88
- CREATE INDEX "idx_metrics_attributes" ON "duron"."metrics" USING gin ("attributes");--> statement-breakpoint
90
+ CREATE INDEX "idx_spans_trace_id" ON "duron"."spans" ("trace_id");--> statement-breakpoint
91
+ CREATE INDEX "idx_spans_span_id" ON "duron"."spans" ("span_id");--> statement-breakpoint
92
+ CREATE INDEX "idx_spans_job_id" ON "duron"."spans" ("job_id");--> statement-breakpoint
93
+ CREATE INDEX "idx_spans_step_id" ON "duron"."spans" ("step_id");--> statement-breakpoint
94
+ CREATE INDEX "idx_spans_name" ON "duron"."spans" ("name");--> statement-breakpoint
95
+ CREATE INDEX "idx_spans_kind" ON "duron"."spans" ("kind");--> statement-breakpoint
96
+ CREATE INDEX "idx_spans_status_code" ON "duron"."spans" ("status_code");--> statement-breakpoint
97
+ CREATE INDEX "idx_spans_job_step" ON "duron"."spans" ("job_id","step_id");--> statement-breakpoint
98
+ CREATE INDEX "idx_spans_trace_parent" ON "duron"."spans" ("trace_id","parent_span_id");--> statement-breakpoint
99
+ CREATE INDEX "idx_spans_attributes" ON "duron"."spans" USING gin ("attributes");--> statement-breakpoint
100
+ CREATE INDEX "idx_spans_events" ON "duron"."spans" USING gin ("events");--> statement-breakpoint
89
101
  ALTER TABLE "duron"."job_steps" ADD CONSTRAINT "job_steps_job_id_jobs_id_fkey" FOREIGN KEY ("job_id") REFERENCES "duron"."jobs"("id") ON DELETE CASCADE;--> statement-breakpoint
90
- ALTER TABLE "duron"."metrics" ADD CONSTRAINT "metrics_job_id_jobs_id_fkey" FOREIGN KEY ("job_id") REFERENCES "duron"."jobs"("id") ON DELETE CASCADE;--> statement-breakpoint
91
- ALTER TABLE "duron"."metrics" ADD CONSTRAINT "metrics_step_id_job_steps_id_fkey" FOREIGN KEY ("step_id") REFERENCES "duron"."job_steps"("id") ON DELETE CASCADE;
102
+ ALTER TABLE "duron"."spans" ADD CONSTRAINT "spans_job_id_jobs_id_fkey" FOREIGN KEY ("job_id") REFERENCES "duron"."jobs"("id") ON DELETE CASCADE;--> statement-breakpoint
103
+ ALTER TABLE "duron"."spans" ADD CONSTRAINT "spans_step_id_job_steps_id_fkey" FOREIGN KEY ("step_id") REFERENCES "duron"."job_steps"("id") ON DELETE CASCADE;