pax_global_header00006660000000000000000000000064135553015520014516gustar00rootroot0000000000000052 comment=7ac4b619fcd279044591102686568d83186fdf64 prometheus_varnish_exporter-1.5.2/000077500000000000000000000000001355530155200174005ustar00rootroot00000000000000prometheus_varnish_exporter-1.5.2/.gitignore000066400000000000000000000001021355530155200213610ustar00rootroot00000000000000 bin prometheus_varnish_exporter prometheus_varnish_exporter.exe prometheus_varnish_exporter-1.5.2/.travis.yml000066400000000000000000000042241355530155200215130ustar00rootroot00000000000000sudo: required language: go go: - 1.12.6 env: - GO111MODULE=on before_script: - sudo apt-get install varnish -y - varnishstat -V script: - go build -v - sudo $GOROOT/bin/go test -v ./... after_success: - if [ -n "$TRAVIS_TAG" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then ./build.sh $TRAVIS_TAG; fi deploy: provider: releases api_key: secure: eDySTfAst2/hz39o1Lt2OnbNtep/eyeFPIT9WdpK8ajVuXAdP2MAwwotmH30iGjCijLW0k7vzZI7yczHqUSEB0E9qHXhF2LDLeirlSMHVWPl4sRDq1+gn0nHBkgH5jO5vAE3pj+zd/N+4rKutCtOBhsfdZKxDuxJXR8On0wwnCVFVQoIsC7gqM2TGmtFpfSFwVefNHdYyWgh0YMg9JtzUp2mSQr8e0+L4fO5jafhpbFXlTzhxqoPwyI2UhnXRLTjCQWWCjxN+37ij13Y6H9NxEaHJr+t9ejpNbKFfUZmhF/9n2seesoeYC9HEkEWTTjuERc1CQlgtxG+sMk1b0ejZio0QUQbVB1U+aTtac2m3U5k4oEAUhYs4rHKy+QmVSRp3Qmo+PV7CuSv9CKivxhvbMUPpos1eF6CuHR3ZKjn/11VimnhpXJcyl44oM4UfoLsZuOcieWta9fLBd0EO+SIvmaBLljAKRMjrnCpkT9E0dKWgUqyDQzqv5l2WZ7lFT+bWuDJ7WeIwnG59jVOjSwvniFWQwQyJ0BmjjGB4g3ZYSQb8oBj+6RzxoBPpoEewBsypXZoDB0yL7GEqxnHmoVLe7D6R/lG+TeTVMOZLkAw13UNAw1v1VHwe0kjM5zqEMekZaLbmvHVC5hUEUob4xsiQu/qHGelT9+Gq9ICwB8GbWg= file: - "bin/release/prometheus_varnish_exporter-$TRAVIS_TAG.linux-amd64.tar.gz" - "bin/release/prometheus_varnish_exporter-$TRAVIS_TAG.linux-386.tar.gz" - "bin/release/prometheus_varnish_exporter-$TRAVIS_TAG.freebsd-amd64.tar.gz" - "bin/release/prometheus_varnish_exporter-$TRAVIS_TAG.freebsd-386.tar.gz" - "bin/release/prometheus_varnish_exporter-$TRAVIS_TAG.openbsd-amd64.tar.gz" - "bin/release/prometheus_varnish_exporter-$TRAVIS_TAG.openbsd-386.tar.gz" - "bin/release/prometheus_varnish_exporter-$TRAVIS_TAG.netbsd-amd64.tar.gz" - "bin/release/prometheus_varnish_exporter-$TRAVIS_TAG.netbsd-386.tar.gz" - "bin/release/prometheus_varnish_exporter-$TRAVIS_TAG.darwin-amd64.tar.gz" - "bin/release/prometheus_varnish_exporter-$TRAVIS_TAG.darwin-386.tar.gz" - "bin/release/prometheus_varnish_exporter-$TRAVIS_TAG.windows-amd64.tar.gz" - "bin/release/prometheus_varnish_exporter-$TRAVIS_TAG.windows-386.tar.gz" - "bin/release/dashboards-$TRAVIS_TAG.tar.gz" - "bin/release/sha256sums.txt" skip_cleanup: true on: repo: jonnenauha/prometheus_varnish_exporter tags: true prometheus_varnish_exporter-1.5.2/CHANGELOG.md000066400000000000000000000114031355530155200212100ustar00rootroot000000000000001.5.2 ===== * Fix metric names and missing labels for file cache metrics ([#55](https://github.com/jonnenauha/prometheus_varnish_exporter/pull/55) @thedustin) * Fix scraping for Varnish 3.x. Removes the `main_n_ban` grouping. Metrics will now have individual `bans_` metrics instad of the grouped metric that had `type` as a label. ([#51](https://github.com/jonnenauha/prometheus_varnish_exporter/pull/51) @glennslaven) * If you previously updated to 1.5 your exports would have already been broken as the grouping tries to combine gauge and counter metrics, which is not allowed by Prometheus. * This is breaking change if you are using Varnish 3.x and use ban metrics in your dashboards, you'll need to update them to the new ones. * Clean exported backend name if beginning with reload_ ([#56](https://github.com/jonnenauha/prometheus_varnish_exporter/pull/56) @stromnet) 1.5.1 ===== * Fix incorrectly typing Varnish 4.0.x stat flag `a` metrics as gauges instead of counters. ([#48](https://github.com/jonnenauha/prometheus_varnish_exporter/pull/48) @glennslaven) * Fix `-test` mode to wait for full metrics scrape before continuing. 1.5 === * Deprecate `-no-exit`. Default behavior is now not to exit on scrape errors as it should be for a long running HTTP server. * This was design misstep. You will now get a deprecation warning if you pass `-no-exit` but the process behaves as before. * New explicit `-exit-on-errors` has been added for users who want the old default behavior back. * Correctly export gauge and counter types from `varnishstat` output `type` property. * Add go module support. * Use `github.com/prometheus/client_golang` v1.0.0 * Start building releases with go 1.12.6 1.4.1 ===== * `-docker-container-name` to signal that `varnishstat` should be ran in a docker container with `docker exec ` . * Support Varnish 6.0.0 by testing the main logic works and metrics are exported. * Start building releases with go 1.10.3 1.4 === * Standard non Varnish prometheus metrics need to now be enabled with `-with-go-metrics`. Before they were included by default. Now dropped to export less clutter that majority of users will never need (@nipuntalukdar). * Fix `varnish_backend_up` with Varnish 4.0 and earlier versions. 1.3.4 ===== * New per backend metric `varnish_backend_up` with 1/0 value that reflects the latest health probe result. The Varnish bitmap uint64 `varnish_backend_happy` as a prometheus float metric was not that useful in detecting latest up/down per backend. * Ability to give custom path to varnishstat with `-varnishstat-path` (@zstyblik) * Github releases now include Grafana dashboards archive. This includes all the dashboards posted by users in the repo, starting with my own. 1.3.3 ===== * New `-no-exit` mode that does not exit the process if varnish is not running at the time of startup. * Support Varnish 5.2 [that removed](http://varnish-cache.org/docs/5.2/whats-new/upgrading-5.2.html#other-changes) `type` and `ident` properties from varnishstat JSON output. If `ident` is not present, it is now parsed from the metric name. * Add tests to run scrape on static json files. * Start building releases with go 1.9.1 1.3.2 ===== * Update readme to mention that exporter has been tested to work against Varnish 5.x releases. * Start building releases with go 1.9 1.3.1 ===== * Don't return a 400 for `/` to behave more like other Prometheus exporters out there. Can now be used for health checks. ([#15](https://github.com/jonnenauha/prometheus_varnish_exporter/pull/15)) * Start building releases with go 1.8 1.3 === * Release packages now use the same naming and internal structure scheme with [promu](https://github.com/prometheus/promu). * Fixes issues running this exporter with systems like [puppet-prometheus](https://github.com/voxpupuli/puppet-prometheus) * No code changes * Start building releases with go 1.7.5 1.2 === * Fix VBE label inconsistencies by always having `backend` and `server` labels present. ([#5](https://github.com/jonnenauha/prometheus_varnish_exporter/issues/5) [#8](https://github.com/jonnenauha/prometheus_varnish_exporter/issues/8)) * Resulted in varnish reporting lots of errors for a while after VCL reloads. * Fix bugs in `backend` and `server` label value parsing from VBE ident. ([#5](https://github.com/jonnenauha/prometheus_varnish_exporter/issues/5) [#8](https://github.com/jonnenauha/prometheus_varnish_exporter/issues/8)) * Add travis-ci build and test integration. Also auto pushes cross compiled binaries to github releases on tags. 1.1 === * `-web.health-path ` can be configured to return a 200 OK response, by default not enabled. [#6](https://github.com/jonnenauha/prometheus_varnish_exporter/pull/6) * Start building releases with go 1.7.3 1.0 === * First official release * Start building releases with go 1.7.1 prometheus_varnish_exporter-1.5.2/ISSUE_TEMPLATE.md000066400000000000000000000001561355530155200221070ustar00rootroot00000000000000* **Varnish** `fill_version` * **prometheus_varnish_exporter** `fill_version` ------------------ Message... prometheus_varnish_exporter-1.5.2/LICENSE000066400000000000000000000020661355530155200204110ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2016 Jonne Nauha Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. prometheus_varnish_exporter-1.5.2/README.md000066400000000000000000000116741355530155200206700ustar00rootroot00000000000000[![Build Status](https://travis-ci.org/jonnenauha/prometheus_varnish_exporter.svg?branch=master)](https://travis-ci.org/jonnenauha/prometheus_varnish_exporter) # Varnish exporter for Prometheus ![Grafana example](dashboards/jonnenauha/dashboard.png) Scrapes the `varnishstat -j` JSON output on each Prometheus collect and exposes all reported metrics. Metrics with multiple backends or varnish defined identifiers (e.g. `VBE.*.happy SMA.*.c_bytes LCK.*.creat`) and other metrics with similar structure (e.g. `MAIN.fetch_*`) are combined under a single metric name with distinguishable labels. Vanish naming conventions are preserved as much as possible to be familiar to Varnish users when building queries, while at the same time trying to following Prometheus conventions like lower casing and using `_` separators. Handles runtime Varnish changes like adding new backends via vlc reload. Removed backends are reported by `varnishstat` until Varnish is restarted. Advanced users can use `-n -N`, they are passed to `varnishstat`. I have personally tested the following versions of Varnish to work `6.0.0, 5.2.1, 5.1.2, 4.1.1, 4.1.0, 4.0.3 and 3.0.5`. Missing category groupings in 3.x like `MAIN.` are detected and added automatically for label names to be consistent across versions, assuming of course that the Varnish project does not remove/change the stats. I won't make any backwards compatibility promises at this point. Your built queries can break on new versions if metric names or labels are refined. If you find bugs or have feature requests feel free to create issues or send PRs. # Installing and running You can find the latest binary releases for linux, darwin, windows, freebsd, openbsd and netbsd from the [github releases page](https://github.com/jonnenauha/prometheus_varnish_exporter/releases). By default the exporter listens on port 9131. See `prometheus_varnish_exporter -h` for available options. To test that `varnishstat` is found on the host machine and to preview all exported metrics run prometheus_varnish_exporter -test # Docker Scraping metrics from Varnish running in a docker container is possible since 1.4.1. Resolve your Varnish container name with `docker ps` and run the following. This will use `docker exec ` to execute varnishstat inside the spesified container. prometheus_varnish_exporter -docker-container-name I still don't have a easy, clear and user friendly way of running this exporter in a docker container. For community efforts and solutions see [this issue](https://github.com/jonnenauha/prometheus_varnish_exporter/issues/25#issuecomment-492546458). # Grafana dashboards You can download my dashboard seen in the above picture [here](dashboards/jonnenauha/dashboard.json). I use it at work with our production Varnish instances. I would be interested in your dashboards if you wish to share them or improvement ideas to my current one. # Varnish 4 and VCL UUIDs Starting with version 1.2 `backend` and `server` labels are always set. For backend-related metrics and Varnish 4 the `server` tag will be set to the VCL UUIDs for that backend. Note that there might be multiple VCLs loaded at the same time and the `server` tag might not be meaningful in that case. To aggregate all loaded VCLs into per-backend metric the following Prometheus [recording rules](https://prometheus.io/docs/querying/rules/) are recommended: backend:varnish_backend_bereq_bodybytes:sum = sum(varnish_backend_bereq_bodybytes) without (server) backend:varnish_backend_bereq_hdrbytes:sum = sum(varnish_backend_bereq_hdrbytes) without (server) backend:varnish_backend_beresp_bodybytes:sum = sum(varnish_backend_beresp_bodybytes) without (server) backend:varnish_backend_beresp_hdrbytes:sum = sum(varnish_backend_beresp_hdrbytes) without (server) backend:varnish_backend_conn:sum = sum(varnish_backend_conn) without (server) backend:varnish_backend_happy:sum = sum(varnish_backend_happy) without (server) backend:varnish_backend_pipe_hdrbytes:sum = sum(varnish_backend_pipe) without (server) backend:varnish_backend_pipe_in:sum = sum(varnish_backend_pipe_in) without (server) backend:varnish_backend_pipe_out:sum = sum(varnish_backend_pipe_out) without (server) backend:varnish_backend_req:sum = sum(varnish_backend_req) without (server) # Build **One time setup** This repot support go modules so out of `GOPATH` builds are supported. This makes development and buildings easier for go "novices". You need go 1.11 or higher, otherwise you can keep using `GOPATH` based development ([see old README](https://github.com/jonnenauha/prometheus_varnish_exporter/blob/1.4.1/README.md#build)). 1. [Install latest go](https://golang.org/doc/install) or use OS repos `golang` package. **Development** ```bash # clone git clone git@github.com:jonnenauha/prometheus_varnish_exporter.git cd prometheus_varnish_exporter # build binary to current directory go build # release with cross compilation ./build.sh ``` prometheus_varnish_exporter-1.5.2/build.sh000077500000000000000000000040071355530155200210370ustar00rootroot00000000000000#!/bin/bash set -e if [ ! -e main.go ] ; then echo "Error: Script can only be ran on the root of the source tree" exit 1 fi rm -rf bin mkdir -p bin/build bin/release VERSION=$1 VERSION_HASH="$(git rev-parse --short HEAD)" VERSION_DATE="$(date -u '+%d.%m.%Y %H:%M:%S')" echo -e "\nVERSION=$VERSION" echo "VERSION_HASH=$VERSION_HASH" echo "VERSION_DATE=$VERSION_DATE" if [ -z "$VERSION" ]; then echo "Error: First argument must be release version" exit 1 fi tar -cvzf ./bin/release/dashboards-$VERSION.tar.gz dashboards/* > /dev/null 2>&1 for goos in linux darwin windows freebsd openbsd netbsd ; do for goarch in amd64 386; do # path file_versioned="prometheus_varnish_exporter-$VERSION.$goos-$goarch" outdir="bin/build/$file_versioned" path="$outdir/prometheus_varnish_exporter" if [ $goos = windows ] ; then path=$path.exe fi mkdir -p $outdir cp LICENSE CHANGELOG.md README.md $outdir/ # build echo -e "\nBuilding $goos/$goarch" GOOS=$goos GOARCH=$goarch go build -o $path -ldflags "-X 'main.Version=$VERSION' -X 'main.VersionHash=$VERSION_HASH' -X 'main.VersionDate=$VERSION_DATE'" echo " > `du -hc $path | awk 'NR==1{print $1;}'` `file $path`" # compress (for unique filenames to github release files) tar -C ./bin/build -cvzf ./bin/release/$file_versioned.tar.gz $file_versioned > /dev/null 2>&1 done done go env > .goenv source .goenv rm .goenv echo -e "\nRelease done: $(./bin/build/prometheus_varnish_exporter-$VERSION.$GOOS-$GOARCH/prometheus_varnish_exporter --version)" for goos in linux darwin windows freebsd openbsd netbsd ; do for goarch in amd64 386; do file_versioned="prometheus_varnish_exporter-$VERSION.$goos-$goarch" path=bin/release/$file_versioned.tar.gz echo " > `du -hc $path | awk 'NR==1{print $1;}'` $path" done done cd ./bin/release shasum --algorithm 256 --binary ./* | sed -En "s/\*\.\/(.*)$/\1/p" > sha256sums.txt cd ../.. prometheus_varnish_exporter-1.5.2/dashboards/000077500000000000000000000000001355530155200215125ustar00rootroot00000000000000prometheus_varnish_exporter-1.5.2/dashboards/jonnenauha/000077500000000000000000000000001355530155200236405ustar00rootroot00000000000000prometheus_varnish_exporter-1.5.2/dashboards/jonnenauha/dashboard.json000066400000000000000000001144631355530155200264730ustar00rootroot00000000000000{ "__inputs": [ { "name": "DS_PROMETHEUS", "label": "Prometheus", "description": "", "type": "datasource", "pluginId": "prometheus", "pluginName": "Prometheus" } ], "__requires": [ { "type": "grafana", "id": "grafana", "name": "Grafana", "version": "4.5.2" }, { "type": "panel", "id": "graph", "name": "Graph", "version": "" }, { "type": "datasource", "id": "prometheus", "name": "Prometheus", "version": "1.0.0" }, { "type": "panel", "id": "singlestat", "name": "Singlestat", "version": "" } ], "annotations": { "list": [] }, "editable": true, "gnetId": null, "graphTooltip": 0, "hideControls": false, "id": null, "links": [], "refresh": "30s", "rows": [ { "collapse": false, "height": 160, "panels": [ { "cacheTimeout": null, "colorBackground": false, "colorValue": false, "colors": [ "rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)" ], "datasource": "${DS_PROMETHEUS}", "decimals": null, "description": "", "editable": true, "error": false, "format": "percentunit", "gauge": { "maxValue": 1, "minValue": 0, "show": true, "thresholdLabels": false, "thresholdMarkers": false }, "height": "", "hideTimeOverride": false, "id": 6, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "minSpan": null, "nullPointMode": "connected", "nullText": null, "postfix": "", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "100%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "span": 1, "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false }, "tableColumn": "Value", "targets": [ { "expr": "avg(( rate(varnish_main_cache_hit{instance=~\"^($varnish_instance).*\"}[5m]) / rate(varnish_main_client_req{instance=~\"^($varnish_instance).*\"}[5m]) ))", "format": "time_series", "hide": false, "interval": "", "intervalFactor": 2, "legendFormat": "", "metric": "", "refId": "A", "step": 1800 } ], "thresholds": "0,0,0.1", "title": "Cache Hit Rate", "transparent": true, "type": "singlestat", "valueFontSize": "70%", "valueMaps": [ { "op": "=", "text": "N/A", "value": "null" } ], "valueName": "current" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": false, "colors": [ "rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)" ], "datasource": "${DS_PROMETHEUS}", "decimals": 1, "editable": true, "error": false, "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "id": 9, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": " / sec", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "100%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "span": 2, "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false }, "tableColumn": "", "targets": [ { "expr": "sum(irate(varnish_main_client_req{instance=~\"^($varnish_instance).*\"}[5m]))", "format": "time_series", "interval": "15s", "intervalFactor": 1, "legendFormat": "", "metric": "", "refId": "A", "step": 900 } ], "thresholds": "", "timeFrom": null, "title": "Frontend Requests", "transparent": true, "type": "singlestat", "valueFontSize": "70%", "valueMaps": [ { "op": "=", "text": "N/A", "value": "null" } ], "valueName": "current" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": false, "colors": [ "rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)" ], "datasource": "${DS_PROMETHEUS}", "decimals": 1, "editable": true, "error": false, "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "id": 2, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": " / sec", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "100%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "span": 2, "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false }, "tableColumn": "", "targets": [ { "expr": "sum(irate(varnish_main_backend_req{instance=~\"^($varnish_instance).*\"}[5m]))", "format": "time_series", "interval": "15s", "intervalFactor": 1, "legendFormat": "", "metric": "varnish_main_backend_req", "refId": "A", "step": 900 } ], "thresholds": "", "title": "Backend Requests", "transparent": true, "type": "singlestat", "valueFontSize": "70%", "valueMaps": [ { "op": "=", "text": "N/A", "value": "null" } ], "valueName": "current" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": false, "colors": [ "rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)" ], "datasource": "${DS_PROMETHEUS}", "decimals": 1, "editable": true, "error": false, "format": "short", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "id": 11, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": " / sec", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "span": 1, "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false }, "tableColumn": "frontend_for", "targets": [ { "expr": "sum(irate(varnish_main_sessions_total{instance=~\"^($varnish_instance).*\"}[5m]))", "format": "time_series", "hide": false, "interval": "", "intervalFactor": 1, "legendFormat": "", "refId": "A", "step": 900 } ], "thresholds": "", "title": "Sessions", "transparent": true, "type": "singlestat", "valueFontSize": "70%", "valueMaps": [ { "op": "=", "text": "N/A", "value": "null" } ], "valueName": "current" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": false, "colors": [ "rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)" ], "datasource": "${DS_PROMETHEUS}", "decimals": 1, "editable": true, "error": false, "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "height": "", "id": 4, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": " / sec", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "100%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "span": 1, "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false }, "tableColumn": "", "targets": [ { "expr": "sum(irate(varnish_main_cache_hit{instance=~\"^($varnish_instance).*\"}[5m]))", "format": "time_series", "interval": "15s", "intervalFactor": 1, "legendFormat": "", "metric": "varnish_main_backend_req", "refId": "A", "step": 900 } ], "thresholds": "", "title": "Cache Hit", "transparent": true, "type": "singlestat", "valueFontSize": "70%", "valueMaps": [ { "op": "=", "text": "N/A", "value": "null" } ], "valueName": "current" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": false, "colors": [ "rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)" ], "datasource": "${DS_PROMETHEUS}", "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "id": 16, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": "", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "span": 1, "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false }, "tableColumn": "", "targets": [ { "expr": "sum(varnish_main_vmods{instance=~\"^($varnish_instance).*\"})", "format": "time_series", "interval": "", "intervalFactor": 2, "legendFormat": "", "refId": "A", "step": 1800 } ], "thresholds": "", "title": "Loaded VMODs", "transparent": true, "type": "singlestat", "valueFontSize": "70%", "valueMaps": [ { "op": "=", "text": "N/A", "value": "null" } ], "valueName": "avg" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "rgba(245, 54, 54, 0.9)", "rgba(12, 145, 12, 0.89)", "rgba(50, 172, 45, 0.97)" ], "datasource": "${DS_PROMETHEUS}", "editable": true, "error": false, "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "id": 1, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": "", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "span": 1, "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false }, "tableColumn": "", "targets": [ { "expr": "scalar(count(varnish_backend_up{instance=~\"^($varnish_instance).*\"} == 1))", "format": "time_series", "interval": "1m", "intervalFactor": 1, "legendFormat": "", "metric": "", "refId": "A", "step": 900 } ], "thresholds": "0,1", "title": "Backend Up", "transparent": true, "type": "singlestat", "valueFontSize": "70%", "valueMaps": [ { "op": "=", "text": "N/A", "value": "null" } ], "valueName": "current" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "rgba(138, 138, 138, 0.89)", "rgba(245, 54, 54, 0.9)", "rgba(50, 172, 45, 0.97)" ], "datasource": "${DS_PROMETHEUS}", "editable": true, "error": false, "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "id": 7, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": "", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "span": 1, "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false }, "tableColumn": "", "targets": [ { "expr": "scalar(count(varnish_backend_up{instance=~\"^($varnish_instance).*\"} == 0))", "format": "time_series", "interval": "1m", "intervalFactor": 1, "legendFormat": "", "metric": "", "refId": "A", "step": 900 } ], "thresholds": "1", "title": "Backend Down", "transparent": true, "type": "singlestat", "valueFontSize": "70%", "valueMaps": [], "valueName": "current" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "rgba(245, 54, 54, 0.9)", "rgb(96, 96, 96)", "rgba(50, 172, 45, 0.97)" ], "datasource": "${DS_PROMETHEUS}", "decimals": null, "editable": true, "error": false, "format": "dtdurations", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "id": 18, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": "", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "span": 1, "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false }, "tableColumn": "__name__", "targets": [ { "expr": "min(varnish_main_uptime{instance=~\"^($varnish_instance).*\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "", "refId": "A", "step": 1800 } ], "thresholds": "", "title": "Uptime", "transparent": true, "type": "singlestat", "valueFontSize": "50%", "valueMaps": [ { "op": "=", "text": "N/A", "value": "null" } ], "valueName": "current" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "rgba(245, 54, 54, 0.9)", "rgb(96, 96, 96)", "rgba(50, 172, 45, 0.97)" ], "datasource": "${DS_PROMETHEUS}", "decimals": null, "editable": true, "error": false, "format": "dtdurations", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "id": 10, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": "", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "span": 1, "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false }, "tableColumn": "version", "targets": [ { "expr": "varnish_version{instance=~\"^($varnish_instance).*\"}", "format": "table", "intervalFactor": 2, "legendFormat": "", "refId": "A", "step": 1800 } ], "thresholds": "", "title": "Version", "transparent": true, "type": "singlestat", "valueFontSize": "50%", "valueMaps": [ { "op": "=", "text": "N/A", "value": "null" } ], "valueName": "current" } ], "repeat": "cluster", "repeatIteration": null, "repeatRowId": null, "showTitle": false, "title": "Row title", "titleSize": "h6" }, { "collapse": false, "height": 403, "panels": [ { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": "${DS_PROMETHEUS}", "decimals": 0, "editable": true, "error": false, "fill": 4, "grid": {}, "id": 8, "legend": { "alignAsTable": true, "avg": true, "current": false, "hideEmpty": false, "hideZero": false, "max": true, "min": false, "rightSide": true, "show": true, "sideWidth": 400, "total": true, "values": true }, "lines": true, "linewidth": 1, "links": [], "nullPointMode": "connected", "percentage": false, "pointradius": 5, "points": false, "renderer": "flot", "seriesOverrides": [ { "alias": "fetch total", "fill": 0, "yaxis": 2 }, { "alias": "frontend", "color": "#508642" }, { "alias": "backend", "color": "#CCA300" } ], "spaceLength": 10, "span": 8, "stack": false, "steppedLine": false, "targets": [ { "expr": "sum(irate(varnish_main_client_req{instance=~\"^($varnish_instance).*\"}[5m]))", "format": "time_series", "interval": "", "intervalFactor": 1, "legendFormat": "frontend", "metric": "", "refId": "A", "step": 60 }, { "expr": "sum(irate(varnish_main_backend_req{instance=~\"^($varnish_instance).*\"}[5m]))", "format": "time_series", "interval": "", "intervalFactor": 1, "legendFormat": "backend", "refId": "B", "step": 60 }, { "expr": "sum(varnish_main_fetch_total{instance=~\"^($varnish_instance).*\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "fetch total", "refId": "C", "step": 120 } ], "thresholds": [], "timeFrom": null, "timeShift": null, "title": "Requests", "tooltip": { "shared": true, "sort": 0, "value_type": "cumulative" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "none", "label": "", "logBase": 1, "max": null, "min": 1, "show": true }, { "format": "none", "label": "", "logBase": 1, "max": null, "min": 0, "show": false } ] }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": "${DS_PROMETHEUS}", "fill": 6, "id": 14, "legend": { "alignAsTable": true, "avg": true, "current": false, "hideEmpty": false, "hideZero": false, "max": true, "min": true, "rightSide": false, "show": true, "total": false, "values": true }, "lines": true, "linewidth": 0, "links": [], "nullPointMode": "connected", "percentage": false, "pointradius": 5, "points": false, "renderer": "flot", "seriesOverrides": [ { "alias": "/.*miss/", "color": "#890F02" }, { "alias": "/.*hit/", "color": "#508642" } ], "spaceLength": 10, "span": 4, "stack": true, "steppedLine": true, "targets": [ { "expr": "avg(rate(varnish_main_cache_hit{instance=~\"^($varnish_instance).*\"}[5m]) / rate(varnish_main_client_req{instance=~\"^($varnish_instance).*\"}[5m]))", "format": "time_series", "hide": false, "interval": "", "intervalFactor": 2, "legendFormat": "cache hit %", "refId": "A", "step": 240 }, { "expr": "avg(1 - (rate(varnish_main_cache_hit{instance=~\"^($varnish_instance).*\"}[5m]) / rate(varnish_main_client_req{instance=~\"^($varnish_instance).*\"}[5m])))", "format": "time_series", "hide": false, "interval": "", "intervalFactor": 2, "legendFormat": "cache miss %", "refId": "B", "step": 240 } ], "thresholds": [], "timeFrom": null, "timeShift": null, "title": "Cache hits", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "percentunit", "label": "", "logBase": 1, "max": "1", "min": "0", "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": false } ] } ], "repeat": null, "repeatIteration": null, "repeatRowId": null, "showTitle": false, "title": "Row title", "titleSize": "h6" }, { "collapse": false, "height": 388, "panels": [ { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": "${DS_PROMETHEUS}", "decimals": null, "editable": true, "error": false, "fill": 5, "grid": {}, "hideTimeOverride": false, "id": 12, "legend": { "alignAsTable": true, "avg": true, "current": false, "hideEmpty": true, "hideZero": true, "max": true, "min": false, "rightSide": true, "show": true, "sideWidth": 400, "sort": null, "sortDesc": null, "total": true, "values": true }, "lines": true, "linewidth": 1, "links": [], "nullPointMode": "connected", "percentage": false, "pointradius": 5, "points": false, "renderer": "flot", "seriesOverrides": [ { "alias": "/backend .*/", "fill": 7 }, { "alias": "frontend", "color": "#508642", "stack": false, "zindex": -2 }, { "alias": "/^backend$/", "color": "#CCA300", "fill": 0, "stack": false, "zindex": 1 } ], "spaceLength": 10, "span": 8, "stack": true, "steppedLine": false, "targets": [ { "expr": "sum(irate(varnish_main_s_resp_hdrbytes{instance=~\"^($varnish_instance).*\"}[5m]) + irate(varnish_main_s_resp_bodybytes{instance=~\"^($varnish_instance).*\"}[5m]))", "format": "time_series", "hide": false, "interval": "", "intervalFactor": 1, "legendFormat": "frontend", "refId": "A", "step": 60 }, { "expr": "sum(irate(varnish_backend_beresp_hdrbytes{instance=~\"^($varnish_instance).*\"}[5m]) + irate(varnish_backend_beresp_bodybytes{instance=~\"^($varnish_instance).*\"}[5m]))", "format": "time_series", "hide": false, "interval": "", "intervalFactor": 1, "legendFormat": "backend", "metric": "", "refId": "B", "step": 60 }, { "expr": "sum(irate(varnish_backend_beresp_hdrbytes{instance=~\"^($varnish_instance).*\"}[5m]) + irate(varnish_backend_beresp_bodybytes{instance=~\"^($varnish_instance).*\"}[5m])) by (backend)", "format": "time_series", "intervalFactor": 2, "legendFormat": "backend {{ backend }}", "refId": "C", "step": 120 } ], "thresholds": [], "timeFrom": null, "timeShift": null, "title": "Network", "tooltip": { "shared": true, "sort": 2, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "bytes", "label": "", "logBase": 1, "max": null, "min": "1024", "show": true }, { "format": "short", "logBase": 1, "max": null, "min": null, "show": true } ] }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": "${DS_PROMETHEUS}", "decimals": 2, "editable": true, "error": false, "fill": 4, "grid": {}, "hideTimeOverride": false, "id": 13, "legend": { "alignAsTable": true, "avg": false, "current": true, "hideZero": false, "max": true, "min": true, "rightSide": false, "show": true, "sort": null, "sortDesc": null, "total": true, "values": true }, "lines": true, "linewidth": 1, "links": [], "nullPointMode": "connected", "percentage": false, "pointradius": 5, "points": false, "renderer": "flot", "seriesOverrides": [ { "alias": "/.*expired/", "color": "#82B5D8" }, { "alias": "/.*LRU moved/", "color": "#F9E2D2" }, { "alias": "/.*LRU nuked/", "color": "#BF1B00" }, { "alias": "/.*mem /", "color": "#BA43A9", "fill": 0, "yaxis": 2 } ], "spaceLength": 10, "span": 4, "stack": false, "steppedLine": false, "targets": [ { "expr": "sum(irate(varnish_main_n_expired{instance=~\"^($varnish_instance).*\"}[5m]))", "format": "time_series", "interval": "", "intervalFactor": 2, "legendFormat": "expired", "metric": "varnish_main_n_object", "refId": "A", "step": 240 }, { "expr": "sum(irate(varnish_main_n_lru_moved{instance=~\"^($varnish_instance).*\"}[5m]))", "format": "time_series", "interval": "", "intervalFactor": 2, "legendFormat": "LRU moved", "refId": "C", "step": 240 }, { "expr": "sum(irate(varnish_main_n_lru_nuked{instance=~\"^($varnish_instance).*\"}[5m]))", "format": "time_series", "interval": "", "intervalFactor": 2, "legendFormat": "LRU nuked", "refId": "B", "step": 240 }, { "expr": "sum(varnish_sma_g_bytes{type=\"s0\", instance=~\"^($varnish_instance).*\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "mem used", "metric": "", "refId": "E", "step": 240 } ], "thresholds": [], "timeFrom": null, "timeShift": null, "title": "Cache", "tooltip": { "shared": true, "sort": 0, "value_type": "cumulative" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "none", "logBase": 1, "max": null, "min": 1, "show": true }, { "format": "bytes", "logBase": 1, "max": null, "min": 1, "show": true } ] } ], "repeat": null, "repeatIteration": null, "repeatRowId": null, "showTitle": false, "title": "Row title", "titleSize": "h6" } ], "schemaVersion": 14, "style": "dark", "tags": [], "templating": { "list": [ { "allValue": null, "current": {}, "datasource": "${DS_PROMETHEUS}", "hide": 0, "includeAll": true, "label": "Instance", "multi": false, "name": "varnish_instance", "options": [], "query": "label_values(varnish_up, instance)", "refresh": 1, "regex": "/^(.*):/", "sort": 1, "tagValuesQuery": "", "tags": [], "tagsQuery": "", "type": "query", "useTags": false } ] }, "time": { "from": "now-24h", "to": "now" }, "timepicker": { "now": true, "nowDelay": "", "refresh_intervals": [ "5s", "15s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d" ], "time_options": [ "5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d" ] }, "timezone": "browser", "title": "Varnish", "version": 26 } prometheus_varnish_exporter-1.5.2/dashboards/jonnenauha/dashboard.png000066400000000000000000005207111355530155200263030ustar00rootroot00000000000000PNG  IHDRN~ pHYs   IDATx\}% ĨuP$E=hVNĶ&ܞ8m!YLAs$Cj,is,uָEzEKE݊8N"9%u![¿:BH|5k z @#G 2Q/d<^xDz e-뜜+V\e9_p9XYffgg_ݟ*rux?`^xDz @#G 2Q/d,vA:$I;ߙ "3?NN:ggrr %޴AQEQQEQf)D;oLPs zs\ncC;SL1횟_λƘ17U9?Dx\'㓓x|2u}*5g"cIdĉϤsޤIwv?ٓu]"9~~UN_^hS{ӎ[W=:6&s\9[KNR%LtefƋ62z {y{aNt(SIo<>991111119L&ީ'LYɗZWOFarLtGǧuuJЉiO/ nY5#o>T5?|sOy +ϕK&')EAO3&Z=JyxuQYS} S 1?1˘e4fM;z!ee%!y7crՇwSv/Wo_K_7S1}Nļ/ZdzOn.SplKYf͚5k֘˷yj"FD$z] տruoe9PM"F L=Tt1UD$'oퟚf?wUF?)]Oq=nqEWfV؂$d뺈`0u0ۼ7pob'?I}?|vo?ySgg{b?6hwqCM7^w}L8^^}3uuETaf]I,`4ft=L-;x$]]"Jb5_}ގTe([S\?'"">#}˫oLz߾RzCg*F_M1Ѳ[c84}Ũ+2u_"Wf4ɕ7 7DD9k4UL9߽iN5_R'GoiUt8|k~x IbSKa&̍+q%(EDE㺮ue2>)_֫RE SRDL&67osnvxO~+7|ssװnͱ_DLD+11uov෫Jo귿'\ QpA ,{#=U-T+"뇍"_ÿG}gѬ~qMmϩx=⳹hY.qLSu`0 z\㓓%1C7&xԿW11q=ّk&9+?Kbҍ5ܼJbh'ylOwO\_\ѓo-kјxɁC?~UN:T5!de͚5b\}94ʬf]/m?Sd6N8D;}YD&Ox+v,)]%y%xrĕՔY킄wfn;?tjeOUD ੅zG'/ST73;/ƦL]mLD"]tʔZ˚]2Q/d<^xDz t]g/@F3fp  5yiS@ʚ5kdA+"w #$g*2/e1sp Ld@1(Hwbdj&"{I{`9K.K &K{ 0o^8ɵzg'e0}k^›r/{`2y*mdb/,gk5LL`tS睽/; ed4ޔ/`y2,қnb" qX8I<sޅ82a\y!E{,Dd^ꦌw ˇa:!9ɗ$2HV"5Lv`0؉'&)Hvv5 ˖aD.e/,7yO>DΜ9{;W}~sx>? )XVLk;4+ R+\Uޒo8sKW|DF nz{ui Ww䲟/+jx{چ ~{̙ 20({Y" 5,ܢ{VY"GWm|?ݼoW=áP$~/Y8]ӽwwWw3%,e[kH{5ˆZy2(-ݻ\ᮍLnS#{{b=7*e%]UU FBzkz%2[cs[[sQ-|mY5j㞧L_gm}4gNZ``9dy9E>M*{ w %oCK؅l+^,5.n'_A8% K#tU*Z?ތhHCZ^\yER}tCW5őb+,#K~A4 7<ӾX =AMK :dg#=Uϕ 틔9+rFnԬ =b4;8WJ$"時W3mUv u4ıvWiI[cf$RX쨨i.w7}q/x"%QV|K#WSw&ˠ芋܃a;=SYUfã9)KDE1LWDVXզaUPS? mh,-YZ88lkwba*pn޼QjH$<#ѬZ͕6U {=h*pnn,%}~wGj{eΖRUf OՂb"&OGx}?*w}О{tp\jl^_bH8sw2l"~wwnxft[T봅{kTݼYjH$8|=GFc"۷*8:`*[$9vn*R<-ۏRi#,Z?б{O2-pwMRCS]UB={&yֻjdxWiv>+{v)/թu;"NY"ڰiV{v7~zwREpy=}fX DDj(,j$֗#lhBUݪJ8m{gNs{CǎJ~45%mw<%Q}Zx%g^i,u&ރ5vDB{Lw5=nւC{=NDLw<ѻbuGbjzzw@ݴR%.E¡@Wz9)*)V{}d~4p(8س{єw=JGU3_Iiݮn%]C`eϡ/bsnkM9P-S5qĀMk5Yiۜs-lon]<UԈToj qUULjf- h"꼬{((w:r݉yes>1Eε}+*цR7ҞjGq⸻4==Fуt8m=jeW϶v%Em7wuvvK:DL]IhKE۟HYXvH8"W%rmG"E ᎚]gjEgv-x=ۭհQlUAヨdn^Oh}sm~OX"Xt[ខ`у 4>ydS5o$}h_ gN0l5Uf@g_rD"ޮݽsy%&-k\Y,ν^󏎌N"l:v΁A߼e vJi[]Q3-߾~MdxG\#.Y^OP$2صG;=";wl, Ҳw \XӲ|-ITKYC?p7,]UŚcoшo^ξqK;ѼbM"@7$7?h˾آ%l۽!)lڜ(yέ;6YB=^YWSa9{+8ݹiwwkv5ݑ+"6W#ήa˦J94e`SS: Chd? }=RWaҶwp|<R͖BGeM"ĉgDhim-d]yJKvܱ֯nMm[+-#ckJ > k)S "&8_ϿrV6DTDZ[hw>O6w 4U#-FWחqXHTÑ?ouhغDjiٳ58K;ZZ^Xm߶]yMKsŪ6M13!N{kK'bw56% LĩXGz;i&+m msli [d0ѰWlg"u-[\vmh׾`AUeq=4QKܩ T  Kә\]2*x|3qamo߬Sb.uR69=Gb-sE#x#͉ݹex?6ްV6VzZ[{SۿFG]8[6\ECEϥ"D(HΌxBb+.SIYD"jqYIDK%猥9Ĺԋg X+m]Cbw6>MOgQߘhϵŹ>թJem=0xZOl{g %?Y$.f2t]wS>tJ羰C^"w(#} UEUNko~p;&"ܢ6?Q㲆my>Wr2kE^oëf5?_,M.e?8uU2غmȑasIwUܗڱϕ<}9c!C޿DuBqq̯4qv~01 wEdHp sedDĩGDDrLS2EDD׺=.r,dn0W5_{SEzQgs/k7TXMOglWt,v]ht'&S6I[VͪYD<ؑģ_4H`_,Zhl{7.|5uR1_v_BĊ,VC|tB,w6דּ%fw)ɯ@=*jkܬ y"JO9&yp*m="}Ǟn(=kL{%U ͪh##(g[\ռ樻HT$m UU4mG%TwΒL&Ug?lMϲMZEB+E=oO6Fl*.d̞KCF4=덉o-H4][>Ry^ܷ`XH}Ua@׶mɆ=oaOw\6 xj^_L?h\ᵎR52ČjiMw: zzF%∷gHg ^U$pHERX?*m& _GFꓻ*̑z"wѽb"^YZYXlXy73y=`.z*}ex!bے `X|ӵ3n?rwYY`Iy:|mY_Vfo&׎==z1L6ӎvɱpѺ֡}=Qh/dv.}>'Uf,Vmࡺ119%wcLXhl= IDAToF"=+PwjVEU"QElv*Tpq|U[Uk5.D@ U[S~!Z-ox;D,`XD-z֙Oe^Faog;Do,4=!u>UopjEbJ<֟cp,i)%S [D"DaYgH ,s/&[M\&*224K}gTڲq4:w+ {P.6PWw<|}-pe&ȹjg_|{D$Q[fI*#ڠoxaIi,_{cꛗijT‘J=Jdj%`m}c"&*ֿz7~u[7Իap_Ͼ,Y9tgMu浕Un˧)`ѣ=O=7۽c1IyLd"Z$!g&RI_SjQUQͪDD1o$ǣ$m#7|m>T49`-Ұ;.&*Q@ֱ!7t:nYF<с-NWAOtG_eWPMW}z.xSx#9ПZR!%o% %Xp4,ּq>CYlsI y5.+KEeIiRVFk)O-dbF#"d@輺]O S\߳UjцPh;ϣM}]6oBa`S]͕PC8Qo?K'Z$MH,T"=gETǥzej:(UG݃i4W+tG/$b?:K= 6D£U}o7\AmΨ]Ĥsߚj.1}yC9rvHpd4&)/.*X>ߟ7q5L|iDDL*>;$V/ދvqFyU5NgaĢ uNhZ ?e(q>QV,C?+WTU5;;;7,ﺽa/"6uGvU;}#ca<`0$_"jbCi#[{-xԊ75U.Y퀪& Fbk8MrjbM$"%%6BYZKf(f/JVB<ʡĂ5QC!b{ 9lMB)ޢe56;Ҭ笵fWب7};*)V\shDv񍌍i\.M{5ĚYjb}YD N@CG<{v64:rE$D櫁Yi,*"b&܂˜j$_^dS"?E ȸmu_'b)sU[ьzAՒDG^l}s^ 9 bzŷ<ހ՛,g-.JػEtlLTٛԥc"qpka^h9qB!QmEort'VnOX-qlra{Q9k^/y=QK7*xyjM"CFEV%?FړXh$$RXZ_F(ZR2}m;͊-d%<C hw[%FsѰtz斗 Ω^\D'.FGbĒ ,<]5^ԥ8:+K+3bݭc}ݦUL_n*uԵ=nu#E%uϑ^۽qk'EeV= bPX⪆ ꈄ<}4?Rӽ[ju,"ѱUYC@뽯vRj/+QO;X^Y/*=ICT8kοd{ܾҲ1EΚ)#c{jv8wn Ll{l}dZgp@\VyM$yɜ$"Ng#~ZtzXU喝CZXfS%F4)Zd?Z%!(b.)=8_ֲ 긪۝NED3RZRYNҪ \5%=c"[{{tb:vhw-KWSKL%Tt~dwx㻤 ۋ`b;HO aAlꭵwTLKSջyPA}]a5@Xy ϵE|#_X[,agX$,i"PXrS)sKMoQ;-U(<"Z` }и&uű6MM""ڜ |G8Wt̅%5"i~fwn(5 +~ ;^tZR,OLnwt6z=QQ.O-4jiFQ?me %m<\5J$ZT([@w{_D zv)1-C5 ƝZё횻yoD=rW]WBYaՆ;f]kF-۹|([RyMB!g"οjnhqT;Hh1߳_jljt>E2ϗ6wt}G6 |1gp;ƒ{=nt7UZ88<=hsakSK"t;۟bή Ͽdwli88ڳ{_lǦaȱHM[\ zDd-k$<<qcԛ޻{ezg}#4<6Rל,ij$Wl4Z$xmϞ}#"2~k_5kk˃@_:QE (U8q|EM}H$ܿg^L۹gKq$8ɶM*x:2p{:Ew?y`7MMY+KV@g[oMk,{w9֬m["ї""QoMk77V X7؛ull( [;; Ocnn7t4TW'jpӱ7K2G9fUý-]ޘ,`Z8V֭7=GbJuEٶ9هG*p =avuMїu8K-z›͹a6NgDÇjDڃ5ݰWtD6Z=.1gK~>P=C`bm>PH]݆R];{+EH(8ܵ{_7v>R7Ҟ܍lRqK^ g>:g5fU ٳn~. zK9D<<{jE"pG}SK.{# w(*"2z[C~/$-<1>(uΊDߺż3#&-m\'G,ʚ5kf<.rC.ݶY0*wӧw{RsRQULY<׭)S"پy&?XaI_(Ǚl_ eEYf33k꺢(~~NJeZe25.d{I隮hqGщEHlbb||X(^EQTU5ٳe5Q˻(E8A$&&& ˌ!osY&K1g{:5c7~1911A p,WQ瘾tnVL]VQ Rfĺp,h4:WE_aPhTQEQnTMF~|\R"5L+_yb4(W]i5& ɉ EQ(p.+꺞Ks*&^`2]cT~5999Ip)\ɨ7> ᪝d\|p%+V,r/l(d!K%we^]WXay||d1Ki/%ve^UUr2}N]QD "ʬˑ*enRi/%tެ8漺"b}R ,ENbEM($3#qT\9"u1)"0U 2W(xM)p.Z&)uƥLz'u?zOYd!dȨWʻq1MӖɾV`ߨ*]B?|(ˀ)l].GIf5UUH(-x|nc:gYQj$>`w4v/`]SKӦv/%WWyj1EBa@O«Uov4U͉|U`&t:J YU5-ݽ)JmQ(),f5D9؟?Zc+q:Bl6UѴH8{)-Z{ m1t|t7ꚕ+>o^2Wdհ55O 7>4 \ĢbxE_'oK)x+DyGivRT.-4w[BJjnXbso,mhliKӻDmxf^anIA-lwe7"K'mnx ۢ%; D;t7U~ 뚙;5|ڙiDD˶nsS̸_ tm~ʋ]t\͙3{Oh|r^Q̙3ڋ1.X/Q1Q"SZSڜWDT1ݧ[* gERZmCY_} 7/N}ZK"uf}aWWDTkyî;s6z9'%jK|f{eESUX+"m9b׆d߶,Cuڢ+t4!iƃ&CO^S?'=WY+Wk eO9"Woc/.Z!{zEEMX/MNNM3Ic%˨LuẒ?3g\m1gN 6."2ӟN?Ym-w o^7!uuʡoJi 7\-O7e8=Gޘ͈Oy'8h荈yuVݶz;sf*X-؏y9~;?*"t:l8}t+c'.j+YɑC]=M{z_vgbc3&hߗ>W;Snϥ/ᦀmLnyyx&GuSXԷ7]b߳+O3{WʥaVVVOtݷOʈ(ӧs;|{UͦHRcv{!93gvOhd"&\Ȧ _F]Dp\-b}mem6u{BnaLrCr!O@Jtгh,2ڻ{_hWEƒ{w^$+-NH7ǼJ#z驡9sb Yu)/@ѽTm4 zt ˳zT vwߋT`I\>ڷjY"{9?&L>o]\}Ƽ fo&-69Z5G:(Y7xju+MFwݷc&;E֭?zg_&뺛KJndɟ\04Sfak*]Lv=6^~Ϧ[?JC&.yD %E],q323R C|pO19&""^=;@q|bJjZfV?/| BnE OO(p攘XZ:&k \s'""_/Pwo"%"ڎpufou܁EP{j՛띱5$9[HVgвD O^hƘ?<&¿QIΖlDYFQ E%%缒"MTZIDltJjB] ZM˩dw敷7ښ\=:_{$TS7\.Xrz-[>&eڲU]n)m'ܲp]]铌DD=H4Hl}:Bg-j2$ 6siQ ;d3g?6+'7Q+K vn/AGE>eiE}"Bp)ײDg Fl0 < 6f./>TPi{O6>{Y)FORYۏuϛ7-3d4(,;@7^+vb'n+?`"|guyRlA d+|PgnvǙJo& nP&]Ryb]>}ڼӳMljRY^\U M93N?Hw=D ;Ø:2(5rw 0jޫn(mj TkP|ҸXj~8%9zEܙ=wvű}W)sh",%GDDLDLB-c",I.7aI q(N$P[]Yt^ [D$5Tj4\fIrapB}EwZz-=NZC\:\̘&FD$BV[Z0VT]q.z;oeQ1:mF6Q$m{ ":kHfPTQpw.YFIM܎˧ʂoVQYLFmMU^\٬جi""ۉ='z~zjG S` FSF2W~ ""6yֺ3 11%;oeff/_jox>c|hxcJ7^@!t[Nu;6Ѝ`/gqqeM0ZW6};>`JydufVsRھH}~ʎ8`JdAgMŕ;Yd֫RVo4VU~9!,AF}ݎUVQr^~f` '>( m]>OuLSdLܸOTMFph* 'mdL䝾eg D9n@~C,O$J,3 z-=LnolD1z8.}V͑ Jk:HKGE*jx!fٯOU6Njcg YMTlbjll7'K6v_iV"4" i/ ^&u%['R wwǎ0^oFFA9TZ,6 nM9?ٹ -5n46q֚v\NlÖycZ1-3gc>UCYisz+ϙ h+2&&g{ڻ.\$QPj3dM9eKJ9ߞ R"P(hīnr|nt{ǤxDsQRAhJI0:ޱK~,; ErLc_+(qah,) ))i|yzѦ.xqt̲掠~CƛҳLYSlynΊ23dLJɘ4}޼7Xu+kV2vQJHO?yEvRre9>}ʼE;k8 R~M)\QoHTps;np}%Ĩj.ƠUI~,;S$6Է!H1btD$%RT&"F?z?u6mjQ,=jlJD0gWjP}MI# jĥѪcnOvZʾ͈t &_qXv*2JV -B_S3=\+*Kq f%\AJUe0MTF!IYA V6諗5m&+ѱW!GE8sQ &N[ʒ@[>[?2M)iwMǠ|իO<eUJ/O<[N7VKE,Ek+T 6U<gk;sĒO>XCa+vtzy൳SCAO䐚g)mۋwcj6g=\M.ۗepdtbRk[ [r?"G=-:B:۩XVMiٹ&3bCƂulN).)9='/ojoBΘ|2zUVTdOAhIY2}~[WR|ner*7r䝛j?+ ?X#酟4?qDDv޵TA*sΊᆉ>jT8q6+l-k58(JKb"Q ]NIi&D"R %cוQMJ5(IcL}d'Mh%PwV[;5&LZ%I3_}W{ڟĹ[,j۟fTnTzZ0|!&__|n[9sjϵOrї̵ p~?Rxd`ˠ;M_2~nJBu OA9 } 6^SQ\%mHf^{׬f )~O?ٷL&"6%?PYۑ"AνxY!*`.CTY?+1Lzv۶OOgpMaBMhoƷ0$'(>={Aɑ@r#.[D\}|Tܓkv|֬~]U>xK;Y 9s'i^SZGs2Fݽ;/ٹ{jPҦ{۪oD4VQcrRO*舡q?u {m6MZmW0B_I'7o<2q VO}R{-EV5-.cۻx"hOd3c6WJHw7)(-UwFWx#4xSf̼iCA#xWnx"};N Biu9o=ڕq=))&(PzJcL5QaV,V6;/xhN5B%߿slt#'P1Ry:6bHZz-4 ?2tUچ#;6bq w1*."J:Zcj8vC2h,QTNeauQDjijmrx5HNUeo%"Rq8.hy"HpDD5*mՌB[RKu;nfƍ-n ߞh.SWaČD-zZEB?DiWayPevvJ8w>Х׿>VL-jaY_+.9y'8%"BKݐg<_H|߲ y[ٻ}-%(0(8JK)iA6#3㑹:|e܍Te+6Xڷv>%g+.H yC7;[0=Sݐ6BVk)VI|IYUb|Aao7,ÐXcduc誷uve4q{koh)(_UOmRE04յRrifُvԸ]{sNT؜]T٨Yw#d\T>%z#yZ~Rp^JdNH@ skE\ƪII5:!_+9PYMvgKr,X́i s d% IM6"{'Q  [kSCgxH2*^6[5DJ}kҭ*RiYSue5FHi6wn""yE'֟+mfbt4"B 1ZgccPl.&9_h=UVs=ȡ\[bwƪYWe[k{ ϒ b]fZ'=C2TWPT ɲ|T.$L'u3R =Ok(2xSZ) o̘4O>-D*7.|e._HȘz\j#>57?b0Tswev~ G|uXU&SjzbEY,H%~'FZcrZѲqD67lݼ,D)+lM\jJGƥ$jgwc3lDiiUML߳\ C;>5Hd]FCUvSҳϟz "2uѷoO.)91%5+z.$Jl_Gyy)i^&>u: eҲzx=V]ΐ1)%7i9qSu%(qܬ|hM""٠Ey ęf򦩰F!199#=C`V"ljEakzIU4XQ/ ƳS*FNM!!]U_ld) IDATJLT¸2<.GSK(zI#yZjk{#Ր&:<-6_oSS+E%rag/ReTQ:]lS ,) &/XnF9+z=^"_!kH3g?k8^jtL9&ӣKg+rCo=qhq8EWEiя}p5 jC {QZ"J40EϵRD %0QK2{A38@F l?dsy=Um7jmp3T+_"D*Ju?5tܦk &3NY )PM٦NDs|}U׼~$#Gi9Ao=ٰ){ò,ƌl#Z“usW`A%BH-VK!w DBYSS:g|‰;K /l4>$@1cj~prإH[^ڕnmR{ibD T(߽a5}}`-vΕB_"6=?# K>( 鹓|՞J0e^Zih^%g4URc>0<~j-clVIlqdTpc{*16kHaM__l#"&:N7BCչ&4z/+Bt㬫(9oDSO u6PӪZJV۵fAj-!Cty*Ѝ4?.=L$ϖ8u/n9 zD)9TTo>SR{/mxXMVk/W+\~_oٿ7#pd+`?nW٠$Y4k ZFikeّgOi@[SN7XΜwmuE 1.]uc׵8]_ÑTSQiq1jR"/?;Qt R0R*"r^7MyuLZHj8[UMVLq~hrA,˱*JɐGrZ.ל57J)= /6I XdH.gSs,M.Qd-x%IM5"7GDsDH}hhwq*Q1 Gr:NP׆-]7VGR2JeYZ/՛FEӵ[9□DDm?^hj"FtRt\F!٪OkexQP[ҥ`ٺ#FXe dD(=̛{s$e.WAYd ^з4%R+dz xeBA^ƱR!+ܲBSVrZeCNYnQ6QBVȊ~u˲j^mzǦg (X* 6nm 2L,C[6UlyFsΛb9f(ڱicolimzӋM< k毿֕ &ԥrZTwI)6M6dM&`?tG!Cty*/猾$]F U˷Gv zJitrlM8m#R󭝈(~?-6NK75گv[7v(9-A38b{O+s46= <<cߎHDDٿ?Jbl$[=&2o^:OdG~9gk%"qݣ6#U,壳#;%2ݙj "sQaDDCE".-3269DDTybODDCf"2礰@$ DDM "f/Y<,X_Pu*Z_m_ȨRI/\Q8koEOL4k2fwVHDd6#83?/]j^JDD'9"y0$ G*tiZV#qѼ{ÞrMم}j@(T8/_+3D,}w)xj%//7=ukrDA89"X.tTK*r R\[,m6Hڿ6& d3iٶhu)HvKQ3)dl^B^p dx%{ D*aBI6=@D*;IfM77D$X*m=QuxKR#"sMdVN7Zv\*r( DD$K^\UiD蕇7;P*}M]{ۻuq*KD;NO!"ˉDTuBDTsrӈH(9T*/X/ ܟwg%?/HD k7Ӎ7JDMx8# /`%km@ 825Jr ® dR˺-OYYT.L_5&rhRbܕwn)OHQe*I*/gpi5FIͻ7'lꂧg,웽\y,8qZGkh},R( @m"P}KllzDwW6?ǚGCuJ/۪[&FG8U&큇YD҅bQCfth::<9s`]Eھ/9˧dN/w঵}{w+2qWSW$'ň#|/ $sg[+2#RT9޲L&0/ep\MR ?YIVPx͒gVWd,/xκX!"[&A"w,2_Q}/0 tz^*u#bq!_|}|U*d)Fx 2zʲ( 3){!^k2WE0! zz=D^AQ/`C 0! zz=DJ `A^AWn0(\W/_A#-E;( aT((A-"_0 8B8FQQQ]_>,[@e6 TCSGGk6/@5qI)&cN n,F WrkҰhuEDAaa)I#\rEqF! W{o,ڨDaxj"Fe4p4(\ &"J$b8WciCQai0 8B8Fzcz|n$Ip*ڀQWr+jI78,Pz̓"7n[f$ ap08zxR.yngFTκM Qw]Ǚn:aRv8BE+/^leCy6j؈bF`!Bx(0 apVovn t\$˪tC,*" @\X-VMV| (Ao|(NQjݐH(FA‚y6zD!p,GjVeE%vap08ΠteP9m:u7 lȭ&gkowl\$d Q@BhZ/]jFQ!(vɉ"`ovj^ߠPc# 0 8BxFUrm`"cl\U%js^)n0lEݭ" 8.K 4Ym.Gm(9].[t (΋SDm m%喘6Hap8{P Fu"0*uQiIRiBKm ^nREV^eU!: \݀,8z6tGa!BHiuQ njI8/Q EĹ $2jηն68pL 6HD$:[$",yBh.GT,z jaZY&$ueY֗q=p@ :p|ŒdYv\ T*Y{V}L$2 ?VUUUVV @]}ye?/_AnCq{uC/m_&uvʷc*խުT*b444Bގrl $vіWg~mel{2 ~WgLa:^+>SƏIГhVGk⭉*zt}g$4""Bq/%"Z~ fÏNĤwM^ZOO< YGL?ofu-^RqSzgU;cb?g&'g/GnׂJPt ;By^~joZ"uz[KME>٢)c d);kN]""bG=b٣bmm^otǗ{WlgkK|g'~isG%"҅s&&I>Gj?!jOuJv7}fwbL"OZ}d-q6 ihx'_81K8:)Q S^}4u$X?}}ՖHԏ_.ʘxN-ۻqo>9ZŮ_wn"7zS&ŕ7^|{V$Xj'Ew-zg"X؆fX8slnY\ lD+QW8"?i#sV=/,ͮZ_:Y_ٮO)K'st9=jn}̑4+W֥[/Yغo_ʡOm,TŇ?@m>:+ ՗S_\@R'o+Ǐ@;C  ̜}_gL~ecD_\d;nO5_:)sv`]s\/ qON]t?u4eO/vƍo":*_xΞ=GYp87{x^);{)Itou9m)#v0ebWv"bZ묧O)DG5dYfY[nQ*,]t/hl0%\L""܆H` {{LgOH3V3e≸'gz-bG?ˎ|락_uP;%oЩ#ξ2To\l܄8:Qex8M@tGԕU"Ҳ䟞jm^&ڭ9ݶbgw͞3޻x~Oȗo6% IDAT;S\n„WH{{U qt?{7{*^(v[MGU$SI¤Vf5 >ݓoV/`|npzYP O6m[d-lxLٳvVIIqjA'"qz?MN[kdzՁUp=V~̽ȗAoҙO7 S|yE33'1cH7UIZLU#5vtgRZxmmiryռ^E~ 8$(UQBp\$,+˲ %zf%9sg^8bw=Y+;NU[E$= gDkƍ=:E'՝|`SVpOHp|ViؙǴOd?JcPBRx`͖z uGv}6K<~)+n_~ki牧%ǩO?*;muhǎ֓X];uv9/v7!̶?EK͚g9޻hCh9}d_›ܲG&/\:lGNG6&-dKڪO?5E5oŃ(Xa'vo< oy@Ңf>1~r<ω7^{ @og[Q;&2f"^HW6M\2e1Bw^`}z}kh/zh B7;?ٴᙗ)(Xk>׿K{3Lh|Z)iμ395?uhO>|x> 2rQ l]J:Ԍ^?o~tǗ0Ci.?`pbY~e 0(0]ǻ Ç'"Ye| !C.|k@"(p-*_-lo/:?&vwB O:b -Xp  tz{y 1ٺ]wᄡ7hHnYT+?g?MPpw!!p(6&̙3_544 %116[Ɔء]f2f̘Æ xM܄aN>SL `8b+bn r5c bc^xaĈ_>˽{v/}IQ}[ccc@%_rWVt*7;_+E7+!P%Qrjn7<75z^scFcr}rD$ul ŜaiU (Iaج*R0Q)S gBwFRbxn èYr{S(Z!GKXjFD4vk_%[A+=覿.C_U]J1@As}+ |={>+Ry>|Dѱc͗.y_6uB +3s+ چꚒ=2!UK'^lkxaʑ$J'LH#I78jnQ77w}"j9tkI##/?7VT |HU<" VVζ֎ݩJܬhnf;A|ߛJɪ9tT(ݑ#k(6_tٕ}# >!&&dLLL:=ihlliu2O_A jBؘF[cKK˫M6}֭xŋ555Æ:?M:]I<%VBz/_hωÅ >99*cEEDTt}OD&Lq4:U٦U¬g㛨'LLz$mBiP_Z9X9\TK X ". +(+rhCi=m6sfHm^Gg3&=}x^gzs?qD"g~eD,gIO:Za%6]Z˳^\y`V~5smrQ+lTkfVleИWCuQڃybx‚?%gM2S"rvzʳ.,]x0sKMn(0T($QTT'eϦ._\XXh*/MRxn]'a}x4M✹rLpNv˗99BD{gΚfNIںuKi)F2nGK ܛl}|u"[)d+H&q3'+Q66/: wZV=U;n6\oUiJS4]U3k3: ZW lAΙ0d"iu=j{-HL5MePʆV0… O>g# ˫-+ODmr+ӦO7oEVuҖ^hޜ?^?}Νw;E5WZ3߻<ഠ k}H޻\{ Љ,DYڊ4""*L{TSg5_nϨ!gG~FoP՞{yI''/l@s}#KB)e2;-W.]cߥA$g΂U^#Aupm~ƚȻBS&fZ֗^y]RRplSs= KhfqDD:NO# %% _?NƗ ܕT*}1_d*%As9֬rNɷHDff8N>,u6Uq|X"rJbe5w""$/^)krcg"rKRUݢYL&>@D.˜L&v!"\fͺ -4bI~H3)/'Fixvcc\Ns/nevcbeG.ۥ(S*Jes].'݁Qn˩ S_/TS$˯ܒT[LsOrY]ӮGMD4(_-5Ddp bEîi|Țse-WN#"ۥLͪ oS OR*c/^O2]62, "lլlkv9iR WȖ{iT+EeH $"[%hϻ,+Ta m 9sŪreH[VDD<ҤԷaQ+V_SC =9&ePBD•|XSHe\ӇNESCQtE4zP4`eHڢ6Hږ"PS EB*Cj@U0"KŜkNDBA()bʶEeX$e(BVADQ|E $"T&(|Ud,_k|"ک.+r'2GQB/$^_SM3žYRD'"ҖwXUa˿,S'"ҚwIT;\eˑqJuLG"rYlǩcbk,nKDl\]T)q&rfNvWe[/2 "Εwf[/2r9߾d.ÚA2$0nFkf}}lu/;rYM{ٱdֽδˎ&(QCDYRs.;3busQiNDRU%CȖi1A*O YU+DdשּׁPT:@>n7,( rV U˵:υJXYЩBTab Ku?@&ERbpO}L.$Y #s8-U __eXYRgO"ۙ16Ȭ0DF"7vY_\DO1&etո ~>RC:KnK|֣'^ )ɭqhBdTH~L(h9u:i"@)mLJKVLbe PVⴘeJ%(XX*d f`,ud0 EuQde ̕݌e2XV4IJdd,'RU` eJ帠5E$YʔJe13 믕qJd O{^[!"$8TY!+\4WIvvUgFp;쌂h'Y-$ca2%1 1 1E՛)ødŚM1L-\0EM fL9-XJ2WnlI4ÈuDbeyݢTY) RrOLeu\NgHjqIΐNKҖ,ꅝ3b&"X斤h4%\Kt(m\VgKs.ts9bpn#"ۤ =S3; n(\6,D$V rgjVh\բ й:E[Y*ʝUќU_(IYUNb7ryBRQv)j|='\,-Ry+MLTwYUd,G墱TWTE̳#X*SxgURuQ,ϋ"d OR42(D$2-l")2NIDR4\.*D$z2cTR42 #SH&"bE)m;W4in[H2WRrDc)g)58h,uIKDNneR(*DYEc˷DcK徵E9h,u5 BݢKDc\{%TS]t$IQ:ERUYSdyi5RTsq2VY)"X(En,g*W,7e ^Q.oe-LeL89VX^vs:\vTk3RẏĐD(+q H()JK|_&"dK >E/X^.DF . rH E> a(TGڮzB+yD2ۊ Ta<"GaM0 j]J20t,[~*3*O(8[Ar9I[3٤>yJ5)N#+Njb\yUW|HnkmTU~^lcGٞ+-wb߹,"Va3V~*OF샘WMt|m-RuQ[^Sl/ ].Н^ңoِ\=}g[>38Eg˃6>7_;bS:$z,-Em[6'x[PUmoJDpC+>ieOA':W=SО^3*ҷ/'+>{DmO6w~ Ok"*ȱ7H2˱~2Oe2t351)+{uWU;6?h_K)%d~JMTT8@0F6o/(ZW'ZT{fS[fOh{1 ywOmD&b ^ΥPv_3aYvm [V&Ԯfv2sK?(% @+12F6WBtSK'CO~o?'qYTi~_.=|߽Yw|2/i[FFU|yΡU)¨^V^V^V^VeFxL{N8nK%_=t r2sk1.w;vscpgQ?mƔcyh{Z@Q3' aI0شbO> 慥GD6H4e_ަ wpXqf]f;Wgm*h F hjswNv=sЎZ/)HebyN s7O௮qŦZb_3QrS;z9Pi6Ǐ<ze|DidXQ˖`hI/>_wI [|`Էr,o'~u.`ᮝMm2> H|S*5aɌoVZs5'|g{Sg×,7"{0f.׍>'62pH*M9]KNNh{B'io螻g*J\}0r„x:4iufQI3vȜytݲ5NJBF^]3hGgB,鼹)$ٴ|ٞ,:0Cs({F,[-Bwx{g'^6{^'ΛLZb2_P8:[zxfBK}w`uym՟M~dG&򭣏oX|Y? =G3l7vd5۱wG72,D{S)vՆ742pYa~L2N'Dz[]|wfe'#"Ò_}z͘?ܼia/9>q""B۟Y>c6N#m[=ǿb&$MyßC36iBgCS̘2y4jʣZ"۔¶=fs khc IDAT5DjYOj>a~8%tIv2%|j-箘~kG?m2i',ˇFDIJ${1:k 󄥉P/@%gFn|+\u{,Dvc"%m3p&`1…"]h([1kNmMI,>ڽg3ɧLDDL.2}ө:noh-DT)qĉ^~wҐE{ه}]O߲Dy&7urvZuV j+S/7{Cq>?z0?2aPtjĞuZnKd J;;$ph}۶7¹ܯ ~;C\RӘ/\+fNGd$2.B lt7 DDGE<Nl#b5Θkh6My{,u9WOHD$޼ʞt8H<1D|x˜oR[Ll)+hA$*.~x_lبgޜ}䝥5a[6,.N~iON'v >-!Z_6ӫ_zz(߬-;_}y2'v}Q=8r| $oh02鑽f[&+ݰl59[=e-G=Î6͛gMI|>YC$lZ8/?8=3\t詢Hfk&Lmdxa=0qhђ E"mԈo. aEAL׭k@ly=iէS8єkE"6afv$LW/M3fVSpD050uƳd,666==.BTDQATDuQlVkNƺ]/kZ] _!yi{L&\Ҩ56钼>(K3Tj))U|yΡU)n",[]2rJ8N%g* f.I Ee?cwK?6UrfwfKۣ.=|ߍ,)cd^]YTۂqP%kMŨ^a}*#JX'SS)n?zS!Tv_VYax,@P/@P/@\8hDIB# ! ! ! ! p |5l^Aza\fhFlX/z%g+ðW& 0wY vwԂذ>/MzZ,9G/ z? H4o+\ʆTϗGkTt}è^hNyW,g?_WgÃ}-D|s^{k(GB?,Oڇ?C&>9s!sxowy>81]CX>_?Y"io6 ,Yߧq脻x2L׳tQ< GNRA{wԂWz^Y~9! *9Ztp-QA]D^{kDܗWfSoRڴƼ>}Ĉ׬}i|7/s($+& !""67|֛L>ʛCwHuʽ,ܚ/>︇_`{Ѥ}w96ҟq@K}ŜV;jA!י{Ǹ[]HYnE۠)^֋75Wl*Io_HDŇ>DPzw奥 1D"*.X""s `WY"m@WQo{"~9 QQV'DGl]DD>t{ndCZSu?0iL>Ъ+xwԂ(l+|:X)Nr?X!6ޕM/$zZ8O2;_/hp`1 Wdh4,O1:8tKZq5,__]_E?xfj(K!"D꾈8"'-PKf61Y_^|.G,Xk_~~__㈄cyseZno6lYywҶZzNt~k K ZZut9xߑ";jA1~wgBv˨ hYQUkX)lp"OPrG,jN%*E&"a<w׮0%kfwq * *x~cb C.}j:fNxǟxn+~˗h`Y̙3oDIJ+ӦGwRrC))D4aD}h 뉨mBm#X՗X.wO4Wttrܔ_)$w:4jnwY[.ȥXD w#TNSNJt9fٚISڌq*96T(6{uIR(*֞6s/wrVq;ZmTݦuos WWͷ7 URf9ĿQ|I "FX.U ]bd69?p4q/L 7^WݹzJ֕12ugrޡy77dД"bl.}S)ϟ;m$]cccmڴ* * 2Af  ޛ=t>ݼ~ᇿm%)eWzJJf3JJJڵkWVVj4J>$t&oМ~t(==mn7qg|l;w] DQATD[i;fՐ^l׎chqv] \.WEyљWcLj]vRy1#ؑ#?'֫ꄄ \ٔL& +Wl ڊr<5Tzx~;5hPՎ~9ApdϝD؝R71D>M p![?bSO?z5SS (aFRMB6b;Zm[ ov^I[?r.dGbikO FO&c$ocpgQ}Τ٘})%%wݘr,7- >xʯU@YT@[p )H/{6a 5!U/>okGo./㢩vAӮę96Nj 姹g'bHݲb#{?`̟7.."Gf'MNa[Vٛ-ogus$2{oym?8Ѳzܻ'Dbq䩆҉ 4y3="8ZzP.3ֿݫ6teC7N{d”cXdްzI5SFI4Ū2D"F%s$GP/(m Pill6ᦅe0єFx|˻0}вsahMtz oz]'tn=0^76HVÝX̻Qۯ֏ٖ?{g- 2e˺WK[46{% 35#&E_`A?bd7^U']6{l9aV]8ď3nG|5\}j|ڔSw~-޴h 5-Mmfs8R 'L]\`L^6oJ flJ\sD!o96u|8v Ӻ^8oaG-[29'D\WUB~J4@sAh1L9Fx2)ix{ݣ7l^>*Hkmپm^ZSSi|cqEJ\DЮ}"X 5LEDl'?=Fm!O >wbY}/L{'zER{UuIծ0Xcj7N Dklj4~5b(b~~q E$ęO|ZN$oFLԱxI-H4>wi{$ԣ4q`ב Qyb^ގReww>Dc.6_&l3>.Kl)G7_YLjGرp,?!چ"ݴI$ Oi,Δo!"1/XuK`T/ 7ݍ`0vr]WI;pib|ɳX=fIKSV?!;^6>< ኉Bk]dE&ӌޙ7yQhSޞ%~9KO.drY+ggN_moHL^7{UZ1u1}4r*}zgΒ*K T~?eTGEHɗUUiWk{1=HDdJ^<'Nza₍=k 4c#mfWQ~j߈<3+^ljՃx9f "qGD>4m_{R\-'?~̡O[j˞_7텉^~ᥩk}sJKpcuiSǽ>"ظ@Ou~X6|A[΋ 略Le'Ns|y>aτ? ^z41pƠ&cV$gJI{Ʀt:!""NÝ]@cPT`.pN@F0k5u\mQS&TglrKXkfS*Jxɮ ṋLBzN믤8,ioJvV>3\}1Wgh;媻'|=LɿZEH4޲;{#lru0zPBA#bw}3k9~]l̕BmkrD"˱`cI3͞>>֜Nm'ibOz((zc}g|UU  Ց^Nn?􏍈bY#TS1rF զ:]sn^d7Xp ("Zk6P~AΒA$hmyq~:[OʞժM5<ț[6bѼk*gt8ˁ-DdHݼ%C1 x#)nd)ZN}{!rԔ^ZXmLLKDfADD$^8zF>!, 4f|&L谱x"⻍S"٬ q 'DlģOv4ݪ*;Wux,=e_ʡcM,(г֪r){ _SV|2_^e7H;}&^#=&8Q3zFلѽ-we\Kr|{M,ڽxK- Nz|$?LWTYN8rPK0z8H1z ?׬1~c䨧=Ϭ8n8(ls qMXaS޺~/׼E5=zY""mіbyF@i*&dph2;ɛ^\ionɔjY _8"sn?*l]EO_zYďw|aüؠxj{wl{43yO- a#se˿5o1¦yK~r;v0 1&ԏIN^~姓 ]E:3$H2v/_u1<~0hd\7dbSZQ WN zmBR&r8Ͳ5%.Tr9l^tBPm뒤PT3}!cSY%Yl^#$9#Q͖۴}7Xmna]#J&J*>lw7Вe0 5JĨX^e[ Vw†vdUvƪs"  0 ~Q 7U/񹅿 8$td)ٰ&_۶y{ 0cVM}enr/BD6|? Ul wV]5)*H$""pmD䵅 _[0`@UUeuMlrKJ\H]/ E#oy#RJ;5eY6@F6l.-ӷ? ]t|"2fܸ7-8h,[d܉'H(>|˗ る._\WWWXP "%%;og'^?8ŋHYlڵ;w7Bjh<ٳcB d p*UHy2 ] hDb/rilْ%oL}￷t9.E֮]IW\1Db֬3vL^~-//g'T 4;~-"-6Bj(7Q d 2}t {/ZЍ5[8tÆ[o^wΛ;wܹ{3s_S7ĴSNԔ3gc"cƎ;fo+մr[eFH_@n5Mh5wR'rʑG5y򝍍;rZlmw>-[<8}zꞇO7Br:'S]fY6h5R_l|?l~FHN3]iv|{z@QΙ^@l.T/h?J)״M^h5R@U(%Z;gt)V# ڏ$tz@r(՚0^~c:W z@Q" z@ʱhRz6! v&E- "2aOQ]U㏉ѳff<^~,F-K8tQ민bR݆}|9F믽?B}{~[O9y9XF)l/qUW?'D#Ӱ6g UQaޯV__Tڶ>ӛ0 o^ mbVIć^Rʡ^@f;n=z̜='⻯#QzZ*%"Xln^ygΚ9 ~yӍ~[oYSS#upҶohm/S&/Tj>SmyXM "PNڵY6%V\K6k{}뭷R'7[Ze]T"X "贴NӮvǏӯ߃=z\{O?={[Ŷpxg%o8UÛR2.K!m۶k p<`nݻ#I F~vӥKt{VPO}wk9[0"5ֈ(e% X"̔^귿ۿկg͚~L ^J$cƍ{s20`?Xv%KƝx? q-7n]{F"RZRcvv2Y_+VLt).{9-f*[1m'D'_?5=trJ\@{6nlɒ7>|%"2r1cƌ ^*(ȟw=kԳƌ+kjjWY}Mo///gɝޝ6YڳK|VdF d v/Ym0M|Aɚ9F^:Սb__ˮVGҪJ@4Kk8oPJZ/[ޒ0D0GpG"ju/"Vo/_04 yi !/$[ >=/k2 ޛ;g,XҤ+d"g{tdz;JЉ(Dz^ 6q3Ѓ쾽tҥK NёCxSN Z` o1m4^rlR.etZT/+ѶCYt F~)6 o LzzeSz*_Cُ8K(<ZT/+ziH @[EiM^d9NOw"ZyJz^9RH3ڂT/TJ9DJtJka.7Ea󕹚^$z5^dRvB.@9yZT/Sb\EFY`6 Ջ,F]ssO,.!Ջ,*mE@Yfʡt,/ ) H"CQEpmBY~J4 y-K׫7CEcxS4 Ы:βUV=?MβK/_@`γϼxLn=zTWU=c"2{ٳϢ[E|ym?לּ뮿ן{ι"2tQ민bR݆}O9s^s ןwޏKJKCЀs=- ʂɧ03M4,͙FUTXm|a5 ?+d{۴>U*rq1ÕC2(%~NOs.׋]re}ᇫVx";fi^qOĿjbŋ^[V{g9k̋'LM7zofMM͞OE/FۺNvc4䶅Bx,d.UDd2=m@@xD=JE=ye|h4S.N]:ζ?oha5 #/D"6C:ify۔X]\yJ B_k?1qц_=*;+ypծޔm{βUV=?j-˺<s:H2ZV2pynjgĉ7~dSx)-]DDF}СF>O$7|~kٲs97^5PO}wk9A9[M!t ]pK/ҋ/4ܹ3H$M)۳gd<ΝZbw466#}Ѣr _ycGG)~{#8&R ks% N˯)pw"z{v֮]]YYٵLDջWUVuu{ٱhW6=K07t d v.."?(Ě5k |Yzx".j 4,XkӔ +ns d aMf (Qf: ׭Vn*ڝUUBIF]w4:E;NZXZ-[ޥK>x'"cƍ{s2YdɸOP(4|/t Z qbx30(lV?[䍩<.Y"" 4+=8=H̚5BL*tYM3O@[}qܹD"1mTvzcʶq% f (l SJ4\p^ t-Jѫ: NW+tfif@8hњD0^gRի` ڱzz9J ZiC9-BZT/\YEM`&+qΠ qAmA.Y@6>?zz%^i-Mz q\SqY6@+2~Ri+^gOQk1oT/ܠT˲2 Yv: }|m@^b6ys,AZ4܈ҕ h=lp0Phq~ mAnТ)[ H`\eza<tb:7)Ph 7!tbJDӷ^h=lp#PϴWi"|@gBH:X-^:Z<܈UҼ-;'@f R6p N?P W ZDч:k Rp)P& ^VqsAڄT/\2^ t/]e]_<0LeD41IT}Z`~SJ;xdϢav4!2CZNJDL*h! ݑuMf tB+eBAQ9T/mrNǒMUx]"*Rb);f~ÎJI"TGr7J7%X@c^@2ib`ۆCU:D֢3R דJ^džE)-EPJDɵO.ի~k Dm~V2MeLa'J=TիH?Ef4KT/V[a0ma?bW]S=zK/Z|F4okr]] YTVڶVW}*3Mޝwb+ SP*dz`ldz` {sUʕ_x?餧gO~"r)?|# 8z] dZD.>P||E)Cdq7-fՄieJBT:uu `_u[f۶m"…=c>ZܥxH$RZRRPTtȑKHfFx;5ж(CD$u#;f;LR^ce6SۉPeKο)am3UeᲪFeY/{аekE^']qa~jFUU^_]hdڸ]WJH ٽG-[6mԳWOHPیw@DrGkQt꣏>׿׮]EdرzsCÇ߸q-[joҥKiix{vhjZ)\oE\ EZT;T:ҿqD}n5UUӧ?3Z<_~`]nƟz=,Rf.3:DdVTOwW\MlTw}+D"qקnWlzŎx\S_jժ :lnD"q7?跖-6k#J9K*+?vd%k-Β(3d&V$3䓌k [^wca!-.RGy% Y+'TRqkcÖ&TN~yiJ9МozT4E;7@kI6&3^UnSn/]ۡSZYLKafC}ڵkek֬I=ZYYٵl <ٳgbV_lT]uuky>X9T[^٭̘aRqZ%DJåOzճGp d~_w"!7?J}lU/fkav\b_*'^vY<}c1Y =h Cu V^C'rT__-R*g!Gw4%" _gQ;*j]<" 9zjƌONk׭}ζ r&}vٲuXE[7x5=]vt"C7lmm^8#Z6|{g}o-?97uf6hiWV) /Gkuu^v]IIa֭k%aYYYeeeGYKԶдX}e'v=qkSΚXu*f.NDv. MM.}d vvVks2U^`9`$/#1>(W}TCjZϲh4w8:4ğzW^٫7\ ϿG B{&~RS~{k7ߌF%3W^~y˖-^z xgTBnܼWζ}܉O|/ªSo?_k]ҋ6-nGΈ#gD3_x\[o{m᫱X,gD,._]Z"޽e7oZt|"2fܸ7רWDC20ҭ*v9ի j -IR;.W@r`ƕ[ʋ EVDzy&‹&N$"y䫯"" o|Ĉ"o嗩9mܸkvg>cHăDD#umm޼閛y/ wŊ"駟&}zdS?;jgٻOgLJ~("˖-"5JZUeUYY=_OYh6C߯}NяԶٻOsyyyy/˽ߦ?0[n=䓻t);q%=?Ąᚚ5Uee]7mmyhm9#Zo9#v;CTlڻwYTmysΛ;S&jz-W*Hd #uW?ۥ]чZ*uϒ7XPhҕsƙg}>,P<:F7h;~+Om^8> t{\ٶ@  kw{>r֑#RekS~ý:rs%39yhΈ.>#>NU:]oN= 61t`W\tV p/*8jiIWD_zaEwwVl RҪmnj7nػH$0#F|n 0ADdْ%N7ή3jq" x7~m˲B uXK$W>ꨣD;N0/s7κm:#"y2䠉'_~EVψl .MJ_BS+(Ӣr]:ndcp^twƏN_Mj['=;&uϤ=jȑh4̏>g#)Rn ^tL$f͚YYY٧oK//CΒ^䣧l]_C0~ˇ^OjZ//N;цFi,x4S,vUJ^sVF ϭ r۫pz[ѿ7u [~q^bl:,dzs̬ =ԮZiH6%ʰ=v9J4}uLX.PsԢXb,[9\/Uqs}ŨR"nW.k hXᔤs=}hpr汜rX*e\'^U눕@:(߇j->Ƥu[[A?@",KKbt;9z:+z@ZF.NR{F(e|Kڹgy@sݫW)qWRr5M#wcl|Ūvh{!,ZĶSUo;ȒۖF6.zϭ* aWFMz7R-Ďa^E`rՒ"!@G71Cj-v'%*'daI]XxEi^J"s' IDATl#zXCT6z2|YPK.zE4m[ڙ],sl^y%ãu!vRl%˧>O+ڡRZ^VG:80rJ4Nh8hoTSssc:?yp1LU-M4TVMX7CVOtM1aVª *mU5vGUo`.ݲ+qU כUӋ?6v}5J)r`_g^ۼ\LP-BU/-ǿ+/8ՙTOrXam#JΗzL1miӧ"5_oWAS,;F[,y#u(zzY c #; jyH6<o/nTQv2DXΡũ0IS-4T%ԢDPDIm*`Ekm*n+[-omek$?/2bei^6_4Up CRڹzo.S-?VʜV3Je7Z }bFUotL_}uu -6v@ں*<㶢/$z/+epMۇK?/?O4!5<\S5,zL~v9\Rud9u{gHIF._Cnt GS=:_v{e#vΪ#i|-*1-{6N8|~s㚧 믯 T>G,,3v\9 \;Ւj&2ZEӫ0+T\yu+u*pBr?Ӷ*yiQPhb]ctAMފWEwLRUQ+~?:QD$ EI&vseE.>SJ6 LWDbU/{&Ny*~trACFDޢ>[?“z~JQHê|z[Lv 䔈)v@նtNū٦qS Rrur5l]P'5 OlZT6@W7M̜֥ 8&:4Q*>*H! 9j[qIED$whø%[ u/r˥ye(ѶʧC*5eea u!Rir:2b_݌Ǿ#m\$Ѥȉ?Tה=.W)P :Ț ώt.~SʫJlő~cPHݼ탮J?/Sy8RT:Dck%,\HjiǓfaen9MWiVR!:M^_ub]VJ}8c4dȰ"y5YΛR9rbJXxC#GZM(|zjb+""(U} 4+UFeĹU)1$ޘL1riUEuX :ĪRs>4ښw|cǺH;8ygՉN:Gg""9z߷.-ȲVwgR(X{Y gVFvԲaE{""y⫎a8mMGxbk96jжVN˲)1DnWk->wi2%e*m6M۫7n'""v4@fr=v׾i<{%wP7y3Ouw칅=xEO(y{Yv=;5Y뮏^Tܿ~7OqZ+;G}[au\ zm ,ZS"SXG q=՛eje6vt/thYM7+gi "-X6odz`H9U*SU!kR+mqploPzL:;/ë['}O}].8rV̬C>P;{l"}HYg Z%S"t?+"I;]:WGajrr{+ZrLtxu\m)&uHj[fBͫ$mm:]w tp:;>C`SB|e vc1R'eɦ ZDR7*h%"ʟ@=;!5PС)/ ErDR,R!8-8;-YYJ<8f.R0TN-t߻g9 ݏc3<}/3"PZT>x#WYie)i1!y4pznU6R$ PYӯݷ~nN2bwф7-Zyd4aB%Zի]2zme*P=sg tl>#):oX W"N2w&q[*sٌ 2sKt.k2O"FMRQ<0x_lJka'`mJ_"Mm뺟5gŭ?F/3gMY ^Sn;G%a +{ nŷ3s괗6%/<޻^Bߜnn&1q~ԮZ\?A%RGc/xa}0ɯxmFI !cjRXWXVǢ[H,5njijlL&sV*~Du&-6MOͫ3/vH#7p`>M~% paOPS\Y6Kg<6uh}QN̸| & ;>n yѹO)_}wDG[w]:iVHɘ 03Nr5{2gWxӻW|Ҩ|΅W#9n|Wk/ң:.3Ή=튋~_?~Z>7LŹ?↽Fawڝ\\R,vn=9.?ɯx |(wģM薦ȧ -MMцϣd"b9Mv2xQ2/J]лH^p>e)a_x DfәQ\Mifnzz6L;#A&Yw>=;嬾"wzg}vƔ%GlS̟?o[Ǘϧ̘3}ˮ_:=#KO)=N={Ow<)gJK<&)Qj=mU3p̀}Fal_r9l~R=B5_bYC/3f׼7fǾo5/>NHt,=p[_R!xu>xWiu٣*fM}4bPŋX[/0oʒQ#l;]=nzbyW_rE.U{Q˲au.8mLj{UJ R(y=*W}ikS0dЫ)ۡcѶ+E# tSR=ԃu~ =$ZW{>S%g8m-irP#'~vlUgIwoCN{k9/_C&NiȟM^Vj);49~Onz+r߯TZq GV#3J_~s֧b 5Fj6o/ٯU__y&tu e{^nS=ݺ{7F[#cźl]y}6t߯Ȯ-w~55k'|eI,+[5Rҷ55S#Tl8اDj-"UBGɤRd)6pPrba=ՀRK+Qz=ՀRɑlc2jhZJkuB> {+;L;oZ̚eҤIڲP (^ATT\EPīzDPQ,*WA  Eh &]̼-bI,'I<=sL- 92ZMK|A搏Q+H1L?o"V?;tlsd-n(PсoQX6]Z({v8m@3Veso o/G;2푗tF'j%Q>٧VVHśæͽh}`gN`Y=aJ߽y(Jߔd"J"Tl"+(Uj{fI;=cO2fĵJ3Q ;ؓf)ؤ更ONKZ;zϸt#ːN5^T4jUߜ3:/3w z_@^bpM9Bg#GZus_E?25X6]`ߴ~QX뒢#+ϘpXrOo}ףvm`!"Kp^e[HCbМ%-/⟭f@D'.'>k9bʍ1{"E.*VNR&}1Y@ ]dwEEA"".,b4Ad9PyjK$zaG!Rҿ䛜BVO{;is{ |i< "Ϧuz6.a!3. cAHdkr0FQK[ҍ/ bV;K'jMg0\/@Wu]dPu^$T Pk6Ӆ̂ zeKhB.>fO>:NZ:~pX~2>b@_~jcOMȣQRHJ]Z؝ܾ }EޛD .M t~,slJW'Չ]R74)ҩlC5>VԪg*yJoȞ#"0"G paiP[i9kw}8S N$Z, 7 Q`} n.TA;w=z] "ޤS8(~ѠAk8o|žkJih@Grѥmn֧{@ݾoq禬9Big$AHJ}MzMƽ4ڴ3@9i}:G nۺCeĸr+sN")O{)=urԬigT)*kgn=S\[3K[;z"n^>U i :ǒGND:@ꭹkc%Vue* {~TӬ(""nMgAtEj9Ubb/l &LH^I͖/`W[`9'7 sپ|DDoMk2a¼Uۧ {ys0&[GLml_殗g,Ƽ^v+DM}y^'y߂QA S&8A|{?0|zt_@D_'5[|=59oǼNWS닩}zٳsԕ."7KMuWf*Uͽqe-|y}2VNW!ڏ{wD3Rȗk5c"?$.zV8,}镣~*cNluLT1۫#dЕt.Ig/Qo,C<h Ɩ/,ĨYHiXWR<򨑰%5Vc\绖Y2p-@FqE}p:8Dd&G pQ`^0Ώ'BDTy^".KDG. KDD D5%"y a^Wp)xzzHzHzHzH\T/Mv(z"tÿ?~&VJ9|ܧw v7"GbQ3>X3@D$Ƭ[H|k|iEsk|r]^yO``SK(QI{AMzhh?B!̜Ƞ{7ZV%Ck\ (._K ._~޻}ZQQ}j7͚5}w`08ɱf?Ӧ޽YH 0|@dX>-n~ڧܭH_(P񹕄!;9Aa[3!yχ̭gK$>9SwN \DaW$'L@-6w=.cϮOQ\@|$AߕsbZ/>%ĖUͼq$]~ۀT7lQwj|-'oR+ I\ꇞ]](G-B;zj""Zseg 1o׮%m:tPe!u,@"{:YwqǼދE m'"IE]>r*J0MI۷o'C%99.X*KL֥FR#޽`d6Gx#5jUV?Y)nw('í)wZ_:~t+D]'@D;Z DBZQ`׵8m&"l?f+D{0[v8-up\nxuM$ ܕ~gynޯ,O!;+DI!E!Q?|CcS_Y>gynWR- DE\ @ Ȳ\(HZF@\whů!}jJUo|D""吇{w.i ,zu{;wҧII˖}믿і-EbbbyqRlӦM ߘ:;{5q\bRRӦMd2}봴:Vo͜nf⋵UU Lcbb|>'΋ή3ֱFR#sfuR#Su>NLL Lwξkn;rfo(<ުBDa^i)rbf}/"O09?^d:bϜ3|W?3?ѝ^!Μ1dR·c;HzoKd*r\br@ (^3}/Kop HoKoQYQ*hQ(PQ˧ +JGUs# \NB7ʐi= 6Ď'NL+p҆7RsQ5ot6mzr옇JIi;ÿefR*.aRH 0&&{g5֠`0ES_mڛo `BBBvXuk[oVB! Sc̙X#s:T52 6zh#Ӧ42PLZ ij^tW' NV8j`>wk?^XUqQ=17ѣooo>};\#~Mv!@I:%y LN'qbyh̝\yhn.o%_G9kXDR SEjnĥ~^gBh9%-Yв-KjvߌeK?[tƀ)7G_9~Zw3GR%%%;s RVocʔ۷M~&M6oޢXis~~ƜH\7c̙X#SYNjdT&M<_ݵҹ?puNH;h'BDi[ie'" Uw .`o)\H8ys@ϖE٤S "_`9# u{,%ם+$ Rr2\(E_{g'NKiܬ7};>qDDogl2nܜ-"wږ*?ķqMƍC$g}ɹ 'q9IeoƊ䛇XcRB 0.,g0X"MF[]7^tm&KFL" Kdp7t>9\d{饅2Ѥ|;LLYQB<p8{sLnQΝ` <\(*!LQx*sI𢺈=A}s)Gs" 3cmfHaLK|,I),oaOp(AY%"UHRE#"LVF&ԯkP(2EQ?9w$T|HȪrHb^W<U'@.Β5L;lxPTqɋP5%(@o6t9foXW$pDzQaaaxY]dx. 9'*axa&;.eYM!ޭ̋l/׋p^X:u^]ב]؊~PKŋl/@̡p>rμx&@;9YkHJ6T"[yp)]wj E br2bsş}(h"b&=3)޾p^p8Ku+wݭۆ_KJ*2兑e2e`I FjcV9J/J*j@z XEb), ]v˲D{qڂu]uQy^"2= ]}")8( ip~y] D뺪>x~?.@͋;8{"Uv@5M#"Q6mq;v,???< _M(F}zы>sg]ھV-^ZGjm>%9--,uCX(Dd2_!IJ~<*;:BG^slTɽkݧ˾ޚp8)p)ء?ne{/ZLHJI{-&9[j{#wwHߝÂ6#^Iw}IN{s&=>mI!j9|k=F ]E$ڢo^Z1U)NQe9+DwvM~~cuI1M7>cޓt4iBY>;vAi'퇌ؾYB~wVڢis+?n;x&9HzjBɽ'>xw26ͯXh6R_VVVZZZ\\uEYb{"13Ǥ^%o?u5.g5Y&r~ߓ&/YfDD)W:~|jj< )?ck&Q|I/>ZEeY?:Ģ*6n&MꛔEѸ{$-Zy fHaSM t1G<lkV/zwY.׉>.\8Lj}Ĉn՞Ec>cٰ;D\_}v]gʒowl;=#O׋]*$+te~U򻤫YC;Jգe*D+*>-Wl=9}Wx""J4'$(+3_N L:tۼY@J3I<*DDDS^XEDMIMJ,:3{fz9kԨq{<*q[0ǣ9kJH|=V1MKgvHIOwSfvI*Er垤ۦ I͜zg \sOV+=۷{JJ4SvΕR!ˠ}j-$ZDHDN t?+#;*ɔ"g;}j5mSSRsʚLq[:_*ՙL_pϗOlnt8(ut9}DSuIKz{͞.GƾhJ,dYfƹE߃=sRœ֪{%mhgYrt Y'dDWH˒-)wk.vPLy)/s!"RILiRMJMq/;q1 7{VBőMwL<;y3'v.ZPqseɞ,>h<1 (( ^RR$ޛ㭑;=F|%ZnO7Km0|:8صӧd|]f }g}N%%5>cՏ2VY4 6u7 o{_}> 0o/ΐO0ߺ];.u­RjuDT3%b`Ϯ C$r=J6X,O(kG<͎Ա%tӯoWX>6͛1Kl5xA烈83V3y*{'iugP3Ċ7_]leSi*ylzg_pq)FY^Z^Z^Z^Z^Z^Z^Z^Z^ZeYgVX^11&&rqU̍pW,{~?#G}?ZDjjjaa!0.\׽{Qp~ཱྀ~AXg9 ϗ_qAx|  ˗}auoG{gϚ>Uyξ}tqò>W_)**-0̨Q>mzqq, eox7*/p:uBqסu }k%a"j!Ch|Fss+l}*/v'ǚL{n׋Errm6qeee=z:f5b.0'=zS%%%DԠaâ";muo#GN.r8+e]?N[  ٳ纎o۵os'-?d9b-:;m۵kd۶:`_8ɾ}ѷk]s[j3>0|GFN* ٰao-YO?YfGj?!8p~k)F-o]N-VlBOթkܵ0~*sCoMo*G=S 9~]Uc̐G'>̙p΅GnpX wx|@='mRdt&|$y]qJcsb[1ݾ߭xhvQsJ6כt~]a 5McY~ݿM7fs,~pDEE=ß/_^y; oР/R?$<)”MZZZƍw(|3gLr@ ge2 {,kW:3:mY^%7L ow[SzC mb_Z*vxm]nA޶~vj/+")KDAL^if{m/ϝ.\o9<䲎%%Vo@*n(9Kܬ)LI+d'ӥ:Ps¡nZ9F5~m!WFXJҷ%CmsyW_Xۻg+Vњ5G9c[j(x"! ň9jժʳTU} {`eee?.n"zW(^ÇѶm۶mVyyyO~=c,aC/0>⭙3AzJ.٘ԩZyv]#GaOMODD9 7I }eBM߶F3fW9""Kێ4Qim{N]N|cVwt'q Bfnjy6n ۅk[4>L;ܿMQ&u1I~Ӷ%VOu-Ry͛7o>}BPKNb[2_TT_“G@'\LDLP&^?(2Cˮ銲(.^ɻz`PEWYB-T҅!.}Iil۩N&ev6@hRfstu-!Uz9" :r. " ]U +8}W9ɋ6L%0%~VhZ:{I2\]ps~Yk۪^ݺ?@ߺb`ؔNoPb"?CqD:*=[?~T/?^$"JӮ7 OmRؿWp1w%% :O$J|ۃ'7g޶$oL!"v%׼o{Զ|KTW*+5mÖ9N{)6r A/QBѝO PW mGXGmlDDýD~<+ BSot{Ҵ]%;'o0BDD*e+_+CHgzxiJ=0טiqvr/ &3jʻʪBU7җ"R,:YB~y?Idda@DCܶ㛎vs%Xk'p8]8UhGVcj=zj= P;YbkU| jVЂI37%Zfb=x>爋j~m<+$&xBq|7wk'yW-X@|V橾XΞo8G2]Njyh.D+-KqP hclCͧ9O-u|jiEvӊJ>P+Q?Բ"=b 5i~E 5 ]C9kf-Ej @Lc@+5)zXqv0&dY}B4ĚKYW융X X8D+54-hbAȈ*ijq oj& X8K.LKuXJR#k,ee$XQFxB<QaYe Ru /: 4 jeF*pj1\tHW9t-Њm\k,i_FKN_ FsYS8Ӊ"@-s6" Otg8btbK2` ,/eBZTRa5]eW 쬕eXUWy)dd ^˜ K-D ,]$ާGt42 >+gI1XW+260_ 8vQJSXXO-QD5hbCQZ5 +yB#YsVbfLZqg)t cS #6ZXɯ,YXĚՀ VRū:hы㛅6 [9 -hc-ZHK9;? Qk$8];YpRZXd!![Mg|,YwD>ZS}j ;"k,&k8뺬+c!O}!X-12|Zt@::j"&m(C9PZ#Jn!ሒ@HBl%7Y-ᢣfGՙc㣳D!!U]k  ΢?6BdY(ድd1!'toԨQaE!99XˋmBn;-!!acǎE QWn[LLd9Gn[tt͊mr<p ^[{嗻 ]%%%؍pil~Vb`H8޿VԮv_nޒ,%%JǾYH#`)NVI|>'8n[')KeAbvS#c@j;_do\ϣ򤿼soRf_xiL/䡻\!Is2w|=s>1qڈ{w\'%=.~cUc曦C%$-3ެ= ?Pl<Ǽ6iDc{kyvfnS'Z@=E+5yQEŻ&iR3d߼|EKмC 2Lm99?6l(i1xssg<>CkF.MˮQMB 8 B-}bbB1sSb|:t'ᯇ.L@GWe]izuӲ˼\8Yv?5Ye3 о^lcŝ:g5V7R& >@+rx/"0ctA}]C!BU B!j, !N 1\߿ #mz1Ɯ{. R''{|㯿UДhѣù@'jpz:U4@P8:6 ,MOjӦ}s12&;iQqP̌I 9ǿ9q =F3rI5nc |NgGS@-WBO~o.\;2P)g[$Ӿ21C}o\mhƴU1q׀@;fVgEh0QmY2!ݾ3<34?iUae~QMBC!B5_[I =<:C]K:NP_9|9 WtupAZR&vd*FX.r9L4 )H<@{ e87taۨZE;3ܨ8I04@9։;~?ϧ^m ?,рҰ?{=:OXF,O{ʱCsvt*D~$3(nױs#^q1+ce_z%*9u*W7ҎYMXy >W~lhlA>R^xV!k0B!P#mH;MW5;Ng7UY~U*A8q:9# {/44dbR% VTeyvcӦsHkdWβ4{vWvkW6!,`ncFGAx.x|aGJKIS{sgίmݨtfĽq~B ZQgHG "ѳoַl8Y.46|ܤUٌGn]z W_o}uLEI)6mطNMMB*P/B!Pó,9,K2Aa]@|g  yfb\T6hdp L[l멗!A;m>7}sr9BgDt[u2έ@k>Jˤr`Ož?I SNY4ZѹgL}=@+; h'dj<{Μ={=v1]eqm:_yS^SF.Po~ڟU\SĘ=)`k✄ x%i{|s֎5B!aBͺ˺I*k(*,v˛zo:]֘0c恄E Q1wK ssc>=0 wϦ [0^=#f{ɀc9&mc: 0@SړNٸVsr xd؂ci޽&,9?}$!e>VL#@slӭ2)qq 8NGN]^Rw- jd^h[ihSVn2jtZġj:n8e?ԙϠey lMd^CµtibBe @_B6lXR\\~B%m bZzaհjX5V UC!ww=*?J*zFTe˖KַE?/,,t5o޼Pwo ߿e{l2`ٚ6mJ]lM4WFq5jH&߾u˦P(T*Uvv Ajx B!B!B!~̓I$`6x, uEZ|?!B!HO!+J?!́/E IDATaIΞ=c@>}ݧX*~駷nݴjܸ}_'emÇqcF߹sgܹ[oߺ5)rJ@@@aa!E7'&$B{3TJa|ᥡ^\ǎ/))iߡQ̛kmۺd2D"y.999uk??g@C@_ !\Yƍzv}kنE=r[h4.[~zqqի>Z͛&fr+RGCoyT|w'XT/ZZz;g _[UêaհjXX/H , xzyAUޅ 3틏LѰa^JL$Ri=u9">0jFiST &MׯF6lV]l q.Xgyd6+J,\.'4lN3\.wssׯei GKVcܽ'H4h'sw{J%yvZ :>ݱ`<\x䈉Ŗ. ~ɓ7o?S?|_@9OOD3[Ww:,\$rRlz#UêaհjX5#yH4hP_.w\Yzg[%r[ E `x K<% [HuΝ t EQ oЀr]qE'N WN>w5C!%`!PU(ys%%LKKMlԨͭ/z*(r 2M#憻=r =BOnLU\ !KHwB-쇸@r Ec;* 8m8/!dv\̈.so'[FL%I;u)<|)OR$!B}UNù,ROpԬpŁY cGG0@9AGv}h EG{-6cޖȀ_-J_> >5-:3Ƽɟ;O_b~O {aȥ9yQ}4[ubÊU6D?|x, О=F lKO3=-:fžkvivI7ag}&F!TH11Cv%ظq 2ߛ9+v7e',zB!TvERt7+/O=\eY֖ѳV + Uj2qѿ􅳖 )K0/%q X4.rxܼȾS;)!kxTzzi^~I):M_6y1~qg~+bOk[Tڭ'ZLuזs /~m_lymw6[yU$\Ծ&F!T$TfG F+W){ϯՕ˗Cz V*EEŋ.x0v!ra`޿km<`+LZEI}A{qyv'ۗ{o]}Ŭהe؝{wz'5 6o0-hq?ڶ;iKb̖h{.FⲊtޛcl<;,zt RՈ =G*k)gJOb'(rcA"[/i9(p*G!sm`r8WgP3~Y&_{0#u/S&F!TK;zGQQQq^xwȐ={MRڣGϞk׭Ŗnݻ[ݻf͌7v.^"yE! U*Qޝޞ> <8lLof>d!/׺6^oYf/8li|=k߫BȺnf\a_3[`r.2G}鋄ĵwAoɟ1xKgSr|zvr&AeSr*mC=;2g;Q=1ˣt/WaOmNN2wp/]"2-ӵ?]8' RyhѺ&F!Tn r;͛MϞ=[nz[_OI<)s SvRT*OR "B t&uT_ثGfs\/Ӂ]˽r%ܫ:YS%/h~\ϷT]c_]` |e=ۺk+1tǣWwo* ]u?>?fwf/xF2_o8U5\ß_Y3c֬~!: 8,ۓqu޾4~Kܕٴ\&]ҷ}SW 뢦hZ-`:}uD]׼iW Ӹ?fzl/Y`0W߆8}|Wgeyl۫e5.go9B8tQ:DjK,/GT߿ @{tSqTط}qa+;f{AI[_Ŕ,!a/h׃}Ҳ8.#5ëw ?GzjW=qDA-nbBux_ @QՋB!FxLk 򄼅NfW?bg*xy׊v[UA/`޳"fpuKlQ.e #לlɑ+vE2l Wּ4+r{c0枻|Y'dž<4 80G>{R֭8| vLAJקFn1 rYw0Ӥӈq|dƼKdp3^0K>hO)D@A꧟Fd3[WZNl 9'6,?(욘,;.p[ !PBQl^ЌH( fTl,]Buӫ7 !B:rK@QzCz4W*P/.BE!B!T"!eP 0ԋ P|H[Rq*!sgg#!BՅ{JB38zC0 ò, C_a!##B!TsQ  A!Tm?~BzaB!!Jb.PoU`UXp҃LSg C!Bz$F~aBvZD :<e iI|T!I,[7?F .{S`,ewA!/J>-HE(BQ01!fl6L& |իl;:.ﯺ`D{= IysJԻJX}Uesvh;u{Xo tzEVN tbY `\سZSk}|G\-3.GUghH;_ FOI֧h8_c[ qӴhGHĻ̞'ǛW6fV'cNi>&'W{pjHdMTT~>C5AZtbGϯ*nrsXeW\u BZ\.W//`*P/ϰXBȃGul*å˒]ӱq~6ZDצ)쯉SbWvz 0e uhpe'r{6M\01.G35\O)-W+ȵErہ&Y0z (Jb H(b+ ߯1t m".;lAN0]'xwYxze3׭iFL`I`ɂk } @^Bid-h BQIi:`iiW\̛y7.?特5g\ЃnU\n1^JЧd<.7Q1/ߑ%7tw_0V~2^YUZS19Um/dh{>>#! ׵Uϔ!lڱ)^ bR]2! @EIxk4CR.k3_7P Ԡ N)J?_vܱ9GϘ)3jiߜ+&dLNZY15 ?2_l\ >;cՖ>C#?V=+gWYM6x9s6kgТ+xY#8vWd|6q&F!Tˮ% eP/0qv.B!T fuDXoM \%qT%N3rd/T *ݲk2 ְߺ\j(8SrY`1L]>nkZ* KffL @ @ H(J("!<""P .<[A &=@{X户Z2 #F*ޙF/x~˦ ,*JTrNc+}sOrG وi }Nyf<\͞{V^6fq|CDz](7|JA*_ 9*MB\^A&pJ^|џ0]gϞmԨiҤD"uJf IDAT7n%!q_nb;xܘwܙ3w۷nMPXXHb͉ dd`NzBn)!EcJȅ䔧8 2r9R :zܑSę:+o(Ź?nENU :S'&-B;|O˭[a[+Kk[犉v-=z E(wCy@Z^VZ ࠾\+Fxrz]B.DB8`ުx qqtԩؙ1bf >xݻbgΌ>~<%콰r_[PPTj :K$W^钓cV}ݚ5\HI;GO5uW{GcՎ[{ǓSBu®st-s:GBpp Vi^JArqʮ!p^UMJZt#tA3ǼDw%U׽iw 50  K!}1e+#@̛M&DZ˖eY8qDzmq!g;O.d6q&eŭ%kZ7fd6m3xN59k<,gP-_O>@ު؞~[&pe^SF9kqZѹgLՖ$ 8@o+ŅMۓGΈxnB 6;[ړ? hw<0:˥wA΄W)',[57~B[oBx媵֏ \چI#rO^{u< H%x: n޼ /p-Y,i4tʕ.]عKĹ3gnbofVW?!F:xYIzu]U@)*+4(t2x꿦nNjb v'\Ny{tw/M/W-kiL nsغ#>:qϟ,?5jurM]8f<6qQ2.vEQ u-ysykҩזݸmz!WZϛ.l7%kLbW5-8Sߘ/h7q3}eMYʨi2}αSS7ZRdN9+xu8q,7 @a2֘}Nr.d>VIJW3&G & k13M&]t;[TT=-㕫._lBuW@Y$%NۃbYBHÆ K˯CJQy xyyeKܽ[&פɑͼ/]z,f5nxfM?>bY`ś7o3sEwpY9֭ JEQQ tṊZz;gk_W{ZǫV]֭0?jO:-[h4<-7o^XX]lEEEw=i6]lM6%5g&Mիh\l5or) Jޞ󧎽˵SuxůK3ׯiSmypy$$̬Y,(nVffy0v:qa%"f?pgU[oت^^gi6l,sޟ?ɰjX5V9ͭ^\!?t:{4EEEbt/پGWuwľa^+ 7^c}]x7: 1oXq^Ӄ4nv^~ƍIF:?Ѹqr#uuӦRy?M4q_gu5jذZv)ƍ`ٞy٬T*]lr\5eswwX.ݽ~},M4l0?^  rtnne6uعS"6Rl)a&<_vHObx瞫7͇pţG M棇=]ԨiJ5aCO#P" xnCb >>CrlkVrј~`[N/dq f*GBu4hF*j iY %*@D>k;JS- oAWpx`_Lc^\Gjjjɇ2L=xӧSoyFwwΝ_3;wBMHvp%*Bݻ3O+7ŋ&N3gΜ9sٺߟ5U|zUi8bxŬ1ukVck6gp!P;#8/G<BkpcdAN.~x=^\ǭ[7O:j͚6#JSpIV]g6v܁B E_P']zBN2ZZ.e/Jـ }uTU9RH q&?.c?u7)&ɾwB!$(/8Ti.@wWd_ /pXxe@}YC DB"{ Q`Uˆ]B~ѵ:"T~.sA*\KBuTʗ@AU`UAp B!TzB@Q )0på]BR(Ő/B!S O X|b*P/w'vBvFJSBݸ$Hx~d6cT<vw D EBD/OL^B'E(P V,T]_`oBO?kMkO5W T>2(b.2 MR?"HHRT"HW4+"qFŬ[֧ifcիV[}ssWдc !B o (f\PCՋGem@!TzR0ZSoKA/;BEY::a1:Lfl6L&BInH29g6D:P{|`i^I鴭9tмm0]LtݑjKOVKr%A]?nCƣ*~y==ykݼOtT6jl]Խ2FG{=m eyآTp3!jB$ŗ(I |饒C?|ܷ ޭD"!>\?3w۷nMPXXHb͉ ddk<ϛExA ʖA*`$-%}/q1%qˏ_6ͳGǙ5gC~Cm|DW6bz~}9x kmͱ_ᵔڞhc^^pl'Њ>acL}RF,٭-}ZОHx{H'ŁeBlEm;Φ<)jA!T (Lg\9۠A:`T8/6nhfYr-Y[o/.s>a0ԋi#P*F٠~cïߐr:+kq7fn>h.L>>8zۏ6u?^2ߙ0Y\1+u9:˸8W\a- M@J;ZڊҎP&Y!?J%.^d2L&lJbMKӴT"P~` [ BN\,Y6mGў (y{E.`7oZwZ/;pVE{˞}ת9Gh&O/zBҶN5"li92O6b&mͧ顼w4z_O)9zvrO=IPwM9>PB !JRO/Wo?v7.F1-W>>>w wlsϯՕ˗mq^g&e-DxAPTJ40b( @^y[No$ !l^T([Lz>}IDYG OeRԌE%SϚeXWx`?KZ z7<@Fg0ajHEa^47[>\ʑ#8PvtԬI4M,k]ZF/\8~O7H].!j1WTg(33{{7d;yy-ZƎ;6WBKmz9`[NpY`3%e@F?|း%SfD)E.cø8ڣyK)+TK,g R ШYaAyjDEh_ξfr/@/!a$ 1 c 4rƊgMq4Ɠ򠥣"L#={R֭8|LZsi/&B4iR^Vqy?_هZjjjخ -r#>ww6 Mæ5v%^2e)"Xz`MVZ66:Sɸ5diK(@<94-ÚW $TtM{VtdEkçY "2*:noXJW[;ܫ Wp}  rBJ9]ho`!5^a::֋  y)z6ʼ~ Z_5}/ցR- Po7oR6sy'1] pojo@AAb0%OŁs Lc^nPE EA| %4˩'rt _-jNDpL[a-  R(jD^azX9xAxo(ok$ܓMW@aZ:5l~ A   "PJ* GځR/Rq8XBi`:ǛBC@QU=dk/`ˮ>{s(" \!R^pNۧԋՠp`g  n 24}R x,qKW\  H8 @rT/àZR/Rwzz1 H hPK߄  D "Z T Ei`=5.EiB2U! \PJc{qԋ9%T 6# "W'R= PG/ktLUĬez#eY!   BJ^9yjJH]BpqzAGhE%ƹO@vRcצ8 2!PB q9c38cz܋  rD: Ƒч 0o c27hgn/xsG /Aw/|W$J(A A`0A `):2 ^X/f0 AEI$)""222****:::****2"22"B A0G)  A T0p8`Xom0\]AףgO˖;zo߾33Kxtzg5kݕ>d{>81gXj~01#--2uʕ<IUVAVy:qF]ؿ/0{%haj ZA(<&3*T& !kX/bsӧ,IbB(`̈́[] &f~*:L`h);6qg̶K&,{Zt{-YU\Gfd>f]BMQC6Q&iҫ Xp0wsv@r(&>c `L9s֤6Xec>7Ln:[¦acRE5k[9hw3 |eVrN;gX0?3`ǂ\TJAܳK=lEz5|LzxU vkUK/ͶA$|@Y眡[+.WO>ƍJJn}/_yoe8pK׮;:vmۦis>;wVElL˺ Hp@2aꖹ$c >;ga@\׌c:4I>i]ee>>^UY]Y8FZvAYSjoϙěV=漶}d2я `y[JnC~###G^%>|`"$ψshPJN ^P#ƙWW+; >5?ũi-z?ulZ[U;lp6gMoϱlBz &,_ĕ%;!nt@IrZ lO] & jKrFr& g̙{P;tNg~ 6wL+h{l7lۣܵ97# LPwn>k{s\͚5_>3 a!hq" yj%Nַ_?-KQ/22KnEUU P*lڴi۷O+}?8xw1cJKfz|]uUW䎯v QKn%E4I.æaӰiش.҄6GśF5ףՇ#ҾI;g,yhò/_$'Z>wo<~.8 Cgo|>kěϸ߽l܀CMPvogƥwA% Gv4}uԎ0cJNbjoW^r{XҞWU JowpIVa;Uf(v=BӜ I9[ 2zw6Ӹd] -SrU#UgmtLmӭ%>&EY@ly{{_P\,nSgv| dۦo/c6/x]wwز[{{pޘ}[6%xӨ]yvu9Ҁ`sKK! z5QE TM* 2zynN0S/x+kn)J}::) ̈́{X,_c@4x\u<[g{e f Ϋ\z1iXzܷRj'%7k߻_#{'C_מ=f˦ }{Ž0&wqDDHZ ^ۦ/I]F_X ClBAͣ󉯥i&MŅabbb˛5kukܸf9 f2!M4 úEGGd2°n訨pmb&M$IA⯊? qQA;b0.kcGGݻK9zG=^y Kغ[RRS wu󦯪vl>}4 WLˆ AO(4s5V-9~'N$坣G"H dbr:XRvPp;7zʛ,f]i{R$ErNꭿnU3'~Ἶ[-g)s.P)ePB8!RB(T[JӍ+RڑBvl/ո~˪>g`KA\\Q=_9'sЁ %!͚;ŝ>/NA͟gaI{aFFkk4l\ځSevs3]Gٯ/M|~*m58H`k'itw/[!%#\vq<8dȆuyyG=(\q/Ɍ1z0nY>stII_]׵i=k؄XUeҘi/97Z*))qeubbbiiixjZ\qXMBN<uk޼yDDj ú5mh2 |[bbb,.WAA"9ڄ8y' 1ё1:h`GFʎ=C.﮻~Y,{7_{O7l۷diyy5Uu)))s}S!{AvO2p&XB\L& @b19N3FZ>ʘu ׍[5nw-*ΩgZqoih5#N1wڝnɳPt\hV["1x€,mZI/1j*SJ!(3΁3`A[M28rXb'zvϛ96nqQnAq沮፯gܛ0DlٚDFZ 7v2YhO77Z! =;''ǽ{}$Ik?; [^ʶk]bι?ޡs7w];f .:Zj?n)w[ɥN>ܳQnEmo"R0)@mēcO<ڔ%$i#hRoA/_\.WNg UUeRe#>p .A{S8D NArȗMӧ fM&OesGP>S~W 8vE_/Xyctm,o˞HcbkөcCه,#ݼqnwyr8LTU?^כ(IY%yDZQι*PG ZG.̗g  מ-C k;WdoN11i˖ ^Uga2өWѺ);Ϛ:wJ e0tJؐ•O Z6(QKsAL4m咝A{s'*И20c |>#xc59oJG6᲋C>dl.))aQJtCx'4nu9'01AJgZq VW>axÒo*{ə ,NO7V,E qo]iqQ=7 ҰUYﴟڷ>{ߵ[077Lyh3Y<+(zΪnoNJ`Y'e.ܐ)Oe/ɚ[\Qsm_:̵%ٽqPJ)\]9gL3yZ_.lW{=ZĘ pU~+򪪢ȊȊq?Xfr.Iy8.V6}m9lҍ?NG ѫx˗ZBuy{zِڥYͰ3ʚ0p@B~u;My;=dpm\0{SHy6q[d--RS,)_v)8'cn<8T*A4JX>g XH-{޾-\./+Xow\;55RJʘ\lq?.æaӰiشҮnW e`i#<#L<(@eLeLUUQ9 HÂCHww&][ nOzyk5Ŗ{ +KƽsA:ƍmg0g'2.#R=XDsBP("uvW3GAM!;].w{rYOm%?WuLUUx~ѽ?tJǡk4PAhd=Y˙fAjG*g9ǠZR/g8vAJ*i UUɪ>mͯ< z:4΁pg7L k_~3E_A8͚LcJ- APJԊ*9 L@q p Ҡ:v! ܉@qx`t}ݔ-=8!y?x?R!|zi4ideEUU*F"R!Wsz:Շ8VeT\}ʄFyD/] ȕOSK0>CgLzkJH 5v/bRa/Aʃ M}%uf2BZ(^măgf,8ןLދ HiLYQ9R4C& Z zk5M ZNO}p Wf.%z/ q7PRi5_:zgu%Q h5 ~`0A66#`1_I((EH:RD$i_P|3A I#YVR! s[Aj j``T/kF"uC)}A+RM37"##czPo)S[}z_B(%P-^ba})J)Tc(* 3:aOLǟ{#&;yܝIFܶ]翵d>;*Q~q*?jpDmztQ~+'̛o>PSdu o.P֊I}&<5zn/UI=j=6ۑOu1_[Xh/پjm/,YZ;f|}I1wjt֙O;-ޝ˼Vx uG[z%9BT/c*!R^![PE AANTTbG@Zx+0~iJ> %zO%".UpTUQEM}1)6imfϋI<[rcn;}x‰j}l n].XESn3| D48A)gcL}mm|>6Dj#[k6ܘkm`ju1ݺ٬.e:D팣M# IDAT?Ȋr~Wzd  B(啼zW͚2_ N =A :W_y?|~ƌիV 3JJJ(!*SW\ue# N" {[Eˆąo3k}2a7%$pm^;?N8]O.OWqS`б-F1b*!Hݍ/= sEA z/vxl<kDQ%Im6&h4訨ȈI"["#FAd2&Yh!I$AKt=/?VP~b#wxߔ1?p/*#z{e4oϮ*nӫ㑺jo_:>5;1ytkiCĤc~ykM!H5+m[xil@c6s>=Xy?n-LuK44B z uT3ۗ1 ِRP9$KJiFƤY(JYڵk֬Kh:/7gnݺvWf<:;kG^A+N.ܽ TܔÛ7P͗~k"EXyfomE2"˔i-1@vo^ 6]4k7p:Vg1K;S~r/?%׵'Py%xyces! LUUEw!8@  ,f `=ףͤWQpR_1T˃}2QU5\M06$[Pl;_+Gh4m[3tYص>SJ36Dl5t(65+?r,17%١'&>q-g7M y}l|ŝ!Bֻs ^#rzT@8uz k|Uj\Сٻ'??VRRR߯j_!wl)--=ŋ2㑄 $/AABu::WQM9&ǃA]ZV%pL&-x;Z[$lb1Zbiof.@X$a>^8hFs+sKWB8@9ջRF)2@[db\B¹Ih+cLΘW[3oNsP33amg-9oꦴ/g{pʧzŝ2{/)gU'Z`ҽ/3od-gg‹S*8cky<2iw&LFc-y9zd*[UTURq22\Btcc]'C]5gޕsump5!}O?IR^Owf|1UBCj=<"[ ӇC ;Hĸ[ @4M`?e] Gĉ9.vE}{o2];ZJ}OOeF]^vnYeYQ"˲P]^-/'r2EUdE+햵ksye絟󥥥eeen,+Z7Çؿ]sr-I.k\|胳& oj1xVG5tL6 >6 y~V6| 'ĶN566b=zN]oG~-w.F@'k!VԋwsAjkTD%aꫯSҟ~>۽s'`1b(a:pE]XB~Ao A+kԎ۩U RA7ߵ~_Y$Ytm /{^)8;mf 7On⢟OM|}D ][Ͻ^<-ى﷛,kܺӧKJJ.ʟ~beA)*9{qA$'YLzukE5jwxo6QH݀uA20PZZJ~ã[0h]o6ϟ % AϜ{iXWmuV19Ez>`{A$ pƪ((F"R^?%D 4"9pJq8P PE q#\7wܡAPVVd] +x^ ^[J)A?/)!/Z@/瞮7GQE"IWA*P4p@Zhn΁`ڀR/Rw rex(h r=~/6AZX/UUM՜|᠗F2^<!=" xvr(ŗ:ɈR+'927R̸ :: 8K@iPȲWy{Ry04LU6x"P(UCڮBc,hwL Ro@szAMs EUoOn 3{,瞮$WouZj"VD;64<n* 5RVŁs*!@%ׯGϞڟ˗-;,]JjsfM믿z'6kݕ>d{>81gXj~01#--2uʕ<^0t W$\$v::>(8Pq^j3Mh_BE7TA\P,q \A p^gR̸ H*}WX|p;c6ǔ͞bRSS/ꪫ_G@D-O|_⪦ qaӰi4l.@%Aom6O>r x8 P7.y= Vta_-׶xs֪qu0߽` 뇼 $2uƚ)Wg 7"~"oXL!J @)jsT*CA A"""^xqhZ_n7k\͛5P*%%=e Cɿ]jMё*ch'D͛GGE]7`525iܸY2hjHLLH6VkiڴI&qqqaxĔ7t7VTl6aL&!I&aXhQL&S-"2DQlܤ$]vstTI c(J-[4k^jo04X ecȑ#&xi6GjwCٳgɲ7srr^}b/0>`}7,-//_j.%%sp8\xWAz !,"lxsx"##5ڀ@ݻ)_`0w]~=OЎ8B)A0Le(,sF8'bSz{x^.tH]f쭮?1_ZdWeWwЂ S>w1m+Ϙm7?L\Y 6pY[Nښ29b=I)m!vM4jR'F?),ɎKu@l)c:%Hpstw3bD5y vט>|"n6kvsCN[x>}dM}6Y'jPI7??bz2VAl/G=ri=}[Oz-gN.))+O677VU koEjժ$<^]\\u'=-97cLnJmGɘT<aGt>7c`޴6\TJA=lENknP忛}1GӦͼ+j`o0y1z-" !*8%zM@W¸*w_ u+O0~|)/ӧ'gN>/\;=}XóS-Ľue /ȰsyBiX}>:eO*#k3 H+3^0^7(kCM<9si>mkK&h/Oϼv>"`dd$ ͫzx+~B&>5?ž,-z?倸]uΕSc669MP(@B1aĕ!?-9 uvwnVl^=i4l\Zު-v\}:Bc8#vN(+ \a:wQaNض;pCc><`ʹ{l7lۣܵ97# wqceeeХkÇ@vvvSOm(Z.7]E I,,]Q՟啔yɎQ4XIe\}i$IUUF* O ae1H /GAB^O}-[4|1s¬F/=,ۏo_Er%oqg^1"5Q3w/7`Ѕs>@[{q]8t‘6M.u?92w;7OZt'RHxmT>WQTEQE^ T Qz9=h3 } a Bwccj;`GKI)vUeWLf);+jY1vdήrv H"۳#emN0Xs] q 5|wΖޝ;b{4y Yz{WKf@Q3g,Z~;wXhQy`;u3,9Rbv=uI^g+$SUB 'F IDAT3ِ XTQ1("uwAp)'r$z5Ӂ:!sqPE MPmc!8 -oo6"emێϟ splӦuE6z n[vkoϞwn[JiWLՃ_6ł. 87h(U4!BTƁJ($( zs1-^e~ |&KkjsϜ`6$_D;W܌yS[Fkz88~Z5wGe4 H"Mf(޲t.W]2a=Rz1iXzܷRjK%?4Ƃ3  ?1_[mRRa=sId'eI2=ٯ{̖Mgs `L}ŕ8a>yyԟ}HwkS&z^Ln Lʌeͤd(W^&P @9 >27>%YA-Cu)Eq-I\(\Fp;#N$坣G"H dbr:XRvPp;7zʛ,f]iZjk|`HCv} ]z:G{oro87& )s.P)ez-% !BI( ~1C5wC=}8r}^ێ-y#[]WvOFlqFf'ֳΙUs2P;d1ӸYsԡ(}'l~0ph4l\ځSeТ]BYmsOjh3f-֜pݢ((n6qٚ=͛e+|.AV A0IAUXIUTR^88``W3@c,BQA2e^1j9~MIL ށ$ED"u\TIOPk0*!zɤFbr:u#fdϙ4~|ٚ"kM EOm>n׉NG}hЇpwR۝nɳ6{a{^㮪n("po ֳi{x|mZ0qz'weVh6ޣ?El+kBZXfsY=0sdr-gk.%e=￱-dECzvNNVio>"`L[l|kÉ <'3_<\{6@bQ,K@lڱV]bDU`0\%s?RUU{GK^< UDE,P1("u7d&V OoA+cWE|͒J}kg[>E1& 2뀎}GtDs\ۋ^mDmg3D:.b&>d3f#opgK)/s2UQYvnw]veYϏȲ,nRBgc~Iט +"Z,k%iӋ{<}'ָ^ڳ%?iذF1WdyrLr$6ۘԯorqa3FbL^iFk[آoze¼!+t=×(O;! z&{,o4~ײq#&u}tc{=ÞsΎ;-vq`nE)%N5 * Az1N  NlfO=:Ň,)A%[9nFF.G^A+2r|Hcͫ%PKm˾vҊ5ɹ+,n>Yﴟڷ>{ߵ[077Lyh3Y<+(zΪnoNJ`Y'e.ܐ)Oe/ɚ[ K緟vtq>7WQJ)kƺ>J_6O!` I01FoM~^^TUez,{"}p==Xfr.ҧ?`-;9~TmegI1s(2VG5OLϘ37GfoHeqiҬfi|`d 0~iCYOmݻnkhku,8m۳ϭ!VG-UX2 KDPaO% 3?Zb \88jv1(p H*Qq//ɊZl-Za4iҤҎ SSS]6*-.Wj76nh>s˰i4l6 nWRDV*gEE':UMޤ?ҊOC$8[y1JJTzG11UUTEU=Χ_6MГQ*hIݨ&{ҭ1_C+L||t iyЙ AjCTtnzRz|hN6mV{u=7u8nĐkhA'ېw4;stII%o\>_>RO*.e7_w VJJJp|ZXZZz0-ZR\\u'TTZM7<-S0'$H HT(mF@J@FxR~ b )Q$ -1RaԺ"A!4ER7sa$AQ!yO!XR"ʏ )EA ƨB ^A!"h(5( KiAB刚X6IZqV8!xiȬ[Q\Q$NmT^+r\a ֫ GBPBq Hq!SgD%%0mx e i=@ЊA b"bjRwXJ)^ ?rq4:!(*.jævB\aJZTUe-UQQ QO z9 ` o% 7xR~4$s[A&5$ N-*78L^ gf5z 5h 8EFjɆRJ!2{ t8$ILUXVTU$f~tFD$01ʹ4_C13TbOb6Ү9)SdpbKT@D6xk#H:o}FM^_{o'}p ϟ~;u鿞_7Smծs /QH>cvk3>mڤzѴ& ~baJ˓ݙm -u^+|?{ɷYX)ReJ2z?\(6ISzJj4_K(/-AϊjQ,*׉KAG?^b|bФp8L 薵aA!$]!B(Wy x B/熡Ӛ߀C'UL/0D̰BOg;up]8rTϽ^=r{G>q#?W~ug|8{6qWfpU#UNc}1p?iӃ+KR"t=Ƭ͸|d0{ҜM}/=CMt(0?C=2)*[+fMp&]AQ\QvDRE$1C3RP kx UgŔ$𪠅RHA$nZ6I,Uʖ wv|~z9> NVΝw>Wk&o{ _{.;'=y5& ނo_yσ{Lo?uF?5oZMavG`Oh06iP!dk,pι0)$cI d!  7Bz {BX9^5{>e뢿_r!:s oc& ,^:t?v{M* ].wP  }5-V֯uݽn ]nKi˗_7[ ӹo2.ꗖME]|dRc!jy\*ԟP-!hTz׮( DUe38L#z<z?7 腇 r|ux)=DMͮ)ood߃OOm9zQyqG9|aF<7nZZ@9~Ã#3?yϋAÈk?/v?>-N>|㜧o`#_h#qghk Au& &Pj5RWͅRBa-s. 2EQDa?%kBLzJr!81%BQpeE]q SP $P;'# Bv{ΞѲ?\]q{&,^?-K^/IjT@z> # ]1pFnuԂ;W/12X[fu:ׯhb֗r^Tu3*Pgkr9vX48cI'f>$>|DGS+AJ-jt:orKϬHiY9se޳Wo]wE3EEO>xYYCӧ/~;n|>}JKK)!\-~Σt:y D_ЫAj1DZ'-[ 7B'1xUW<@l ;C=o۝StU{y:*@c y7]Ktay 3A|Aߢ +>a@pτ]UȍAX9&ɦnXikmDeLQTU4- ]}{S 1R@n ~j.SQgzQ|izlڌG,^6?vB]IL?v׷uK[》`ӹ0ҧ8e0 a Ej #"&ƐRIGDzYoZ6BѿAXU`^`ݡb _Z7|7š EvI夓s͖ڵks> MPM!YRA]鷢\&ɬ dZϑ;k}ހn .~5Փ_@z۷ ⧻_uCw].|?+ݰEAkŁE>Ȭ5,h$,H7k: z:ӗ(H)Jj* Q*)J sSBhL.Bj2*(iJ繃(^>|k#/r}=>?ȍܛs_jƹw?D}3E zã<M0fLPUD:ٯ>7PxV_7t]\qgv?Fηe(mg=uzF+eNqʠEkԤ鰪p)"Bi kZUQ)D)hABT !X͛7r3N_۷o߶mOx<(gta~֐hgRvDf;AiüͻEwo&j[bc\n @qyz[5?&,С׈']=Tßx"'=/-*}'\^"rEEֈ2zkҪ @%D1R5I)?.8f5*HЮ7tN2B, wGCq]iPe+,8%g>um[[}zᦵ;65<ǵPs̴O\E:^t^׮5ȼs5-K޷P̵,畋\ܚG_mP/Zuq[ ;_!kS:IkL\U殠0f葒+碩zD}h֋ H9eTqzhp8N:餰|u3xfeڱ};/lo|@'j3q*Uo)%Hk0AZf[+#*.$S6G$8:}w[U;?]n(:\x.;}^ /(V>1ywl|gy::uw/ 9^O{]jz@7 Ѽ|f]-uZj !\[DM0Bkc߰t*.wm);~͵]/U{_7 #?;+ew9 IDATy޶qe>5?vZZ<*),qwNWuoC}Xiqst[2bNP{_3󿊺|3Xs_5gmҝ]{w*޳Dշ>5sִGF%Ẍ́>TE;R&VFƤlXcEQPFOɩ"9ro۶-|9SP.t.~mїօo6 pُ>cD7eRBE^I,Ġ^A:ȋZƫ.eTvֶ(;pݟ_L|~zqo=<%ޢo]߆fwsoOXAo\=7qO=N|5 QsOK4/ۋ!0(T`26rʖTz) fL3`pxBpOG  B LпS}yI2ƺto0='=.宝?=w ]x?߾i܊^ys$䮙橙W;_/Z?[Hѻw4*ֱ?Q]/ݴŹ16ܻvSI5q,,}d,MUemN( 1=\h*kz)bFJ!)% JD&c`يPJG-/#Vطo2?Yz#FҴCv{=ϑ#GoU}{__G.+6ޚ۶m_Y/}WB onq]wM.Ց EJ$Hݜ q%14JF* "/|8>x`h͒Ov;SUC3?[g~ɑ6w{?a s F  RJ)3yrHBpD {M7  "Okyyz7۔ly;߈m W)r]_yϸiU7\B Q9lM̵a7OoƩQ'>}yԭ5Ŗ>2)QKCJzV*9)ӥ^|%ѴΝ;_uUS\]]}ŕ=\Я_/6 ㄢB٥7Yw}>,"Sϝ9){ x2D;yy?oUU\/===ŽR|ۆ5+^pK}O;MH׫W:XHKٸodv'˶^/V[{332황xZՈUêaհ^G {+Ԣ\N zjUShֆyLIhAHyTWWI!QZ+P-DJ)Y3| 5`nU^K ?ubPEk"غe—p M6?& ßr.ƒիpsAmҰ^ ##)WHMVwzZ=M-?ӫ*7~֍CޓĎaQwUoB&YYs1FժF}t-9:e>ƕpqTQm9RZZ#l%9"JUUUG JK"V|ɥ֜wܹҚe+lQoߞ/XlڵlAnKq 'X7/iii>߁63ܾn4V,:r[tZڷoQēV(.) nUTVZpHQiM%vcȭRtܙ1|۽^&K DXH5gƍ2 "{57DeR DU\Er"ҤPJG-/#߿We1r+FD9W(KVZ6EaΫ\ &=QFeҲ B);f l6V)Zlx\){nn[ǎX-Ӝɑ#G&M`~쳡cF4?4]BQ2ӓ7(7BAZ@/v&DX'<5'fAC&˜ A,clĉ<z|cS(9W%Y]\DF !TFM7B0 E$ cQ+mڨ^K~F"tFfDZhœyAc1$wIj=DPK@_ShpzḦ́1F[ŦK?&RJR ) !e >tgF,\~}a48D4SU"'4mѰKI(D1E~wVzm+AÎR/r,o JDҖ|Ai@e7>It|$t_t?-(=嵛STx޻鱯t4U)6}U, *.CaFeH!JYJBp97 !qBx@Q ƒի* 6Cs* !M@^Aƌzqif`L$TH~EHhd`zz) Ze/dbMހg!qjemf9+8. AQ2ʘ0EaBB C) LH#9i/ɛ}˳[N93;k?d>5n.|=3'1-WW>3[t@ѷ{-Λ,uͺkSWfiZΫ&Wz v3LBvҌ3{}:@X !ϠtV7 <;ouŏ3If} ]=ͻ3WM͡.7{ӻ1 &1WUk YSecuP^DQ3(z !MӲueRk+u THb{!CfAZb3CRM~g2aNg@5e u-B_DQj QS \-E8kaBH"d!"GY6hڔiЕXR>cf SzG*x<׺YS,uի/Aؿۦ\Yyt K󛣾{fA݆>?6dE됻yuk.Syz߳7ڤ eja}x)Nx5zmB\xߜE[[:)So> ߼Ԭyσ5ԬGOxiݷ~WXn0sрZ+ZHɕ5(Cf"`z̀]% _Rl yɀIo<֋|8kZ36>p >9 |_u5nʕ .ew ώ[t |ߞU /:zyW=Q'UwX|wqnhY~}L@+͋ggo.<]֙_ޘqWb+ ,0B R/H/.a,L9S )e 0 }z(@ASEQ8o&M CWj@2DȬzAZX/Fw'-Te!{$.&6k?d>gʰ]w[/i^؞wv޿ ۥEg~kWAfV>GMY[ ٣__0jڢ]S>.~vߨ1}y9-Vps?5|Ş' !άV0 0LWJB(eLQJ+?2ǜaBJ)xbpe-q.t糙l=Wei{.ke JEn7sޔ^3co=Yy_VR胆o nM6Wh//[y^Wu|_ROQE%C\QXRrʻY5W0DyiV{E!$  e@Mچbw,$H?םv=yJF~I oKuHIs kYݒDrA%;^X$v*氪Iߵ|~ |m]zkWѠtP\zwʹy:*@z3/=ݻfؿ|O7zi>~kj~m1mhA dÓaۂaV pйLFaZ/B)jj(Jm7$rQR8B.nd&9du?<\F)_3y쒴=5qh kky:jP bi}Ƽ]=Pi|]NWQʑ"Q;Z+2PkNܚoLJs><=o-u\N]#_Ȏh|gؕZ^K`ݬpW*bOEG$b)\:& v0s:LAĕ5#hzhüz%rRk+`3B9]v@ y8`Z6AJ>2~M"âzFrF->~{ͬJzQv2a{kZz:twz  ~GӻRs渨(5ﮢ¢/52QouۀTU!`PJf @J*R2J%J $PJ%PB; 'p)n)7u_=*s}PnU+{V{3J6.}2`Oؒ/#OMvĥu\NP3176X5mg1)QQ}v,G!Jg/qBP3uKߝ|㻠z.3fX@u߁o~}:Avd}Wg}%;.;)1C]Jb]E"Z ž7  NYByãpCQ5 27k;fiKH"Bξ S7klq~q.+xi*З7WOUwplө9亳򖭊n%tݺw>\y%cbf,Sna5ы,++>dڑqe]yoݺfSlyEBQLqv,ynBF B4p@$Za^ %4]nGƘ*UZY7~CorqE7i!Io%k5Lˆ B؝*ӧc>;Y#U5A߯n(:\x.tN{}mK^L[TEEu 5*sXkמitj dXJ)0 ]~_u]׍u]͍ yCJ/7o:oطF=fYB)o=] P;[9c̫~V]|Yޝ;˞yòbq5}\ ӎV]tm v|6mR\{ߘ2Һ1tunySVVYW8P } N߼P4-G_z]qe)>ho~`HJT/lyٷrc}p3 {f, [5q@qg.n}ҵq-_2/;3N.7Yov%Cե_ެWwQ3uR~__*%P2ap*JR6E)6U2L$MEH W"up dF,J]EHH)uaw8Rԛ4KnI-X!GA1;6sMW㏽-JJr //rs͒/:tIVynTbK־f ᯞճu TUUE)PtBpnp#_LV+v)( B4*.CM2H_7^΃"-QۖƷ-\͞;-[B(Yǎ3׮Le~7Ԝ^-`{͍ܾ %٘.ct~×Gʨ"Dl[EUE4]2Y?N[!eR{;'JzA6aButcT/T9e${'3U^! Ӳ!g]{by$(AW`,. 8T]le ; 7/Whmk5Y06\#gʭ@V΅IW"凔\(%p%*Jyg'{qI{Wݗq>!N[obO)%&{Ϗb4]7"~ Þ^[ɼ>d= ^%"ihglMS -5 GA(1^BhrjbPc@ 2c4$2dȮE[[ } ianp%ԋ]0 t *cor̴lNB4BRڠJ=tgrlٻ)+/ǫAZ 2wd 6#^Č>9LWoB) Hxz1Abt%Hb,29 AC?- (bb/%PN9QJ!$x b{P#t#‹ H#ܚ"ùHWMRD Vd~]3@(6$P)#K_~pmMQ^BbPEѐfwBl6[dZ6)uLˆm Mh8Fi}hQzcg^Rx0B5q2LSn,ePBITi /[i ;qPp/$ABU$h Γ͓",mL ]QP@ 0kU̶6 D5U8s) {ҊKJRb#+eHD"J$! ! -%$E$6*cLBG "|Ɣ`!H3$DQ ux AGe ^ ѹPY (m˸%GMvmK!@iSV5*ӉR/aװHRBSzl6wvrͤ_!;b}et"\%@ I8N,tMˆj/ H $v ub)RJQ^)jR&"c߁)DR EQ1UBԝ)q+,9QvB$FHnzGӴ֭0NR/`0 y$6Y"!ntM~-<Le}DJ.UХйo3Ui^ AZ~jKg):z\X E"eX ˉ3)V.Ҧ\p)X^ݦI ڝWnN+Nze\zwBJքҡi~C~p`f6z>m(UHO*12rD XU"UTTSE$ .d ιXDѮEgNv9pP}}䷢6ƺv!n)I\n  NZV~ЍS]oʥ(Y HEz mB^MQz~aǨ}Jb8%jK ɯaG2 By)*=1ˉ!ASnMUQ"f}QV>'zWKYN-ٻ+4\a4)sCļzcgT:M Ԗ۷S/!isڀ^` =? +'J@ٵKIi97.(cI..Dbi$# m۴ue ! îin "i-$e oth2 vG3pu# PM*D?& $^0 b3$QH"13 XT'Ja۩Cfqi9m믪HϮ]ڴS{()kQ/p)U6n\$49H}vݓa*vUUaW1AZ*K᭨xbfvMx髯ZxmpÍ#~hůcǍӧOii)% ڢEi%J(I- 1AxCʘu  HT4UBȺ^B(ʪ& ~[烇~伳>YaF MWݡ .NJDf;暑حsrC 31|jî*^ERQRr_I'OV1l7"z9dQM^t_rIvluuWC~^_0 `-//7?/yk9;|Ə$QeZ;21Y MG'`T2 HKB eBA$tӅ].W;ݻt.+:2}]}tp7|_ECz9cJzr_L, OVVro’Ҳ2o"UVU9v3!HKĦiO\HSz&iOva5p!?(8RZ69~3OxQa;v sy۷m uS{݌ka%@&eCiĖQ Hq:dZ/ UU8BشZ:ۗf(|9>]7[wnٙ7wcN\$$AUZ[==.&;g7l޾sϾ%)r: BerH"UVv= 9Mu4^7px1x͛l޳g6 -_C}\1 _{uƛ.0I茺+C ߘiBie#@I)Ix,MJǙHt;[4^M3[OZ甶vmNYjUêaհj-^LJk(B?VUs*Ox'ʟwADSUs~' H.n'm~H^cJRފt9:"!!%]7MUh`!N`T/@(1΍D7^h6$/&M|3h7߈͞VV'v Cմ;y4pg?ƎpoUwۣWתj^Irr~hOܥ34i/nމMQ\hYv0HNYʁUêaհj-^Y}ʫxUj9y\5z^̞M;?ZVXvA$r͘QBi=/uCFےr'-L!XR^ߖn}_UU"mZG{/p)(ad4VZz7n|'B ~z]y/TWW/YV;ʒR[pU%i*3QI= hՋ IƝ $HqIdo/7ш >_E݅~_)(ċAZ0Dm|>KJ1-I煦z1[7n𓔽cs|D)\4B<&Ջ raxk C'AAA,C\N:4}a%X )p2  @1-a܇5AAAޤN$IhH+4 Ne'qR ev SRzAA(&i$iߡLnTUDː^ Hn!]c֋   @7@3甍?DIDTM4g -q8c 2a   Hsiْ:$ S_J$IJkxJe#pV ~!Ύ$;wi+N % -y[zf$@JJ̙-+o;y?_UU#FrI6}v-!?K.17X߷"e rn=g>Zl/+={))~aa8.R6̼o=9_Z\Ү]1r_?pEf{!qȽlV"igquky6Ž*֭[GNR !nsÈAI۶m9O8%M/3$2tf؋wѨ_8#IeN ,+oTm~ߺ_lTŠd|5bհjX5Z իmti4^*~*:U4)~s<ʪj@Aq87W c_{+Wv83N?c-R OVX~:pꦛBf=>I6lLK+W_FbrҜOoJ~OeewN.䏗|}鶭[sN*+>潿_ȣ~' N)[lVUui?;~˗},-j,r/D-EeȽlڶmO? _}CVo{!UQ4pH*Ċ둉k2^:Q2/a H#k1qvL8x: !06ÿnݺ@֭;t萟C2z8r%TTTlڴodNS6wf8xՎ5\҂^wMTϽM$hVe|RTpcQE7ʾ( (7= *dڲh mIldHf͛Nr(df&ιӲ2sFT:9ܜ^}%77r'CXBb] ;;+!rn^{n!^{n!^{n!^8rokYY B}T)_mƈdoӛ̝WJ0 #eYD~@xBA 4\-py*!pG}W_;~x`|BªU9rl߾MqLZ{ZŢFWO~lR֥K[}gΠACqЦMGaݏ;v轅>EEE1sf]]7IG?@bbbl6[ʢ5j :":-D :w\l'{!^u$1_IA2mι\ܮb]T*r<7Tb`Cs BA0; 4r1B50z#G{_}q#npcYY z?o^|ܸλ%'9_nz`03L&MBO{H=v{V$FEXD\!ܐBcX!^Lq]N}v&ӹeS:V}ŘFcb,EEu{zsn=byg?4>697YRR[ȹEFFsڵs̙IImɹUg-*o(&Ҕ:?y/T:BP]HZ'%M~9.,(BpVQR@1 L4,K@#Ba"{Cey)BH%MyłU`||o衔8v Zlٶ];owv_vx[o1ܾGM?nq}w|lǡswǝwΜ9"<3|t:ܪzݺuVZΪQyVs Bu^+D Յ{}cǎ{{Z*ǩ,W1ռ%1Ba'jxыB }Gj6mn#Ǝy=zp\= zH<~q/|~/^LИ3x IDATHL|as-ZطE2Y >ƌۧo_AWz!rnMrw`Ϟ=['w?˖-8yʣ =y̩>y/g{NnW^y57f=~MmM`__ї)gBʫ}BLM$''gff^oSv!~fyfyg5DHpkEʥ_ը]3Fo;ZZ65u,To#6 Mæգv%?~!yjh)`=TVtʪA\-/cf!QXxj r:Z!B>^@eMVJ H20:$ 3xGDV}Bc:- r"sB3OwM"8c8!B!T0իjЂѭGMr/8 QF7ca蝒Q72( fWBa *aJS pPB!PTV SN+sqGUt %H}!Tm!jh'~HB!s/0X˅&x:G$>JN X4;uB5PAp.- O<L|9uv޽_fw۽إY+ܗ֭{Zڨɓ&dp#DF59.G3 2LjLLxBVU/L/BKhPUF5B!jHg΅>v]cxzED>5GI.͖|8uaoѢEְ^w߽nݏU_ҡC{{ҵG3}/etp3 +/:c6G\Yo̬d/PӦMɔQ~WD#4Mo/P f1"ٙdSl)kԮv2\ynd  9,2٬V/4l6 PEu,*: jX͈,Q#Kr# F@uȥFF\'8,ls̅6iqYh&%߲=DZO:)na'>ru9 GwCO ͏~wx3 c+z9^lYI-+bXˇHT$IsMcԩyv{g^߯oL6m' mwߎzΪ͝_ 8ro͉IT Y]n;to[R\d?FsJ JojղT.5+AKD$&A;yV@exprG baӰiشٮP\\Ƥ5. 2/jдF 7OaaeaB!?r;<|KQjͩ\c)Jbަex|ÀkN]6hl)!VA*{8ƼZroA"c; 3Afvp5lX}sKi7\Qx NsoOiS_'J$o; =L) n-Y[fB! }INMT2t@96d蜋=ƖlNjZ?d-哛۔ y&WW5`tvw\f.o2= (>ݮst>Wte햺*˹} V>1eŮ]x"I[67w^*uCU_q\Yw UJ+k{=dK3!BHc@!BHM+N[61^o֖QgDmCBY "O{N}J;³߾4x>$W =mhk.tO֭;M.ge͇ne]H:'4|})K)|VTa=nyZRKBrUf__їcBna뒓}Q#xETj JPU UQ^!NL/0BS\BJÙHLG@!N K !n[E{.kV+Yq[Ӟz~{>4nTϯ<]񶩳'?9~EvY/ b~?3GSכM󟟑;Ο2g>˦*̡͛? `5e<$aLiE1F#%@jVWT/Q#e@e !PX6ƚ<nsY""Y!Ԑ~cE/LW.ۙHdYc&Yt+揺 `I}n܃x ƊWLW';<}+"x#t5|;OOqMgiz[¡'Xec>GΦSo߲-0x߾9XGS`6FL\5R):WށT1)ɄLZG"PpAKK=+~@[[h P!P:C< mǎ{0|"u|qZ/bҭœG6lQGh>x>ܴc 6fC/՘텹5l|\926\x*bf@)[lB[w<){υ_pd̀?~=XeoNyv9-v`BXD@,2ldetsTQ @ U+\ !Pm 0DYq5TB_ K.ӷ>ځ_[`۲K,fTsDpX>+;ʞk=Pg~j5s fZstHo3hD{ xG|蝥`< ײ5,݁ Hk_,&uYݎiMg۞s~ yԣos Tyd՗ }Yo/Ri;cyHP~:7)U B6h8)-*1SFӽ!kz\ܿyϨ^<11)WΞ5g!I 5z Ko;mnROЧvBW`bGZƎ;%{Norǯ]GLը o?n*Cdn1b5cǾw[5llկo윐hU3 0(.HDd/'U-9FgD&tZJ\ !lB^8J^28 q+B(4pGQ;Cpi%o>?Lo'cUvWvHeN4[rrrff<mJߤ8Vc3-^tOPU$?A3 g"1 7OK^ze:?ko#]y.oo7tYmĦaӰiشծik=XRW=bގ4-:>j oڊD&T& 8&pӣLH4/ ,,<X,Yo?{u-m{B0z02`Da>0OAaGi0e263K8Wc8!oLtY6B(x\ǪM°B!BaW0ݧBQJ­IWL$+PFŜZIک^"PhDhQux G8uxR]+h,c(u2 IDATՋB!sU/ XQL@iR/$\J^`2!2{.F2!@L)Q 31Fä ~]}Ѱ;!@e}d$ xBʱBz&nx xB-LJS\FGz:9ƔfJ2F{&zR.ˆB!P(GxIQaB!PTz/*U·(+3#DfI*+#8͠m^b!@IjFfB0J2 zB!BuLT)2r~atF=:, \.<~$A }{?쳪/?qlwyg}ߘ1_Nu?8cǎ%%%IV,_~л,e# 5muQ"2UZiȩ2QKYZ*Yy!t_J^_+p˭7''IR'dff5F6hvclwVr0 FCRV[Wq)!x@5R9D?e +wv>p<3.WUoLTe s3ϩe6 Mæv%4n{9ͣDʥs4-y<%H\mW ehB!BPaejϞew{рCϦ4xM?qw~.{f0o㏳23Ů6>xġÆ8ݻflOW/@ p7+WDRx/p[Bjau P=V! zH`i ,!BHg?\6!3*o[ϾW?pKLhrsy>U}o}w=bvc6-%+3%N޻+̀1|?(e?RXw3P @VeZ_!zGd^S!`%ϩ0ُ˫a{<x NR C3Ӵy{* 9& T{?RZVFOqCSLn|;G?@Jb?ܜ'436z<Fz`||{A,>w?=.҆II0ǑkgaɟU}O5hW>>u̸ {cnN}gy/6x#Ň_{j6?[ۦfKO!kE+뾧tU;n[g2K,%=;9`֯Z9/U}|OpD> dL;؞㦃9nQo-^93+ ,H8Up#@(ZlS{NEzP0C4R_p0B]_2MqwN7a]{flk=Fi{v RFz)Ƨg[ |s}C1o7E(Y9坉Ox_{X O=읷K >SҞlU\=յ.?=ƞ#b}٣iMiϧdix}ìVcN]tbΘ{'}gز ,VO.B"#rwtNs;sz鯽E-̙i#/P aś t\VwE-sUcF3UGIh6㉃ 0( }N<%!^ [G!.T!cNQG$f2y x$8!GbSIfz ώ{x[Of'&ޟd2go1̷:&c}Ǽ _=rVӝ_y{֓{Hũ'ح8{PCǧ;cN8rK^)pdfwZ9geAwVr~^ᐽ밭WB,@q(V1]^z˖w87Ǽzfe['0s֓wlqw편3_H:0sLߟ82E-GNx ^}5=3'D; *(-Fk۷ ctVƼMy 3>Jx(\e+}ms,DWoLK'={U Zk)Ͽ:5[94\mėէZ=-SRbse+75:u@JeBW0ի^)7݅f@L938IJ[򃞲2cIe07x/a:aO;R.#!P(/4+@eHEr`Km4f%@v7B^F?A=5_RGO`ߛkٓu ēvx2#tx띝s~y=|}n)w{=3Wpi =ɤan ;Et&BZtj@WN_}mm̜mUg^Z6>|sWE3%kBH^~>%md~*Zv9TypbƵӟ~mưƴa--[PSjF6Jnyj9U Q 2PWtY)2K}/?AerDTV/B>N)O-q$(P]jv_z S!Zo $^>IXoy`--k}?x<詚^d4y֊'f&pٚ1?K/sWEhl4ɱ_Zn&y9\y_ԖÄgx@t>%~lӀ]U.7)C_2L>/  ~oB)#M2CjŗR1Ohyė_Oe]'N;[<=&6}{|A>i>no682Ŕ)~2[V`tee:{1o/7R,Ƹ0_$˜,VHsQo6!X`^i+%zBOSc\/9 LO&9 !PI,87*lui6bsJ`1 v&lr4ɷq=nOvv|}{#?6t`ڇE.T70ы KGBqnϬ oޚ]a.|3o[vmWyk6ŧC-ݓ W}U_-֪wxhZ]S^%Opްbtxac1o5)=:3*l55wcW5A/6WQT8IEQ88?_ 78JtNe6F]E:g,W,Ϧ5! #ig8%xV΋221߿I+Oy+u.Xlս2悼BߵTw[|* i=~ϓl߭?~K(S 6dYa*) ȗgyƄ0!>T9N众,ɌQ-SPX!8Dea dM'klwcD(` kr66见n{U*&}` w~@O3{yx uӷ%aC|/ۧ.5@?[wR$>ɾR! !QQQnwPr]Bx-99933~DѨx{1g o:xqMDΗ'Dn&FFh]hgQel#7uYmޮ? BajC)@\U6bӰi4lZ+Tx“r4hmn4X"[͋m0BíVkX,өNlIN!j0‧"t;I-M|U0  9.Z/5~ bI+h @(a(a@8&q;pBO`LRT,d RxBbMa!B!PTQ`0 SFu 1W d+p~\ !dTIWɪjvmT&X!8|cMp@&1d )AG d B!BaW6f ګn.B}3"_]C?3_V1Ʉ@NE!T9 =,4[MG0 JWǑpSpip@!BLqB qX:/$>pTVs#dZKdFQ1 FpBq0ʘ;yo/@u(?%7T(F!BLpCI"dJ<K2'tx/¬^*{#@$9Z3)dINȘ@-٧]UFBj *.K a dCr&] X!B!T0իn[yOrNf q%c:!{(?!" Js~0 @&zk,[%-O BehT5t.B(t9B!0իf p8̞bX1yF(Kfml;?_̀ʒ7vZ8#,BqRݏpLqLgc)9B! U;i*u:dhør}DƼ@xBy`r)圁VeJdF4Kaj/3!T_QNef^J)W| blA㈗ү8v7B!BH{UMpg D׆qp^ X\P8zdJdr@Z' BU;-K@.@yJy%0/HwY\@;!B!T0իnYc^ EJƀx$B8b^}N{m G&aLt]WR NEz:NTi1Xuejqhҟ~B!KU/P.Ou@e vq%GU p3b|] H5>]oo^.F N˄jzA)!ToGJL>ʌ,rb(47vQw!T?{uAӷ\"|7Vش|!tTz& rѩ0^t |j'wg^B#E0|M~7YXo,+7 EۅΛ^NnKtfqwk'Kn9[Dd 9L1\D_A'9Wfc 81egK2P '1`咎 |*$zBU#R`@g=KⰣB(4E19ܴ;w/_sVMnb*;bWߋj~d2AkNX;vݾiڴ Uxocjb!GdĖSh`,ccۅΛI.M <^GS]MMuMu=nliņ%LKh D$w'Ø(LLptt7tDŽ"#7/I-{wDIf$M LK)(RDPAh<*"(ղ*z . x?-n(h+K -hZMd&H[ M+~GwLy~Qpν~V ",f#oFQQ`s+_M^򅃭 Y_,d}s8˛, [cmɎ${z%b]tYtb/vUtqj"k'<5J|/)}o%":u,FM}?hNt{q0N{,>džߎmؾß{=pر}Dąx8{4ZZEGD$;"uDıSDt˒vrԜX\/2RȈNIt2KZ^5V)L~lcݥrreCrT9"hŶC"3 .Đzme猹lv2e]*9L&u 5~Nib+{ ҜZk+-N~1B.IrI Rl`x~+fvð?}h-}.N\%1úHIΥeEg2& +ؼoEi fQ$$:nf\*ܯ|h?4Z+K?A~"+rp8dNrːQ?,S%M/@U+~~ =ǽJR$8%\n%hR2qUUVb[\izou2IIW )VroQ(D[9g"FF +\$9$Qč,QCU28W~YPT6r zr `\Fb/I!c$iT_ZJ$r2 N1N'[$[CׯcYifUTZED8-T m%Ci߃ݶ$I"LRI)8۩^+'Sd12!)16+I3.gs45.@\'QrIe4jIrA%%Cˇ1 DK`hn=7R -R7L#Q)UBNWTnL$Uk+S: 5Gd)"cf%&'%F`O2iow!EQF0QWfDDPdYᢤsIH܅{"le *J\/J2!^hPKĆ._#8пy&ZYLM&ToϹL$ESNfޙq1CTUv}y@^qEZ5j-zzEeWpoܬ 7hhhhhݸ;fm\16F5'ap}H|*2W7DKiS \,sbo;yQoC8} 3& 剬9;/ߖkM" ;4{IRo'"A  .(H(6,,_qacE,/c9{ct )B̟H1/Ztmm:gów}P3h$oΙ_|r"w Ddܴ.O_xuHifN^4qs/s651/O0&$Ȝw7R?,zqaUsۉSe_l TEoUTyn9[kkQO'~:nje#~Ϝ>=&fq~*/}rfrs_P(&'-c#ڕx@es֭ɾ<#8D1'7Lh=z>idP*ےHoQhX_JΩ]~%$$d̙j?he^^3}]}HC@14CzOBgh݂ڹ$ty_nY͏ǫR~qguu}X-:'G7p5' " 󭼖]z򨉛6Ktvc׾5fJg/Os'DsQ&~N(ֳ?dDowta)g넦ԗXu@Dkv0#./eiu3rĉF씝GbQ1p-QQnj$`(gl/<{VKˉ(q!CJIȓOjޜDJ9b273/g͚}k bО>}V\VZddYT־8gm[322f'Ι c#h|o!C>!W^^ޮ]VߡC-GףpS-/#.[2n`ꂽ-9fޞ>TwF"G0gSbب%n٧Dm;&&|7w[qkH0Қ)sY9mD{*&R|k=z-."Ře?nq u0I Qgfl` #Ea;{ը^K9[|d0k,ui#Ăt ]۷2?m?4oM} *ڴ5Eu|2筅?mYA$"M\[ֱm/O_mΦtf.5wlʝZN(L[|[ՖNyz"3N\ߧ[g*oM|f$ml?gf8"xB@@;"2ƀ:OOxq "{JD? 0c#>=9vlΝ6jԨO֮m99ZEEV%"Zm(9VXX0?DňgF14C<}lUUUJe!p+k™{ H<x.)tazeϖ=Db^ꮂq1q9%LAǦ3gLWX\L=zG' Lq-awNܙ'gy_UV\Svh#twwZmTw导+ 38AG!"ϩ9嵸H?-[7gyizc_j>{֜%kNZ<2"y~QDt@:PQHPxٽ! 5y睑#h1d2>V._4oy$00ͅ [^s:V $IRM!=.C<}H||ջwod(.[rN5o!]T/5bxV"IW~qK qLR!L/!L{vZx^kT,(y<̤g135uFb OŒ0XVwZȟ= u:]L(6w= Y۷}{jV)x1Lb+,ɒdr:qwDֳ6S~ - ?ϬuzW  5__9KsA}׹~ќtS>9o% &uhM-NbI)$J_Zxg9nqԸH7&ѦgY]#e?|Xڜ޴pzxZ2z4((&|FZuht_bGF=>?Fheeei17B 1rE233Z0:KLLZ}˗5LMv&8(r͈V!LR!.}9{P\ܒ&:R?6aHִk}D=:rDEMDDꈘh5'O=&sD\D£uZ[.Uݬ6<{;sem+QtibqIӽg{[aAMvj޶Wf0Q8ݴE3fQh;ܵAF>ֳpy'Woc&OZQ'%sNw7hFīb5^+ww?h}*~cT_X 6&#:OI ֭Ŏ;=.AhBņlNod_uaYkIyh>zG;|sa>…"IXwӹDԩS'^9 >YRw'yl7B+--ݾm[&^Y7̘܇yH4d^f%NۧΥq;#MW.Iw&I'MNqDDd-Xlgw?gKso 朝K]<+qٗs!kE;qi4{8[?B/|n U!-v̌$-' `IYbeSxwS3Oz{J{$I mk?0ǙV82<"b/\ '\WqqqUUU2Vvĉx W3^zSTg7wZ[NF /jZw~MZZτ60.Qmv??{aÆukOCBBfT*EAx|g7F14C> IrUUVBKIIپm[KC*Fw*H0_,*U+Uf=t]]jذ{;ko`tߩs4`mR6yl/Kqsw:_ PMqyOm1 %GBC{TQquW1}{~8jtuv٩Ke םٝyQ$"Rxك8jTozV)BLpW!bp=&d,;wƦ :t@?[a֏NJhK^䘫Nxus9_h*V R:KLab-XzQG=)b3\2Rr\vF`@%q<SU 0Mͪ %Ses .'s{GYUn29]rW$e~[S'Tp8H@8Q^j(w N.r k* |7^19֯ PC TɈ ֮W$ "eZסɓcQuH@sUB.j]D$'@c8u$]EAp:(7΢r`zם fB~y:mrI]d!:%Rb 4c*.[{g궕JjD/ N9_}U_)s UV\RHU uOi\*5^+fٽ@[Cj9 u?VQT=\ SIDATf5cr=b -d4zes?p6Vf/:lݢ uG6h_C Oy eI>/ab*IENDB`prometheus_varnish_exporter-1.5.2/go.mod000066400000000000000000000001661355530155200205110ustar00rootroot00000000000000module github.com/jonnenauha/prometheus_varnish_exporter go 1.12 require github.com/prometheus/client_golang v1.0.0 prometheus_varnish_exporter-1.5.2/go.sum000066400000000000000000000116561355530155200205440ustar00rootroot00000000000000github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5 h1:mzjBh+S5frKOsOBobWIMAbXavqjmgO17k/2puhcFR94= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= prometheus_varnish_exporter-1.5.2/main.go000066400000000000000000000167601355530155200206650ustar00rootroot00000000000000package main import ( "encoding/json" "flag" "fmt" "log" "net/http" "os" "sync" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) var ( ApplicationName = "prometheus_varnish_exporter" Version string VersionHash string VersionDate string PrometheusExporter = NewPrometheusExporter() VarnishVersion = NewVarnishVersion() ExitHandler = &exitHandler{} StartParams = &startParams{ ListenAddress: ":9131", // Reserved and publicly announced at https://github.com/prometheus/prometheus/wiki/Default-port-allocations Path: "/metrics", VarnishstatExe: "varnishstat", Params: &varnishstatParams{}, } logger *log.Logger ) type startParams struct { ListenAddress string Path string HealthPath string VarnishstatExe string VarnishDockerContainer string Params *varnishstatParams Verbose bool ExitOnErrors bool Test bool Raw bool WithGoMetrics bool noExit bool // deprecated } type varnishstatParams struct { Instance string VSM string } func (p *varnishstatParams) isEmpty() bool { return p.Instance == "" && p.VSM == "" } func (p *varnishstatParams) make() (params []string) { // -n if p.Instance != "" { params = append(params, "-n", p.Instance) } // -N is not supported by 3.x if p.VSM != "" && VarnishVersion.EqualsOrGreater(4, 0) { params = append(params, "-N", p.VSM) } return params } func init() { // prometheus conventions flag.StringVar(&StartParams.ListenAddress, "web.listen-address", StartParams.ListenAddress, "Address on which to expose metrics and web interface.") flag.StringVar(&StartParams.Path, "web.telemetry-path", StartParams.Path, "Path under which to expose metrics.") flag.StringVar(&StartParams.HealthPath, "web.health-path", StartParams.HealthPath, "Path under which to expose healthcheck. Disabled unless configured.") // varnish flag.StringVar(&StartParams.VarnishstatExe, "varnishstat-path", StartParams.VarnishstatExe, "Path to varnishstat.") flag.StringVar(&StartParams.Params.Instance, "n", StartParams.Params.Instance, "varnishstat -n value.") flag.StringVar(&StartParams.Params.VSM, "N", StartParams.Params.VSM, "varnishstat -N value.") // docker flag.StringVar(&StartParams.VarnishDockerContainer, "docker-container-name", StartParams.VarnishDockerContainer, "Docker container name to exec varnishstat in.") // modes version := false flag.BoolVar(&version, "version", version, "Print version and exit") flag.BoolVar(&StartParams.ExitOnErrors, "exit-on-errors", StartParams.ExitOnErrors, "Exit process on scrape errors.") flag.BoolVar(&StartParams.Verbose, "verbose", StartParams.Verbose, "Verbose logging.") flag.BoolVar(&StartParams.Test, "test", StartParams.Test, "Test varnishstat availability, prints available metrics and exits.") flag.BoolVar(&StartParams.Raw, "raw", StartParams.Test, "Raw stdout logging without timestamps.") flag.BoolVar(&StartParams.WithGoMetrics, "with-go-metrics", StartParams.WithGoMetrics, "Export go runtime and http handler metrics") // deprecated flag.BoolVar(&StartParams.noExit, "no-exit", StartParams.noExit, "Deprecated: see -exit-on-errors") flag.Parse() if version { fmt.Printf("%s %s\n", ApplicationName, getVersion(true)) os.Exit(0) } logger = log.New(os.Stdout, "", log.Ldate|log.Ltime) if len(StartParams.Path) == 0 || StartParams.Path[0] != '/' { logFatal("-web.telemetry-path cannot be empty and must start with a slash '/', given %q", StartParams.Path) } if len(StartParams.HealthPath) != 0 && StartParams.HealthPath[0] != '/' { logFatal("-web.health-path must start with a slash '/' if configured, given %q", StartParams.HealthPath) } if StartParams.Path == StartParams.HealthPath { logFatal("-web.telemetry-path and -web.health-path cannot have same value") } // Don't log warning on !noExit as that would spam for the formed default value. if StartParams.noExit { logWarn("-no-exit is deprecated. As of v1.5 it is the default behavior not to exit process on scrape errors. You can remove this parameter.") } // Test run or user explicitly wants to exit on any scrape errors during runtime. ExitHandler.exitOnError = StartParams.Test == true || StartParams.ExitOnErrors == true } func main() { if b, err := json.MarshalIndent(StartParams, "", " "); err == nil { logInfo("%s %s %s", ApplicationName, getVersion(false), b) } else { logFatal(err.Error()) } // Initialize if err := VarnishVersion.Initialize(); err != nil { ExitHandler.Errorf("Varnish version initialize failed: %s", err.Error()) } if VarnishVersion.Valid() { logInfo("Found varnishstat %s", VarnishVersion) if err := PrometheusExporter.Initialize(); err != nil { logFatal("Prometheus exporter initialize failed: %s", err.Error()) } } // Test to verify everything is ok before starting the server { done := make(chan bool) metrics := make(chan prometheus.Metric) go func() { for m := range metrics { if StartParams.Test { logInfo("%s", m.Desc()) } } done <- true }() tStart := time.Now() buf, err := ScrapeVarnish(metrics) close(metrics) <-done if err == nil { logInfo("Test scrape done in %s", time.Now().Sub(tStart)) logRaw("") } else { if len(buf) > 0 { logRaw("\n%s", buf) } ExitHandler.Errorf("Startup test: %s", err.Error()) } } if StartParams.Test { return } // Start serving logInfo("Server starting on %s with metrics path %s", StartParams.ListenAddress, StartParams.Path) if !StartParams.WithGoMetrics { registry := prometheus.NewRegistry() if err := registry.Register(PrometheusExporter); err != nil { logFatal("registry.Register failed: %s", err.Error()) } handler := promhttp.HandlerFor(registry, promhttp.HandlerOpts{ ErrorLog: logger, }) http.Handle(StartParams.Path, handler) } else { prometheus.MustRegister(PrometheusExporter) http.Handle(StartParams.Path, promhttp.Handler()) } if StartParams.Path != "/" { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(` Varnish Exporter

Varnish Exporter

Metrics

`)) }) } if StartParams.HealthPath != "" { http.HandleFunc(StartParams.HealthPath, func(w http.ResponseWriter, r *http.Request) { // As noted in the "up" metric, needs some way to determine if everything is actually Ok. // For now, this just lets us check that we're accepting connections w.WriteHeader(http.StatusOK) fmt.Fprintln(w, "Ok") }) } logFatalError(http.ListenAndServe(StartParams.ListenAddress, nil)) } type exitHandler struct { sync.RWMutex exitOnError bool err error } func (ex *exitHandler) Errorf(format string, a ...interface{}) error { return ex.Set(fmt.Errorf(format, a...)) } func (ex *exitHandler) HasError() bool { ex.RLock() hasError := ex.err != nil ex.RUnlock() return hasError } func (ex *exitHandler) Set(err error) error { ex.Lock() defer ex.Unlock() if err == nil { ex.err = nil return nil } errDiffers := ex.err == nil || ex.err.Error() != err.Error() ex.err = err if ex.exitOnError { logFatal("%s", err.Error()) } else if errDiffers { logError("%s", err.Error()) } return err } func getVersion(date bool) (version string) { if Version == "" { return "dev" } version = fmt.Sprintf("v%s (%s)", Version, VersionHash) if date { version += " " + VersionDate } return version } prometheus_varnish_exporter-1.5.2/prometheus.go000066400000000000000000000220611355530155200221230ustar00rootroot00000000000000package main import ( "regexp" "strings" "sync" "time" "github.com/prometheus/client_golang/prometheus" ) const ( exporterNamespace = "varnish" ) // prometheusExporter type prometheusExporter struct { sync.RWMutex up prometheus.Gauge version prometheus.Gauge } func NewPrometheusExporter() *prometheusExporter { return &prometheusExporter{ up: prometheus.NewGauge(prometheus.GaugeOpts{ Namespace: exporterNamespace, Name: "up", Help: "Was the last scrape of varnish successful.", }), } } func (pe *prometheusExporter) Initialize() error { pe.version = prometheus.NewGauge(prometheus.GaugeOpts{ Namespace: exporterNamespace, Name: "version", Help: "Varnish version information", ConstLabels: VarnishVersion.Labels(), }) pe.version.Set(1) return nil } // Implements prometheus.Collector func (pe *prometheusExporter) Describe(ch chan<- *prometheus.Desc) { start := time.Now() ch <- pe.up.Desc() if pe.version != nil { ch <- pe.version.Desc() } if StartParams.Verbose { logInfo("prometheus.Collector.Describe %s", time.Now().Sub(start)) } } // Implements prometheus.Collector func (pe *prometheusExporter) Collect(ch chan<- prometheus.Metric) { start := time.Now() pe.Lock() defer pe.Unlock() // Rare case of varnish not being installed in the system // when we started, but installed while we are running. if !VarnishVersion.Valid() { if VarnishVersion.Initialize() == nil { pe.version = prometheus.NewGauge(prometheus.GaugeOpts{ Namespace: exporterNamespace, Name: "version", Help: "Varnish version information", ConstLabels: VarnishVersion.Labels(), }) } } hadError := ExitHandler.HasError() _, err := ScrapeVarnish(ch) ExitHandler.Set(err) if err == nil { if hadError { logInfo("Successful scrape") } pe.up.Set(1) } else { pe.up.Set(0) } ch <- pe.up if pe.version != nil { ch <- pe.version } if StartParams.Verbose { postfix := "" if err != nil { postfix = " (scrape failed)" } logInfo("prometheus.Collector.Collect %s%s", time.Now().Sub(start), postfix) } } // utils type group struct { name string prefixes []string } var ( groups = []group{ group{name: "backend", prefixes: []string{ "vbe.", }}, group{name: "mempool", prefixes: []string{ "mempool.", }}, group{name: "lck", prefixes: []string{ "lck.", }}, group{name: "sma", prefixes: []string{ "sma.", }}, group{name: "smf", prefixes: []string{ "smf.", }}, group{name: "mgt", prefixes: []string{ "mgt.", }}, group{name: "main", prefixes: []string{ "main.", }}, } ) type grouping struct { newPrefix string prefix string total string desc string labelKey string } var ( fqGroupPrefixes = []*grouping{ &grouping{ prefix: "main_fetch", total: "main_s_fetch", desc: "Number of fetches", }, &grouping{ newPrefix: "main_sessions", prefix: "main_sess", total: "main_s_sess", desc: "Number of sessions", }, &grouping{ newPrefix: "main_worker_threads", prefix: "main_n_wrk", total: "main_n_wrk", desc: "Number of worker threads", }, } fqNames = map[string]string{ "varnish_lck_colls": "varnish_lock_collisions", "varnish_lck_creat": "varnish_lock_created", "varnish_lck_destroy": "varnish_lock_destroyed", "varnish_lck_locks": "varnish_lock_operations", } fqIdentifiers = map[string]string{ "varnish_lock_collisions": "target", "varnish_lock_created": "target", "varnish_lock_destroyed": "target", "varnish_lock_operations": "target", "varnish_sma_c_bytes": "type", "varnish_sma_c_fail": "type", "varnish_sma_c_freed": "type", "varnish_sma_c_req": "type", "varnish_sma_g_alloc": "type", "varnish_sma_g_bytes": "type", "varnish_sma_g_space": "type", "varnish_smf_c_bytes": "type", "varnish_smf_c_fail": "type", "varnish_smf_c_freed": "type", "varnish_smf_c_req": "type", "varnish_smf_g_alloc": "type", "varnish_smf_g_bytes": "type", "varnish_smf_g_smf_frag": "type", "varnish_smf_g_smf_large": "type", "varnish_smf_g_smf": "type", "varnish_smf_g_space": "type", } ) var ( // (prefix:). regexBackendUUID = regexp.MustCompile(`([[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[89ABab][0-9A-Za-z]{3}-[0-9A-Za-z]{12})(.*)`) // (,(),) regexBackendParen = regexp.MustCompile(`(.*)\((.*)\)`) ) func findLabelValue(name string, keys, values []string) string { for i, key := range keys { if key == name { if i < len(values) { return values[i] } return "" } } return "" } func cleanBackendName(name string) string { name = strings.Trim(name, ".") for _, prefix := range []string{"boot.", "root:"} { if startsWith(name, prefix, caseInsensitive) { name = name[len(prefix):] } } // reload_2019-08-29T100458. as by varnish_reload_vcl in 4.x // reload_20191014_091124_78599. as by varnishreload in 6+ if strings.HasPrefix(name, "reload_") { dot := strings.Index(name, ".") if dot != -1 { name = name[dot + 1:] } } return name } // https://prometheus.io/docs/practices/naming/ func computePrometheusInfo(vName, vGroup, vIdentifier, vDescription string) (name, description string, labelKeys, labelValues []string) { { // Varnish >= 5.2 no longer has 'ident', parse from full vName // as ".." if len(vIdentifier) == 0 && strings.Count(vName, ".") > 1 { vIdentifier = prometheusTrimGroupPrefix(strings.ToLower(vName)) vIdentifier = vIdentifier[0:strings.LastIndex(vIdentifier, ".")] } } // name and description { fq := strings.ToLower(vName) // Remove unique identifiers from name to group similar metrics by labeling if len(vIdentifier) > 0 { fq = strings.Replace(fq, "."+strings.ToLower(vIdentifier), "", -1) } // Make sure our group is prefixed only once fq = prometheusTrimGroupPrefix(fq) // Build fq name name = exporterNamespace + "_" + vGroup + "_" + strings.Replace(fq, ".", "_", -1) if swapName := fqNames[name]; len(swapName) > 0 { name = swapName } description = vDescription } // labels: can alter final name and description { if len(vIdentifier) > 0 { if isVBE := startsWith(vName, "VBE.", caseSensitive); isVBE { if hits := regexBackendUUID.FindAllStringSubmatch(vIdentifier, -1); len(hits) > 0 && len(hits[0]) >= 3 { labelKeys, labelValues = append(labelKeys, "backend"), append(labelValues, cleanBackendName(hits[0][2])) labelKeys, labelValues = append(labelKeys, "server"), append(labelValues, hits[0][1]) } else if hits := regexBackendParen.FindAllStringSubmatch(vIdentifier, -1); len(hits) > 0 && len(hits[0]) >= 3 { labelKeys, labelValues = append(labelKeys, "backend"), append(labelValues, cleanBackendName(hits[0][1])) labelKeys, labelValues = append(labelKeys, "server"), append(labelValues, strings.Replace(hits[0][2], ",,", ":", 1)) } // We must be consistent with the number of labels and their names inside this scrape and between scrapes, or we will get this error: // https://github.com/prometheus/client_golang/blob/3fb8ace93bc4ccddea55af62320c2fd109252880/prometheus/registry.go#L704-L707 if len(labelKeys) == 0 { labelKeys, labelValues = append(labelKeys, "backend"), append(labelValues, cleanBackendName(vIdentifier)) labelKeys, labelValues = append(labelKeys, "server"), append(labelValues, "unknown") } } if len(labelKeys) == 0 { labelKey := fqIdentifiers[name] if len(labelKey) == 0 { labelKey = "id" } labelKeys, labelValues = append(labelKeys, labelKey), append(labelValues, vIdentifier) } } // create groupings by moving part of the fq name as a label and optional total for _, grouping := range fqGroupPrefixes { fqTotal := exporterNamespace + "_" + grouping.total fqPrefix := exporterNamespace + "_" + grouping.prefix fqNewName := fqPrefix if len(grouping.newPrefix) > 0 { fqNewName = exporterNamespace + "_" + grouping.newPrefix } if name == fqTotal { // @note total should not be a label as it breaks aggregation name, description = fqNewName+"_total", grouping.desc break } else if len(name) > len(fqPrefix)+1 && strings.HasPrefix(name, fqPrefix+"_") { labelKey := "type" if len(grouping.labelKey) > 0 { labelKey = grouping.labelKey } labelKeys, labelValues = append(labelKeys, labelKey), append(labelValues, name[len(fqPrefix)+1:]) name, description = fqNewName, grouping.desc break } } } return name, description, labelKeys, labelValues } func prometheusTrimGroupPrefix(name string) string { nameLower := strings.ToLower(name) for _, group := range groups { for _, prefix := range group.prefixes { if startsWith(nameLower, prefix, caseSensitive) { return name[len(prefix):] } } } return name } // Always returns at least one main label func prometheusGroup(vName string) string { vNameLower := strings.ToLower(vName) for _, group := range groups { if startsWithAny(vNameLower, group.prefixes, caseSensitive) { return group.name } } return "main" } prometheus_varnish_exporter-1.5.2/test/000077500000000000000000000000001355530155200203575ustar00rootroot00000000000000prometheus_varnish_exporter-1.5.2/test/docker-compose.yml000066400000000000000000000011201355530155200240060ustar00rootroot00000000000000version: "2" services: varnish: image: eeacms/varnish ports: - "5081:6081" - "5085:6085" depends_on: - hello_world environment: BACKENDS: "hello_world" BACKENDS_PORT: "5090" DNS_ENABLED: "true" BACKENDS_PROBE_INTERVAL: "3s" BACKENDS_PROBE_TIMEOUT: "1s" BACKENDS_PROBE_WINDOW: "3" BACKENDS_PROBE_THRESHOLD: "2" DASHBOARD_USER: "admin" DASHBOARD_PASSWORD: "admin" DASHBOARD_SERVERS: "varnish" DASHBOARD_DNS_ENABLED: "true" hello_world: image: eeacms/hello environment: PORT: "5090" prometheus_varnish_exporter-1.5.2/test/scrape/000077500000000000000000000000001355530155200216345ustar00rootroot00000000000000prometheus_varnish_exporter-1.5.2/test/scrape/3.0.5.json000066400000000000000000000662631355530155200232070ustar00rootroot00000000000000{ "timestamp": "2019-08-20T00:03:35", "client_conn": { "value": 216, "flag": "a", "description": "Client connections accepted" }, "client_drop": { "value": 0, "flag": "a", "description": "Connection dropped, no sess/wrk" }, "client_req": { "value": 0, "flag": "a", "description": "Client requests received" }, "cache_hit": { "value": 0, "flag": "a", "description": "Cache hits" }, "cache_hitpass": { "value": 0, "flag": "a", "description": "Cache hits for pass" }, "cache_miss": { "value": 0, "flag": "a", "description": "Cache misses" }, "backend_conn": { "value": 0, "flag": "a", "description": "Backend conn. success" }, "backend_unhealthy": { "value": 0, "flag": "a", "description": "Backend conn. not attempted" }, "backend_busy": { "value": 0, "flag": "a", "description": "Backend conn. too many" }, "backend_fail": { "value": 0, "flag": "a", "description": "Backend conn. failures" }, "backend_reuse": { "value": 0, "flag": "a", "description": "Backend conn. reuses" }, "backend_toolate": { "value": 0, "flag": "a", "description": "Backend conn. was closed" }, "backend_recycle": { "value": 0, "flag": "a", "description": "Backend conn. recycles" }, "backend_retry": { "value": 0, "flag": "a", "description": "Backend conn. retry" }, "fetch_head": { "value": 0, "flag": "a", "description": "Fetch head" }, "fetch_length": { "value": 0, "flag": "a", "description": "Fetch with Length" }, "fetch_chunked": { "value": 0, "flag": "a", "description": "Fetch chunked" }, "fetch_eof": { "value": 0, "flag": "a", "description": "Fetch EOF" }, "fetch_bad": { "value": 0, "flag": "a", "description": "Fetch had bad headers" }, "fetch_close": { "value": 0, "flag": "a", "description": "Fetch wanted close" }, "fetch_oldhttp": { "value": 0, "flag": "a", "description": "Fetch pre HTTP/1.1 closed" }, "fetch_zero": { "value": 0, "flag": "a", "description": "Fetch zero len" }, "fetch_failed": { "value": 0, "flag": "a", "description": "Fetch failed" }, "fetch_1xx": { "value": 0, "flag": "a", "description": "Fetch no body (1xx)" }, "fetch_204": { "value": 0, "flag": "a", "description": "Fetch no body (204)" }, "fetch_304": { "value": 0, "flag": "a", "description": "Fetch no body (304)" }, "n_sess_mem": { "value": 10, "flag": "i", "description": "N struct sess_mem" }, "n_sess": { "value": 0, "flag": "i", "description": "N struct sess" }, "n_object": { "value": 0, "flag": "i", "description": "N struct object" }, "n_vampireobject": { "value": 0, "flag": "i", "description": "N unresurrected objects" }, "n_objectcore": { "value": 0, "flag": "i", "description": "N struct objectcore" }, "n_objecthead": { "value": 0, "flag": "i", "description": "N struct objecthead" }, "n_waitinglist": { "value": 0, "flag": "i", "description": "N struct waitinglist" }, "n_vbc": { "value": 0, "flag": "i", "description": "N struct vbc" }, "n_wrk": { "value": 10, "flag": "i", "description": "N worker threads" }, "n_wrk_create": { "value": 10, "flag": "a", "description": "N worker threads created" }, "n_wrk_failed": { "value": 0, "flag": "a", "description": "N worker threads not created" }, "n_wrk_max": { "value": 0, "flag": "a", "description": "N worker threads limited" }, "n_wrk_lqueue": { "value": 0, "flag": "a", "description": "work request queue length" }, "n_wrk_queued": { "value": 0, "flag": "a", "description": "N queued work requests" }, "n_wrk_drop": { "value": 0, "flag": "a", "description": "N dropped work requests" }, "n_backend": { "value": 1, "flag": "i", "description": "N backends" }, "n_expired": { "value": 0, "flag": "i", "description": "N expired objects" }, "n_lru_nuked": { "value": 0, "flag": "i", "description": "N LRU nuked objects" }, "n_lru_moved": { "value": 0, "flag": "i", "description": "N LRU moved objects" }, "losthdr": { "value": 0, "flag": "a", "description": "HTTP header overflows" }, "n_objsendfile": { "value": 0, "flag": "a", "description": "Objects sent with sendfile" }, "n_objwrite": { "value": 0, "flag": "a", "description": "Objects sent with write" }, "n_objoverflow": { "value": 0, "flag": "a", "description": "Objects overflowing workspace" }, "s_sess": { "value": 216, "flag": "a", "description": "Total Sessions" }, "s_req": { "value": 0, "flag": "a", "description": "Total Requests" }, "s_pipe": { "value": 0, "flag": "a", "description": "Total pipe" }, "s_pass": { "value": 0, "flag": "a", "description": "Total pass" }, "s_fetch": { "value": 0, "flag": "a", "description": "Total fetch" }, "s_hdrbytes": { "value": 0, "flag": "a", "description": "Total header bytes" }, "s_bodybytes": { "value": 0, "flag": "a", "description": "Total body bytes" }, "sess_closed": { "value": 216, "flag": "a", "description": "Session Closed" }, "sess_pipeline": { "value": 0, "flag": "a", "description": "Session Pipeline" }, "sess_readahead": { "value": 0, "flag": "a", "description": "Session Read Ahead" }, "sess_linger": { "value": 0, "flag": "a", "description": "Session Linger" }, "sess_herd": { "value": 0, "flag": "a", "description": "Session herd" }, "shm_records": { "value": 673, "flag": "a", "description": "SHM records" }, "shm_writes": { "value": 673, "flag": "a", "description": "SHM writes" }, "shm_flushes": { "value": 0, "flag": "a", "description": "SHM flushes due to overflow" }, "shm_cont": { "value": 0, "flag": "a", "description": "SHM MTX contention" }, "shm_cycles": { "value": 0, "flag": "a", "description": "SHM cycles through buffer" }, "sms_nreq": { "value": 0, "flag": "a", "description": "SMS allocator requests" }, "sms_nobj": { "value": 0, "flag": "i", "description": "SMS outstanding allocations" }, "sms_nbytes": { "value": 0, "flag": "i", "description": "SMS outstanding bytes" }, "sms_balloc": { "value": 0, "flag": "i", "description": "SMS bytes allocated" }, "sms_bfree": { "value": 0, "flag": "i", "description": "SMS bytes freed" }, "backend_req": { "value": 0, "flag": "a", "description": "Backend requests made" }, "n_vcl": { "value": 1, "flag": "a", "description": "N vcl total" }, "n_vcl_avail": { "value": 1, "flag": "a", "description": "N vcl available" }, "n_vcl_discard": { "value": 0, "flag": "a", "description": "N vcl discarded" }, "n_ban": { "value": 1, "flag": "i", "description": "N total active bans" }, "n_ban_gone": { "value": 1, "flag": "i", "description": "N total gone bans" }, "n_ban_add": { "value": 1, "flag": "a", "description": "N new bans added" }, "n_ban_retire": { "value": 0, "flag": "a", "description": "N old bans deleted" }, "n_ban_obj_test": { "value": 0, "flag": "a", "description": "N objects tested" }, "n_ban_re_test": { "value": 0, "flag": "a", "description": "N regexps tested against" }, "n_ban_dups": { "value": 0, "flag": "a", "description": "N duplicate bans removed" }, "hcb_nolock": { "value": 0, "flag": "a", "description": "HCB Lookups without lock" }, "hcb_lock": { "value": 0, "flag": "a", "description": "HCB Lookups with lock" }, "hcb_insert": { "value": 0, "flag": "a", "description": "HCB Inserts" }, "esi_errors": { "value": 0, "flag": "a", "description": "ESI parse errors (unlock)" }, "esi_warnings": { "value": 0, "flag": "a", "description": "ESI parse warnings (unlock)" }, "accept_fail": { "value": 0, "flag": "a", "description": "Accept failures" }, "client_drop_late": { "value": 0, "flag": "a", "description": "Connection dropped late" }, "uptime": { "value": 561, "flag": "a", "description": "Client uptime" }, "dir_dns_lookups": { "value": 0, "flag": "a", "description": "DNS director lookups" }, "dir_dns_failed": { "value": 0, "flag": "a", "description": "DNS director failed lookups" }, "dir_dns_hit": { "value": 0, "flag": "a", "description": "DNS director cached lookups hit" }, "dir_dns_cache_full": { "value": 0, "flag": "a", "description": "DNS director full dnscache" }, "vmods": { "value": 0, "flag": "i", "description": "Loaded VMODs" }, "n_gzip": { "value": 0, "flag": "a", "description": "Gzip operations" }, "n_gunzip": { "value": 0, "flag": "a", "description": "Gunzip operations" }, "sess_pipe_overflow": { "value": 0, "flag": "c", "description": "Dropped sessions due to session pipe overflow" }, "LCK.sms.creat": { "type": "LCK", "ident": "sms", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.sms.destroy": { "type": "LCK", "ident": "sms", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.sms.locks": { "type": "LCK", "ident": "sms", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.sms.colls": { "type": "LCK", "ident": "sms", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.smp.creat": { "type": "LCK", "ident": "smp", "value": 0, "flag": "a", "description": "Created locks" }, "LCK.smp.destroy": { "type": "LCK", "ident": "smp", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.smp.locks": { "type": "LCK", "ident": "smp", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.smp.colls": { "type": "LCK", "ident": "smp", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.sma.creat": { "type": "LCK", "ident": "sma", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.sma.destroy": { "type": "LCK", "ident": "sma", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.sma.locks": { "type": "LCK", "ident": "sma", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.sma.colls": { "type": "LCK", "ident": "sma", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.smf.creat": { "type": "LCK", "ident": "smf", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.smf.destroy": { "type": "LCK", "ident": "smf", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.smf.locks": { "type": "LCK", "ident": "smf", "value": 1, "flag": "a", "description": "Lock Operations" }, "LCK.smf.colls": { "type": "LCK", "ident": "smf", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.hsl.creat": { "type": "LCK", "ident": "hsl", "value": 0, "flag": "a", "description": "Created locks" }, "LCK.hsl.destroy": { "type": "LCK", "ident": "hsl", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.hsl.locks": { "type": "LCK", "ident": "hsl", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.hsl.colls": { "type": "LCK", "ident": "hsl", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.hcb.creat": { "type": "LCK", "ident": "hcb", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.hcb.destroy": { "type": "LCK", "ident": "hcb", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.hcb.locks": { "type": "LCK", "ident": "hcb", "value": 4, "flag": "a", "description": "Lock Operations" }, "LCK.hcb.colls": { "type": "LCK", "ident": "hcb", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.hcl.creat": { "type": "LCK", "ident": "hcl", "value": 0, "flag": "a", "description": "Created locks" }, "LCK.hcl.destroy": { "type": "LCK", "ident": "hcl", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.hcl.locks": { "type": "LCK", "ident": "hcl", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.hcl.colls": { "type": "LCK", "ident": "hcl", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.vcl.creat": { "type": "LCK", "ident": "vcl", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.vcl.destroy": { "type": "LCK", "ident": "vcl", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.vcl.locks": { "type": "LCK", "ident": "vcl", "value": 5, "flag": "a", "description": "Lock Operations" }, "LCK.vcl.colls": { "type": "LCK", "ident": "vcl", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.stat.creat": { "type": "LCK", "ident": "stat", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.stat.destroy": { "type": "LCK", "ident": "stat", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.stat.locks": { "type": "LCK", "ident": "stat", "value": 226, "flag": "a", "description": "Lock Operations" }, "LCK.stat.colls": { "type": "LCK", "ident": "stat", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.sessmem.creat": { "type": "LCK", "ident": "sessmem", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.sessmem.destroy": { "type": "LCK", "ident": "sessmem", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.sessmem.locks": { "type": "LCK", "ident": "sessmem", "value": 253, "flag": "a", "description": "Lock Operations" }, "LCK.sessmem.colls": { "type": "LCK", "ident": "sessmem", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.wstat.creat": { "type": "LCK", "ident": "wstat", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.wstat.destroy": { "type": "LCK", "ident": "wstat", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.wstat.locks": { "type": "LCK", "ident": "wstat", "value": 1129, "flag": "a", "description": "Lock Operations" }, "LCK.wstat.colls": { "type": "LCK", "ident": "wstat", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.herder.creat": { "type": "LCK", "ident": "herder", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.herder.destroy": { "type": "LCK", "ident": "herder", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.herder.locks": { "type": "LCK", "ident": "herder", "value": 1, "flag": "a", "description": "Lock Operations" }, "LCK.herder.colls": { "type": "LCK", "ident": "herder", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.wq.creat": { "type": "LCK", "ident": "wq", "value": 2, "flag": "a", "description": "Created locks" }, "LCK.wq.destroy": { "type": "LCK", "ident": "wq", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.wq.locks": { "type": "LCK", "ident": "wq", "value": 1566, "flag": "a", "description": "Lock Operations" }, "LCK.wq.colls": { "type": "LCK", "ident": "wq", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.objhdr.creat": { "type": "LCK", "ident": "objhdr", "value": 0, "flag": "a", "description": "Created locks" }, "LCK.objhdr.destroy": { "type": "LCK", "ident": "objhdr", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.objhdr.locks": { "type": "LCK", "ident": "objhdr", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.objhdr.colls": { "type": "LCK", "ident": "objhdr", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.exp.creat": { "type": "LCK", "ident": "exp", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.exp.destroy": { "type": "LCK", "ident": "exp", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.exp.locks": { "type": "LCK", "ident": "exp", "value": 561, "flag": "a", "description": "Lock Operations" }, "LCK.exp.colls": { "type": "LCK", "ident": "exp", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.lru.creat": { "type": "LCK", "ident": "lru", "value": 2, "flag": "a", "description": "Created locks" }, "LCK.lru.destroy": { "type": "LCK", "ident": "lru", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.lru.locks": { "type": "LCK", "ident": "lru", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.lru.colls": { "type": "LCK", "ident": "lru", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.cli.creat": { "type": "LCK", "ident": "cli", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.cli.destroy": { "type": "LCK", "ident": "cli", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.cli.locks": { "type": "LCK", "ident": "cli", "value": 18, "flag": "a", "description": "Lock Operations" }, "LCK.cli.colls": { "type": "LCK", "ident": "cli", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.ban.creat": { "type": "LCK", "ident": "ban", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.ban.destroy": { "type": "LCK", "ident": "ban", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.ban.locks": { "type": "LCK", "ident": "ban", "value": 564, "flag": "a", "description": "Lock Operations" }, "LCK.ban.colls": { "type": "LCK", "ident": "ban", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.vbp.creat": { "type": "LCK", "ident": "vbp", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.vbp.destroy": { "type": "LCK", "ident": "vbp", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.vbp.locks": { "type": "LCK", "ident": "vbp", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.vbp.colls": { "type": "LCK", "ident": "vbp", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.vbe.creat": { "type": "LCK", "ident": "vbe", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.vbe.destroy": { "type": "LCK", "ident": "vbe", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.vbe.locks": { "type": "LCK", "ident": "vbe", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.vbe.colls": { "type": "LCK", "ident": "vbe", "value": 0, "flag": "a", "description": "Collisions" }, "LCK.backend.creat": { "type": "LCK", "ident": "backend", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.backend.destroy": { "type": "LCK", "ident": "backend", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.backend.locks": { "type": "LCK", "ident": "backend", "value": 1, "flag": "a", "description": "Lock Operations" }, "LCK.backend.colls": { "type": "LCK", "ident": "backend", "value": 0, "flag": "a", "description": "Collisions" }, "SMF.s0.c_req": { "type": "SMF", "ident": "s0", "value": 0, "flag": "a", "description": "Allocator requests" }, "SMF.s0.c_fail": { "type": "SMF", "ident": "s0", "value": 0, "flag": "a", "description": "Allocator failures" }, "SMF.s0.c_bytes": { "type": "SMF", "ident": "s0", "value": 0, "flag": "a", "description": "Bytes allocated" }, "SMF.s0.c_freed": { "type": "SMF", "ident": "s0", "value": 0, "flag": "a", "description": "Bytes freed" }, "SMF.s0.g_alloc": { "type": "SMF", "ident": "s0", "value": 0, "flag": "i", "description": "Allocations outstanding" }, "SMF.s0.g_bytes": { "type": "SMF", "ident": "s0", "value": 0, "flag": "i", "description": "Bytes outstanding" }, "SMF.s0.g_space": { "type": "SMF", "ident": "s0", "value": 2220228608, "flag": "i", "description": "Bytes available" }, "SMF.s0.g_smf": { "type": "SMF", "ident": "s0", "value": 4, "flag": "i", "description": "N struct smf" }, "SMF.s0.g_smf_frag": { "type": "SMF", "ident": "s0", "value": 0, "flag": "i", "description": "N small free smf" }, "SMF.s0.g_smf_large": { "type": "SMF", "ident": "s0", "value": 4, "flag": "i", "description": "N large free smf" }, "SMA.Transient.c_req": { "type": "SMA", "ident": "Transient", "value": 0, "flag": "a", "description": "Allocator requests" }, "SMA.Transient.c_fail": { "type": "SMA", "ident": "Transient", "value": 0, "flag": "a", "description": "Allocator failures" }, "SMA.Transient.c_bytes": { "type": "SMA", "ident": "Transient", "value": 0, "flag": "a", "description": "Bytes allocated" }, "SMA.Transient.c_freed": { "type": "SMA", "ident": "Transient", "value": 0, "flag": "a", "description": "Bytes freed" }, "SMA.Transient.g_alloc": { "type": "SMA", "ident": "Transient", "value": 0, "flag": "i", "description": "Allocations outstanding" }, "SMA.Transient.g_bytes": { "type": "SMA", "ident": "Transient", "value": 0, "flag": "i", "description": "Bytes outstanding" }, "SMA.Transient.g_space": { "type": "SMA", "ident": "Transient", "value": 0, "flag": "i", "description": "Bytes available" }, "VBE.default(10.100.225.15,,80).vcls": { "type": "VBE", "ident": "default(10.100.225.15,,80)", "value": 1, "flag": "i", "description": "VCL references" }, "VBE.default(10.100.225.15,,80).happy": { "type": "VBE", "ident": "default(10.100.225.15,,80)", "value": 0, "flag": "b", "description": "Happy health probes" } }prometheus_varnish_exporter-1.5.2/test/scrape/4.0.5.json000066400000000000000000001333601355530155200232010ustar00rootroot00000000000000{ "timestamp": "2019-07-31T23:56:36", "MAIN.uptime": { "type": "MAIN", "value": 0, "flag": "a", "description": "Child process uptime" }, "MAIN.sess_conn": { "type": "MAIN", "value": 0, "flag": "c", "description": "Sessions accepted" }, "MAIN.sess_drop": { "type": "MAIN", "value": 0, "flag": "c", "description": "Sessions dropped" }, "MAIN.sess_fail": { "type": "MAIN", "value": 0, "flag": "c", "description": "Session accept failures" }, "MAIN.sess_pipe_overflow": { "type": "MAIN", "value": 0, "flag": "c", "description": "Session pipe overflow" }, "MAIN.client_req_400": { "type": "MAIN", "value": 0, "flag": "a", "description": "Client requests received, subject to 400 errors" }, "MAIN.client_req_411": { "type": "MAIN", "value": 0, "flag": "a", "description": "Client requests received, subject to 411 errors" }, "MAIN.client_req_413": { "type": "MAIN", "value": 0, "flag": "a", "description": "Client requests received, subject to 413 errors" }, "MAIN.client_req_417": { "type": "MAIN", "value": 0, "flag": "a", "description": "Client requests received, subject to 417 errors" }, "MAIN.client_req": { "type": "MAIN", "value": 0, "flag": "a", "description": "Good client requests received" }, "MAIN.cache_hit": { "type": "MAIN", "value": 0, "flag": "a", "description": "Cache hits" }, "MAIN.cache_hitpass": { "type": "MAIN", "value": 0, "flag": "a", "description": "Cache hits for pass" }, "MAIN.cache_miss": { "type": "MAIN", "value": 0, "flag": "a", "description": "Cache misses" }, "MAIN.backend_conn": { "type": "MAIN", "value": 0, "flag": "a", "description": "Backend conn. success" }, "MAIN.backend_unhealthy": { "type": "MAIN", "value": 0, "flag": "a", "description": "Backend conn. not attempted" }, "MAIN.backend_busy": { "type": "MAIN", "value": 0, "flag": "a", "description": "Backend conn. too many" }, "MAIN.backend_fail": { "type": "MAIN", "value": 0, "flag": "a", "description": "Backend conn. failures" }, "MAIN.backend_reuse": { "type": "MAIN", "value": 0, "flag": "a", "description": "Backend conn. reuses" }, "MAIN.backend_toolate": { "type": "MAIN", "value": 0, "flag": "a", "description": "Backend conn. was closed" }, "MAIN.backend_recycle": { "type": "MAIN", "value": 0, "flag": "a", "description": "Backend conn. recycles" }, "MAIN.backend_retry": { "type": "MAIN", "value": 0, "flag": "a", "description": "Backend conn. retry" }, "MAIN.fetch_head": { "type": "MAIN", "value": 0, "flag": "c", "description": "Fetch no body (HEAD)" }, "MAIN.fetch_length": { "type": "MAIN", "value": 0, "flag": "c", "description": "Fetch with Length" }, "MAIN.fetch_chunked": { "type": "MAIN", "value": 0, "flag": "c", "description": "Fetch chunked" }, "MAIN.fetch_eof": { "type": "MAIN", "value": 0, "flag": "c", "description": "Fetch EOF" }, "MAIN.fetch_bad": { "type": "MAIN", "value": 0, "flag": "c", "description": "Fetch bad T-E" }, "MAIN.fetch_close": { "type": "MAIN", "value": 0, "flag": "c", "description": "Fetch wanted close" }, "MAIN.fetch_oldhttp": { "type": "MAIN", "value": 0, "flag": "c", "description": "Fetch pre HTTP/1.1 closed" }, "MAIN.fetch_zero": { "type": "MAIN", "value": 0, "flag": "c", "description": "Fetch zero len body" }, "MAIN.fetch_1xx": { "type": "MAIN", "value": 0, "flag": "c", "description": "Fetch no body (1xx)" }, "MAIN.fetch_204": { "type": "MAIN", "value": 0, "flag": "c", "description": "Fetch no body (204)" }, "MAIN.fetch_304": { "type": "MAIN", "value": 0, "flag": "c", "description": "Fetch no body (304)" }, "MAIN.fetch_failed": { "type": "MAIN", "value": 0, "flag": "c", "description": "Fetch failed (all causes)" }, "MAIN.fetch_no_thread": { "type": "MAIN", "value": 0, "flag": "c", "description": "Fetch failed (no thread)" }, "MAIN.pools": { "type": "MAIN", "value": 2, "flag": "g", "description": "Number of thread pools" }, "MAIN.threads": { "type": "MAIN", "value": 200, "flag": "g", "description": "Total number of threads" }, "MAIN.threads_limited": { "type": "MAIN", "value": 0, "flag": "c", "description": "Threads hit max" }, "MAIN.threads_created": { "type": "MAIN", "value": 200, "flag": "c", "description": "Threads created" }, "MAIN.threads_destroyed": { "type": "MAIN", "value": 0, "flag": "c", "description": "Threads destroyed" }, "MAIN.threads_failed": { "type": "MAIN", "value": 0, "flag": "c", "description": "Thread creation failed" }, "MAIN.thread_queue_len": { "type": "MAIN", "value": 0, "flag": "g", "description": "Length of session queue" }, "MAIN.busy_sleep": { "type": "MAIN", "value": 0, "flag": "c", "description": "Number of requests sent to sleep on busy objhdr" }, "MAIN.busy_wakeup": { "type": "MAIN", "value": 0, "flag": "c", "description": "Number of requests woken after sleep on busy objhdr" }, "MAIN.sess_queued": { "type": "MAIN", "value": 0, "flag": "c", "description": "Sessions queued for thread" }, "MAIN.sess_dropped": { "type": "MAIN", "value": 0, "flag": "c", "description": "Sessions dropped for thread" }, "MAIN.n_object": { "type": "MAIN", "value": 0, "flag": "i", "description": "object structs made" }, "MAIN.n_vampireobject": { "type": "MAIN", "value": 0, "flag": "i", "description": "unresurrected objects" }, "MAIN.n_objectcore": { "type": "MAIN", "value": 0, "flag": "i", "description": "objectcore structs made" }, "MAIN.n_objecthead": { "type": "MAIN", "value": 0, "flag": "i", "description": "objecthead structs made" }, "MAIN.n_waitinglist": { "type": "MAIN", "value": 0, "flag": "i", "description": "waitinglist structs made" }, "MAIN.n_backend": { "type": "MAIN", "value": 1, "flag": "i", "description": "Number of backends" }, "MAIN.n_expired": { "type": "MAIN", "value": 0, "flag": "i", "description": "Number of expired objects" }, "MAIN.n_lru_nuked": { "type": "MAIN", "value": 0, "flag": "i", "description": "Number of LRU nuked objects" }, "MAIN.n_lru_moved": { "type": "MAIN", "value": 0, "flag": "i", "description": "Number of LRU moved objects" }, "MAIN.losthdr": { "type": "MAIN", "value": 0, "flag": "a", "description": "HTTP header overflows" }, "MAIN.s_sess": { "type": "MAIN", "value": 0, "flag": "a", "description": "Total sessions seen" }, "MAIN.s_req": { "type": "MAIN", "value": 0, "flag": "a", "description": "Total requests seen" }, "MAIN.s_pipe": { "type": "MAIN", "value": 0, "flag": "a", "description": "Total pipe sessions seen" }, "MAIN.s_pass": { "type": "MAIN", "value": 0, "flag": "a", "description": "Total pass-ed requests seen" }, "MAIN.s_fetch": { "type": "MAIN", "value": 0, "flag": "a", "description": "Total backend fetches initiated" }, "MAIN.s_synth": { "type": "MAIN", "value": 0, "flag": "a", "description": "Total synthethic responses made" }, "MAIN.s_req_hdrbytes": { "type": "MAIN", "value": 0, "flag": "a", "description": "Request header bytes" }, "MAIN.s_req_bodybytes": { "type": "MAIN", "value": 0, "flag": "a", "description": "Request body bytes" }, "MAIN.s_resp_hdrbytes": { "type": "MAIN", "value": 0, "flag": "a", "description": "Response header bytes" }, "MAIN.s_resp_bodybytes": { "type": "MAIN", "value": 0, "flag": "a", "description": "Response body bytes" }, "MAIN.s_pipe_hdrbytes": { "type": "MAIN", "value": 0, "flag": "a", "description": "Pipe request header bytes" }, "MAIN.s_pipe_in": { "type": "MAIN", "value": 0, "flag": "a", "description": "Piped bytes from client" }, "MAIN.s_pipe_out": { "type": "MAIN", "value": 0, "flag": "a", "description": "Piped bytes to client" }, "MAIN.sess_closed": { "type": "MAIN", "value": 0, "flag": "a", "description": "Session Closed" }, "MAIN.sess_pipeline": { "type": "MAIN", "value": 0, "flag": "a", "description": "Session Pipeline" }, "MAIN.sess_readahead": { "type": "MAIN", "value": 0, "flag": "a", "description": "Session Read Ahead" }, "MAIN.sess_herd": { "type": "MAIN", "value": 0, "flag": "a", "description": "Session herd" }, "MAIN.shm_records": { "type": "MAIN", "value": 6, "flag": "a", "description": "SHM records" }, "MAIN.shm_writes": { "type": "MAIN", "value": 6, "flag": "a", "description": "SHM writes" }, "MAIN.shm_flushes": { "type": "MAIN", "value": 0, "flag": "a", "description": "SHM flushes due to overflow" }, "MAIN.shm_cont": { "type": "MAIN", "value": 0, "flag": "a", "description": "SHM MTX contention" }, "MAIN.shm_cycles": { "type": "MAIN", "value": 0, "flag": "a", "description": "SHM cycles through buffer" }, "MAIN.sms_nreq": { "type": "MAIN", "value": 0, "flag": "a", "description": "SMS allocator requests" }, "MAIN.sms_nobj": { "type": "MAIN", "value": 0, "flag": "i", "description": "SMS outstanding allocations" }, "MAIN.sms_nbytes": { "type": "MAIN", "value": 0, "flag": "i", "description": "SMS outstanding bytes" }, "MAIN.sms_balloc": { "type": "MAIN", "value": 0, "flag": "i", "description": "SMS bytes allocated" }, "MAIN.sms_bfree": { "type": "MAIN", "value": 0, "flag": "i", "description": "SMS bytes freed" }, "MAIN.backend_req": { "type": "MAIN", "value": 0, "flag": "a", "description": "Backend requests made" }, "MAIN.n_vcl": { "type": "MAIN", "value": 1, "flag": "a", "description": "Number of loaded VCLs in total" }, "MAIN.n_vcl_avail": { "type": "MAIN", "value": 1, "flag": "a", "description": "Number of VCLs available" }, "MAIN.n_vcl_discard": { "type": "MAIN", "value": 0, "flag": "a", "description": "Number of discarded VCLs" }, "MAIN.bans": { "type": "MAIN", "value": 1, "flag": "g", "description": "Count of bans" }, "MAIN.bans_completed": { "type": "MAIN", "value": 1, "flag": "g", "description": "Number of bans marked 'completed'" }, "MAIN.bans_obj": { "type": "MAIN", "value": 0, "flag": "g", "description": "Number of bans using obj.*" }, "MAIN.bans_req": { "type": "MAIN", "value": 0, "flag": "g", "description": "Number of bans using req.*" }, "MAIN.bans_added": { "type": "MAIN", "value": 1, "flag": "c", "description": "Bans added" }, "MAIN.bans_deleted": { "type": "MAIN", "value": 0, "flag": "c", "description": "Bans deleted" }, "MAIN.bans_tested": { "type": "MAIN", "value": 0, "flag": "c", "description": "Bans tested against objects (lookup)" }, "MAIN.bans_obj_killed": { "type": "MAIN", "value": 0, "flag": "c", "description": "Objects killed by bans (lookup)" }, "MAIN.bans_lurker_tested": { "type": "MAIN", "value": 0, "flag": "c", "description": "Bans tested against objects (lurker)" }, "MAIN.bans_tests_tested": { "type": "MAIN", "value": 0, "flag": "c", "description": "Ban tests tested against objects (lookup)" }, "MAIN.bans_lurker_tests_tested": { "type": "MAIN", "value": 0, "flag": "c", "description": "Ban tests tested against objects (lurker)" }, "MAIN.bans_lurker_obj_killed": { "type": "MAIN", "value": 0, "flag": "c", "description": "Objects killed by bans (lurker)" }, "MAIN.bans_dups": { "type": "MAIN", "value": 0, "flag": "c", "description": "Bans superseded by other bans" }, "MAIN.bans_lurker_contention": { "type": "MAIN", "value": 0, "flag": "c", "description": "Lurker gave way for lookup" }, "MAIN.bans_persisted_bytes": { "type": "MAIN", "value": 13, "flag": "g", "description": "Bytes used by the persisted ban lists" }, "MAIN.bans_persisted_fragmentation": { "type": "MAIN", "value": 0, "flag": "g", "description": "Extra bytes in persisted ban lists due to fragmentation" }, "MAIN.n_purges": { "type": "MAIN", "value": 0, "flag": "i", "description": "Number of purge operations executed" }, "MAIN.n_obj_purged": { "type": "MAIN", "value": 0, "flag": "i", "description": "Number of purged objects" }, "MAIN.exp_mailed": { "type": "MAIN", "value": 0, "flag": "c", "description": "Number of objects mailed to expiry thread" }, "MAIN.exp_received": { "type": "MAIN", "value": 0, "flag": "c", "description": "Number of objects received by expiry thread" }, "MAIN.hcb_nolock": { "type": "MAIN", "value": 0, "flag": "a", "description": "HCB Lookups without lock" }, "MAIN.hcb_lock": { "type": "MAIN", "value": 0, "flag": "a", "description": "HCB Lookups with lock" }, "MAIN.hcb_insert": { "type": "MAIN", "value": 0, "flag": "a", "description": "HCB Inserts" }, "MAIN.esi_errors": { "type": "MAIN", "value": 0, "flag": "a", "description": "ESI parse errors (unlock)" }, "MAIN.esi_warnings": { "type": "MAIN", "value": 0, "flag": "a", "description": "ESI parse warnings (unlock)" }, "MAIN.vmods": { "type": "MAIN", "value": 0, "flag": "i", "description": "Loaded VMODs" }, "MAIN.n_gzip": { "type": "MAIN", "value": 0, "flag": "a", "description": "Gzip operations" }, "MAIN.n_gunzip": { "type": "MAIN", "value": 0, "flag": "a", "description": "Gunzip operations" }, "MAIN.vsm_free": { "type": "MAIN", "value": 974768, "flag": "g", "description": "Free VSM space" }, "MAIN.vsm_used": { "type": "MAIN", "value": 83959840, "flag": "g", "description": "Used VSM space" }, "MAIN.vsm_cooling": { "type": "MAIN", "value": 0, "flag": "g", "description": "Cooling VSM space" }, "MAIN.vsm_overflow": { "type": "MAIN", "value": 0, "flag": "g", "description": "Overflow VSM space" }, "MAIN.vsm_overflowed": { "type": "MAIN", "value": 0, "flag": "c", "description": "Overflowed VSM space" }, "MGT.uptime": { "type": "MGT", "value": 0, "flag": "c", "description": "Management process uptime" }, "MGT.child_start": { "type": "MGT", "value": 1, "flag": "c", "description": "Child process started" }, "MGT.child_exit": { "type": "MGT", "value": 0, "flag": "c", "description": "Child process normal exit" }, "MGT.child_stop": { "type": "MGT", "value": 0, "flag": "c", "description": "Child process unexpected exit" }, "MGT.child_died": { "type": "MGT", "value": 0, "flag": "c", "description": "Child process died (signal)" }, "MGT.child_dump": { "type": "MGT", "value": 0, "flag": "c", "description": "Child process core dumped" }, "MGT.child_panic": { "type": "MGT", "value": 0, "flag": "c", "description": "Child process panic" }, "MEMPOOL.vbc.live": { "type": "MEMPOOL", "ident": "vbc", "value": 0, "flag": "g", "description": "In use" }, "MEMPOOL.vbc.pool": { "type": "MEMPOOL", "ident": "vbc", "value": 10, "flag": "g", "description": "In Pool" }, "MEMPOOL.vbc.sz_wanted": { "type": "MEMPOOL", "ident": "vbc", "value": 88, "flag": "g", "description": "Size requested" }, "MEMPOOL.vbc.sz_needed": { "type": "MEMPOOL", "ident": "vbc", "value": 120, "flag": "g", "description": "Size allocated" }, "MEMPOOL.vbc.allocs": { "type": "MEMPOOL", "ident": "vbc", "value": 0, "flag": "c", "description": "Allocations" }, "MEMPOOL.vbc.frees": { "type": "MEMPOOL", "ident": "vbc", "value": 0, "flag": "c", "description": "Frees" }, "MEMPOOL.vbc.recycle": { "type": "MEMPOOL", "ident": "vbc", "value": 0, "flag": "c", "description": "Recycled from pool" }, "MEMPOOL.vbc.timeout": { "type": "MEMPOOL", "ident": "vbc", "value": 0, "flag": "c", "description": "Timed out from pool" }, "MEMPOOL.vbc.toosmall": { "type": "MEMPOOL", "ident": "vbc", "value": 0, "flag": "c", "description": "Too small to recycle" }, "MEMPOOL.vbc.surplus": { "type": "MEMPOOL", "ident": "vbc", "value": 0, "flag": "c", "description": "Too many for pool" }, "MEMPOOL.vbc.randry": { "type": "MEMPOOL", "ident": "vbc", "value": 0, "flag": "c", "description": "Pool ran dry" }, "MEMPOOL.busyobj.live": { "type": "MEMPOOL", "ident": "busyobj", "value": 0, "flag": "g", "description": "In use" }, "MEMPOOL.busyobj.pool": { "type": "MEMPOOL", "ident": "busyobj", "value": 10, "flag": "g", "description": "In Pool" }, "MEMPOOL.busyobj.sz_wanted": { "type": "MEMPOOL", "ident": "busyobj", "value": 65536, "flag": "g", "description": "Size requested" }, "MEMPOOL.busyobj.sz_needed": { "type": "MEMPOOL", "ident": "busyobj", "value": 65568, "flag": "g", "description": "Size allocated" }, "MEMPOOL.busyobj.allocs": { "type": "MEMPOOL", "ident": "busyobj", "value": 0, "flag": "c", "description": "Allocations" }, "MEMPOOL.busyobj.frees": { "type": "MEMPOOL", "ident": "busyobj", "value": 0, "flag": "c", "description": "Frees" }, "MEMPOOL.busyobj.recycle": { "type": "MEMPOOL", "ident": "busyobj", "value": 0, "flag": "c", "description": "Recycled from pool" }, "MEMPOOL.busyobj.timeout": { "type": "MEMPOOL", "ident": "busyobj", "value": 0, "flag": "c", "description": "Timed out from pool" }, "MEMPOOL.busyobj.toosmall": { "type": "MEMPOOL", "ident": "busyobj", "value": 0, "flag": "c", "description": "Too small to recycle" }, "MEMPOOL.busyobj.surplus": { "type": "MEMPOOL", "ident": "busyobj", "value": 0, "flag": "c", "description": "Too many for pool" }, "MEMPOOL.busyobj.randry": { "type": "MEMPOOL", "ident": "busyobj", "value": 0, "flag": "c", "description": "Pool ran dry" }, "MEMPOOL.req0.live": { "type": "MEMPOOL", "ident": "req0", "value": 0, "flag": "g", "description": "In use" }, "MEMPOOL.req0.pool": { "type": "MEMPOOL", "ident": "req0", "value": 10, "flag": "g", "description": "In Pool" }, "MEMPOOL.req0.sz_wanted": { "type": "MEMPOOL", "ident": "req0", "value": 65536, "flag": "g", "description": "Size requested" }, "MEMPOOL.req0.sz_needed": { "type": "MEMPOOL", "ident": "req0", "value": 65568, "flag": "g", "description": "Size allocated" }, "MEMPOOL.req0.allocs": { "type": "MEMPOOL", "ident": "req0", "value": 0, "flag": "c", "description": "Allocations" }, "MEMPOOL.req0.frees": { "type": "MEMPOOL", "ident": "req0", "value": 0, "flag": "c", "description": "Frees" }, "MEMPOOL.req0.recycle": { "type": "MEMPOOL", "ident": "req0", "value": 0, "flag": "c", "description": "Recycled from pool" }, "MEMPOOL.req0.timeout": { "type": "MEMPOOL", "ident": "req0", "value": 0, "flag": "c", "description": "Timed out from pool" }, "MEMPOOL.req0.toosmall": { "type": "MEMPOOL", "ident": "req0", "value": 0, "flag": "c", "description": "Too small to recycle" }, "MEMPOOL.req0.surplus": { "type": "MEMPOOL", "ident": "req0", "value": 0, "flag": "c", "description": "Too many for pool" }, "MEMPOOL.req0.randry": { "type": "MEMPOOL", "ident": "req0", "value": 0, "flag": "c", "description": "Pool ran dry" }, "MEMPOOL.sess0.live": { "type": "MEMPOOL", "ident": "sess0", "value": 0, "flag": "g", "description": "In use" }, "MEMPOOL.sess0.pool": { "type": "MEMPOOL", "ident": "sess0", "value": 10, "flag": "g", "description": "In Pool" }, "MEMPOOL.sess0.sz_wanted": { "type": "MEMPOOL", "ident": "sess0", "value": 384, "flag": "g", "description": "Size requested" }, "MEMPOOL.sess0.sz_needed": { "type": "MEMPOOL", "ident": "sess0", "value": 416, "flag": "g", "description": "Size allocated" }, "MEMPOOL.sess0.allocs": { "type": "MEMPOOL", "ident": "sess0", "value": 0, "flag": "c", "description": "Allocations" }, "MEMPOOL.sess0.frees": { "type": "MEMPOOL", "ident": "sess0", "value": 0, "flag": "c", "description": "Frees" }, "MEMPOOL.sess0.recycle": { "type": "MEMPOOL", "ident": "sess0", "value": 0, "flag": "c", "description": "Recycled from pool" }, "MEMPOOL.sess0.timeout": { "type": "MEMPOOL", "ident": "sess0", "value": 0, "flag": "c", "description": "Timed out from pool" }, "MEMPOOL.sess0.toosmall": { "type": "MEMPOOL", "ident": "sess0", "value": 0, "flag": "c", "description": "Too small to recycle" }, "MEMPOOL.sess0.surplus": { "type": "MEMPOOL", "ident": "sess0", "value": 0, "flag": "c", "description": "Too many for pool" }, "MEMPOOL.sess0.randry": { "type": "MEMPOOL", "ident": "sess0", "value": 0, "flag": "c", "description": "Pool ran dry" }, "MEMPOOL.req1.live": { "type": "MEMPOOL", "ident": "req1", "value": 0, "flag": "g", "description": "In use" }, "MEMPOOL.req1.pool": { "type": "MEMPOOL", "ident": "req1", "value": 10, "flag": "g", "description": "In Pool" }, "MEMPOOL.req1.sz_wanted": { "type": "MEMPOOL", "ident": "req1", "value": 65536, "flag": "g", "description": "Size requested" }, "MEMPOOL.req1.sz_needed": { "type": "MEMPOOL", "ident": "req1", "value": 65568, "flag": "g", "description": "Size allocated" }, "MEMPOOL.req1.allocs": { "type": "MEMPOOL", "ident": "req1", "value": 0, "flag": "c", "description": "Allocations" }, "MEMPOOL.req1.frees": { "type": "MEMPOOL", "ident": "req1", "value": 0, "flag": "c", "description": "Frees" }, "MEMPOOL.req1.recycle": { "type": "MEMPOOL", "ident": "req1", "value": 0, "flag": "c", "description": "Recycled from pool" }, "MEMPOOL.req1.timeout": { "type": "MEMPOOL", "ident": "req1", "value": 0, "flag": "c", "description": "Timed out from pool" }, "MEMPOOL.req1.toosmall": { "type": "MEMPOOL", "ident": "req1", "value": 0, "flag": "c", "description": "Too small to recycle" }, "MEMPOOL.req1.surplus": { "type": "MEMPOOL", "ident": "req1", "value": 0, "flag": "c", "description": "Too many for pool" }, "MEMPOOL.req1.randry": { "type": "MEMPOOL", "ident": "req1", "value": 0, "flag": "c", "description": "Pool ran dry" }, "MEMPOOL.sess1.live": { "type": "MEMPOOL", "ident": "sess1", "value": 0, "flag": "g", "description": "In use" }, "MEMPOOL.sess1.pool": { "type": "MEMPOOL", "ident": "sess1", "value": 10, "flag": "g", "description": "In Pool" }, "MEMPOOL.sess1.sz_wanted": { "type": "MEMPOOL", "ident": "sess1", "value": 384, "flag": "g", "description": "Size requested" }, "MEMPOOL.sess1.sz_needed": { "type": "MEMPOOL", "ident": "sess1", "value": 416, "flag": "g", "description": "Size allocated" }, "MEMPOOL.sess1.allocs": { "type": "MEMPOOL", "ident": "sess1", "value": 0, "flag": "c", "description": "Allocations" }, "MEMPOOL.sess1.frees": { "type": "MEMPOOL", "ident": "sess1", "value": 0, "flag": "c", "description": "Frees" }, "MEMPOOL.sess1.recycle": { "type": "MEMPOOL", "ident": "sess1", "value": 0, "flag": "c", "description": "Recycled from pool" }, "MEMPOOL.sess1.timeout": { "type": "MEMPOOL", "ident": "sess1", "value": 0, "flag": "c", "description": "Timed out from pool" }, "MEMPOOL.sess1.toosmall": { "type": "MEMPOOL", "ident": "sess1", "value": 0, "flag": "c", "description": "Too small to recycle" }, "MEMPOOL.sess1.surplus": { "type": "MEMPOOL", "ident": "sess1", "value": 0, "flag": "c", "description": "Too many for pool" }, "MEMPOOL.sess1.randry": { "type": "MEMPOOL", "ident": "sess1", "value": 0, "flag": "c", "description": "Pool ran dry" }, "SMA.s0.c_req": { "type": "SMA", "ident": "s0", "value": 0, "flag": "a", "description": "Allocator requests" }, "SMA.s0.c_fail": { "type": "SMA", "ident": "s0", "value": 0, "flag": "a", "description": "Allocator failures" }, "SMA.s0.c_bytes": { "type": "SMA", "ident": "s0", "value": 0, "flag": "a", "description": "Bytes allocated" }, "SMA.s0.c_freed": { "type": "SMA", "ident": "s0", "value": 0, "flag": "a", "description": "Bytes freed" }, "SMA.s0.g_alloc": { "type": "SMA", "ident": "s0", "value": 0, "flag": "i", "description": "Allocations outstanding" }, "SMA.s0.g_bytes": { "type": "SMA", "ident": "s0", "value": 0, "flag": "i", "description": "Bytes outstanding" }, "SMA.s0.g_space": { "type": "SMA", "ident": "s0", "value": 268435456, "flag": "i", "description": "Bytes available" }, "SMA.Transient.c_req": { "type": "SMA", "ident": "Transient", "value": 0, "flag": "a", "description": "Allocator requests" }, "SMA.Transient.c_fail": { "type": "SMA", "ident": "Transient", "value": 0, "flag": "a", "description": "Allocator failures" }, "SMA.Transient.c_bytes": { "type": "SMA", "ident": "Transient", "value": 0, "flag": "a", "description": "Bytes allocated" }, "SMA.Transient.c_freed": { "type": "SMA", "ident": "Transient", "value": 0, "flag": "a", "description": "Bytes freed" }, "SMA.Transient.g_alloc": { "type": "SMA", "ident": "Transient", "value": 0, "flag": "i", "description": "Allocations outstanding" }, "SMA.Transient.g_bytes": { "type": "SMA", "ident": "Transient", "value": 0, "flag": "i", "description": "Bytes outstanding" }, "SMA.Transient.g_space": { "type": "SMA", "ident": "Transient", "value": 0, "flag": "i", "description": "Bytes available" }, "VBE.default(127.0.0.1,,8080).vcls": { "type": "VBE", "ident": "default(127.0.0.1,,8080)", "value": 1, "flag": "i", "description": "VCL references" }, "VBE.default(127.0.0.1,,8080).happy": { "type": "VBE", "ident": "default(127.0.0.1,,8080)", "value": 0, "flag": "b", "description": "Happy health probes" }, "VBE.default(127.0.0.1,,8080).bereq_hdrbytes": { "type": "VBE", "ident": "default(127.0.0.1,,8080)", "value": 0, "flag": "a", "description": "Request header bytes" }, "VBE.default(127.0.0.1,,8080).bereq_bodybytes": { "type": "VBE", "ident": "default(127.0.0.1,,8080)", "value": 0, "flag": "a", "description": "Request body bytes" }, "VBE.default(127.0.0.1,,8080).beresp_hdrbytes": { "type": "VBE", "ident": "default(127.0.0.1,,8080)", "value": 0, "flag": "a", "description": "Response header bytes" }, "VBE.default(127.0.0.1,,8080).beresp_bodybytes": { "type": "VBE", "ident": "default(127.0.0.1,,8080)", "value": 0, "flag": "a", "description": "Response body bytes" }, "VBE.default(127.0.0.1,,8080).pipe_hdrbytes": { "type": "VBE", "ident": "default(127.0.0.1,,8080)", "value": 0, "flag": "a", "description": "Pipe request header bytes" }, "VBE.default(127.0.0.1,,8080).pipe_out": { "type": "VBE", "ident": "default(127.0.0.1,,8080)", "value": 0, "flag": "a", "description": "Piped bytes to backend" }, "VBE.default(127.0.0.1,,8080).pipe_in": { "type": "VBE", "ident": "default(127.0.0.1,,8080)", "value": 0, "flag": "a", "description": "Piped bytes from backend" }, "LCK.sms.creat": { "type": "LCK", "ident": "sms", "value": 0, "flag": "a", "description": "Created locks" }, "LCK.sms.destroy": { "type": "LCK", "ident": "sms", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.sms.locks": { "type": "LCK", "ident": "sms", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.smp.creat": { "type": "LCK", "ident": "smp", "value": 0, "flag": "a", "description": "Created locks" }, "LCK.smp.destroy": { "type": "LCK", "ident": "smp", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.smp.locks": { "type": "LCK", "ident": "smp", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.sma.creat": { "type": "LCK", "ident": "sma", "value": 2, "flag": "a", "description": "Created locks" }, "LCK.sma.destroy": { "type": "LCK", "ident": "sma", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.sma.locks": { "type": "LCK", "ident": "sma", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.smf.creat": { "type": "LCK", "ident": "smf", "value": 0, "flag": "a", "description": "Created locks" }, "LCK.smf.destroy": { "type": "LCK", "ident": "smf", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.smf.locks": { "type": "LCK", "ident": "smf", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.hsl.creat": { "type": "LCK", "ident": "hsl", "value": 0, "flag": "a", "description": "Created locks" }, "LCK.hsl.destroy": { "type": "LCK", "ident": "hsl", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.hsl.locks": { "type": "LCK", "ident": "hsl", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.hcb.creat": { "type": "LCK", "ident": "hcb", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.hcb.destroy": { "type": "LCK", "ident": "hcb", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.hcb.locks": { "type": "LCK", "ident": "hcb", "value": 1, "flag": "a", "description": "Lock Operations" }, "LCK.hcl.creat": { "type": "LCK", "ident": "hcl", "value": 0, "flag": "a", "description": "Created locks" }, "LCK.hcl.destroy": { "type": "LCK", "ident": "hcl", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.hcl.locks": { "type": "LCK", "ident": "hcl", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.vcl.creat": { "type": "LCK", "ident": "vcl", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.vcl.destroy": { "type": "LCK", "ident": "vcl", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.vcl.locks": { "type": "LCK", "ident": "vcl", "value": 2, "flag": "a", "description": "Lock Operations" }, "LCK.sessmem.creat": { "type": "LCK", "ident": "sessmem", "value": 0, "flag": "a", "description": "Created locks" }, "LCK.sessmem.destroy": { "type": "LCK", "ident": "sessmem", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.sessmem.locks": { "type": "LCK", "ident": "sessmem", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.sess.creat": { "type": "LCK", "ident": "sess", "value": 0, "flag": "a", "description": "Created locks" }, "LCK.sess.destroy": { "type": "LCK", "ident": "sess", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.sess.locks": { "type": "LCK", "ident": "sess", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.wstat.creat": { "type": "LCK", "ident": "wstat", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.wstat.destroy": { "type": "LCK", "ident": "wstat", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.wstat.locks": { "type": "LCK", "ident": "wstat", "value": 2, "flag": "a", "description": "Lock Operations" }, "LCK.herder.creat": { "type": "LCK", "ident": "herder", "value": 0, "flag": "a", "description": "Created locks" }, "LCK.herder.destroy": { "type": "LCK", "ident": "herder", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.herder.locks": { "type": "LCK", "ident": "herder", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.wq.creat": { "type": "LCK", "ident": "wq", "value": 3, "flag": "a", "description": "Created locks" }, "LCK.wq.destroy": { "type": "LCK", "ident": "wq", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.wq.locks": { "type": "LCK", "ident": "wq", "value": 404, "flag": "a", "description": "Lock Operations" }, "LCK.objhdr.creat": { "type": "LCK", "ident": "objhdr", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.objhdr.destroy": { "type": "LCK", "ident": "objhdr", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.objhdr.locks": { "type": "LCK", "ident": "objhdr", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.exp.creat": { "type": "LCK", "ident": "exp", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.exp.destroy": { "type": "LCK", "ident": "exp", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.exp.locks": { "type": "LCK", "ident": "exp", "value": 2, "flag": "a", "description": "Lock Operations" }, "LCK.lru.creat": { "type": "LCK", "ident": "lru", "value": 2, "flag": "a", "description": "Created locks" }, "LCK.lru.destroy": { "type": "LCK", "ident": "lru", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.lru.locks": { "type": "LCK", "ident": "lru", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.cli.creat": { "type": "LCK", "ident": "cli", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.cli.destroy": { "type": "LCK", "ident": "cli", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.cli.locks": { "type": "LCK", "ident": "cli", "value": 14, "flag": "a", "description": "Lock Operations" }, "LCK.ban.creat": { "type": "LCK", "ident": "ban", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.ban.destroy": { "type": "LCK", "ident": "ban", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.ban.locks": { "type": "LCK", "ident": "ban", "value": 7, "flag": "a", "description": "Lock Operations" }, "LCK.vbp.creat": { "type": "LCK", "ident": "vbp", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.vbp.destroy": { "type": "LCK", "ident": "vbp", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.vbp.locks": { "type": "LCK", "ident": "vbp", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.backend.creat": { "type": "LCK", "ident": "backend", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.backend.destroy": { "type": "LCK", "ident": "backend", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.backend.locks": { "type": "LCK", "ident": "backend", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.vcapace.creat": { "type": "LCK", "ident": "vcapace", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.vcapace.destroy": { "type": "LCK", "ident": "vcapace", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.vcapace.locks": { "type": "LCK", "ident": "vcapace", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.nbusyobj.creat": { "type": "LCK", "ident": "nbusyobj", "value": 0, "flag": "a", "description": "Created locks" }, "LCK.nbusyobj.destroy": { "type": "LCK", "ident": "nbusyobj", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.nbusyobj.locks": { "type": "LCK", "ident": "nbusyobj", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.busyobj.creat": { "type": "LCK", "ident": "busyobj", "value": 0, "flag": "a", "description": "Created locks" }, "LCK.busyobj.destroy": { "type": "LCK", "ident": "busyobj", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.busyobj.locks": { "type": "LCK", "ident": "busyobj", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.mempool.creat": { "type": "LCK", "ident": "mempool", "value": 6, "flag": "a", "description": "Created locks" }, "LCK.mempool.destroy": { "type": "LCK", "ident": "mempool", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.mempool.locks": { "type": "LCK", "ident": "mempool", "value": 60, "flag": "a", "description": "Lock Operations" }, "LCK.vxid.creat": { "type": "LCK", "ident": "vxid", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.vxid.destroy": { "type": "LCK", "ident": "vxid", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.vxid.locks": { "type": "LCK", "ident": "vxid", "value": 0, "flag": "a", "description": "Lock Operations" }, "LCK.pipestat.creat": { "type": "LCK", "ident": "pipestat", "value": 1, "flag": "a", "description": "Created locks" }, "LCK.pipestat.destroy": { "type": "LCK", "ident": "pipestat", "value": 0, "flag": "a", "description": "Destroyed locks" }, "LCK.pipestat.locks": { "type": "LCK", "ident": "pipestat", "value": 0, "flag": "a", "description": "Lock Operations" } }prometheus_varnish_exporter-1.5.2/test/scrape/4.1.1.json000066400000000000000000001154721355530155200232020ustar00rootroot00000000000000{ "timestamp": "2017-10-07T16:11:13", "MAIN.uptime": { "description": "Child process uptime", "type": "MAIN", "flag": "c", "format": "d", "value": 12540 }, "MAIN.sess_conn": { "description": "Sessions accepted", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_drop": { "description": "Sessions dropped", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_fail": { "description": "Session accept failures", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.client_req_400": { "description": "Client requests received, subject to 400 errors", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.client_req_417": { "description": "Client requests received, subject to 417 errors", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.client_req": { "description": "Good client requests received", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.cache_hit": { "description": "Cache hits", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.cache_hitpass": { "description": "Cache hits for pass", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.cache_miss": { "description": "Cache misses", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_conn": { "description": "Backend conn. success", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_unhealthy": { "description": "Backend conn. not attempted", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_busy": { "description": "Backend conn. too many", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_fail": { "description": "Backend conn. failures", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_reuse": { "description": "Backend conn. reuses", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_recycle": { "description": "Backend conn. recycles", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_retry": { "description": "Backend conn. retry", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_head": { "description": "Fetch no body (HEAD)", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_length": { "description": "Fetch with Length", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_chunked": { "description": "Fetch chunked", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_eof": { "description": "Fetch EOF", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_bad": { "description": "Fetch bad T-E", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_none": { "description": "Fetch no body", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_1xx": { "description": "Fetch no body (1xx)", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_204": { "description": "Fetch no body (204)", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_304": { "description": "Fetch no body (304)", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_failed": { "description": "Fetch failed (all causes)", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_no_thread": { "description": "Fetch failed (no thread)", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.pools": { "description": "Number of thread pools", "type": "MAIN", "flag": "g", "format": "i", "value": 2 }, "MAIN.threads": { "description": "Total number of threads", "type": "MAIN", "flag": "g", "format": "i", "value": 200 }, "MAIN.threads_limited": { "description": "Threads hit max", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.threads_created": { "description": "Threads created", "type": "MAIN", "flag": "c", "format": "i", "value": 200 }, "MAIN.threads_destroyed": { "description": "Threads destroyed", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.threads_failed": { "description": "Thread creation failed", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.thread_queue_len": { "description": "Length of session queue", "type": "MAIN", "flag": "g", "format": "i", "value": 0 }, "MAIN.busy_sleep": { "description": "Number of requests sent to sleep on busy objhdr", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.busy_wakeup": { "description": "Number of requests woken after sleep on busy objhdr", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.busy_killed": { "description": "Number of requests killed after sleep on busy objhdr", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_queued": { "description": "Sessions queued for thread", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_dropped": { "description": "Sessions dropped for thread", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.n_object": { "description": "object structs made", "type": "MAIN", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_vampireobject": { "description": "unresurrected objects", "type": "MAIN", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_objectcore": { "description": "objectcore structs made", "type": "MAIN", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_objecthead": { "description": "objecthead structs made", "type": "MAIN", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_waitinglist": { "description": "waitinglist structs made", "type": "MAIN", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_backend": { "description": "Number of backends", "type": "MAIN", "flag": "g", "format": "i", "value": 1 }, "MAIN.n_expired": { "description": "Number of expired objects", "type": "MAIN", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_lru_nuked": { "description": "Number of LRU nuked objects", "type": "MAIN", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_lru_moved": { "description": "Number of LRU moved objects", "type": "MAIN", "flag": "g", "format": "i", "value": 0 }, "MAIN.losthdr": { "description": "HTTP header overflows", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_sess": { "description": "Total sessions seen", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_req": { "description": "Total requests seen", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_pipe": { "description": "Total pipe sessions seen", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_pass": { "description": "Total pass-ed requests seen", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_fetch": { "description": "Total backend fetches initiated", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_synth": { "description": "Total synthethic responses made", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_req_hdrbytes": { "description": "Request header bytes", "type": "MAIN", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_req_bodybytes": { "description": "Request body bytes", "type": "MAIN", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_resp_hdrbytes": { "description": "Response header bytes", "type": "MAIN", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_resp_bodybytes": { "description": "Response body bytes", "type": "MAIN", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_pipe_hdrbytes": { "description": "Pipe request header bytes", "type": "MAIN", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_pipe_in": { "description": "Piped bytes from client", "type": "MAIN", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_pipe_out": { "description": "Piped bytes to client", "type": "MAIN", "flag": "c", "format": "B", "value": 0 }, "MAIN.sess_closed": { "description": "Session Closed", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_closed_err": { "description": "Session Closed with error", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_readahead": { "description": "Session Read Ahead", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_herd": { "description": "Session herd", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rem_close": { "description": "Session OK REM_CLOSE", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_req_close": { "description": "Session OK REQ_CLOSE", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_req_http10": { "description": "Session Err REQ_HTTP10", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rx_bad": { "description": "Session Err RX_BAD", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rx_body": { "description": "Session Err RX_BODY", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rx_junk": { "description": "Session Err RX_JUNK", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rx_overflow": { "description": "Session Err RX_OVERFLOW", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rx_timeout": { "description": "Session Err RX_TIMEOUT", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_tx_pipe": { "description": "Session OK TX_PIPE", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_tx_error": { "description": "Session Err TX_ERROR", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_tx_eof": { "description": "Session OK TX_EOF", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_resp_close": { "description": "Session OK RESP_CLOSE", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_overload": { "description": "Session Err OVERLOAD", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_pipe_overflow": { "description": "Session Err PIPE_OVERFLOW", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_range_short": { "description": "Session Err RANGE_SHORT", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.shm_records": { "description": "SHM records", "type": "MAIN", "flag": "c", "format": "i", "value": 8364 }, "MAIN.shm_writes": { "description": "SHM writes", "type": "MAIN", "flag": "c", "format": "i", "value": 8364 }, "MAIN.shm_flushes": { "description": "SHM flushes due to overflow", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.shm_cont": { "description": "SHM MTX contention", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.shm_cycles": { "description": "SHM cycles through buffer", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_req": { "description": "Backend requests made", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.n_vcl": { "description": "Number of loaded VCLs in total", "type": "MAIN", "flag": "c", "format": "i", "value": 1 }, "MAIN.n_vcl_avail": { "description": "Number of VCLs available", "type": "MAIN", "flag": "c", "format": "i", "value": 1 }, "MAIN.n_vcl_discard": { "description": "Number of discarded VCLs", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans": { "description": "Count of bans", "type": "MAIN", "flag": "g", "format": "i", "value": 1 }, "MAIN.bans_completed": { "description": "Number of bans marked 'completed'", "type": "MAIN", "flag": "g", "format": "i", "value": 1 }, "MAIN.bans_obj": { "description": "Number of bans using obj.*", "type": "MAIN", "flag": "g", "format": "i", "value": 0 }, "MAIN.bans_req": { "description": "Number of bans using req.*", "type": "MAIN", "flag": "g", "format": "i", "value": 0 }, "MAIN.bans_added": { "description": "Bans added", "type": "MAIN", "flag": "c", "format": "i", "value": 1 }, "MAIN.bans_deleted": { "description": "Bans deleted", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_tested": { "description": "Bans tested against objects (lookup)", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_obj_killed": { "description": "Objects killed by bans (lookup)", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_lurker_tested": { "description": "Bans tested against objects (lurker)", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_tests_tested": { "description": "Ban tests tested against objects (lookup)", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_lurker_tests_tested": { "description": "Ban tests tested against objects (lurker)", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_lurker_obj_killed": { "description": "Objects killed by bans (lurker)", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_dups": { "description": "Bans superseded by other bans", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_lurker_contention": { "description": "Lurker gave way for lookup", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_persisted_bytes": { "description": "Bytes used by the persisted ban lists", "type": "MAIN", "flag": "g", "format": "B", "value": 16 }, "MAIN.bans_persisted_fragmentation": { "description": "Extra bytes in persisted ban lists due to fragmentation", "type": "MAIN", "flag": "g", "format": "B", "value": 0 }, "MAIN.n_purges": { "description": "Number of purge operations executed", "type": "MAIN", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_obj_purged": { "description": "Number of purged objects", "type": "MAIN", "flag": "g", "format": "i", "value": 0 }, "MAIN.exp_mailed": { "description": "Number of objects mailed to expiry thread", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.exp_received": { "description": "Number of objects received by expiry thread", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.hcb_nolock": { "description": "HCB Lookups without lock", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.hcb_lock": { "description": "HCB Lookups with lock", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.hcb_insert": { "description": "HCB Inserts", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.esi_errors": { "description": "ESI parse errors (unlock)", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.esi_warnings": { "description": "ESI parse warnings (unlock)", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.vmods": { "description": "Loaded VMODs", "type": "MAIN", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_gzip": { "description": "Gzip operations", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.n_gunzip": { "description": "Gunzip operations", "type": "MAIN", "flag": "c", "format": "i", "value": 0 }, "MAIN.vsm_free": { "description": "Free VSM space", "type": "MAIN", "flag": "g", "format": "B", "value": 973760 }, "MAIN.vsm_used": { "description": "Used VSM space", "type": "MAIN", "flag": "g", "format": "B", "value": 83960848 }, "MAIN.vsm_cooling": { "description": "Cooling VSM space", "type": "MAIN", "flag": "g", "format": "B", "value": 0 }, "MAIN.vsm_overflow": { "description": "Overflow VSM space", "type": "MAIN", "flag": "g", "format": "B", "value": 0 }, "MAIN.vsm_overflowed": { "description": "Overflowed VSM space", "type": "MAIN", "flag": "c", "format": "B", "value": 0 }, "MGT.uptime": { "description": "Management process uptime", "type": "MGT", "flag": "c", "format": "d", "value": 12539 }, "MGT.child_start": { "description": "Child process started", "type": "MGT", "flag": "c", "format": "i", "value": 1 }, "MGT.child_exit": { "description": "Child process normal exit", "type": "MGT", "flag": "c", "format": "i", "value": 0 }, "MGT.child_stop": { "description": "Child process unexpected exit", "type": "MGT", "flag": "c", "format": "i", "value": 0 }, "MGT.child_died": { "description": "Child process died (signal)", "type": "MGT", "flag": "c", "format": "i", "value": 0 }, "MGT.child_dump": { "description": "Child process core dumped", "type": "MGT", "flag": "c", "format": "i", "value": 0 }, "MGT.child_panic": { "description": "Child process panic", "type": "MGT", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.live": { "description": "In use", "type": "MEMPOOL", "ident": "busyobj", "flag": "g", "format": "i", "value": 0 }, "MEMPOOL.busyobj.pool": { "description": "In Pool", "type": "MEMPOOL", "ident": "busyobj", "flag": "g", "format": "i", "value": 10 }, "MEMPOOL.busyobj.sz_wanted": { "description": "Size requested", "type": "MEMPOOL", "ident": "busyobj", "flag": "g", "format": "B", "value": 65536 }, "MEMPOOL.busyobj.sz_actual": { "description": "Size allocated", "type": "MEMPOOL", "ident": "busyobj", "flag": "g", "format": "B", "value": 65504 }, "MEMPOOL.busyobj.allocs": { "description": "Allocations", "type": "MEMPOOL", "ident": "busyobj", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.frees": { "description": "Frees", "type": "MEMPOOL", "ident": "busyobj", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.recycle": { "description": "Recycled from pool", "type": "MEMPOOL", "ident": "busyobj", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.timeout": { "description": "Timed out from pool", "type": "MEMPOOL", "ident": "busyobj", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.toosmall": { "description": "Too small to recycle", "type": "MEMPOOL", "ident": "busyobj", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.surplus": { "description": "Too many for pool", "type": "MEMPOOL", "ident": "busyobj", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.randry": { "description": "Pool ran dry", "type": "MEMPOOL", "ident": "busyobj", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.live": { "description": "In use", "type": "MEMPOOL", "ident": "req0", "flag": "g", "format": "i", "value": 0 }, "MEMPOOL.req0.pool": { "description": "In Pool", "type": "MEMPOOL", "ident": "req0", "flag": "g", "format": "i", "value": 10 }, "MEMPOOL.req0.sz_wanted": { "description": "Size requested", "type": "MEMPOOL", "ident": "req0", "flag": "g", "format": "B", "value": 65536 }, "MEMPOOL.req0.sz_actual": { "description": "Size allocated", "type": "MEMPOOL", "ident": "req0", "flag": "g", "format": "B", "value": 65504 }, "MEMPOOL.req0.allocs": { "description": "Allocations", "type": "MEMPOOL", "ident": "req0", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.frees": { "description": "Frees", "type": "MEMPOOL", "ident": "req0", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.recycle": { "description": "Recycled from pool", "type": "MEMPOOL", "ident": "req0", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.timeout": { "description": "Timed out from pool", "type": "MEMPOOL", "ident": "req0", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.toosmall": { "description": "Too small to recycle", "type": "MEMPOOL", "ident": "req0", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.surplus": { "description": "Too many for pool", "type": "MEMPOOL", "ident": "req0", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.randry": { "description": "Pool ran dry", "type": "MEMPOOL", "ident": "req0", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.live": { "description": "In use", "type": "MEMPOOL", "ident": "sess0", "flag": "g", "format": "i", "value": 0 }, "MEMPOOL.sess0.pool": { "description": "In Pool", "type": "MEMPOOL", "ident": "sess0", "flag": "g", "format": "i", "value": 10 }, "MEMPOOL.sess0.sz_wanted": { "description": "Size requested", "type": "MEMPOOL", "ident": "sess0", "flag": "g", "format": "B", "value": 512 }, "MEMPOOL.sess0.sz_actual": { "description": "Size allocated", "type": "MEMPOOL", "ident": "sess0", "flag": "g", "format": "B", "value": 480 }, "MEMPOOL.sess0.allocs": { "description": "Allocations", "type": "MEMPOOL", "ident": "sess0", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.frees": { "description": "Frees", "type": "MEMPOOL", "ident": "sess0", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.recycle": { "description": "Recycled from pool", "type": "MEMPOOL", "ident": "sess0", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.timeout": { "description": "Timed out from pool", "type": "MEMPOOL", "ident": "sess0", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.toosmall": { "description": "Too small to recycle", "type": "MEMPOOL", "ident": "sess0", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.surplus": { "description": "Too many for pool", "type": "MEMPOOL", "ident": "sess0", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.randry": { "description": "Pool ran dry", "type": "MEMPOOL", "ident": "sess0", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.live": { "description": "In use", "type": "MEMPOOL", "ident": "req1", "flag": "g", "format": "i", "value": 0 }, "MEMPOOL.req1.pool": { "description": "In Pool", "type": "MEMPOOL", "ident": "req1", "flag": "g", "format": "i", "value": 10 }, "MEMPOOL.req1.sz_wanted": { "description": "Size requested", "type": "MEMPOOL", "ident": "req1", "flag": "g", "format": "B", "value": 65536 }, "MEMPOOL.req1.sz_actual": { "description": "Size allocated", "type": "MEMPOOL", "ident": "req1", "flag": "g", "format": "B", "value": 65504 }, "MEMPOOL.req1.allocs": { "description": "Allocations", "type": "MEMPOOL", "ident": "req1", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.frees": { "description": "Frees", "type": "MEMPOOL", "ident": "req1", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.recycle": { "description": "Recycled from pool", "type": "MEMPOOL", "ident": "req1", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.timeout": { "description": "Timed out from pool", "type": "MEMPOOL", "ident": "req1", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.toosmall": { "description": "Too small to recycle", "type": "MEMPOOL", "ident": "req1", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.surplus": { "description": "Too many for pool", "type": "MEMPOOL", "ident": "req1", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.randry": { "description": "Pool ran dry", "type": "MEMPOOL", "ident": "req1", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.live": { "description": "In use", "type": "MEMPOOL", "ident": "sess1", "flag": "g", "format": "i", "value": 0 }, "MEMPOOL.sess1.pool": { "description": "In Pool", "type": "MEMPOOL", "ident": "sess1", "flag": "g", "format": "i", "value": 10 }, "MEMPOOL.sess1.sz_wanted": { "description": "Size requested", "type": "MEMPOOL", "ident": "sess1", "flag": "g", "format": "B", "value": 512 }, "MEMPOOL.sess1.sz_actual": { "description": "Size allocated", "type": "MEMPOOL", "ident": "sess1", "flag": "g", "format": "B", "value": 480 }, "MEMPOOL.sess1.allocs": { "description": "Allocations", "type": "MEMPOOL", "ident": "sess1", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.frees": { "description": "Frees", "type": "MEMPOOL", "ident": "sess1", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.recycle": { "description": "Recycled from pool", "type": "MEMPOOL", "ident": "sess1", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.timeout": { "description": "Timed out from pool", "type": "MEMPOOL", "ident": "sess1", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.toosmall": { "description": "Too small to recycle", "type": "MEMPOOL", "ident": "sess1", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.surplus": { "description": "Too many for pool", "type": "MEMPOOL", "ident": "sess1", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.randry": { "description": "Pool ran dry", "type": "MEMPOOL", "ident": "sess1", "flag": "c", "format": "i", "value": 0 }, "SMA.s0.c_req": { "description": "Allocator requests", "type": "SMA", "ident": "s0", "flag": "c", "format": "i", "value": 0 }, "SMA.s0.c_fail": { "description": "Allocator failures", "type": "SMA", "ident": "s0", "flag": "c", "format": "i", "value": 0 }, "SMA.s0.c_bytes": { "description": "Bytes allocated", "type": "SMA", "ident": "s0", "flag": "c", "format": "B", "value": 0 }, "SMA.s0.c_freed": { "description": "Bytes freed", "type": "SMA", "ident": "s0", "flag": "c", "format": "B", "value": 0 }, "SMA.s0.g_alloc": { "description": "Allocations outstanding", "type": "SMA", "ident": "s0", "flag": "g", "format": "i", "value": 0 }, "SMA.s0.g_bytes": { "description": "Bytes outstanding", "type": "SMA", "ident": "s0", "flag": "g", "format": "B", "value": 0 }, "SMA.s0.g_space": { "description": "Bytes available", "type": "SMA", "ident": "s0", "flag": "g", "format": "B", "value": 268435456 }, "SMA.Transient.c_req": { "description": "Allocator requests", "type": "SMA", "ident": "Transient", "flag": "c", "format": "i", "value": 0 }, "SMA.Transient.c_fail": { "description": "Allocator failures", "type": "SMA", "ident": "Transient", "flag": "c", "format": "i", "value": 0 }, "SMA.Transient.c_bytes": { "description": "Bytes allocated", "type": "SMA", "ident": "Transient", "flag": "c", "format": "B", "value": 0 }, "SMA.Transient.c_freed": { "description": "Bytes freed", "type": "SMA", "ident": "Transient", "flag": "c", "format": "B", "value": 0 }, "SMA.Transient.g_alloc": { "description": "Allocations outstanding", "type": "SMA", "ident": "Transient", "flag": "g", "format": "i", "value": 0 }, "SMA.Transient.g_bytes": { "description": "Bytes outstanding", "type": "SMA", "ident": "Transient", "flag": "g", "format": "B", "value": 0 }, "SMA.Transient.g_space": { "description": "Bytes available", "type": "SMA", "ident": "Transient", "flag": "g", "format": "B", "value": 0 }, "VBE.boot.default.happy": { "description": "Happy health probes", "type": "VBE", "ident": "boot.default", "flag": "b", "format": "b", "value": 0 }, "VBE.boot.default.bereq_hdrbytes": { "description": "Request header bytes", "type": "VBE", "ident": "boot.default", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.default.bereq_bodybytes": { "description": "Request body bytes", "type": "VBE", "ident": "boot.default", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.default.beresp_hdrbytes": { "description": "Response header bytes", "type": "VBE", "ident": "boot.default", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.default.beresp_bodybytes": { "description": "Response body bytes", "type": "VBE", "ident": "boot.default", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.default.pipe_hdrbytes": { "description": "Pipe request header bytes", "type": "VBE", "ident": "boot.default", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.default.pipe_out": { "description": "Piped bytes to backend", "type": "VBE", "ident": "boot.default", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.default.pipe_in": { "description": "Piped bytes from backend", "type": "VBE", "ident": "boot.default", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.default.conn": { "description": "Concurrent connections to backend", "type": "VBE", "ident": "boot.default", "flag": "g", "format": "i", "value": 0 }, "VBE.boot.default.req": { "description": "Backend requests sent", "type": "VBE", "ident": "boot.default", "flag": "c", "format": "i", "value": 0 }, "LCK.backend.creat": { "description": "Created locks", "type": "LCK", "ident": "backend", "flag": "c", "format": "i", "value": 2 }, "LCK.backend.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "backend", "flag": "c", "format": "i", "value": 0 }, "LCK.backend.locks": { "description": "Lock Operations", "type": "LCK", "ident": "backend", "flag": "c", "format": "i", "value": 1 }, "LCK.backend_tcp.creat": { "description": "Created locks", "type": "LCK", "ident": "backend_tcp", "flag": "c", "format": "i", "value": 1 }, "LCK.backend_tcp.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "backend_tcp", "flag": "c", "format": "i", "value": 0 }, "LCK.backend_tcp.locks": { "description": "Lock Operations", "type": "LCK", "ident": "backend_tcp", "flag": "c", "format": "i", "value": 0 }, "LCK.ban.creat": { "description": "Created locks", "type": "LCK", "ident": "ban", "flag": "c", "format": "i", "value": 1 }, "LCK.ban.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "ban", "flag": "c", "format": "i", "value": 0 }, "LCK.ban.locks": { "description": "Lock Operations", "type": "LCK", "ident": "ban", "flag": "c", "format": "i", "value": 1020 }, "LCK.busyobj.creat": { "description": "Created locks", "type": "LCK", "ident": "busyobj", "flag": "c", "format": "i", "value": 0 }, "LCK.busyobj.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "busyobj", "flag": "c", "format": "i", "value": 0 }, "LCK.busyobj.locks": { "description": "Lock Operations", "type": "LCK", "ident": "busyobj", "flag": "c", "format": "i", "value": 0 }, "LCK.cli.creat": { "description": "Created locks", "type": "LCK", "ident": "cli", "flag": "c", "format": "i", "value": 1 }, "LCK.cli.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "cli", "flag": "c", "format": "i", "value": 0 }, "LCK.cli.locks": { "description": "Lock Operations", "type": "LCK", "ident": "cli", "flag": "c", "format": "i", "value": 4193 }, "LCK.exp.creat": { "description": "Created locks", "type": "LCK", "ident": "exp", "flag": "c", "format": "i", "value": 1 }, "LCK.exp.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "exp", "flag": "c", "format": "i", "value": 0 }, "LCK.exp.locks": { "description": "Lock Operations", "type": "LCK", "ident": "exp", "flag": "c", "format": "i", "value": 3993 }, "LCK.hcb.creat": { "description": "Created locks", "type": "LCK", "ident": "hcb", "flag": "c", "format": "i", "value": 1 }, "LCK.hcb.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "hcb", "flag": "c", "format": "i", "value": 0 }, "LCK.hcb.locks": { "description": "Lock Operations", "type": "LCK", "ident": "hcb", "flag": "c", "format": "i", "value": 70 }, "LCK.lru.creat": { "description": "Created locks", "type": "LCK", "ident": "lru", "flag": "c", "format": "i", "value": 2 }, "LCK.lru.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "lru", "flag": "c", "format": "i", "value": 0 }, "LCK.lru.locks": { "description": "Lock Operations", "type": "LCK", "ident": "lru", "flag": "c", "format": "i", "value": 0 }, "LCK.mempool.creat": { "description": "Created locks", "type": "LCK", "ident": "mempool", "flag": "c", "format": "i", "value": 5 }, "LCK.mempool.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "mempool", "flag": "c", "format": "i", "value": 0 }, "LCK.mempool.locks": { "description": "Lock Operations", "type": "LCK", "ident": "mempool", "flag": "c", "format": "i", "value": 53891 }, "LCK.objhdr.creat": { "description": "Created locks", "type": "LCK", "ident": "objhdr", "flag": "c", "format": "i", "value": 1 }, "LCK.objhdr.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "objhdr", "flag": "c", "format": "i", "value": 0 }, "LCK.objhdr.locks": { "description": "Lock Operations", "type": "LCK", "ident": "objhdr", "flag": "c", "format": "i", "value": 0 }, "LCK.pipestat.creat": { "description": "Created locks", "type": "LCK", "ident": "pipestat", "flag": "c", "format": "i", "value": 1 }, "LCK.pipestat.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "pipestat", "flag": "c", "format": "i", "value": 0 }, "LCK.pipestat.locks": { "description": "Lock Operations", "type": "LCK", "ident": "pipestat", "flag": "c", "format": "i", "value": 0 }, "LCK.sess.creat": { "description": "Created locks", "type": "LCK", "ident": "sess", "flag": "c", "format": "i", "value": 0 }, "LCK.sess.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "sess", "flag": "c", "format": "i", "value": 0 }, "LCK.sess.locks": { "description": "Lock Operations", "type": "LCK", "ident": "sess", "flag": "c", "format": "i", "value": 0 }, "LCK.smp.creat": { "description": "Created locks", "type": "LCK", "ident": "smp", "flag": "c", "format": "i", "value": 0 }, "LCK.smp.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "smp", "flag": "c", "format": "i", "value": 0 }, "LCK.smp.locks": { "description": "Lock Operations", "type": "LCK", "ident": "smp", "flag": "c", "format": "i", "value": 0 }, "LCK.vbe.creat": { "description": "Created locks", "type": "LCK", "ident": "vbe", "flag": "c", "format": "i", "value": 1 }, "LCK.vbe.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "vbe", "flag": "c", "format": "i", "value": 0 }, "LCK.vbe.locks": { "description": "Lock Operations", "type": "LCK", "ident": "vbe", "flag": "c", "format": "i", "value": 4183 }, "LCK.vcapace.creat": { "description": "Created locks", "type": "LCK", "ident": "vcapace", "flag": "c", "format": "i", "value": 1 }, "LCK.vcapace.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "vcapace", "flag": "c", "format": "i", "value": 0 }, "LCK.vcapace.locks": { "description": "Lock Operations", "type": "LCK", "ident": "vcapace", "flag": "c", "format": "i", "value": 0 }, "LCK.vcl.creat": { "description": "Created locks", "type": "LCK", "ident": "vcl", "flag": "c", "format": "i", "value": 1 }, "LCK.vcl.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "vcl", "flag": "c", "format": "i", "value": 0 }, "LCK.vcl.locks": { "description": "Lock Operations", "type": "LCK", "ident": "vcl", "flag": "c", "format": "i", "value": 3 }, "LCK.vxid.creat": { "description": "Created locks", "type": "LCK", "ident": "vxid", "flag": "c", "format": "i", "value": 1 }, "LCK.vxid.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "vxid", "flag": "c", "format": "i", "value": 0 }, "LCK.vxid.locks": { "description": "Lock Operations", "type": "LCK", "ident": "vxid", "flag": "c", "format": "i", "value": 0 }, "LCK.waiter.creat": { "description": "Created locks", "type": "LCK", "ident": "waiter", "flag": "c", "format": "i", "value": 2 }, "LCK.waiter.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "waiter", "flag": "c", "format": "i", "value": 0 }, "LCK.waiter.locks": { "description": "Lock Operations", "type": "LCK", "ident": "waiter", "flag": "c", "format": "i", "value": 252 }, "LCK.wq.creat": { "description": "Created locks", "type": "LCK", "ident": "wq", "flag": "c", "format": "i", "value": 3 }, "LCK.wq.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "wq", "flag": "c", "format": "i", "value": 0 }, "LCK.wq.locks": { "description": "Lock Operations", "type": "LCK", "ident": "wq", "flag": "c", "format": "i", "value": 17963 }, "LCK.wstat.creat": { "description": "Created locks", "type": "LCK", "ident": "wstat", "flag": "c", "format": "i", "value": 1 }, "LCK.wstat.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "wstat", "flag": "c", "format": "i", "value": 0 }, "LCK.wstat.locks": { "description": "Lock Operations", "type": "LCK", "ident": "wstat", "flag": "c", "format": "i", "value": 4062 }, "LCK.sma.creat": { "description": "Created locks", "type": "LCK", "ident": "sma", "flag": "c", "format": "i", "value": 2 }, "LCK.sma.destroy": { "description": "Destroyed locks", "type": "LCK", "ident": "sma", "flag": "c", "format": "i", "value": 0 }, "LCK.sma.locks": { "description": "Lock Operations", "type": "LCK", "ident": "sma", "flag": "c", "format": "i", "value": 0 } } prometheus_varnish_exporter-1.5.2/test/scrape/5.2.0.json000066400000000000000000000773401355530155200232040ustar00rootroot00000000000000{ "timestamp": "2017-10-07T16:18:42", "MGT.uptime": { "description": "Management process uptime", "flag": "c", "format": "d", "value": 55 }, "MGT.child_start": { "description": "Child process started", "flag": "c", "format": "i", "value": 1 }, "MGT.child_exit": { "description": "Child process normal exit", "flag": "c", "format": "i", "value": 0 }, "MGT.child_stop": { "description": "Child process unexpected exit", "flag": "c", "format": "i", "value": 0 }, "MGT.child_died": { "description": "Child process died (signal)", "flag": "c", "format": "i", "value": 0 }, "MGT.child_dump": { "description": "Child process core dumped", "flag": "c", "format": "i", "value": 0 }, "MGT.child_panic": { "description": "Child process panic", "flag": "c", "format": "i", "value": 0 }, "MAIN.summs": { "description": "stat summ operations", "flag": "c", "format": "i", "value": 0 }, "MAIN.uptime": { "description": "Child process uptime", "flag": "c", "format": "d", "value": 56 }, "MAIN.sess_conn": { "description": "Sessions accepted", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_drop": { "description": "Sessions dropped", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_fail": { "description": "Session accept failures", "flag": "c", "format": "i", "value": 0 }, "MAIN.client_req_400": { "description": "Client requests received, subject to 400 errors", "flag": "c", "format": "i", "value": 0 }, "MAIN.client_req_417": { "description": "Client requests received, subject to 417 errors", "flag": "c", "format": "i", "value": 0 }, "MAIN.client_req": { "description": "Good client requests received", "flag": "c", "format": "i", "value": 0 }, "MAIN.cache_hit": { "description": "Cache hits", "flag": "c", "format": "i", "value": 0 }, "MAIN.cache_hitpass": { "description": "Cache hits for pass.", "flag": "c", "format": "i", "value": 0 }, "MAIN.cache_hitmiss": { "description": "Cache hits for miss.", "flag": "c", "format": "i", "value": 0 }, "MAIN.cache_miss": { "description": "Cache misses", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_conn": { "description": "Backend conn. success", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_unhealthy": { "description": "Backend conn. not attempted", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_busy": { "description": "Backend conn. too many", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_fail": { "description": "Backend conn. failures", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_reuse": { "description": "Backend conn. reuses", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_recycle": { "description": "Backend conn. recycles", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_retry": { "description": "Backend conn. retry", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_head": { "description": "Fetch no body (HEAD)", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_length": { "description": "Fetch with Length", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_chunked": { "description": "Fetch chunked", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_eof": { "description": "Fetch EOF", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_bad": { "description": "Fetch bad T-E", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_none": { "description": "Fetch no body", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_1xx": { "description": "Fetch no body (1xx)", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_204": { "description": "Fetch no body (204)", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_304": { "description": "Fetch no body (304)", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_failed": { "description": "Fetch failed (all causes)", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_no_thread": { "description": "Fetch failed (no thread)", "flag": "c", "format": "i", "value": 0 }, "MAIN.pools": { "description": "Number of thread pools", "flag": "g", "format": "i", "value": 2 }, "MAIN.threads": { "description": "Total number of threads", "flag": "g", "format": "i", "value": 200 }, "MAIN.threads_limited": { "description": "Threads hit max", "flag": "c", "format": "i", "value": 0 }, "MAIN.threads_created": { "description": "Threads created", "flag": "c", "format": "i", "value": 200 }, "MAIN.threads_destroyed": { "description": "Threads destroyed", "flag": "c", "format": "i", "value": 0 }, "MAIN.threads_failed": { "description": "Thread creation failed", "flag": "c", "format": "i", "value": 0 }, "MAIN.thread_queue_len": { "description": "Length of session queue", "flag": "g", "format": "i", "value": 0 }, "MAIN.busy_sleep": { "description": "Number of requests sent to sleep on busy objhdr", "flag": "c", "format": "i", "value": 0 }, "MAIN.busy_wakeup": { "description": "Number of requests woken after sleep on busy objhdr", "flag": "c", "format": "i", "value": 0 }, "MAIN.busy_killed": { "description": "Number of requests killed after sleep on busy objhdr", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_queued": { "description": "Sessions queued for thread", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_dropped": { "description": "Sessions dropped for thread", "flag": "c", "format": "i", "value": 0 }, "MAIN.req_dropped": { "description": "Requests dropped", "flag": "c", "format": "i", "value": 0 }, "MAIN.n_object": { "description": "object structs made", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_vampireobject": { "description": "unresurrected objects", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_objectcore": { "description": "objectcore structs made", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_objecthead": { "description": "objecthead structs made", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_backend": { "description": "Number of backends", "flag": "g", "format": "i", "value": 1 }, "MAIN.n_expired": { "description": "Number of expired objects", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_lru_nuked": { "description": "Number of LRU nuked objects", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_lru_moved": { "description": "Number of LRU moved objects", "flag": "g", "format": "i", "value": 0 }, "MAIN.losthdr": { "description": "HTTP header overflows", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_sess": { "description": "Total sessions seen", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_pipe": { "description": "Total pipe sessions seen", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_pass": { "description": "Total pass-ed requests seen", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_fetch": { "description": "Total backend fetches initiated", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_synth": { "description": "Total synthethic responses made", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_req_hdrbytes": { "description": "Request header bytes", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_req_bodybytes": { "description": "Request body bytes", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_resp_hdrbytes": { "description": "Response header bytes", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_resp_bodybytes": { "description": "Response body bytes", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_pipe_hdrbytes": { "description": "Pipe request header bytes", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_pipe_in": { "description": "Piped bytes from client", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_pipe_out": { "description": "Piped bytes to client", "flag": "c", "format": "B", "value": 0 }, "MAIN.sess_closed": { "description": "Session Closed", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_closed_err": { "description": "Session Closed with error", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_readahead": { "description": "Session Read Ahead", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_herd": { "description": "Session herd", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rem_close": { "description": "Session OK REM_CLOSE", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_req_close": { "description": "Session OK REQ_CLOSE", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_req_http10": { "description": "Session Err REQ_HTTP10", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rx_bad": { "description": "Session Err RX_BAD", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rx_body": { "description": "Session Err RX_BODY", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rx_junk": { "description": "Session Err RX_JUNK", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rx_overflow": { "description": "Session Err RX_OVERFLOW", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rx_timeout": { "description": "Session Err RX_TIMEOUT", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_tx_pipe": { "description": "Session OK TX_PIPE", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_tx_error": { "description": "Session Err TX_ERROR", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_tx_eof": { "description": "Session OK TX_EOF", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_resp_close": { "description": "Session OK RESP_CLOSE", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_overload": { "description": "Session Err OVERLOAD", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_pipe_overflow": { "description": "Session Err PIPE_OVERFLOW", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_range_short": { "description": "Session Err RANGE_SHORT", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_req_http20": { "description": "Session Err REQ_HTTP20", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_vcl_failure": { "description": "Session Err VCL_FAILURE", "flag": "c", "format": "i", "value": 0 }, "MAIN.shm_records": { "description": "SHM records", "flag": "c", "format": "i", "value": 42 }, "MAIN.shm_writes": { "description": "SHM writes", "flag": "c", "format": "i", "value": 42 }, "MAIN.shm_flushes": { "description": "SHM flushes due to overflow", "flag": "c", "format": "i", "value": 0 }, "MAIN.shm_cont": { "description": "SHM MTX contention", "flag": "c", "format": "i", "value": 0 }, "MAIN.shm_cycles": { "description": "SHM cycles through buffer", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_req": { "description": "Backend requests made", "flag": "c", "format": "i", "value": 0 }, "MAIN.n_vcl": { "description": "Number of loaded VCLs in total", "flag": "g", "format": "i", "value": 1 }, "MAIN.n_vcl_avail": { "description": "Number of VCLs available", "flag": "g", "format": "i", "value": 1 }, "MAIN.n_vcl_discard": { "description": "Number of discarded VCLs", "flag": "g", "format": "i", "value": 0 }, "MAIN.vcl_fail": { "description": "VCL failures", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans": { "description": "Count of bans", "flag": "g", "format": "i", "value": 1 }, "MAIN.bans_completed": { "description": "Number of bans marked 'completed'", "flag": "g", "format": "i", "value": 1 }, "MAIN.bans_obj": { "description": "Number of bans using obj.*", "flag": "g", "format": "i", "value": 0 }, "MAIN.bans_req": { "description": "Number of bans using req.*", "flag": "g", "format": "i", "value": 0 }, "MAIN.bans_added": { "description": "Bans added", "flag": "c", "format": "i", "value": 1 }, "MAIN.bans_deleted": { "description": "Bans deleted", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_tested": { "description": "Bans tested against objects (lookup)", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_obj_killed": { "description": "Objects killed by bans (lookup)", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_lurker_tested": { "description": "Bans tested against objects (lurker)", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_tests_tested": { "description": "Ban tests tested against objects (lookup)", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_lurker_tests_tested": { "description": "Ban tests tested against objects (lurker)", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_lurker_obj_killed": { "description": "Objects killed by bans (lurker)", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_lurker_obj_killed_cutoff": { "description": "Objects killed by bans for cutoff (lurker)", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_dups": { "description": "Bans superseded by other bans", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_lurker_contention": { "description": "Lurker gave way for lookup", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_persisted_bytes": { "description": "Bytes used by the persisted ban lists", "flag": "g", "format": "B", "value": 16 }, "MAIN.bans_persisted_fragmentation": { "description": "Extra bytes in persisted ban lists due to fragmentation", "flag": "g", "format": "B", "value": 0 }, "MAIN.n_purges": { "description": "Number of purge operations executed", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_obj_purged": { "description": "Number of purged objects", "flag": "g", "format": "i", "value": 0 }, "MAIN.exp_mailed": { "description": "Number of objects mailed to expiry thread", "flag": "c", "format": "i", "value": 0 }, "MAIN.exp_received": { "description": "Number of objects received by expiry thread", "flag": "c", "format": "i", "value": 0 }, "MAIN.hcb_nolock": { "description": "HCB Lookups without lock", "flag": "c", "format": "i", "value": 0 }, "MAIN.hcb_lock": { "description": "HCB Lookups with lock", "flag": "c", "format": "i", "value": 0 }, "MAIN.hcb_insert": { "description": "HCB Inserts", "flag": "c", "format": "i", "value": 0 }, "MAIN.esi_errors": { "description": "ESI parse errors (unlock)", "flag": "c", "format": "i", "value": 0 }, "MAIN.esi_warnings": { "description": "ESI parse warnings (unlock)", "flag": "c", "format": "i", "value": 0 }, "MAIN.vmods": { "description": "Loaded VMODs", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_gzip": { "description": "Gzip operations", "flag": "c", "format": "i", "value": 0 }, "MAIN.n_gunzip": { "description": "Gunzip operations", "flag": "c", "format": "i", "value": 0 }, "MAIN.n_test_gunzip": { "description": "Test gunzip operations", "flag": "c", "format": "i", "value": 0 }, "LCK.backend.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 3 }, "LCK.backend.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.backend.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 3 }, "LCK.backend_tcp.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.backend_tcp.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.backend_tcp.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 0 }, "LCK.ban.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.ban.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.ban.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 13 }, "LCK.busyobj.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 0 }, "LCK.busyobj.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.busyobj.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 0 }, "LCK.cli.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.cli.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.cli.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 30 }, "LCK.exp.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.exp.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.exp.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 19 }, "LCK.hcb.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.hcb.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.hcb.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 1 }, "LCK.lru.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 2 }, "LCK.lru.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.lru.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 0 }, "LCK.mempool.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 5 }, "LCK.mempool.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.mempool.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 295 }, "LCK.objhdr.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.objhdr.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.objhdr.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 0 }, "LCK.pipestat.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.pipestat.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.pipestat.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 0 }, "LCK.sess.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 0 }, "LCK.sess.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.sess.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 0 }, "LCK.vbe.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.vbe.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.vbe.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 23 }, "LCK.vcapace.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.vcapace.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.vcapace.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 0 }, "LCK.vcl.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.vcl.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.vcl.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 3 }, "LCK.vxid.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.vxid.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.vxid.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 0 }, "LCK.waiter.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 2 }, "LCK.waiter.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.waiter.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 2 }, "LCK.wq.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 3 }, "LCK.wq.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.wq.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 464 }, "LCK.wstat.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.wstat.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.wstat.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 21 }, "MEMPOOL.busyobj.live": { "description": "In use", "flag": "g", "format": "i", "value": 0 }, "MEMPOOL.busyobj.pool": { "description": "In Pool", "flag": "g", "format": "i", "value": 10 }, "MEMPOOL.busyobj.sz_wanted": { "description": "Size requested", "flag": "g", "format": "B", "value": 65536 }, "MEMPOOL.busyobj.sz_actual": { "description": "Size allocated", "flag": "g", "format": "B", "value": 65504 }, "MEMPOOL.busyobj.allocs": { "description": "Allocations", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.frees": { "description": "Frees", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.recycle": { "description": "Recycled from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.timeout": { "description": "Timed out from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.toosmall": { "description": "Too small to recycle", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.surplus": { "description": "Too many for pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.randry": { "description": "Pool ran dry", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.live": { "description": "In use", "flag": "g", "format": "i", "value": 0 }, "MEMPOOL.req0.pool": { "description": "In Pool", "flag": "g", "format": "i", "value": 10 }, "MEMPOOL.req0.sz_wanted": { "description": "Size requested", "flag": "g", "format": "B", "value": 65536 }, "MEMPOOL.req0.sz_actual": { "description": "Size allocated", "flag": "g", "format": "B", "value": 65504 }, "MEMPOOL.req0.allocs": { "description": "Allocations", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.frees": { "description": "Frees", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.recycle": { "description": "Recycled from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.timeout": { "description": "Timed out from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.toosmall": { "description": "Too small to recycle", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.surplus": { "description": "Too many for pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.randry": { "description": "Pool ran dry", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.live": { "description": "In use", "flag": "g", "format": "i", "value": 0 }, "MEMPOOL.sess0.pool": { "description": "In Pool", "flag": "g", "format": "i", "value": 10 }, "MEMPOOL.sess0.sz_wanted": { "description": "Size requested", "flag": "g", "format": "B", "value": 512 }, "MEMPOOL.sess0.sz_actual": { "description": "Size allocated", "flag": "g", "format": "B", "value": 480 }, "MEMPOOL.sess0.allocs": { "description": "Allocations", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.frees": { "description": "Frees", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.recycle": { "description": "Recycled from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.timeout": { "description": "Timed out from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.toosmall": { "description": "Too small to recycle", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.surplus": { "description": "Too many for pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.randry": { "description": "Pool ran dry", "flag": "c", "format": "i", "value": 0 }, "LCK.sma.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 2 }, "LCK.sma.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.sma.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 0 }, "SMA.s0.c_req": { "description": "Allocator requests", "flag": "c", "format": "i", "value": 0 }, "SMA.s0.c_fail": { "description": "Allocator failures", "flag": "c", "format": "i", "value": 0 }, "SMA.s0.c_bytes": { "description": "Bytes allocated", "flag": "c", "format": "B", "value": 0 }, "SMA.s0.c_freed": { "description": "Bytes freed", "flag": "c", "format": "B", "value": 0 }, "SMA.s0.g_alloc": { "description": "Allocations outstanding", "flag": "g", "format": "i", "value": 0 }, "SMA.s0.g_bytes": { "description": "Bytes outstanding", "flag": "g", "format": "B", "value": 0 }, "SMA.s0.g_space": { "description": "Bytes available", "flag": "g", "format": "B", "value": 268435456 }, "SMA.Transient.c_req": { "description": "Allocator requests", "flag": "c", "format": "i", "value": 0 }, "SMA.Transient.c_fail": { "description": "Allocator failures", "flag": "c", "format": "i", "value": 0 }, "SMA.Transient.c_bytes": { "description": "Bytes allocated", "flag": "c", "format": "B", "value": 0 }, "SMA.Transient.c_freed": { "description": "Bytes freed", "flag": "c", "format": "B", "value": 0 }, "SMA.Transient.g_alloc": { "description": "Allocations outstanding", "flag": "g", "format": "i", "value": 0 }, "SMA.Transient.g_bytes": { "description": "Bytes outstanding", "flag": "g", "format": "B", "value": 0 }, "SMA.Transient.g_space": { "description": "Bytes available", "flag": "g", "format": "B", "value": 0 }, "MEMPOOL.req1.live": { "description": "In use", "flag": "g", "format": "i", "value": 0 }, "MEMPOOL.req1.pool": { "description": "In Pool", "flag": "g", "format": "i", "value": 10 }, "MEMPOOL.req1.sz_wanted": { "description": "Size requested", "flag": "g", "format": "B", "value": 65536 }, "MEMPOOL.req1.sz_actual": { "description": "Size allocated", "flag": "g", "format": "B", "value": 65504 }, "MEMPOOL.req1.allocs": { "description": "Allocations", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.frees": { "description": "Frees", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.recycle": { "description": "Recycled from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.timeout": { "description": "Timed out from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.toosmall": { "description": "Too small to recycle", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.surplus": { "description": "Too many for pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.randry": { "description": "Pool ran dry", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.live": { "description": "In use", "flag": "g", "format": "i", "value": 0 }, "MEMPOOL.sess1.pool": { "description": "In Pool", "flag": "g", "format": "i", "value": 10 }, "MEMPOOL.sess1.sz_wanted": { "description": "Size requested", "flag": "g", "format": "B", "value": 512 }, "MEMPOOL.sess1.sz_actual": { "description": "Size allocated", "flag": "g", "format": "B", "value": 480 }, "MEMPOOL.sess1.allocs": { "description": "Allocations", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.frees": { "description": "Frees", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.recycle": { "description": "Recycled from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.timeout": { "description": "Timed out from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.toosmall": { "description": "Too small to recycle", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.surplus": { "description": "Too many for pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.randry": { "description": "Pool ran dry", "flag": "c", "format": "i", "value": 0 }, "VBE.boot.default.happy": { "description": "Happy health probes", "flag": "b", "format": "b", "value": 0 }, "VBE.boot.default.bereq_hdrbytes": { "description": "Request header bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.default.bereq_bodybytes": { "description": "Request body bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.default.beresp_hdrbytes": { "description": "Response header bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.default.beresp_bodybytes": { "description": "Response body bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.default.pipe_hdrbytes": { "description": "Pipe request header bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.default.pipe_out": { "description": "Piped bytes to backend", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.default.pipe_in": { "description": "Piped bytes from backend", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.default.conn": { "description": "Concurrent connections to backend", "flag": "g", "format": "i", "value": 0 }, "VBE.boot.default.req": { "description": "Backend requests sent", "flag": "c", "format": "i", "value": 0 } } prometheus_varnish_exporter-1.5.2/test/scrape/6.0.0.json000066400000000000000000001074651355530155200232050ustar00rootroot00000000000000{ "timestamp": "2018-06-28T13:43:33", "MGT.uptime": { "description": "Management process uptime", "flag": "c", "format": "d", "value": 660 }, "MGT.child_start": { "description": "Child process started", "flag": "c", "format": "i", "value": 1 }, "MGT.child_exit": { "description": "Child process normal exit", "flag": "c", "format": "i", "value": 0 }, "MGT.child_stop": { "description": "Child process unexpected exit", "flag": "c", "format": "i", "value": 0 }, "MGT.child_died": { "description": "Child process died (signal)", "flag": "c", "format": "i", "value": 0 }, "MGT.child_dump": { "description": "Child process core dumped", "flag": "c", "format": "i", "value": 0 }, "MGT.child_panic": { "description": "Child process panic", "flag": "c", "format": "i", "value": 0 }, "MAIN.summs": { "description": "stat summ operations", "flag": "c", "format": "i", "value": 1064 }, "MAIN.uptime": { "description": "Child process uptime", "flag": "c", "format": "d", "value": 661 }, "MAIN.sess_conn": { "description": "Sessions accepted", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_drop": { "description": "Sessions dropped", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_fail": { "description": "Session accept failures", "flag": "c", "format": "i", "value": 0 }, "MAIN.client_req_400": { "description": "Client requests received, subject to 400 errors", "flag": "c", "format": "i", "value": 0 }, "MAIN.client_req_417": { "description": "Client requests received, subject to 417 errors", "flag": "c", "format": "i", "value": 0 }, "MAIN.client_req": { "description": "Good client requests received", "flag": "c", "format": "i", "value": 0 }, "MAIN.cache_hit": { "description": "Cache hits", "flag": "c", "format": "i", "value": 0 }, "MAIN.cache_hit_grace": { "description": "Cache grace hits", "flag": "c", "format": "i", "value": 0 }, "MAIN.cache_hitpass": { "description": "Cache hits for pass.", "flag": "c", "format": "i", "value": 0 }, "MAIN.cache_hitmiss": { "description": "Cache hits for miss.", "flag": "c", "format": "i", "value": 0 }, "MAIN.cache_miss": { "description": "Cache misses", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_conn": { "description": "Backend conn. success", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_unhealthy": { "description": "Backend conn. not attempted", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_busy": { "description": "Backend conn. too many", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_fail": { "description": "Backend conn. failures", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_reuse": { "description": "Backend conn. reuses", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_recycle": { "description": "Backend conn. recycles", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_retry": { "description": "Backend conn. retry", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_head": { "description": "Fetch no body (HEAD)", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_length": { "description": "Fetch with Length", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_chunked": { "description": "Fetch chunked", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_eof": { "description": "Fetch EOF", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_bad": { "description": "Fetch bad T-E", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_none": { "description": "Fetch no body", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_1xx": { "description": "Fetch no body (1xx)", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_204": { "description": "Fetch no body (204)", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_304": { "description": "Fetch no body (304)", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_failed": { "description": "Fetch failed (all causes)", "flag": "c", "format": "i", "value": 0 }, "MAIN.fetch_no_thread": { "description": "Fetch failed (no thread)", "flag": "c", "format": "i", "value": 0 }, "MAIN.pools": { "description": "Number of thread pools", "flag": "g", "format": "i", "value": 2 }, "MAIN.threads": { "description": "Total number of threads", "flag": "g", "format": "i", "value": 200 }, "MAIN.threads_limited": { "description": "Threads hit max", "flag": "c", "format": "i", "value": 0 }, "MAIN.threads_created": { "description": "Threads created", "flag": "c", "format": "i", "value": 200 }, "MAIN.threads_destroyed": { "description": "Threads destroyed", "flag": "c", "format": "i", "value": 0 }, "MAIN.threads_failed": { "description": "Thread creation failed", "flag": "c", "format": "i", "value": 0 }, "MAIN.thread_queue_len": { "description": "Length of session queue", "flag": "g", "format": "i", "value": 0 }, "MAIN.busy_sleep": { "description": "Number of requests sent to sleep on busy objhdr", "flag": "c", "format": "i", "value": 0 }, "MAIN.busy_wakeup": { "description": "Number of requests woken after sleep on busy objhdr", "flag": "c", "format": "i", "value": 0 }, "MAIN.busy_killed": { "description": "Number of requests killed after sleep on busy objhdr", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_queued": { "description": "Sessions queued for thread", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_dropped": { "description": "Sessions dropped for thread", "flag": "c", "format": "i", "value": 0 }, "MAIN.req_dropped": { "description": "Requests dropped", "flag": "c", "format": "i", "value": 0 }, "MAIN.n_object": { "description": "object structs made", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_vampireobject": { "description": "unresurrected objects", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_objectcore": { "description": "objectcore structs made", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_objecthead": { "description": "objecthead structs made", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_backend": { "description": "Number of backends", "flag": "g", "format": "i", "value": 4 }, "MAIN.n_expired": { "description": "Number of expired objects", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_lru_nuked": { "description": "Number of LRU nuked objects", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_lru_moved": { "description": "Number of LRU moved objects", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_lru_limited": { "description": "Reached nuke_limit", "flag": "c", "format": "i", "value": 0 }, "MAIN.losthdr": { "description": "HTTP header overflows", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_sess": { "description": "Total sessions seen", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_pipe": { "description": "Total pipe sessions seen", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_pass": { "description": "Total pass-ed requests seen", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_fetch": { "description": "Total backend fetches initiated", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_synth": { "description": "Total synthethic responses made", "flag": "c", "format": "i", "value": 0 }, "MAIN.s_req_hdrbytes": { "description": "Request header bytes", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_req_bodybytes": { "description": "Request body bytes", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_resp_hdrbytes": { "description": "Response header bytes", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_resp_bodybytes": { "description": "Response body bytes", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_pipe_hdrbytes": { "description": "Pipe request header bytes", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_pipe_in": { "description": "Piped bytes from client", "flag": "c", "format": "B", "value": 0 }, "MAIN.s_pipe_out": { "description": "Piped bytes to client", "flag": "c", "format": "B", "value": 0 }, "MAIN.sess_closed": { "description": "Session Closed", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_closed_err": { "description": "Session Closed with error", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_readahead": { "description": "Session Read Ahead", "flag": "c", "format": "i", "value": 0 }, "MAIN.sess_herd": { "description": "Session herd", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rem_close": { "description": "Session OK REM_CLOSE", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_req_close": { "description": "Session OK REQ_CLOSE", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_req_http10": { "description": "Session Err REQ_HTTP10", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rx_bad": { "description": "Session Err RX_BAD", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rx_body": { "description": "Session Err RX_BODY", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rx_junk": { "description": "Session Err RX_JUNK", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rx_overflow": { "description": "Session Err RX_OVERFLOW", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_rx_timeout": { "description": "Session Err RX_TIMEOUT", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_tx_pipe": { "description": "Session OK TX_PIPE", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_tx_error": { "description": "Session Err TX_ERROR", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_tx_eof": { "description": "Session OK TX_EOF", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_resp_close": { "description": "Session OK RESP_CLOSE", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_overload": { "description": "Session Err OVERLOAD", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_pipe_overflow": { "description": "Session Err PIPE_OVERFLOW", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_range_short": { "description": "Session Err RANGE_SHORT", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_req_http20": { "description": "Session Err REQ_HTTP20", "flag": "c", "format": "i", "value": 0 }, "MAIN.sc_vcl_failure": { "description": "Session Err VCL_FAILURE", "flag": "c", "format": "i", "value": 0 }, "MAIN.shm_records": { "description": "SHM records", "flag": "c", "format": "i", "value": 986 }, "MAIN.shm_writes": { "description": "SHM writes", "flag": "c", "format": "i", "value": 986 }, "MAIN.shm_flushes": { "description": "SHM flushes due to overflow", "flag": "c", "format": "i", "value": 0 }, "MAIN.shm_cont": { "description": "SHM MTX contention", "flag": "c", "format": "i", "value": 0 }, "MAIN.shm_cycles": { "description": "SHM cycles through buffer", "flag": "c", "format": "i", "value": 0 }, "MAIN.backend_req": { "description": "Backend requests made", "flag": "c", "format": "i", "value": 0 }, "MAIN.n_vcl": { "description": "Number of loaded VCLs in total", "flag": "g", "format": "i", "value": 1 }, "MAIN.n_vcl_avail": { "description": "Number of VCLs available", "flag": "g", "format": "i", "value": 1 }, "MAIN.n_vcl_discard": { "description": "Number of discarded VCLs", "flag": "g", "format": "i", "value": 0 }, "MAIN.vcl_fail": { "description": "VCL failures", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans": { "description": "Count of bans", "flag": "g", "format": "i", "value": 1 }, "MAIN.bans_completed": { "description": "Number of bans marked 'completed'", "flag": "g", "format": "i", "value": 1 }, "MAIN.bans_obj": { "description": "Number of bans using obj.*", "flag": "g", "format": "i", "value": 0 }, "MAIN.bans_req": { "description": "Number of bans using req.*", "flag": "g", "format": "i", "value": 0 }, "MAIN.bans_added": { "description": "Bans added", "flag": "c", "format": "i", "value": 1 }, "MAIN.bans_deleted": { "description": "Bans deleted", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_tested": { "description": "Bans tested against objects (lookup)", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_obj_killed": { "description": "Objects killed by bans (lookup)", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_lurker_tested": { "description": "Bans tested against objects (lurker)", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_tests_tested": { "description": "Ban tests tested against objects (lookup)", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_lurker_tests_tested": { "description": "Ban tests tested against objects (lurker)", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_lurker_obj_killed": { "description": "Objects killed by bans (lurker)", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_lurker_obj_killed_cutoff": { "description": "Objects killed by bans for cutoff (lurker)", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_dups": { "description": "Bans superseded by other bans", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_lurker_contention": { "description": "Lurker gave way for lookup", "flag": "c", "format": "i", "value": 0 }, "MAIN.bans_persisted_bytes": { "description": "Bytes used by the persisted ban lists", "flag": "g", "format": "B", "value": 16 }, "MAIN.bans_persisted_fragmentation": { "description": "Extra bytes in persisted ban lists due to fragmentation", "flag": "g", "format": "B", "value": 0 }, "MAIN.n_purges": { "description": "Number of purge operations executed", "flag": "g", "format": "i", "value": 0 }, "MAIN.n_obj_purged": { "description": "Number of purged objects", "flag": "g", "format": "i", "value": 0 }, "MAIN.exp_mailed": { "description": "Number of objects mailed to expiry thread", "flag": "c", "format": "i", "value": 0 }, "MAIN.exp_received": { "description": "Number of objects received by expiry thread", "flag": "c", "format": "i", "value": 0 }, "MAIN.hcb_nolock": { "description": "HCB Lookups without lock", "flag": "c", "format": "i", "value": 0 }, "MAIN.hcb_lock": { "description": "HCB Lookups with lock", "flag": "c", "format": "i", "value": 0 }, "MAIN.hcb_insert": { "description": "HCB Inserts", "flag": "c", "format": "i", "value": 0 }, "MAIN.esi_errors": { "description": "ESI parse errors (unlock)", "flag": "c", "format": "i", "value": 0 }, "MAIN.esi_warnings": { "description": "ESI parse warnings (unlock)", "flag": "c", "format": "i", "value": 0 }, "MAIN.vmods": { "description": "Loaded VMODs", "flag": "g", "format": "i", "value": 1 }, "MAIN.n_gzip": { "description": "Gzip operations", "flag": "c", "format": "i", "value": 0 }, "MAIN.n_gunzip": { "description": "Gunzip operations", "flag": "c", "format": "i", "value": 0 }, "MAIN.n_test_gunzip": { "description": "Test gunzip operations", "flag": "c", "format": "i", "value": 0 }, "LCK.backend.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 5 }, "LCK.backend.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.backend.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 1343 }, "LCK.ban.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.ban.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.ban.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 34 }, "LCK.busyobj.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 0 }, "LCK.busyobj.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.busyobj.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 0 }, "LCK.cli.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.cli.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.cli.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 232 }, "LCK.exp.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.exp.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.exp.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 212 }, "LCK.hcb.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.hcb.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.hcb.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 4 }, "LCK.lru.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 2 }, "LCK.lru.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.lru.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 0 }, "LCK.mempool.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 5 }, "LCK.mempool.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.mempool.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 2899 }, "LCK.objhdr.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.objhdr.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.objhdr.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 0 }, "LCK.pipestat.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.pipestat.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.pipestat.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 0 }, "LCK.sess.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 0 }, "LCK.sess.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.sess.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 0 }, "LCK.tcp_pool.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 3 }, "LCK.tcp_pool.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.tcp_pool.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 10 }, "LCK.vbe.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.vbe.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.vbe.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 767 }, "LCK.vcapace.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.vcapace.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.vcapace.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 0 }, "LCK.vcl.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.vcl.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.vcl.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 6 }, "LCK.vxid.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.vxid.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.vxid.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 0 }, "LCK.waiter.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 2 }, "LCK.waiter.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.waiter.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 14 }, "LCK.wq.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 3 }, "LCK.wq.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.wq.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 3201 }, "LCK.wstat.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 1 }, "LCK.wstat.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.wstat.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 761 }, "MEMPOOL.busyobj.live": { "description": "In use", "flag": "g", "format": "i", "value": 0 }, "MEMPOOL.busyobj.pool": { "description": "In Pool", "flag": "g", "format": "i", "value": 10 }, "MEMPOOL.busyobj.sz_wanted": { "description": "Size requested", "flag": "g", "format": "B", "value": 65536 }, "MEMPOOL.busyobj.sz_actual": { "description": "Size allocated", "flag": "g", "format": "B", "value": 65504 }, "MEMPOOL.busyobj.allocs": { "description": "Allocations", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.frees": { "description": "Frees", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.recycle": { "description": "Recycled from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.timeout": { "description": "Timed out from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.toosmall": { "description": "Too small to recycle", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.surplus": { "description": "Too many for pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.busyobj.randry": { "description": "Pool ran dry", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.live": { "description": "In use", "flag": "g", "format": "i", "value": 0 }, "MEMPOOL.req0.pool": { "description": "In Pool", "flag": "g", "format": "i", "value": 10 }, "MEMPOOL.req0.sz_wanted": { "description": "Size requested", "flag": "g", "format": "B", "value": 65536 }, "MEMPOOL.req0.sz_actual": { "description": "Size allocated", "flag": "g", "format": "B", "value": 65504 }, "MEMPOOL.req0.allocs": { "description": "Allocations", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.frees": { "description": "Frees", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.recycle": { "description": "Recycled from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.timeout": { "description": "Timed out from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.toosmall": { "description": "Too small to recycle", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.surplus": { "description": "Too many for pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req0.randry": { "description": "Pool ran dry", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.live": { "description": "In use", "flag": "g", "format": "i", "value": 0 }, "MEMPOOL.sess0.pool": { "description": "In Pool", "flag": "g", "format": "i", "value": 10 }, "MEMPOOL.sess0.sz_wanted": { "description": "Size requested", "flag": "g", "format": "B", "value": 512 }, "MEMPOOL.sess0.sz_actual": { "description": "Size allocated", "flag": "g", "format": "B", "value": 480 }, "MEMPOOL.sess0.allocs": { "description": "Allocations", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.frees": { "description": "Frees", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.recycle": { "description": "Recycled from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.timeout": { "description": "Timed out from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.toosmall": { "description": "Too small to recycle", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.surplus": { "description": "Too many for pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess0.randry": { "description": "Pool ran dry", "flag": "c", "format": "i", "value": 0 }, "LCK.sma.creat": { "description": "Created locks", "flag": "c", "format": "i", "value": 2 }, "LCK.sma.destroy": { "description": "Destroyed locks", "flag": "c", "format": "i", "value": 0 }, "LCK.sma.locks": { "description": "Lock Operations", "flag": "c", "format": "i", "value": 0 }, "SMA.s0.c_req": { "description": "Allocator requests", "flag": "c", "format": "i", "value": 0 }, "SMA.s0.c_fail": { "description": "Allocator failures", "flag": "c", "format": "i", "value": 0 }, "SMA.s0.c_bytes": { "description": "Bytes allocated", "flag": "c", "format": "B", "value": 0 }, "SMA.s0.c_freed": { "description": "Bytes freed", "flag": "c", "format": "B", "value": 0 }, "SMA.s0.g_alloc": { "description": "Allocations outstanding", "flag": "g", "format": "i", "value": 0 }, "SMA.s0.g_bytes": { "description": "Bytes outstanding", "flag": "g", "format": "B", "value": 0 }, "SMA.s0.g_space": { "description": "Bytes available", "flag": "g", "format": "B", "value": 268435456 }, "SMA.Transient.c_req": { "description": "Allocator requests", "flag": "c", "format": "i", "value": 0 }, "SMA.Transient.c_fail": { "description": "Allocator failures", "flag": "c", "format": "i", "value": 0 }, "SMA.Transient.c_bytes": { "description": "Bytes allocated", "flag": "c", "format": "B", "value": 0 }, "SMA.Transient.c_freed": { "description": "Bytes freed", "flag": "c", "format": "B", "value": 0 }, "SMA.Transient.g_alloc": { "description": "Allocations outstanding", "flag": "g", "format": "i", "value": 0 }, "SMA.Transient.g_bytes": { "description": "Bytes outstanding", "flag": "g", "format": "B", "value": 0 }, "SMA.Transient.g_space": { "description": "Bytes available", "flag": "g", "format": "B", "value": 0 }, "MEMPOOL.req1.live": { "description": "In use", "flag": "g", "format": "i", "value": 0 }, "MEMPOOL.req1.pool": { "description": "In Pool", "flag": "g", "format": "i", "value": 10 }, "MEMPOOL.req1.sz_wanted": { "description": "Size requested", "flag": "g", "format": "B", "value": 65536 }, "MEMPOOL.req1.sz_actual": { "description": "Size allocated", "flag": "g", "format": "B", "value": 65504 }, "MEMPOOL.req1.allocs": { "description": "Allocations", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.frees": { "description": "Frees", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.recycle": { "description": "Recycled from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.timeout": { "description": "Timed out from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.toosmall": { "description": "Too small to recycle", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.surplus": { "description": "Too many for pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.req1.randry": { "description": "Pool ran dry", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.live": { "description": "In use", "flag": "g", "format": "i", "value": 0 }, "MEMPOOL.sess1.pool": { "description": "In Pool", "flag": "g", "format": "i", "value": 10 }, "MEMPOOL.sess1.sz_wanted": { "description": "Size requested", "flag": "g", "format": "B", "value": 512 }, "MEMPOOL.sess1.sz_actual": { "description": "Size allocated", "flag": "g", "format": "B", "value": 480 }, "MEMPOOL.sess1.allocs": { "description": "Allocations", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.frees": { "description": "Frees", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.recycle": { "description": "Recycled from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.timeout": { "description": "Timed out from pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.toosmall": { "description": "Too small to recycle", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.surplus": { "description": "Too many for pool", "flag": "c", "format": "i", "value": 0 }, "MEMPOOL.sess1.randry": { "description": "Pool ran dry", "flag": "c", "format": "i", "value": 0 }, "VBE.boot.one-two-test.happy": { "description": "Happy health probes", "flag": "b", "format": "b", "value": 18446744073709551615 }, "VBE.boot.one-two-test.bereq_hdrbytes": { "description": "Request header bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.one-two-test.bereq_bodybytes": { "description": "Request body bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.one-two-test.beresp_hdrbytes": { "description": "Response header bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.one-two-test.beresp_bodybytes": { "description": "Response body bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.one-two-test.pipe_hdrbytes": { "description": "Pipe request header bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.one-two-test.pipe_out": { "description": "Piped bytes to backend", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.one-two-test.pipe_in": { "description": "Piped bytes from backend", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.one-two-test.conn": { "description": "Concurrent connections to backend", "flag": "g", "format": "i", "value": 0 }, "VBE.boot.one-two-test.req": { "description": "Backend requests sent", "flag": "c", "format": "i", "value": 0 }, "VBE.boot.eu2.happy": { "description": "Happy health probes", "flag": "b", "format": "b", "value": 0 }, "VBE.boot.eu2.bereq_hdrbytes": { "description": "Request header bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.eu2.bereq_bodybytes": { "description": "Request body bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.eu2.beresp_hdrbytes": { "description": "Response header bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.eu2.beresp_bodybytes": { "description": "Response body bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.eu2.pipe_hdrbytes": { "description": "Pipe request header bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.eu2.pipe_out": { "description": "Piped bytes to backend", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.eu2.pipe_in": { "description": "Piped bytes from backend", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.eu2.conn": { "description": "Concurrent connections to backend", "flag": "g", "format": "i", "value": 0 }, "VBE.boot.eu2.req": { "description": "Backend requests sent", "flag": "c", "format": "i", "value": 0 }, "VBE.boot.us1.happy": { "description": "Happy health probes", "flag": "b", "format": "b", "value": 18446744073709551615 }, "VBE.boot.us1.bereq_hdrbytes": { "description": "Request header bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.us1.bereq_bodybytes": { "description": "Request body bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.us1.beresp_hdrbytes": { "description": "Response header bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.us1.beresp_bodybytes": { "description": "Response body bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.us1.pipe_hdrbytes": { "description": "Pipe request header bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.us1.pipe_out": { "description": "Piped bytes to backend", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.us1.pipe_in": { "description": "Piped bytes from backend", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.us1.conn": { "description": "Concurrent connections to backend", "flag": "g", "format": "i", "value": 0 }, "VBE.boot.us1.req": { "description": "Backend requests sent", "flag": "c", "format": "i", "value": 0 }, "VBE.boot.us2.happy": { "description": "Happy health probes", "flag": "b", "format": "b", "value": 0 }, "VBE.boot.us2.bereq_hdrbytes": { "description": "Request header bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.us2.bereq_bodybytes": { "description": "Request body bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.us2.beresp_hdrbytes": { "description": "Response header bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.us2.beresp_bodybytes": { "description": "Response body bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.us2.pipe_hdrbytes": { "description": "Pipe request header bytes", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.us2.pipe_out": { "description": "Piped bytes to backend", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.us2.pipe_in": { "description": "Piped bytes from backend", "flag": "c", "format": "B", "value": 0 }, "VBE.boot.us2.conn": { "description": "Concurrent connections to backend", "flag": "g", "format": "i", "value": 0 }, "VBE.boot.us2.req": { "description": "Backend requests sent", "flag": "c", "format": "i", "value": 0 } } prometheus_varnish_exporter-1.5.2/utils.go000066400000000000000000000047011355530155200210710ustar00rootroot00000000000000package main import ( "fmt" "os" "strings" ) // logging func logRaw(format string, args ...interface{}) { fmt.Printf(format+"\n", args...) } func logTitle(format string, args ...interface{}) { logInfo(format, args...) title := strings.Repeat("-", len(fmt.Sprintf(format, args...))) if len(title) > 0 { logInfo(title) } } func logInfo(format string, args ...interface{}) { if StartParams.Raw { logRaw(format, args...) } else { logger.Printf(format, args...) } } func logWarn(format string, args ...interface{}) { format = "[WARN] " + format if StartParams.Raw { logRaw(format, args...) } else { logger.Printf(format, args...) } } func logError(format string, args ...interface{}) { format = "[ERROR] " + format if StartParams.Raw { logRaw(format, args...) } else { logger.Printf(format, args...) } } func logFatal(format string, args ...interface{}) { format = "[FATAL] " + format if StartParams.Raw { logRaw(format, args...) } else { logger.Printf(format, args...) } os.Exit(1) } func logFatalError(err error) { if err != nil { logFatal(err.Error()) } } // strings type caseSensitivity int const ( caseSensitive caseSensitivity = 0 caseInsensitive caseSensitivity = 1 ) func startsWith(str, prefix string, cs caseSensitivity) bool { if cs == caseSensitive { return strings.HasPrefix(str, prefix) } return strings.HasPrefix(strings.ToLower(str), strings.ToLower(prefix)) } func startsWithAny(str string, prefixes []string, cs caseSensitivity) bool { for _, prefix := range prefixes { if startsWith(str, prefix, cs) { return true } } return false } func endsWith(str, postfix string, cs caseSensitivity) bool { if cs == caseSensitive { return strings.HasSuffix(str, postfix) } return strings.HasSuffix(strings.ToLower(str), strings.ToLower(postfix)) } func endsWithAny(str string, postfixes []string, cs caseSensitivity) bool { for _, postfix := range postfixes { if endsWith(str, postfix, cs) { return true } } return false } // file // Returns if file/dir in path exists. func fileExists(path string) bool { if len(path) == 0 { return false } if _, err := os.Stat(path); os.IsNotExist(err) { return false } return true } // data func stringProperty(data map[string]interface{}, key string) (string, error) { if value, ok := data[key]; ok { if vStr, ok := value.(string); ok { return vStr, nil } else { return "", fmt.Errorf("%s is not a string", key) } } return "", nil } prometheus_varnish_exporter-1.5.2/varnish.go000066400000000000000000000175021355530155200214060ustar00rootroot00000000000000package main import ( "bufio" "bytes" "encoding/json" "fmt" "os/exec" "reflect" "regexp" "strconv" "strings" "sync" "github.com/prometheus/client_golang/prometheus" ) var ( DescCache = &descCache{ descs: make(map[string]*prometheus.Desc), } ) type descCache struct { sync.RWMutex descs map[string]*prometheus.Desc } func (dc *descCache) Desc(key string) *prometheus.Desc { dc.RLock() desc := dc.descs[key] dc.RUnlock() return desc } func (dc *descCache) Set(key string, desc *prometheus.Desc) *prometheus.Desc { dc.Lock() dc.descs[key] = desc dc.Unlock() return desc } func ScrapeVarnish(ch chan<- prometheus.Metric) ([]byte, error) { params := []string{"-j"} if VarnishVersion.EqualsOrGreater(4, 1) { // 4.1 started to support timeout to exit immediately on connection errors. // Before that varnishstat exits immediately on faulty params or connection errors. params = append(params, "-t", "0") } if !StartParams.Params.isEmpty() { params = append(params, StartParams.Params.make()...) } buf, errExec := executeVarnishstat(StartParams.VarnishstatExe, params...) if errExec != nil { return buf.Bytes(), fmt.Errorf("%s scrape failed: %s", StartParams.VarnishstatExe, errExec) } return ScrapeVarnishFrom(buf.Bytes(), ch) } func ScrapeVarnishFrom(buf []byte, ch chan<- prometheus.Metric) ([]byte, error) { // The output JSON annoyingly is not structured so that we could make a nice map[string]struct for it. metricsJSON := make(map[string]interface{}) dec := json.NewDecoder(bytes.NewBuffer(buf)) dec.UseNumber() if err := dec.Decode(&metricsJSON); err != nil { return buf, err } for vName, raw := range metricsJSON { if vName == "timestamp" { continue } if dt := reflect.TypeOf(raw); dt.Kind() != reflect.Map { if StartParams.Verbose { logWarn("Found unexpected data from json: %s: %#v", vName, raw) } continue } data, ok := raw.(map[string]interface{}) if !ok { if StartParams.Verbose { logWarn("Failed to cast to map[string]interface{}: %s: %#v", vName, raw) } continue } var ( vGroup = prometheusGroup(vName) vDescription string vIdentifier string vValue float64 iValue uint64 vErr error ) flag, _ := stringProperty(data, "flag") if value, ok := data["description"]; ok && vErr == nil { if vDescription, ok = value.(string); !ok { vErr = fmt.Errorf("%s description it not a string", vName) } } if value, ok := data["ident"]; ok && vErr == nil { if vIdentifier, ok = value.(string); !ok { vErr = fmt.Errorf("%s ident it not a string", vName) } } if value, ok := data["value"]; ok && vErr == nil { if number, ok := value.(json.Number); ok { if vValue, vErr = number.Float64(); vErr != nil { vErr = fmt.Errorf("%s value float64 error: %s", vName, vErr) } if flag == "b" { if iValue, vErr = strconv.ParseUint(number.String(), 10, 64); vErr != nil { vErr = fmt.Errorf("%s value uint64 error: %s", vName, vErr) } } } else { vErr = fmt.Errorf("%s value it not a float64", vName) } } if vErr != nil { if StartParams.Verbose { logWarn(vErr.Error()) } continue } pName, pDescription, pLabelKeys, pLabelValues := computePrometheusInfo(vName, vGroup, vIdentifier, vDescription) descKey := pName + "_" + strings.Join(pLabelKeys, "_") pDesc := DescCache.Desc(descKey) if pDesc == nil { pDesc = DescCache.Set(descKey, prometheus.NewDesc( pName, pDescription, pLabelKeys, nil, )) } var metricType prometheus.ValueType switch flag { case "c", "a": metricType = prometheus.CounterValue case "g": metricType = prometheus.GaugeValue default: metricType = prometheus.GaugeValue } ch <- prometheus.MustNewConstMetric(pDesc, metricType, vValue, pLabelValues...) // augment varnish_backend_up from _happy varnish bitmap value // we are only interested in the latest happy value (up or down) on each scrape // see draw_line_bitmap function from https://github.com/varnishcache/varnish-cache/blob/master/bin/varnishstat/varnishstat_curses.c if pName == "varnish_backend_happy" { upName := "varnish_backend_up" upDesc := "Backend up as per the latest health probe" upValue := 0.0 if iValue > 0 && (iValue&uint64(1)) > 0 { upValue = 1.0 } descKey = upName + "_" + strings.Join(pLabelKeys, "_") pDesc = DescCache.Desc(descKey) if pDesc == nil { pDesc = DescCache.Set(descKey, prometheus.NewDesc( upName, upDesc, pLabelKeys, nil, )) } ch <- prometheus.MustNewConstMetric(pDesc, prometheus.GaugeValue, upValue, pLabelValues...) } } return buf, nil } // Returns the result of 'varnishtat' with optional command line params. func executeVarnishstat(varnishstatExe string, params ...string) (*bytes.Buffer, error) { buf := &bytes.Buffer{} var cmd *exec.Cmd if len(StartParams.VarnishDockerContainer) == 0 { cmd = exec.Command(varnishstatExe, params...) } else { cmd = exec.Command("docker", append([]string{"exec", "-t", StartParams.VarnishDockerContainer, varnishstatExe}, params...)...) } cmd.Stdout = buf cmd.Stderr = buf return buf, cmd.Run() } // varnishVersion type varnishVersion struct { Major int Minor int Patch int Revision string } func NewVarnishVersion() *varnishVersion { return &varnishVersion{ Major: -1, Minor: -1, Patch: -1, } } func (v *varnishVersion) EqualsOrGreater(major, minor int) bool { if v.Major > major { return true } else if v.Major == major && v.Minor >= minor { return true } return false } func (v *varnishVersion) Valid() bool { return v.Major != -1 } func (v *varnishVersion) Initialize() error { return v.queryVersion() } func (v *varnishVersion) queryVersion() error { buf, err := executeVarnishstat(StartParams.VarnishstatExe, "-V") if err != nil { return err } if scanner := bufio.NewScanner(buf); scanner.Scan() { return v.parseVersion(scanner.Text()) } return fmt.Errorf("Failed to get varnishstat -V output") } func (v *varnishVersion) parseVersion(version string) error { r := regexp.MustCompile(`(?P\d+)(\.(?P\d+))?(\.(?P\d+))?(.*revision\s(?P[0-9a-f]*)\))?`) match := r.FindStringSubmatch(version) parts := make(map[string]string) for i, name := range r.SubexpNames() { if i != 0 && name != "" { parts[name] = match[i] } } if len(parts) > 1 { if err := v.set(parts); err != nil { return err } } if !v.Valid() { return fmt.Errorf("Failed to resolve version from %q", version) } return nil } func (v *varnishVersion) Labels() map[string]string { labels := make(map[string]string) if v.Major != -1 { labels["major"] = strconv.Itoa(v.Major) } if v.Minor != -1 { labels["minor"] = strconv.Itoa(v.Minor) } if v.Patch != -1 { labels["patch"] = strconv.Itoa(v.Patch) } if v.Revision != "" { labels["revision"] = v.Revision } labels["version"] = v.VersionString() return labels } func (v *varnishVersion) set(parts map[string]string) error { for name, value := range parts { // skip empty value if len(value) == 0 { continue } // save revision as-is (string) if name == "revision" { v.Revision = value continue } // convert semver parts to integer and save it num, err := strconv.Atoi(value) if err != nil { return err } switch name { case "major": v.Major = num case "minor": v.Minor = num case "patch": v.Patch = num } } return nil } // Version string with numbers only, no revision. func (v *varnishVersion) VersionString() string { parts := []string{} for _, num := range []int{v.Major, v.Minor, v.Patch} { if num != -1 { parts = append(parts, strconv.Itoa(num)) } } return strings.Join(parts, ".") } // Full version string, including revision. func (v *varnishVersion) String() string { version := v.VersionString() if v.Revision != "" { version += " " + v.Revision } return version } prometheus_varnish_exporter-1.5.2/varnish_test.go000066400000000000000000000176771355530155200224620ustar00rootroot00000000000000package main import ( "fmt" "io/ioutil" "os" "path/filepath" "runtime" "testing" "github.com/prometheus/client_golang/prometheus" ) var testFileVersions = []string{"3.0.5", "4.0.5", "4.1.1", "5.2.0", "6.0.0"} func Test_VarnishVersion(t *testing.T) { tests := map[string]*varnishVersion{ "varnishstat (varnish-6.0.0 revision a068361dff0d25a0d85cf82a6e5fdaf315e06a7d)": &varnishVersion{ Major: 6, Minor: 0, Patch: 0, Revision: "a068361dff0d25a0d85cf82a6e5fdaf315e06a7d", }, "varnishstat (varnish-5.2.0 revision 4c4875cbf)": &varnishVersion{ Major: 5, Minor: 2, Patch: 0, Revision: "4c4875cbf", }, "varnishstat (varnish-4.1.10 revision 1d090c5a08f41c36562644bafcce9d3cb85d824f)": &varnishVersion{ Major: 4, Minor: 1, Patch: 10, Revision: "1d090c5a08f41c36562644bafcce9d3cb85d824f", }, "varnishstat (varnish-4.1.0 revision 3041728)": &varnishVersion{ Major: 4, Minor: 1, Patch: 0, Revision: "3041728", }, "varnishstat (varnish-4 revision)": &varnishVersion{ Major: 4, Minor: -1, Patch: -1, }, "varnishstat (varnish-3.0.5 revision 1a89b1f)": &varnishVersion{ Major: 3, Minor: 0, Patch: 5, Revision: "1a89b1f", }, "varnish 2.0": &varnishVersion{ Major: 2, Minor: 0, Patch: -1, }, "varnish 1": &varnishVersion{ Major: 1, Minor: -1, Patch: -1, }, } for versionStr, test := range tests { v := NewVarnishVersion() if err := v.parseVersion(versionStr); err != nil { t.Error(err.Error()) continue } if test.Major != v.Major || test.Minor != v.Minor || test.Patch != v.Patch || test.Revision != v.Revision { t.Errorf("version mismatch on %q", versionStr) continue } t.Logf("%q > %s\n", versionStr, v.String()) if !test.EqualsOrGreater(test.Major, test.Minor) { t.Fatalf("%s does not satisfy itself", test) } if !test.EqualsOrGreater(test.Major-1, 0) { t.Fatalf("%s should satisfy version %d.0", test, test.Major-1) } if test.EqualsOrGreater(test.Major, test.Minor+1) { t.Fatalf("%s should not satisfy version %d.%d", test, test.Major, test.Minor+1) } } } func dummyBackendValue(backend string) (string, map[string]interface{}) { return fmt.Sprintf("VBE.%s.happy", backend), map[string]interface{}{ "description": "Happy health probes", "type": "VBE", "ident": backend, "flag": "b", "format": "b", "value": 0, } } func matchStringSlices(s1, s2 []string) bool { if len(s1) != len(s2) { return false } for i, v1 := range s1 { if s2[i] != v1 { return false } } return true } func Test_VarnishBackendNames(t *testing.T) { for _, variant := range [][]string{ {"eu1_x.y-z:w(192.52.0.192,,8085)", "eu1_x.y-z:w", "192.52.0.192,,8085"}, // 4.0.3 {"root:eu2_x.y-z:w", "eu2_x.y-z:w", "unknown"}, // 4.1 {"def0e7f7-a676-4eed-9d8b-78ef7ce21e93.us1_x.y-z:w", "us1_x.y-z:w", "def0e7f7-a676-4eed-9d8b-78ef7ce21e93"}, {"root:29813cbb-7329-4eb8-8969-26be2ef58c88.us2_x.y-z:w", "us2_x.y-z:w", "29813cbb-7329-4eb8-8969-26be2ef58c88"}, // ?? {"boot.default", "default", "unknown"}, {"reload_2019-08-29T100458.default", "default", "unknown"}, // varnish_reload_vcl in 4 {"reload_20191016_072034_54500.default", "default", "unknown"}, // varnishreload in 6+ {"ce19737f-72b5-4f4b-9d39-3d8c2d28240b.default", "default", "ce19737f-72b5-4f4b-9d39-3d8c2d28240b"}, } { backend := variant[0] expected_backend := variant[1] expected_server := variant[2] vName, data := dummyBackendValue(backend) var ( vGroup = prometheusGroup(vName) vDescription string vIdentifier string vErr error ) if value, ok := data["description"]; ok && vErr == nil { if vDescription, ok = value.(string); !ok { vErr = fmt.Errorf("%s description it not a string", vName) } } if value, ok := data["ident"]; ok && vErr == nil { if vIdentifier, ok = value.(string); !ok { vErr = fmt.Errorf("%s ident it not a string", vName) } } if vErr != nil { t.Error(vErr) return } // Varnish < 5.2 name_1, _, labelKeys_1, labelValues_1 := computePrometheusInfo(vName, vGroup, vIdentifier, vDescription) computed_backend := findLabelValue("backend", labelKeys_1, labelValues_1) computed_server := findLabelValue("server", labelKeys_1, labelValues_1) t.Logf("%s > %s > %s\n", vName, backend, name_1) t.Logf(" ident : %s\n", vIdentifier) t.Logf(" backend : %s\n", computed_backend) t.Logf(" server : %s\n", computed_server) if expected_backend != computed_backend { t.Fatalf("backend %q != %q", computed_backend, expected_backend) } if expected_server != expected_server { t.Fatalf("server %q != %q", computed_server, expected_server) } // Varnish >= 5.2 no longer has 'ident', test that detected correctly from vName name_2, _, labelKeys_2, labelValues_2 := computePrometheusInfo(vName, vGroup, "", vDescription) if name_1 != name_2 { t.Fatalf("name %q != %q", name_1, name_2) } if !matchStringSlices(labelKeys_1, labelKeys_2) { t.Fatalf("labelKeys %#v != %#v", labelKeys_1, labelKeys_2) } if !matchStringSlices(labelValues_1, labelValues_2) { t.Fatalf("labelKeys %#v != %#v", labelValues_1, labelValues_2) } } } func Test_VarnishMetrics(t *testing.T) { dir, _ := os.Getwd() if !fileExists(filepath.Join(dir, "test/scrape")) { t.Skipf("Cannot find test/scrape files from workind dir %s", dir) } for _, version := range testFileVersions { test := filepath.Join(dir, "test/scrape", version+".json") VarnishVersion.parseVersion(version) t.Logf("test scrape %s", VarnishVersion) buf, err := ioutil.ReadFile(test) if err != nil { t.Fatal(err.Error()) } done := make(chan bool) metrics := make(chan prometheus.Metric) descs := []*prometheus.Desc{} go func() { for m := range metrics { descs = append(descs, m.Desc()) } done <- true }() _, err = ScrapeVarnishFrom(buf, metrics) close(metrics) <-done if err != nil { t.Fatal(err.Error()) } t.Logf(" %d metrics", len(descs)) } } type testCollector struct { filepath string t *testing.T } func (tc *testCollector) Describe(ch chan<- *prometheus.Desc) { } func (tc *testCollector) Collect(ch chan<- prometheus.Metric) { buf, err := ioutil.ReadFile(tc.filepath) if err != nil { tc.t.Fatal(err.Error()) } _, err = ScrapeVarnishFrom(buf, ch) if err != nil { tc.t.Fatal(err.Error()) } } func Test_PrometheusExport(t *testing.T) { dir, _ := os.Getwd() if !fileExists(filepath.Join(dir, "test/scrape")) { t.Skipf("Cannot find test/scrape files from workind dir %s", dir) } for _, version := range testFileVersions { test := filepath.Join(dir, "test/scrape", version+".json") VarnishVersion.parseVersion(version) t.Logf("test scrape %s", VarnishVersion) registry := prometheus.NewRegistry() collector := &testCollector{filepath: test} registry.MustRegister(collector) gathering, err := registry.Gather() if err != nil { errors, ok := err.(prometheus.MultiError) if ok { for _, e := range errors { t.Errorf(" Error in prometheus Gather: %#v", e) } } else { t.Errorf(" Error in prometheus Gather: %#v", err) } } metricCount := 0 for _, mf := range gathering { metricCount += len(mf.Metric) } t.Logf(" %d metrics", metricCount) } } // Testing against a live varnish instance is only executed in build bot(s). // This is because the usual end user setup requires tests to be ran with sudo in order to work. func Test_VarnishMetrics_CI(t *testing.T) { if runtime.GOOS != "linux" { t.Skipf("Host needs to be linux to run live metrics test: %s", runtime.GOOS) return } else if os.Getenv("CONTINUOUS_INTEGRATION") != "true" { t.Skip("Live metrics test only ran on CI") return } StartParams.Verbose = true StartParams.Raw = true if err := VarnishVersion.Initialize(); err != nil { t.Fatal(err) } done := make(chan bool) metrics := make(chan prometheus.Metric) go func() { for m := range metrics { t.Logf("%s", m.Desc()) } done <- true }() if _, err := ScrapeVarnish(metrics); err != nil { t.Fatal(err) } close(metrics) <-done }