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); if (cur.lineStatus == "online" || prev.lineStatus == "online") { DEBUG("lineStatus is online, assuming not in a soft start situation"); return; } 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 ctx.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); } else if (cur.num_active == cur.num_guns && prev.num_active < cur.num_active) { if (ctx.dryRun) { DEBUG(`DRY RUN: await ctx.db.event.post(${projectId}, ${payload});`); } else { await ctx.db.event.post(projectId, payload); } INFO("Full volume detected @", cur.tstamp); const projectId = await ctx.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); if (ctx.dryRun) { DEBUG(`DRY RUN: await ctx.db.event.post(${projectId}, ${payload});`); } else { await ctx.db.event.post(projectId, payload); } } } catch (err) { DEBUG(`${this.author} error`, err); throw err; } finally { this.prev = data; } } } module.exports = DetectSoftStart;