Commit f4aa985c authored by David Goulet's avatar David Goulet 🐼
Browse files

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's avatarDavid Goulet <dgoulet@torproject.org>
parent 1c3cefe2
Loading
Loading
Loading
Loading

changes/ticket40581

0 → 100644
+4 −0
Original line number Diff line number Diff line
  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.
+14 −7
Original line number Diff line number Diff line
@@ -43,6 +43,10 @@ init_store(hs_service_t *service)
  store = service->metrics.store;

  for (size_t i = 0; i < base_metrics_size; ++i) {
    /* 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 hs_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);
@@ -50,12 +54,15 @@ init_store(hs_service_t *service)
        /* Add labels to the entry. */
        metrics_store_entry_add_label(entry,
                metrics_format_label("onion", service->onion_address));
    if (base_metrics[i].port_as_label && service->config.ports) {
      SMARTLIST_FOREACH_BEGIN(service->config.ports,
                              const hs_port_config_t *, p) {
        metrics_store_entry_add_label(entry,
                metrics_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,
              metrics_format_label("onion", service->onion_address));
    }
  }
}