mirror of
https://gitlab.com/wgp/dougal/software.git
synced 2025-12-06 12:17:08 +00:00
The events listener now uses a proper self-consuming queue and the event handlers have been rewritten accordingly. The way this works is that running init() on the handlers library instantiates the handlers and returns two higher-order functions, prepare() and despatch(). A call to the latter of these is appended to the queue with each new incoming event. The handlers have access to a context object (ctx) which may be used to persist data between calls and/or exchange data between handlers. This is used notably to give the handlers access to project configurations, which are themselves refreshed by a project configuration change handler (DetectProjectConfigurationChange).
81 lines
2.3 KiB
JavaScript
81 lines
2.3 KiB
JavaScript
const { schema2pid } = require('../../lib/db/connection');
|
|
const { event } = require('../../lib/db');
|
|
const { ALERT, ERROR, WARNING, NOTICE, INFO, DEBUG } = require('DOUGAL_ROOT/debug')(__filename);
|
|
|
|
class DetectSoftStart {
|
|
|
|
author = `*${this.constructor.name}*`;
|
|
prev = null;
|
|
|
|
constructor () {
|
|
DEBUG(`${this.author} instantiated`);
|
|
}
|
|
|
|
async run (data, ctx) {
|
|
|
|
if (!data || data.channel !== "realtime") {
|
|
return;
|
|
}
|
|
|
|
if (!(data.payload && data.payload.new && data.payload.new.meta)) {
|
|
return;
|
|
}
|
|
|
|
if (!this.prev) {
|
|
DEBUG("Initialising `prev`");
|
|
this.prev = data;
|
|
return;
|
|
}
|
|
|
|
try {
|
|
DEBUG("Running");
|
|
const cur = data?.payload?.new?.meta;
|
|
const prev = this.prev?.payload?.new?.meta;
|
|
// DEBUG("%j", prev);
|
|
// DEBUG("%j", cur);
|
|
DEBUG("cur.num_guns: %d\ncur.num_active: %d\nprv.num_active: %d\ntest passed: %j", cur.num_guns, cur.num_active, prev.num_active, cur.num_active >= 1 && !prev.num_active && cur.num_active < cur.num_guns);
|
|
|
|
|
|
if (cur.num_active >= 1 && !prev.num_active && cur.num_active < cur.num_guns) {
|
|
INFO("Soft start detected @", cur.tstamp);
|
|
|
|
// FIXME Shouldn't need to use schema2pid as pid already present in payload.
|
|
const projectId = await schema2pid(cur._schema ?? prev._schema);
|
|
|
|
// TODO: Try and grab the corresponding comment from the configuration?
|
|
const payload = {
|
|
tstamp: cur.tstamp,
|
|
remarks: "Soft start",
|
|
labels: [ "Daily", "Guns", "Prod" ],
|
|
meta: {auto: true, author: `*${this.constructor.name}*`}
|
|
};
|
|
DEBUG("Posting event", projectId, payload);
|
|
await event.post(projectId, payload);
|
|
|
|
} else if (cur.num_active == cur.num_guns && prev.num_active < cur.num_active) {
|
|
INFO("Full volume detected @", cur.tstamp);
|
|
|
|
const projectId = await schema2pid(cur._schema ?? prev._schema);
|
|
|
|
// TODO: Try and grab the corresponding comment from the configuration?
|
|
const payload = {
|
|
tstamp: cur.tstamp,
|
|
remarks: "Full volume",
|
|
labels: [ "Daily", "Guns", "Prod" ],
|
|
meta: {auto: true, author: `*${this.constructor.name}*`}
|
|
};
|
|
DEBUG("Posting event", projectId, payload);
|
|
await event.post(projectId, payload);
|
|
}
|
|
|
|
} catch (err) {
|
|
DEBUG(`${this.author} error`, err);
|
|
throw err;
|
|
} finally {
|
|
this.prev = data;
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = DetectSoftStart;
|