@shipfox/api-runners 12.3.0 → 12.4.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/.turbo/turbo-build.log +4 -4
- package/CHANGELOG.md +22 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -2
- package/dist/config.js.map +1 -1
- package/dist/core/demand.d.ts +4 -2
- package/dist/core/demand.d.ts.map +1 -1
- package/dist/core/demand.js +22 -6
- package/dist/core/demand.js.map +1 -1
- package/dist/core/entities/reservation.d.ts +1 -0
- package/dist/core/entities/reservation.d.ts.map +1 -1
- package/dist/core/entities/reservation.js.map +1 -1
- package/dist/core/entities/runner-instance.d.ts +3 -0
- package/dist/core/entities/runner-instance.d.ts.map +1 -1
- package/dist/core/entities/runner-instance.js.map +1 -1
- package/dist/core/runner-activation.d.ts +4 -1
- package/dist/core/runner-activation.d.ts.map +1 -1
- package/dist/core/runner-activation.js +32 -3
- package/dist/core/runner-activation.js.map +1 -1
- package/dist/core/runner-control-sessions.d.ts +8 -4
- package/dist/core/runner-control-sessions.d.ts.map +1 -1
- package/dist/core/runner-control-sessions.js +55 -9
- package/dist/core/runner-control-sessions.js.map +1 -1
- package/dist/core/runner-instances.d.ts +1 -0
- package/dist/core/runner-instances.d.ts.map +1 -1
- package/dist/core/runner-instances.js +1 -0
- package/dist/core/runner-instances.js.map +1 -1
- package/dist/db/db.d.ts +68 -0
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/ephemeral-registration-tokens.d.ts.map +1 -1
- package/dist/db/ephemeral-registration-tokens.js +1 -1
- package/dist/db/ephemeral-registration-tokens.js.map +1 -1
- package/dist/db/reservation-locks.d.ts +6 -0
- package/dist/db/reservation-locks.d.ts.map +1 -0
- package/dist/db/reservation-locks.js +15 -0
- package/dist/db/reservation-locks.js.map +1 -0
- package/dist/db/reservations.d.ts +17 -3
- package/dist/db/reservations.d.ts.map +1 -1
- package/dist/db/reservations.js +246 -51
- package/dist/db/reservations.js.map +1 -1
- package/dist/db/runner-assignments.d.ts +17 -0
- package/dist/db/runner-assignments.d.ts.map +1 -1
- package/dist/db/runner-assignments.js +103 -8
- package/dist/db/runner-assignments.js.map +1 -1
- package/dist/db/runner-instances.d.ts +2 -2
- package/dist/db/runner-instances.d.ts.map +1 -1
- package/dist/db/runner-instances.js +124 -24
- package/dist/db/runner-instances.js.map +1 -1
- package/dist/db/runner-states.d.ts +2 -0
- package/dist/db/runner-states.d.ts.map +1 -0
- package/dist/db/runner-states.js +7 -0
- package/dist/db/runner-states.js.map +1 -0
- package/dist/db/schema/reservations.d.ts +18 -0
- package/dist/db/schema/reservations.d.ts.map +1 -1
- package/dist/db/schema/reservations.js +7 -1
- package/dist/db/schema/reservations.js.map +1 -1
- package/dist/db/schema/runner-instances.d.ts +18 -0
- package/dist/db/schema/runner-instances.d.ts.map +1 -1
- package/dist/db/schema/runner-instances.js +8 -0
- package/dist/db/schema/runner-instances.js.map +1 -1
- package/dist/metrics/index.d.ts +2 -2
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +1 -1
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/instance.d.ts +24 -2
- package/dist/metrics/instance.d.ts.map +1 -1
- package/dist/metrics/instance.js +23 -0
- package/dist/metrics/instance.js.map +1 -1
- package/dist/presentation/dto/poll-demand.d.ts.map +1 -1
- package/dist/presentation/dto/poll-demand.js +3 -0
- package/dist/presentation/dto/poll-demand.js.map +1 -1
- package/dist/presentation/dto/runner-instances.d.ts +4 -1
- package/dist/presentation/dto/runner-instances.d.ts.map +1 -1
- package/dist/presentation/dto/runner-instances.js +4 -1
- package/dist/presentation/dto/runner-instances.js.map +1 -1
- package/dist/presentation/routes/assign-runner-instances.d.ts.map +1 -1
- package/dist/presentation/routes/assign-runner-instances.js +3 -3
- package/dist/presentation/routes/assign-runner-instances.js.map +1 -1
- package/dist/presentation/routes/poll-demand.d.ts.map +1 -1
- package/dist/presentation/routes/poll-demand.js +1 -0
- package/dist/presentation/routes/poll-demand.js.map +1 -1
- package/dist/presentation/routes/reconcile-runner-instances.d.ts.map +1 -1
- package/dist/presentation/routes/reconcile-runner-instances.js +4 -2
- package/dist/presentation/routes/reconcile-runner-instances.js.map +1 -1
- package/dist/presentation/routes/runner-enrollment.d.ts +4 -1
- package/dist/presentation/routes/runner-enrollment.d.ts.map +1 -1
- package/dist/presentation/routes/runner-enrollment.js +11 -6
- package/dist/presentation/routes/runner-enrollment.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/drizzle/0005_previous_lenny_balinger.sql +5 -0
- package/drizzle/meta/0005_snapshot.json +2220 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +2 -2
- package/src/config.test.ts +22 -0
- package/src/config.ts +15 -2
- package/src/core/demand.test.ts +192 -3
- package/src/core/demand.ts +44 -4
- package/src/core/entities/reservation.ts +1 -0
- package/src/core/entities/runner-instance.ts +4 -0
- package/src/core/runner-activation.ts +48 -2
- package/src/core/runner-control-sessions.test.ts +64 -3
- package/src/core/runner-control-sessions.ts +62 -9
- package/src/core/runner-instances.test.ts +19 -0
- package/src/core/runner-instances.ts +2 -0
- package/src/core/runner-sessions.test.ts +121 -1
- package/src/db/ephemeral-registration-tokens.test.ts +20 -1
- package/src/db/ephemeral-registration-tokens.ts +1 -0
- package/src/db/reservation-locks.ts +22 -0
- package/src/db/reservations.test.ts +733 -22
- package/src/db/reservations.ts +408 -144
- package/src/db/runner-assignments.test.ts +105 -1
- package/src/db/runner-assignments.ts +178 -9
- package/src/db/runner-instances.test.ts +265 -2
- package/src/db/runner-instances.ts +215 -55
- package/src/db/runner-states.ts +7 -0
- package/src/db/schema/reservations.ts +5 -1
- package/src/db/schema/runner-instances.ts +9 -0
- package/src/metrics/index.ts +10 -1
- package/src/metrics/instance.ts +59 -2
- package/src/metrics/service.test.ts +8 -1
- package/src/presentation/dto/poll-demand.ts +3 -0
- package/src/presentation/dto/runner-instances.ts +8 -1
- package/src/presentation/routes/assign-runner-instances.ts +6 -2
- package/src/presentation/routes/late-runner-enrollment.test.ts +219 -2
- package/src/presentation/routes/poll-demand.test.ts +56 -0
- package/src/presentation/routes/poll-demand.ts +1 -0
- package/src/presentation/routes/reconcile-runner-instances.test.ts +34 -2
- package/src/presentation/routes/reconcile-runner-instances.ts +7 -1
- package/src/presentation/routes/runner-enrollment.test.ts +316 -3
- package/src/presentation/routes/runner-enrollment.ts +8 -5
- package/test/factories/reservation.ts +2 -0
- package/test/factories/runner-instance.ts +6 -0
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import { uuidv7PrimaryKey } from '@shipfox/node-drizzle';
|
|
2
2
|
import { sql } from 'drizzle-orm';
|
|
3
|
-
import { check, index, integer, text, timestamp, uuid } from 'drizzle-orm/pg-core';
|
|
3
|
+
import { check, index, integer, pgEnum, text, timestamp, uuid } from 'drizzle-orm/pg-core';
|
|
4
4
|
import { pgTable } from './common.js';
|
|
5
|
+
export const reservationKindEnum = pgEnum('runners_reservation_kind', [
|
|
6
|
+
'bound',
|
|
7
|
+
'launch'
|
|
8
|
+
]);
|
|
5
9
|
export const reservations = pgTable('reservations', {
|
|
6
10
|
id: uuidv7PrimaryKey(),
|
|
7
11
|
workspaceId: uuid('workspace_id').notNull(),
|
|
8
12
|
provisionerId: uuid('provisioner_id').notNull(),
|
|
9
13
|
requiredLabels: text('required_labels').array().notNull(),
|
|
10
14
|
count: integer('count').notNull(),
|
|
15
|
+
kind: reservationKindEnum('kind').notNull().default('launch'),
|
|
11
16
|
createdAt: timestamp('created_at', {
|
|
12
17
|
withTimezone: true
|
|
13
18
|
}).notNull().defaultNow(),
|
|
@@ -26,6 +31,7 @@ export function toReservation(row) {
|
|
|
26
31
|
provisionerId: row.provisionerId,
|
|
27
32
|
requiredLabels: row.requiredLabels,
|
|
28
33
|
count: row.count,
|
|
34
|
+
kind: row.kind,
|
|
29
35
|
createdAt: row.createdAt,
|
|
30
36
|
expiresAt: row.expiresAt
|
|
31
37
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/db/schema/reservations.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {check, index, integer, text, timestamp, uuid} from 'drizzle-orm/pg-core';\nimport type {Reservation} from '#core/entities/reservation.js';\nimport {pgTable} from './common.js';\n\nexport const reservations = pgTable(\n 'reservations',\n {\n id: uuidv7PrimaryKey(),\n workspaceId: uuid('workspace_id').notNull(),\n provisionerId: uuid('provisioner_id').notNull(),\n requiredLabels: text('required_labels').array().notNull(),\n count: integer('count').notNull(),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n expiresAt: timestamp('expires_at', {withTimezone: true}).notNull(),\n },\n (table) => [\n index('runners_reservations_workspace_expires_idx').on(table.workspaceId, table.expiresAt),\n index('runners_reservations_expires_idx').on(table.expiresAt),\n check('runners_reservations_count_positive_ck', sql`${table.count} > 0`),\n ],\n);\n\nexport type ReservationDb = typeof reservations.$inferSelect;\nexport type ReservationInsertDb = typeof reservations.$inferInsert;\n\nexport function toReservation(row: ReservationDb): Reservation {\n return {\n id: row.id,\n workspaceId: row.workspaceId,\n provisionerId: row.provisionerId,\n requiredLabels: row.requiredLabels,\n count: row.count,\n createdAt: row.createdAt,\n expiresAt: row.expiresAt,\n };\n}\n"],"names":["uuidv7PrimaryKey","sql","check","index","integer","text","timestamp","uuid","pgTable","reservations","id","workspaceId","notNull","provisionerId","requiredLabels","array","count","createdAt","withTimezone","defaultNow","expiresAt","table","on","toReservation","row"],"mappings":"AAAA,SAAQA,gBAAgB,QAAO,wBAAwB;AACvD,SAAQC,GAAG,QAAO,cAAc;AAChC,SAAQC,KAAK,EAAEC,KAAK,EAAEC,OAAO,EAAEC,IAAI,EAAEC,SAAS,EAAEC,IAAI,QAAO,sBAAsB;
|
|
1
|
+
{"version":3,"sources":["../../../src/db/schema/reservations.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {check, index, integer, pgEnum, text, timestamp, uuid} from 'drizzle-orm/pg-core';\nimport type {Reservation} from '#core/entities/reservation.js';\nimport {pgTable} from './common.js';\n\nexport const reservationKindEnum = pgEnum('runners_reservation_kind', ['bound', 'launch']);\n\nexport const reservations = pgTable(\n 'reservations',\n {\n id: uuidv7PrimaryKey(),\n workspaceId: uuid('workspace_id').notNull(),\n provisionerId: uuid('provisioner_id').notNull(),\n requiredLabels: text('required_labels').array().notNull(),\n count: integer('count').notNull(),\n kind: reservationKindEnum('kind').notNull().default('launch'),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n expiresAt: timestamp('expires_at', {withTimezone: true}).notNull(),\n },\n (table) => [\n index('runners_reservations_workspace_expires_idx').on(table.workspaceId, table.expiresAt),\n index('runners_reservations_expires_idx').on(table.expiresAt),\n check('runners_reservations_count_positive_ck', sql`${table.count} > 0`),\n ],\n);\n\nexport type ReservationDb = typeof reservations.$inferSelect;\nexport type ReservationInsertDb = typeof reservations.$inferInsert;\n\nexport function toReservation(row: ReservationDb): Reservation {\n return {\n id: row.id,\n workspaceId: row.workspaceId,\n provisionerId: row.provisionerId,\n requiredLabels: row.requiredLabels,\n count: row.count,\n kind: row.kind,\n createdAt: row.createdAt,\n expiresAt: row.expiresAt,\n };\n}\n"],"names":["uuidv7PrimaryKey","sql","check","index","integer","pgEnum","text","timestamp","uuid","pgTable","reservationKindEnum","reservations","id","workspaceId","notNull","provisionerId","requiredLabels","array","count","kind","default","createdAt","withTimezone","defaultNow","expiresAt","table","on","toReservation","row"],"mappings":"AAAA,SAAQA,gBAAgB,QAAO,wBAAwB;AACvD,SAAQC,GAAG,QAAO,cAAc;AAChC,SAAQC,KAAK,EAAEC,KAAK,EAAEC,OAAO,EAAEC,MAAM,EAAEC,IAAI,EAAEC,SAAS,EAAEC,IAAI,QAAO,sBAAsB;AAEzF,SAAQC,OAAO,QAAO,cAAc;AAEpC,OAAO,MAAMC,sBAAsBL,OAAO,4BAA4B;IAAC;IAAS;CAAS,EAAE;AAE3F,OAAO,MAAMM,eAAeF,QAC1B,gBACA;IACEG,IAAIZ;IACJa,aAAaL,KAAK,gBAAgBM,OAAO;IACzCC,eAAeP,KAAK,kBAAkBM,OAAO;IAC7CE,gBAAgBV,KAAK,mBAAmBW,KAAK,GAAGH,OAAO;IACvDI,OAAOd,QAAQ,SAASU,OAAO;IAC/BK,MAAMT,oBAAoB,QAAQI,OAAO,GAAGM,OAAO,CAAC;IACpDC,WAAWd,UAAU,cAAc;QAACe,cAAc;IAAI,GAAGR,OAAO,GAAGS,UAAU;IAC7EC,WAAWjB,UAAU,cAAc;QAACe,cAAc;IAAI,GAAGR,OAAO;AAClE,GACA,CAACW,QAAU;QACTtB,MAAM,8CAA8CuB,EAAE,CAACD,MAAMZ,WAAW,EAAEY,MAAMD,SAAS;QACzFrB,MAAM,oCAAoCuB,EAAE,CAACD,MAAMD,SAAS;QAC5DtB,MAAM,0CAA0CD,GAAG,CAAC,EAAEwB,MAAMP,KAAK,CAAC,IAAI,CAAC;KACxE,EACD;AAKF,OAAO,SAASS,cAAcC,GAAkB;IAC9C,OAAO;QACLhB,IAAIgB,IAAIhB,EAAE;QACVC,aAAae,IAAIf,WAAW;QAC5BE,eAAea,IAAIb,aAAa;QAChCC,gBAAgBY,IAAIZ,cAAc;QAClCE,OAAOU,IAAIV,KAAK;QAChBC,MAAMS,IAAIT,IAAI;QACdE,WAAWO,IAAIP,SAAS;QACxBG,WAAWI,IAAIJ,SAAS;IAC1B;AACF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { RunnerInstance } from '#core/entities/runner-instance.js';
|
|
2
2
|
export declare const providerRunnerStateEnum: import("drizzle-orm/pg-core").PgEnum<["starting", "running", "stopping", "stopped", "failed", "terminated"]>;
|
|
3
|
+
export declare const providerRunnerLaunchKindEnum: import("drizzle-orm/pg-core").PgEnum<["demand", "warm", "manual"]>;
|
|
3
4
|
export declare const providerRunners: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
4
5
|
name: "runner_instances";
|
|
5
6
|
schema: undefined;
|
|
@@ -106,6 +107,23 @@ export declare const providerRunners: import("drizzle-orm/pg-core").PgTableWithC
|
|
|
106
107
|
identity: undefined;
|
|
107
108
|
generated: undefined;
|
|
108
109
|
}, {}, {}>;
|
|
110
|
+
launchKind: import("drizzle-orm/pg-core").PgColumn<{
|
|
111
|
+
name: "launch_kind";
|
|
112
|
+
tableName: "runner_instances";
|
|
113
|
+
dataType: "string";
|
|
114
|
+
columnType: "PgEnumColumn";
|
|
115
|
+
data: "demand" | "manual" | "warm";
|
|
116
|
+
driverParam: string;
|
|
117
|
+
notNull: true;
|
|
118
|
+
hasDefault: true;
|
|
119
|
+
isPrimaryKey: false;
|
|
120
|
+
isAutoincrement: false;
|
|
121
|
+
hasRuntimeDefault: false;
|
|
122
|
+
enumValues: ["demand", "warm", "manual"];
|
|
123
|
+
baseColumn: never;
|
|
124
|
+
identity: undefined;
|
|
125
|
+
generated: undefined;
|
|
126
|
+
}, {}, {}>;
|
|
109
127
|
assignedAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
110
128
|
name: "assigned_at";
|
|
111
129
|
tableName: "runner_instances";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-instances.d.ts","sourceRoot":"","sources":["../../../src/db/schema/runner-instances.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,mCAAmC,CAAC;AAGtE,eAAO,MAAM,uBAAuB,8GAOlC,CAAC;AAEH,eAAO,MAAM,eAAe
|
|
1
|
+
{"version":3,"file":"runner-instances.d.ts","sourceRoot":"","sources":["../../../src/db/schema/runner-instances.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,mCAAmC,CAAC;AAGtE,eAAO,MAAM,uBAAuB,8GAOlC,CAAC;AAEH,eAAO,MAAM,4BAA4B,oEAIvC,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyD3B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,OAAO,eAAe,CAAC,YAAY,CAAC;AACnE,MAAM,MAAM,sBAAsB,GAAG,OAAO,eAAe,CAAC,YAAY,CAAC;AAEzE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,GAAG,cAAc,CA2BtE"}
|
|
@@ -10,6 +10,11 @@ export const providerRunnerStateEnum = pgEnum('runners_provider_runner_state', [
|
|
|
10
10
|
'failed',
|
|
11
11
|
'terminated'
|
|
12
12
|
]);
|
|
13
|
+
export const providerRunnerLaunchKindEnum = pgEnum('runners_provider_runner_launch_kind', [
|
|
14
|
+
'demand',
|
|
15
|
+
'warm',
|
|
16
|
+
'manual'
|
|
17
|
+
]);
|
|
13
18
|
export const providerRunners = pgTable('runner_instances', {
|
|
14
19
|
id: uuidv7PrimaryKey(),
|
|
15
20
|
// Kept during the protocol migration for legacy workspace capacity. New capacity is owned
|
|
@@ -19,6 +24,7 @@ export const providerRunners = pgTable('runner_instances', {
|
|
|
19
24
|
providerRunnerId: text('provider_runner_id'),
|
|
20
25
|
intendedReservationId: uuid('intended_reservation_id'),
|
|
21
26
|
reservationId: uuid('reservation_id'),
|
|
27
|
+
launchKind: providerRunnerLaunchKindEnum('launch_kind').notNull().default('manual'),
|
|
22
28
|
assignedAt: timestamp('assigned_at', {
|
|
23
29
|
withTimezone: true
|
|
24
30
|
}),
|
|
@@ -76,7 +82,9 @@ export function toRunnerInstance(row) {
|
|
|
76
82
|
workspaceId: row.workspaceId,
|
|
77
83
|
provisionerId: row.provisionerId,
|
|
78
84
|
providerRunnerId: row.providerRunnerId,
|
|
85
|
+
intendedReservationId: row.intendedReservationId,
|
|
79
86
|
reservationId: row.reservationId,
|
|
87
|
+
launchKind: row.launchKind,
|
|
80
88
|
assignedAt: row.assignedAt,
|
|
81
89
|
templateKey: row.templateKey,
|
|
82
90
|
labels: row.labels,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/db/schema/runner-instances.ts"],"sourcesContent":["import type {RunnerToolCapabilitiesDto} from '@shipfox/api-runners-dto';\nimport {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {index, jsonb, pgEnum, text, timestamp, uniqueIndex, uuid} from 'drizzle-orm/pg-core';\nimport type {RunnerInstance} from '#core/entities/runner-instance.js';\nimport {pgTable} from './common.js';\n\nexport const providerRunnerStateEnum = pgEnum('runners_provider_runner_state', [\n 'starting',\n 'running',\n 'stopping',\n 'stopped',\n 'failed',\n 'terminated',\n]);\n\nexport const providerRunners = pgTable(\n 'runner_instances',\n {\n id: uuidv7PrimaryKey(),\n // Kept during the protocol migration for legacy workspace capacity. New capacity is owned\n // only by its provisioner and has no workspace assignment.\n workspaceId: uuid('workspace_id'),\n provisionerId: uuid('provisioner_id').notNull(),\n providerRunnerId: text('provider_runner_id'),\n intendedReservationId: uuid('intended_reservation_id'),\n reservationId: uuid('reservation_id'),\n assignedAt: timestamp('assigned_at', {withTimezone: true}),\n templateKey: text('template_key'),\n labels: text('labels').array().notNull().default([]),\n state: providerRunnerStateEnum('state').notNull(),\n reason: text('reason'),\n runnerSessionId: uuid('runner_session_id'),\n firstClaimedAt: timestamp('first_claimed_at', {withTimezone: true}),\n providerKind: text('provider_kind'),\n protocolVersion: text('protocol_version'),\n capabilities: jsonb('capabilities').$type<RunnerToolCapabilitiesDto | null>(),\n reportedAt: timestamp('reported_at', {withTimezone: true}).notNull(),\n startedAt: timestamp('started_at', {withTimezone: true}),\n stoppingAt: timestamp('stopping_at', {withTimezone: true}),\n stoppedAt: timestamp('stopped_at', {withTimezone: true}),\n failedAt: timestamp('failed_at', {withTimezone: true}),\n terminatedAt: timestamp('terminated_at', {withTimezone: true}),\n reservationReleasedAt: timestamp('reservation_released_at', {withTimezone: true}),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', {withTimezone: true}).notNull().defaultNow(),\n },\n (table) => [\n uniqueIndex('runners_runner_instances_provisioner_runner_unique')\n .on(table.provisionerId, table.providerRunnerId)\n .where(sql`${table.providerRunnerId} is not null`),\n index('runners_runner_instances_workspace_state_updated_idx').on(table.state, table.updatedAt),\n index('runners_runner_instances_stale_reaper_idx').on(\n table.state,\n table.updatedAt,\n table.reportedAt,\n ),\n index('runners_runner_instances_provisioner_intended_reservation_idx')\n .on(table.provisionerId, table.intendedReservationId)\n .where(\n sql`${table.intendedReservationId} is not null and ${table.reservationReleasedAt} is null`,\n ),\n index('runners_runner_instances_intended_reservation_idx')\n .on(table.intendedReservationId)\n .where(sql`${table.intendedReservationId} is not null`),\n index('runners_runner_instances_provisioner_reservation_idx')\n .on(table.provisionerId, table.reservationId)\n .where(sql`${table.reservationId} is not null`),\n index('runners_runner_instances_active_template_counts_idx')\n .on(table.provisionerId, table.state, table.templateKey)\n .where(sql`\"state\" in ('starting', 'running') and \"template_key\" is not null`),\n ],\n);\n\nexport type RunnerInstanceDb = typeof providerRunners.$inferSelect;\nexport type RunnerInstanceInsertDb = typeof providerRunners.$inferInsert;\n\nexport function toRunnerInstance(row: RunnerInstanceDb): RunnerInstance {\n if (!row.providerRunnerId) throw new Error('Runner instance has no provider runner identity');\n return {\n id: row.id,\n workspaceId: row.workspaceId,\n provisionerId: row.provisionerId,\n providerRunnerId: row.providerRunnerId,\n reservationId: row.reservationId,\n assignedAt: row.assignedAt,\n templateKey: row.templateKey,\n labels: row.labels,\n state: row.state,\n reason: row.reason,\n runnerSessionId: row.runnerSessionId,\n providerKind: row.providerKind,\n reportedAt: row.reportedAt,\n startedAt: row.startedAt,\n stoppingAt: row.stoppingAt,\n stoppedAt: row.stoppedAt,\n failedAt: row.failedAt,\n terminatedAt: row.terminatedAt,\n reservationReleasedAt: row.reservationReleasedAt,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n}\n"],"names":["uuidv7PrimaryKey","sql","index","jsonb","pgEnum","text","timestamp","uniqueIndex","uuid","pgTable","providerRunnerStateEnum","providerRunners","id","workspaceId","provisionerId","notNull","providerRunnerId","intendedReservationId","reservationId","assignedAt","withTimezone","templateKey","labels","array","
|
|
1
|
+
{"version":3,"sources":["../../../src/db/schema/runner-instances.ts"],"sourcesContent":["import type {RunnerToolCapabilitiesDto} from '@shipfox/api-runners-dto';\nimport {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {index, jsonb, pgEnum, text, timestamp, uniqueIndex, uuid} from 'drizzle-orm/pg-core';\nimport type {RunnerInstance} from '#core/entities/runner-instance.js';\nimport {pgTable} from './common.js';\n\nexport const providerRunnerStateEnum = pgEnum('runners_provider_runner_state', [\n 'starting',\n 'running',\n 'stopping',\n 'stopped',\n 'failed',\n 'terminated',\n]);\n\nexport const providerRunnerLaunchKindEnum = pgEnum('runners_provider_runner_launch_kind', [\n 'demand',\n 'warm',\n 'manual',\n]);\n\nexport const providerRunners = pgTable(\n 'runner_instances',\n {\n id: uuidv7PrimaryKey(),\n // Kept during the protocol migration for legacy workspace capacity. New capacity is owned\n // only by its provisioner and has no workspace assignment.\n workspaceId: uuid('workspace_id'),\n provisionerId: uuid('provisioner_id').notNull(),\n providerRunnerId: text('provider_runner_id'),\n intendedReservationId: uuid('intended_reservation_id'),\n reservationId: uuid('reservation_id'),\n launchKind: providerRunnerLaunchKindEnum('launch_kind').notNull().default('manual'),\n assignedAt: timestamp('assigned_at', {withTimezone: true}),\n templateKey: text('template_key'),\n labels: text('labels').array().notNull().default([]),\n state: providerRunnerStateEnum('state').notNull(),\n reason: text('reason'),\n runnerSessionId: uuid('runner_session_id'),\n firstClaimedAt: timestamp('first_claimed_at', {withTimezone: true}),\n providerKind: text('provider_kind'),\n protocolVersion: text('protocol_version'),\n capabilities: jsonb('capabilities').$type<RunnerToolCapabilitiesDto | null>(),\n reportedAt: timestamp('reported_at', {withTimezone: true}).notNull(),\n startedAt: timestamp('started_at', {withTimezone: true}),\n stoppingAt: timestamp('stopping_at', {withTimezone: true}),\n stoppedAt: timestamp('stopped_at', {withTimezone: true}),\n failedAt: timestamp('failed_at', {withTimezone: true}),\n terminatedAt: timestamp('terminated_at', {withTimezone: true}),\n reservationReleasedAt: timestamp('reservation_released_at', {withTimezone: true}),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', {withTimezone: true}).notNull().defaultNow(),\n },\n (table) => [\n uniqueIndex('runners_runner_instances_provisioner_runner_unique')\n .on(table.provisionerId, table.providerRunnerId)\n .where(sql`${table.providerRunnerId} is not null`),\n index('runners_runner_instances_workspace_state_updated_idx').on(table.state, table.updatedAt),\n index('runners_runner_instances_stale_reaper_idx').on(\n table.state,\n table.updatedAt,\n table.reportedAt,\n ),\n index('runners_runner_instances_provisioner_intended_reservation_idx')\n .on(table.provisionerId, table.intendedReservationId)\n .where(\n sql`${table.intendedReservationId} is not null and ${table.reservationReleasedAt} is null`,\n ),\n index('runners_runner_instances_intended_reservation_idx')\n .on(table.intendedReservationId)\n .where(sql`${table.intendedReservationId} is not null`),\n index('runners_runner_instances_provisioner_reservation_idx')\n .on(table.provisionerId, table.reservationId)\n .where(sql`${table.reservationId} is not null`),\n index('runners_runner_instances_active_template_counts_idx')\n .on(table.provisionerId, table.state, table.templateKey)\n .where(sql`\"state\" in ('starting', 'running') and \"template_key\" is not null`),\n ],\n);\n\nexport type RunnerInstanceDb = typeof providerRunners.$inferSelect;\nexport type RunnerInstanceInsertDb = typeof providerRunners.$inferInsert;\n\nexport function toRunnerInstance(row: RunnerInstanceDb): RunnerInstance {\n if (!row.providerRunnerId) throw new Error('Runner instance has no provider runner identity');\n return {\n id: row.id,\n workspaceId: row.workspaceId,\n provisionerId: row.provisionerId,\n providerRunnerId: row.providerRunnerId,\n intendedReservationId: row.intendedReservationId,\n reservationId: row.reservationId,\n launchKind: row.launchKind,\n assignedAt: row.assignedAt,\n templateKey: row.templateKey,\n labels: row.labels,\n state: row.state,\n reason: row.reason,\n runnerSessionId: row.runnerSessionId,\n providerKind: row.providerKind,\n reportedAt: row.reportedAt,\n startedAt: row.startedAt,\n stoppingAt: row.stoppingAt,\n stoppedAt: row.stoppedAt,\n failedAt: row.failedAt,\n terminatedAt: row.terminatedAt,\n reservationReleasedAt: row.reservationReleasedAt,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n}\n"],"names":["uuidv7PrimaryKey","sql","index","jsonb","pgEnum","text","timestamp","uniqueIndex","uuid","pgTable","providerRunnerStateEnum","providerRunnerLaunchKindEnum","providerRunners","id","workspaceId","provisionerId","notNull","providerRunnerId","intendedReservationId","reservationId","launchKind","default","assignedAt","withTimezone","templateKey","labels","array","state","reason","runnerSessionId","firstClaimedAt","providerKind","protocolVersion","capabilities","$type","reportedAt","startedAt","stoppingAt","stoppedAt","failedAt","terminatedAt","reservationReleasedAt","createdAt","defaultNow","updatedAt","table","on","where","toRunnerInstance","row","Error"],"mappings":"AACA,SAAQA,gBAAgB,QAAO,wBAAwB;AACvD,SAAQC,GAAG,QAAO,cAAc;AAChC,SAAQC,KAAK,EAAEC,KAAK,EAAEC,MAAM,EAAEC,IAAI,EAAEC,SAAS,EAAEC,WAAW,EAAEC,IAAI,QAAO,sBAAsB;AAE7F,SAAQC,OAAO,QAAO,cAAc;AAEpC,OAAO,MAAMC,0BAA0BN,OAAO,iCAAiC;IAC7E;IACA;IACA;IACA;IACA;IACA;CACD,EAAE;AAEH,OAAO,MAAMO,+BAA+BP,OAAO,uCAAuC;IACxF;IACA;IACA;CACD,EAAE;AAEH,OAAO,MAAMQ,kBAAkBH,QAC7B,oBACA;IACEI,IAAIb;IACJ,0FAA0F;IAC1F,2DAA2D;IAC3Dc,aAAaN,KAAK;IAClBO,eAAeP,KAAK,kBAAkBQ,OAAO;IAC7CC,kBAAkBZ,KAAK;IACvBa,uBAAuBV,KAAK;IAC5BW,eAAeX,KAAK;IACpBY,YAAYT,6BAA6B,eAAeK,OAAO,GAAGK,OAAO,CAAC;IAC1EC,YAAYhB,UAAU,eAAe;QAACiB,cAAc;IAAI;IACxDC,aAAanB,KAAK;IAClBoB,QAAQpB,KAAK,UAAUqB,KAAK,GAAGV,OAAO,GAAGK,OAAO,CAAC,EAAE;IACnDM,OAAOjB,wBAAwB,SAASM,OAAO;IAC/CY,QAAQvB,KAAK;IACbwB,iBAAiBrB,KAAK;IACtBsB,gBAAgBxB,UAAU,oBAAoB;QAACiB,cAAc;IAAI;IACjEQ,cAAc1B,KAAK;IACnB2B,iBAAiB3B,KAAK;IACtB4B,cAAc9B,MAAM,gBAAgB+B,KAAK;IACzCC,YAAY7B,UAAU,eAAe;QAACiB,cAAc;IAAI,GAAGP,OAAO;IAClEoB,WAAW9B,UAAU,cAAc;QAACiB,cAAc;IAAI;IACtDc,YAAY/B,UAAU,eAAe;QAACiB,cAAc;IAAI;IACxDe,WAAWhC,UAAU,cAAc;QAACiB,cAAc;IAAI;IACtDgB,UAAUjC,UAAU,aAAa;QAACiB,cAAc;IAAI;IACpDiB,cAAclC,UAAU,iBAAiB;QAACiB,cAAc;IAAI;IAC5DkB,uBAAuBnC,UAAU,2BAA2B;QAACiB,cAAc;IAAI;IAC/EmB,WAAWpC,UAAU,cAAc;QAACiB,cAAc;IAAI,GAAGP,OAAO,GAAG2B,UAAU;IAC7EC,WAAWtC,UAAU,cAAc;QAACiB,cAAc;IAAI,GAAGP,OAAO,GAAG2B,UAAU;AAC/E,GACA,CAACE,QAAU;QACTtC,YAAY,sDACTuC,EAAE,CAACD,MAAM9B,aAAa,EAAE8B,MAAM5B,gBAAgB,EAC9C8B,KAAK,CAAC9C,GAAG,CAAC,EAAE4C,MAAM5B,gBAAgB,CAAC,YAAY,CAAC;QACnDf,MAAM,wDAAwD4C,EAAE,CAACD,MAAMlB,KAAK,EAAEkB,MAAMD,SAAS;QAC7F1C,MAAM,6CAA6C4C,EAAE,CACnDD,MAAMlB,KAAK,EACXkB,MAAMD,SAAS,EACfC,MAAMV,UAAU;QAElBjC,MAAM,iEACH4C,EAAE,CAACD,MAAM9B,aAAa,EAAE8B,MAAM3B,qBAAqB,EACnD6B,KAAK,CACJ9C,GAAG,CAAC,EAAE4C,MAAM3B,qBAAqB,CAAC,iBAAiB,EAAE2B,MAAMJ,qBAAqB,CAAC,QAAQ,CAAC;QAE9FvC,MAAM,qDACH4C,EAAE,CAACD,MAAM3B,qBAAqB,EAC9B6B,KAAK,CAAC9C,GAAG,CAAC,EAAE4C,MAAM3B,qBAAqB,CAAC,YAAY,CAAC;QACxDhB,MAAM,wDACH4C,EAAE,CAACD,MAAM9B,aAAa,EAAE8B,MAAM1B,aAAa,EAC3C4B,KAAK,CAAC9C,GAAG,CAAC,EAAE4C,MAAM1B,aAAa,CAAC,YAAY,CAAC;QAChDjB,MAAM,uDACH4C,EAAE,CAACD,MAAM9B,aAAa,EAAE8B,MAAMlB,KAAK,EAAEkB,MAAMrB,WAAW,EACtDuB,KAAK,CAAC9C,GAAG,CAAC,iEAAiE,CAAC;KAChF,EACD;AAKF,OAAO,SAAS+C,iBAAiBC,GAAqB;IACpD,IAAI,CAACA,IAAIhC,gBAAgB,EAAE,MAAM,IAAIiC,MAAM;IAC3C,OAAO;QACLrC,IAAIoC,IAAIpC,EAAE;QACVC,aAAamC,IAAInC,WAAW;QAC5BC,eAAekC,IAAIlC,aAAa;QAChCE,kBAAkBgC,IAAIhC,gBAAgB;QACtCC,uBAAuB+B,IAAI/B,qBAAqB;QAChDC,eAAe8B,IAAI9B,aAAa;QAChCC,YAAY6B,IAAI7B,UAAU;QAC1BE,YAAY2B,IAAI3B,UAAU;QAC1BE,aAAayB,IAAIzB,WAAW;QAC5BC,QAAQwB,IAAIxB,MAAM;QAClBE,OAAOsB,IAAItB,KAAK;QAChBC,QAAQqB,IAAIrB,MAAM;QAClBC,iBAAiBoB,IAAIpB,eAAe;QACpCE,cAAckB,IAAIlB,YAAY;QAC9BI,YAAYc,IAAId,UAAU;QAC1BC,WAAWa,IAAIb,SAAS;QACxBC,YAAYY,IAAIZ,UAAU;QAC1BC,WAAWW,IAAIX,SAAS;QACxBC,UAAUU,IAAIV,QAAQ;QACtBC,cAAcS,IAAIT,YAAY;QAC9BC,uBAAuBQ,IAAIR,qBAAqB;QAChDC,WAAWO,IAAIP,SAAS;QACxBE,WAAWK,IAAIL,SAAS;IAC1B;AACF"}
|
package/dist/metrics/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { RunnerReservationPromotionFailureReason } from './instance.js';
|
|
2
|
-
export { jobExecutionClaimedCount, jobExecutionEnqueuedCount, jobExecutionLeaseExpiredCount, providerRunnerAbsentTerminatedCount, providerRunnerCountDivergenceCount, providerRunnerReconcileCallCount, providerRunnerTerminateIntentHonoredCount, providerRunnerTerminateIntentIssuedCount, recordRunnerReservationPromotionFailure, recordRunnersRateLimitCheck, recordRunnersRateLimitPruneFailure, } from './instance.js';
|
|
1
|
+
export type { RunnerActivationTokenNotIssuedReason, RunnerActivationTokenNotIssuedSurface, RunnerReservationCapacityFailureReason, RunnerReservationPromotionFailureReason, } from './instance.js';
|
|
2
|
+
export { jobExecutionClaimedCount, jobExecutionEnqueuedCount, jobExecutionLeaseExpiredCount, providerRunnerAbsentTerminatedCount, providerRunnerActivationOutcomeCount, providerRunnerCountDivergenceCount, providerRunnerReconcileCallCount, providerRunnerTerminateIntentHonoredCount, providerRunnerTerminateIntentIssuedCount, recordProviderRunnerActivationOutcome, recordRunnerActivationTokenNotIssued, recordRunnerReservationCapacityFailure, recordRunnerReservationPromotionFailure, recordRunnersRateLimitCheck, recordRunnersRateLimitPruneFailure, } from './instance.js';
|
|
3
3
|
export { registerRunnersServiceMetrics } from './service.js';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAAA,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,oCAAoC,EACpC,qCAAqC,EACrC,sCAAsC,EACtC,uCAAuC,GACxC,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,6BAA6B,EAC7B,mCAAmC,EACnC,oCAAoC,EACpC,kCAAkC,EAClC,gCAAgC,EAChC,yCAAyC,EACzC,wCAAwC,EACxC,qCAAqC,EACrC,oCAAoC,EACpC,sCAAsC,EACtC,uCAAuC,EACvC,2BAA2B,EAC3B,kCAAkC,GACnC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAC,6BAA6B,EAAC,MAAM,cAAc,CAAC"}
|
package/dist/metrics/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { jobExecutionClaimedCount, jobExecutionEnqueuedCount, jobExecutionLeaseExpiredCount, providerRunnerAbsentTerminatedCount, providerRunnerCountDivergenceCount, providerRunnerReconcileCallCount, providerRunnerTerminateIntentHonoredCount, providerRunnerTerminateIntentIssuedCount, recordRunnerReservationPromotionFailure, recordRunnersRateLimitCheck, recordRunnersRateLimitPruneFailure } from './instance.js';
|
|
1
|
+
export { jobExecutionClaimedCount, jobExecutionEnqueuedCount, jobExecutionLeaseExpiredCount, providerRunnerAbsentTerminatedCount, providerRunnerActivationOutcomeCount, providerRunnerCountDivergenceCount, providerRunnerReconcileCallCount, providerRunnerTerminateIntentHonoredCount, providerRunnerTerminateIntentIssuedCount, recordProviderRunnerActivationOutcome, recordRunnerActivationTokenNotIssued, recordRunnerReservationCapacityFailure, recordRunnerReservationPromotionFailure, recordRunnersRateLimitCheck, recordRunnersRateLimitPruneFailure } from './instance.js';
|
|
2
2
|
export { registerRunnersServiceMetrics } from './service.js';
|
|
3
3
|
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/metrics/index.ts"],"sourcesContent":["export type {RunnerReservationPromotionFailureReason} from './instance.js';\nexport {\n jobExecutionClaimedCount,\n jobExecutionEnqueuedCount,\n jobExecutionLeaseExpiredCount,\n providerRunnerAbsentTerminatedCount,\n providerRunnerCountDivergenceCount,\n providerRunnerReconcileCallCount,\n providerRunnerTerminateIntentHonoredCount,\n providerRunnerTerminateIntentIssuedCount,\n recordRunnerReservationPromotionFailure,\n recordRunnersRateLimitCheck,\n recordRunnersRateLimitPruneFailure,\n} from './instance.js';\nexport {registerRunnersServiceMetrics} from './service.js';\n"],"names":["jobExecutionClaimedCount","jobExecutionEnqueuedCount","jobExecutionLeaseExpiredCount","providerRunnerAbsentTerminatedCount","providerRunnerCountDivergenceCount","providerRunnerReconcileCallCount","providerRunnerTerminateIntentHonoredCount","providerRunnerTerminateIntentIssuedCount","recordRunnerReservationPromotionFailure","recordRunnersRateLimitCheck","recordRunnersRateLimitPruneFailure","registerRunnersServiceMetrics"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/metrics/index.ts"],"sourcesContent":["export type {\n RunnerActivationTokenNotIssuedReason,\n RunnerActivationTokenNotIssuedSurface,\n RunnerReservationCapacityFailureReason,\n RunnerReservationPromotionFailureReason,\n} from './instance.js';\nexport {\n jobExecutionClaimedCount,\n jobExecutionEnqueuedCount,\n jobExecutionLeaseExpiredCount,\n providerRunnerAbsentTerminatedCount,\n providerRunnerActivationOutcomeCount,\n providerRunnerCountDivergenceCount,\n providerRunnerReconcileCallCount,\n providerRunnerTerminateIntentHonoredCount,\n providerRunnerTerminateIntentIssuedCount,\n recordProviderRunnerActivationOutcome,\n recordRunnerActivationTokenNotIssued,\n recordRunnerReservationCapacityFailure,\n recordRunnerReservationPromotionFailure,\n recordRunnersRateLimitCheck,\n recordRunnersRateLimitPruneFailure,\n} from './instance.js';\nexport {registerRunnersServiceMetrics} from './service.js';\n"],"names":["jobExecutionClaimedCount","jobExecutionEnqueuedCount","jobExecutionLeaseExpiredCount","providerRunnerAbsentTerminatedCount","providerRunnerActivationOutcomeCount","providerRunnerCountDivergenceCount","providerRunnerReconcileCallCount","providerRunnerTerminateIntentHonoredCount","providerRunnerTerminateIntentIssuedCount","recordProviderRunnerActivationOutcome","recordRunnerActivationTokenNotIssued","recordRunnerReservationCapacityFailure","recordRunnerReservationPromotionFailure","recordRunnersRateLimitCheck","recordRunnersRateLimitPruneFailure","registerRunnersServiceMetrics"],"mappings":"AAMA,SACEA,wBAAwB,EACxBC,yBAAyB,EACzBC,6BAA6B,EAC7BC,mCAAmC,EACnCC,oCAAoC,EACpCC,kCAAkC,EAClCC,gCAAgC,EAChCC,yCAAyC,EACzCC,wCAAwC,EACxCC,qCAAqC,EACrCC,oCAAoC,EACpCC,sCAAsC,EACtCC,uCAAuC,EACvCC,2BAA2B,EAC3BC,kCAAkC,QAC7B,gBAAgB;AACvB,SAAQC,6BAA6B,QAAO,eAAe"}
|
|
@@ -9,6 +9,12 @@ export declare const providerRunnerReportCount: import("@shipfox/node-openteleme
|
|
|
9
9
|
export declare const runnerBootstrapExchangeCount: import("@shipfox/node-opentelemetry").Counter<{
|
|
10
10
|
outcome: 'accepted' | 'rejected';
|
|
11
11
|
}>;
|
|
12
|
+
export type RunnerActivationTokenNotIssuedReason = 'runner-not-found' | 'missing-workspace' | 'existing-session' | 'not-running';
|
|
13
|
+
export type RunnerActivationTokenNotIssuedSurface = 'enrollment' | 'poll';
|
|
14
|
+
export declare const runnerActivationTokenNotIssuedCount: import("@shipfox/node-opentelemetry").Counter<{
|
|
15
|
+
reason: RunnerActivationTokenNotIssuedReason;
|
|
16
|
+
surface: RunnerActivationTokenNotIssuedSurface;
|
|
17
|
+
}>;
|
|
12
18
|
export declare const runnerControlHeartbeatCount: import("@shipfox/node-opentelemetry").Counter<Record<string, never>>;
|
|
13
19
|
export declare const providerRunnerReapedCount: import("@shipfox/node-opentelemetry").Counter<Record<string, never>>;
|
|
14
20
|
export declare const providerRunnerCountDivergenceCount: import("@shipfox/node-opentelemetry").Counter<{
|
|
@@ -20,24 +26,40 @@ export declare const providerRunnerReconcileCallCount: import("@shipfox/node-ope
|
|
|
20
26
|
export declare const providerRunnerAbsentTerminatedCount: import("@shipfox/node-opentelemetry").Counter<Record<string, never>>;
|
|
21
27
|
export declare const providerRunnerTerminateIntentIssuedCount: import("@shipfox/node-opentelemetry").Counter<{
|
|
22
28
|
surface: 'poll-demand' | 'reconcile';
|
|
23
|
-
reason: 'job-cancelled' | 'terminal-state';
|
|
29
|
+
reason: 'activation-timeout' | 'job-cancelled' | 'terminal-state';
|
|
24
30
|
}>;
|
|
25
31
|
export declare const providerRunnerTerminateIntentHonoredCount: import("@shipfox/node-opentelemetry").Counter<{
|
|
26
|
-
reason: 'job-cancelled';
|
|
32
|
+
reason: 'activation-timeout' | 'job-cancelled';
|
|
33
|
+
}>;
|
|
34
|
+
export declare const providerRunnerActivationOutcomeCount: import("@shipfox/node-opentelemetry").Counter<{
|
|
35
|
+
outcome: 'reaped' | 'rebound';
|
|
27
36
|
}>;
|
|
28
37
|
export declare const reservationReleasedCount: import("@shipfox/node-opentelemetry").Counter<Record<string, never>>;
|
|
29
38
|
export type RunnerReservationPromotionFailureReason = 'reservation-expired' | 'reservation-not-found' | 'already-assigned' | 'not-assignable';
|
|
30
39
|
export declare const runnerReservationPromotionFailureCount: import("@shipfox/node-opentelemetry").Counter<{
|
|
31
40
|
reason: RunnerReservationPromotionFailureReason;
|
|
32
41
|
}>;
|
|
42
|
+
export type RunnerReservationCapacityFailureReason = 'reservation-not-found' | 'reservation-kind-mismatch' | 'reservation-expired' | 'capacity-exhausted';
|
|
43
|
+
export declare const runnerReservationCapacityFailureCount: import("@shipfox/node-opentelemetry").Counter<{
|
|
44
|
+
reason: RunnerReservationCapacityFailureReason;
|
|
45
|
+
}>;
|
|
33
46
|
export type RunnersRateLimitAction = 'provisioner-mint' | 'ephemeral-register';
|
|
34
47
|
export type RunnersRateLimitScope = 'provisioner' | 'ephemeral-token';
|
|
35
48
|
export type RunnersRateLimitOutcome = 'allowed' | 'blocked' | 'unavailable';
|
|
36
49
|
export declare function recordRunnerReservationPromotionFailure(reason: RunnerReservationPromotionFailureReason): void;
|
|
50
|
+
export declare function recordRunnerActivationTokenNotIssued(params: {
|
|
51
|
+
reason: RunnerActivationTokenNotIssuedReason;
|
|
52
|
+
surface: RunnerActivationTokenNotIssuedSurface;
|
|
53
|
+
}): void;
|
|
54
|
+
export declare function recordRunnerReservationCapacityFailure(reason: RunnerReservationCapacityFailureReason, count: number): void;
|
|
37
55
|
export declare function recordRunnersRateLimitCheck(params: {
|
|
38
56
|
action: RunnersRateLimitAction;
|
|
39
57
|
scope: RunnersRateLimitScope;
|
|
40
58
|
outcome: RunnersRateLimitOutcome;
|
|
41
59
|
}): void;
|
|
42
60
|
export declare function recordRunnersRateLimitPruneFailure(): void;
|
|
61
|
+
export declare function recordProviderRunnerActivationOutcome(params: {
|
|
62
|
+
outcome: 'reaped' | 'rebound';
|
|
63
|
+
count?: number;
|
|
64
|
+
}): void;
|
|
43
65
|
//# sourceMappingURL=instance.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/metrics/instance.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,yBAAyB,sEAKrC,CAAC;AAEF,eAAO,MAAM,wBAAwB;aAAiC,SAAS,GAAG,OAAO;EAGxF,CAAC;AAEF,eAAO,MAAM,6BAA6B,sEAGzC,CAAC;AAEF,eAAO,MAAM,yBAAyB;WAC7B,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY;EAGhF,CAAC;AAEH,eAAO,MAAM,4BAA4B;aAC9B,UAAU,GAAG,UAAU;EAGhC,CAAC;AAEH,eAAO,MAAM,2BAA2B,sEAGvC,CAAC;AAEF,eAAO,MAAM,yBAAyB,sEAKrC,CAAC;AAEF,eAAO,MAAM,kCAAkC;mBAC9B,MAAM;WACd,UAAU,GAAG,SAAS;eAClB,gBAAgB,GAAG,mBAAmB;EAIjD,CAAC;AAEH,eAAO,MAAM,gCAAgC,sEAG5C,CAAC;AAEF,eAAO,MAAM,mCAAmC,sEAM/C,CAAC;AAEF,eAAO,MAAM,wCAAwC;aAC1C,aAAa,GAAG,WAAW;YAC5B,eAAe,GAAG,gBAAgB;
|
|
1
|
+
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/metrics/instance.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,yBAAyB,sEAKrC,CAAC;AAEF,eAAO,MAAM,wBAAwB;aAAiC,SAAS,GAAG,OAAO;EAGxF,CAAC;AAEF,eAAO,MAAM,6BAA6B,sEAGzC,CAAC;AAEF,eAAO,MAAM,yBAAyB;WAC7B,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY;EAGhF,CAAC;AAEH,eAAO,MAAM,4BAA4B;aAC9B,UAAU,GAAG,UAAU;EAGhC,CAAC;AAEH,MAAM,MAAM,oCAAoC,GAC5C,kBAAkB,GAClB,mBAAmB,GACnB,kBAAkB,GAClB,aAAa,CAAC;AAElB,MAAM,MAAM,qCAAqC,GAAG,YAAY,GAAG,MAAM,CAAC;AAE1E,eAAO,MAAM,mCAAmC;YACtC,oCAAoC;aACnC,qCAAqC;EAG9C,CAAC;AAEH,eAAO,MAAM,2BAA2B,sEAGvC,CAAC;AAEF,eAAO,MAAM,yBAAyB,sEAKrC,CAAC;AAEF,eAAO,MAAM,kCAAkC;mBAC9B,MAAM;WACd,UAAU,GAAG,SAAS;eAClB,gBAAgB,GAAG,mBAAmB;EAIjD,CAAC;AAEH,eAAO,MAAM,gCAAgC,sEAG5C,CAAC;AAEF,eAAO,MAAM,mCAAmC,sEAM/C,CAAC;AAEF,eAAO,MAAM,wCAAwC;aAC1C,aAAa,GAAG,WAAW;YAC5B,oBAAoB,GAAG,eAAe,GAAG,gBAAgB;EAGjE,CAAC;AAEH,eAAO,MAAM,yCAAyC;YAC5C,oBAAoB,GAAG,eAAe;EAG9C,CAAC;AAEH,eAAO,MAAM,oCAAoC;aACtC,QAAQ,GAAG,SAAS;EAG7B,CAAC;AAEH,eAAO,MAAM,wBAAwB,sEAGpC,CAAC;AAEF,MAAM,MAAM,uCAAuC,GAC/C,qBAAqB,GACrB,uBAAuB,GACvB,kBAAkB,GAClB,gBAAgB,CAAC;AAErB,eAAO,MAAM,sCAAsC;YACzC,uCAAuC;EAG/C,CAAC;AAEH,MAAM,MAAM,sCAAsC,GAC9C,uBAAuB,GACvB,2BAA2B,GAC3B,qBAAqB,GACrB,oBAAoB,CAAC;AAEzB,eAAO,MAAM,qCAAqC;YACxC,sCAAsC;EAG9C,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,kBAAkB,GAAG,oBAAoB,CAAC;AAC/E,MAAM,MAAM,qBAAqB,GAAG,aAAa,GAAG,iBAAiB,CAAC;AACtE,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;AAsB5E,wBAAgB,uCAAuC,CACrD,MAAM,EAAE,uCAAuC,GAC9C,IAAI,CAEN;AAED,wBAAgB,oCAAoC,CAAC,MAAM,EAAE;IAC3D,MAAM,EAAE,oCAAoC,CAAC;IAC7C,OAAO,EAAE,qCAAqC,CAAC;CAChD,GAAG,IAAI,CAEP;AAED,wBAAgB,sCAAsC,CACpD,MAAM,EAAE,sCAAsC,EAC9C,KAAK,EAAE,MAAM,GACZ,IAAI,CAGN;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,MAAM,EAAE,sBAAsB,CAAC;IAC/B,KAAK,EAAE,qBAAqB,CAAC;IAC7B,OAAO,EAAE,uBAAuB,CAAC;CAClC,GAAG,IAAI,CAQP;AAED,wBAAgB,kCAAkC,IAAI,IAAI,CAEzD;AAED,wBAAgB,qCAAqC,CAAC,MAAM,EAAE;IAC5D,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,IAAI,CAIP"}
|
package/dist/metrics/instance.js
CHANGED
|
@@ -15,6 +15,9 @@ export const providerRunnerReportCount = meter.createCounter('runners_provider_r
|
|
|
15
15
|
export const runnerBootstrapExchangeCount = meter.createCounter('runners_runner_bootstrap_exchange', {
|
|
16
16
|
description: 'Runner bootstrap-token exchanges by outcome'
|
|
17
17
|
});
|
|
18
|
+
export const runnerActivationTokenNotIssuedCount = meter.createCounter('runners_runner_activation_token_not_issued', {
|
|
19
|
+
description: 'Runner activation token issuance skips by reason and surface'
|
|
20
|
+
});
|
|
18
21
|
export const runnerControlHeartbeatCount = meter.createCounter('runners_runner_control_heartbeat', {
|
|
19
22
|
description: 'Pre-workspace runner-control heartbeats accepted'
|
|
20
23
|
});
|
|
@@ -36,12 +39,18 @@ export const providerRunnerTerminateIntentIssuedCount = meter.createCounter('run
|
|
|
36
39
|
export const providerRunnerTerminateIntentHonoredCount = meter.createCounter('runners_provider_runner_terminate_intent_honored', {
|
|
37
40
|
description: 'Provisioned runner terminate intents honored by first transition to terminated'
|
|
38
41
|
});
|
|
42
|
+
export const providerRunnerActivationOutcomeCount = meter.createCounter('runners_provider_runner_activation_outcome', {
|
|
43
|
+
description: 'Demand-backed runner activation outcomes by recovery action'
|
|
44
|
+
});
|
|
39
45
|
export const reservationReleasedCount = meter.createCounter('runners_reservation_released', {
|
|
40
46
|
description: 'Reservation units released from terminal provisioned runner reports'
|
|
41
47
|
});
|
|
42
48
|
export const runnerReservationPromotionFailureCount = meter.createCounter('runners_reservation_promotion_failures', {
|
|
43
49
|
description: 'Runner reservation promotion failures during enrollment by reason'
|
|
44
50
|
});
|
|
51
|
+
export const runnerReservationCapacityFailureCount = meter.createCounter('runners_reservation_capacity_failures', {
|
|
52
|
+
description: 'Runner reservation admission shortfalls by reason'
|
|
53
|
+
});
|
|
45
54
|
const rateLimitCheckCount = meter.createCounter('runners_rate_limit_checks', {
|
|
46
55
|
description: 'Runners rate limit checks by action, scope, and outcome'
|
|
47
56
|
});
|
|
@@ -60,6 +69,15 @@ export function recordRunnerReservationPromotionFailure(reason) {
|
|
|
60
69
|
reason
|
|
61
70
|
}));
|
|
62
71
|
}
|
|
72
|
+
export function recordRunnerActivationTokenNotIssued(params) {
|
|
73
|
+
recordMetric(()=>runnerActivationTokenNotIssuedCount.add(1, params));
|
|
74
|
+
}
|
|
75
|
+
export function recordRunnerReservationCapacityFailure(reason, count) {
|
|
76
|
+
if (count <= 0) return;
|
|
77
|
+
recordMetric(()=>runnerReservationCapacityFailureCount.add(count, {
|
|
78
|
+
reason
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
63
81
|
export function recordRunnersRateLimitCheck(params) {
|
|
64
82
|
recordMetric(()=>rateLimitCheckCount.add(1, {
|
|
65
83
|
action: params.action,
|
|
@@ -70,5 +88,10 @@ export function recordRunnersRateLimitCheck(params) {
|
|
|
70
88
|
export function recordRunnersRateLimitPruneFailure() {
|
|
71
89
|
recordMetric(()=>rateLimitPruneFailureCount.add(1));
|
|
72
90
|
}
|
|
91
|
+
export function recordProviderRunnerActivationOutcome(params) {
|
|
92
|
+
recordMetric(()=>providerRunnerActivationOutcomeCount.add(params.count ?? 1, {
|
|
93
|
+
outcome: params.outcome
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
73
96
|
|
|
74
97
|
//# sourceMappingURL=instance.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/metrics/instance.ts"],"sourcesContent":["import {instanceMetrics} from '@shipfox/node-opentelemetry';\n\nconst meter = instanceMetrics.getMeter('runners');\n\nexport const jobExecutionEnqueuedCount = meter.createCounter<Record<string, never>>(\n 'runners_job_execution_enqueued',\n {\n description: 'Job executions added to the pending queue',\n },\n);\n\nexport const jobExecutionClaimedCount = meter.createCounter<{outcome: 'claimed' | 'empty'}>(\n 'runners_job_execution_claimed',\n {description: 'Job execution claim attempts by outcome'},\n);\n\nexport const jobExecutionLeaseExpiredCount = meter.createCounter<Record<string, never>>(\n 'runners_job_execution_lease_expired',\n {description: 'Job execution leases reaped after passing the heartbeat threshold'},\n);\n\nexport const providerRunnerReportCount = meter.createCounter<{\n state: 'starting' | 'running' | 'stopping' | 'stopped' | 'failed' | 'terminated';\n}>('runners_provider_runner_reported', {\n description: 'Provisioned runner lifecycle reports accepted by state',\n});\n\nexport const runnerBootstrapExchangeCount = meter.createCounter<{\n outcome: 'accepted' | 'rejected';\n}>('runners_runner_bootstrap_exchange', {\n description: 'Runner bootstrap-token exchanges by outcome',\n});\n\nexport const runnerControlHeartbeatCount = meter.createCounter<Record<string, never>>(\n 'runners_runner_control_heartbeat',\n {description: 'Pre-workspace runner-control heartbeats accepted'},\n);\n\nexport const providerRunnerReapedCount = meter.createCounter<Record<string, never>>(\n 'runners_provider_runner_reaped',\n {\n description: 'Stale provisioned runners marked failed by backend maintenance',\n },\n);\n\nexport const providerRunnerCountDivergenceCount = meter.createCounter<{\n template_key?: string;\n state: 'starting' | 'running';\n direction: 'backend-higher' | 'advertised-higher';\n}>('runners_provider_runner_count_divergence', {\n description:\n 'Absolute difference between provisioner-advertised and backend-observed provisioned runner counts',\n});\n\nexport const providerRunnerReconcileCallCount = meter.createCounter<Record<string, never>>(\n 'runners_provider_runner_reconcile_called',\n {description: 'Provisioned runner reconcile calls completed successfully'},\n);\n\nexport const providerRunnerAbsentTerminatedCount = meter.createCounter<Record<string, never>>(\n 'runners_provider_runner_absent_terminated',\n {\n description:\n 'Owned provisioned runners marked terminated because they were absent from reconcile',\n },\n);\n\nexport const providerRunnerTerminateIntentIssuedCount = meter.createCounter<{\n surface: 'poll-demand' | 'reconcile';\n reason: 'job-cancelled' | 'terminal-state';\n}>('runners_provider_runner_terminate_intent_issued', {\n description: 'Provisioned runner terminate intents returned to provisioners',\n});\n\nexport const providerRunnerTerminateIntentHonoredCount = meter.createCounter<{\n reason: 'job-cancelled';\n}>('runners_provider_runner_terminate_intent_honored', {\n description: 'Provisioned runner terminate intents honored by first transition to terminated',\n});\n\nexport const reservationReleasedCount = meter.createCounter<Record<string, never>>(\n 'runners_reservation_released',\n {description: 'Reservation units released from terminal provisioned runner reports'},\n);\n\nexport type RunnerReservationPromotionFailureReason =\n | 'reservation-expired'\n | 'reservation-not-found'\n | 'already-assigned'\n | 'not-assignable';\n\nexport const runnerReservationPromotionFailureCount = meter.createCounter<{\n reason: RunnerReservationPromotionFailureReason;\n}>('runners_reservation_promotion_failures', {\n description: 'Runner reservation promotion failures during enrollment by reason',\n});\n\nexport type RunnersRateLimitAction = 'provisioner-mint' | 'ephemeral-register';\nexport type RunnersRateLimitScope = 'provisioner' | 'ephemeral-token';\nexport type RunnersRateLimitOutcome = 'allowed' | 'blocked' | 'unavailable';\n\nconst rateLimitCheckCount = meter.createCounter<{\n action: RunnersRateLimitAction;\n scope: RunnersRateLimitScope;\n outcome: RunnersRateLimitOutcome;\n}>('runners_rate_limit_checks', {\n description: 'Runners rate limit checks by action, scope, and outcome',\n});\n\nconst rateLimitPruneFailureCount = meter.createCounter('runners_rate_limit_prune_failures', {\n description: 'Runners rate limit prune failures',\n});\n\nfunction recordMetric(record: () => void): void {\n try {\n record();\n } catch {\n // Metrics must not affect runner or provisioner request outcomes.\n }\n}\n\nexport function recordRunnerReservationPromotionFailure(\n reason: RunnerReservationPromotionFailureReason,\n): void {\n recordMetric(() => runnerReservationPromotionFailureCount.add(1, {reason}));\n}\n\nexport function recordRunnersRateLimitCheck(params: {\n action: RunnersRateLimitAction;\n scope: RunnersRateLimitScope;\n outcome: RunnersRateLimitOutcome;\n}): void {\n recordMetric(() =>\n rateLimitCheckCount.add(1, {\n action: params.action,\n scope: params.scope,\n outcome: params.outcome,\n }),\n );\n}\n\nexport function recordRunnersRateLimitPruneFailure(): void {\n recordMetric(() => rateLimitPruneFailureCount.add(1));\n}\n"],"names":["instanceMetrics","meter","getMeter","jobExecutionEnqueuedCount","createCounter","description","jobExecutionClaimedCount","jobExecutionLeaseExpiredCount","providerRunnerReportCount","runnerBootstrapExchangeCount","runnerControlHeartbeatCount","providerRunnerReapedCount","providerRunnerCountDivergenceCount","providerRunnerReconcileCallCount","providerRunnerAbsentTerminatedCount","providerRunnerTerminateIntentIssuedCount","providerRunnerTerminateIntentHonoredCount","reservationReleasedCount","runnerReservationPromotionFailureCount","rateLimitCheckCount","rateLimitPruneFailureCount","recordMetric","record","recordRunnerReservationPromotionFailure","reason","add","recordRunnersRateLimitCheck","params","action","scope","outcome","recordRunnersRateLimitPruneFailure"],"mappings":"AAAA,SAAQA,eAAe,QAAO,8BAA8B;AAE5D,MAAMC,QAAQD,gBAAgBE,QAAQ,CAAC;AAEvC,OAAO,MAAMC,4BAA4BF,MAAMG,aAAa,CAC1D,kCACA;IACEC,aAAa;AACf,GACA;AAEF,OAAO,MAAMC,2BAA2BL,MAAMG,aAAa,CACzD,iCACA;IAACC,aAAa;AAAyC,GACvD;AAEF,OAAO,MAAME,gCAAgCN,MAAMG,aAAa,CAC9D,uCACA;IAACC,aAAa;AAAmE,GACjF;AAEF,OAAO,MAAMG,4BAA4BP,MAAMG,aAAa,CAEzD,oCAAoC;IACrCC,aAAa;AACf,GAAG;AAEH,OAAO,MAAMI,+BAA+BR,MAAMG,aAAa,CAE5D,qCAAqC;IACtCC,aAAa;AACf,GAAG;AAEH,OAAO,MAAMK,8BAA8BT,MAAMG,aAAa,CAC5D,oCACA;IAACC,aAAa;AAAkD,GAChE;AAEF,OAAO,MAAMM,4BAA4BV,MAAMG,aAAa,CAC1D,kCACA;IACEC,aAAa;AACf,GACA;AAEF,OAAO,MAAMO,qCAAqCX,MAAMG,aAAa,CAIlE,4CAA4C;IAC7CC,aACE;AACJ,GAAG;AAEH,OAAO,MAAMQ,mCAAmCZ,MAAMG,aAAa,CACjE,4CACA;IAACC,aAAa;AAA2D,GACzE;AAEF,OAAO,MAAMS,sCAAsCb,MAAMG,aAAa,CACpE,6CACA;IACEC,aACE;AACJ,GACA;AAEF,OAAO,MAAMU,2CAA2Cd,MAAMG,aAAa,CAGxE,mDAAmD;IACpDC,aAAa;AACf,GAAG;AAEH,OAAO,MAAMW,4CAA4Cf,MAAMG,aAAa,CAEzE,oDAAoD;IACrDC,aAAa;AACf,GAAG;AAEH,OAAO,MAAMY,2BAA2BhB,MAAMG,aAAa,CACzD,gCACA;IAACC,aAAa;AAAqE,GACnF;AAQF,OAAO,MAAMa,yCAAyCjB,MAAMG,aAAa,CAEtE,0CAA0C;IAC3CC,aAAa;AACf,GAAG;AAMH,MAAMc,sBAAsBlB,MAAMG,aAAa,CAI5C,6BAA6B;IAC9BC,aAAa;AACf;AAEA,MAAMe,6BAA6BnB,MAAMG,aAAa,CAAC,qCAAqC;IAC1FC,aAAa;AACf;AAEA,SAASgB,aAAaC,MAAkB;IACtC,IAAI;QACFA;IACF,EAAE,OAAM;IACN,kEAAkE;IACpE;AACF;AAEA,OAAO,SAASC,wCACdC,MAA+C;IAE/CH,aAAa,IAAMH,uCAAuCO,GAAG,CAAC,GAAG;YAACD;QAAM;AAC1E;AAEA,OAAO,SAASE,4BAA4BC,MAI3C;IACCN,aAAa,IACXF,oBAAoBM,GAAG,CAAC,GAAG;YACzBG,QAAQD,OAAOC,MAAM;YACrBC,OAAOF,OAAOE,KAAK;YACnBC,SAASH,OAAOG,OAAO;QACzB;AAEJ;AAEA,OAAO,SAASC;IACdV,aAAa,IAAMD,2BAA2BK,GAAG,CAAC;AACpD"}
|
|
1
|
+
{"version":3,"sources":["../../src/metrics/instance.ts"],"sourcesContent":["import {instanceMetrics} from '@shipfox/node-opentelemetry';\n\nconst meter = instanceMetrics.getMeter('runners');\n\nexport const jobExecutionEnqueuedCount = meter.createCounter<Record<string, never>>(\n 'runners_job_execution_enqueued',\n {\n description: 'Job executions added to the pending queue',\n },\n);\n\nexport const jobExecutionClaimedCount = meter.createCounter<{outcome: 'claimed' | 'empty'}>(\n 'runners_job_execution_claimed',\n {description: 'Job execution claim attempts by outcome'},\n);\n\nexport const jobExecutionLeaseExpiredCount = meter.createCounter<Record<string, never>>(\n 'runners_job_execution_lease_expired',\n {description: 'Job execution leases reaped after passing the heartbeat threshold'},\n);\n\nexport const providerRunnerReportCount = meter.createCounter<{\n state: 'starting' | 'running' | 'stopping' | 'stopped' | 'failed' | 'terminated';\n}>('runners_provider_runner_reported', {\n description: 'Provisioned runner lifecycle reports accepted by state',\n});\n\nexport const runnerBootstrapExchangeCount = meter.createCounter<{\n outcome: 'accepted' | 'rejected';\n}>('runners_runner_bootstrap_exchange', {\n description: 'Runner bootstrap-token exchanges by outcome',\n});\n\nexport type RunnerActivationTokenNotIssuedReason =\n | 'runner-not-found'\n | 'missing-workspace'\n | 'existing-session'\n | 'not-running';\n\nexport type RunnerActivationTokenNotIssuedSurface = 'enrollment' | 'poll';\n\nexport const runnerActivationTokenNotIssuedCount = meter.createCounter<{\n reason: RunnerActivationTokenNotIssuedReason;\n surface: RunnerActivationTokenNotIssuedSurface;\n}>('runners_runner_activation_token_not_issued', {\n description: 'Runner activation token issuance skips by reason and surface',\n});\n\nexport const runnerControlHeartbeatCount = meter.createCounter<Record<string, never>>(\n 'runners_runner_control_heartbeat',\n {description: 'Pre-workspace runner-control heartbeats accepted'},\n);\n\nexport const providerRunnerReapedCount = meter.createCounter<Record<string, never>>(\n 'runners_provider_runner_reaped',\n {\n description: 'Stale provisioned runners marked failed by backend maintenance',\n },\n);\n\nexport const providerRunnerCountDivergenceCount = meter.createCounter<{\n template_key?: string;\n state: 'starting' | 'running';\n direction: 'backend-higher' | 'advertised-higher';\n}>('runners_provider_runner_count_divergence', {\n description:\n 'Absolute difference between provisioner-advertised and backend-observed provisioned runner counts',\n});\n\nexport const providerRunnerReconcileCallCount = meter.createCounter<Record<string, never>>(\n 'runners_provider_runner_reconcile_called',\n {description: 'Provisioned runner reconcile calls completed successfully'},\n);\n\nexport const providerRunnerAbsentTerminatedCount = meter.createCounter<Record<string, never>>(\n 'runners_provider_runner_absent_terminated',\n {\n description:\n 'Owned provisioned runners marked terminated because they were absent from reconcile',\n },\n);\n\nexport const providerRunnerTerminateIntentIssuedCount = meter.createCounter<{\n surface: 'poll-demand' | 'reconcile';\n reason: 'activation-timeout' | 'job-cancelled' | 'terminal-state';\n}>('runners_provider_runner_terminate_intent_issued', {\n description: 'Provisioned runner terminate intents returned to provisioners',\n});\n\nexport const providerRunnerTerminateIntentHonoredCount = meter.createCounter<{\n reason: 'activation-timeout' | 'job-cancelled';\n}>('runners_provider_runner_terminate_intent_honored', {\n description: 'Provisioned runner terminate intents honored by first transition to terminated',\n});\n\nexport const providerRunnerActivationOutcomeCount = meter.createCounter<{\n outcome: 'reaped' | 'rebound';\n}>('runners_provider_runner_activation_outcome', {\n description: 'Demand-backed runner activation outcomes by recovery action',\n});\n\nexport const reservationReleasedCount = meter.createCounter<Record<string, never>>(\n 'runners_reservation_released',\n {description: 'Reservation units released from terminal provisioned runner reports'},\n);\n\nexport type RunnerReservationPromotionFailureReason =\n | 'reservation-expired'\n | 'reservation-not-found'\n | 'already-assigned'\n | 'not-assignable';\n\nexport const runnerReservationPromotionFailureCount = meter.createCounter<{\n reason: RunnerReservationPromotionFailureReason;\n}>('runners_reservation_promotion_failures', {\n description: 'Runner reservation promotion failures during enrollment by reason',\n});\n\nexport type RunnerReservationCapacityFailureReason =\n | 'reservation-not-found'\n | 'reservation-kind-mismatch'\n | 'reservation-expired'\n | 'capacity-exhausted';\n\nexport const runnerReservationCapacityFailureCount = meter.createCounter<{\n reason: RunnerReservationCapacityFailureReason;\n}>('runners_reservation_capacity_failures', {\n description: 'Runner reservation admission shortfalls by reason',\n});\n\nexport type RunnersRateLimitAction = 'provisioner-mint' | 'ephemeral-register';\nexport type RunnersRateLimitScope = 'provisioner' | 'ephemeral-token';\nexport type RunnersRateLimitOutcome = 'allowed' | 'blocked' | 'unavailable';\n\nconst rateLimitCheckCount = meter.createCounter<{\n action: RunnersRateLimitAction;\n scope: RunnersRateLimitScope;\n outcome: RunnersRateLimitOutcome;\n}>('runners_rate_limit_checks', {\n description: 'Runners rate limit checks by action, scope, and outcome',\n});\n\nconst rateLimitPruneFailureCount = meter.createCounter('runners_rate_limit_prune_failures', {\n description: 'Runners rate limit prune failures',\n});\n\nfunction recordMetric(record: () => void): void {\n try {\n record();\n } catch {\n // Metrics must not affect runner or provisioner request outcomes.\n }\n}\n\nexport function recordRunnerReservationPromotionFailure(\n reason: RunnerReservationPromotionFailureReason,\n): void {\n recordMetric(() => runnerReservationPromotionFailureCount.add(1, {reason}));\n}\n\nexport function recordRunnerActivationTokenNotIssued(params: {\n reason: RunnerActivationTokenNotIssuedReason;\n surface: RunnerActivationTokenNotIssuedSurface;\n}): void {\n recordMetric(() => runnerActivationTokenNotIssuedCount.add(1, params));\n}\n\nexport function recordRunnerReservationCapacityFailure(\n reason: RunnerReservationCapacityFailureReason,\n count: number,\n): void {\n if (count <= 0) return;\n recordMetric(() => runnerReservationCapacityFailureCount.add(count, {reason}));\n}\n\nexport function recordRunnersRateLimitCheck(params: {\n action: RunnersRateLimitAction;\n scope: RunnersRateLimitScope;\n outcome: RunnersRateLimitOutcome;\n}): void {\n recordMetric(() =>\n rateLimitCheckCount.add(1, {\n action: params.action,\n scope: params.scope,\n outcome: params.outcome,\n }),\n );\n}\n\nexport function recordRunnersRateLimitPruneFailure(): void {\n recordMetric(() => rateLimitPruneFailureCount.add(1));\n}\n\nexport function recordProviderRunnerActivationOutcome(params: {\n outcome: 'reaped' | 'rebound';\n count?: number;\n}): void {\n recordMetric(() =>\n providerRunnerActivationOutcomeCount.add(params.count ?? 1, {outcome: params.outcome}),\n );\n}\n"],"names":["instanceMetrics","meter","getMeter","jobExecutionEnqueuedCount","createCounter","description","jobExecutionClaimedCount","jobExecutionLeaseExpiredCount","providerRunnerReportCount","runnerBootstrapExchangeCount","runnerActivationTokenNotIssuedCount","runnerControlHeartbeatCount","providerRunnerReapedCount","providerRunnerCountDivergenceCount","providerRunnerReconcileCallCount","providerRunnerAbsentTerminatedCount","providerRunnerTerminateIntentIssuedCount","providerRunnerTerminateIntentHonoredCount","providerRunnerActivationOutcomeCount","reservationReleasedCount","runnerReservationPromotionFailureCount","runnerReservationCapacityFailureCount","rateLimitCheckCount","rateLimitPruneFailureCount","recordMetric","record","recordRunnerReservationPromotionFailure","reason","add","recordRunnerActivationTokenNotIssued","params","recordRunnerReservationCapacityFailure","count","recordRunnersRateLimitCheck","action","scope","outcome","recordRunnersRateLimitPruneFailure","recordProviderRunnerActivationOutcome"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poll-demand.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/poll-demand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAEtD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,qBAAqB,
|
|
1
|
+
{"version":3,"file":"poll-demand.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/poll-demand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,iBAAiB,CAAC;AAEtD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,qBAAqB,CAqBvF"}
|
|
@@ -18,6 +18,9 @@ export function toPollDemandResponseDto(result) {
|
|
|
18
18
|
count: reservation.count,
|
|
19
19
|
expires_at: reservation.expiresAt.toISOString()
|
|
20
20
|
})),
|
|
21
|
+
...result.newlyReservedCount !== undefined ? {
|
|
22
|
+
newly_reserved_count: result.newlyReservedCount
|
|
23
|
+
} : {},
|
|
21
24
|
terminate_provider_runner_ids: result.terminateRunnerInstanceIds
|
|
22
25
|
};
|
|
23
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/presentation/dto/poll-demand.ts"],"sourcesContent":["import type {PollDemandResponseDto} from '@shipfox/api-runners-dto';\nimport type {PollDemandResult} from '#core/demand.js';\n\nexport function toPollDemandResponseDto(result: PollDemandResult): PollDemandResponseDto {\n return {\n stats: result.stats.map((stat) => ({\n ...(stat.workspaceId ? {workspace_id: stat.workspaceId} : {}),\n labels: stat.labels,\n queued: stat.queued,\n reserved: stat.reserved,\n oldest_queued_at: stat.oldestQueuedAt.toISOString(),\n })),\n reservations: result.reservations.map((reservation) => ({\n reservation_id: reservation.reservationId,\n ...(reservation.workspaceId ? {workspace_id: reservation.workspaceId} : {}),\n labels: reservation.labels,\n count: reservation.count,\n expires_at: reservation.expiresAt.toISOString(),\n })),\n terminate_provider_runner_ids: result.terminateRunnerInstanceIds,\n };\n}\n"],"names":["toPollDemandResponseDto","result","stats","map","stat","workspaceId","workspace_id","labels","queued","reserved","oldest_queued_at","oldestQueuedAt","toISOString","reservations","reservation","reservation_id","reservationId","count","expires_at","expiresAt","terminate_provider_runner_ids","terminateRunnerInstanceIds"],"mappings":"AAGA,OAAO,SAASA,wBAAwBC,MAAwB;IAC9D,OAAO;QACLC,OAAOD,OAAOC,KAAK,CAACC,GAAG,CAAC,CAACC,OAAU,CAAA;gBACjC,GAAIA,KAAKC,WAAW,GAAG;oBAACC,cAAcF,KAAKC,WAAW;gBAAA,IAAI,CAAC,CAAC;gBAC5DE,QAAQH,KAAKG,MAAM;gBACnBC,QAAQJ,KAAKI,MAAM;gBACnBC,UAAUL,KAAKK,QAAQ;gBACvBC,kBAAkBN,KAAKO,cAAc,CAACC,WAAW;YACnD,CAAA;QACAC,cAAcZ,OAAOY,YAAY,CAACV,GAAG,CAAC,CAACW,cAAiB,CAAA;gBACtDC,gBAAgBD,YAAYE,aAAa;gBACzC,GAAIF,YAAYT,WAAW,GAAG;oBAACC,cAAcQ,YAAYT,WAAW;gBAAA,IAAI,CAAC,CAAC;gBAC1EE,QAAQO,YAAYP,MAAM;gBAC1BU,OAAOH,YAAYG,KAAK;gBACxBC,YAAYJ,YAAYK,SAAS,CAACP,WAAW;YAC/C,CAAA;
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/dto/poll-demand.ts"],"sourcesContent":["import type {PollDemandResponseDto} from '@shipfox/api-runners-dto';\nimport type {PollDemandResult} from '#core/demand.js';\n\nexport function toPollDemandResponseDto(result: PollDemandResult): PollDemandResponseDto {\n return {\n stats: result.stats.map((stat) => ({\n ...(stat.workspaceId ? {workspace_id: stat.workspaceId} : {}),\n labels: stat.labels,\n queued: stat.queued,\n reserved: stat.reserved,\n oldest_queued_at: stat.oldestQueuedAt.toISOString(),\n })),\n reservations: result.reservations.map((reservation) => ({\n reservation_id: reservation.reservationId,\n ...(reservation.workspaceId ? {workspace_id: reservation.workspaceId} : {}),\n labels: reservation.labels,\n count: reservation.count,\n expires_at: reservation.expiresAt.toISOString(),\n })),\n ...(result.newlyReservedCount !== undefined\n ? {newly_reserved_count: result.newlyReservedCount}\n : {}),\n terminate_provider_runner_ids: result.terminateRunnerInstanceIds,\n };\n}\n"],"names":["toPollDemandResponseDto","result","stats","map","stat","workspaceId","workspace_id","labels","queued","reserved","oldest_queued_at","oldestQueuedAt","toISOString","reservations","reservation","reservation_id","reservationId","count","expires_at","expiresAt","newlyReservedCount","undefined","newly_reserved_count","terminate_provider_runner_ids","terminateRunnerInstanceIds"],"mappings":"AAGA,OAAO,SAASA,wBAAwBC,MAAwB;IAC9D,OAAO;QACLC,OAAOD,OAAOC,KAAK,CAACC,GAAG,CAAC,CAACC,OAAU,CAAA;gBACjC,GAAIA,KAAKC,WAAW,GAAG;oBAACC,cAAcF,KAAKC,WAAW;gBAAA,IAAI,CAAC,CAAC;gBAC5DE,QAAQH,KAAKG,MAAM;gBACnBC,QAAQJ,KAAKI,MAAM;gBACnBC,UAAUL,KAAKK,QAAQ;gBACvBC,kBAAkBN,KAAKO,cAAc,CAACC,WAAW;YACnD,CAAA;QACAC,cAAcZ,OAAOY,YAAY,CAACV,GAAG,CAAC,CAACW,cAAiB,CAAA;gBACtDC,gBAAgBD,YAAYE,aAAa;gBACzC,GAAIF,YAAYT,WAAW,GAAG;oBAACC,cAAcQ,YAAYT,WAAW;gBAAA,IAAI,CAAC,CAAC;gBAC1EE,QAAQO,YAAYP,MAAM;gBAC1BU,OAAOH,YAAYG,KAAK;gBACxBC,YAAYJ,YAAYK,SAAS,CAACP,WAAW;YAC/C,CAAA;QACA,GAAIX,OAAOmB,kBAAkB,KAAKC,YAC9B;YAACC,sBAAsBrB,OAAOmB,kBAAkB;QAAA,IAChD,CAAC,CAAC;QACNG,+BAA+BtB,OAAOuB,0BAA0B;IAClE;AACF"}
|
|
@@ -3,10 +3,13 @@ export declare function toReportRunnerInstancesResponseDto(result: ReportRunnerI
|
|
|
3
3
|
accepted: number;
|
|
4
4
|
reservations_released: number;
|
|
5
5
|
};
|
|
6
|
-
export declare function toReconcileRunnerInstancesResponseDto(result: ReconcileRunnerInstancesResult
|
|
6
|
+
export declare function toReconcileRunnerInstancesResponseDto(result: ReconcileRunnerInstancesResult, options: {
|
|
7
|
+
includeIntendedReservationId: boolean;
|
|
8
|
+
}): {
|
|
7
9
|
runners: Array<{
|
|
8
10
|
provider_runner_id: string;
|
|
9
11
|
state: ReconcileRunnerInstancesResult['runners'][number]['state'];
|
|
12
|
+
intended_reservation_id?: string | null;
|
|
10
13
|
reservation_id: string | null;
|
|
11
14
|
runner_session_id: string | null;
|
|
12
15
|
bound_job: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner-instances.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/runner-instances.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,8BAA8B,EAC9B,2BAA2B,EAC5B,MAAM,2BAA2B,CAAC;AAEnC,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,2BAA2B,GAAG;IACvF,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAKA;AAED,wBAAgB,qCAAqC,
|
|
1
|
+
{"version":3,"file":"runner-instances.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/runner-instances.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,8BAA8B,EAC9B,2BAA2B,EAC5B,MAAM,2BAA2B,CAAC;AAEnC,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,2BAA2B,GAAG;IACvF,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAKA;AAED,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,8BAA8B,EACtC,OAAO,EAAE;IAAC,4BAA4B,EAAE,OAAO,CAAA;CAAC,GAC/C;IACD,OAAO,EAAE,KAAK,CAAC;QACb,kBAAkB,EAAE,MAAM,CAAC;QAC3B,KAAK,EAAE,8BAA8B,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;QAClE,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACxC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,SAAS,EAAE;YACT,MAAM,EAAE,MAAM,CAAC;YACf,uBAAuB,EAAE,MAAM,CAAC;YAChC,iBAAiB,EAAE,MAAM,CAAC;YAC1B,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;SAC1C,GAAG,IAAI,CAAC;QACT,cAAc,EAAE,8BAA8B,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;KACpF,CAAC,CAAC;IACH,qCAAqC,EAAE,MAAM,EAAE,CAAC;CACjD,CAuBA;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG;IACnE,OAAO,EAAE,KAAK,CAAC;QACb,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;QACvC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;KAClC,CAAC,CAAC;CACJ,CAiBA"}
|
|
@@ -4,11 +4,14 @@ export function toReportRunnerInstancesResponseDto(result) {
|
|
|
4
4
|
reservations_released: result.reservationsReleased
|
|
5
5
|
};
|
|
6
6
|
}
|
|
7
|
-
export function toReconcileRunnerInstancesResponseDto(result) {
|
|
7
|
+
export function toReconcileRunnerInstancesResponseDto(result, options) {
|
|
8
8
|
return {
|
|
9
9
|
runners: result.runners.map((runner)=>({
|
|
10
10
|
provider_runner_id: runner.providerRunnerId,
|
|
11
11
|
state: runner.state,
|
|
12
|
+
...options.includeIntendedReservationId ? {
|
|
13
|
+
intended_reservation_id: runner.intendedReservationId
|
|
14
|
+
} : {},
|
|
12
15
|
reservation_id: runner.reservationId,
|
|
13
16
|
runner_session_id: runner.runnerSessionId,
|
|
14
17
|
bound_job: runner.boundJobExecution ? {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/presentation/dto/runner-instances.ts"],"sourcesContent":["import type {\n ActiveRunner,\n ReconcileRunnerInstancesResult,\n ReportRunnerInstancesResult,\n} from '#core/runner-instances.js';\n\nexport function toReportRunnerInstancesResponseDto(result: ReportRunnerInstancesResult): {\n accepted: number;\n reservations_released: number;\n} {\n return {\n accepted: result.accepted,\n reservations_released: result.reservationsReleased,\n };\n}\n\nexport function toReconcileRunnerInstancesResponseDto(result: ReconcileRunnerInstancesResult): {\n runners: Array<{\n provider_runner_id: string;\n state: ReconcileRunnerInstancesResult['runners'][number]['state'];\n reservation_id: string | null;\n runner_session_id: string | null;\n bound_job: {\n job_id: string;\n workflow_run_attempt_id: string;\n last_heartbeat_at: string;\n cancellation_requested_at: string | null;\n } | null;\n desired_intent: ReconcileRunnerInstancesResult['runners'][number]['desiredIntent'];\n }>;\n terminated_absent_provider_runner_ids: string[];\n} {\n return {\n runners: result.runners.map((runner) => ({\n provider_runner_id: runner.providerRunnerId,\n state: runner.state,\n reservation_id: runner.reservationId,\n runner_session_id: runner.runnerSessionId,\n bound_job: runner.boundJobExecution\n ? {\n job_id: runner.boundJobExecution.jobId,\n workflow_run_attempt_id: runner.boundJobExecution.workflowRunAttemptId,\n last_heartbeat_at: runner.boundJobExecution.lastHeartbeatAt.toISOString(),\n cancellation_requested_at:\n runner.boundJobExecution.cancellationRequestedAt?.toISOString() ?? null,\n }\n : null,\n desired_intent: runner.desiredIntent,\n })),\n terminated_absent_provider_runner_ids: result.terminatedAbsentRunnerInstanceIds,\n };\n}\n\nexport function toActiveRunnersResponseDto(runners: ActiveRunner[]): {\n runners: Array<{\n runner_session_id: string | null;\n provider_runner_id: string | null;\n provisioner_id: string | null;\n state: ActiveRunner['state'];\n labels: string[];\n template_key: string | null;\n provider_kind: string | null;\n job_id: string | null;\n workflow_run_attempt_id: string | null;\n project_id: string | null;\n reported_at: string | null;\n last_heartbeat_at: string | null;\n }>;\n} {\n return {\n runners: runners.map((runner) => ({\n runner_session_id: runner.runnerSessionId,\n provider_runner_id: runner.providerRunnerId,\n provisioner_id: runner.provisionerId,\n state: runner.state,\n labels: runner.labels,\n template_key: runner.templateKey,\n provider_kind: runner.providerKind,\n job_id: runner.jobId,\n workflow_run_attempt_id: runner.workflowRunAttemptId,\n project_id: runner.projectId,\n reported_at: runner.reportedAt?.toISOString() ?? null,\n last_heartbeat_at: runner.lastHeartbeatAt?.toISOString() ?? null,\n })),\n };\n}\n"],"names":["toReportRunnerInstancesResponseDto","result","accepted","reservations_released","reservationsReleased","toReconcileRunnerInstancesResponseDto","runners","map","runner","provider_runner_id","providerRunnerId","state","reservation_id","reservationId","runner_session_id","runnerSessionId","bound_job","boundJobExecution","job_id","jobId","workflow_run_attempt_id","workflowRunAttemptId","last_heartbeat_at","lastHeartbeatAt","toISOString","cancellation_requested_at","cancellationRequestedAt","desired_intent","desiredIntent","terminated_absent_provider_runner_ids","terminatedAbsentRunnerInstanceIds","toActiveRunnersResponseDto","provisioner_id","provisionerId","labels","template_key","templateKey","provider_kind","providerKind","project_id","projectId","reported_at","reportedAt"],"mappings":"AAMA,OAAO,SAASA,mCAAmCC,MAAmC;IAIpF,OAAO;QACLC,UAAUD,OAAOC,QAAQ;QACzBC,uBAAuBF,OAAOG,oBAAoB;IACpD;AACF;AAEA,OAAO,SAASC,
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/dto/runner-instances.ts"],"sourcesContent":["import type {\n ActiveRunner,\n ReconcileRunnerInstancesResult,\n ReportRunnerInstancesResult,\n} from '#core/runner-instances.js';\n\nexport function toReportRunnerInstancesResponseDto(result: ReportRunnerInstancesResult): {\n accepted: number;\n reservations_released: number;\n} {\n return {\n accepted: result.accepted,\n reservations_released: result.reservationsReleased,\n };\n}\n\nexport function toReconcileRunnerInstancesResponseDto(\n result: ReconcileRunnerInstancesResult,\n options: {includeIntendedReservationId: boolean},\n): {\n runners: Array<{\n provider_runner_id: string;\n state: ReconcileRunnerInstancesResult['runners'][number]['state'];\n intended_reservation_id?: string | null;\n reservation_id: string | null;\n runner_session_id: string | null;\n bound_job: {\n job_id: string;\n workflow_run_attempt_id: string;\n last_heartbeat_at: string;\n cancellation_requested_at: string | null;\n } | null;\n desired_intent: ReconcileRunnerInstancesResult['runners'][number]['desiredIntent'];\n }>;\n terminated_absent_provider_runner_ids: string[];\n} {\n return {\n runners: result.runners.map((runner) => ({\n provider_runner_id: runner.providerRunnerId,\n state: runner.state,\n ...(options.includeIntendedReservationId\n ? {intended_reservation_id: runner.intendedReservationId}\n : {}),\n reservation_id: runner.reservationId,\n runner_session_id: runner.runnerSessionId,\n bound_job: runner.boundJobExecution\n ? {\n job_id: runner.boundJobExecution.jobId,\n workflow_run_attempt_id: runner.boundJobExecution.workflowRunAttemptId,\n last_heartbeat_at: runner.boundJobExecution.lastHeartbeatAt.toISOString(),\n cancellation_requested_at:\n runner.boundJobExecution.cancellationRequestedAt?.toISOString() ?? null,\n }\n : null,\n desired_intent: runner.desiredIntent,\n })),\n terminated_absent_provider_runner_ids: result.terminatedAbsentRunnerInstanceIds,\n };\n}\n\nexport function toActiveRunnersResponseDto(runners: ActiveRunner[]): {\n runners: Array<{\n runner_session_id: string | null;\n provider_runner_id: string | null;\n provisioner_id: string | null;\n state: ActiveRunner['state'];\n labels: string[];\n template_key: string | null;\n provider_kind: string | null;\n job_id: string | null;\n workflow_run_attempt_id: string | null;\n project_id: string | null;\n reported_at: string | null;\n last_heartbeat_at: string | null;\n }>;\n} {\n return {\n runners: runners.map((runner) => ({\n runner_session_id: runner.runnerSessionId,\n provider_runner_id: runner.providerRunnerId,\n provisioner_id: runner.provisionerId,\n state: runner.state,\n labels: runner.labels,\n template_key: runner.templateKey,\n provider_kind: runner.providerKind,\n job_id: runner.jobId,\n workflow_run_attempt_id: runner.workflowRunAttemptId,\n project_id: runner.projectId,\n reported_at: runner.reportedAt?.toISOString() ?? null,\n last_heartbeat_at: runner.lastHeartbeatAt?.toISOString() ?? null,\n })),\n };\n}\n"],"names":["toReportRunnerInstancesResponseDto","result","accepted","reservations_released","reservationsReleased","toReconcileRunnerInstancesResponseDto","options","runners","map","runner","provider_runner_id","providerRunnerId","state","includeIntendedReservationId","intended_reservation_id","intendedReservationId","reservation_id","reservationId","runner_session_id","runnerSessionId","bound_job","boundJobExecution","job_id","jobId","workflow_run_attempt_id","workflowRunAttemptId","last_heartbeat_at","lastHeartbeatAt","toISOString","cancellation_requested_at","cancellationRequestedAt","desired_intent","desiredIntent","terminated_absent_provider_runner_ids","terminatedAbsentRunnerInstanceIds","toActiveRunnersResponseDto","provisioner_id","provisionerId","labels","template_key","templateKey","provider_kind","providerKind","project_id","projectId","reported_at","reportedAt"],"mappings":"AAMA,OAAO,SAASA,mCAAmCC,MAAmC;IAIpF,OAAO;QACLC,UAAUD,OAAOC,QAAQ;QACzBC,uBAAuBF,OAAOG,oBAAoB;IACpD;AACF;AAEA,OAAO,SAASC,sCACdJ,MAAsC,EACtCK,OAAgD;IAkBhD,OAAO;QACLC,SAASN,OAAOM,OAAO,CAACC,GAAG,CAAC,CAACC,SAAY,CAAA;gBACvCC,oBAAoBD,OAAOE,gBAAgB;gBAC3CC,OAAOH,OAAOG,KAAK;gBACnB,GAAIN,QAAQO,4BAA4B,GACpC;oBAACC,yBAAyBL,OAAOM,qBAAqB;gBAAA,IACtD,CAAC,CAAC;gBACNC,gBAAgBP,OAAOQ,aAAa;gBACpCC,mBAAmBT,OAAOU,eAAe;gBACzCC,WAAWX,OAAOY,iBAAiB,GAC/B;oBACEC,QAAQb,OAAOY,iBAAiB,CAACE,KAAK;oBACtCC,yBAAyBf,OAAOY,iBAAiB,CAACI,oBAAoB;oBACtEC,mBAAmBjB,OAAOY,iBAAiB,CAACM,eAAe,CAACC,WAAW;oBACvEC,2BACEpB,OAAOY,iBAAiB,CAACS,uBAAuB,EAAEF,iBAAiB;gBACvE,IACA;gBACJG,gBAAgBtB,OAAOuB,aAAa;YACtC,CAAA;QACAC,uCAAuChC,OAAOiC,iCAAiC;IACjF;AACF;AAEA,OAAO,SAASC,2BAA2B5B,OAAuB;IAgBhE,OAAO;QACLA,SAASA,QAAQC,GAAG,CAAC,CAACC,SAAY,CAAA;gBAChCS,mBAAmBT,OAAOU,eAAe;gBACzCT,oBAAoBD,OAAOE,gBAAgB;gBAC3CyB,gBAAgB3B,OAAO4B,aAAa;gBACpCzB,OAAOH,OAAOG,KAAK;gBACnB0B,QAAQ7B,OAAO6B,MAAM;gBACrBC,cAAc9B,OAAO+B,WAAW;gBAChCC,eAAehC,OAAOiC,YAAY;gBAClCpB,QAAQb,OAAOc,KAAK;gBACpBC,yBAAyBf,OAAOgB,oBAAoB;gBACpDkB,YAAYlC,OAAOmC,SAAS;gBAC5BC,aAAapC,OAAOqC,UAAU,EAAElB,iBAAiB;gBACjDF,mBAAmBjB,OAAOkB,eAAe,EAAEC,iBAAiB;YAC9D,CAAA;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assign-runner-instances.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/assign-runner-instances.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"assign-runner-instances.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/assign-runner-instances.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,0BAA0B,iDAoCrC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { requireProvisionerContext } from '@shipfox/api-auth-context';
|
|
2
|
-
import { assignRunnerInstancesBodySchema, assignRunnerInstancesResponseSchema } from '@shipfox/api-runners-dto';
|
|
2
|
+
import { assignRunnerInstancesBodySchema, assignRunnerInstancesResponseSchema, RESERVATION_EXPIRED_ERROR_CODE, RUNNER_INSTANCE_NOT_ASSIGNABLE_ERROR_CODE } from '@shipfox/api-runners-dto';
|
|
3
3
|
import { ClientError, defineRoute } from '@shipfox/node-fastify';
|
|
4
4
|
import { ReservationExpiredError, ReservationNotFoundError, RunnerInstanceAlreadyAssignedError, RunnerInstanceNotAssignableError } from '#core/errors.js';
|
|
5
5
|
import { assignRunnerInstances } from '#core/runner-assignments.js';
|
|
@@ -17,10 +17,10 @@ export const assignRunnerInstancesRoute = defineRoute({
|
|
|
17
17
|
if (error instanceof ReservationNotFoundError) throw new ClientError('Reservation not found', 'reservation-not-found', {
|
|
18
18
|
status: 404
|
|
19
19
|
});
|
|
20
|
-
if (error instanceof ReservationExpiredError) throw new ClientError('Reservation has expired',
|
|
20
|
+
if (error instanceof ReservationExpiredError) throw new ClientError('Reservation has expired', RESERVATION_EXPIRED_ERROR_CODE, {
|
|
21
21
|
status: 409
|
|
22
22
|
});
|
|
23
|
-
if (error instanceof RunnerInstanceAlreadyAssignedError || error instanceof RunnerInstanceNotAssignableError) throw new ClientError('Runner instance cannot be assigned',
|
|
23
|
+
if (error instanceof RunnerInstanceAlreadyAssignedError || error instanceof RunnerInstanceNotAssignableError) throw new ClientError('Runner instance cannot be assigned', RUNNER_INSTANCE_NOT_ASSIGNABLE_ERROR_CODE, {
|
|
24
24
|
status: 409
|
|
25
25
|
});
|
|
26
26
|
throw error;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/presentation/routes/assign-runner-instances.ts"],"sourcesContent":["import {requireProvisionerContext} from '@shipfox/api-auth-context';\nimport {\n assignRunnerInstancesBodySchema,\n assignRunnerInstancesResponseSchema,\n} from '@shipfox/api-runners-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {\n ReservationExpiredError,\n ReservationNotFoundError,\n RunnerInstanceAlreadyAssignedError,\n RunnerInstanceNotAssignableError,\n} from '#core/errors.js';\nimport {assignRunnerInstances} from '#core/runner-assignments.js';\n\nexport const assignRunnerInstancesRoute = defineRoute({\n method: 'POST',\n path: '/runner-instances/assignments',\n description: 'Assign enrolled runner instances to an owned demand reservation',\n schema: {\n body: assignRunnerInstancesBodySchema,\n response: {200: assignRunnerInstancesResponseSchema},\n },\n errorHandler: (error) => {\n if (error instanceof ReservationNotFoundError)\n throw new ClientError('Reservation not found', 'reservation-not-found', {status: 404});\n if (error instanceof ReservationExpiredError)\n throw new ClientError('Reservation has expired',
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/routes/assign-runner-instances.ts"],"sourcesContent":["import {requireProvisionerContext} from '@shipfox/api-auth-context';\nimport {\n assignRunnerInstancesBodySchema,\n assignRunnerInstancesResponseSchema,\n RESERVATION_EXPIRED_ERROR_CODE,\n RUNNER_INSTANCE_NOT_ASSIGNABLE_ERROR_CODE,\n} from '@shipfox/api-runners-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {\n ReservationExpiredError,\n ReservationNotFoundError,\n RunnerInstanceAlreadyAssignedError,\n RunnerInstanceNotAssignableError,\n} from '#core/errors.js';\nimport {assignRunnerInstances} from '#core/runner-assignments.js';\n\nexport const assignRunnerInstancesRoute = defineRoute({\n method: 'POST',\n path: '/runner-instances/assignments',\n description: 'Assign enrolled runner instances to an owned demand reservation',\n schema: {\n body: assignRunnerInstancesBodySchema,\n response: {200: assignRunnerInstancesResponseSchema},\n },\n errorHandler: (error) => {\n if (error instanceof ReservationNotFoundError)\n throw new ClientError('Reservation not found', 'reservation-not-found', {status: 404});\n if (error instanceof ReservationExpiredError)\n throw new ClientError('Reservation has expired', RESERVATION_EXPIRED_ERROR_CODE, {\n status: 409,\n });\n if (\n error instanceof RunnerInstanceAlreadyAssignedError ||\n error instanceof RunnerInstanceNotAssignableError\n )\n throw new ClientError(\n 'Runner instance cannot be assigned',\n RUNNER_INSTANCE_NOT_ASSIGNABLE_ERROR_CODE,\n {status: 409},\n );\n throw error;\n },\n handler: async (request) => {\n const {provisionerTokenId} = requireProvisionerContext(request);\n return {\n runner_instance_ids: await assignRunnerInstances({\n provisionerId: provisionerTokenId,\n reservationId: request.body.reservation_id,\n runnerInstanceIds: request.body.runner_instance_ids,\n }),\n };\n },\n});\n"],"names":["requireProvisionerContext","assignRunnerInstancesBodySchema","assignRunnerInstancesResponseSchema","RESERVATION_EXPIRED_ERROR_CODE","RUNNER_INSTANCE_NOT_ASSIGNABLE_ERROR_CODE","ClientError","defineRoute","ReservationExpiredError","ReservationNotFoundError","RunnerInstanceAlreadyAssignedError","RunnerInstanceNotAssignableError","assignRunnerInstances","assignRunnerInstancesRoute","method","path","description","schema","body","response","errorHandler","error","status","handler","request","provisionerTokenId","runner_instance_ids","provisionerId","reservationId","reservation_id","runnerInstanceIds"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,4BAA4B;AACpE,SACEC,+BAA+B,EAC/BC,mCAAmC,EACnCC,8BAA8B,EAC9BC,yCAAyC,QACpC,2BAA2B;AAClC,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SACEC,uBAAuB,EACvBC,wBAAwB,EACxBC,kCAAkC,EAClCC,gCAAgC,QAC3B,kBAAkB;AACzB,SAAQC,qBAAqB,QAAO,8BAA8B;AAElE,OAAO,MAAMC,6BAA6BN,YAAY;IACpDO,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMhB;QACNiB,UAAU;YAAC,KAAKhB;QAAmC;IACrD;IACAiB,cAAc,CAACC;QACb,IAAIA,iBAAiBZ,0BACnB,MAAM,IAAIH,YAAY,yBAAyB,yBAAyB;YAACgB,QAAQ;QAAG;QACtF,IAAID,iBAAiBb,yBACnB,MAAM,IAAIF,YAAY,2BAA2BF,gCAAgC;YAC/EkB,QAAQ;QACV;QACF,IACED,iBAAiBX,sCACjBW,iBAAiBV,kCAEjB,MAAM,IAAIL,YACR,sCACAD,2CACA;YAACiB,QAAQ;QAAG;QAEhB,MAAMD;IACR;IACAE,SAAS,OAAOC;QACd,MAAM,EAACC,kBAAkB,EAAC,GAAGxB,0BAA0BuB;QACvD,OAAO;YACLE,qBAAqB,MAAMd,sBAAsB;gBAC/Ce,eAAeF;gBACfG,eAAeJ,QAAQN,IAAI,CAACW,cAAc;gBAC1CC,mBAAmBN,QAAQN,IAAI,CAACQ,mBAAmB;YACrD;QACF;IACF;AACF,GAAG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poll-demand.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/poll-demand.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAC,0BAA0B,EAAC,MAAM,+BAA+B,CAAC;AAsB9E,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,0BAA+B,
|
|
1
|
+
{"version":3,"file":"poll-demand.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/poll-demand.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAC,0BAA0B,EAAC,MAAM,+BAA+B,CAAC;AAsB9E,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,0BAA+B,mDAiG7E;AAED,eAAO,MAAM,eAAe,iDAA0B,CAAC"}
|
|
@@ -74,6 +74,7 @@ export function createPollDemandRoute(options = {}) {
|
|
|
74
74
|
provisionerId: provisionerContext.provisionerTokenId,
|
|
75
75
|
maxReservations: request.body.max_reservations,
|
|
76
76
|
ttlSeconds,
|
|
77
|
+
activationGraceSeconds: config.RESERVATION_TTL_SECONDS,
|
|
77
78
|
templates,
|
|
78
79
|
capabilityWindowSeconds: config.PROVISIONER_ACTIVE_WINDOW_SECONDS,
|
|
79
80
|
eligibleWorkspaceIds,
|