Hey all,
We would like to add a Prometheus metrics endpoint for CouchDB and wanted to
see if the community would be interested in us contributing this to CouchDB 4.x.
Prometheus is a CNCF open-source project and the Prometheus metrics endpoint
format is supported by many monitoring tools. Its data model is based around
having a metric name which then contains a label name and a label value:
<metric name>{<label name>=<label value>, ...}
And it supports the Counter, Gauge, Histogram, and Summary metric types.
The idea for the new Prometheus endpoint, /_metrics, would be that the endpoint
is a consolidation of the _stats [1], _system [2], and _active_tasks [3]
endpoints.
For _stats and _system, the conversion from JSON to Prometheus-based format
seems to be straightforward.
JSON format:
{
"value": {
"min": 0,
"max": 0,
"arithmetic_mean": 0,
"geometric_mean": 0,
"harmonic_mean": 0,
"median": 0,
"variance": 0,
"standard_deviation": 0,
...
"percentile": [
[
50,
0
],
[
75,
0
],
[
90,
0
],
[
95,
0
],
[
99,
0
],
[
999,
0
]
],
"histogram": [
[
0,
0
]
],
}
Prometheus-based format:
couchdb_stats{value="min"} 0
couchdb_stats{value="max"} 0
couchdb_stats{value="percentile50"} 0
couchdb_stats{value="percentile75"} 0
couchdb_stats{value="percentile95"} 0
For _active_tasks, the change will be a bit more complicated, and some fields
will be added to labels and tags.
JSON format:
{
"checkpointed_source_seq": 68585,
"continuous": false,
"doc_id": null,
"doc_write_failures": 0,
"docs_read": 4524,
"docs_written": 4524,
"missing_revisions_found": 4524,
"pid": "<0.1538.5>",
"progress": 44,
"replication_id": "9bc1727d74d49d9e157e260bb8bbd1d5",
"revisions_checked": 4524,
"source": "mailbox",
"source_seq": 154419,
"started_on": 1376116644,
"target": "http://mailsrv:5984/mailbox <http://mailsrv:5984/mailbox>
<http://mailsrv:5984/mailbox <http://mailsrv:5984/mailbox>>",
"type": "replication",
"updated_on": 1376116651
}
Prometheus-based would look something like:
format:couchdb_active_task{type="replication", source="mailbox", target="http://mailsrv:5984/mailbox
<http://mailsrv:5984/mailbox> <http://mailsrv:5984/mailbox <http://mailsrv:5984/mailbox>>", docs_count =
"docs_read"} 4524
couchdb_active_task{type="replication", source="mailbox", target="http://mailsrv:5984/mailbox
<http://mailsrv:5984/mailbox> <http://mailsrv:5984/mailbox <http://mailsrv:5984/mailbox>>", docs_count =
"docs_written"} 4524
couchdb_active_task{type="replication", source="mailbox", target="http://mailsrv:5984/mailbox
<http://mailsrv:5984/mailbox> <http://mailsrv:5984/mailbox <http://mailsrv:5984/mailbox>>", docs_count =
"missing_revisions_found"} 4524
Best regards,
Garren Smith
Peng Hui Jiang
[1] https://docs.couchdb.org/en/latest/api/server/common.html#node-node-name-stats
<https://docs.couchdb.org/en/latest/api/server/common.html#node-node-name-stats>
<https://docs.couchdb.org/en/latest/api/server/common.html#node-node-name-stats
<https://docs.couchdb.org/en/latest/api/server/common.html#node-node-name-stats>>
[2] https://docs.couchdb.org/en/latest/api/server/common.html#active-tasks
<https://docs.couchdb.org/en/latest/api/server/common.html#active-tasks>
<https://docs.couchdb.org/en/latest/api/server/common.html#active-tasks
<https://docs.couchdb.org/en/latest/api/server/common.html#active-tasks>>
[3] https://docs.couchdb.org/en/latest/api/server/common.html#node-node-name-system
<https://docs.couchdb.org/en/latest/api/server/common.html#node-node-name-system>
<https://docs.couchdb.org/en/latest/api/server/common.html#node-node-name-system
<https://docs.couchdb.org/en/latest/api/server/common.html#node-node-name-system>>