diff --git a/server/model/monitor.js b/server/model/monitor.js index 741fb940e..fba5fcc6c 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -346,7 +346,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..d81e5d0ab 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,45 @@ class Prometheus { /** * @param {object} monitor Monitor object to monitor + * @param {Array<{name:string,value:?string}>} tags Tags to add to the monitor */ - constructor(monitor) { + constructor(monitor, tags) { + let filteredValidAsciiTags = this.filterValidAsciiTags(tags); + + if (filteredValidAsciiTags.length <= 0) { + filteredValidAsciiTags = "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: filteredValidAsciiTags }; } + /** + * Filter tags to remove the ones that contain non-ASCII characters + * See https://github.com/louislam/uptime-kuma/pull/4704#issuecomment-2366524692 + * @param {Array<{name: string, value:?string}>} tags The tags to filter + * @returns {string[]} The filtered tags + */ + filterValidAsciiTags(tags) { + const asciiRegex = /^[a-zA-Z_][a-zA-Z0-9_]*$/; + return tags.reduce((filteredTags, tag) => { + if (asciiRegex.test(tag.name)) { + if (tag.value !== "" && asciiRegex.test(tag.value)) { + filteredTags.push(`${tag.name}:${tag.value}`); + } else { + filteredTags.push(tag.name); + } + } + return filteredTags; + }, []); + } + /** * Update the metrics page * @param {object} heartbeat Heartbeat details @@ -55,7 +84,6 @@ class Prometheus { * @returns {void} */ update(heartbeat, tlsInfo) { - if (typeof tlsInfo !== "undefined") { try { let isValid;