# Varnish Input Plugin

This plugin gathers stats from [Varnish HTTP Cache](https://varnish-cache.org/)

## Global configuration options <!-- @/docs/includes/plugin_config.md -->

In addition to the plugin-specific configuration settings, plugins support
additional global and plugin configuration settings. These settings are used to
modify metrics, tags, and field or create aliases and configure ordering, etc.
See the [CONFIGURATION.md][CONFIGURATION.md] for more details.

[CONFIGURATION.md]: ../../../docs/CONFIGURATION.md#plugins

## Configuration

```toml @sample.conf
# A plugin to collect stats from Varnish HTTP Cache
# This plugin ONLY supports non-Windows
[[inputs.varnish]]
  ## If running as a restricted user you can prepend sudo for additional access:
  #use_sudo = false

  ## The default location of the varnishstat binary can be overridden with:
  binary = "/usr/bin/varnishstat"

  ## Additional custom arguments for the varnishstat command
  # binary_args = ["-f", "MAIN.*"]

  ## The default location of the varnishadm binary can be overridden with:
  adm_binary = "/usr/bin/varnishadm"

  ## Custom arguments for the varnishadm command
  # adm_binary_args = [""]

  ## Metric version defaults to metric_version=1, use metric_version=2 for removal of nonactive vcls
  ## Varnish 6.0.2 and newer is required for metric_version=2.
  metric_version = 1

  ## Additional regexps to override builtin conversion of varnish metrics into telegraf metrics.
  ## Regexp group "_vcl" is used for extracting the VCL name. Metrics that contain nonactive VCL's are skipped.
  ## Regexp group "_field" overrides the field name. Other named regexp groups are used as tags.
  # regexps = ['^XCNT\.(?P<_vcl>[\w\-]*)(\.)*(?P<group>[\w\-.+]*)\.(?P<_field>[\w\-.+]*)\.val']

  ## By default, telegraf gather stats for 3 metric points.
  ## Setting stats will override the defaults shown below.
  ## Glob matching can be used, ie, stats = ["MAIN.*"]
  ## stats may also be set to ["*"], which will collect all stats
  stats = ["MAIN.cache_hit", "MAIN.cache_miss", "MAIN.uptime"]

  ## Optional name for the varnish instance (or working directory) to query
  ## Usually append after -n in varnish cli
  # instance_name = instanceName

  ## Timeout for varnishstat command
  # timeout = "1s"
```

## Metrics

### metric_version=1

This is the full list of stats provided by varnish. Stats will be grouped by
their capitalized prefix (eg MAIN, MEMPOOL, etc). In the output, the prefix will
be used as a tag, and removed from field names.

- varnish
  - MAIN.uptime               (uint64, count, Child process uptime)
  - MAIN.sess_conn            (uint64, count, Sessions accepted)
  - MAIN.sess_drop            (uint64, count, Sessions dropped)
  - MAIN.sess_fail            (uint64, count, Session accept failures)
  - MAIN.sess_pipe_overflow   (uint64, count, Session pipe overflow)
  - MAIN.client_req_400       (uint64, count, Client requests received,)
  - MAIN.client_req_411       (uint64, count, Client requests received,)
  - MAIN.client_req_413       (uint64, count, Client requests received,)
  - MAIN.client_req_417       (uint64, count, Client requests received,)
  - MAIN.client_req           (uint64, count, Good client requests)
  - MAIN.cache_hit            (uint64, count, Cache hits)
  - MAIN.cache_hitpass        (uint64, count, Cache hits for)
  - MAIN.cache_miss           (uint64, count, Cache misses)
  - MAIN.backend_conn         (uint64, count, Backend conn. success)
  - MAIN.backend_unhealthy    (uint64, count, Backend conn. not)
  - MAIN.backend_busy         (uint64, count, Backend conn. too)
  - MAIN.backend_fail         (uint64, count, Backend conn. failures)
  - MAIN.backend_reuse        (uint64, count, Backend conn. reuses)
  - MAIN.backend_toolate      (uint64, count, Backend conn. was)
  - MAIN.backend_recycle      (uint64, count, Backend conn. recycles)
  - MAIN.backend_retry        (uint64, count, Backend conn. retry)
  - MAIN.fetch_head           (uint64, count, Fetch no body)
  - MAIN.fetch_length         (uint64, count, Fetch with Length)
  - MAIN.fetch_chunked        (uint64, count, Fetch chunked)
  - MAIN.fetch_eof            (uint64, count, Fetch EOF)
  - MAIN.fetch_bad            (uint64, count, Fetch bad T- E)
  - MAIN.fetch_close          (uint64, count, Fetch wanted close)
  - MAIN.fetch_oldhttp        (uint64, count, Fetch pre HTTP/1.1)
  - MAIN.fetch_zero           (uint64, count, Fetch zero len)
  - MAIN.fetch_1xx            (uint64, count, Fetch no body)
  - MAIN.fetch_204            (uint64, count, Fetch no body)
  - MAIN.fetch_304            (uint64, count, Fetch no body)
  - MAIN.fetch_failed         (uint64, count, Fetch failed (all)
  - MAIN.fetch_no_thread      (uint64, count, Fetch failed (no)
  - MAIN.pools                (uint64, count, Number of thread)
  - MAIN.threads              (uint64, count, Total number of)
  - MAIN.threads_limited      (uint64, count, Threads hit max)
  - MAIN.threads_created      (uint64, count, Threads created)
  - MAIN.threads_destroyed    (uint64, count, Threads destroyed)
  - MAIN.threads_failed       (uint64, count, Thread creation failed)
  - MAIN.thread_queue_len     (uint64, count, Length of session)
  - MAIN.busy_sleep           (uint64, count, Number of requests)
  - MAIN.busy_wakeup          (uint64, count, Number of requests)
  - MAIN.sess_queued          (uint64, count, Sessions queued for)
  - MAIN.sess_dropped         (uint64, count, Sessions dropped for)
  - MAIN.n_object             (uint64, count, object structs made)
  - MAIN.n_vampireobject      (uint64, count, unresurrected objects)
  - MAIN.n_objectcore         (uint64, count, objectcore structs made)
  - MAIN.n_objecthead         (uint64, count, objecthead structs made)
  - MAIN.n_waitinglist        (uint64, count, waitinglist structs made)
  - MAIN.n_backend            (uint64, count, Number of backends)
  - MAIN.n_expired            (uint64, count, Number of expired)
  - MAIN.n_lru_nuked          (uint64, count, Number of LRU)
  - MAIN.n_lru_moved          (uint64, count, Number of LRU)
  - MAIN.losthdr              (uint64, count, HTTP header overflows)
  - MAIN.s_sess               (uint64, count, Total sessions seen)
  - MAIN.s_req                (uint64, count, Total requests seen)
  - MAIN.s_pipe               (uint64, count, Total pipe sessions)
  - MAIN.s_pass               (uint64, count, Total pass- ed requests)
  - MAIN.s_fetch              (uint64, count, Total backend fetches)
  - MAIN.s_synth              (uint64, count, Total synthetic responses)
  - MAIN.s_req_hdrbytes       (uint64, count, Request header bytes)
  - MAIN.s_req_bodybytes      (uint64, count, Request body bytes)
  - MAIN.s_resp_hdrbytes      (uint64, count, Response header bytes)
  - MAIN.s_resp_bodybytes     (uint64, count, Response body bytes)
  - MAIN.s_pipe_hdrbytes      (uint64, count, Pipe request header)
  - MAIN.s_pipe_in            (uint64, count, Piped bytes from)
  - MAIN.s_pipe_out           (uint64, count, Piped bytes to)
  - MAIN.sess_closed          (uint64, count, Session Closed)
  - MAIN.sess_pipeline        (uint64, count, Session Pipeline)
  - MAIN.sess_readahead       (uint64, count, Session Read Ahead)
  - MAIN.sess_herd            (uint64, count, Session herd)
  - MAIN.shm_records          (uint64, count, SHM records)
  - MAIN.shm_writes           (uint64, count, SHM writes)
  - MAIN.shm_flushes          (uint64, count, SHM flushes due)
  - MAIN.shm_cont             (uint64, count, SHM MTX contention)
  - MAIN.shm_cycles           (uint64, count, SHM cycles through)
  - MAIN.sms_nreq             (uint64, count, SMS allocator requests)
  - MAIN.sms_nobj             (uint64, count, SMS outstanding allocations)
  - MAIN.sms_nbytes           (uint64, count, SMS outstanding bytes)
  - MAIN.sms_balloc           (uint64, count, SMS bytes allocated)
  - MAIN.sms_bfree            (uint64, count, SMS bytes freed)
  - MAIN.backend_req          (uint64, count, Backend requests made)
  - MAIN.n_vcl                (uint64, count, Number of loaded)
  - MAIN.n_vcl_avail          (uint64, count, Number of VCLs)
  - MAIN.n_vcl_discard        (uint64, count, Number of discarded)
  - MAIN.bans                 (uint64, count, Count of bans)
  - MAIN.bans_completed       (uint64, count, Number of bans)
  - MAIN.bans_obj             (uint64, count, Number of bans)
  - MAIN.bans_req             (uint64, count, Number of bans)
  - MAIN.bans_added           (uint64, count, Bans added)
  - MAIN.bans_deleted         (uint64, count, Bans deleted)
  - MAIN.bans_tested          (uint64, count, Bans tested against)
  - MAIN.bans_obj_killed      (uint64, count, Objects killed by)
  - MAIN.bans_lurker_tested   (uint64, count, Bans tested against)
  - MAIN.bans_tests_tested    (uint64, count, Ban tests tested)
  - MAIN.bans_lurker_tests_tested     (uint64, count, Ban tests tested)
  - MAIN.bans_lurker_obj_killed       (uint64, count, Objects killed by)
  - MAIN.bans_dups                    (uint64, count, Bans superseded by)
  - MAIN.bans_lurker_contention       (uint64, count, Lurker gave way)
  - MAIN.bans_persisted_bytes         (uint64, count, Bytes used by)
  - MAIN.bans_persisted_fragmentation (uint64, count, Extra bytes in)
  - MAIN.n_purges             (uint64, count, Number of purge)
  - MAIN.n_obj_purged         (uint64, count, Number of purged)
  - MAIN.exp_mailed           (uint64, count, Number of objects)
  - MAIN.exp_received         (uint64, count, Number of objects)
  - MAIN.hcb_nolock           (uint64, count, HCB Lookups without)
  - MAIN.hcb_lock             (uint64, count, HCB Lookups with)
  - MAIN.hcb_insert           (uint64, count, HCB Inserts)
  - MAIN.esi_errors           (uint64, count, ESI parse errors)
  - MAIN.esi_warnings         (uint64, count, ESI parse warnings)
  - MAIN.vmods                (uint64, count, Loaded VMODs)
  - MAIN.n_gzip               (uint64, count, Gzip operations)
  - MAIN.n_gunzip             (uint64, count, Gunzip operations)
  - MAIN.vsm_free             (uint64, count, Free VSM space)
  - MAIN.vsm_used             (uint64, count, Used VSM space)
  - MAIN.vsm_cooling          (uint64, count, Cooling VSM space)
  - MAIN.vsm_overflow         (uint64, count, Overflow VSM space)
  - MAIN.vsm_overflowed       (uint64, count, Overflowed VSM space)
  - MGT.uptime                (uint64, count, Management process uptime)
  - MGT.child_start           (uint64, count, Child process started)
  - MGT.child_exit            (uint64, count, Child process normal)
  - MGT.child_stop            (uint64, count, Child process unexpected)
  - MGT.child_died            (uint64, count, Child process died)
  - MGT.child_dump            (uint64, count, Child process core)
  - MGT.child_panic           (uint64, count, Child process panic)
  - MEMPOOL.vbc.live          (uint64, count, In use)
  - MEMPOOL.vbc.pool          (uint64, count, In Pool)
  - MEMPOOL.vbc.sz_wanted     (uint64, count, Size requested)
  - MEMPOOL.vbc.sz_needed     (uint64, count, Size allocated)
  - MEMPOOL.vbc.allocs        (uint64, count, Allocations )
  - MEMPOOL.vbc.frees         (uint64, count, Frees )
  - MEMPOOL.vbc.recycle       (uint64, count, Recycled from pool)
  - MEMPOOL.vbc.timeout       (uint64, count, Timed out from)
  - MEMPOOL.vbc.toosmall      (uint64, count, Too small to)
  - MEMPOOL.vbc.surplus       (uint64, count, Too many for)
  - MEMPOOL.vbc.randry        (uint64, count, Pool ran dry)
  - MEMPOOL.busyobj.live      (uint64, count, In use)
  - MEMPOOL.busyobj.pool      (uint64, count, In Pool)
  - MEMPOOL.busyobj.sz_wanted (uint64, count, Size requested)
  - MEMPOOL.busyobj.sz_needed (uint64, count, Size allocated)
  - MEMPOOL.busyobj.allocs    (uint64, count, Allocations )
  - MEMPOOL.busyobj.frees     (uint64, count, Frees )
  - MEMPOOL.busyobj.recycle   (uint64, count, Recycled from pool)
  - MEMPOOL.busyobj.timeout   (uint64, count, Timed out from)
  - MEMPOOL.busyobj.toosmall  (uint64, count, Too small to)
  - MEMPOOL.busyobj.surplus   (uint64, count, Too many for)
  - MEMPOOL.busyobj.randry    (uint64, count, Pool ran dry)
  - MEMPOOL.req0.live         (uint64, count, In use)
  - MEMPOOL.req0.pool         (uint64, count, In Pool)
  - MEMPOOL.req0.sz_wanted    (uint64, count, Size requested)
  - MEMPOOL.req0.sz_needed    (uint64, count, Size allocated)
  - MEMPOOL.req0.allocs       (uint64, count, Allocations )
  - MEMPOOL.req0.frees        (uint64, count, Frees )
  - MEMPOOL.req0.recycle      (uint64, count, Recycled from pool)
  - MEMPOOL.req0.timeout      (uint64, count, Timed out from)
  - MEMPOOL.req0.toosmall     (uint64, count, Too small to)
  - MEMPOOL.req0.surplus      (uint64, count, Too many for)
  - MEMPOOL.req0.randry       (uint64, count, Pool ran dry)
  - MEMPOOL.sess0.live        (uint64, count, In use)
  - MEMPOOL.sess0.pool        (uint64, count, In Pool)
  - MEMPOOL.sess0.sz_wanted   (uint64, count, Size requested)
  - MEMPOOL.sess0.sz_needed   (uint64, count, Size allocated)
  - MEMPOOL.sess0.allocs      (uint64, count, Allocations )
  - MEMPOOL.sess0.frees       (uint64, count, Frees )
  - MEMPOOL.sess0.recycle     (uint64, count, Recycled from pool)
  - MEMPOOL.sess0.timeout     (uint64, count, Timed out from)
  - MEMPOOL.sess0.toosmall    (uint64, count, Too small to)
  - MEMPOOL.sess0.surplus     (uint64, count, Too many for)
  - MEMPOOL.sess0.randry      (uint64, count, Pool ran dry)
  - MEMPOOL.req1.live         (uint64, count, In use)
  - MEMPOOL.req1.pool         (uint64, count, In Pool)
  - MEMPOOL.req1.sz_wanted    (uint64, count, Size requested)
  - MEMPOOL.req1.sz_needed    (uint64, count, Size allocated)
  - MEMPOOL.req1.allocs       (uint64, count, Allocations )
  - MEMPOOL.req1.frees        (uint64, count, Frees )
  - MEMPOOL.req1.recycle      (uint64, count, Recycled from pool)
  - MEMPOOL.req1.timeout      (uint64, count, Timed out from)
  - MEMPOOL.req1.toosmall     (uint64, count, Too small to)
  - MEMPOOL.req1.surplus      (uint64, count, Too many for)
  - MEMPOOL.req1.randry       (uint64, count, Pool ran dry)
  - MEMPOOL.sess1.live        (uint64, count, In use)
  - MEMPOOL.sess1.pool        (uint64, count, In Pool)
  - MEMPOOL.sess1.sz_wanted   (uint64, count, Size requested)
  - MEMPOOL.sess1.sz_needed   (uint64, count, Size allocated)
  - MEMPOOL.sess1.allocs      (uint64, count, Allocations )
  - MEMPOOL.sess1.frees       (uint64, count, Frees )
  - MEMPOOL.sess1.recycle     (uint64, count, Recycled from pool)
  - MEMPOOL.sess1.timeout     (uint64, count, Timed out from)
  - MEMPOOL.sess1.toosmall    (uint64, count, Too small to)
  - MEMPOOL.sess1.surplus     (uint64, count, Too many for)
  - MEMPOOL.sess1.randry      (uint64, count, Pool ran dry)
  - SMA.s0.c_req              (uint64, count, Allocator requests)
  - SMA.s0.c_fail             (uint64, count, Allocator failures)
  - SMA.s0.c_bytes            (uint64, count, Bytes allocated)
  - SMA.s0.c_freed            (uint64, count, Bytes freed)
  - SMA.s0.g_alloc            (uint64, count, Allocations outstanding)
  - SMA.s0.g_bytes            (uint64, count, Bytes outstanding)
  - SMA.s0.g_space            (uint64, count, Bytes available)
  - SMA.Transient.c_req       (uint64, count, Allocator requests)
  - SMA.Transient.c_fail      (uint64, count, Allocator failures)
  - SMA.Transient.c_bytes     (uint64, count, Bytes allocated)
  - SMA.Transient.c_freed     (uint64, count, Bytes freed)
  - SMA.Transient.g_alloc     (uint64, count, Allocations outstanding)
  - SMA.Transient.g_bytes     (uint64, count, Bytes outstanding)
  - SMA.Transient.g_space     (uint64, count, Bytes available)
  - VBE.default(127.0.0.1,,8080).vcls             (uint64, count, VCL references)
  - VBE.default(127.0.0.1,,8080).happy            (uint64, count, Happy health probes)
  - VBE.default(127.0.0.1,,8080).bereq_hdrbytes   (uint64, count, Req. header bytes)
  - VBE.default(127.0.0.1,,8080).bereq_bodybytes  (uint64, count, Request body bytes)
  - VBE.default(127.0.0.1,,8080).beresp_hdrbytes  (uint64, count, Resp. header bytes)
  - VBE.default(127.0.0.1,,8080).beresp_bodybytes (uint64, count, Response body bytes)
  - VBE.default(127.0.0.1,,8080).pipe_hdrbytes    (uint64, count, Pipe request header)
  - VBE.default(127.0.0.1,,8080).pipe_out         (uint64, count, Piped bytes to)
  - VBE.default(127.0.0.1,,8080).pipe_in          (uint64, count, Piped bytes from)
  - LCK.sms.creat             (uint64, count, Created locks)
  - LCK.sms.destroy           (uint64, count, Destroyed locks)
  - LCK.sms.locks             (uint64, count, Lock Operations)
  - LCK.smp.creat             (uint64, count, Created locks)
  - LCK.smp.destroy           (uint64, count, Destroyed locks)
  - LCK.smp.locks             (uint64, count, Lock Operations)
  - LCK.sma.creat             (uint64, count, Created locks)
  - LCK.sma.destroy           (uint64, count, Destroyed locks)
  - LCK.sma.locks             (uint64, count, Lock Operations)
  - LCK.smf.creat             (uint64, count, Created locks)
  - LCK.smf.destroy           (uint64, count, Destroyed locks)
  - LCK.smf.locks             (uint64, count, Lock Operations)
  - LCK.hsl.creat             (uint64, count, Created locks)
  - LCK.hsl.destroy           (uint64, count, Destroyed locks)
  - LCK.hsl.locks             (uint64, count, Lock Operations)
  - LCK.hcb.creat             (uint64, count, Created locks)
  - LCK.hcb.destroy           (uint64, count, Destroyed locks)
  - LCK.hcb.locks             (uint64, count, Lock Operations)
  - LCK.hcl.creat             (uint64, count, Created locks)
  - LCK.hcl.destroy           (uint64, count, Destroyed locks)
  - LCK.hcl.locks             (uint64, count, Lock Operations)
  - LCK.vcl.creat             (uint64, count, Created locks)
  - LCK.vcl.destroy           (uint64, count, Destroyed locks)
  - LCK.vcl.locks             (uint64, count, Lock Operations)
  - LCK.sessmem.creat         (uint64, count, Created locks)
  - LCK.sessmem.destroy       (uint64, count, Destroyed locks)
  - LCK.sessmem.locks         (uint64, count, Lock Operations)
  - LCK.sess.creat            (uint64, count, Created locks)
  - LCK.sess.destroy          (uint64, count, Destroyed locks)
  - LCK.sess.locks            (uint64, count, Lock Operations)
  - LCK.wstat.creat           (uint64, count, Created locks)
  - LCK.wstat.destroy         (uint64, count, Destroyed locks)
  - LCK.wstat.locks           (uint64, count, Lock Operations)
  - LCK.herder.creat          (uint64, count, Created locks)
  - LCK.herder.destroy        (uint64, count, Destroyed locks)
  - LCK.herder.locks          (uint64, count, Lock Operations)
  - LCK.wq.creat              (uint64, count, Created locks)
  - LCK.wq.destroy            (uint64, count, Destroyed locks)
  - LCK.wq.locks              (uint64, count, Lock Operations)
  - LCK.objhdr.creat          (uint64, count, Created locks)
  - LCK.objhdr.destroy        (uint64, count, Destroyed locks)
  - LCK.objhdr.locks          (uint64, count, Lock Operations)
  - LCK.exp.creat             (uint64, count, Created locks)
  - LCK.exp.destroy           (uint64, count, Destroyed locks)
  - LCK.exp.locks             (uint64, count, Lock Operations)
  - LCK.lru.creat             (uint64, count, Created locks)
  - LCK.lru.destroy           (uint64, count, Destroyed locks)
  - LCK.lru.locks             (uint64, count, Lock Operations)
  - LCK.cli.creat             (uint64, count, Created locks)
  - LCK.cli.destroy           (uint64, count, Destroyed locks)
  - LCK.cli.locks             (uint64, count, Lock Operations)
  - LCK.ban.creat             (uint64, count, Created locks)
  - LCK.ban.destroy           (uint64, count, Destroyed locks)
  - LCK.ban.locks             (uint64, count, Lock Operations)
  - LCK.vbp.creat             (uint64, count, Created locks)
  - LCK.vbp.destroy           (uint64, count, Destroyed locks)
  - LCK.vbp.locks             (uint64, count, Lock Operations)
  - LCK.backend.creat         (uint64, count, Created locks)
  - LCK.backend.destroy       (uint64, count, Destroyed locks)
  - LCK.backend.locks         (uint64, count, Lock Operations)
  - LCK.vcapace.creat         (uint64, count, Created locks)
  - LCK.vcapace.destroy       (uint64, count, Destroyed locks)
  - LCK.vcapace.locks         (uint64, count, Lock Operations)
  - LCK.nbusyobj.creat        (uint64, count, Created locks)
  - LCK.nbusyobj.destroy      (uint64, count, Destroyed locks)
  - LCK.nbusyobj.locks        (uint64, count, Lock Operations)
  - LCK.busyobj.creat         (uint64, count, Created locks)
  - LCK.busyobj.destroy       (uint64, count, Destroyed locks)
  - LCK.busyobj.locks         (uint64, count, Lock Operations)
  - LCK.mempool.creat         (uint64, count, Created locks)
  - LCK.mempool.destroy       (uint64, count, Destroyed locks)
  - LCK.mempool.locks         (uint64, count, Lock Operations)
  - LCK.vxid.creat            (uint64, count, Created locks)
  - LCK.vxid.destroy          (uint64, count, Destroyed locks)
  - LCK.vxid.locks            (uint64, count, Lock Operations)
  - LCK.pipestat.creat        (uint64, count, Created locks)
  - LCK.pipestat.destroy      (uint64, count, Destroyed locks)
  - LCK.pipestat.locks        (uint64, count, Lock Operations)

### Tags

As indicated above, the prefix of a varnish stat will be used as it's 'section'
tag. So section tag may have one of the following values:

- section:
  - MAIN
  - MGT
  - MEMPOOL
  - SMA
  - VBE
  - LCK

### metric_version=2

When `metric_version=2` is enabled, the plugin runs `varnishstat -j` command and
parses the JSON output into metrics.

Plugin uses `varnishadm vcl.list -j` commandline to find the active VCL. Metrics
that are related to the nonactive VCL are excluded from monitoring.

## Requirements

- Varnish 6.0.2+ is required (older versions do not support JSON output from
  CLI tools)

## Examples

Varnish counter:

```json
{
  "MAIN.cache_hit": {
    "description": "Cache hits",
    "flag": "c",
    "format": "i",
    "value": 51
  }
}
```

Influx metric:
`varnish,section=MAIN cache_hit=51i 1462765437090957980`

## Advanced customizations using regexps

Finding the VCL in a varnish measurement and parsing into tags can be adjusted
by using GO regular expressions.

Regexps use a special named group `(?P<_vcl>[\w\-]*)(\.)` to extract VCL
name. `(?P<_field>[\w\-.+]*)\.val` regexp group extracts the field name. All
other named regexp groups like `(?P<my_tag>[\w\-.+]*)` are tags.

_Tip: It is useful to verify regexps using online tools like
<https://regoio.herokuapp.com/>._

By default, the plugin has a builtin list of regexps for following VMODs:

### Dynamic Backends (goto)

```regex
^VBE\.(?P<_vcl>[\w\-]*)\.goto\.[[:alnum:]]+\.\((?P<backend>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\)\.\((?P<server>.*)\)\.\(ttl:\d*\.\d*.*\)
```

with data

```text
VBE.VCL12323.goto.000007c8.(123.123.123.123).(http://aaa.xxcc:80).(ttl:3600.000000).cache_hit
```

results in

```text
varnish,section=VBE,backend="123.123.123.123",server="http://aaa.xxcc:80" cache_hit=51i 1462765437090957980
```

### Key value storage (kvstore)

```regex
^KVSTORE\.(?P<id>[\w\-]*)\.(?P<_vcl>[\w\-]*)\.([\w\-]*)
```

with data

```text
KVSTORE.object_name.vcl_name.key
```

 -> `varnish,section=KVSTORE,id=object_name key=5i`

### XCNT (libvmod-xcounter)

```regex
^XCNT\.(?P<_vcl>[\w\-]*)(\.)*(?P<group>[\w\-.+]*)\.(?P<_field>[\w\-.+]*)\.val
```

with data

```text
XCNT.abc1234.XXX+_YYYY.cr.pass.val
```

results in

```text
varnish,section=XCNT,group="XXX+_YYYY.cr" pass=5i
```

### Standard VBE metrics

```regex
^VBE\.(?P<_vcl>[\w\-]*)\.(?P<backend>[\w\-]*)\.([\w\-]*)
```

with data

```text
VBE.reload_20210622_153544_23757.default.unhealthy
```

results in

```text
varnish,section=VBE,backend="default" unhealthy=51i 1462765437090957980
```

### Default generic metric

```regex
([\w\-]*)\.(?P<_field>[\w\-.]*)
```

with data

```text
MSE_STORE.store-1-1.g_aio_running_bytes_write
```

results in

```text
varnish,section=MSE_STORE store-1-1.g_aio_running_bytes_write=5i
```

The default regexps list can be extended in the telegraf config. The following
example shows a config with a custom regexp for parsing of `accounting` VMOD
metrics in `ACCG.<namespace>.<key>.<stat_name>` format. The namespace value will
be used as a tag.

```toml
[[inputs.varnish]]
    regexps = ['^ACCG.(?P<namespace>[\w-]*).(?P<_field>[\w-.]*)']
```

## Custom arguments

You can change the default binary location and custom arguments for
`varnishstat` and `varnishadm` command output. This is useful when running
varnish in docker or executing using varnish by SSH on a different machine.

It's important to note that `instance_name` parameter is not take into account
when using custom `binary_args` or `adm_binary_args`. You have to add `"-n",
"/instance_name"` manually into configuration.

### Example for SSH

```toml
[[inputs.varnish]]
  binary = "/usr/bin/ssh"
  binary_args = ["root@10.100.0.112", "varnishstat", "-n", "/var/lib/varnish/ubuntu", "-j"]
  adm_binary   =  "/usr/bin/ssh"
  adm_binary_args = ["root@10.100.0.112", "varnishadm", "-n", "/var/lib/varnish/ubuntu", "vcl.list", "-j"]
  metric_version = 2
  stats = ["*"]
```

### Example for Docker

```toml
[[inputs.varnish]]
  binary = "/usr/local/bin/docker"
  binary_args = ["exec", "-t", "container_name", "varnishstat",  "-j"]
  adm_binary   =  "/usr/local/bin/docker"
  adm_binary_args =  ["exec", "-t", "container_name", "varnishadm", "vcl.list", "-j"]
  metric_version = 2
  stats = ["*"]
```

## Permissions

It's important to note that this plugin references `varnishstat` and
`varnishadm`, which may require additional permissions to execute successfully.
Depending on the user/group permissions of the telegraf user executing this
plugin, you may need to alter the group membership, set facls, or use sudo.

### Group membership (Recommended)

```bash
$ groups telegraf
telegraf : telegraf

$ usermod -a -G varnish telegraf

$ groups telegraf
telegraf : telegraf varnish
```

### Extended filesystem ACL's

```bash
$ getfacl /var/lib/varnish/<hostname>/_.vsm
# file: var/lib/varnish/<hostname>/_.vsm
# owner: root
# group: root
user::rw-
group::r--
other::---

$ setfacl -m u:telegraf:r /var/lib/varnish/<hostname>/_.vsm

$ getfacl /var/lib/varnish/<hostname>/_.vsm
# file: var/lib/varnish/<hostname>/_.vsm
# owner: root
# group: root
user::rw-
user:telegraf:r--
group::r--
mask::r--
other::---
```

**Sudo privileges**:
If you use this method, you will need the following in your telegraf config:

```toml
[[inputs.varnish]]
  use_sudo = true
```

You will also need to update your sudoers file:

```bash
$ visudo
# Add the following line:
Cmnd_Alias VARNISHSTAT = /usr/bin/varnishstat
telegraf  ALL=(ALL) NOPASSWD: VARNISHSTAT
Defaults!VARNISHSTAT !logfile, !syslog, !pam_session
```

Please use the solution you see as most appropriate.

## Example Output

### metric_version = 1

```bash
 telegraf --config etc/telegraf.conf --input-filter varnish --test
* Plugin: varnish, Collection 1
> varnish,host=rpercy-VirtualBox,section=MAIN cache_hit=0i,cache_miss=0i,uptime=8416i 1462765437090957980
```

### metric_version = 2

```bash
telegraf --config etc/telegraf.conf --input-filter varnish --test
> varnish,host=kozel.local,section=MAIN n_vampireobject=0i 1631121567000000000
> varnish,backend=server_test1,host=kozel.local,section=VBE fail_eacces=0i 1631121567000000000
> varnish,backend=default,host=kozel.local,section=VBE req=0i 1631121567000000000
> varnish,host=kozel.local,section=MAIN client_req_400=0i 1631121567000000000
> varnish,host=kozel.local,section=MAIN shm_cycles=10i 1631121567000000000
> varnish,backend=default,host=kozel.local,section=VBE pipe_hdrbytes=0i 1631121567000000000
```

You can merge metrics together into a metric with multiple fields into the most
memory and network transfer efficient form using `aggregators.merge`

```toml
[[aggregators.merge]]
  drop_original = true
```

The output will be:

```shell
telegraf --config etc/telegraf.conf --input-filter varnish --test
```

```text
varnish,host=kozel.local,section=MAIN backend_busy=0i,backend_conn=19i,backend_fail=0i,backend_recycle=8i,backend_req=19i,backend_retry=0i,backend_reuse=0i,backend_unhealthy=0i,bans=1i,bans_added=1i,bans_completed=1i,bans_deleted=0i,bans_dups=0i,bans_lurker_contention=0i,bans_lurker_obj_killed=0i,bans_lurker_obj_killed_cutoff=0i,bans_lurker_tested=0i,bans_lurker_tests_tested=0i,bans_obj=0i,bans_obj_killed=0i,bans_persisted_bytes=16i,bans_persisted_fragmentation=0i,bans_req=0i,bans_tested=0i,bans_tests_tested=0i,busy_killed=0i,busy_sleep=0i,busy_wakeup=0i,cache_hit=643999i,cache_hit_grace=22i,cache_hitmiss=0i,cache_hitpass=0i,cache_miss=1i,client_req=644000i,client_req_400=0i,client_req_417=0i,client_resp_500=0i,esi_errors=0i,esi_warnings=0i,exp_mailed=37i,exp_received=37i,fetch_1xx=0i,fetch_204=0i,fetch_304=2i,fetch_bad=0i,fetch_chunked=6i,fetch_eof=0i,fetch_failed=0i,fetch_head=0i,fetch_length=11i,fetch_no_thread=0i,fetch_none=0i,hcb_insert=1i,hcb_lock=1i,hcb_nolock=644000i,losthdr=0i,n_backend=19i,n_expired=1i,n_gunzip=289204i,n_gzip=0i,n_lru_limited=0i,n_lru_moved=843i,n_lru_nuked=0i,n_obj_purged=0i,n_object=0i,n_objectcore=40i,n_objecthead=40i,n_purges=0i,n_test_gunzip=6i,n_vampireobject=0i,n_vcl=7i,n_vcl_avail=7i,n_vcl_discard=0i,pools=2i,req_dropped=0i,s_fetch=1i,s_pass=0i,s_pipe=0i,s_pipe_hdrbytes=0i,s_pipe_in=0i,s_pipe_out=0i,s_req_bodybytes=0i,s_req_hdrbytes=54740000i,s_resp_bodybytes=341618192i,s_resp_hdrbytes=190035576i,s_sess=651038i,s_synth=0i,sc_overload=0i,sc_pipe_overflow=0i,sc_range_short=0i,sc_rem_close=7038i,sc_req_close=0i,sc_req_http10=644000i,sc_req_http20=0i,sc_resp_close=0i,sc_rx_bad=0i,sc_rx_body=0i,sc_rx_junk=0i,sc_rx_overflow=0i,sc_rx_timeout=0i,sc_tx_eof=0i,sc_tx_error=0i,sc_tx_pipe=0i,sc_vcl_failure=0i,sess_closed=644000i,sess_closed_err=644000i,sess_conn=651038i,sess_drop=0i,sess_dropped=0i,sess_fail=0i,sess_fail_ebadf=0i,sess_fail_econnaborted=0i,sess_fail_eintr=0i,sess_fail_emfile=0i,sess_fail_enomem=0i,sess_fail_other=0i,sess_herd=11i,sess_queued=0i,sess_readahead=0i,shm_cont=3572i,shm_cycles=10i,shm_flushes=0i,shm_records=30727866i,shm_writes=4661979i,summs=2225754i,thread_queue_len=0i,threads=200i,threads_created=200i,threads_destroyed=0i,threads_failed=0i,threads_limited=0i,uptime=4416326i,vcl_fail=0i,vmods=2i,ws_backend_overflow=0i,ws_client_overflow=0i,ws_session_overflow=0i,ws_thread_overflow=0i 1631121675000000000
varnish,backend=default,host=kozel.local,section=VBE bereq_bodybytes=0i,bereq_hdrbytes=0i,beresp_bodybytes=0i,beresp_hdrbytes=0i,busy=0i,conn=0i,fail=0i,fail_eacces=0i,fail_eaddrnotavail=0i,fail_econnrefused=0i,fail_enetunreach=0i,fail_etimedout=0i,fail_other=0i,happy=9223372036854775807i,helddown=0i,pipe_hdrbytes=0i,pipe_in=0i,pipe_out=0i,req=0i,unhealthy=0i 1631121675000000000
varnish,backend=server1,host=kozel.local,section=VBE bereq_bodybytes=0i,bereq_hdrbytes=0i,beresp_bodybytes=0i,beresp_hdrbytes=0i,busy=0i,conn=0i,fail=0i,fail_eacces=0i,fail_eaddrnotavail=0i,fail_econnrefused=30609i,fail_enetunreach=0i,fail_etimedout=0i,fail_other=0i,happy=0i,helddown=3i,pipe_hdrbytes=0i,pipe_in=0i,pipe_out=0i,req=0i,unhealthy=0i 1631121675000000000
varnish,backend=server2,host=kozel.local,section=VBE bereq_bodybytes=0i,bereq_hdrbytes=0i,beresp_bodybytes=0i,beresp_hdrbytes=0i,busy=0i,conn=0i,fail=0i,fail_eacces=0i,fail_eaddrnotavail=0i,fail_econnrefused=30609i,fail_enetunreach=0i,fail_etimedout=0i,fail_other=0i,happy=0i,helddown=3i,pipe_hdrbytes=0i,pipe_in=0i,pipe_out=0i,req=0i,unhealthy=0i 1631121675000000000
varnish,backend=server_test1,host=kozel.local,section=VBE bereq_bodybytes=0i,bereq_hdrbytes=0i,beresp_bodybytes=0i,beresp_hdrbytes=0i,busy=0i,conn=0i,fail=0i,fail_eacces=0i,fail_eaddrnotavail=0i,fail_econnrefused=49345i,fail_enetunreach=0i,fail_etimedout=0i,fail_other=0i,happy=0i,helddown=2i,pipe_hdrbytes=0i,pipe_in=0i,pipe_out=0i,req=0i,unhealthy=0i 1631121675000000000
```
