diff options
Diffstat (limited to 'server/prometheus.js')
-rw-r--r-- | server/prometheus.js | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/server/prometheus.js b/server/prometheus.js new file mode 100644 index 0000000..f26125d --- /dev/null +++ b/server/prometheus.js @@ -0,0 +1,123 @@ +const PrometheusClient = require("prom-client"); +const { log } = require("../src/util"); + +const commonLabels = [ + "monitor_name", + "monitor_type", + "monitor_url", + "monitor_hostname", + "monitor_port", +]; + +const monitorCertDaysRemaining = new PrometheusClient.Gauge({ + name: "monitor_cert_days_remaining", + help: "The number of days remaining until the certificate expires", + labelNames: commonLabels +}); + +const monitorCertIsValid = new PrometheusClient.Gauge({ + name: "monitor_cert_is_valid", + help: "Is the certificate still valid? (1 = Yes, 0= No)", + labelNames: commonLabels +}); +const monitorResponseTime = new PrometheusClient.Gauge({ + name: "monitor_response_time", + help: "Monitor Response Time (ms)", + labelNames: commonLabels +}); + +const monitorStatus = new PrometheusClient.Gauge({ + name: "monitor_status", + help: "Monitor Status (1 = UP, 0= DOWN, 2= PENDING, 3= MAINTENANCE)", + labelNames: commonLabels +}); + +class Prometheus { + monitorLabelValues = {}; + + /** + * @param {object} monitor Monitor object to monitor + */ + constructor(monitor) { + this.monitorLabelValues = { + monitor_name: monitor.name, + monitor_type: monitor.type, + monitor_url: monitor.url, + monitor_hostname: monitor.hostname, + monitor_port: monitor.port + }; + } + + /** + * Update the metrics page + * @param {object} heartbeat Heartbeat details + * @param {object} tlsInfo TLS details + * @returns {void} + */ + update(heartbeat, tlsInfo) { + + if (typeof tlsInfo !== "undefined") { + try { + let isValid; + if (tlsInfo.valid === true) { + isValid = 1; + } else { + isValid = 0; + } + monitorCertIsValid.set(this.monitorLabelValues, isValid); + } catch (e) { + log.error("prometheus", "Caught error"); + log.error("prometheus", e); + } + + try { + if (tlsInfo.certInfo != null) { + monitorCertDaysRemaining.set(this.monitorLabelValues, tlsInfo.certInfo.daysRemaining); + } + } catch (e) { + log.error("prometheus", "Caught error"); + log.error("prometheus", e); + } + } + + if (heartbeat) { + try { + monitorStatus.set(this.monitorLabelValues, heartbeat.status); + } catch (e) { + log.error("prometheus", "Caught error"); + log.error("prometheus", e); + } + + try { + if (typeof heartbeat.ping === "number") { + monitorResponseTime.set(this.monitorLabelValues, heartbeat.ping); + } else { + // Is it good? + monitorResponseTime.set(this.monitorLabelValues, -1); + } + } catch (e) { + log.error("prometheus", "Caught error"); + log.error("prometheus", e); + } + } + } + + /** + * Remove monitor from prometheus + * @returns {void} + */ + remove() { + try { + monitorCertDaysRemaining.remove(this.monitorLabelValues); + monitorCertIsValid.remove(this.monitorLabelValues); + monitorResponseTime.remove(this.monitorLabelValues); + monitorStatus.remove(this.monitorLabelValues); + } catch (e) { + console.error(e); + } + } +} + +module.exports = { + Prometheus +}; |