[tor-commits] [tor/release-0.4.5] hs: Fix multiple port label on single metric

dgoulet at torproject.org dgoulet at torproject.org
Wed Mar 9 13:51:29 UTC 2022


commit 9efb04bb3e979941eada05c1a7d61d08d395376e
Author: David Goulet <dgoulet at torproject.org>
Date:   Tue Mar 8 13:50:34 2022 -0500

    hs: Fix multiple port label on single metric
    
    Prometheus needs unique labels and so this bug was causing an onion
    service with multiple ports to have multiple "port=" label for the
    metrics requiring a port label.
    
    Fixes #40581
    
    Signed-off-by: David Goulet <dgoulet at torproject.org>
---
 changes/ticket40581         |  4 ++++
 src/feature/hs/hs_metrics.c | 23 +++++++++++++++--------
 2 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/changes/ticket40581 b/changes/ticket40581
new file mode 100644
index 0000000000..315215d8ed
--- /dev/null
+++ b/changes/ticket40581
@@ -0,0 +1,4 @@
+  o Minor bugfixes (metrics port, onion service):
+    - Fix the metrics with a port label to be unique. Before this, all ports of
+      an onion service would be on the same line which violates the Prometheus
+      rules of unique labels. Fixes bug 40581; bugfix on 0.4.5.1-alpha.
diff --git a/src/feature/hs/hs_metrics.c b/src/feature/hs/hs_metrics.c
index 452bb44419..25e2e62111 100644
--- a/src/feature/hs/hs_metrics.c
+++ b/src/feature/hs/hs_metrics.c
@@ -59,19 +59,26 @@ init_store(hs_service_t *service)
   store = service->metrics.store;
 
   for (size_t i = 0; i < base_metrics_size; ++i) {
-    metrics_store_entry_t *entry =
-      metrics_store_add(store, base_metrics[i].type, base_metrics[i].name,
-                        base_metrics[i].help);
-
-    /* Add labels to the entry. */
-    metrics_store_entry_add_label(entry,
-                        format_label("onion", service->onion_address));
+    /* Add entries with port as label. We need one metric line per port. */
     if (base_metrics[i].port_as_label && service->config.ports) {
       SMARTLIST_FOREACH_BEGIN(service->config.ports,
                               const rend_service_port_config_t *, p) {
+        metrics_store_entry_t *entry =
+          metrics_store_add(store, base_metrics[i].type, base_metrics[i].name,
+                            base_metrics[i].help);
+
+        /* Add labels to the entry. */
+        metrics_store_entry_add_label(entry,
+                format_label("onion", service->onion_address));
         metrics_store_entry_add_label(entry,
-                      format_label("port", port_to_str(p->virtual_port)));
+                format_label("port", port_to_str(p->virtual_port)));
       } SMARTLIST_FOREACH_END(p);
+    } else {
+      metrics_store_entry_t *entry =
+        metrics_store_add(store, base_metrics[i].type, base_metrics[i].name,
+                          base_metrics[i].help);
+      metrics_store_entry_add_label(entry,
+              format_label("onion", service->onion_address));
     }
   }
 }




More information about the tor-commits mailing list