summaryrefslogtreecommitdiffstats
path: root/server/prometheus.js
diff options
context:
space:
mode:
Diffstat (limited to 'server/prometheus.js')
-rw-r--r--server/prometheus.js123
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
+};