I feel like it could feel weird and inconsistent to introduce a new format here solely to support a third-party tool. Why not add the missing metrics to existing endpoints and let people using prometheus set up an HTTP middleware in the application layer? If there is in built-in support for Prometheus' format, why not support another format as well, this could become messy pretty fast.
23 sept. 2020 11:18:00 jiangph <jiangpeng...@hotmail.com>: > 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>> >