UNPKG

@flowfuse/device-agent

Version:

An Edge Agent for running Node-RED instances deployed from the FlowFuse Platform

68 lines (61 loc) 2.46 kB
const crypto = require('crypto') const got = require('got').default const os = require('node:os') let pptf (async function () { try { pptf = (await import('parse-prometheus-text-format')).default } catch (err) { console.error(err) } })() const instanceId = crypto.createHash('md5').update(os.hostname()).digest('hex').substring(0, 4) let lastCPUTime = 0 async function sampleResources (url, time) { const response = { src: instanceId } try { const res = await got.get(url, { headers: { pragma: 'no-cache', 'Cache-Control': 'max-age=0, must-revalidate, no-cache' }, timeout: { request: 2000 }, retry: { limit: 0 } }) const parsed = pptf(res.body) parsed.forEach(metric => { if (metric.name === 'process_resident_memory_bytes') { response.ps = parseInt(metric.metrics[0].value) / (1024 * 1024) } else if (metric.name === 'process_cpu_seconds_total') { const cpuTime = parseFloat(metric.metrics[0].value) if (cpuTime > lastCPUTime) { if (lastCPUTime !== 0) { const delta = cpuTime - lastCPUTime response.cpu = (delta / time) * 100 } } else { // show 0 if the CPU time has not increased // this can happen if the process was restarted response.cpu = 0 } lastCPUTime = cpuTime } else if (metric.name === 'nodejs_eventloop_lag_mean_seconds') { response.ela = parseFloat(metric.metrics[0].value) } else if (metric.name === 'nodejs_eventloop_lag_p99_seconds') { response.el99 = parseFloat(metric.metrics[0].value) } else if (metric.name === 'nodered_messages_total') { response.nrmsgs = parseInt(metric.metrics[0].value) } else if (metric.name === 'nodered_node_receive_events_total') { response.nrrecv = parseInt(metric.metrics[0].value) } else if (metric.name === 'nodered_node_send_events_total') { response.nrsend = parseInt(metric.metrics[0].value) } }) } catch (err) { response.err = err.message } return response } module.exports = sampleResources