%% 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, mrview, map_doc], [
    {type, counter},
    {desc, <<"number of documents mapped in the view server">>}
]}.
{[couchdb, mrview, emits], [
    {type, counter},
    {desc, <<"number of invocations of `emit' in map functions in the view server">>}
]}.
