X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fvarnish.c;h=acc9015d1a02708494e6019f62ffa478f29565c1;hb=3c42182e912e3d634fe8c4f6a636053959fcde49;hp=d57413c6ecce7fd8005f8c56ae7fcf951711a046;hpb=61767b24af797a64dc293d5acfc37576354c9be5;p=collectd.git diff --git a/src/varnish.c b/src/varnish.c index d57413c6..acc9015d 100644 --- a/src/varnish.c +++ b/src/varnish.c @@ -29,7 +29,7 @@ #include "common.h" #include "plugin.h" -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 #include #include typedef struct VSC_C_main c_varnish_stats_t; @@ -71,23 +71,24 @@ struct user_config_s { #if HAVE_VARNISH_V2 _Bool collect_sm; #endif -#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4 +#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5 _Bool collect_sma; #endif _Bool collect_struct; _Bool collect_totals; -#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 +#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5 _Bool collect_uptime; #endif _Bool collect_vcl; _Bool collect_workers; -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 _Bool collect_vsm; _Bool collect_lck; _Bool collect_mempool; _Bool collect_mgt; _Bool collect_smf; _Bool collect_vbe; + _Bool collect_mse; #endif }; typedef struct user_config_s user_config_t; /* }}} */ @@ -137,7 +138,7 @@ static int varnish_submit_derive(const char *plugin_instance, /* {{{ */ }); } /* }}} int varnish_submit_derive */ -#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 +#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5 static int varnish_monitor(void *priv, const struct VSC_point *const pt) /* {{{ */ { @@ -151,7 +152,17 @@ static int varnish_monitor(void *priv, conf = priv; -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V5 + char namebuff[100]; + char *c; + + c = rindex(pt->name, '.'); + strcpy(namebuff, c+1); + name = namebuff; + + (void)class; + +#elif HAVE_VARNISH_V4 class = pt->section->fantom->type; name = pt->desc->name; @@ -190,7 +201,7 @@ static int varnish_monitor(void *priv, else if (strcmp(name, "client_req") == 0) return varnish_submit_derive(conf->instance, "connections", "connections", "received", val); -#ifdef HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 else if (strcmp(name, "client_req_400") == 0) return varnish_submit_derive(conf->instance, "connections", "connections", "error_400", val); @@ -227,6 +238,9 @@ static int varnish_monitor(void *priv, else if (strcmp(name, "esi_warnings") == 0) return varnish_submit_derive(conf->instance, "esi", "total_operations", "warning", val); + else if (strcmp(name, "esi_maxdepth") == 0) + return varnish_submit_derive(conf->instance, "esi", "total_operations", + "max_depth", val); } if (conf->collect_backend) { @@ -302,7 +316,7 @@ static int varnish_monitor(void *priv, else if (strcmp(name, "fetch_304") == 0) return varnish_submit_derive(conf->instance, "fetch", "http_requests", "no_body_304", val); -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 else if (strcmp(name, "fetch_no_thread") == 0) return varnish_submit_derive(conf->instance, "fetch", "http_requests", "no_thread", val); @@ -361,7 +375,7 @@ static int varnish_monitor(void *priv, else if (strcmp(name, "n_objoverflow") == 0) return varnish_submit_derive(conf->instance, "objects", "total_objects", "workspace_overflow", val); -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 else if (strcmp(name, "exp_mailed") == 0) return varnish_submit_gauge(conf->instance, "struct", "objects", "exp_mailed", val); @@ -393,7 +407,7 @@ static int varnish_monitor(void *priv, "duplicate", val); } #endif -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 if (conf->collect_ban) { if (strcmp(name, "bans") == 0) return varnish_submit_derive(conf->instance, "ban", "total_operations", @@ -481,7 +495,7 @@ static int varnish_monitor(void *priv, else if (strcmp(name, "sess_herd") == 0) return varnish_submit_derive(conf->instance, "session", "total_operations", "herd", val); -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 else if (strcmp(name, "sess_closed_err") == 0) return varnish_submit_derive(conf->instance, "session", "total_operations", "closed_err", val); @@ -588,12 +602,18 @@ static int varnish_monitor(void *priv, else if (strcmp(name, "s_req_bodybytes") == 0) return varnish_submit_derive(conf->instance, "totals", "total_bytes", "req_body", val); + else if (strcmp(name, "s_req_protobytes") == 0) + return varnish_submit_derive(conf->instance, "totals", "total_bytes", + "req_proto", val); else if (strcmp(name, "s_resp_hdrbytes") == 0) return varnish_submit_derive(conf->instance, "totals", "total_bytes", "resp_header", val); else if (strcmp(name, "s_resp_bodybytes") == 0) return varnish_submit_derive(conf->instance, "totals", "total_bytes", "resp_body", val); + else if (strcmp(name, "s_resp_protobytes") == 0) + return varnish_submit_derive(conf->instance, "totals", "total_bytes", + "resp_proto", val); else if (strcmp(name, "s_pipe_hdrbytes") == 0) return varnish_submit_derive(conf->instance, "totals", "total_bytes", "pipe_header", val); @@ -687,18 +707,17 @@ static int varnish_monitor(void *priv, else if (strcmp(name, "n_wrk_lqueue") == 0) return varnish_submit_derive(conf->instance, "workers", "total_requests", "queue_length", val); -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 else if (strcmp(name, "pools") == 0) return varnish_submit_gauge(conf->instance, "workers", "pools", "pools", val); else if (strcmp(name, "busy_killed") == 0) return varnish_submit_derive(conf->instance, "workers", "http_requests", "busy_killed", val); - #endif } -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 if (conf->collect_vsm) { if (strcmp(name, "vsm_free") == 0) return varnish_submit_gauge(conf->instance, "vsm", "bytes", "free", val); @@ -727,12 +746,18 @@ static int varnish_monitor(void *priv, else if (strcmp(name, "bereq_bodybytes") == 0) return varnish_submit_derive(conf->instance, "vbe", "total_bytes", "bereq_bodybytes", val); + else if (strcmp(name, "bereq_protobytes") == 0) + return varnish_submit_derive(conf->instance, "vbe", + "total_bytes", "bereq_protobytes", val); else if (strcmp(name, "beresp_hdrbytes") == 0) return varnish_submit_derive(conf->instance, "vbe", "total_bytes", "beresp_hdrbytes", val); else if (strcmp(name, "beresp_bodybytes") == 0) return varnish_submit_derive(conf->instance, "vbe", "total_bytes", "beresp_bodybytes", val); + else if (strcmp(name, "beresp_protobytes") == 0) + return varnish_submit_derive(conf->instance, "vbe", + "total_bytes", "beresp_protobytes", val); else if (strcmp(name, "pipe_hdrbytes") == 0) return varnish_submit_derive(conf->instance, "vbe", "total_bytes", "pipe_hdrbytes", val); @@ -751,13 +776,15 @@ static int varnish_monitor(void *priv, } /* All Stevedores support these counters */ - if (conf->collect_sma || conf->collect_smf) { + if (conf->collect_sma || conf->collect_smf || conf->collect_mse) { char category[4]; if (conf->collect_sma) strncpy(category, "sma", 4); - else + else if (conf->collect_smf) strncpy(category, "smf", 4); + else + strncpy(category, "mse", 4); if (strcmp(name, "c_req") == 0) return varnish_submit_derive(conf->instance, category, @@ -867,6 +894,99 @@ static int varnish_monitor(void *priv, return varnish_submit_gauge(conf->instance, "mempool", "objects", "ran_dry", val); } + + if (conf->collect_mse) { + if (strcmp(name, "c_full") == 0) + return varnish_submit_derive(conf->instance, "mse", + "total_operations", "full_allocs", val); + else if (strcmp(name, "c_truncated") == 0) + return varnish_submit_derive(conf->instance, "mse", + "total_operations", "truncated_allocs", val); + else if (strcmp(name, "c_expanded") == 0) + return varnish_submit_derive(conf->instance, "mse", + "total_operations", "expanded_allocs", val); + else if (strcmp(name, "c_failed") == 0) + return varnish_submit_derive(conf->instance, "mse", + "total_operations", "failed_allocs", val); + else if (strcmp(name, "c_bytes") == 0) + return varnish_submit_derive(conf->instance, "mse", + "total_bytes", "bytes_allocated", val); + else if (strcmp(name, "c_freed") == 0) + return varnish_submit_derive(conf->instance, "mse", + "total_bytes", "bytes_freed", val); + else if (strcmp(name, "g_fo_alloc") == 0) + return varnish_submit_derive(conf->instance, "mse", + "total_operations", "fo_allocs_outstanding", val); + else if (strcmp(name, "g_fo_bytes") == 0) + return varnish_submit_gauge(conf->instance, "mse", + "bytes", "fo_bytes_outstanding", val); + else if (strcmp(name, "g_membuf_alloc") == 0) + return varnish_submit_gauge(conf->instance, "mse", + "objects", "membufs_allocated", val); + else if (strcmp(name, "g_membuf_inuse") == 0) + return varnish_submit_gauge(conf->instance, "mse", + "objects", "membufs_inuse", val); + else if (strcmp(name, "g_bans_bytes") == 0) + return varnish_submit_gauge(conf->instance, "mse", + "bytes", "persisted_banspace_used", val); + else if (strcmp(name, "g_bans_space") == 0) + return varnish_submit_gauge(conf->instance, "mse", + "bytes", "persisted_banspace_available", val); + else if (strcmp(name, "g_bans_persisted") == 0) + return varnish_submit_derive(conf->instance, "mse", + "total_operations", "bans_persisted", val); + else if (strcmp(name, "g_bans_lost") == 0) + return varnish_submit_derive(conf->instance, "mse", + "total_operations", "bans_lost", val); + + /* mse seg */ + else if (strcmp(name, "g_journal_bytes") == 0) + return varnish_submit_gauge(conf->instance, "mse_reg", + "bytes", "journal_bytes_used", val); + else if (strcmp(name, "g_journal_space") == 0) + return varnish_submit_gauge(conf->instance, "mse_reg", + "bytes", "journal_bytes_free", val); + + /* mse segagg */ + else if (strcmp(name, "g_bigspace") == 0) + return varnish_submit_gauge(conf->instance, "mse_segagg", + "bytes", "big_extents_bytes_available", val); + else if (strcmp(name, "g_extfree") == 0) + return varnish_submit_gauge(conf->instance, "mse_segagg", + "objects", "free_extents", val); + else if (strcmp(name, "g_sparenode") == 0) + return varnish_submit_gauge(conf->instance, "mse_segagg", + "objects", "spare_nodes_available", val); + else if (strcmp(name, "g_objnode") == 0) + return varnish_submit_gauge(conf->instance, "mse_segagg", + "objects", "object_nodes_in_use", val); + else if (strcmp(name, "g_extnode") == 0) + return varnish_submit_gauge(conf->instance, "mse_segagg", + "objects", "extent_nodes_in_use", val); + else if (strcmp(name, "g_bigextfree") == 0) + return varnish_submit_gauge(conf->instance, "mse_segagg", + "objects", "free_big_extents", val); + else if (strcmp(name, "c_pruneloop") == 0) + return varnish_submit_derive(conf->instance, "mse_segagg", + "total_operations", "prune_loops", val); + else if (strcmp(name, "c_pruned") == 0) + return varnish_submit_derive(conf->instance, "mse_segagg", + "total_objects", "pruned_objects", val); + else if (strcmp(name, "c_spared") == 0) + return varnish_submit_derive(conf->instance, "mse_segagg", + "total_operations", "spared_objects", val); + else if (strcmp(name, "c_skipped") == 0) + return varnish_submit_derive(conf->instance, "mse_segagg", + "total_operations", "missed_objects", val); + else if (strcmp(name, "c_nuked") == 0) + return varnish_submit_derive(conf->instance, "mse_segagg", + "total_operations", "nuked_objects", val); + else if (strcmp(name, "c_sniped") == 0) + return varnish_submit_derive(conf->instance, "mse_segagg", + "total_operations", "sniped_objects", val); + + } + #endif return 0; @@ -1211,12 +1331,18 @@ static void varnish_monitor(const user_config_t *conf, /* {{{ */ } /* }}} void varnish_monitor */ #endif -#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 +#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5 static int varnish_read(user_data_t *ud) /* {{{ */ { +#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 struct VSM_data *vd; - const c_varnish_stats_t *stats; _Bool ok; + const c_varnish_stats_t *stats; +#elif HAVE_VARNISH_V5 + struct vsm *vd; + struct vsc *vsc; + int vsm_status; +#endif user_config_t *conf; @@ -1226,6 +1352,11 @@ static int varnish_read(user_data_t *ud) /* {{{ */ conf = ud->data; vd = VSM_New(); + +#if HAVE_VARNISH_V5 + vsc = VSC_New(); +#endif + #if HAVE_VARNISH_V3 VSC_Setup(vd); #endif @@ -1233,10 +1364,20 @@ static int varnish_read(user_data_t *ud) /* {{{ */ if (conf->instance != NULL) { int status; +#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 status = VSM_n_Arg(vd, conf->instance); +#elif HAVE_VARNISH_V5 + status = VSM_Arg(vd, 'n', conf->instance); +#endif + if (status < 0) { +#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 VSM_Delete(vd); - ERROR("varnish plugin: VSM_n_Arg (\"%s\") failed " +#elif HAVE_VARNISH_V5 + VSC_Destroy(&vsc, vd); + VSM_Destroy(&vd); +#endif + ERROR("varnish plugin: VSM_Arg (\"%s\") failed " "with status %i.", conf->instance, status); return -1; @@ -1245,34 +1386,61 @@ static int varnish_read(user_data_t *ud) /* {{{ */ #if HAVE_VARNISH_V3 ok = (VSC_Open(vd, /* diag = */ 1) == 0); -#else /* if HAVE_VARNISH_V4 */ +#elif HAVE_VARNISH_V4 ok = (VSM_Open(vd) == 0); #endif +#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 if (!ok) { - VSM_Delete(vd); + VSM_Destroy(&vd); ERROR("varnish plugin: Unable to open connection."); - return -1; } +#endif #if HAVE_VARNISH_V3 stats = VSC_Main(vd); -#else /* if HAVE_VARNISH_V4 */ +#elif HAVE_VARNISH_V4 stats = VSC_Main(vd, NULL); #endif +#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 if (!stats) { - VSM_Delete(vd); + VSM_Destroy(&vd); ERROR("varnish plugin: Unable to get statistics."); - return -1; } +#endif + +#if HAVE_VARNISH_V5 + if (VSM_Attach(vd, STDERR_FILENO)) { + ERROR("varnish plugin: Cannot attach to varnish. %s", VSM_Error(vd)); + VSC_Destroy(&vsc, vd); + VSM_Destroy(&vd); + return -1; + } + + vsm_status = VSM_Status(vd); + if (vsm_status & ~(VSM_MGT_RUNNING|VSM_WRK_RUNNING)) { + ERROR("varnish plugin: Unable to get statistics."); + VSC_Destroy(&vsc, vd); + VSM_Destroy(&vd); + return -1; + } +#endif #if HAVE_VARNISH_V3 VSC_Iter(vd, varnish_monitor, conf); -#else /* if HAVE_VARNISH_V4 */ +#elif HAVE_VARNISH_V4 VSC_Iter(vd, NULL, varnish_monitor, conf); +#elif HAVE_VARNISH_V5 + VSC_Iter(vsc, vd, varnish_monitor, conf); +#endif + +#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 + VSM_Delete(vd); +#elif HAVE_VARNISH_V5 + VSC_Destroy(&vsc, vd); + VSM_Destroy(&vd); #endif - VSM_Delete(vd); return 0; } /* }}} */ @@ -1337,24 +1505,25 @@ static int varnish_config_apply_default(user_config_t *conf) /* {{{ */ #if HAVE_VARNISH_V2 conf->collect_sm = 0; #endif -#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4 +#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5 conf->collect_sma = 0; #endif conf->collect_sms = 0; conf->collect_struct = 0; conf->collect_totals = 0; -#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 +#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5 conf->collect_uptime = 0; #endif conf->collect_vcl = 0; conf->collect_workers = 0; -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 conf->collect_vsm = 0; conf->collect_lck = 0; conf->collect_mempool = 0; conf->collect_mgt = 0; conf->collect_smf = 0; conf->collect_vbe = 0; + conf->collect_mse = 0; #endif return 0; @@ -1466,7 +1635,7 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */ else if (strcasecmp("CollectSMS", child->key) == 0) cf_util_get_boolean(child, &conf->collect_sms); else if (strcasecmp("CollectSMA", child->key) == 0) -#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4 +#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5 cf_util_get_boolean(child, &conf->collect_sma); #else WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.", @@ -1484,7 +1653,7 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */ else if (strcasecmp("CollectTotals", child->key) == 0) cf_util_get_boolean(child, &conf->collect_totals); else if (strcasecmp("CollectUptime", child->key) == 0) -#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 +#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5 cf_util_get_boolean(child, &conf->collect_uptime); #else WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.", @@ -1495,54 +1664,61 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */ else if (strcasecmp("CollectWorkers", child->key) == 0) cf_util_get_boolean(child, &conf->collect_workers); else if (strcasecmp("CollectVSM", child->key) == 0) -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 cf_util_get_boolean(child, &conf->collect_vsm); #else WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.", child->key, "v4"); #endif else if (strcasecmp("CollectLock", child->key) == 0) -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 cf_util_get_boolean(child, &conf->collect_lck); #else WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.", child->key, "v4"); #endif else if (strcasecmp("CollectMempool", child->key) == 0) -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 cf_util_get_boolean(child, &conf->collect_mempool); #else WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.", child->key, "v4"); #endif else if (strcasecmp("CollectManagement", child->key) == 0) -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 cf_util_get_boolean(child, &conf->collect_mgt); #else WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.", child->key, "v4"); #endif else if (strcasecmp("CollectSMF", child->key) == 0) -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 cf_util_get_boolean(child, &conf->collect_smf); #else WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.", child->key, "v4"); #endif else if (strcasecmp("CollectSMF", child->key) == 0) -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 cf_util_get_boolean(child, &conf->collect_smf); #else WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.", child->key, "v4"); #endif else if (strcasecmp("CollectVBE", child->key) == 0) -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 cf_util_get_boolean(child, &conf->collect_vbe); #else WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.", child->key, "v4"); #endif + else if (strcasecmp("CollectMSE", child->key) == 0) +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 + cf_util_get_boolean(child, &conf->collect_mse); +#else + WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.", + child->key, "Plus v4"); +#endif else { WARNING("Varnish plugin: Ignoring unknown " "configuration option: \"%s\". Did " @@ -1567,17 +1743,18 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */ #if HAVE_VARNISH_V2 && !conf->collect_sm #endif -#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4 +#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5 && !conf->collect_sma #endif && !conf->collect_struct && !conf->collect_totals -#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 +#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5 && !conf->collect_uptime #endif && !conf->collect_vcl && !conf->collect_workers -#if HAVE_VARNISH_V4 +#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5 && !conf->collect_vsm && !conf->collect_vbe && !conf->collect_smf && !conf->collect_mgt && !conf->collect_lck && !conf->collect_mempool + && !conf->collect_mse #endif ) { WARNING("Varnish plugin: No metric has been configured for "