diff options
Diffstat (limited to 'src/latency.h')
-rw-r--r-- | src/latency.h | 108 |
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 */ |