From 8c3ad2a85b8398dcd008ad03f283ee39ec295168 Mon Sep 17 00:00:00 2001 From: Edil Medeiros Date: Mon, 28 Jul 2025 15:41:23 -0300 Subject: [PATCH 1/6] Change metrics port to 8001 Which is the standard port for Prometheus metrics. --- docker-compose/metrics.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose/metrics.yml b/docker-compose/metrics.yml index a51eae9..1b684b2 100644 --- a/docker-compose/metrics.yml +++ b/docker-compose/metrics.yml @@ -5,9 +5,9 @@ services: context: ../ dockerfile: docker/peer-observer-tools.dockerfile command: - ["/home/appuser/metrics", "--nats-address", "nats://nats:4222", "--metrics-address", "0.0.0.0:8282"] + ["/home/appuser/metrics", "--nats-address", "nats://nats:4222", "--metrics-address", "0.0.0.0:8001"] ports: - - "8282:8282" + - "8001:8001" depends_on: nats: condition: service_healthy From 3da86a68d2dc045edb3958456fb1266b5dcc39c6 Mon Sep 17 00:00:00 2001 From: Edil Medeiros Date: Mon, 28 Jul 2025 15:42:03 -0300 Subject: [PATCH 2/6] Add Prometheus to the metrics profile --- docker-compose.yml | 3 ++- docker-compose/prometheus.yml | 12 ++++++++++++ prometheus/prometheus-config.yml | 7 +++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 docker-compose/prometheus.yml create mode 100644 prometheus/prometheus-config.yml diff --git a/docker-compose.yml b/docker-compose.yml index c06aa0d..7310bec 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,5 +5,6 @@ include: - docker-compose/node.override.regtest.yml - path: docker-compose/logger.yml - path: docker-compose/connectivity-check.yml - - path: docker-compose/metrics.yml - path: docker-compose/websocket.yml + - path: docker-compose/metrics.yml + - path: docker-compose/prometheus.yml diff --git a/docker-compose/prometheus.yml b/docker-compose/prometheus.yml new file mode 100644 index 0000000..76077cb --- /dev/null +++ b/docker-compose/prometheus.yml @@ -0,0 +1,12 @@ +services: + prometheus: + image: prom/prometheus:latest + volumes: + - ../prometheus/prometheus-config.yml:/etc/prometheus/prometheus.yml + command: + - '--config.file=/etc/prometheus/prometheus.yml' + ports: + - "9090:9090" + depends_on: + - metrics + profiles: [monitoring, metrics] diff --git a/prometheus/prometheus-config.yml b/prometheus/prometheus-config.yml new file mode 100644 index 0000000..96395c3 --- /dev/null +++ b/prometheus/prometheus-config.yml @@ -0,0 +1,7 @@ +global: + scrape_interval: 15s + +scrape_configs: + - job_name: 'peer-observer-metrics' + static_configs: + - targets: ['metrics:8001'] From 4446616cd23d558aaa6c0f229246712586d858bb Mon Sep 17 00:00:00 2001 From: Edil Medeiros Date: Mon, 28 Jul 2025 16:51:29 -0300 Subject: [PATCH 3/6] Add Grafana to the metrics pipeline --- .gitignore | 2 + docker-compose.yml | 1 + docker-compose/grafana.yml | 17 ++ grafana/dashboards/messages.json | 365 +++++++++++++++++++++++++++ grafana/provisioning/dashboards.yml | 11 + grafana/provisioning/datasources.yml | 8 + 6 files changed, 404 insertions(+) create mode 100644 docker-compose/grafana.yml create mode 100644 grafana/dashboards/messages.json create mode 100644 grafana/provisioning/dashboards.yml create mode 100644 grafana/provisioning/datasources.yml diff --git a/.gitignore b/.gitignore index e69de29..9b217bb 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,2 @@ +**/.DS_Store +grafana/grafana-data diff --git a/docker-compose.yml b/docker-compose.yml index 7310bec..e089f08 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,3 +8,4 @@ include: - path: docker-compose/websocket.yml - path: docker-compose/metrics.yml - path: docker-compose/prometheus.yml + - path: docker-compose/grafana.yml diff --git a/docker-compose/grafana.yml b/docker-compose/grafana.yml new file mode 100644 index 0000000..512ca79 --- /dev/null +++ b/docker-compose/grafana.yml @@ -0,0 +1,17 @@ +services: + grafana: + image: grafana/grafana:latest + volumes: + - ../grafana/grafana-data:/var/lib/grafana + - ../grafana/provisioning:/etc/grafana/provisioning + ports: + - "3000:3000" + environment: + - GF_SECURITY_ADMIN_USER=admin + - GF_SECURITY_ADMIN_PASSWORD=admin + depends_on: + - prometheus + profiles: [monitoring, metrics] + +volumes: + grafana-data: diff --git a/grafana/dashboards/messages.json b/grafana/dashboards/messages.json new file mode 100644 index 0000000..ec97166 --- /dev/null +++ b/grafana/dashboards/messages.json @@ -0,0 +1,365 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "enable": false, + "expr": "sum(delta(networkobserver_conn_misbehaving[1m]))", + "iconColor": "red", + "name": "restarts" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 4, + "iteration": 1656923942606, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decbytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "repeat": "msg", + "repeatDirection": "v", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "exemplar": true, + "expr": "sum(increase(networkobserver_p2p_message_bytes{message=\"$msg\", direction=\"outbound\"}[1m]))", + "interval": "1m", + "legendFormat": "outbound", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "exemplar": true, + "expr": "sum(-increase(networkobserver_p2p_message_bytes{message=\"$msg\", direction=\"inbound\"}[1m]))", + "hide": false, + "interval": "1m", + "legendFormat": "inbound", + "refId": "B" + } + ], + "title": "bandwidth per minute: $msg", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "msgs" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 23, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "repeat": "msg", + "repeatDirection": "v", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "exemplar": true, + "expr": "sum(increase(networkobserver_p2p_message_count{message=\"$msg\", direction=\"outbound\"}[1m]))", + "interval": "1m", + "legendFormat": "outbound", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "exemplar": true, + "expr": "sum(-increase(networkobserver_p2p_message_count{message=\"$msg\", direction=\"inbound\"}[1m]))", + "hide": false, + "interval": "1m", + "legendFormat": "inbound", + "refId": "B" + } + ], + "title": "messages per minute: $msg", + "type": "timeseries" + } + ], + "refresh": false, + "schemaVersion": 36, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": [ + "addr", + "addrv2", + "alert", + "block", + "blocktxn", + "cmpctblock", + "feefilter", + "filterload", + "getaddr", + "getblocks", + "getblocktxn", + "getdata", + "getheaders", + "headers", + "inv", + "mempool", + "notfound", + "ping", + "pong", + "reject", + "sendaddrv2", + "sendcmpct", + "sendheaders", + "tx", + "verack", + "version", + "wtxidrelay", + "cfcheckpt", + "cfheaders", + "cfilter", + "getcfcheckpt", + "getcfheaders", + "getcfilters", + "merkleblock" + ], + "value": [ + "addr", + "addrv2", + "alert", + "block", + "blocktxn", + "cmpctblock", + "feefilter", + "filterload", + "getaddr", + "getblocks", + "getblocktxn", + "getdata", + "getheaders", + "headers", + "inv", + "mempool", + "notfound", + "ping", + "pong", + "reject", + "sendaddrv2", + "sendcmpct", + "sendheaders", + "tx", + "verack", + "version", + "wtxidrelay", + "cfcheckpt", + "cfheaders", + "cfilter", + "getcfcheckpt", + "getcfheaders", + "getcfilters", + "merkleblock" + ] + }, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "definition": "label_values(message)", + "hide": 0, + "includeAll": true, + "multi": true, + "name": "msg", + "options": [], + "query": { + "query": "label_values(message)", + "refId": "StandardVariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "messages", + "uid": "Q55gTTU7k", + "version": 13, + "weekStart": "" +} diff --git a/grafana/provisioning/dashboards.yml b/grafana/provisioning/dashboards.yml new file mode 100644 index 0000000..a27ae05 --- /dev/null +++ b/grafana/provisioning/dashboards.yml @@ -0,0 +1,11 @@ +apiVersion: 1 + +providers: + - name: 'peer-observer' + orgId: 1 + folder: '' + type: file + disableDeletion: false + editable: true + options: + path: /etc/grafana/provisioning/dashboards diff --git a/grafana/provisioning/datasources.yml b/grafana/provisioning/datasources.yml new file mode 100644 index 0000000..86fd346 --- /dev/null +++ b/grafana/provisioning/datasources.yml @@ -0,0 +1,8 @@ +apiVersion: 1 + +datasources: + - name: Prometheus + type: prometheus + access: proxy + url: http://prometheus:9090 + isDefault: true From 670fafb018c624bf488b68ef7c5dd94faaf5cea9 Mon Sep 17 00:00:00 2001 From: Lucas Faria Date: Wed, 8 Oct 2025 16:26:10 -0300 Subject: [PATCH 4/6] provision dashboards from upstream peer-observer repo --- docker-compose/grafana.yml | 7 +- docker/bitcoin-node-entrypoint.sh | 7 +- docker/grafana.dockerfile | 21 + grafana/dashboards/messages.json | 365 ------------------ .../{ => dashboards}/dashboards.yml | 2 +- .../{ => datasources}/datasources.yml | 0 prometheus/prometheus-config.yml | 2 + 7 files changed, 33 insertions(+), 371 deletions(-) create mode 100644 docker/grafana.dockerfile delete mode 100644 grafana/dashboards/messages.json rename grafana/provisioning/{ => dashboards}/dashboards.yml (75%) rename grafana/provisioning/{ => datasources}/datasources.yml (100%) diff --git a/docker-compose/grafana.yml b/docker-compose/grafana.yml index 512ca79..1b763f2 100644 --- a/docker-compose/grafana.yml +++ b/docker-compose/grafana.yml @@ -1,9 +1,8 @@ services: grafana: - image: grafana/grafana:latest - volumes: - - ../grafana/grafana-data:/var/lib/grafana - - ../grafana/provisioning:/etc/grafana/provisioning + build: + context: .. + dockerfile: docker/grafana.dockerfile ports: - "3000:3000" environment: diff --git a/docker/bitcoin-node-entrypoint.sh b/docker/bitcoin-node-entrypoint.sh index 516a921..4dfe97d 100755 --- a/docker/bitcoin-node-entrypoint.sh +++ b/docker/bitcoin-node-entrypoint.sh @@ -47,4 +47,9 @@ fi echo "Starting ebpf-extractor" # Run ebpf-extractor as root (needs CAP_SYS_ADMIN for BPF) -exec /usr/local/bin/ebpf-extractor --no-idle-exit --nats-address nats://nats:4222 --bitcoind-path $BTC_BIN_PATH/bitcoind +exec /usr/local/bin/ebpf-extractor \ + --no-idle-exit \ + --nats-address nats://nats:4222 \ + --bitcoind-path "$BTC_BIN_PATH/bitcoind" \ + --bitcoind-pid "$BITCOIND_PID" + diff --git a/docker/grafana.dockerfile b/docker/grafana.dockerfile new file mode 100644 index 0000000..a3d0089 --- /dev/null +++ b/docker/grafana.dockerfile @@ -0,0 +1,21 @@ +FROM grafana/grafana:latest + +# Optional argument for deterministic builds +ARG PEER_EXTRACTOR_REPO=https://github.com/0xB10C/peer-observer.git +ARG PEER_EXTRACTOR_BRANCH=master +ARG PEER_EXTRACTOR_COMMIT=87823b767c74e60b23c9a150984c7001d245277b + +USER root +RUN apk add --no-cache git + +# Clone only the needed commit and extract dashboards +RUN git clone -b $PEER_EXTRACTOR_BRANCH --single-branch $PEER_EXTRACTOR_REPO /tmp/peer-observer \ + && cd /tmp/peer-observer \ + && git checkout $PEER_OBSERVER_COMMIT \ + && mkdir -p /etc/grafana/dashboards \ + && cp -r tools/metrics/dashboards/playlist/*.json /etc/grafana/dashboards/ \ + && rm -rf /tmp/peer-observer + +COPY grafana/provisioning /etc/grafana/provisioning + +USER grafana diff --git a/grafana/dashboards/messages.json b/grafana/dashboards/messages.json deleted file mode 100644 index ec97166..0000000 --- a/grafana/dashboards/messages.json +++ /dev/null @@ -1,365 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "enable": false, - "expr": "sum(delta(networkobserver_conn_misbehaving[1m]))", - "iconColor": "red", - "name": "restarts" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 4, - "iteration": 1656923942606, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "bars", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "repeat": "msg", - "repeatDirection": "v", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "exemplar": true, - "expr": "sum(increase(networkobserver_p2p_message_bytes{message=\"$msg\", direction=\"outbound\"}[1m]))", - "interval": "1m", - "legendFormat": "outbound", - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "exemplar": true, - "expr": "sum(-increase(networkobserver_p2p_message_bytes{message=\"$msg\", direction=\"inbound\"}[1m]))", - "hide": false, - "interval": "1m", - "legendFormat": "inbound", - "refId": "B" - } - ], - "title": "bandwidth per minute: $msg", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "bars", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "msgs" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 23, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "repeat": "msg", - "repeatDirection": "v", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "exemplar": true, - "expr": "sum(increase(networkobserver_p2p_message_count{message=\"$msg\", direction=\"outbound\"}[1m]))", - "interval": "1m", - "legendFormat": "outbound", - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "exemplar": true, - "expr": "sum(-increase(networkobserver_p2p_message_count{message=\"$msg\", direction=\"inbound\"}[1m]))", - "hide": false, - "interval": "1m", - "legendFormat": "inbound", - "refId": "B" - } - ], - "title": "messages per minute: $msg", - "type": "timeseries" - } - ], - "refresh": false, - "schemaVersion": 36, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "selected": true, - "text": [ - "addr", - "addrv2", - "alert", - "block", - "blocktxn", - "cmpctblock", - "feefilter", - "filterload", - "getaddr", - "getblocks", - "getblocktxn", - "getdata", - "getheaders", - "headers", - "inv", - "mempool", - "notfound", - "ping", - "pong", - "reject", - "sendaddrv2", - "sendcmpct", - "sendheaders", - "tx", - "verack", - "version", - "wtxidrelay", - "cfcheckpt", - "cfheaders", - "cfilter", - "getcfcheckpt", - "getcfheaders", - "getcfilters", - "merkleblock" - ], - "value": [ - "addr", - "addrv2", - "alert", - "block", - "blocktxn", - "cmpctblock", - "feefilter", - "filterload", - "getaddr", - "getblocks", - "getblocktxn", - "getdata", - "getheaders", - "headers", - "inv", - "mempool", - "notfound", - "ping", - "pong", - "reject", - "sendaddrv2", - "sendcmpct", - "sendheaders", - "tx", - "verack", - "version", - "wtxidrelay", - "cfcheckpt", - "cfheaders", - "cfilter", - "getcfcheckpt", - "getcfheaders", - "getcfilters", - "merkleblock" - ] - }, - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "definition": "label_values(message)", - "hide": 0, - "includeAll": true, - "multi": true, - "name": "msg", - "options": [], - "query": { - "query": "label_values(message)", - "refId": "StandardVariableQuery" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "messages", - "uid": "Q55gTTU7k", - "version": 13, - "weekStart": "" -} diff --git a/grafana/provisioning/dashboards.yml b/grafana/provisioning/dashboards/dashboards.yml similarity index 75% rename from grafana/provisioning/dashboards.yml rename to grafana/provisioning/dashboards/dashboards.yml index a27ae05..a7eaed9 100644 --- a/grafana/provisioning/dashboards.yml +++ b/grafana/provisioning/dashboards/dashboards.yml @@ -8,4 +8,4 @@ providers: disableDeletion: false editable: true options: - path: /etc/grafana/provisioning/dashboards + path: /etc/grafana/dashboards diff --git a/grafana/provisioning/datasources.yml b/grafana/provisioning/datasources/datasources.yml similarity index 100% rename from grafana/provisioning/datasources.yml rename to grafana/provisioning/datasources/datasources.yml diff --git a/prometheus/prometheus-config.yml b/prometheus/prometheus-config.yml index 96395c3..8353f8c 100644 --- a/prometheus/prometheus-config.yml +++ b/prometheus/prometheus-config.yml @@ -5,3 +5,5 @@ scrape_configs: - job_name: 'peer-observer-metrics' static_configs: - targets: ['metrics:8001'] + labels: + host: node1 From 099b394a068ba6f64f3aca249cee73ee778e5c2a Mon Sep 17 00:00:00 2001 From: Lucas Faria Date: Thu, 9 Oct 2025 02:21:32 -0300 Subject: [PATCH 5/6] add grafana and prometheus to docs --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0198908..795fcf3 100644 --- a/README.md +++ b/README.md @@ -82,9 +82,11 @@ You should now have three containers. |--------------------|------------|---------------------------| | Bitcoin Node | 8332, 8333 | Bitcoin RPC and P2P ports | | NATS | 4222 | Message broker | -| Metrics | 8282 | Metrics HTTP endpoint | +| Metrics | 8001 | Metrics HTTP endpoint | | WebSocket | 47482 | Real-time data WebSocket | | Connectivity Check | 18282 | Connectivity metrics | +| Prometheus | 9090 | Datasource for Grafana | +| Grafana | 3000 | Data visualization | ## Usage @@ -99,9 +101,11 @@ docker compose logs -f bitcoin-node Once all services are running: -- **Metrics**: `http://localhost:8282` +- **Metrics**: `http://localhost:8001` - **Connectivity Metrics**: `http://localhost:18282` - **WebSocket Connection**: `ws://localhost:47482` +- **Prometheus**: `http://localhost:9090` +- **Grafana**: `http://localhost:3000`, username: `admin`, password: `admin` ### Stopping Services From ed4e915bd1caa43a595af0f3811a7e9aefeb1a9a Mon Sep 17 00:00:00 2001 From: Lucas Faria Date: Thu, 6 Nov 2025 16:31:26 -0300 Subject: [PATCH 6/6] fix: add uid to prometheus config --- docker-compose/nats.yml | 1 + .../provisioning/dashboards/{dashboards.yml => dashboard.yml} | 0 .../datasources/{datasources.yml => datasource.yml} | 3 ++- prometheus/prometheus-config.yml | 4 ++-- 4 files changed, 5 insertions(+), 3 deletions(-) rename grafana/provisioning/dashboards/{dashboards.yml => dashboard.yml} (100%) rename grafana/provisioning/datasources/{datasources.yml => datasource.yml} (72%) diff --git a/docker-compose/nats.yml b/docker-compose/nats.yml index a75e355..9b18f5a 100644 --- a/docker-compose/nats.yml +++ b/docker-compose/nats.yml @@ -5,6 +5,7 @@ services: dockerfile: docker/nats.dockerfile ports: - "4222:4222" + - "8222:8222" healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://localhost:8222/healthz"] interval: 1m diff --git a/grafana/provisioning/dashboards/dashboards.yml b/grafana/provisioning/dashboards/dashboard.yml similarity index 100% rename from grafana/provisioning/dashboards/dashboards.yml rename to grafana/provisioning/dashboards/dashboard.yml diff --git a/grafana/provisioning/datasources/datasources.yml b/grafana/provisioning/datasources/datasource.yml similarity index 72% rename from grafana/provisioning/datasources/datasources.yml rename to grafana/provisioning/datasources/datasource.yml index 86fd346..de21a25 100644 --- a/grafana/provisioning/datasources/datasources.yml +++ b/grafana/provisioning/datasources/datasource.yml @@ -5,4 +5,5 @@ datasources: type: prometheus access: proxy url: http://prometheus:9090 - isDefault: true + uid: P1809F7CD0C75ACF3 + isDefault: true \ No newline at end of file diff --git a/prometheus/prometheus-config.yml b/prometheus/prometheus-config.yml index 8353f8c..4aa089e 100644 --- a/prometheus/prometheus-config.yml +++ b/prometheus/prometheus-config.yml @@ -2,8 +2,8 @@ global: scrape_interval: 15s scrape_configs: - - job_name: 'peer-observer-metrics' + - job_name: 'metrics' static_configs: - targets: ['metrics:8001'] labels: - host: node1 + host: bitcoin-node