%% Licensed under the Apache License, Version 2.0 (the "License"); you may not
%% use this file except in compliance with the License. You may obtain a copy of
%% the License at
%%
%%   http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
%% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
%% License for the specific language governing permissions and limitations under
%% the License.

% Style guide for descriptions: Start with a lowercase letter & do not add
% a trailing full-stop / period
% Please keep this in alphabetical order

{[couchdb, auth_cache_hits], [
    {type, counter},
    {desc, <<"number of authentication cache hits">>}
]}.
{[couchdb, auth_cache_misses], [
    {type, counter},
    {desc, <<"number of authentication cache misses">>}
]}.
{[couchdb, collect_results_time], [
    {type, histogram},
    {desc, <<"microsecond latency for calls to couch_db:collect_results/3">>}
]}.
{[couchdb, database_writes], [
    {type, counter},
    {desc, <<"number of times a database was changed">>}
]}.
{[couchdb, database_reads], [
    {type, counter},
    {desc, <<"number of times a document was read from a database">>}
]}.
{[couchdb, db_open_time], [
    {type, histogram},
    {desc, <<"milliseconds required to open a database">>}
]}.
{[couchdb, document_inserts], [
    {type, counter},
    {desc, <<"number of documents inserted">>}
]}.
{[couchdb, document_writes], [
    {type, counter},
    {desc, <<"number of document write operations">>}
]}.
{[couchdb, local_document_writes], [
    {type, counter},
    {desc, <<"number of _local document write operations">>}
]}.
{[couchdb, httpd, bulk_requests], [
    {type, counter},
    {desc, <<"number of bulk requests">>}
]}.
{[couchdb, httpd, requests], [
    {type, counter},
    {desc, <<"number of HTTP requests">>}
]}.
{[couchdb, httpd, temporary_view_reads], [
    {type, counter},
    {desc, <<"number of temporary view reads">>}
]}.
{[couchdb, httpd, view_reads], [
    {type, counter},
    {desc, <<"number of view reads">>}
]}.
{[couchdb, httpd, clients_requesting_changes], [
    {type, counter},
    {desc, <<"number of clients for continuous _changes">>}
]}.
{[couchdb, httpd_request_methods, 'COPY'], [
    {type, counter},
    {desc, <<"number of HTTP COPY requests">>}
]}.
{[couchdb, httpd_request_methods, 'DELETE'], [
    {type, counter},
    {desc, <<"number of HTTP DELETE requests">>}
]}.
{[couchdb, httpd_request_methods, 'GET'], [
    {type, counter},
    {desc, <<"number of HTTP GET requests">>}
]}.
{[couchdb, httpd_request_methods, 'HEAD'], [
    {type, counter},
    {desc, <<"number of HTTP HEAD requests">>}
]}.
{[couchdb, httpd_request_methods, 'POST'], [
    {type, counter},
    {desc, <<"number of HTTP POST requests">>}
]}.
{[couchdb, httpd_request_methods, 'PUT'], [
    {type, counter},
    {desc, <<"number of HTTP PUT requests">>}
]}.
{[couchdb, httpd_status_codes, 200], [
    {type, counter},
    {desc, <<"number of HTTP 200 OK responses">>}
]}.
{[couchdb, httpd_status_codes, 201], [
    {type, counter},
    {desc, <<"number of HTTP 201 Created responses">>}
]}.
{[couchdb, httpd_status_codes, 202], [
    {type, counter},
    {desc, <<"number of HTTP 202 Accepted responses">>}
]}.
{[couchdb, httpd_status_codes, 301], [
    {type, counter},
    {desc, <<"number of HTTP 301 Moved Permanently responses">>}
]}.
{[couchdb, httpd_status_codes, 302], [
    {type, counter},
    {desc, <<"number of HTTP 302 Found responses">>}
]}.
{[couchdb, httpd_status_codes, 304], [
    {type, counter},
    {desc, <<"number of HTTP 304 Not Modified responses">>}
]}.
{[couchdb, httpd_status_codes, 400], [
    {type, counter},
    {desc, <<"number of HTTP 400 Bad Request responses">>}
]}.
{[couchdb, httpd_status_codes, 401], [
    {type, counter},
    {desc, <<"number of HTTP 401 Unauthorized responses">>}
]}.
{[couchdb, httpd_status_codes, 403], [
    {type, counter},
    {desc, <<"number of HTTP 403 Forbidden responses">>}
]}.
{[couchdb, httpd_status_codes, 404], [
    {type, counter},
    {desc, <<"number of HTTP 404 Not Found responses">>}
]}.
{[couchdb, httpd_status_codes, 405], [
    {type, counter},
    {desc, <<"number of HTTP 405 Method Not Allowed responses">>}
]}.
{[couchdb, httpd_status_codes, 409], [
    {type, counter},
    {desc, <<"number of HTTP 409 Conflict responses">>}
]}.
{[couchdb, httpd_status_codes, 412], [
    {type, counter},
    {desc, <<"number of HTTP 412 Precondition Failed responses">>}
]}.
{[couchdb, httpd_status_codes, 413], [
    {type, counter},
    {desc, <<"number of HTTP 413 Request Entity Too Long responses">>}
]}.
{[couchdb, httpd_status_codes, 414], [
    {type, counter},
    {desc, <<"number of HTTP 414 Request URI Too Long responses">>}
]}.
{[couchdb, httpd_status_codes, 415], [
    {type, counter},
    {desc, <<"number of HTTP 415 Unsupported Media Type responses">>}
]}.
{[couchdb, httpd_status_codes, 416], [
    {type, counter},
    {desc, <<"number of HTTP 416 Requested Range Not Satisfiable responses">>}
]}.
{[couchdb, httpd_status_codes, 500], [
    {type, counter},
    {desc, <<"number of HTTP 500 Internal Server Error responses">>}
]}.
{[couchdb, open_databases], [
    {type, counter},
    {desc,  <<"number of open databases">>}
]}.
{[couchdb, open_os_files], [
    {type, counter},
    {desc, <<"number of file descriptors CouchDB has open">>}
]}.
{[couchdb, request_time], [
    {type, histogram},
    {desc, <<"length of a request inside CouchDB without MochiWeb">>}
]}.
{[couchdb, couch_server, lru_skip], [
    {type, counter},
    {desc, <<"number of couch_server LRU operations skipped">>}
]}.
