Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions packages/bull/src/index.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
const { Judoscale } = require('judoscale-node-core')
const BullMetricsCollector = require('./bull-metrics-collector')
const packageInfo = require('../package.json')
const bullPackageInfo = require('bull/package.json')

Judoscale.registerAdapter('judoscale-bull', new BullMetricsCollector(), {
adapter_version: packageInfo.version,
framework_version: bullPackageInfo.version,
})

module.exports = {
Expand Down
2 changes: 2 additions & 0 deletions packages/bullmq/src/index.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
const { Judoscale } = require('judoscale-node-core')
const BullMQMetricsCollector = require('./bull-mq-metrics-collector')
const packageInfo = require('../package.json')
const bullmqPackageInfo = require('bullmq/package.json')

Judoscale.registerAdapter('judoscale-bullmq', new BullMQMetricsCollector(), {
adapter_version: packageInfo.version,
framework_version: bullmqPackageInfo.version,
})

module.exports = {
Expand Down
2 changes: 2 additions & 0 deletions packages/express/src/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const { Judoscale, MetricsStore, requestMetrics, UtilizationTracker, WebMetricsCollector } = require('judoscale-node-core')
const packageInfo = require('../package.json')
const expressPackageInfo = require('express/package.json')

const metricsStore = new MetricsStore()
const utilizationTracker = new UtilizationTracker()
Expand Down Expand Up @@ -33,6 +34,7 @@ function middleware(judoscale) {

Judoscale.registerAdapter('judoscale-express', new WebMetricsCollector(metricsStore, utilizationTracker), {
adapter_version: packageInfo.version,
framework_version: expressPackageInfo.version,
})

module.exports = { Judoscale, middleware }
10 changes: 6 additions & 4 deletions packages/express/src/test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ app.get('/test', (_req, res) => {
res.send('Middleware test')
})

const expressAdapter = Judoscale.adapters.find((a) => a.identifier === 'judoscale-express')

test('adapter is registered', () => {
expect(Judoscale.adapters.length).toEqual(1)
expect(Judoscale.adapters[0].identifier).toEqual('judoscale-express')
expect(expressAdapter).toBeDefined()
expect(expressAdapter.identifier).toEqual('judoscale-express')
})

describe('middleware', () => {
Expand All @@ -24,7 +26,7 @@ describe('middleware', () => {
expect(response.statusCode).toBe(200)
expect(response.text).toBe('Middleware test')

const metrics = Judoscale.adapters[0].collector.collect()
const metrics = expressAdapter.collector.collect()
expect(metrics.length).toEqual(3)
// Queue time should be 100-200ms depending how long the test takes to run
expect(metrics[0].identifier).toEqual('qt')
Expand All @@ -40,7 +42,7 @@ describe('middleware', () => {
const response = await request(app).get('/test')
expect(response.statusCode).toBe(200)

const metrics = Judoscale.adapters[0].collector.collect()
const metrics = expressAdapter.collector.collect()
// Only app time & utilization pct are tracked, queue time isn't.
expect(metrics.length).toEqual(2)
expect(metrics[0].identifier).toEqual('at')
Expand Down
2 changes: 2 additions & 0 deletions packages/fastify/src/plugin.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const fp = require('fastify-plugin')
const { Judoscale, MetricsStore, requestMetrics, UtilizationTracker, WebMetricsCollector } = require('judoscale-node-core')
const packageInfo = require('../package.json')
const fastifyPackageInfo = require('fastify/package.json')

const metricsStore = new MetricsStore()
const utilizationTracker = new UtilizationTracker()
Expand Down Expand Up @@ -41,6 +42,7 @@ const plugin = fp(rawPlugin, {

Judoscale.registerAdapter('judoscale-fastify', new WebMetricsCollector(metricsStore, utilizationTracker), {
adapter_version: packageInfo.version,
framework_version: fastifyPackageInfo.version,
})

module.exports = {
Expand Down
10 changes: 6 additions & 4 deletions packages/fastify/test/plugin.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ app.get('/test', async (_request, _reply) => {
return { message: 'Middleware test' }
})

const fastifyAdapter = Judoscale.adapters.find((a) => a.identifier === 'judoscale-fastify')

test('adapter is registered', () => {
expect(Judoscale.adapters.length).toEqual(1)
expect(Judoscale.adapters[0].identifier).toEqual('judoscale-fastify')
expect(fastifyAdapter).toBeDefined()
expect(fastifyAdapter.identifier).toEqual('judoscale-fastify')
})

describe('Judoscale Fastify Plugin', () => {
Expand All @@ -35,7 +37,7 @@ describe('Judoscale Fastify Plugin', () => {
expect(response.statusCode).toBe(200)
expect(JSON.parse(response.body)).toEqual({ message: 'Middleware test' })

const metrics = Judoscale.adapters[0].collector.collect()
const metrics = fastifyAdapter.collector.collect()
expect(metrics.length).toEqual(3)
// Queue time should be 100-200ms depending how long the test takes to run
expect(metrics[0].identifier).toEqual('qt')
Expand All @@ -55,7 +57,7 @@ describe('Judoscale Fastify Plugin', () => {
})
expect(response.statusCode).toBe(200)

const metrics = Judoscale.adapters[0].collector.collect()
const metrics = fastifyAdapter.collector.collect()
// Only app time & utilization pct are tracked, queue time isn't.
expect(metrics.length).toEqual(2)
expect(metrics[0].identifier).toEqual('at')
Expand Down
6 changes: 6 additions & 0 deletions packages/node-core/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ const UtilizationTracker = require('./utilization-tracker')
const WebMetricsCollector = require('./web-metrics-collector')
const WorkerMetricsCollector = require('./worker-metrics-collector')
const Judoscale = require('./judoscale')
const packageInfo = require('../package.json')

Judoscale.registerAdapter('judoscale-node', null, {
adapter_version: packageInfo.version,
language_version: process.version,
})
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Register node-core so we can report its version as well as the node version.

There's a bit of an inconsistency between Ruby/Node & Python here, in that Python only reports platform_version for everything, while Ruby/Node use language_version vs framework_version. I think that's something we should consider to make consistent across the board eventually.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I kinda like language_version & framework_version, but maybe we don't need that differentiation and can just make it like python does, because we know the version from the core packages represent the language and from the other specific packages it's the framework.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


module.exports = {
Judoscale,
Expand Down
4 changes: 3 additions & 1 deletion packages/node-core/src/judoscale.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ class Judoscale {

// Expose config to the collectors
for (const adapter of Judoscale.adapters) {
adapter.collector.config = { ...this.config, ...adapter.collector.config }
if (adapter.collector) {
adapter.collector.config = { ...this.config, ...adapter.collector.config }
}
}

new Reporter().start(this.config, Judoscale.adapters)
Expand Down
2 changes: 1 addition & 1 deletion packages/node-core/src/reporter.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class Reporter {
}

async report(adapters, config) {
const collectors = adapters.map((a) => a.collector)
const collectors = adapters.map((a) => a.collector).filter(Boolean)
const metrics = (await Promise.all(collectors.map((collector) => collector.collect()))).flat()
const report = new Report(adapters, config, metrics)
config.logger.info(`[Judoscale] Reporting ${report.metrics.length} metrics`)
Expand Down