duron 0.3.0-beta.8 → 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.
- package/dist/action-job.d.ts +33 -2
- package/dist/action-job.d.ts.map +1 -1
- package/dist/action-job.js +93 -26
- package/dist/action-manager.d.ts +44 -2
- package/dist/action-manager.d.ts.map +1 -1
- package/dist/action-manager.js +64 -3
- package/dist/action.d.ts +388 -7
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js +44 -23
- package/dist/adapters/adapter.d.ts +365 -8
- package/dist/adapters/adapter.d.ts.map +1 -1
- package/dist/adapters/adapter.js +221 -15
- package/dist/adapters/postgres/base.d.ts +184 -6
- package/dist/adapters/postgres/base.d.ts.map +1 -1
- package/dist/adapters/postgres/base.js +436 -75
- package/dist/adapters/postgres/pglite.d.ts +37 -0
- package/dist/adapters/postgres/pglite.d.ts.map +1 -1
- package/dist/adapters/postgres/pglite.js +38 -0
- package/dist/adapters/postgres/postgres.d.ts +35 -0
- package/dist/adapters/postgres/postgres.d.ts.map +1 -1
- package/dist/adapters/postgres/postgres.js +42 -0
- package/dist/adapters/postgres/schema.d.ts +150 -37
- package/dist/adapters/postgres/schema.d.ts.map +1 -1
- package/dist/adapters/postgres/schema.default.d.ts +151 -38
- package/dist/adapters/postgres/schema.default.d.ts.map +1 -1
- package/dist/adapters/postgres/schema.default.js +2 -2
- package/dist/adapters/postgres/schema.js +60 -23
- package/dist/adapters/schemas.d.ts +124 -80
- package/dist/adapters/schemas.d.ts.map +1 -1
- package/dist/adapters/schemas.js +139 -26
- package/dist/client.d.ts +426 -22
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +370 -20
- package/dist/constants.js +6 -0
- package/dist/errors.d.ts +166 -9
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +189 -19
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/server.d.ts +99 -37
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +84 -25
- package/dist/step-manager.d.ts +111 -4
- package/dist/step-manager.d.ts.map +1 -1
- package/dist/step-manager.js +411 -75
- package/dist/telemetry/index.d.ts +1 -4
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +2 -4
- package/dist/telemetry/local-span-exporter.d.ts +56 -0
- package/dist/telemetry/local-span-exporter.d.ts.map +1 -0
- package/dist/telemetry/local-span-exporter.js +118 -0
- package/dist/utils/p-retry.d.ts +5 -0
- package/dist/utils/p-retry.d.ts.map +1 -1
- package/dist/utils/p-retry.js +8 -0
- package/dist/utils/wait-for-abort.d.ts +1 -0
- package/dist/utils/wait-for-abort.d.ts.map +1 -1
- package/dist/utils/wait-for-abort.js +1 -0
- package/migrations/postgres/{20260119153838_flimsy_thor_girl → 20260121160012_normal_bloodstrike}/migration.sql +32 -20
- package/migrations/postgres/{20260119153838_flimsy_thor_girl → 20260121160012_normal_bloodstrike}/snapshot.json +241 -66
- package/package.json +42 -26
- package/src/action-job.ts +43 -32
- package/src/action-manager.ts +5 -5
- package/src/action.ts +317 -149
- package/src/adapters/adapter.ts +54 -54
- package/src/adapters/postgres/base.ts +266 -86
- package/src/adapters/postgres/schema.default.ts +2 -2
- package/src/adapters/postgres/schema.ts +52 -24
- package/src/adapters/schemas.ts +91 -36
- package/src/client.ts +322 -68
- package/src/errors.ts +141 -30
- package/src/index.ts +2 -0
- package/src/server.ts +39 -37
- package/src/step-manager.ts +254 -91
- package/src/telemetry/index.ts +2 -20
- package/src/telemetry/local-span-exporter.ts +148 -0
- package/dist/telemetry/adapter.d.ts +0 -107
- package/dist/telemetry/adapter.d.ts.map +0 -1
- package/dist/telemetry/adapter.js +0 -134
- package/dist/telemetry/local.d.ts +0 -22
- package/dist/telemetry/local.d.ts.map +0 -1
- package/dist/telemetry/local.js +0 -243
- package/dist/telemetry/noop.d.ts +0 -17
- package/dist/telemetry/noop.d.ts.map +0 -1
- package/dist/telemetry/noop.js +0 -66
- package/dist/telemetry/opentelemetry.d.ts +0 -25
- package/dist/telemetry/opentelemetry.d.ts.map +0 -1
- package/dist/telemetry/opentelemetry.js +0 -312
- package/src/telemetry/adapter.ts +0 -642
- package/src/telemetry/local.ts +0 -429
- package/src/telemetry/noop.ts +0 -141
- package/src/telemetry/opentelemetry.ts +0 -453
|
@@ -1,5 +1,2 @@
|
|
|
1
|
-
export {
|
|
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":"
|
|
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"}
|
package/dist/telemetry/index.js
CHANGED
|
@@ -1,4 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
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
|
+
}
|
package/dist/utils/p-retry.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"p-retry.d.ts","sourceRoot":"","sources":["../../src/utils/p-retry.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/utils/p-retry.js
CHANGED
|
@@ -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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait-for-abort.d.ts","sourceRoot":"","sources":["../../src/utils/wait-for-abort.ts"],"names":[],"mappings":"
|
|
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"}
|
|
@@ -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
|
|
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"."
|
|
47
|
-
"id"
|
|
48
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
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 "
|
|
81
|
-
CREATE INDEX "
|
|
82
|
-
CREATE INDEX "
|
|
83
|
-
CREATE INDEX "
|
|
84
|
-
CREATE INDEX "
|
|
85
|
-
CREATE INDEX "
|
|
86
|
-
CREATE INDEX "
|
|
87
|
-
CREATE INDEX "
|
|
88
|
-
CREATE INDEX "
|
|
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"."
|
|
91
|
-
ALTER TABLE "duron"."
|
|
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;
|