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>",
    "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>", docs_count 
= "docs_read"} 4524
couchdb_active_task{type="replication", source="mailbox", 
target="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>", 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>
[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>
[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>

Reply via email to