From 0e1cb5ff055d80001dc382553b753385fe4b736b Mon Sep 17 00:00:00 2001 From: Matthew Zipkin Date: Tue, 16 Dec 2025 15:18:33 -0500 Subject: [PATCH 1/3] bitcoin-exporter: add counter for lists --- resources/images/exporter/bitcoin-exporter.py | 13 ++++++++++++- test/data/logging/network.yaml | 4 ++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/resources/images/exporter/bitcoin-exporter.py b/resources/images/exporter/bitcoin-exporter.py index 99c992207..653c8b510 100644 --- a/resources/images/exporter/bitcoin-exporter.py +++ b/resources/images/exporter/bitcoin-exporter.py @@ -44,6 +44,12 @@ def make_metric_function(cmd): except Exception: return None +def make_counting_function(cmd, key, value): + try: + return lambda: sum(1 for x in eval(f"rpc.{cmd}") if x.get(key) == value) + except Exception: + return None + # Parse RPC queries into metrics commands = METRICS.split(" ") @@ -53,7 +59,12 @@ def make_metric_function(cmd): label, cmd = labeled_cmd.strip().split("=") # label, description i.e. ("bitcoin_conn_in", "Number of connections in") metric = Gauge(label, cmd) - metric.set_function(make_metric_function(cmd)) + if "COUNT:" in cmd: + _, args = cmd.split(":") + cmd, key, value = args.split(",") + metric.set_function(make_counting_function(cmd, key, value)) + else: + metric.set_function(make_metric_function(cmd)) print(f"Metric created: {labeled_cmd}") # Start the server diff --git a/test/data/logging/network.yaml b/test/data/logging/network.yaml index 067161cae..d08c928b5 100644 --- a/test/data/logging/network.yaml +++ b/test/data/logging/network.yaml @@ -7,9 +7,9 @@ nodes: addnode: - tank-0002 metricsExport: true - metrics: txrate=getchaintxstats(10)["txrate"] + metrics: txrate=getchaintxstats(10)["txrate"] ipv4peers=COUNT:getpeerinfo(),network,ipv4 - name: tank-0002 - addnode: + addnode: - tank-0000 ln: lnd: true From c2c5eb5a3064784ee32ed7165c322433f9a7cc53 Mon Sep 17 00:00:00 2001 From: Matthew Zipkin Date: Tue, 16 Dec 2025 15:39:49 -0500 Subject: [PATCH 2/3] bitcoin-exporter: allow custom scrape interval via helm --- resources/charts/bitcoincore/templates/servicemonitor.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/charts/bitcoincore/templates/servicemonitor.yaml b/resources/charts/bitcoincore/templates/servicemonitor.yaml index 46c7136e0..552b92c30 100644 --- a/resources/charts/bitcoincore/templates/servicemonitor.yaml +++ b/resources/charts/bitcoincore/templates/servicemonitor.yaml @@ -9,6 +9,7 @@ metadata: spec: endpoints: - port: prometheus-metrics + interval: {{ .Values.metricsScrapeInterval | default "15s" }} selector: matchLabels: app: {{ include "bitcoincore.fullname" . }} From 50d7d63d8bb84bd53c7bfd047cd323f289cbe47f Mon Sep 17 00:00:00 2001 From: Matthew Zipkin Date: Mon, 22 Dec 2025 21:50:02 -0500 Subject: [PATCH 3/3] lint --- resources/images/exporter/bitcoin-exporter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/images/exporter/bitcoin-exporter.py b/resources/images/exporter/bitcoin-exporter.py index 653c8b510..e64f90c67 100644 --- a/resources/images/exporter/bitcoin-exporter.py +++ b/resources/images/exporter/bitcoin-exporter.py @@ -44,6 +44,7 @@ def make_metric_function(cmd): except Exception: return None + def make_counting_function(cmd, key, value): try: return lambda: sum(1 for x in eval(f"rpc.{cmd}") if x.get(key) == value)