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.
|