xref: /f-stack/app/redis-5.0.5/src/latency.h (revision 572c4311)
1 /* latency.h -- latency monitor API header file
2  * See latency.c for more information.
3  *
4  * ----------------------------------------------------------------------------
5  *
6  * Copyright (c) 2014, Salvatore Sanfilippo <antirez at gmail dot com>
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions are met:
11  *
12  *   * Redistributions of source code must retain the above copyright notice,
13  *     this list of conditions and the following disclaimer.
14  *   * Redistributions in binary form must reproduce the above copyright
15  *     notice, this list of conditions and the following disclaimer in the
16  *     documentation and/or other materials provided with the distribution.
17  *   * Neither the name of Redis nor the names of its contributors may be used
18  *     to endorse or promote products derived from this software without
19  *     specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #ifndef __LATENCY_H
35 #define __LATENCY_H
36 
37 #define LATENCY_TS_LEN 160 /* History length for every monitored event. */
38 
39 /* Representation of a latency sample: the sampling time and the latency
40  * observed in milliseconds. */
41 struct latencySample {
42     int32_t time; /* We don't use time_t to force 4 bytes usage everywhere. */
43     uint32_t latency; /* Latency in milliseconds. */
44 };
45 
46 /* The latency time series for a given event. */
47 struct latencyTimeSeries {
48     int idx; /* Index of the next sample to store. */
49     uint32_t max; /* Max latency observed for this event. */
50     struct latencySample samples[LATENCY_TS_LEN]; /* Latest history. */
51 };
52 
53 /* Latency statistics structure. */
54 struct latencyStats {
55     uint32_t all_time_high; /* Absolute max observed since latest reset. */
56     uint32_t avg;           /* Average of current samples. */
57     uint32_t min;           /* Min of current samples. */
58     uint32_t max;           /* Max of current samples. */
59     uint32_t mad;           /* Mean absolute deviation. */
60     uint32_t samples;       /* Number of non-zero samples. */
61     time_t period;          /* Number of seconds since first event and now. */
62 };
63 
64 void latencyMonitorInit(void);
65 void latencyAddSample(char *event, mstime_t latency);
66 int THPIsEnabled(void);
67 
68 /* Latency monitoring macros. */
69 
70 /* Start monitoring an event. We just set the current time. */
71 #define latencyStartMonitor(var) if (server.latency_monitor_threshold) { \
72     var = mstime(); \
73 } else { \
74     var = 0; \
75 }
76 
77 /* End monitoring an event, compute the difference with the current time
78  * to check the amount of time elapsed. */
79 #define latencyEndMonitor(var) if (server.latency_monitor_threshold) { \
80     var = mstime() - var; \
81 }
82 
83 /* Add the sample only if the elapsed time is >= to the configured threshold. */
84 #define latencyAddSampleIfNeeded(event,var) \
85     if (server.latency_monitor_threshold && \
86         (var) >= server.latency_monitor_threshold) \
87           latencyAddSample((event),(var));
88 
89 /* Remove time from a nested event. */
90 #define latencyRemoveNestedEvent(event_var,nested_var) \
91     event_var += nested_var;
92 
93 #endif /* __LATENCY_H */
94