From d50860eee23083df099fbe2bb63a9b16b0b18668 Mon Sep 17 00:00:00 2001 From: forehalo Date: Thu, 27 Feb 2025 10:15:13 +0000 Subject: [PATCH] fix(server): use updowncounter by default (#10482) --- .../__tests__/__snapshots__/queue.spec.ts.md | 88 ++++++++++++++++++ .../__snapshots__/queue.spec.ts.snap | Bin 0 -> 553 bytes .../base/job/queue/__tests__/queue.spec.ts | 37 +++----- .../server/src/base/job/queue/executor.ts | 8 +- .../server/src/base/metrics/metrics.ts | 8 +- .../backend/server/src/core/sync/gateway.ts | 4 +- 6 files changed, 109 insertions(+), 36 deletions(-) create mode 100644 packages/backend/server/src/base/job/queue/__tests__/__snapshots__/queue.spec.ts.md create mode 100644 packages/backend/server/src/base/job/queue/__tests__/__snapshots__/queue.spec.ts.snap diff --git a/packages/backend/server/src/base/job/queue/__tests__/__snapshots__/queue.spec.ts.md b/packages/backend/server/src/base/job/queue/__tests__/__snapshots__/queue.spec.ts.md new file mode 100644 index 000000000..96b2ef1a3 --- /dev/null +++ b/packages/backend/server/src/base/job/queue/__tests__/__snapshots__/queue.spec.ts.md @@ -0,0 +1,88 @@ +# Snapshot report for `src/base/job/queue/__tests__/queue.spec.ts` + +The actual snapshot is saved in `queue.spec.ts.snap`. + +Generated by [AVA](https://avajs.dev). + +## should be able to record job metrics + +> [+1 active jobs, job handler, -1 active jobs] + + [ + [ + 1, + { + queue: 'nightly', + }, + ], + [ + 1, + { + error: false, + handler: 'JobHandlers.handleJob', + job: 'nightly.__test__job', + name: 'job_handler', + namespace: 'nightly', + }, + ], + [ + -1, + { + queue: 'nightly', + }, + ], + ] + +> [+1 active jobs, job handler, -1 active jobs] + + [ + [ + 1, + { + queue: 'nightly', + }, + ], + [ + 1, + { + error: false, + handler: 'JobHandlers.handleJob', + job: 'nightly.__test__job2', + name: 'job_handler', + namespace: 'nightly', + }, + ], + [ + -1, + { + queue: 'nightly', + }, + ], + ] + +> [+1 active jobs, job handler errored, -1 active jobs] + + [ + [ + 1, + { + queue: 'nightly', + }, + ], + [ + 1, + { + error: true, + handler: 'JobHandlers.throwJob', + job: 'nightly.__test__throw', + name: 'job_handler', + namespace: 'nightly', + }, + ], + [ + -1, + { + queue: 'nightly', + }, + ], + ] diff --git a/packages/backend/server/src/base/job/queue/__tests__/__snapshots__/queue.spec.ts.snap b/packages/backend/server/src/base/job/queue/__tests__/__snapshots__/queue.spec.ts.snap new file mode 100644 index 0000000000000000000000000000000000000000..a6390e1d64fc7ca1bcf3c2f416d5d199ada01f92 GIT binary patch literal 553 zcmV+^0@nRORzV#4fhWI!Sn%jcP?AlGJN2r}u-zZ~F57~DI z9h47ssdWp$9RT+MtOFQOdx6}0TJvq9rt&-wGzW4(J)%dG<{r^*`KGFTTb8UG>3jk3 z6~KWtj!lj0lJgV5F97p24Yq9X3ISIM7+GN34#+_B7!bp-%-X86-KI&*6M^7l;CBV= z)j*fnI|4p7Ioj(Ym7yW$u^%cM*;r>9yIe)_ z%9K?|cY)j&V>y=1s*@+rVv}uGsB5EAYo)6d>sx!BnCDR@b+cYvQ{utoQ?WeRTT{Yn za#AIldQhLd90W!dCJ53acq``{he>;>5AoEr19in=E=YJL^0s?*`9o0z~}$hli@L*+? { }); test('should be able to record job metrics', async t => { - const counterStub = Sinon.stub(metrics.job.counter('function_calls'), 'add'); + const counterStub = Sinon.stub( + metrics.queue.counter('function_calls'), + 'add' + ); const timerStub = Sinon.stub( - metrics.job.histogram('function_timer'), + metrics.queue.histogram('function_timer'), 'record' ); await executor.run('nightly.__test__job', { name: 'test executor' }); - t.deepEqual(counterStub.firstCall.args[1], { - name: 'job_handler', - job: 'nightly.__test__job', - namespace: 'nightly', - handler: 'JobHandlers.handleJob', - error: false, - }); - + t.snapshot(counterStub.args, '[+1 active jobs, job handler, -1 active jobs]'); t.deepEqual(timerStub.firstCall.args[1], { name: 'job_handler', job: 'nightly.__test__job', @@ -177,14 +173,7 @@ test('should be able to record job metrics', async t => { await executor.run('nightly.__test__job2', { name: 'test executor' }); - t.deepEqual(counterStub.firstCall.args[1], { - name: 'job_handler', - job: 'nightly.__test__job2', - namespace: 'nightly', - handler: 'JobHandlers.handleJob', - error: false, - }); - + t.snapshot(counterStub.args, '[+1 active jobs, job handler, -1 active jobs]'); t.deepEqual(timerStub.firstCall.args[1], { name: 'job_handler', job: 'nightly.__test__job2', @@ -203,14 +192,10 @@ test('should be able to record job metrics', async t => { } ); - t.deepEqual(counterStub.firstCall.args[1], { - name: 'job_handler', - job: 'nightly.__test__throw', - namespace: 'nightly', - handler: 'JobHandlers.throwJob', - error: true, - }); - + t.snapshot( + counterStub.args, + '[+1 active jobs, job handler errored, -1 active jobs]' + ); t.deepEqual(timerStub.firstCall.args[1], { name: 'job_handler', job: 'nightly.__test__throw', diff --git a/packages/backend/server/src/base/job/queue/executor.ts b/packages/backend/server/src/base/job/queue/executor.ts index 74863a42a..10efd8aae 100644 --- a/packages/backend/server/src/base/job/queue/executor.ts +++ b/packages/backend/server/src/base/job/queue/executor.ts @@ -77,7 +77,7 @@ export class JobExecutor } }); }, - 'job', + 'queue', 'job_handler', { job: name, @@ -85,12 +85,12 @@ export class JobExecutor handler: handler.name, } ); - const activeJobs = metrics.job.gauge('queue_active_jobs'); - activeJobs.record(1, { queue: ns }); + const activeJobs = metrics.queue.counter('active_jobs'); + activeJobs.add(1, { queue: ns }); try { return await fn(); } finally { - activeJobs.record(-1, { queue: ns }); + activeJobs.add(-1, { queue: ns }); } } diff --git a/packages/backend/server/src/base/metrics/metrics.ts b/packages/backend/server/src/base/metrics/metrics.ts index 84a7239dc..74432c07c 100644 --- a/packages/backend/server/src/base/metrics/metrics.ts +++ b/packages/backend/server/src/base/metrics/metrics.ts @@ -1,16 +1,16 @@ import { - Counter, Gauge, Histogram, Meter, MetricOptions, + UpDownCounter, } from '@opentelemetry/api'; import { getMeter } from './opentelemetry'; type MetricType = 'counter' | 'gauge' | 'histogram'; type Metric = T extends 'counter' - ? Counter + ? UpDownCounter : T extends 'gauge' ? Gauge : T extends 'histogram' @@ -18,7 +18,7 @@ type Metric = T extends 'counter' : never; export type ScopedMetrics = { - counter: (name: string, opts?: MetricOptions) => Counter; + counter: (name: string, opts?: MetricOptions) => UpDownCounter; gauge: (name: string, opts?: MetricOptions) => Gauge; histogram: (name: string, opts?: MetricOptions) => Histogram; }; @@ -42,7 +42,7 @@ export type KnownMetricScopes = | 'mail' | 'ai' | 'event' - | 'job'; + | 'queue'; const metricCreators: MetricCreators = { counter(meter: Meter, name: string, opts?: MetricOptions) { diff --git a/packages/backend/server/src/core/sync/gateway.ts b/packages/backend/server/src/core/sync/gateway.ts index e56dc8720..e960fd562 100644 --- a/packages/backend/server/src/core/sync/gateway.ts +++ b/packages/backend/server/src/core/sync/gateway.ts @@ -153,13 +153,13 @@ export class SpaceSyncGateway handleConnection() { this.connectionCount++; this.logger.log(`New connection, total: ${this.connectionCount}`); - metrics.socketio.gauge('connections').record(1); + metrics.socketio.gauge('connections').record(this.connectionCount); } handleDisconnect() { this.connectionCount--; this.logger.log(`Connection disconnected, total: ${this.connectionCount}`); - metrics.socketio.gauge('connections').record(-1); + metrics.socketio.gauge('connections').record(this.connectionCount); } selectAdapter(client: Socket, spaceType: SpaceType): SyncSocketAdapter {