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/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 diff --git a/docker-compose.yml b/docker-compose.yml index c06aa0d..e089f08 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,5 +5,7 @@ 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 + - path: docker-compose/grafana.yml diff --git a/docker-compose/grafana.yml b/docker-compose/grafana.yml new file mode 100644 index 0000000..1b763f2 --- /dev/null +++ b/docker-compose/grafana.yml @@ -0,0 +1,16 @@ +services: + grafana: + build: + context: .. + dockerfile: docker/grafana.dockerfile + 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/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 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/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/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/provisioning/dashboards/dashboard.yml b/grafana/provisioning/dashboards/dashboard.yml new file mode 100644 index 0000000..a7eaed9 --- /dev/null +++ b/grafana/provisioning/dashboards/dashboard.yml @@ -0,0 +1,11 @@ +apiVersion: 1 + +providers: + - name: 'peer-observer' + orgId: 1 + folder: '' + type: file + disableDeletion: false + editable: true + options: + path: /etc/grafana/dashboards diff --git a/grafana/provisioning/datasources/datasource.yml b/grafana/provisioning/datasources/datasource.yml new file mode 100644 index 0000000..de21a25 --- /dev/null +++ b/grafana/provisioning/datasources/datasource.yml @@ -0,0 +1,9 @@ +apiVersion: 1 + +datasources: + - name: Prometheus + type: prometheus + access: proxy + url: http://prometheus:9090 + uid: P1809F7CD0C75ACF3 + isDefault: true \ No newline at end of file diff --git a/prometheus/prometheus-config.yml b/prometheus/prometheus-config.yml new file mode 100644 index 0000000..4aa089e --- /dev/null +++ b/prometheus/prometheus-config.yml @@ -0,0 +1,9 @@ +global: + scrape_interval: 15s + +scrape_configs: + - job_name: 'metrics' + static_configs: + - targets: ['metrics:8001'] + labels: + host: bitcoin-node