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>>
> 

Reply via email to