From fe87fbff1ba08b0f39b8a9f80d8467a96ba6ef2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 25 Nov 2024 15:52:26 +0100 Subject: [PATCH] add simple gauge metrics for task run start/end times MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/heavy-needles-poke.md | 5 +++++ .../scheduler/lib/PluginTaskSchedulerImpl.ts | 17 ++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 .changeset/heavy-needles-poke.md diff --git a/.changeset/heavy-needles-poke.md b/.changeset/heavy-needles-poke.md new file mode 100644 index 0000000000..830533a8fb --- /dev/null +++ b/.changeset/heavy-needles-poke.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': patch +--- + +Add task scheduler metrics as two gauges that track the last start and end timestamps as epoch seconds. diff --git a/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.ts b/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.ts index 5c04521149..ce1ff823cf 100644 --- a/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.ts +++ b/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.ts @@ -24,7 +24,7 @@ import { SchedulerServiceTaskRunner, SchedulerServiceTaskScheduleDefinition, } from '@backstage/backend-plugin-api'; -import { Counter, Histogram, metrics, trace } from '@opentelemetry/api'; +import { Counter, Histogram, Gauge, metrics, trace } from '@opentelemetry/api'; import { Knex } from 'knex'; import { Duration } from 'luxon'; import { LocalTaskWorker } from './LocalTaskWorker'; @@ -44,6 +44,8 @@ export class PluginTaskSchedulerImpl implements SchedulerService { private readonly counter: Counter; private readonly duration: Histogram; + private readonly lastStarted: Gauge; + private readonly lastCompleted: Gauge; constructor( private readonly databaseFactory: () => Promise, @@ -58,6 +60,17 @@ export class PluginTaskSchedulerImpl implements SchedulerService { description: 'Histogram of task run durations', unit: 'seconds', }); + this.lastStarted = meter.createGauge('backend_tasks.task.runs.started', { + description: 'Epoch timestamp seconds when the task was last started', + unit: 'seconds', + }); + this.lastCompleted = meter.createGauge( + 'backend_tasks.task.runs.completed', + { + description: 'Epoch timestamp seconds when the task was last completed', + unit: 'seconds', + }, + ); this.shutdownInitiated = new Promise(shutdownInitiated => { rootLifecycle?.addShutdownHook(() => shutdownInitiated(true)); }); @@ -144,6 +157,7 @@ export class PluginTaskSchedulerImpl implements SchedulerService { scope, }; this.counter.add(1, { ...labels, result: 'started' }); + this.lastStarted.record(Date.now() / 1000, { taskId: task.id }); const startTime = process.hrtime(); @@ -170,6 +184,7 @@ export class PluginTaskSchedulerImpl implements SchedulerService { const endTime = delta[0] + delta[1] / 1e9; this.counter.add(1, labels); this.duration.record(endTime, labels); + this.lastCompleted.record(Date.now() / 1000, labels); } }; }