summaryrefslogtreecommitdiffstats
path: root/src/latency.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/latency.h')
-rw-r--r--src/latency.h108
1 files changed, 108 insertions, 0 deletions
diff --git a/src/latency.h b/src/latency.h
new file mode 100644
index 0000000..13503d5
--- /dev/null
+++ b/src/latency.h
@@ -0,0 +1,108 @@
+/* latency.h -- latency monitor API header file
+ * See latency.c for more information.
+ *
+ * ----------------------------------------------------------------------------
+ *
+ * Copyright (c) 2014, Salvatore Sanfilippo <antirez at gmail dot com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Redis nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __LATENCY_H
+#define __LATENCY_H
+
+#define LATENCY_TS_LEN 160 /* History length for every monitored event. */
+
+/* Representation of a latency sample: the sampling time and the latency
+ * observed in milliseconds. */
+struct latencySample {
+ int32_t time; /* We don't use time_t to force 4 bytes usage everywhere. */
+ uint32_t latency; /* Latency in milliseconds. */
+};
+
+/* The latency time series for a given event. */
+struct latencyTimeSeries {
+ int idx; /* Index of the next sample to store. */
+ uint32_t max; /* Max latency observed for this event. */
+ struct latencySample samples[LATENCY_TS_LEN]; /* Latest history. */
+};
+
+/* Latency statistics structure. */
+struct latencyStats {
+ uint32_t all_time_high; /* Absolute max observed since latest reset. */
+ uint32_t avg; /* Average of current samples. */
+ uint32_t min; /* Min of current samples. */
+ uint32_t max; /* Max of current samples. */
+ uint32_t mad; /* Mean absolute deviation. */
+ uint32_t samples; /* Number of non-zero samples. */
+ time_t period; /* Number of seconds since first event and now. */
+};
+
+void latencyMonitorInit(void);
+void latencyAddSample(const char *event, mstime_t latency);
+
+/* Latency monitoring macros. */
+
+/* Start monitoring an event. We just set the current time. */
+#define latencyStartMonitor(var) if (server.latency_monitor_threshold) { \
+ var = mstime(); \
+} else { \
+ var = 0; \
+}
+
+/* End monitoring an event, compute the difference with the current time
+ * to check the amount of time elapsed. */
+#define latencyEndMonitor(var) if (server.latency_monitor_threshold) { \
+ var = mstime() - var; \
+}
+
+/* Add the sample only if the elapsed time is >= to the configured threshold. */
+#define latencyAddSampleIfNeeded(event,var) \
+ if (server.latency_monitor_threshold && \
+ (var) >= server.latency_monitor_threshold) \
+ latencyAddSample((event),(var));
+
+/* Remove time from a nested event. */
+#define latencyRemoveNestedEvent(event_var,nested_var) \
+ event_var += nested_var;
+
+typedef struct durationStats {
+ unsigned long long cnt;
+ unsigned long long sum;
+ unsigned long long max;
+} durationStats;
+
+typedef enum {
+ EL_DURATION_TYPE_EL = 0, // cumulative time duration metric of the whole eventloop
+ EL_DURATION_TYPE_CMD, // cumulative time duration metric of executing commands
+ EL_DURATION_TYPE_AOF, // cumulative time duration metric of flushing AOF in eventloop
+ EL_DURATION_TYPE_CRON, // cumulative time duration metric of cron (serverCron and beforeSleep, but excluding IO and AOF)
+ EL_DURATION_TYPE_NUM
+} DurationType;
+
+void durationAddSample(int type, monotime duration);
+
+#endif /* __LATENCY_H */