> On 23. Sep 2020, at 18:25, Richard Ellis <ricel...@uk.ibm.com> wrote:
> 
>> so we should absolutely make this info available in JSON
> 
> This sounds like a good idea to me
> 
>> we could fall back to a ?accept=prometheus option
> 
> I'm opposed to adding endpoints that supply different content-type 
> responses via non-standard means. The CouchDB API has some examples of 
> this through history and it can make using those endpoints with standard 
> tooling somewhat painful.

I don’t suggest making the non-standard approach the only implementation,
we should also accept an Accept header and leave the query string option
as an escape hatch for envs that can’t header.


> 
> A bit of quick searching seems to suggest that the format has its own 
> project https://openmetrics.io/ - and this declares it's text 
> representation linking back to 
> https://prometheus.io/docs/instrumenting/exposition_formats/#text-based-format
>  
> which declares a Content-Type of "text/plain; version=0.0.4" - so 
> defaulting to that, but following Joan's suggestion and switching to JSON 
> for a supplied Accept:application/json in the standard way seems a like 
> good choice to me.
> 
> Rich
> 
> 
> 
> From:   Jan Lehnardt <j...@apache.org>
> To:     dev@couchdb.apache.org
> Cc:     "Gesellchen, Tobias" <tobias.gesellc...@europace.de>
> Date:   23/09/2020 16:42
> Subject:        [EXTERNAL] Re: [DISCUSS] Prometheus endpoint in CouchDB 
> 4.x
> 
> 
> 
> Hi all,
> 
> a few things to consider:
> 
> 1. The idea of unifying our “get runtime info about CouchDB” endpoints 
> into one is solid, as it is always weird to make sure you know which info 
> you get where. We see this specifically in support engagements, where it 
> is always awkward to ask for the results of multiple endpoints.
> 
> 2. This directly leads to the question about what the endpoint should be 
> called. I feel if it is a new endpoint, we should give it a new name. 
> _info maybe, but feel free to bike shed away.
> 
> 3. Next the question about per-node and per-cluster info/metrics/activity 
> on the endpoint. It might be convenient to be able to ask any one node 
> about what is going on in the entire cluster, rather than any one node, 
> but some stats only make sense in the context of a single node. Maybe the 
> result includes everything separated by node somehow.
> 
> 4. Then the format: if this wasn’t about Prometheus and its custom format, 
> we wouldn’t discuss any of this and just use JSON. Since we *do* want to 
> target Prometheus with this, we have to talk about the format. Any of the 
> above is useful for non-Prometheus consumers, so we should absolutely make 
> this info available in JSON. And we can *also* send it in the Prometheus 
> format. The “correct” HTTP-way of doing this would be to use the Accept 
> header on the new endpoint, as Joan points out, but that’s often not an 
> option, so we could fall back to a ?accept=prometheus option. This would 
> also leave us open to add more formats in the future, as new standards 
> arise.
> 
> 5. That leads us to whether we want to do this. Every five or so years, 
> new standards for these types of systems arise, and sometimes it is worth 
> incorporating them (like we finally do with the SystemD compatible log 
> formatter) and sometimes it is not and folks write tools to convert from 
> our HTTP/JSON standard to whatever they need (
> https://github.com/gesellix/couchdb-prometheus-exporter 
> )
> 
> 6. We could also just bundle this exporter (although it is written in Go, 
> which we currently don’t have as a dependency.
> 
> * * *
> 
> Personally, I think the Prometheus format is widely enough used to warrant 
> inclusion, as long as we do it tastefully. I think a new endpoint with an 
> additional ?accept= or similar URL-level override for the format would be 
> a pragmatic, if not entirely *neat* approach. If we can build this all in 
> Erlang, the better, if we wanna shortcut dev time and bundle the Go 
> project, I might be more hesitant. On the per-node-or-per-cluster 
> question, I don’t know enough about the Prometheus format and whether it 
> allows us to send the equivalent of {nodes: { “node1”: {…}, “node2”: {…}, 
> “node3”: {…} }}, or whether it demands per-node output, in which case 
> _active_tasks might get a bit awkward.
> 
> Best
> Jan
> 
> — 
> Professional Support for Apache CouchDB:
> https://neighbourhood.ie/couchdb-support/ 
> 
> 
> 24/7 Observation for your CouchDB Instances:
> https://opservatory.app 
> 
> 
>> On 22. Sep 2020, at 14:55, jiangph <jiangpeng...@hotmail.com> 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 
>> ",
>>   "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
>  
>> 
> 
> 
> 
> 
> 
> Unless stated otherwise above:
> IBM United Kingdom Limited - Registered in England and Wales with number 
> 741598. 
> Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU
> 

Reply via email to