prometheus-what-active-users-exporter
Version:
Prometheus exporter that scrapes currently logged in users on unix systems
117 lines (100 loc) • 4.2 kB
JavaScript
process.env.EXPORTER_CHECK_INTERVAL_MILLIS = 250
process.env.EXPORTER_METRICS_RETENTION = 1000
const pkg = require('../../package.json')
const http = require('http')
const { expect } = require('chai')
let i = 0
const wResolvedPath = require.resolve('../../lib/w')
delete require.cache[wResolvedPath]
let returnTwoPips = false
let returnOnePip3 = false
let throwError = false
require.cache[wResolvedPath] = {
id: wResolvedPath,
file: wResolvedPath,
loaded: true,
exports: () => {
i++
if (returnTwoPips) {
return Promise.resolve(`23:50:13 up 1 day, 11:33, 1 user, load average: 0.08, 0.03, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
pip pts/0 192.168.2.107 23:50 1.00s 0.15s 0.01s w
pip pts/0 192.168.2.107 23:50 1.00s 0.15s 0.01s w
`)
} else if (returnOnePip3) {
return Promise.resolve(`23:50:13 up 1 day, 11:33, 1 user, load average: 0.08, 0.03, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
pip3 pts/0 192.168.2.107 23:50 1.00s 0.15s 0.01s w
`)
} else if (throwError) {
return Promise.reject('Err!')
} else {
return Promise.resolve(`23:50:13 up 1 day, 11:33, 1 user, load average: 0.08, 0.03, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
pip pts/0 192.168.2.107 23:50 1.00s 0.15s 0.01s w
`)
}
}
}
const waitAndExpectMetricStrings = (waitMillis, ...expectedMetric) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
http.get('http://localhost:9839/metrics', (response) => {
if (response.statusCode !== 200) {
reject(response.statusCode)
return
}
const responseData = []
response.on('data', (data) => {
responseData.push(data.toString('ascii'))
})
response.on('end', () => {
const body = responseData.join()
expectedMetric.forEach((metric) => {
expect(body).to.contain(metric)
})
resolve()
})
})
}, waitMillis)
})
}
describe('WhatActiveUsersExporter', () => {
const index = require('../../lib/index')
after(() => {
return index()
})
it('indicates with a metric that exporter is up', () => {
return waitAndExpectMetricStrings(500, `what_up{version="${pkg.version}"} 1`)
})
it('indicates with a metric that exporter is up', () => {
throwError = true
return waitAndExpectMetricStrings(1500, `what_up{version="${pkg.version}"} 0`)
})
it('returns one active sessions', () => {
throwError = false
return waitAndExpectMetricStrings(500, 'user_sessions_currently_active{user="pip"} 1')
})
it('keeps metrics until retention period', () => {
// retention period is 1s
// scrape interval is 250ms
// => metrics should at least be stored for less than 1s, thus we wait 750ms
returnTwoPips = false
returnOnePip3 = true
return waitAndExpectMetricStrings(500, 'user_sessions_currently_active{user="pip"} 1')
})
it('removes metric value for inactive sessions after retention period', () => {
// retention period is 1s
// scrape interval is 250ms
// => metrics should at least be stored for less than 1s, thus we wait 2s to check if metric was cleared
returnTwoPips = false
returnOnePip3 = true
return waitAndExpectMetricStrings(2000, 'user_sessions_currently_active{user="pip"} 0')
})
it('add another metric for a new session', () => {
returnTwoPips = false
returnOnePip3 = true
return waitAndExpectMetricStrings(500, 'user_sessions_currently_active{user="pip"} 0', 'user_sessions_currently_active{user="pip3"} 1')
})
})