diff --git a/server/model/monitor.js b/server/model/monitor.js index 08d666b78..86489b6b6 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -329,7 +329,7 @@ class Monitor extends BeanModel { let previousBeat = null; let retries = 0; - this.prometheus = new Prometheus(this); + this.prometheus = new Prometheus(this, await this.getTags()); const beat = async () => { diff --git a/server/prometheus.js b/server/prometheus.js index f26125d2c..ad93bd634 100644 --- a/server/prometheus.js +++ b/server/prometheus.js @@ -7,6 +7,7 @@ const commonLabels = [ "monitor_url", "monitor_hostname", "monitor_port", + "monitor_tags" ]; const monitorCertDaysRemaining = new PrometheusClient.Gauge({ @@ -37,17 +38,51 @@ class Prometheus { /** * @param {object} monitor Monitor object to monitor + * @param {Array} tags Tags to add to the monitor */ - constructor(monitor) { + constructor(monitor, tags) { + let sanitizedTags = this.sanitizeTags(tags); + + if (sanitizedTags.length <= 0) { + sanitizedTags = "null"; + } + this.monitorLabelValues = { monitor_name: monitor.name, monitor_type: monitor.type, monitor_url: monitor.url, monitor_hostname: monitor.hostname, - monitor_port: monitor.port + monitor_port: monitor.port, + monitor_tags: sanitizedTags }; } + /** + * Sanitize tags to remove non-ASCII characters + * See https://github.com/louislam/uptime-kuma/pull/4704#issuecomment-2366524692 + * @param {Array} tags The tags to sanitize + * @returns {*[]} The sanitized tags + */ + sanitizeTags(tags) { + const nonAsciiRegex = /[^\x00-\x7F]/g; + const sanitizedTags = []; + tags.forEach((tag) => { + if (tag.name.match(nonAsciiRegex) || tag.value.match(nonAsciiRegex)) { + // If the tag name or value contains non-ASCII characters, skip it + return; + } + + if (tag.value !== "") { + sanitizedTags.push(tag.name + ":" + tag.value); + return; + } + + sanitizedTags.push(tag.name); + }); + + return sanitizedTags; + } + /** * Update the metrics page * @param {object} heartbeat Heartbeat details @@ -55,7 +90,6 @@ class Prometheus { * @returns {void} */ update(heartbeat, tlsInfo) { - if (typeof tlsInfo !== "undefined") { try { let isValid;