Thanks Peng Hui, Garren. I can definitely see value in having metrics exposed in Prometheus format.
One aspect I'm unclear about is what _active_tasks metrics would represent. My expectation is that /_metrics would be scoped to a node (and then leave the aggregation across nodes to Prometheus or similar), whereas _active_tasks is scoped to a cluster. What are your thoughts? On Wed, 23 Sep 2020 at 10:18, jiangph <jiangpeng...@hotmail.com> wrote: > Thanks Joan for your quick response and suggestion. As we can see, JSON > is not the standard Prometheus format for _metrics endpoint. In order to be > compatible with many monitoring tools, what about going with Prometheus > standard format first and we may add JSON format support later? > > Best regards, > Peng Hui > > > On Sep 23, 2020, at 9:41 AM, Joan Touzet <woh...@apache.org> wrote: > > > > I like this, but not at the expense of JSON output. It would be the only > new API surface for CouchDB that isn't JSON-based, and there needs to be > excellent justification for such. Prometheus is well-known enough to be > supported, but we should continue to put out JSON stats for the foreseeable > future. > > > > I know that Prometheus can't send a header, but sending an accepts > application/json to /_metrics and having it send back the same data as > Prometheus, but in JSON, would be lovely. If you feel up to it :) > > > > -Joan "on vacation" Touzet > > > > On 2020-09-22 8:55 a.m., jiangph wrote: > >> 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 > >> > >