From a57eb3272d0fbc38f82f75b79cff616325532316 Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 1 Jul 2014 16:04:59 +0200 Subject: [PATCH] LATENCY SAMPLES implemented. --- src/latency.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/redis.c | 3 ++- src/redis.h | 1 + 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/latency.c b/src/latency.c index 582906ed..bb05e8e7 100644 --- a/src/latency.c +++ b/src/latency.c @@ -89,5 +89,49 @@ void latencyAddSample(char *event, mstime_t latency) { /* ---------------------- Latency command implementation -------------------- */ +/* latencyCommand() helper to produce a time-delay reply for all the samples + * in memory for the specified time series. */ +void latencyCommandReplyWithSamples(redisClient *c, struct latencyTimeSeries *ts) { + void *replylen = addDeferredMultiBulkLength(c); + int samples = 0, j; + + for (j = 0; j < LATENCY_TS_LEN; j++) { + int i = (ts->idx + j) % LATENCY_TS_LEN; + + if (ts->samples[i].time == 0) continue; + addReplyMultiBulkLen(c,2); + addReplyLongLong(c,ts->samples[i].time); + addReplyLongLong(c,ts->samples[i].latency); + samples++; + } + setDeferredMultiBulkLength(c,replylen,samples); +} + +/* LATENCY command implementations. + * + * LATENCY SAMPLES: return time-latency samples for the specified event. + * LATENCY LATEST: return the latest latency for all the events classes. + * LATENCY DOCTOR: returns an human readable analysis of instance latency. + * LATENCY GRAPH: provide an ASCII graph of the latency of the specified event. + */ void latencyCommand(redisClient *c) { + struct latencyTimeSeries *ts; + + if (!strcasecmp(c->argv[1]->ptr,"samples") && c->argc == 3) { + /* LATENCY SAMPLES */ + ts = dictFetchValue(server.latency_events,c->argv[2]->ptr); + if (ts == NULL) goto nodataerr; + latencyCommandReplyWithSamples(c,ts); + } else { + addReply(c,shared.syntaxerr); + return; + } + return; + +nodataerr: + /* Common error when the user asks for an event we have no latency + * information about. */ + addReplyErrorFormat(c, + "No samples available for event '%s'", c->argv[2]->ptr); } + diff --git a/src/redis.c b/src/redis.c index ac544095..159cb0b4 100644 --- a/src/redis.c +++ b/src/redis.c @@ -273,7 +273,8 @@ struct redisCommand redisCommandTable[] = { {"pfadd",pfaddCommand,-2,"wmF",0,NULL,1,1,1,0,0}, {"pfcount",pfcountCommand,-2,"w",0,NULL,1,1,1,0,0}, {"pfmerge",pfmergeCommand,-2,"wm",0,NULL,1,-1,1,0,0}, - {"pfdebug",pfdebugCommand,-3,"w",0,NULL,0,0,0,0,0} + {"pfdebug",pfdebugCommand,-3,"w",0,NULL,0,0,0,0,0}, + {"latency",latencyCommand,-2,"arslt",0,NULL,0,0,0,0,0} }; /*============================ Utility functions ============================ */ diff --git a/src/redis.h b/src/redis.h index 44e0bbe5..1f3e901e 100644 --- a/src/redis.h +++ b/src/redis.h @@ -1388,6 +1388,7 @@ void pfaddCommand(redisClient *c); void pfcountCommand(redisClient *c); void pfmergeCommand(redisClient *c); void pfdebugCommand(redisClient *c); +void latencyCommand(redisClient *c); #if defined(__GNUC__) void *calloc(size_t count, size_t size) __attribute__ ((deprecated)); -- GitLab