Thanks, Joan for your reply around your vacation.

Good suggestion about the proposed job config for prometheus endpoint. 

I will come up with more details after integrating these valuable suggestions. 

Thanks,
Peng Hui

> On Sep 24, 2020, at 4:35 AM, Joan Touzet <woh...@apache.org> wrote:
> 
> Looking at the Prometheus scrape documentation, you can specify a full URL.
> 
> https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config
> 
> Jan's suggestion of using /_{info|metrics}?accept=prometheus with the default 
> being JSON would be better for CouchDB than the default output being 
> Prometheus, and is a minor change.
> 
> So the job config would look like:
> 
> - job_name: 'couchdb'
>  targets: my-couchdb-host.domain.com:5984
>  metrics_path: /_{info}metrics}
>  params:
>    accept: prometheus
> 
> I would be OK with a first pass only providing this format but I would 
> strongly prefer the JSON version come ASAP, and be the default for the 
> endpoint if no query parameter is passed - unless Prometheus provides 
> something we can use as a unique identifier in the request headers. (If it 
> does you can use that to eliminate the params: line.)
> 
> As I'm on holiday for another 10 days that's about the most I want to think 
> about this right now. Jan has covered my other concerns and discussion should 
> happen in his thread.
> 
> -Joan
> 
> On 23/09/2020 05:17, jiangph 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>>

Reply via email to