summaryrefslogtreecommitdiff
path: root/src/chttpd/src/chttpd_stats.erl
blob: 59ec9268dac1421b16fa1ba9e9481ec27f0f479f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
% 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.

-module(chttpd_stats).


-export([
    init/0,
    report/2,

    incr_reads/0,
    incr_reads/1,

    incr_writes/0,
    incr_writes/1,

    incr_rows/0,
    incr_rows/1
]).


-record(st, {
    reads = 0,
    writes = 0,
    rows = 0
}).


-define(KEY, chttpd_stats).


init() ->
    put(?KEY, #st{}).


report(HttpReq, HttpResp) ->
    try
        case get(?KEY) of
            #st{} = St ->
                report(HttpReq, HttpResp, St);
            _ ->
                ok
        end
    catch T:R ->
        S = erlang:get_stacktrace(),
        Fmt = "Failed to report chttpd request stats: ~p:~p ~p",
        couch_log:error(Fmt, [T, R, S])
    end.


report(HttpReq, HttpResp, St) ->
    case config:get("chttpd", "stats_reporter") of
        undefined ->
            ok;
        ModStr ->
            Mod = list_to_existing_atom(ModStr),
            #st{
                reads = Reads,
                writes = Writes,
                rows = Rows
            } = St,
            Mod:report(HttpReq, HttpResp, Reads, Writes, Rows)
    end.


incr_reads() ->
    incr(#st.reads, 1).


incr_reads(N) when is_integer(N), N >= 0 ->
    incr(#st.reads, N).


incr_writes() ->
    incr(#st.writes, 1).


incr_writes(N) when is_integer(N), N >= 0 ->
    incr(#st.writes, N).


incr_rows() ->
    incr(#st.rows, 1).


incr_rows(N) when is_integer(N), N >= 0 ->
    incr(#st.rows, N).


incr(Idx, Count) ->
    case get(?KEY) of
        #st{} = St ->
            Total = element(Idx, St) + Count,
            NewSt = setelement(Idx, St, Total),
            put(?KEY, NewSt);
        _ ->
            ok
    end.