Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,6 @@ Makefile.in

/src/vcc_if.c
/src/vcc_if.h
/src/vmod_statsd.man.rst
/src/vmod_statsd.rst
/vmod_statsd.3
10 changes: 4 additions & 6 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@ SYNOPSIS
DESCRIPTION
===========

Varnish Module (vmod) for sending statistics to Statsd.
Varnish 4.x Module (vmod) for sending statistics to Statsd.

See https://github.com/jib/libvmod-statsd/tree/master for Varnish 3.x version.

See https://github.com/etsy/statsd for documentation on Statsd.

Expand Down Expand Up @@ -190,11 +192,7 @@ Usage::
./autogen.sh

# Execute configure script
./configure VARNISHSRC=DIR [VMODDIR=DIR]

`VARNISHSRC` is the directory of the Varnish source tree for which to
compile your vmod. Both the `VARNISHSRC` and `VARNISHSRC/include`
will be added to the include search paths for your module.
./configure

Optionally you can also set the vmod install directory by adding
`VMODDIR=DIR` (defaults to the pkg-config discovered directory from your
Expand Down
62 changes: 32 additions & 30 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ AC_PREREQ(2.59)
AC_COPYRIGHT([Copyright (c) 2011 Varnish Software AS])
AC_INIT([libvmod-statsd], [trunk])
AC_CONFIG_MACRO_DIR([m4])
m4_ifndef([VARNISH_VMOD_INCLUDES], AC_MSG_ERROR([Need varnish.m4]))
AC_CONFIG_SRCDIR(src/vmod_statsd.vcc)
AM_CONFIG_HEADER(config.h)

Expand Down Expand Up @@ -29,43 +30,44 @@ if test "x$RST2MAN" = "xno"; then
fi
AM_CONDITIONAL(HAVE_RST2MAN, [test "x$RST2MAN" != "xno"])

# Check for pkg-config
PKG_PROG_PKG_CONFIG

# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([sys/stdlib.h])

# Check for python
AC_CHECK_PROGS(PYTHON, [python3 python3.1 python3.2 python2.7 python2.6 python2.5 python2 python], [AC_MSG_ERROR([Python is needed to build this vmod, please install python.])])
# backwards compat with older pkg-config
# - pull in AC_DEFUN from pkg.m4
m4_ifndef([PKG_CHECK_VAR], [
# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
# -------------------------------------------
# Retrieves the value of the pkg-config variable for the given module.
AC_DEFUN([PKG_CHECK_VAR],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl

# Varnish source tree
AC_ARG_VAR([VARNISHSRC], [path to Varnish source tree (mandatory)])
if test "x$VARNISHSRC" = x; then
AC_MSG_ERROR([No Varnish source tree specified])
fi
VARNISHSRC=`cd $VARNISHSRC && pwd`
AC_CHECK_FILE([$VARNISHSRC/include/varnishapi.h],
[],
[AC_MSG_FAILURE(["$VARNISHSRC" is not a Varnish source directory])]
)
AM_CONDITIONAL(HAVE_VARNISHSRC, [test -n $VARNISHSRC])
_PKG_CONFIG([$1], [variable="][$3]["], [$2])
AS_VAR_COPY([$1], [pkg_cv_][$1])

# Check that varnishtest is built in the varnish source directory
AC_CHECK_FILE([$VARNISHSRC/bin/varnishtest/varnishtest],
[],
[AC_MSG_FAILURE([Can't find "$VARNISHSRC/bin/varnishtest/varnishtest". Please build your varnish source directory])]
)
AS_VAR_IF([$1], [""], [$5], [$4])dnl
])# PKG_CHECK_VAR
])

PKG_CHECK_MODULES([libvarnishapi], [varnishapi])
PKG_CHECK_VAR([LIBVARNISHAPI_DATAROOTDIR], [varnishapi], [datarootdir])
PKG_CHECK_VAR([LIBVARNISHAPI_BINDIR], [varnishapi], [bindir])
PKG_CHECK_VAR([LIBVARNISHAPI_SBINDIR], [varnishapi], [sbindir])
AC_SUBST([LIBVARNISHAPI_DATAROOTDIR])

# Varnish include files tree
VARNISH_VMOD_INCLUDES
VARNISH_VMOD_DIR
VARNISH_VMODTOOL

AC_PATH_PROG([VARNISHTEST], [varnishtest], [],
[$LIBVARNISHAPI_BINDIR:$LIBVARNISHAPI_SBINDIR:$PATH])
AC_PATH_PROG([VARNISHD], [varnishd], [],
[$LIBVARNISHAPI_SBINDIR:$LIBVARNISHAPI_BINDIR:$PATH])

# vmod installation dir
AC_ARG_VAR([VMODDIR], [vmod installation directory @<:@LIBDIR/varnish/vmods@:>@])
if test "x$VMODDIR" = x; then
VMODDIR=`pkg-config --variable=vmoddir varnishapi`
if test "x$VMODDIR" = x; then
AC_MSG_FAILURE([Can't determine vmod installation directory])
fi
fi
AM_CONDITIONAL(HAVE_VMODDIR, [test -n $VMODDIR])

AC_CONFIG_FILES([
Makefile
Expand Down
36 changes: 11 additions & 25 deletions src/Makefile.am
Original file line number Diff line number Diff line change
@@ -1,23 +1,6 @@
# if VARNISHSRC is defined on the command-line, use that. Otherwise, build
# this the same as the modules that come with varnish (i.e. we're building
# within the varnish src dir itself, and $(top_srcdir) is the varnish source).
#
if HAVE_VARNISHSRC
SRC = $(VARNISHSRC)
DIR_PREFIX = /
else
SRC = $(top_srcdir)
DIR_PREFIX = lib/libvmod-statsd/
endif

INCLUDES = -I$(SRC)/include -I$(SRC)

if HAVE_VMODDIR
vmoddir = $(VMODDIR)
else
vmoddir = $(pkglibdir)/vmods
endif
AM_CPPFLAGS = @VMOD_INCLUDES@

vmoddir = @VMOD_DIR@
vmod_LTLIBRARIES = libvmod_statsd.la

libvmod_statsd_la_LDFLAGS = -module -export-dynamic -avoid-version
Expand All @@ -27,19 +10,22 @@ libvmod_statsd_la_SOURCES = \
vcc_if.h \
vmod_statsd.c

vcc_if.c vcc_if.h: $(SRC)/lib/libvmod_std/vmod.py $(top_srcdir)/$(DIR_PREFIX)src/vmod_statsd.vcc
@PYTHON@ $(SRC)/lib/libvmod_std/vmod.py $(top_srcdir)/$(DIR_PREFIX)src/vmod_statsd.vcc
vcc_if.c vcc_if.h: @VMODTOOL@ $(top_srcdir)/$(DIR_PREFIX)src/vmod_statsd.vcc
@VMODTOOL@ $(top_srcdir)/$(DIR_PREFIX)src/vmod_statsd.vcc

VMOD_TESTS = tests/*.vtc
VMOD_TESTS = $(top_srcdir)/src/tests/*.vtc
.PHONY: $(VMOD_TESTS)

tests/*.vtc:
$(SRC)/bin/varnishtest/varnishtest -Dvarnishd=$(SRC)/bin/varnishd/varnishd -Dvmod_topbuild=$(abs_top_builddir) $@
$(top_srcdir)/src/tests/*.vtc:
@VARNISHTEST@ -Dvarnishd=@VARNISHD@ -Dvmod_topbuild=$(abs_top_builddir) $@

check: $(VMOD_TESTS)

EXTRA_DIST = \
vmod_statsd.vcc \
$(VMOD_TESTS)

CLEANFILES = $(builddir)/vcc_if.c $(builddir)/vcc_if.h
CLEANFILES = $(builddir)/vcc_if.c $(builddir)/vcc_if.h \
$(builddir)/vmod_statsd.man.rst \
$(builddir)/vmod_statsd.rst \
$(builddir)/../vmod_statsd.3
76 changes: 29 additions & 47 deletions src/vmod_statsd.c
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "vcl.h"
#include "vrt.h"
#include "bin/varnishd/cache.h"
#include "cache/cache.h"

#include "vcc_if.h"

Expand Down Expand Up @@ -80,7 +81,12 @@ free_function(void *priv) {
}

int
init_function(struct vmod_priv *priv, const struct VCL_conf *conf) {
event_function(VRT_CTX, struct vmod_priv *priv, enum vcl_event_e e)
{

if (e != VCL_EVENT_LOAD)
return (0);


// ******************************
// Configuration defaults
Expand All @@ -107,23 +113,23 @@ init_function(struct vmod_priv *priv, const struct VCL_conf *conf) {
}

/** The following may ONLY be called from VCL_init **/
void
vmod_prefix( struct sess *sp, struct vmod_priv *priv, const char *prefix ) {
VCL_VOID
vmod_prefix( VRT_CTX, struct vmod_priv *priv, const char *prefix ) {
config_t *cfg = priv->priv;
cfg->prefix = _strip_newline( strdup( prefix ) );
}

/** The following may ONLY be called from VCL_init **/
void
vmod_suffix( struct sess *sp, struct vmod_priv *priv, const char *suffix ) {
VCL_VOID
vmod_suffix( VRT_CTX, struct vmod_priv *priv, const char *suffix ) {

config_t *cfg = priv->priv;
cfg->suffix = _strip_newline( strdup( suffix ) );
}

/** The following may ONLY be called from VCL_init **/
void
vmod_server( struct sess *sp, struct vmod_priv *priv, const char *host, const char *port ) {
VCL_VOID
vmod_server( VRT_CTX, struct vmod_priv *priv, VCL_STRING host, VCL_STRING port ) {

// ******************************
// Configuration
Expand Down Expand Up @@ -326,74 +332,50 @@ _send_to_statsd( struct vmod_priv *priv, const char *key, const char *val ) {
}


void
vmod_incr( struct sess *sp, struct vmod_priv *priv, const char *key ) {
VCL_VOID
vmod_incr( VRT_CTX, struct vmod_priv *priv, VCL_STRING key ) {
_DEBUG && fprintf( stderr, "vmod-statsd: incr: %s\n", key );

// Incremenet is straight forward - just add the count + type
_send_to_statsd( priv, key, ":1|c" );
}

void
vmod_timing( struct sess *sp, struct vmod_priv *priv, const char *key, int num ) {
_DEBUG && fprintf( stderr, "vmod-statsd: timing: %s = %d\n", key, num );
VCL_VOID
vmod_timing( VRT_CTX, struct vmod_priv *priv, const char *key, VCL_INT num ) {
_DEBUG && fprintf( stderr, "vmod-statsd: timing: %s = %d\n", key, (int)num );

// Get the buffer ready. 10 for the maximum lenghth of an int and +5 for metadata
char val[ 15 ];

// looks like glork:320|ms
snprintf( val, sizeof(val), ":%d|ms", num );
snprintf( val, sizeof(val), ":%d|ms", (int)num );

_send_to_statsd( priv, key, val );
}

void
vmod_counter( struct sess *sp, struct vmod_priv *priv, const char *key, int num ) {
_DEBUG && fprintf( stderr, "vmod-statsd: counter: %s = %d\n", key, num );
VCL_VOID
vmod_counter( VRT_CTX, struct vmod_priv *priv, const char *key, VCL_INT num ) {
_DEBUG && fprintf( stderr, "vmod-statsd: counter: %s = %d\n", key, (int)num );

// Get the buffer ready. 10 for the maximum lenghth of an int and +5 for metadata
char val[ 15 ];

// looks like: gorets:42|c
snprintf( val, sizeof(val), ":%d|c", num );
snprintf( val, sizeof(val), ":%d|c", (int)num );

_send_to_statsd( priv, key, val );
}

void
vmod_gauge( struct sess *sp, struct vmod_priv *priv, const char *key, int num ) {
_DEBUG && fprintf( stderr, "vmod-statsd: gauge: %s = %d\n", key, num );
VCL_VOID
vmod_gauge( VRT_CTX, struct vmod_priv *priv, const char *key, VCL_INT num ) {
_DEBUG && fprintf( stderr, "vmod-statsd: gauge: %s = %d\n", key, (int)num );

// Get the buffer ready. 10 for the maximum lenghth of an int and +5 for metadata
char val[ 15 ];

// looks like: gaugor:333|g
snprintf( val, sizeof(val), ":%d|g", num );
snprintf( val, sizeof(val), ":%d|g", (int)num );

_send_to_statsd( priv, key, val );
}


// const char *
// vmod_hello(struct sess *sp, const char *name)
// {
// char *p;
// unsigned u, v;
//
// u = WS_Reserve(sp->wrk->ws, 0); /* Reserve some work space */
// p = sp->wrk->ws->f; /* Front of workspace area */
// v = snprintf(p, u, "Hello, %s", name);
// v++;
// if (v > u) {
// /* No space, reset and leave */
// WS_Release(sp->wrk->ws, 0);
// return (NULL);
// }
// /* Update work space with what we've used */
// WS_Release(sp->wrk->ws, v);
// return (p);
// }

// _DEBUG && fprintf( stderr, "vmod-statsd: Open: %.9f Req: %.9f Res: %.9f End: %.9f\n",
// sp->t_open, sp->t_req, sp->t_resp, sp->t_end );

18 changes: 9 additions & 9 deletions src/vmod_statsd.vcc
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
Module statsd
Init init_function
Function VOID server( PRIV_VCL, STRING, STRING )
Function VOID prefix( PRIV_VCL, STRING )
Function VOID suffix( PRIV_VCL, STRING )
Function VOID incr( PRIV_VCL, STRING )
Function VOID gauge( PRIV_VCL, STRING, INT )
Function VOID timing( PRIV_VCL, STRING, INT )
Function VOID counter( PRIV_VCL, STRING, INT )
$Module statsd 3 StatsD Client
$Event event_function
$Function VOID server( PRIV_VCL, STRING, STRING )
$Function VOID prefix( PRIV_VCL, STRING )
$Function VOID suffix( PRIV_VCL, STRING )
$Function VOID incr( PRIV_VCL, STRING )
$Function VOID gauge( PRIV_VCL, STRING, INT )
$Function VOID timing( PRIV_VCL, STRING, INT )
$Function VOID counter( PRIV_VCL, STRING, INT )