From 7e58d578acc6b081829d61eedc11a7d85b9e6b1b Mon Sep 17 00:00:00 2001 From: phk Date: Mon, 10 Jul 2006 21:54:11 +0000 Subject: [PATCH] Add varnishtop log-tailer. Try these: varnishtop -i url varhishtop -i header -C -I '^user-agent:' varhishtop -i header -C -I '^user-agent:' -X MSIE varhishtop -i header -C -I '^user-agent:.*MSIE' varhishtop -i header -C -I '^user-agent:.*java' You can also run them on the logfiles from the live test: zcat _vlog21.gz | varnishtop -r - -i header ... git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@415 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/bin/Makefile.am | 2 +- varnish-cache/bin/varnishtop/Makefile.am | 14 ++ varnish-cache/bin/varnishtop/varnishtop.c | 150 ++++++++++++++++++++++ varnish-cache/configure.ac | 1 + 4 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 varnish-cache/bin/varnishtop/Makefile.am create mode 100644 varnish-cache/bin/varnishtop/varnishtop.c diff --git a/varnish-cache/bin/Makefile.am b/varnish-cache/bin/Makefile.am index 375fed56..f29e3940 100644 --- a/varnish-cache/bin/Makefile.am +++ b/varnish-cache/bin/Makefile.am @@ -1,3 +1,3 @@ # $Id$ -SUBDIRS = varnishd varnishlog varnishstat +SUBDIRS = varnishd varnishlog varnishstat varnishtop diff --git a/varnish-cache/bin/varnishtop/Makefile.am b/varnish-cache/bin/varnishtop/Makefile.am new file mode 100644 index 00000000..c083d8b4 --- /dev/null +++ b/varnish-cache/bin/varnishtop/Makefile.am @@ -0,0 +1,14 @@ +# $Id: Makefile.am 347 2006-07-06 09:31:45Z des $ + +INCLUDES = -I$(top_srcdir)/include + +bin_PROGRAMS = varnishtop + +# man_MANS = varnishtop.1 + +varnishtop_SOURCES = varnishtop.c + +varnishtop_LDADD = \ + $(top_builddir)/lib/libvarnishapi/libvarnishapi.la \ + $(top_builddir)/lib/libsbuf/libsbuf.a \ + -lcurses diff --git a/varnish-cache/bin/varnishtop/varnishtop.c b/varnish-cache/bin/varnishtop/varnishtop.c new file mode 100644 index 00000000..ac1d0f70 --- /dev/null +++ b/varnish-cache/bin/varnishtop/varnishtop.c @@ -0,0 +1,150 @@ +/* + * $Id: varnishlog.c 412 2006-07-10 20:27:52Z phk $ + * + * Log tailer for Varnish + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "shmlog.h" +#include "queue.h" +#include "varnishapi.h" + +struct top { + unsigned char *rec; + unsigned hash; + TAILQ_ENTRY(top) list; + double count; +}; + +static TAILQ_HEAD(tophead, top) top_head = TAILQ_HEAD_INITIALIZER(top_head); + +static unsigned ntop; + +/*--------------------------------------------------------------------*/ + +static void +Usage(void) +{ + fprintf(stderr, "Usage: varnishtop\n"); + exit(2); +} + +static void +upd(void) +{ + struct top *tp, *tp2; + int l; + double t = 0; + unsigned u = 0; + + erase(); + l = 0; + mvprintw(0, 0, "list length %u\n", ntop); + TAILQ_FOREACH_SAFE(tp, &top_head, list, tp2) { + if (++l < LINES) { + printw("%10.2f %*.*s\n", + tp->count, tp->rec[1], tp->rec[1], tp->rec + 4); + t = tp->count; + } + tp->count *= .999; + if (tp->count * 10 < t || l > LINES * 10) { + TAILQ_REMOVE(&top_head, tp, list); + free(tp); + ntop--; + u++; + } + } + mvprintw(0, 40, "cleaned %u\n", u); + refresh(); +} + +int +main(int argc, char **argv) +{ + int i, c; + unsigned char *p; + struct VSL_data *vd; + unsigned u, v; + struct top *tp, *tp2; + + vd = VSL_New(); + + while ((c = getopt(argc, argv, VSL_ARGS "how:")) != -1) { + i = VSL_Arg(vd, c, optarg); + if (i < 0) + exit (1); + if (i > 0) + continue; + switch (c) { + default: + Usage(); + } + } + + if (VSL_OpenLog(vd)) + exit (1); + + initscr(); + v = 0; + while (1) { + p = VSL_NextLog(vd); + if (p == NULL) { + upd(); + usleep(50000); + continue; + } + if (++v > 100) { + upd(); + v = 0; + } + u = 0; + for (i = 4; i < 4 + p[1]; i++) + u += p[i]; + TAILQ_FOREACH(tp, &top_head, list) { + if (tp->hash != u) + continue; + if (tp->rec[0] != p[0]) + continue; + if (tp->rec[1] != p[1]) + continue; + if (memcmp(p + 4, tp->rec + 4, p[1])) + continue; + tp->count += 1.0; + break; + } + if (tp == NULL) { + ntop++; + tp = calloc(sizeof *tp + 4 + p[1], 1); + assert(tp != NULL); + tp->hash = u; + tp->rec = (void *)(tp + 1); + memcpy(tp->rec, p, 4 + p[1]); + tp->count = 1.0; + TAILQ_INSERT_TAIL(&top_head, tp, list); + } + while (1) { + tp2 = TAILQ_PREV(tp, tophead, list); + if (tp2 == NULL || tp2->count >= tp->count) + break; + TAILQ_REMOVE(&top_head, tp2, list); + TAILQ_INSERT_AFTER(&top_head, tp, tp2, list); + } + while (1) { + tp2 = TAILQ_NEXT(tp, list); + if (tp2 == NULL || tp2->count <= tp->count) + break; + TAILQ_REMOVE(&top_head, tp2, list); + TAILQ_INSERT_BEFORE(tp, tp2, list); + } + } + return (0); +} diff --git a/varnish-cache/configure.ac b/varnish-cache/configure.ac index 408a2574..173fa861 100644 --- a/varnish-cache/configure.ac +++ b/varnish-cache/configure.ac @@ -70,6 +70,7 @@ AC_CONFIG_FILES([ bin/varnishd/Makefile bin/varnishlog/Makefile bin/varnishstat/Makefile + bin/varnishtop/Makefile contrib/Makefile include/Makefile lib/Makefile -- 2.39.5