judoscale-express
Version:
ExpressJS package for the Judoscale autoscaler
52 lines (42 loc) • 1.88 kB
JavaScript
/* global test, expect, describe */
const express = require('express')
const request = require('supertest')
const { Judoscale, middleware } = require('../index.js')
const app = express()
app.use(middleware(new Judoscale()))
app.get('/test', (_req, res) => {
res.send('Middleware test')
})
const expressAdapter = Judoscale.adapters.find((a) => a.identifier === 'judoscale-express')
test('adapter is registered', () => {
expect(expressAdapter).toBeDefined()
expect(expressAdapter.identifier).toEqual('judoscale-express')
})
describe('middleware', () => {
test('captures request queue time in the metrics store', async () => {
// Simulate 100ms queue time
const simulatedHeaderTime = Date.now() - 100
const response = await request(app).get('/test').set('x-request-start', simulatedHeaderTime.toString())
expect(response.statusCode).toBe(200)
expect(response.text).toBe('Middleware test')
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')
expect(metrics[0].value).toBeGreaterThanOrEqual(100)
expect(metrics[0].value).toBeLessThan(200)
expect(metrics[1].identifier).toEqual('at')
expect(metrics[1].value).toBeGreaterThanOrEqual(0)
expect(metrics[2].identifier).toEqual('up')
expect(metrics[2].value).toBeGreaterThanOrEqual(0)
})
test('gracefully handles missing queue time', async () => {
const response = await request(app).get('/test')
expect(response.statusCode).toBe(200)
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')
expect(metrics[1].identifier).toEqual('up')
})
})