mirror of
https://github.com/cirocosta/monero-exporter.git
synced 2024-10-01 08:25:41 -04:00
4678d131ad
Signed-off-by: Ciro S. Costa <utxobr@protonmail.com>
339 lines
12 KiB
Markdown
339 lines
12 KiB
Markdown
# monero-exporter
|
|
|
|
[prometheus] exporter for [monero] nodes.
|
|
|
|
|
|
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
|
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
|
|
|
|
|
- [About](#about)
|
|
- [Installation](#installation)
|
|
- [Grafana](#grafana)
|
|
- [Example](#example)
|
|
- [Metrics](#metrics)
|
|
- [Last block](#last-block)
|
|
- [Transaction pool](#transaction-pool)
|
|
- [RPC](#rpc)
|
|
- [P2P Connections](#p2p-connections)
|
|
- [Peerlist](#peerlist)
|
|
- [Net Stats](#net-stats)
|
|
- [Info](#info)
|
|
- [License](#license)
|
|
- [Donate](#donate)
|
|
|
|
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
|
|
|
## About
|
|
|
|
`monero-exporter` is a single multiplatform binary that extracts metrics out of
|
|
a running [monero] node, allowing one to better observe the state of its own
|
|
daemon and the network as seen by it.
|
|
|
|
```console
|
|
$ monero-exporter --help
|
|
|
|
Prometheus exporter for monero metrics
|
|
|
|
Usage:
|
|
monero-exporter [flags]
|
|
|
|
Available Commands:
|
|
completion generate the autocompletion script for the specified shell
|
|
help Help about any command
|
|
version print the version of this CLI
|
|
|
|
Flags:
|
|
--bind-addr string address to bind the prometheus server to
|
|
(default ":9090")
|
|
--geoip-filepath string filepath of a geoip database file for ip to
|
|
country resolution
|
|
-h, --help help for monero-exporter
|
|
--monero-addr string address of the monero instance to collect info
|
|
from (default "http://localhost:18081")
|
|
--telemetry-path string endpoint at which prometheus metrics are served
|
|
(default "/metrics")
|
|
|
|
Use "monero-exporter [command] --help" for more information about a command.
|
|
```
|
|
|
|
It works by issuing remote procedure calls (RPC) to a monero node and based on
|
|
the responses it gets, exposing metrics to a Prometheus server querying
|
|
`monero-exporter`.
|
|
|
|
|
|
```
|
|
|
|
PROMETHEUS ---- get /metrics -->---.
|
|
^ |
|
|
| |
|
|
| MONERO-EXPORTER --- get /jsonrpc --> MONEROD
|
|
| |
|
|
| |
|
|
'-------------<-- samples ------'
|
|
|
|
```
|
|
|
|
Typically, `monero-exporter` is just one piece of the stack though. A complete
|
|
setup usually looks like:
|
|
|
|
- `monerod`, the monero daemon, is running exposing its daemon RPC for those
|
|
interested in it (see [monero-project/monero])
|
|
- `monero-exporter` targets that `monerod` RPC port
|
|
- [prometheus], configured to scrape `monero-exporter`, asks it for metric
|
|
samples, then stores those in its internal timeseries database
|
|
- [grafana] then queries that timeseries data using the [promql], displaying
|
|
that in dashboards, alerting on thresholds, etc
|
|
|
|
|
|
```
|
|
|
|
(ui) GRAFANA
|
|
.
|
|
.
|
|
queries ..every dashboard refresh interval..
|
|
.
|
|
.
|
|
.
|
|
(ts db) PROMETHEUS --- scrape ->-. ..every scrape interval..
|
|
^ |
|
|
| |
|
|
| |
|
|
(exporter) '--------------MONERO-EXPORTER
|
|
.
|
|
...... rpc ......... ..on scrape..
|
|
.
|
|
.
|
|
(daemon) MONEROD
|
|
|
|
```
|
|
|
|
|
|
|
|
## Installation
|
|
|
|
You can either install it by using [Go], building the latest tagged release
|
|
from scratch
|
|
|
|
```bash
|
|
GO111MODULE=on \
|
|
go get github.com/cirocosta/monero-exporter/cmd/monero-exporter
|
|
```
|
|
|
|
or fetching the binary for your corresponding distribution from the [releases
|
|
page].
|
|
|
|
See [INSTALL.md] for details and examples.
|
|
|
|
|
|
## Grafana
|
|
|
|
This repository includes a sample dashboard that makes use of the metrics
|
|
exposed via this exporter (see [./grafana](./grafana)).
|
|
|
|
Some screenshots of it:
|
|
|
|
![](./.github/assets/grafana-transaction-pool.png)
|
|
![](./.github/assets/grafana-last-block.png)
|
|
![](./.github/assets/grafana-networking.png)
|
|
![](./.github/assets/grafana-rpc.png)
|
|
|
|
_ps.: DO NOT publicly run the example Grafana setup without tweaking the
|
|
configuration - it is way more permissive than you'd want a Grafana instance
|
|
to be._
|
|
|
|
|
|
## Example
|
|
|
|
Under [./examples](./examples) you'll find a setup that makes use of
|
|
[docker-compose] to bring up Prometheus, Grafana, and monero-exporter
|
|
targetting an already running monero daemon (see
|
|
[docker-compose.yaml](./examples/docker-compose.yaml)).
|
|
|
|
To run it, make sure you have `docker` and `docker-compose` installed. That
|
|
done, run:
|
|
|
|
```bash
|
|
# get inside the examples directory
|
|
#
|
|
cd ./examples
|
|
|
|
|
|
# brings the services (monerod, monero-exporter, grafana, and prometheus) up
|
|
# in the background
|
|
#
|
|
docker-compose up -d
|
|
|
|
|
|
# follow the logs from those services
|
|
#
|
|
docker-compose logs -f
|
|
```
|
|
|
|
|
|
## Metrics
|
|
|
|
Below you'll find the description of the metrics exposed by `monero-exporter`
|
|
that are retrieved by a prometheus server, stored in its timeseries database,
|
|
and made available for querying by something like Grafana.
|
|
|
|
Keep in mind that Prometheus gather metrics in a pull-based fashion (see ["Why
|
|
do you pull rather than push?"]), and as such, metric samples are based on
|
|
information seen at the time that prometheus reached out to the exporter.
|
|
|
|
While the pull-based approach is very useful for looking at long timeframes and
|
|
large number of hosts, it's not very suitable for realtime data (for that,
|
|
consider other implementations for push-based systems like [InfluxDB]).
|
|
|
|
|
|
### Last block
|
|
|
|
This set of metrics is extracted from information gathered regarding the last
|
|
block seen by the node at the moment that Prometheus scraped samples from
|
|
`monero-exporter`.
|
|
|
|
Think of it as _"at time X, when I looked at the last block, these were the
|
|
pieces of information I could gather from it"_, which when looked at over time
|
|
(say, 30d), gives you a pretty good picture of what "all" (more like, _most_)
|
|
blocks looked like as long as the interval between those scrapes where short
|
|
enough (i.e., in between the mean time for a block to be mined - 2min as of
|
|
today).
|
|
|
|
|
|
| name | description |
|
|
| ---- | ----------- |
|
|
| monero_lastblock_difficulty | difficulty used for the last block |
|
|
| monero_lastblock_fees_micronero_per_kb | distribution of the feeperkb utilized for txns |
|
|
| monero_lastblock_fees_monero | total amount of fees included in this block |
|
|
| monero_lastblock_height | height of the last block |
|
|
| monero_lastblock_reward_monero | total amount of rewards granted in the last block (subsidy + fees) |
|
|
| monero_lastblock_size_bytes | total size of the last block |
|
|
| monero_lastblock_subsidy_monero | newly minted monero for this block |
|
|
| monero_lastblock_transactions | number of transactions seen in the last block |
|
|
| monero_lastblock_transactions_inputs | distribution of inputs in the last block |
|
|
| monero_lastblock_transactions_outputs | distribution of outputs in the last block |
|
|
| monero_lastblock_transactions_size_bytes | distribution of the size of the transactions included |
|
|
|
|
|
|
|
|
### Transaction pool
|
|
|
|
These metrics give you a view of how the transaction pool of this particular
|
|
node looked like when Prometheus asked the exporter information about it.
|
|
|
|
Given the pull-based nature of Prometheus, this will be only as granular as the
|
|
frequency of scraping configured for it.
|
|
|
|
|
|
| name | description |
|
|
| ---- | ----------- |
|
|
| monero_transaction_pool_double_spends | transactions doubly spending outputs |
|
|
| monero_transaction_pool_failing_transactions | number of transactions that are marked as failing |
|
|
| monero_transaction_pool_fees_micronero_per_kb | distribution of the feeperkb utilized for txns in the pool |
|
|
| monero_transaction_pool_fees_monero | total amount of fee being spent in the transaction pool |
|
|
| monero_transaction_pool_not_relayed | number of transactions that have not been relayed |
|
|
| monero_transaction_pool_older_than_10m | number of transactions that are older than 10m |
|
|
| monero_transaction_pool_size_bytes | total size of the transaction pool |
|
|
| monero_transaction_pool_spent_key_images | total number of key images spent across all transactions in the pool |
|
|
| monero_transaction_pool_transactions | number of transactions in the pool at the moment of the scrape |
|
|
| monero_transaction_pool_transactions_age | distribution of for how long transactions have been in the pool |
|
|
| monero_transaction_pool_transactions_inputs | distribution of inputs in the pool |
|
|
| monero_transaction_pool_transactions_outputs | distribution of outputs in the pool |
|
|
| monero_transaction_pool_transactions_size_bytes | distribution of the size of the transactions in the transaction pool |
|
|
|
|
|
|
### RPC
|
|
|
|
RPC metrics provide an overview of the usage of the RPC endpoints.
|
|
|
|
Note that `monerod` does not distinguish between `monero-exporter` and other
|
|
users (like, a wallet), which means that these metrics will include the
|
|
constant querying that `monero-exporter` performs to fetch statistics.
|
|
|
|
|
|
| name | description |
|
|
| ---- | ----------- |
|
|
| monero_rpc_hits_total | number of hits that a particular rpc method had since startup |
|
|
| monero_rpc_seconds_total | amount of time spent service the method since startup |
|
|
|
|
|
|
### P2P Connections
|
|
|
|
Connection metrics aim at providing information about peers that are fully
|
|
connected to the node (thus, transmitting and receiving data to/from our node).
|
|
|
|
|
|
| name | description |
|
|
| ---- | ----------- |
|
|
| monero_p2p_connections | number of connections to/from this node |
|
|
| monero_p2p_connections_age | distribution of age of the connections we have |
|
|
| monero_p2p_connections_height | distribution the height of the peers connected to/from us |
|
|
| monero_p2p_connections_rx_rate_bps | distribution of data receive rate in bytes/s |
|
|
| monero_p2p_connections_tx_rate_bps | distribution of data transmit rate in bytes/s |
|
|
|
|
|
|
### Peerlist
|
|
|
|
The monero daemon internally keeps track of potential peers to connect to
|
|
called peerlists, divided in anchor, white, and gray.
|
|
|
|
|
|
| name | description |
|
|
| ---- | ----------- |
|
|
| monero_peerlist | number of node entries in the peerlist |
|
|
| monero_peerlist_lastseen | distribution of when our peers have been seen |
|
|
|
|
|
|
### Net Stats
|
|
|
|
Aggregated network statistics, not specific to P2P or RPC.
|
|
|
|
| name | description |
|
|
| ---- | ----------- |
|
|
| monero_net_rx_bytes | number of bytes received by this node |
|
|
| monero_net_tx_bytes | number of bytes received by this node |
|
|
|
|
|
|
### Info
|
|
|
|
General information about this node.
|
|
|
|
| name | description |
|
|
| ---- | ----------- |
|
|
| monero_info_alternative_blocks | number of blocks alternative to the longest |
|
|
| monero_info_block_size_limit_bytes | maximum hard limit of a block |
|
|
| monero_info_block_size_median_bytes | current median size for computing dynamic fees |
|
|
| monero_info_height | current height of the chain |
|
|
| monero_info_mainnet | whether the node is connected to mainnet |
|
|
| monero_info_offline | whether the node is offline |
|
|
| monero_info_rpc_connections | number of rpc connections being served by the node |
|
|
| monero_info_synchronized | whether the node's chain is in sync with the network|
|
|
| monero_info_target_height | target height to achieve to be considered in sync |
|
|
| monero_info_uptime_seconds_total | for how long this node has been up |
|
|
| monero_info_database_size_bytes | size of the monero database |
|
|
| monero_info_free_space_bytes | amount of free space in the partition where monero's database is in |
|
|
|
|
## License
|
|
|
|
See [LICENSE](./LICENSE).
|
|
|
|
|
|
## Donate
|
|
|
|
![donation qrcode]
|
|
|
|
891B5keCnwXN14hA9FoAzGFtaWmcuLjTDT5aRTp65juBLkbNpEhLNfgcBn6aWdGuBqBnSThqMPsGRjWVQadCrhoAT6CnSL3
|
|
|
|
["Why do you pull rather than push?"]: https://prometheus.io/docs/introduction/faq/#why-do-you-pull-rather-than-push
|
|
[Go]: https://golang.org/
|
|
[INSTALL.md]: ./INSTALL.md
|
|
[InfluxDB]: https://github.com/influxdata/influxdb
|
|
[donation qrcode]: ./.github/assets/donate.png
|
|
[grafana]: https://github.com/grafana/grafana
|
|
[monero-project/monero]: https://github.com/monero-project/monero
|
|
[monero]: https://github.com/monero-project/monero
|
|
[prometheus]: https://prometheus.io
|
|
[promql]: https://prometheus.io/docs/prometheus/latest/querying/basics/
|
|
[releases page]: https://github.com/cirocosta/monero-exporter/releases
|
|
[docker-compose]: https://docs.docker.com/compose/
|