%% 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, database_writes, "number of times a database was changed"}.
{couchdb, database_reads, "number of times a document was read from a database"}.
{couchdb, open_databases, "number of open databases"}.
{couchdb, open_os_files, "number of file descriptors CouchDB has open"}.
{couchdb, request_time, "length of a request inside CouchDB without MochiWeb"}.
{couchdb, auth_cache_hits, "number of authentication cache hits"}.
{couchdb, auth_cache_misses, "number of authentication cache misses"}.

{httpd, bulk_requests, "number of bulk requests"}.
{httpd, requests, "number of HTTP requests"}.
{httpd, temporary_view_reads, "number of temporary view reads"}.
{httpd, view_reads, "number of view reads"}.
{httpd, clients_requesting_changes, "number of clients for continuous _changes"}.

{httpd_request_methods, 'COPY', "number of HTTP COPY requests"}.
{httpd_request_methods, 'DELETE', "number of HTTP DELETE requests"}.
{httpd_request_methods, 'GET', "number of HTTP GET requests"}.
{httpd_request_methods, 'HEAD', "number of HTTP HEAD requests"}.
{httpd_request_methods, 'POST', "number of HTTP POST requests"}.
{httpd_request_methods, 'PUT', "number of HTTP PUT requests"}.

{httpd_status_codes, '200', "number of HTTP 200 OK responses"}.
{httpd_status_codes, '201', "number of HTTP 201 Created responses"}.
{httpd_status_codes, '202', "number of HTTP 202 Accepted responses"}.
{httpd_status_codes, '301', "number of HTTP 301 Moved Permanently responses"}.
{httpd_status_codes, '304', "number of HTTP 304 Not Modified responses"}.
{httpd_status_codes, '400', "number of HTTP 400 Bad Request responses"}.
{httpd_status_codes, '401', "number of HTTP 401 Unauthorized responses"}.
{httpd_status_codes, '403', "number of HTTP 403 Forbidden responses"}.
{httpd_status_codes, '404', "number of HTTP 404 Not Found responses"}.
{httpd_status_codes, '405', "number of HTTP 405 Method Not Allowed responses"}.
{httpd_status_codes, '409', "number of HTTP 409 Conflict responses"}.
{httpd_status_codes, '412', "number of HTTP 412 Precondition Failed responses"}.
{httpd_status_codes, '500', "number of HTTP 500 Internal Server Error responses"}.
