From f3199a57a1e2dae22393412db09cab150a17361f Mon Sep 17 00:00:00 2001 From: Mateusz Trojak Date: Tue, 13 Sep 2016 06:11:12 -0400 Subject: [PATCH] Initial Commit --- grafana/Docker Monitoring.json | 1485 ++++++++++++++++++++++ grafana/Dockerfile | 18 + grafana/run.sh | 85 ++ influxdb/Dockerfile | 12 + influxdb/influxdb.template.conf | 122 ++ influxdb/run.sh | 32 + rancher/0/docker-compose.yml | 64 + rancher/0/rancher-compose.yml | 44 + rancher/README.md | 3 + rancher/catalogIcon-tig-stack.png | Bin 0 -> 60939 bytes rancher/config.yml | 5 + rancher/docker-compose.yml | 62 + rancher/rancher-compose.yml | 30 + telegraf/Dockerfile | 12 + telegraf/run.sh | 15 + telegraf/telegraf.template.conf | 1944 +++++++++++++++++++++++++++++ 16 files changed, 3933 insertions(+) create mode 100644 grafana/Docker Monitoring.json create mode 100644 grafana/Dockerfile create mode 100644 grafana/run.sh create mode 100644 influxdb/Dockerfile create mode 100644 influxdb/influxdb.template.conf create mode 100644 influxdb/run.sh create mode 100644 rancher/0/docker-compose.yml create mode 100644 rancher/0/rancher-compose.yml create mode 100644 rancher/README.md create mode 100644 rancher/catalogIcon-tig-stack.png create mode 100644 rancher/config.yml create mode 100644 rancher/docker-compose.yml create mode 100644 rancher/rancher-compose.yml create mode 100644 telegraf/Dockerfile create mode 100644 telegraf/run.sh create mode 100644 telegraf/telegraf.template.conf diff --git a/grafana/Docker Monitoring.json b/grafana/Docker Monitoring.json new file mode 100644 index 0000000..339907e --- /dev/null +++ b/grafana/Docker Monitoring.json @@ -0,0 +1,1485 @@ +{ + "__inputs": [ + { + "name": "DS_DOCKER_INFLUXDB", + "label": "Docker InfluxDB", + "description": "", + "type": "datasource", + "pluginId": "influxdb", + "pluginName": "InfluxDB" + } + ], + "__requires": [ + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + }, + { + "type": "panel", + "id": "singlestat", + "name": "Singlestat", + "version": "" + }, + { + "type": "panel", + "id": "table", + "name": "Table", + "version": "" + }, + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "3.1.1" + }, + { + "type": "datasource", + "id": "influxdb", + "name": "InfluxDB", + "version": "1.0.0" + } + ], + "id": null, + "title": "Docker Monitoring", + "tags": [ + "monitoring", + "linux", + "bbh", + "docker" + ], + "style": "dark", + "timezone": "browser", + "editable": true, + "hideControls": false, + "sharedCrosshair": false, + "rows": [ + { + "collapse": false, + "editable": true, + "height": "200px", + "panels": [ + { + "aliasColors": {}, + "bars": false, + "datasource": "${DS_INFLUXDB_LINUX}", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "threshold1": 8, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": 10, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "id": 2, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 12, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "docker.cpu", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "docker_container_cpu", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "usage_percent" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$hostname$/" + } + ], + "timeField": "@timestamp" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Docker CPU Usage", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "short", + "label": "System Load", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + ], + "title": "System Usage" + }, + { + "collapse": false, + "editable": true, + "height": "200px", + "panels": [ + { + "aliasColors": {}, + "bars": false, + "datasource": "${DS_INFLUXDB_LINUX}", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "id": 1, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 12, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "mem.usage", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "docker_container_mem", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "policy": "default", + "refId": "D", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "usage" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$hostname$/" + } + ], + "timeField": "@timestamp" + }, + { + "alias": "mem.rss", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "docker_container_mem", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "policy": "default", + "refId": "C", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "rss" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$hostname$/" + } + ], + "timeField": "@timestamp" + }, + { + "alias": "mem.cache", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "docker_container_mem", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "cache" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$hostname$/" + } + ], + "timeField": "@timestamp" + }, + { + "alias": "mem.pagefaults", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "docker_container_mem", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "policy": "default", + "refId": "B", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "pgfault" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$hostname$/" + } + ], + "timeField": "@timestamp" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Docker Memory Stats", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "bytes", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + ], + "title": "New row" + }, + { + "collapse": false, + "editable": true, + "height": "250px", + "panels": [ + { + "aliasColors": {}, + "bars": false, + "datasource": "${DS_INFLUXDB_LINUX}", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "threshold1": 80, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": 95, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "id": 4, + "isNew": true, + "legend": { + "avg": false, + "current": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "seriesOverrides": [], + "span": 5.88785885167464, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "docker.containers", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": 0, + "trimEdges": 0 + }, + "type": "date_histogram" + } + ], + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "docker", + "metrics": [ + { + "field": "select field", + "id": "1", + "type": "count" + } + ], + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "n_containers" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$hostname$/" + } + ], + "timeField": "@timestamp" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Number of Running Containers", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "none", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "datasource": "${DS_INFLUXDB_LINUX}", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "threshold1": 80, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": 95, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "id": 3, + "isNew": true, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "disk.used", + "yaxis": 1 + } + ], + "span": 6.11214114832536, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "disk.used", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": 0, + "trimEdges": 0 + }, + "type": "date_histogram" + } + ], + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "disk", + "metrics": [ + { + "field": "select field", + "id": "1", + "type": "count" + } + ], + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "used_percent" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$hostname$/" + }, + { + "condition": "AND", + "key": "path", + "operator": "=", + "value": "/opt/apps" + } + ], + "timeField": "@timestamp" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Docker Disk Space Usage", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "short", + "label": "Disk Used %", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + ], + "title": "Memory and Disk" + }, + { + "collapse": false, + "editable": true, + "height": "200px", + "panels": [ + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "${DS_INFLUXDB_LINUX}", + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "id": 9, + "interval": null, + "isNew": true, + "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": "80%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "span": 2.9709554425837323, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": true, + "lineColor": "rgb(31, 120, 193)", + "show": true + }, + "targets": [ + { + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "mem", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "used_percent" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$hostname$/" + } + ], + "timeField": "@timestamp" + } + ], + "thresholds": "80,100", + "title": "Current Memory Usage", + "transparent": false, + "type": "singlestat", + "valueFontSize": "100%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "${DS_INFLUXDB_LINUX}", + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 5, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "id": 10, + "interval": null, + "isNew": true, + "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": 2.9250897129186604, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": true, + "lineColor": "rgb(31, 120, 193)", + "show": true + }, + "targets": [ + { + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "system", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "load1" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$hostname$/" + } + ], + "timeField": "@timestamp" + } + ], + "thresholds": "1.4,3", + "title": "Current Load", + "type": "singlestat", + "valueFontSize": "100%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "${DS_INFLUXDB_LINUX}", + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "hideTimeOverride": false, + "id": 7, + "interval": null, + "isNew": true, + "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": 3.0570798444976077, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [ + { + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "system", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "uptime_format" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$hostname$/" + } + ], + "timeField": "@timestamp" + } + ], + "thresholds": "", + "title": "System Uptime", + "transparent": false, + "type": "singlestat", + "valueFontSize": "100%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "max" + }, + { + "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_INFLUXDB_LINUX}", + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "id": 11, + "interval": null, + "isNew": true, + "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": 3.046875, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "docker", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "n_containers" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$hostname$/" + } + ] + } + ], + "thresholds": "", + "title": "Running Containers", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + } + ], + "title": "New row" + }, + { + "collapse": false, + "editable": true, + "height": "250px", + "panels": [ + { + "columns": [], + "datasource": "${DS_INFLUXDB_LINUX}", + "editable": true, + "error": false, + "fontSize": "100%", + "hideTimeOverride": false, + "id": 12, + "interval": "", + "isNew": true, + "links": [], + "pageSize": null, + "scroll": false, + "showHeader": true, + "sort": { + "col": 0, + "desc": true + }, + "span": 12, + "styles": [ + { + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "date" + }, + { + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "number", + "unit": "short" + } + ], + "targets": [ + { + "alias": "", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "container_image" + ], + "type": "tag" + }, + { + "params": [ + "container_name" + ], + "type": "tag" + }, + { + "params": [ + "io.rancher.container.ip" + ], + "type": "tag" + }, + { + "params": [ + "io.rancher.stack.name" + ], + "type": "tag" + } + ], + "measurement": "docker_container_blkio", + "policy": "default", + "refId": "A", + "resultFormat": "table", + "select": [ + [ + { + "params": [ + "container_id" + ], + "type": "field" + }, + { + "params": [], + "type": "distinct" + }, + { + "params": [ + "Container ID" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$hostname$/" + } + ] + } + ], + "timeFrom": "10m", + "title": "Running Docker Containers", + "transform": "table", + "type": "table" + } + ], + "title": "New row" + } + ], + "time": { + "from": "now-12h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "templating": { + "list": [ + { + "current": {}, + "datasource": "${DS_INFLUXDB_LINUX}", + "hide": 0, + "includeAll": false, + "label": "Docker Hostname", + "multi": false, + "name": "hostname", + "options": [], + "query": "SHOW TAG VALUES FROM docker WITH KEY = \"host\"", + "refresh": 1, + "regex": "", + "type": "query" + } + ] + }, + "annotations": { + "list": [] + }, + "refresh": "10s", + "schemaVersion": 12, + "version": 5, + "gnetId": null +} diff --git a/grafana/Dockerfile b/grafana/Dockerfile new file mode 100644 index 0000000..cedb509 --- /dev/null +++ b/grafana/Dockerfile @@ -0,0 +1,18 @@ +FROM grafana/grafana:latest +MAINTAINER Mateusz Trojak +LABEL version="1.0" +LABEL description="Grafana Image with added system variables" + +RUN apt-get -q update &&\ + DEBIAN_FRONTEND="noninteractive" apt-get -q upgrade -y -o Dpkg::Options::="--force-confnew" --no-install-recommends &&\ + DEBIAN_FRONTEND="noninteractive" apt-get -q install -y -o Dpkg::Options::="--force-confnew" --no-install-recommends curl &&\ + apt-get -q autoremove &&\ + apt-get -q clean -y && rm -rf /var/lib/apt/lists/* && rm -f /var/cache/apt/*.bin + +RUN rm -f /run.sh +ADD run.sh /run.sh +RUN chmod +x /run.sh +RUN mkdir /opt/grafana +ADD ["*.json", "/opt/grafana/"] +CMD ["/run.sh"] + diff --git a/grafana/run.sh b/grafana/run.sh new file mode 100644 index 0000000..7a51315 --- /dev/null +++ b/grafana/run.sh @@ -0,0 +1,85 @@ +#!/bin/bash -e + +: "${GF_PATHS_DATA:=/var/lib/grafana}" +: "${GF_PATHS_LOGS:=/var/log/grafana}" +: "${GF_PATHS_PLUGINS:=/var/lib/grafana/plugins}" + +chown -R grafana:grafana "$GF_PATHS_DATA" "$GF_PATHS_LOGS" +chown -R grafana:grafana /etc/grafana + +if [ ! -z ${GF_INSTALL_PLUGINS} ]; then + OLDIFS=$IFS + IFS=',' + for plugin in ${GF_INSTALL_PLUGINS}; do + grafana-cli plugins install ${plugin} + done + IFS=$OLDIFS +fi + +exec gosu grafana /usr/sbin/grafana-server \ + --homepath=/usr/share/grafana \ + --config=/etc/grafana/grafana.ini \ + cfg:default.paths.data="$GF_PATHS_DATA" \ + cfg:default.paths.logs="$GF_PATHS_LOGS" \ + cfg:default.paths.plugins="$GF_PATHS_PLUGINS" & + +sleep 5 + +############################################################### +# Creating Default Data Source + +# Set new Data Source name +INFLUXDB_DATA_SOURCE="Docker InfluxDB" +INFLUXDB_DATA_SOURCE_WEB=`echo ${INFLUXDB_DATA_SOURCE} | sed 's/ /%20/g'` + +# Set information about grafana host +GRAFANA_URL=`hostname -i` +GRAFANA_PORT="3000" +GRAFANA_USER="admin" +GRAFANA_PASSWORD="admin" + +# Check $INFLUXDB_DATA_SOURCE status +INFLUXDB_DATA_SOURCE_STATUS=`curl -s -L -i \ + -H "Accept: application/json" \ + -H "Content-Type: application/json" \ + -X GET http://${GRAFANA_USER}:${GRAFANA_PASSWORD}@${GRAFANA_URL}:${GRAFANA_PORT}/api/datasources/name/${INFLUXDB_DATA_SOURCE_WEB} | head -1 | awk '{print $2}'` + +curl -s -L -i \ + -H "Accept: application/json" \ + -H "Content-Type: application/json" \ + -X GET http://${GRAFANA_USER}:${GRAFANA_PASSWORD}@${GRAFANA_URL}:${GRAFANA_PORT}/api/datasources/name/${INFLUXDB_DATA_SOURCE_WEB} >>$GF_PATHS_LOGS/grafana.log 2>>$GF_PATHS_LOGS/grafana.log + +echo "http://${GRAFANA_USER}:${GRAFANA_PASSWORD}@${GRAFANA_URL}:${GRAFANA_PORT}/api/datasources/name/${INFLUXDB_DATA_SOURCE_WEB}" >> $GF_PATHS_LOGS/grafana.log + +echo "INFLUXDB_DATA_SOURCE_STATUS: "$INFLUXDB_DATA_SOURCE_STATUS >> $GF_PATHS_LOGS/grafana.log +echo "GRAFANA_URL: "$GRAFANA_URL >> $GF_PATHS_LOGS/grafana.log +echo "GRAFANA_PORT: "$GRAFANA_PORT >> $GF_PATHS_LOGS/grafana.log +echo "GRAFANA_USER: "$GRAFANA_USER >> $GF_PATHS_LOGS/grafana.log +echo "GRAFANA_PASSWORD: "$GRAFANA_PASSWORD >> $GF_PATHS_LOGS/grafana.log + +# Check if $INFLUXDB_DATA_SOURCE exists +if [ ${INFLUXDB_DATA_SOURCE_STATUS} != 200 ] +then + # If not exists, create one + echo "Data Source: '"${INFLUXDB_DATA_SOURCE}"' not found in Grafana configuration" + echo "Creating Data Source: '"$INFLUXDB_DATA_SOURCE}"'" + curl -L -i \ + -H "Accept: application/json" \ + -H "Content-Type: application/json" \ + -X POST -d '{ + "name":"'"${INFLUXDB_DATA_SOURCE}"'", + "type":"influxdb", + "url":"http://influxdb:8086", + "access":"proxy", + "basicAuth":false, + "database":"telegraf", + "user":"grafana", + "password":"grafana"} + ' \ + http://${GRAFANA_USER}:${GRAFANA_PASSWORD}@${GRAFANA_URL}:${GRAFANA_PORT}/api/datasources +else + #Continue if it doesn't exists + echo "Data Source '"${INFLUXDB_DATA_SOURCE}"' already exists." +fi + +tail -f $GF_PATHS_LOGS/grafana.log/grafana.log diff --git a/influxdb/Dockerfile b/influxdb/Dockerfile new file mode 100644 index 0000000..e7bb6be --- /dev/null +++ b/influxdb/Dockerfile @@ -0,0 +1,12 @@ +FROM influxdb:latest +MAINTAINER Mateusz Trojak +LABEL version="1.0" +LABEL description="InfluxDB Image with added system variables" + +ADD influxdb.template.conf /influxdb.template.conf + +ADD run.sh /run.sh +RUN chmod +x /run.sh + +CMD ["/run.sh"] + diff --git a/influxdb/influxdb.template.conf b/influxdb/influxdb.template.conf new file mode 100644 index 0000000..ed9c066 --- /dev/null +++ b/influxdb/influxdb.template.conf @@ -0,0 +1,122 @@ +reporting-disabled = false +bind-address = ":8088" + +[meta] + dir = "/var/lib/influxdb/meta" + retention-autocreate = true + logging-enabled = true + +[data] + dir = "/var/lib/influxdb/data" + engine = "tsm1" + wal-dir = "/var/lib/influxdb/wal" + wal-logging-enabled = true + query-log-enabled = true + cache-max-memory-size = 524288000 + cache-snapshot-memory-size = 26214400 + cache-snapshot-write-cold-duration = "1h0m0s" + compact-full-write-cold-duration = "24h0m0s" + max-points-per-block = 0 + max-series-per-database = 1000000 + trace-logging-enabled = false + +[coordinator] + write-timeout = "10s" + max-concurrent-queries = 0 + query-timeout = "0" + log-queries-after = "0" + max-select-point = 0 + max-select-series = 0 + max-select-buckets = 0 + +[retention] + enabled = true + check-interval = "30m0s" + +[shard-precreation] + enabled = true + check-interval = "10m0s" + advance-period = "30m0s" + +[admin] + enabled = true + bind-address = ":8083" + https-enabled = false + https-certificate = "/etc/ssl/influxdb.pem" + +[monitor] + store-enabled = true + store-database = "_internal" + store-interval = "10s" + +[subscriber] + enabled = true + http-timeout = "30s" + +[http] + enabled = true + bind-address = ":8086" + auth-enabled = false + log-enabled = true + write-tracing = false + https-enabled = false + https-certificate = "/etc/ssl/influxdb.pem" + https-private-key = "" + max-row-limit = 10000 + max-connection-limit = 0 + shared-secret = "" + realm = "InfluxDB" + +[[graphite]] + enabled = false + bind-address = ":2003" + database = "graphite" + retention-policy = "" + protocol = "tcp" + batch-size = 5000 + batch-pending = 10 + batch-timeout = "1s" + consistency-level = "one" + separator = "." + udp-read-buffer = 0 + +[[collectd]] + enabled = false + bind-address = ":25826" + database = "collectd" + retention-policy = "" + batch-size = 5000 + batch-pending = 10 + batch-timeout = "10s" + read-buffer = 0 + typesdb = "/usr/share/collectd/types.db" + +[[opentsdb]] + enabled = false + bind-address = ":4242" + database = "opentsdb" + retention-policy = "" + consistency-level = "one" + tls-enabled = false + certificate = "/etc/ssl/influxdb.pem" + batch-size = 1000 + batch-pending = 5 + batch-timeout = "1s" + log-point-errors = true + +[[udp]] + enabled = false + bind-address = ":8089" + database = "udp" + retention-policy = "" + batch-size = 5000 + batch-pending = 10 + read-buffer = 0 + batch-timeout = "1s" + precision = "" + +[continuous_queries] + log-enabled = true + enabled = true + run-interval = "1s" + diff --git a/influxdb/run.sh b/influxdb/run.sh new file mode 100644 index 0000000..ce1b59b --- /dev/null +++ b/influxdb/run.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +set -m +CONFIG_TEMPLATE="/influxdb.template.conf" +CONFIG_FILE="/etc/influxdb/influxdb.conf" + +INFLUX_HOST="localhost" +INFLUX_API_PORT="8086" +[ "${INLFUX_ADMIN_USER}" = "" ] && + INLFUX_ADMIN_USER="grafana" +[ "${INFLUX_ADMIN_PASS}" = "" ] && + INFLUX_ADMIN_PASS="grafana" +[ "${INFLUX_DATABASE}" = "" ] && + JENKINS_BIN="telegraf" + +mv -v $CONFIG_FILE $CONFIG_FILE".orig" +mv -v $CONFIG_TEMPLATE $CONFIG_FILE + +exec influxd -config=$CONFIG_FILE 1>>/var/log/influxdb/influxdb.log 2>&1 & +sleep 5 + +USER_EXISTS=`influx -host=${INFLUX_HOST} -port=${INFLUX_API_PORT} -execute="SHOW USERS" | awk '{print $1}' | grep "${INLFUX_ADMIN_USER}" | wc -l` + +if [ -n ${USER_EXISTS} ] +then + influx -host=${INFLUX_HOST} -port=${INFLUX_API_PORT} -execute="CREATE USER ${INLFUX_ADMIN_USER} WITH PASSWORD '${INFLUX_ADMIN_PASS}' WITH ALL PRIVILEGES" + influx -host=${INFLUX_HOST} -port=${INFLUX_API_PORT} -username=${INLFUX_ADMIN_USER} -password="${INFLUX_ADMIN_PASS}" -execute="create database ${INFLUX_DATABASE}" + influx -host=${INFLUX_HOST} -port=${INFLUX_API_PORT} -username=${INLFUX_ADMIN_USER} -password="${INFLUX_ADMIN_PASS}" -execute="grant all PRIVILEGES on ${INFLUX_DATABASE} to ${INLFUX_ADMIN_USER}" +fi + +tail -f /var/log/influxdb/influxdb.log + diff --git a/rancher/0/docker-compose.yml b/rancher/0/docker-compose.yml new file mode 100644 index 0000000..9713612 --- /dev/null +++ b/rancher/0/docker-compose.yml @@ -0,0 +1,64 @@ +grafana: + image: grafana-test + ports: + - ${grafana_port}:3000 + links: + - influxdb:influxdb + environment: + GF_INSTALL_PLUGINS: abhisant-druid-datasource + GF_SECURITY_ADMIN_USER: admin + GF_SECURITY_ADMIN_PASSWORD: admin + GF_SECURITY_SECRET_KEY: grafana + GF_USERS_ALLOW_SIGN_UP: 'true' + GF_USERS_ALLOW_ORG_CREATE: 'true' + GF_AUTH_ANONYMOUS_ENABLED: 'true' + GF_AUTH_ANONYMOUS_ORG_NAME: grafana + GF_DASHBOARDS_JSON_ENABLED: 'true' + GF_DASHBOARDS_JSON_PATH: /opt/grafana + http_proxy: ${http_proxy} + https_proxy: ${https_proxy} + labels: + io.rancher.sidekicks: grafana-data + volumes_from: + - grafana-data + +grafana-data: + image: busybox + tty: true + volumes: + - /var/lib/grafana + - /var/log/grafana + - /var/lib/grafana/plugins + +influxdb: + image: influxdb-test + ports: + - ${influx_ui}:8083 + - ${influx_db}:8086 + environment: + INFLUX_DATABASE: "telegraf" + INLFUX_ADMIN_USER: "grafana" + INFLUX_ADMIN_PASS: "grafana" + volumes_from: + - influxdb-data + +influxdb-data: + image: busybox + tty: true + volumes: + - /var/lib/influxdb + +telegraf: + image: telegraf-test + links: + - influxdb:influxdb + environment: + HOST_NAME: "telegraf" + INFLUXDB_HOST: "influxdb" + INFLUXDB_PORT: "8086" + DATABASE: "telegraf" + tty: true + volumes: + - /var/run/docker.sock:/var/run/docker.sock + privileged: true + diff --git a/rancher/0/rancher-compose.yml b/rancher/0/rancher-compose.yml new file mode 100644 index 0000000..e4733e9 --- /dev/null +++ b/rancher/0/rancher-compose.yml @@ -0,0 +1,44 @@ +.catalog: + name: "TIG Stack" + version: "v0.0.1" + description: | + (Experimental) Telegraf, InfluxDB, Grafana + uuid: tig-0 + minimum_rancher_version: v0.51.0 + questions: + - variable: grafana_port + description: "Port to access Grafana" + label: "Grafana UI Port" + required: true + default: "3012" + type: "int" + - variable: plugins + description: "Coma separated list of Grafana Plugins to be installed plugins." + label: "List of Grafana Plugins plugins" + required: true + default: "abhisant-druid-datasource,alexanderzobnin-zabbix-app,bosun-app,bosun-datasource,crate-datasource,fastweb-openfalcon-datasource,fetzerch-sunandmoon-datasource,grafana-clock-panel,grafana-example-app,grafana-influxdb-08-datasource,grafana-kairosdb-datasource,grafana-piechart-panel,grafana-simple-json-datasource,grafana-worldmap-panel,kentik-app,mtanda-heatmap-epoch-panel,mtanda-histogram-panel,ns1-app,opennms-datasource,percona-percona-app,praj-ams-datasource,raintank-snap-app,raintank-worldping-app,sileht-gnocchi-datasource,sraoss-sunburst-panel,stagemonitor-elasticsearch-app,udoprog-heroic-datasource,voxter-app" + type: "string" + - variable: influx_ui + description: "Port to access InfluxDB UI" + label: "InfluxDB UI" + required: true + default: "8083" + type: "string" + - variable: influx_db + description: "Port to access InfluxDB DB" + label: "InfluxDB DB" + required: true + default: "8086" + type: "string" + - variable: http_proxy + description: "In case you are at corporate network, setup http_proxy variable" + label: "http_proxy" + required: false + default: "" + type: "string" + - variable: https_proxy + description: "In case you are at corporate network, setup https_proxy variable" + label: "https_proxy" + required: false + default: "" + type: "string" diff --git a/rancher/README.md b/rancher/README.md new file mode 100644 index 0000000..1dc99c9 --- /dev/null +++ b/rancher/README.md @@ -0,0 +1,3 @@ +## What is inside TIG Stack? +* Telegraf, InfluxDB, Grafana + diff --git a/rancher/catalogIcon-tig-stack.png b/rancher/catalogIcon-tig-stack.png new file mode 100644 index 0000000000000000000000000000000000000000..a17d7cf224d6b5d4fea9962b384a5396db9a4bae GIT binary patch literal 60939 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

5S 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 VCS=Xi6^JQ=k`$E_ss5=S@P9s#@P_~Z literal 0 HcmV?d00001 diff --git a/rancher/config.yml b/rancher/config.yml new file mode 100644 index 0000000..3ab0143 --- /dev/null +++ b/rancher/config.yml @@ -0,0 +1,5 @@ +name: TIG Stack +description: | + (Experimental) Telegraf, InfluxDB, Grafana for docker monitoring. +version: v0.0.1 +category: Monitoring diff --git a/rancher/docker-compose.yml b/rancher/docker-compose.yml new file mode 100644 index 0000000..e3abc9d --- /dev/null +++ b/rancher/docker-compose.yml @@ -0,0 +1,62 @@ +grafana: + image: grafana-test + ports: + - 3012:3000 + links: + - influxdb:influxdb + environment: + GF_INSTALL_PLUGINS: abhisant-druid-datasource + GF_SECURITY_ADMIN_USER: admin + GF_SECURITY_ADMIN_PASSWORD: admin + GF_SECURITY_SECRET_KEY: grafana + GF_USERS_ALLOW_SIGN_UP: 'true' + GF_USERS_ALLOW_ORG_CREATE: 'true' + GF_AUTH_ANONYMOUS_ENABLED: 'true' + GF_AUTH_ANONYMOUS_ORG_NAME: grafana + GF_DASHBOARDS_JSON_ENABLED: 'true' + GF_DASHBOARDS_JSON_PATH: /opt/grafana + labels: + io.rancher.sidekicks: grafana-data + volumes_from: + - grafana-data + +grafana-data: + image: busybox + tty: true + volumes: + - /var/lib/grafana + - /var/log/grafana + - /var/lib/grafana/plugins + +influxdb: + image: influxdb-test + ports: + - 8183:8083 + - 8186:8086 + environment: + INFLUX_DATABASE: "telegraf" + INLFUX_ADMIN_USER: "grafana" + INFLUX_ADMIN_PASS: "grafana" + volumes_from: + - influxdb-data + +influxdb-data: + image: busybox + tty: true + volumes: + - /var/lib/influxdb + +telegraf: + image: telegraf-test + links: + - influxdb:influxdb + environment: + HOST_NAME: "telegraf" + INFLUXDB_HOST: "influxdb" + INFLUXDB_PORT: "8086" + DATABASE: "telegraf" + tty: true + volumes: + - /var/run/docker.sock:/var/run/docker.sock + privileged: true + diff --git a/rancher/rancher-compose.yml b/rancher/rancher-compose.yml new file mode 100644 index 0000000..1dc97e7 --- /dev/null +++ b/rancher/rancher-compose.yml @@ -0,0 +1,30 @@ +log: + name: "Grafana" + version: "3.0.2-rancher1" + description: | + (Experimental) Grafana: Beautiful metric & analytic dashboards + questions: + - variable: http_port + description: "http port to access Grafana" + label: "Http Port" + required: true + default: "3000" + type: "int" + - variable: plugins + description: "Coma separated list of Grafana Plugins to be installed plugins." + label: "List of Grafana Plugins plugins" + required: true + default: "abhisant-druid-datasource,alexanderzobnin-zabbix-app,bosun-app,bosun-datasource,crate-datasource,fastweb-openfalcon-datasource,fetzerch-sunandmoon-datasource,grafana-clock-panel,grafana-example-app,grafana-influxdb-08-datasource,grafana-kairosdb-datasource,grafana-piechart-panel,grafana-simple-json-datasource,grafana-worldmap-panel,kentik-app,mtanda-heatmap-epoch-panel,mtanda-histogram-panel,ns1-app,opennms-datasource,percona-percona-app,praj-ams-datasource,raintank-snap-app,raintank-worldping-app,sileht-gnocchi-datasource,sraoss-sunburst-panel,stagemonitor-elasticsearch-app,udoprog-heroic-datasource,voxter-app" + type: "string" + - variable: http_proxy + description: "In case you are at corporate network, setup http_proxy variable" + label: "http_proxy" + required: false + default: "" + type: "string" + - variable: https_proxy + description: "In case you are at corporate network, setup https_proxy variable" + label: "https_proxy" + required: false + default: "" + type: "string" diff --git a/telegraf/Dockerfile b/telegraf/Dockerfile new file mode 100644 index 0000000..95c3984 --- /dev/null +++ b/telegraf/Dockerfile @@ -0,0 +1,12 @@ +FROM telegraf:latest +MAINTAINER Mateusz Trojak +LABEL version="1.0" +LABEL description="Telegraf Image with added system variables" + +ADD telegraf.template.conf /telegraf.template.conf + +ADD run.sh /run.sh +RUN chmod +x /*.sh + +CMD ["/run.sh"] + diff --git a/telegraf/run.sh b/telegraf/run.sh new file mode 100644 index 0000000..365f80b --- /dev/null +++ b/telegraf/run.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +set -m +CONFIG_TEMPLATE="/telegraf.template.conf" +CONFIG_FILE="/etc/telegraf/telegraf.conf" + +sed -e "s/\${HOST_NAME}/$HOST_NAME/" \ + -e "s!\${INFLUXDB_HOST}!$INFLUXDB_HOST!" \ + -e "s/\${INFLUXDB_PORT}/$INFLUXDB_PORT/" \ + -e "s/\${DATABASE}/$DATABASE/" \ + $CONFIG_TEMPLATE > $CONFIG_FILE + +echo "=> Starting Telegraf ..." + +exec telegraf -config /etc/telegraf/telegraf.conf diff --git a/telegraf/telegraf.template.conf b/telegraf/telegraf.template.conf new file mode 100644 index 0000000..b739e5e --- /dev/null +++ b/telegraf/telegraf.template.conf @@ -0,0 +1,1944 @@ +# Telegraf Configuration +# +# Telegraf is entirely plugin driven. All metrics are gathered from the +# declared inputs, and sent to the declared outputs. +# +# Plugins must be declared in here to be active. +# To deactivate a plugin, comment out the name and any variables. +# +# Use 'telegraf -config telegraf.conf -test' to see what metrics a config +# file would generate. +# +# Environment variables can be used anywhere in this config file, simply prepend +# them with $. For strings the variable must be within quotes (ie, "$STR_VAR"), +# for numbers and booleans they should be plain (ie, $INT_VAR, $BOOL_VAR) + +# Global tags can be specified here in key="value" format. +[global_tags] + # dc = "us-east-1" # will tag all metrics with dc=us-east-1 + # rack = "1a" + ## Environment variables can be used as tags, and throughout the config file + # user = "$USER" + + +# Configuration for telegraf agent +[agent] + ## Default data collection interval for all inputs + interval = "10s" + ## Rounds collection interval to 'interval' + ## ie, if interval="10s" then always collect on :00, :10, :20, etc. + round_interval = true + + ## Telegraf will send metrics to outputs in batches of at + ## most metric_batch_size metrics. + metric_batch_size = 1000 + ## For failed writes, telegraf will cache metric_buffer_limit metrics for each + ## output, and will flush this buffer on a successful write. Oldest metrics + ## are dropped first when this buffer fills. + metric_buffer_limit = 10000 + + ## Collection jitter is used to jitter the collection by a random amount. + ## Each plugin will sleep for a random time within jitter before collecting. + ## This can be used to avoid many plugins querying things like sysfs at the + ## same time, which can have a measurable effect on the system. + collection_jitter = "0s" + + ## Default flushing interval for all outputs. You shouldn't set this below + ## interval. Maximum flush_interval will be flush_interval + flush_jitter + flush_interval = "10s" + ## Jitter the flush interval by a random amount. This is primarily to avoid + ## large write spikes for users running a large number of telegraf instances. + ## ie, a jitter of 5s and interval 10s means flushes will happen every 10-15s + flush_jitter = "0s" + + ## By default, precision will be set to the same timestamp order as the + ## collection interval, with the maximum being 1s. + ## Precision will NOT be used for service inputs, such as logparser and statsd. + ## Valid values are "ns", "us" (or "µs"), "ms", "s". + precision = "" + ## Run telegraf in debug mode + debug = false + ## Run telegraf in quiet mode + quiet = false + ## Override default hostname, if empty use os.Hostname() + hostname = "${HOST_NAME}" + ## If set to true, do no set the "host" tag in the telegraf agent. + omit_hostname = false + + +############################################################################### +# OUTPUT PLUGINS # +############################################################################### + +# Configuration for influxdb server to send metrics to +[[outputs.influxdb]] + ## The full HTTP or UDP endpoint URL for your InfluxDB instance. + ## Multiple urls can be specified as part of the same cluster, + ## this means that only ONE of the urls will be written to each interval. + # urls = ["udp://localhost:8089"] # UDP endpoint example + urls = ["http://${INFLUXDB_HOST}:${INFLUXDB_PORT}"] # required + ## The target database for metrics (telegraf will create it if not exists). + database = "${DATABASE}" # required + + ## Retention policy to write to. Empty string writes to the default rp. + retention_policy = "" + ## Write consistency (clusters only), can be: "any", "one", "quorum", "all" + write_consistency = "any" + + ## Write timeout (for the InfluxDB client), formatted as a string. + ## If not provided, will default to 5s. 0s means no timeout (not recommended). + timeout = "5s" + # username = "telegraf" + # password = "metricsmetricsmetricsmetrics" + ## Set the user agent for HTTP POSTs (can be useful for log differentiation) + # user_agent = "telegraf" + ## Set UDP payload size, defaults to InfluxDB UDP Client default (512 bytes) + # udp_payload = 512 + + ## Optional SSL Config + # ssl_ca = "/etc/telegraf/ca.pem" + # ssl_cert = "/etc/telegraf/cert.pem" + # ssl_key = "/etc/telegraf/key.pem" + ## Use SSL but skip chain & host verification + # insecure_skip_verify = false + + +# # Configuration for Amon Server to send metrics to. +# [[outputs.amon]] +# ## Amon Server Key +# server_key = "my-server-key" # required. +# +# ## Amon Instance URL +# amon_instance = "https://youramoninstance" # required +# +# ## Connection timeout. +# # timeout = "5s" + + +# # Configuration for the AMQP server to send metrics to +# [[outputs.amqp]] +# ## AMQP url +# url = "amqp://localhost:5672/influxdb" +# ## AMQP exchange +# exchange = "telegraf" +# ## Auth method. PLAIN and EXTERNAL are supported +# # auth_method = "PLAIN" +# ## Telegraf tag to use as a routing key +# ## ie, if this tag exists, it's value will be used as the routing key +# routing_tag = "host" +# +# ## InfluxDB retention policy +# # retention_policy = "default" +# ## InfluxDB database +# # database = "telegraf" +# ## InfluxDB precision +# # precision = "s" +# +# ## Optional SSL Config +# # ssl_ca = "/etc/telegraf/ca.pem" +# # ssl_cert = "/etc/telegraf/cert.pem" +# # ssl_key = "/etc/telegraf/key.pem" +# ## Use SSL but skip chain & host verification +# # insecure_skip_verify = false +# +# ## Data format to output. +# ## Each data format has it's own unique set of configuration options, read +# ## more about them here: +# ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_OUTPUT.md +# data_format = "influx" + + +# # Configuration for AWS CloudWatch output. +# [[outputs.cloudwatch]] +# ## Amazon REGION +# region = 'us-east-1' +# +# ## Amazon Credentials +# ## Credentials are loaded in the following order +# ## 1) Assumed credentials via STS if role_arn is specified +# ## 2) explicit credentials from 'access_key' and 'secret_key' +# ## 3) shared profile from 'profile' +# ## 4) environment variables +# ## 5) shared credentials file +# ## 6) EC2 Instance Profile +# #access_key = "" +# #secret_key = "" +# #token = "" +# #role_arn = "" +# #profile = "" +# #shared_credential_file = "" +# +# ## Namespace for the CloudWatch MetricDatums +# namespace = 'InfluxData/Telegraf' + + +# # Configuration for DataDog API to send metrics to. +# [[outputs.datadog]] +# ## Datadog API key +# apikey = "my-secret-key" # required. +# +# ## Connection timeout. +# # timeout = "5s" + + +# # Send telegraf metrics to file(s) +# [[outputs.file]] +# ## Files to write to, "stdout" is a specially handled file. +# files = ["stdout", "/tmp/metrics.out"] +# +# ## Data format to output. +# ## Each data format has it's own unique set of configuration options, read +# ## more about them here: +# ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_OUTPUT.md +# data_format = "influx" + + +# # Configuration for Graphite server to send metrics to +# [[outputs.graphite]] +# ## TCP endpoint for your graphite instance. +# ## If multiple endpoints are configured, output will be load balanced. +# ## Only one of the endpoints will be written to with each iteration. +# servers = ["localhost:2003"] +# ## Prefix metrics name +# prefix = "" +# ## Graphite output template +# ## see https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_OUTPUT.md +# template = "host.tags.measurement.field" +# ## timeout in seconds for the write connection to graphite +# timeout = 2 + + +# # Send telegraf metrics to graylog(s) +# [[outputs.graylog]] +# ## Udp endpoint for your graylog instance. +# servers = ["127.0.0.1:12201", "192.168.1.1:12201"] + + +# # Configuration for sending metrics to an Instrumental project +# [[outputs.instrumental]] +# ## Project API Token (required) +# api_token = "API Token" # required +# ## Prefix the metrics with a given name +# prefix = "" +# ## Stats output template (Graphite formatting) +# ## see https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_OUTPUT.md#graphite +# template = "host.tags.measurement.field" +# ## Timeout in seconds to connect +# timeout = "2s" +# ## Display Communcation to Instrumental +# debug = false + + +# # Configuration for the Kafka server to send metrics to +# [[outputs.kafka]] +# ## URLs of kafka brokers +# brokers = ["localhost:9092"] +# ## Kafka topic for producer messages +# topic = "telegraf" +# ## Telegraf tag to use as a routing key +# ## ie, if this tag exists, it's value will be used as the routing key +# routing_tag = "host" +# +# ## CompressionCodec represents the various compression codecs recognized by +# ## Kafka in messages. +# ## 0 : No compression +# ## 1 : Gzip compression +# ## 2 : Snappy compression +# compression_codec = 0 +# +# ## RequiredAcks is used in Produce Requests to tell the broker how many +# ## replica acknowledgements it must see before responding +# ## 0 : the producer never waits for an acknowledgement from the broker. +# ## This option provides the lowest latency but the weakest durability +# ## guarantees (some data will be lost when a server fails). +# ## 1 : the producer gets an acknowledgement after the leader replica has +# ## received the data. This option provides better durability as the +# ## client waits until the server acknowledges the request as successful +# ## (only messages that were written to the now-dead leader but not yet +# ## replicated will be lost). +# ## -1: the producer gets an acknowledgement after all in-sync replicas have +# ## received the data. This option provides the best durability, we +# ## guarantee that no messages will be lost as long as at least one in +# ## sync replica remains. +# required_acks = -1 +# +# ## The total number of times to retry sending a message +# max_retry = 3 +# +# ## Optional SSL Config +# # ssl_ca = "/etc/telegraf/ca.pem" +# # ssl_cert = "/etc/telegraf/cert.pem" +# # ssl_key = "/etc/telegraf/key.pem" +# ## Use SSL but skip chain & host verification +# # insecure_skip_verify = false +# +# ## Data format to output. +# ## Each data format has it's own unique set of configuration options, read +# ## more about them here: +# ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_OUTPUT.md +# data_format = "influx" + + +# # Configuration for the AWS Kinesis output. +# [[outputs.kinesis]] +# ## Amazon REGION of kinesis endpoint. +# region = "ap-southeast-2" +# +# ## Amazon Credentials +# ## Credentials are loaded in the following order +# ## 1) Assumed credentials via STS if role_arn is specified +# ## 2) explicit credentials from 'access_key' and 'secret_key' +# ## 3) shared profile from 'profile' +# ## 4) environment variables +# ## 5) shared credentials file +# ## 6) EC2 Instance Profile +# #access_key = "" +# #secret_key = "" +# #token = "" +# #role_arn = "" +# #profile = "" +# #shared_credential_file = "" +# +# ## Kinesis StreamName must exist prior to starting telegraf. +# streamname = "StreamName" +# ## PartitionKey as used for sharding data. +# partitionkey = "PartitionKey" +# ## format of the Data payload in the kinesis PutRecord, supported +# ## String and Custom. +# format = "string" +# ## debug will show upstream aws messages. +# debug = false + + +# # Configuration for Librato API to send metrics to. +# [[outputs.librato]] +# ## Librator API Docs +# ## http://dev.librato.com/v1/metrics-authentication +# ## Librato API user +# api_user = "telegraf@influxdb.com" # required. +# ## Librato API token +# api_token = "my-secret-token" # required. +# ## Debug +# # debug = false +# ## Connection timeout. +# # timeout = "5s" +# ## Output source Template (same as graphite buckets) +# ## see https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_OUTPUT.md#graphite +# ## This template is used in librato's source (not metric's name) +# template = "host" +# + + +# # Configuration for MQTT server to send metrics to +# [[outputs.mqtt]] +# servers = ["localhost:1883"] # required. +# +# ## MQTT outputs send metrics to this topic format +# ## "///" +# ## ex: prefix/web01.example.com/mem +# topic_prefix = "telegraf" +# +# ## username and password to connect MQTT server. +# # username = "telegraf" +# # password = "metricsmetricsmetricsmetrics" +# +# ## Optional SSL Config +# # ssl_ca = "/etc/telegraf/ca.pem" +# # ssl_cert = "/etc/telegraf/cert.pem" +# # ssl_key = "/etc/telegraf/key.pem" +# ## Use SSL but skip chain & host verification +# # insecure_skip_verify = false +# +# ## Data format to output. +# ## Each data format has it's own unique set of configuration options, read +# ## more about them here: +# ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_OUTPUT.md +# data_format = "influx" + + +# # Send telegraf measurements to NSQD +# [[outputs.nsq]] +# ## Location of nsqd instance listening on TCP +# server = "localhost:4150" +# ## NSQ topic for producer messages +# topic = "telegraf" +# +# ## Data format to output. +# ## Each data format has it's own unique set of configuration options, read +# ## more about them here: +# ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_OUTPUT.md +# data_format = "influx" + + +# # Configuration for OpenTSDB server to send metrics to +# [[outputs.opentsdb]] +# ## prefix for metrics keys +# prefix = "my.specific.prefix." +# +# ## Telnet Mode ## +# ## DNS name of the OpenTSDB server in telnet mode +# host = "opentsdb.example.com" +# +# ## Port of the OpenTSDB server in telnet mode +# port = 4242 +# +# ## Debug true - Prints OpenTSDB communication +# debug = false + + +# # Configuration for the Prometheus client to spawn +# [[outputs.prometheus_client]] +# ## Address to listen on +# # listen = ":9126" + + +# # Configuration for the Riemann server to send metrics to +# [[outputs.riemann]] +# ## URL of server +# url = "localhost:5555" +# ## transport protocol to use either tcp or udp +# transport = "tcp" +# ## separator to use between input name and field name in Riemann service name +# separator = " " + + + +############################################################################### +# INPUT PLUGINS # +############################################################################### + +# Read metrics about cpu usage +[[inputs.cpu]] + ## Whether to report per-cpu stats or not + percpu = true + ## Whether to report total system cpu stats or not + totalcpu = true + ## Comment this line if you want the raw CPU time metrics + fielddrop = ["time_*"] + + +# Read metrics about disk usage by mount point +[[inputs.disk]] + ## By default, telegraf gather stats for all mountpoints. + ## Setting mountpoints will restrict the stats to the specified mountpoints. + # mount_points = ["/"] + + ## Ignore some mountpoints by filesystem type. For example (dev)tmpfs (usually + ## present on /run, /var/run, /dev/shm or /dev). + ignore_fs = ["tmpfs", "devtmpfs"] + + +# Read metrics about disk IO by device +[[inputs.diskio]] + ## By default, telegraf will gather stats for all devices including + ## disk partitions. + ## Setting devices will restrict the stats to the specified devices. + # devices = ["sda", "sdb"] + ## Uncomment the following line if you need disk serial numbers. + # skip_serial_number = false + + +# Get kernel statistics from /proc/stat +[[inputs.kernel]] + # no configuration + + +# Read metrics about memory usage +[[inputs.mem]] + # no configuration + + +# Get the number of processes and group them by status +[[inputs.processes]] + # no configuration + + +# Read metrics about swap memory usage +[[inputs.swap]] + # no configuration + + +# Read metrics about system load & uptime +[[inputs.system]] + # no configuration + + +# # Read stats from aerospike server(s) +# [[inputs.aerospike]] +# ## Aerospike servers to connect to (with port) +# ## This plugin will query all namespaces the aerospike +# ## server has configured and get stats for them. +# servers = ["localhost:3000"] + + +# # Read Apache status information (mod_status) +# [[inputs.apache]] +# ## An array of Apache status URI to gather stats. +# ## Default is "http://localhost/server-status?auto". +# urls = ["http://localhost/server-status?auto"] + + +# # Read metrics of bcache from stats_total and dirty_data +# [[inputs.bcache]] +# ## Bcache sets path +# ## If not specified, then default is: +# bcachePath = "/sys/fs/bcache" +# +# ## By default, telegraf gather stats for all bcache devices +# ## Setting devices will restrict the stats to the specified +# ## bcache devices. +# bcacheDevs = ["bcache0"] + + +# # Read Cassandra metrics through Jolokia +# [[inputs.cassandra]] +# # This is the context root used to compose the jolokia url +# context = "/jolokia/read" +# ## List of cassandra servers exposing jolokia read service +# servers = ["myuser:mypassword@10.10.10.1:8778","10.10.10.2:8778",":8778"] +# ## List of metrics collected on above servers +# ## Each metric consists of a jmx path. +# ## This will collect all heap memory usage metrics from the jvm and +# ## ReadLatency metrics for all keyspaces and tables. +# ## "type=Table" in the query works with Cassandra3.0. Older versions might +# ## need to use "type=ColumnFamily" +# metrics = [ +# "/java.lang:type=Memory/HeapMemoryUsage", +# "/org.apache.cassandra.metrics:type=Table,keyspace=*,scope=*,name=ReadLatency" +# ] + + +# # Collects performance metrics from the MON and OSD nodes in a Ceph storage cluster. +# [[inputs.ceph]] +# ## All configuration values are optional, defaults are shown below +# +# ## location of ceph binary +# ceph_binary = "/usr/bin/ceph" +# +# ## directory in which to look for socket files +# socket_dir = "/var/run/ceph" +# +# ## prefix of MON and OSD socket files, used to determine socket type +# mon_prefix = "ceph-mon" +# osd_prefix = "ceph-osd" +# +# ## suffix used to identify socket files +# socket_suffix = "asok" + + +# # Read specific statistics per cgroup +# [[inputs.cgroup]] +# ## Directories in which to look for files, globs are supported. +# # paths = [ +# # "/cgroup/memory", +# # "/cgroup/memory/child1", +# # "/cgroup/memory/child2/*", +# # ] +# ## cgroup stat fields, as file names, globs are supported. +# ## these file names are appended to each path from above. +# # files = ["memory.*usage*", "memory.limit_in_bytes"] + + +# # Get standard chrony metrics, requires chronyc executable. +# [[inputs.chrony]] +# ## If true, chronyc tries to perform a DNS lookup for the time server. +# # dns_lookup = false + + +# # Pull Metric Statistics from Amazon CloudWatch +# [[inputs.cloudwatch]] +# ## Amazon Region +# region = 'us-east-1' +# +# ## Amazon Credentials +# ## Credentials are loaded in the following order +# ## 1) Assumed credentials via STS if role_arn is specified +# ## 2) explicit credentials from 'access_key' and 'secret_key' +# ## 3) shared profile from 'profile' +# ## 4) environment variables +# ## 5) shared credentials file +# ## 6) EC2 Instance Profile +# #access_key = "" +# #secret_key = "" +# #token = "" +# #role_arn = "" +# #profile = "" +# #shared_credential_file = "" +# +# ## Requested CloudWatch aggregation Period (required - must be a multiple of 60s) +# period = '1m' +# +# ## Collection Delay (required - must account for metrics availability via CloudWatch API) +# delay = '1m' +# +# ## Recomended: use metric 'interval' that is a multiple of 'period' to avoid +# ## gaps or overlap in pulled data +# interval = '1m' +# +# ## Configure the TTL for the internal cache of metrics. +# ## Defaults to 1 hr if not specified +# #cache_ttl = '10m' +# +# ## Metric Statistic Namespace (required) +# namespace = 'AWS/ELB' +# +# ## Metrics to Pull (optional) +# ## Defaults to all Metrics in Namespace if nothing is provided +# ## Refreshes Namespace available metrics every 1h +# #[[inputs.cloudwatch.metrics]] +# # names = ['Latency', 'RequestCount'] +# # +# # ## Dimension filters for Metric (optional) +# # [[inputs.cloudwatch.metrics.dimensions]] +# # name = 'LoadBalancerName' +# # value = 'p-example' + + +# # Collects conntrack stats from the configured directories and files. +# [[inputs.conntrack]] +# ## The following defaults would work with multiple versions of conntrack. +# ## Note the nf_ and ip_ filename prefixes are mutually exclusive across +# ## kernel versions, as are the directory locations. +# +# ## Superset of filenames to look for within the conntrack dirs. +# ## Missing files will be ignored. +# files = ["ip_conntrack_count","ip_conntrack_max", +# "nf_conntrack_count","nf_conntrack_max"] +# +# ## Directories to search within for the conntrack files above. +# ## Missing directrories will be ignored. +# dirs = ["/proc/sys/net/ipv4/netfilter","/proc/sys/net/netfilter"] + + +# # Gather health check statuses from services registered in Consul +# [[inputs.consul]] +# ## Most of these values defaults to the one configured on a Consul's agent level. +# ## Optional Consul server address (default: "localhost") +# # address = "localhost" +# ## Optional URI scheme for the Consul server (default: "http") +# # scheme = "http" +# ## Optional ACL token used in every request (default: "") +# # token = "" +# ## Optional username used for request HTTP Basic Authentication (default: "") +# # username = "" +# ## Optional password used for HTTP Basic Authentication (default: "") +# # password = "" +# ## Optional data centre to query the health checks from (default: "") +# # datacentre = "" + + +# # Read metrics from one or many couchbase clusters +# [[inputs.couchbase]] +# ## specify servers via a url matching: +# ## [protocol://][:password]@address[:port] +# ## e.g. +# ## http://couchbase-0.example.com/ +# ## http://admin:secret@couchbase-0.example.com:8091/ +# ## +# ## If no servers are specified, then localhost is used as the host. +# ## If no protocol is specifed, HTTP is used. +# ## If no port is specified, 8091 is used. +# servers = ["http://localhost:8091"] + + +# # Read CouchDB Stats from one or more servers +# [[inputs.couchdb]] +# ## Works with CouchDB stats endpoints out of the box +# ## Multiple HOSTs from which to read CouchDB stats: +# hosts = ["http://localhost:8086/_stats"] + + +# # Read metrics from one or many disque servers +# [[inputs.disque]] +# ## An array of URI to gather stats about. Specify an ip or hostname +# ## with optional port and password. +# ## ie disque://localhost, disque://10.10.3.33:18832, 10.0.0.1:10000, etc. +# ## If no servers are specified, then localhost is used as the host. +# servers = ["localhost"] + + +# # Query given DNS server and gives statistics +# [[inputs.dns_query]] +# ## servers to query +# servers = ["8.8.8.8"] # required +# +# ## Domains or subdomains to query. "."(root) is default +# domains = ["."] # optional +# +# ## Query record type. Default is "A" +# ## Posible values: A, AAAA, CNAME, MX, NS, PTR, TXT, SOA, SPF, SRV. +# record_type = "A" # optional +# +# ## Dns server port. 53 is default +# port = 53 # optional +# +# ## Query timeout in seconds. Default is 2 seconds +# timeout = 2 # optional + + +# Read metrics about docker containers + [[inputs.docker]] + ## Docker Endpoint + ## To use TCP, set endpoint = "tcp://[ip]:[port]" + ## To use environment variables (ie, docker-machine), set endpoint = "ENV" + endpoint = "unix:///var/run/docker.sock" + ## Only collect metrics for these containers, collect all if empty +# container_names = [] +# ## Timeout for docker list, info, and stats commands +# timeout = "5s" +# +# ## Whether to report for each container per-device blkio (8:0, 8:1...) and +# ## network (eth0, eth1, ...) stats or not +# perdevice = true +# ## Whether to report for each container total blkio and network stats or not +# total = false +# + + +# # Read statistics from one or many dovecot servers +# [[inputs.dovecot]] +# ## specify dovecot servers via an address:port list +# ## e.g. +# ## localhost:24242 +# ## +# ## If no servers are specified, then localhost is used as the host. +# servers = ["localhost:24242"] +# ## Type is one of "user", "domain", "ip", or "global" +# type = "global" +# ## Wildcard matches like "*.com". An empty string "" is same as "*" +# ## If type = "ip" filters should be +# filters = [""] + + +# # Read stats from one or more Elasticsearch servers or clusters +# [[inputs.elasticsearch]] +# ## specify a list of one or more Elasticsearch servers +# servers = ["http://localhost:9200"] +# +# ## set local to false when you want to read the indices stats from all nodes +# ## within the cluster +# local = true +# +# ## set cluster_health to true when you want to also obtain cluster level stats +# cluster_health = false +# +# ## Optional SSL Config +# # ssl_ca = "/etc/telegraf/ca.pem" +# # ssl_cert = "/etc/telegraf/cert.pem" +# # ssl_key = "/etc/telegraf/key.pem" +# ## Use SSL but skip chain & host verification +# # insecure_skip_verify = false + + +# # Read metrics from one or more commands that can output to stdout +# [[inputs.exec]] +# ## Commands array +# commands = [ +# "/tmp/test.sh", +# "/usr/bin/mycollector --foo=bar", +# "/tmp/collect_*.sh" +# ] +# +# ## Timeout for each command to complete. +# timeout = "5s" +# +# ## measurement name suffix (for separating different commands) +# name_suffix = "_mycollector" +# +# ## Data format to consume. +# ## Each data format has it's own unique set of configuration options, read +# ## more about them here: +# ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md +# data_format = "influx" + + +# # Read stats about given file(s) +# [[inputs.filestat]] +# ## Files to gather stats about. +# ## These accept standard unix glob matching rules, but with the addition of +# ## ** as a "super asterisk". ie: +# ## "/var/log/**.log" -> recursively find all .log files in /var/log +# ## "/var/log/*/*.log" -> find all .log files with a parent dir in /var/log +# ## "/var/log/apache.log" -> just tail the apache log file +# ## +# ## See https://github.com/gobwas/glob for more examples +# ## +# files = ["/var/log/**.log"] +# ## If true, read the entire file and calculate an md5 checksum. +# md5 = false + + +# # Read flattened metrics from one or more GrayLog HTTP endpoints +# [[inputs.graylog]] +# ## API endpoint, currently supported API: +# ## +# ## - multiple (Ex http://:12900/system/metrics/multiple) +# ## - namespace (Ex http://:12900/system/metrics/namespace/{namespace}) +# ## +# ## For namespace endpoint, the metrics array will be ignored for that call. +# ## Endpoint can contain namespace and multiple type calls. +# ## +# ## Please check http://[graylog-server-ip]:12900/api-browser for full list +# ## of endpoints +# servers = [ +# "http://[graylog-server-ip]:12900/system/metrics/multiple", +# ] +# +# ## Metrics list +# ## List of metrics can be found on Graylog webservice documentation. +# ## Or by hitting the the web service api at: +# ## http://[graylog-host]:12900/system/metrics +# metrics = [ +# "jvm.cl.loaded", +# "jvm.memory.pools.Metaspace.committed" +# ] +# +# ## Username and password +# username = "" +# password = "" +# +# ## Optional SSL Config +# # ssl_ca = "/etc/telegraf/ca.pem" +# # ssl_cert = "/etc/telegraf/cert.pem" +# # ssl_key = "/etc/telegraf/key.pem" +# ## Use SSL but skip chain & host verification +# # insecure_skip_verify = false + + +# # Read metrics of haproxy, via socket or csv stats page +# [[inputs.haproxy]] +# ## An array of address to gather stats about. Specify an ip on hostname +# ## with optional port. ie localhost, 10.10.3.33:1936, etc. +# ## Make sure you specify the complete path to the stats endpoint +# ## ie 10.10.3.33:1936/haproxy?stats +# # +# ## If no servers are specified, then default to 127.0.0.1:1936/haproxy?stats +# servers = ["http://myhaproxy.com:1936/haproxy?stats"] +# ## Or you can also use local socket +# ## servers = ["socket:/run/haproxy/admin.sock"] + + +# # Monitor disks' temperatures using hddtemp +# [[inputs.hddtemp]] +# ## By default, telegraf gathers temps data from all disks detected by the +# ## hddtemp. +# ## +# ## Only collect temps from the selected disks. +# ## +# ## A * as the device name will return the temperature values of all disks. +# ## +# # address = "127.0.0.1:7634" +# # devices = ["sda", "*"] + + +# # HTTP/HTTPS request given an address a method and a timeout +# [[inputs.http_response]] +# ## Server address (default http://localhost) +# address = "http://github.com" +# ## Set response_timeout (default 5 seconds) +# response_timeout = "5s" +# ## HTTP Request Method +# method = "GET" +# ## Whether to follow redirects from the server (defaults to false) +# follow_redirects = true +# ## HTTP Request Headers (all values must be strings) +# # [inputs.http_response.headers] +# # Host = "github.com" +# ## Optional HTTP Request Body +# # body = ''' +# # {'fake':'data'} +# # ''' +# +# ## Optional SSL Config +# # ssl_ca = "/etc/telegraf/ca.pem" +# # ssl_cert = "/etc/telegraf/cert.pem" +# # ssl_key = "/etc/telegraf/key.pem" +# ## Use SSL but skip chain & host verification +# # insecure_skip_verify = false + + +# # Read flattened metrics from one or more JSON HTTP endpoints +# [[inputs.httpjson]] +# ## NOTE This plugin only reads numerical measurements, strings and booleans +# ## will be ignored. +# +# ## a name for the service being polled +# name = "webserver_stats" +# +# ## URL of each server in the service's cluster +# servers = [ +# "http://localhost:9999/stats/", +# "http://localhost:9998/stats/", +# ] +# +# ## HTTP method to use: GET or POST (case-sensitive) +# method = "GET" +# +# ## List of tag names to extract from top-level of JSON server response +# # tag_keys = [ +# # "my_tag_1", +# # "my_tag_2" +# # ] +# +# ## HTTP parameters (all values must be strings) +# [inputs.httpjson.parameters] +# event_type = "cpu_spike" +# threshold = "0.75" +# +# ## HTTP Header parameters (all values must be strings) +# # [inputs.httpjson.headers] +# # X-Auth-Token = "my-xauth-token" +# # apiVersion = "v1" +# +# ## Optional SSL Config +# # ssl_ca = "/etc/telegraf/ca.pem" +# # ssl_cert = "/etc/telegraf/cert.pem" +# # ssl_key = "/etc/telegraf/key.pem" +# ## Use SSL but skip chain & host verification +# # insecure_skip_verify = false + + +# # Read InfluxDB-formatted JSON metrics from one or more HTTP endpoints +# [[inputs.influxdb]] +# ## Works with InfluxDB debug endpoints out of the box, +# ## but other services can use this format too. +# ## See the influxdb plugin's README for more details. +# +# ## Multiple URLs from which to read InfluxDB-formatted JSON +# ## Default is "http://localhost:8086/debug/vars". +# urls = [ +# "http://localhost:8086/debug/vars" +# ] + + +# # Read metrics from one or many bare metal servers +# [[inputs.ipmi_sensor]] +# ## specify servers via a url matching: +# ## [username[:password]@][protocol[(address)]] +# ## e.g. +# ## root:passwd@lan(127.0.0.1) +# ## +# servers = ["USERID:PASSW0RD@lan(192.168.1.1)"] + + +# # Read JMX metrics through Jolokia +# [[inputs.jolokia]] +# ## This is the context root used to compose the jolokia url +# context = "/jolokia" +# +# ## This specifies the mode used +# # mode = "proxy" +# # +# ## When in proxy mode this section is used to specify further +# ## proxy address configurations. +# ## Remember to change host address to fit your environment. +# # [inputs.jolokia.proxy] +# # host = "127.0.0.1" +# # port = "8080" +# +# +# ## List of servers exposing jolokia read service +# [[inputs.jolokia.servers]] +# name = "as-server-01" +# host = "127.0.0.1" +# port = "8080" +# # username = "myuser" +# # password = "mypassword" +# +# ## List of metrics collected on above servers +# ## Each metric consists in a name, a jmx path and either +# ## a pass or drop slice attribute. +# ## This collect all heap memory usage metrics. +# [[inputs.jolokia.metrics]] +# name = "heap_memory_usage" +# mbean = "java.lang:type=Memory" +# attribute = "HeapMemoryUsage" +# +# ## This collect thread counts metrics. +# [[inputs.jolokia.metrics]] +# name = "thread_count" +# mbean = "java.lang:type=Threading" +# attribute = "TotalStartedThreadCount,ThreadCount,DaemonThreadCount,PeakThreadCount" +# +# ## This collect number of class loaded/unloaded counts metrics. +# [[inputs.jolokia.metrics]] +# name = "class_count" +# mbean = "java.lang:type=ClassLoading" +# attribute = "LoadedClassCount,UnloadedClassCount,TotalLoadedClassCount" + + +# # Get kernel statistics from /proc/vmstat +# [[inputs.kernel_vmstat]] +# # no configuration + + +# # Read metrics from a LeoFS Server via SNMP +# [[inputs.leofs]] +# ## An array of URI to gather stats about LeoFS. +# ## Specify an ip or hostname with port. ie 127.0.0.1:4020 +# servers = ["127.0.0.1:4021"] + + +# # Read metrics from local Lustre service on OST, MDS +# [[inputs.lustre2]] +# ## An array of /proc globs to search for Lustre stats +# ## If not specified, the default will work on Lustre 2.5.x +# ## +# # ost_procfiles = [ +# # "/proc/fs/lustre/obdfilter/*/stats", +# # "/proc/fs/lustre/osd-ldiskfs/*/stats", +# # "/proc/fs/lustre/obdfilter/*/job_stats", +# # ] +# # mds_procfiles = [ +# # "/proc/fs/lustre/mdt/*/md_stats", +# # "/proc/fs/lustre/mdt/*/job_stats", +# # ] + + +# # Gathers metrics from the /3.0/reports MailChimp API +# [[inputs.mailchimp]] +# ## MailChimp API key +# ## get from https://admin.mailchimp.com/account/api/ +# api_key = "" # required +# ## Reports for campaigns sent more than days_old ago will not be collected. +# ## 0 means collect all. +# days_old = 0 +# ## Campaign ID to get, if empty gets all campaigns, this option overrides days_old +# # campaign_id = "" + + +# # Read metrics from one or many memcached servers +# [[inputs.memcached]] +# ## An array of address to gather stats about. Specify an ip on hostname +# ## with optional port. ie localhost, 10.0.0.1:11211, etc. +# servers = ["localhost:11211"] +# # unix_sockets = ["/var/run/memcached.sock"] + + +# # Telegraf plugin for gathering metrics from N Mesos masters +# [[inputs.mesos]] +# ## Timeout, in ms. +# timeout = 100 +# ## A list of Mesos masters. +# masters = ["localhost:5050"] +# ## Master metrics groups to be collected, by default, all enabled. +# master_collections = [ +# "resources", +# "master", +# "system", +# "agents", +# "frameworks", +# "tasks", +# "messages", +# "evqueue", +# "registrar", +# ] +# ## A list of Mesos slaves, default is [] +# # slaves = [] +# ## Slave metrics groups to be collected, by default, all enabled. +# # slave_collections = [ +# # "resources", +# # "agent", +# # "system", +# # "executors", +# # "tasks", +# # "messages", +# # ] +# ## Include mesos tasks statistics, default is false +# # slave_tasks = true + + +# # Read metrics from one or many MongoDB servers +# [[inputs.mongodb]] +# ## An array of URI to gather stats about. Specify an ip or hostname +# ## with optional port add password. ie, +# ## mongodb://user:auth_key@10.10.3.30:27017, +# ## mongodb://10.10.3.33:18832, +# ## 10.0.0.1:10000, etc. +# servers = ["127.0.0.1:27017"] +# gather_perdb_stats = false + + +# # Read metrics from one or many mysql servers +# [[inputs.mysql]] +# ## specify servers via a url matching: +# ## [username[:password]@][protocol[(address)]]/[?tls=[true|false|skip-verify]] +# ## see https://github.com/go-sql-driver/mysql#dsn-data-source-name +# ## e.g. +# ## db_user:passwd@tcp(127.0.0.1:3306)/?tls=false +# ## db_user@tcp(127.0.0.1:3306)/?tls=false +# # +# ## If no servers are specified, then localhost is used as the host. +# servers = ["tcp(127.0.0.1:3306)/"] +# ## the limits for metrics form perf_events_statements +# perf_events_statements_digest_text_limit = 120 +# perf_events_statements_limit = 250 +# perf_events_statements_time_limit = 86400 +# # +# ## if the list is empty, then metrics are gathered from all databasee tables +# table_schema_databases = [] +# # +# ## gather metrics from INFORMATION_SCHEMA.TABLES for databases provided above list +# gather_table_schema = false +# # +# ## gather thread state counts from INFORMATION_SCHEMA.PROCESSLIST +# gather_process_list = true +# # +# ## gather auto_increment columns and max values from information schema +# gather_info_schema_auto_inc = true +# # +# ## gather metrics from SHOW SLAVE STATUS command output +# gather_slave_status = true +# # +# ## gather metrics from SHOW BINARY LOGS command output +# gather_binary_logs = false +# # +# ## gather metrics from PERFORMANCE_SCHEMA.TABLE_IO_WAITS_SUMMART_BY_TABLE +# gather_table_io_waits = false +# # +# ## gather metrics from PERFORMANCE_SCHEMA.TABLE_LOCK_WAITS +# gather_table_lock_waits = false +# # +# ## gather metrics from PERFORMANCE_SCHEMA.TABLE_IO_WAITS_SUMMART_BY_INDEX_USAGE +# gather_index_io_waits = false +# # +# ## gather metrics from PERFORMANCE_SCHEMA.EVENT_WAITS +# gather_event_waits = false +# # +# ## gather metrics from PERFORMANCE_SCHEMA.FILE_SUMMARY_BY_EVENT_NAME +# gather_file_events_stats = false +# # +# ## gather metrics from PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_SUMMARY_BY_DIGEST +# gather_perf_events_statements = false +# # +# ## Some queries we may want to run less often (such as SHOW GLOBAL VARIABLES) +# interval_slow = "30m" + + +# Read metrics about network interface usage +[[inputs.net]] + ## By default, telegraf gathers stats from any up interface (excluding loopback) + ## Setting interfaces will tell it to gather these explicit interfaces, + ## regardless of status. + ## + interfaces = ["eth0"] + + +# # TCP or UDP 'ping' given url and collect response time in seconds +# [[inputs.net_response]] +# ## Protocol, must be "tcp" or "udp" +# protocol = "tcp" +# ## Server address (default localhost) +# address = "github.com:80" +# ## Set timeout +# timeout = "1s" +# +# ## Optional string sent to the server +# # send = "ssh" +# ## Optional expected string in answer +# # expect = "ssh" +# ## Set read timeout (only used if expecting a response) +# read_timeout = "1s" + + +# # Read TCP metrics such as established, time wait and sockets counts. +# [[inputs.netstat]] +# # no configuration + + +# # Read Nginx's basic status information (ngx_http_stub_status_module) +# [[inputs.nginx]] +# ## An array of Nginx stub_status URI to gather stats. +# urls = ["http://localhost/status"] + + +# # Read NSQ topic and channel statistics. +# [[inputs.nsq]] +# ## An array of NSQD HTTP API endpoints +# endpoints = ["http://localhost:4151"] + + +# # Collect kernel snmp counters and network interface statistics +# [[inputs.nstat]] +# ## file paths for proc files. If empty default paths will be used: +# ## /proc/net/netstat, /proc/net/snmp, /proc/net/snmp6 +# ## These can also be overridden with env variables, see README. +# proc_net_netstat = "/proc/net/netstat" +# proc_net_snmp = "/proc/net/snmp" +# proc_net_snmp6 = "/proc/net/snmp6" +# ## dump metrics with 0 values too +# dump_zeros = true + + +# # Get standard NTP query metrics, requires ntpq executable. +# [[inputs.ntpq]] +# ## If false, set the -n ntpq flag. Can reduce metric gather time. +# dns_lookup = true + + +# # Read metrics of passenger using passenger-status +# [[inputs.passenger]] +# ## Path of passenger-status. +# ## +# ## Plugin gather metric via parsing XML output of passenger-status +# ## More information about the tool: +# ## https://www.phusionpassenger.com/library/admin/apache/overall_status_report.html +# ## +# ## If no path is specified, then the plugin simply execute passenger-status +# ## hopefully it can be found in your PATH +# command = "passenger-status -v --show=xml" + + +# # Read metrics of phpfpm, via HTTP status page or socket +# [[inputs.phpfpm]] +# ## An array of addresses to gather stats about. Specify an ip or hostname +# ## with optional port and path +# ## +# ## Plugin can be configured in three modes (either can be used): +# ## - http: the URL must start with http:// or https://, ie: +# ## "http://localhost/status" +# ## "http://192.168.130.1/status?full" +# ## +# ## - unixsocket: path to fpm socket, ie: +# ## "/var/run/php5-fpm.sock" +# ## or using a custom fpm status path: +# ## "/var/run/php5-fpm.sock:fpm-custom-status-path" +# ## +# ## - fcgi: the URL must start with fcgi:// or cgi://, and port must be present, ie: +# ## "fcgi://10.0.0.12:9000/status" +# ## "cgi://10.0.10.12:9001/status" +# ## +# ## Example of multiple gathering from local socket and remove host +# ## urls = ["http://192.168.1.20/status", "/tmp/fpm.sock"] +# urls = ["http://localhost/status"] + + +# # Ping given url(s) and return statistics +# [[inputs.ping]] +# ## NOTE: this plugin forks the ping command. You may need to set capabilities +# ## via setcap cap_net_raw+p /bin/ping +# # +# ## urls to ping +# urls = ["www.google.com"] # required +# ## number of pings to send per collection (ping -c ) +# count = 1 # required +# ## interval, in s, at which to ping. 0 == default (ping -i ) +# ping_interval = 0.0 +# ## per-ping timeout, in s. 0 == no timeout (ping -W ) +# timeout = 1.0 +# ## interface to send ping from (ping -I ) +# interface = "" + + +# # Read metrics from one or many postgresql servers +# [[inputs.postgresql]] +# ## specify address via a url matching: +# ## postgres://[pqgotest[:password]]@localhost[/dbname]\ +# ## ?sslmode=[disable|verify-ca|verify-full] +# ## or a simple string: +# ## host=localhost user=pqotest password=... sslmode=... dbname=app_production +# ## +# ## All connection parameters are optional. +# ## +# ## Without the dbname parameter, the driver will default to a database +# ## with the same name as the user. This dbname is just for instantiating a +# ## connection with the server and doesn't restrict the databases we are trying +# ## to grab metrics for. +# ## +# address = "host=localhost user=postgres sslmode=disable" +# +# ## A list of databases to pull metrics about. If not specified, metrics for all +# ## databases are gathered. +# # databases = ["app_production", "testing"] + + +# # Read metrics from one or many postgresql servers +# [[inputs.postgresql_extensible]] +# ## specify address via a url matching: +# ## postgres://[pqgotest[:password]]@localhost[/dbname]\ +# ## ?sslmode=[disable|verify-ca|verify-full] +# ## or a simple string: +# ## host=localhost user=pqotest password=... sslmode=... dbname=app_production +# # +# ## All connection parameters are optional. # +# ## Without the dbname parameter, the driver will default to a database +# ## with the same name as the user. This dbname is just for instantiating a +# ## connection with the server and doesn't restrict the databases we are trying +# ## to grab metrics for. +# # +# address = "host=localhost user=postgres sslmode=disable" +# ## A list of databases to pull metrics about. If not specified, metrics for all +# ## databases are gathered. +# ## databases = ["app_production", "testing"] +# # +# # outputaddress = "db01" +# ## A custom name for the database that will be used as the "server" tag in the +# ## measurement output. If not specified, a default one generated from +# ## the connection address is used. +# # +# ## Define the toml config where the sql queries are stored +# ## New queries can be added, if the withdbname is set to true and there is no +# ## databases defined in the 'databases field', the sql query is ended by a +# ## 'is not null' in order to make the query succeed. +# ## Example : +# ## The sqlquery : "SELECT * FROM pg_stat_database where datname" become +# ## "SELECT * FROM pg_stat_database where datname IN ('postgres', 'pgbench')" +# ## because the databases variable was set to ['postgres', 'pgbench' ] and the +# ## withdbname was true. Be careful that if the withdbname is set to false you +# ## don't have to define the where clause (aka with the dbname) the tagvalue +# ## field is used to define custom tags (separated by commas) +# ## The optional "measurement" value can be used to override the default +# ## output measurement name ("postgresql"). +# # +# ## Structure : +# ## [[inputs.postgresql_extensible.query]] +# ## sqlquery string +# ## version string +# ## withdbname boolean +# ## tagvalue string (comma separated) +# ## measurement string +# [[inputs.postgresql_extensible.query]] +# sqlquery="SELECT * FROM pg_stat_database" +# version=901 +# withdbname=false +# tagvalue="" +# measurement="" +# [[inputs.postgresql_extensible.query]] +# sqlquery="SELECT * FROM pg_stat_bgwriter" +# version=901 +# withdbname=false +# tagvalue="postgresql.stats" + + +# # Read metrics from one or many PowerDNS servers +# [[inputs.powerdns]] +# ## An array of sockets to gather stats about. +# ## Specify a path to unix socket. +# unix_sockets = ["/var/run/pdns.controlsocket"] + + +# # Monitor process cpu and memory usage +# [[inputs.procstat]] +# ## Must specify one of: pid_file, exe, or pattern +# ## PID file to monitor process +# pid_file = "/var/run/nginx.pid" +# ## executable name (ie, pgrep ) +# # exe = "nginx" +# ## pattern as argument for pgrep (ie, pgrep -f ) +# # pattern = "nginx" +# ## user as argument for pgrep (ie, pgrep -u ) +# # user = "nginx" +# +# ## override for process_name +# ## This is optional; default is sourced from /proc//status +# # process_name = "bar" +# ## Field name prefix +# prefix = "" +# ## comment this out if you want raw cpu_time stats +# fielddrop = ["cpu_time_*"] + + +# # Read metrics from one or many prometheus clients +# [[inputs.prometheus]] +# ## An array of urls to scrape metrics from. +# urls = ["http://localhost:9100/metrics"] +# +# ## Use bearer token for authorization +# # bearer_token = /path/to/bearer/token +# +# ## Optional SSL Config +# # ssl_ca = /path/to/cafile +# # ssl_cert = /path/to/certfile +# # ssl_key = /path/to/keyfile +# ## Use SSL but skip chain & host verification +# # insecure_skip_verify = false + + +# # Reads last_run_summary.yaml file and converts to measurments +# [[inputs.puppetagent]] +# ## Location of puppet last run summary file +# location = "/var/lib/puppet/state/last_run_summary.yaml" + + +# # Read metrics from one or many RabbitMQ servers via the management API +# [[inputs.rabbitmq]] +# # url = "http://localhost:15672" +# # name = "rmq-server-1" # optional tag +# # username = "guest" +# # password = "guest" +# +# ## Optional SSL Config +# # ssl_ca = "/etc/telegraf/ca.pem" +# # ssl_cert = "/etc/telegraf/cert.pem" +# # ssl_key = "/etc/telegraf/key.pem" +# ## Use SSL but skip chain & host verification +# # insecure_skip_verify = false +# +# ## A list of nodes to pull metrics about. If not specified, metrics for +# ## all nodes are gathered. +# # nodes = ["rabbit@node1", "rabbit@node2"] + + +# # Read raindrops stats (raindrops - real-time stats for preforking Rack servers) +# [[inputs.raindrops]] +# ## An array of raindrops middleware URI to gather stats. +# urls = ["http://localhost:8080/_raindrops"] + + +# # Read metrics from one or many redis servers +# [[inputs.redis]] +# ## specify servers via a url matching: +# ## [protocol://][:password]@address[:port] +# ## e.g. +# ## tcp://localhost:6379 +# ## tcp://:password@192.168.99.100 +# ## unix:///var/run/redis.sock +# ## +# ## If no servers are specified, then localhost is used as the host. +# ## If no port is specified, 6379 is used +# servers = ["tcp://localhost:6379"] + + +# # Read metrics from one or many RethinkDB servers +# [[inputs.rethinkdb]] +# ## An array of URI to gather stats about. Specify an ip or hostname +# ## with optional port add password. ie, +# ## rethinkdb://user:auth_key@10.10.3.30:28105, +# ## rethinkdb://10.10.3.33:18832, +# ## 10.0.0.1:10000, etc. +# servers = ["127.0.0.1:28015"] + + +# # Read metrics one or many Riak servers +# [[inputs.riak]] +# # Specify a list of one or more riak http servers +# servers = ["http://localhost:8098"] + + +# # Monitor sensors, requires lm-sensors package +# [[inputs.sensors]] +# ## Remove numbers from field names. +# ## If true, a field name like 'temp1_input' will be changed to 'temp_input'. +# # remove_numbers = true + + +# # Retrieves SNMP values from remote agents +# [[inputs.snmp]] +# agents = [ "127.0.0.1:161" ] +# timeout = "5s" +# version = 2 +# +# # SNMPv1 & SNMPv2 parameters +# community = "public" +# +# # SNMPv2 & SNMPv3 parameters +# max_repetitions = 50 +# +# # SNMPv3 parameters +# #sec_name = "myuser" +# #auth_protocol = "md5" # Values: "MD5", "SHA", "" +# #auth_password = "password123" +# #sec_level = "authNoPriv" # Values: "noAuthNoPriv", "authNoPriv", "authPriv" +# #context_name = "" +# #priv_protocol = "" # Values: "DES", "AES", "" +# #priv_password = "" +# +# # measurement name +# name = "system" +# [[inputs.snmp.field]] +# name = "hostname" +# oid = ".1.0.0.1.1" +# [[inputs.snmp.field]] +# name = "uptime" +# oid = ".1.0.0.1.2" +# [[inputs.snmp.field]] +# name = "load" +# oid = ".1.0.0.1.3" +# [[inputs.snmp.field]] +# oid = "HOST-RESOURCES-MIB::hrMemorySize" +# +# [[inputs.snmp.table]] +# # measurement name +# name = "remote_servers" +# inherit_tags = [ "hostname" ] +# [[inputs.snmp.table.field]] +# name = "server" +# oid = ".1.0.0.0.1.0" +# is_tag = true +# [[inputs.snmp.table.field]] +# name = "connections" +# oid = ".1.0.0.0.1.1" +# [[inputs.snmp.table.field]] +# name = "latency" +# oid = ".1.0.0.0.1.2" +# +# [[inputs.snmp.table]] +# # auto populate table's fields using the MIB +# oid = "HOST-RESOURCES-MIB::hrNetworkTable" + + +# # DEPRECATED! PLEASE USE inputs.snmp INSTEAD. +# [[inputs.snmp_legacy]] +# ## Use 'oids.txt' file to translate oids to names +# ## To generate 'oids.txt' you need to run: +# ## snmptranslate -m all -Tz -On | sed -e 's/"//g' > /tmp/oids.txt +# ## Or if you have an other MIB folder with custom MIBs +# ## snmptranslate -M /mycustommibfolder -Tz -On -m all | sed -e 's/"//g' > oids.txt +# snmptranslate_file = "/tmp/oids.txt" +# [[inputs.snmp.host]] +# address = "192.168.2.2:161" +# # SNMP community +# community = "public" # default public +# # SNMP version (1, 2 or 3) +# # Version 3 not supported yet +# version = 2 # default 2 +# # SNMP response timeout +# timeout = 2.0 # default 2.0 +# # SNMP request retries +# retries = 2 # default 2 +# # Which get/bulk do you want to collect for this host +# collect = ["mybulk", "sysservices", "sysdescr"] +# # Simple list of OIDs to get, in addition to "collect" +# get_oids = [] +# +# [[inputs.snmp.host]] +# address = "192.168.2.3:161" +# community = "public" +# version = 2 +# timeout = 2.0 +# retries = 2 +# collect = ["mybulk"] +# get_oids = [ +# "ifNumber", +# ".1.3.6.1.2.1.1.3.0", +# ] +# +# [[inputs.snmp.get]] +# name = "ifnumber" +# oid = "ifNumber" +# +# [[inputs.snmp.get]] +# name = "interface_speed" +# oid = "ifSpeed" +# instance = "0" +# +# [[inputs.snmp.get]] +# name = "sysuptime" +# oid = ".1.3.6.1.2.1.1.3.0" +# unit = "second" +# +# [[inputs.snmp.bulk]] +# name = "mybulk" +# max_repetition = 127 +# oid = ".1.3.6.1.2.1.1" +# +# [[inputs.snmp.bulk]] +# name = "ifoutoctets" +# max_repetition = 127 +# oid = "ifOutOctets" +# +# [[inputs.snmp.host]] +# address = "192.168.2.13:161" +# #address = "127.0.0.1:161" +# community = "public" +# version = 2 +# timeout = 2.0 +# retries = 2 +# #collect = ["mybulk", "sysservices", "sysdescr", "systype"] +# collect = ["sysuptime" ] +# [[inputs.snmp.host.table]] +# name = "iftable3" +# include_instances = ["enp5s0", "eth1"] +# +# # SNMP TABLEs +# # table without mapping neither subtables +# [[inputs.snmp.table]] +# name = "iftable1" +# oid = ".1.3.6.1.2.1.31.1.1.1" +# +# # table without mapping but with subtables +# [[inputs.snmp.table]] +# name = "iftable2" +# oid = ".1.3.6.1.2.1.31.1.1.1" +# sub_tables = [".1.3.6.1.2.1.2.2.1.13"] +# +# # table with mapping but without subtables +# [[inputs.snmp.table]] +# name = "iftable3" +# oid = ".1.3.6.1.2.1.31.1.1.1" +# # if empty. get all instances +# mapping_table = ".1.3.6.1.2.1.31.1.1.1.1" +# # if empty, get all subtables +# +# # table with both mapping and subtables +# [[inputs.snmp.table]] +# name = "iftable4" +# oid = ".1.3.6.1.2.1.31.1.1.1" +# # if empty get all instances +# mapping_table = ".1.3.6.1.2.1.31.1.1.1.1" +# # if empty get all subtables +# # sub_tables could be not "real subtables" +# sub_tables=[".1.3.6.1.2.1.2.2.1.13", "bytes_recv", "bytes_send"] + + +# # Read metrics from Microsoft SQL Server +# [[inputs.sqlserver]] +# ## Specify instances to monitor with a list of connection strings. +# ## All connection parameters are optional. +# ## By default, the host is localhost, listening on default port, TCP 1433. +# ## for Windows, the user is the currently running AD user (SSO). +# ## See https://github.com/denisenkom/go-mssqldb for detailed connection +# ## parameters. +# # servers = [ +# # "Server=192.168.1.10;Port=1433;User Id=;Password=;app name=telegraf;log=1;", +# # ] + + +# # Sysstat metrics collector +# [[inputs.sysstat]] +# ## Path to the sadc command. +# # +# ## Common Defaults: +# ## Debian/Ubuntu: /usr/lib/sysstat/sadc +# ## Arch: /usr/lib/sa/sadc +# ## RHEL/CentOS: /usr/lib64/sa/sadc +# sadc_path = "/usr/lib/sa/sadc" # required +# # +# # +# ## Path to the sadf command, if it is not in PATH +# # sadf_path = "/usr/bin/sadf" +# # +# # +# ## Activities is a list of activities, that are passed as argument to the +# ## sadc collector utility (e.g: DISK, SNMP etc...) +# ## The more activities that are added, the more data is collected. +# # activities = ["DISK"] +# # +# # +# ## Group metrics to measurements. +# ## +# ## If group is false each metric will be prefixed with a description +# ## and represents itself a measurement. +# ## +# ## If Group is true, corresponding metrics are grouped to a single measurement. +# # group = true +# # +# # +# ## Options for the sadf command. The values on the left represent the sadf +# ## options and the values on the right their description (wich are used for +# ## grouping and prefixing metrics). +# ## +# ## Run 'sar -h' or 'man sar' to find out the supported options for your +# ## sysstat version. +# [inputs.sysstat.options] +# -C = "cpu" +# -B = "paging" +# -b = "io" +# -d = "disk" # requires DISK activity +# "-n ALL" = "network" +# "-P ALL" = "per_cpu" +# -q = "queue" +# -R = "mem" +# -r = "mem_util" +# -S = "swap_util" +# -u = "cpu_util" +# -v = "inode" +# -W = "swap" +# -w = "task" +# # -H = "hugepages" # only available for newer linux distributions +# # "-I ALL" = "interrupts" # requires INT activity +# # +# # +# ## Device tags can be used to add additional tags for devices. +# ## For example the configuration below adds a tag vg with value rootvg for +# ## all metrics with sda devices. +# # [[inputs.sysstat.device_tags.sda]] +# # vg = "rootvg" + + +# # Inserts sine and cosine waves for demonstration purposes +# [[inputs.trig]] +# ## Set the amplitude +# amplitude = 10.0 + + +# # Read Twemproxy stats data +# [[inputs.twemproxy]] +# ## Twemproxy stats address and port (no scheme) +# addr = "localhost:22222" +# ## Monitor pool name +# pools = ["redis_pool", "mc_pool"] + + +# # A plugin to collect stats from Varnish HTTP Cache +# [[inputs.varnish]] +# ## The default location of the varnishstat binary can be overridden with: +# binary = "/usr/bin/varnishstat" +# +# ## By default, telegraf gather stats for 3 metric points. +# ## Setting stats will override the defaults shown below. +# ## Glob matching can be used, ie, stats = ["MAIN.*"] +# ## stats may also be set to ["*"], which will collect all stats +# stats = ["MAIN.cache_hit", "MAIN.cache_miss", "MAIN.uptime"] + + +# # Read metrics of ZFS from arcstats, zfetchstats, vdev_cache_stats, and pools +# [[inputs.zfs]] +# ## ZFS kstat path. Ignored on FreeBSD +# ## If not specified, then default is: +# # kstatPath = "/proc/spl/kstat/zfs" +# +# ## By default, telegraf gather all zfs stats +# ## If not specified, then default is: +# # kstatMetrics = ["arcstats", "zfetchstats", "vdev_cache_stats"] +# +# ## By default, don't gather zpool stats +# # poolMetrics = false + + +# # Reads 'mntr' stats from one or many zookeeper servers +# [[inputs.zookeeper]] +# ## An array of address to gather stats about. Specify an ip or hostname +# ## with port. ie localhost:2181, 10.0.0.1:2181, etc. +# +# ## If no servers are specified, then localhost is used as the host. +# ## If no port is specified, 2181 is used +# servers = [":2181"] + + + +############################################################################### +# SERVICE INPUT PLUGINS # +############################################################################### + +# # Read metrics from Kafka topic(s) +# [[inputs.kafka_consumer]] +# ## topic(s) to consume +# topics = ["telegraf"] +# ## an array of Zookeeper connection strings +# zookeeper_peers = ["localhost:2181"] +# ## Zookeeper Chroot +# zookeeper_chroot = "" +# ## the name of the consumer group +# consumer_group = "telegraf_metrics_consumers" +# ## Offset (must be either "oldest" or "newest") +# offset = "oldest" +# +# ## Data format to consume. +# ## Each data format has it's own unique set of configuration options, read +# ## more about them here: +# ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md +# data_format = "influx" + + +# # Stream and parse log file(s). +# [[inputs.logparser]] +# ## Log files to parse. +# ## These accept standard unix glob matching rules, but with the addition of +# ## ** as a "super asterisk". ie: +# ## /var/log/**.log -> recursively find all .log files in /var/log +# ## /var/log/*/*.log -> find all .log files with a parent dir in /var/log +# ## /var/log/apache.log -> only tail the apache log file +# files = ["/var/log/apache/access.log"] +# ## Read file from beginning. +# from_beginning = false +# +# ## Parse logstash-style "grok" patterns: +# ## Telegraf built-in parsing patterns: https://goo.gl/dkay10 +# [inputs.logparser.grok] +# ## This is a list of patterns to check the given log file(s) for. +# ## Note that adding patterns here increases processing time. The most +# ## efficient configuration is to have one pattern per logparser. +# ## Other common built-in patterns are: +# ## %{COMMON_LOG_FORMAT} (plain apache & nginx access logs) +# ## %{COMBINED_LOG_FORMAT} (access logs + referrer & agent) +# patterns = ["%{COMBINED_LOG_FORMAT}"] +# ## Name of the outputted measurement name. +# measurement = "apache_access_log" +# ## Full path(s) to custom pattern files. +# custom_pattern_files = [] +# ## Custom patterns can also be defined here. Put one pattern per line. +# custom_patterns = ''' +# ''' + + +# # Read metrics from MQTT topic(s) +# [[inputs.mqtt_consumer]] +# servers = ["localhost:1883"] +# ## MQTT QoS, must be 0, 1, or 2 +# qos = 0 +# +# ## Topics to subscribe to +# topics = [ +# "telegraf/host01/cpu", +# "telegraf/+/mem", +# "sensors/#", +# ] +# +# # if true, messages that can't be delivered while the subscriber is offline +# # will be delivered when it comes back (such as on service restart). +# # NOTE: if true, client_id MUST be set +# persistent_session = false +# # If empty, a random client ID will be generated. +# client_id = "" +# +# ## username and password to connect MQTT server. +# # username = "telegraf" +# # password = "metricsmetricsmetricsmetrics" +# +# ## Optional SSL Config +# # ssl_ca = "/etc/telegraf/ca.pem" +# # ssl_cert = "/etc/telegraf/cert.pem" +# # ssl_key = "/etc/telegraf/key.pem" +# ## Use SSL but skip chain & host verification +# # insecure_skip_verify = false +# +# ## Data format to consume. +# ## Each data format has it's own unique set of configuration options, read +# ## more about them here: +# ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md +# data_format = "influx" + + +# # Read metrics from NATS subject(s) +# [[inputs.nats_consumer]] +# ## urls of NATS servers +# servers = ["nats://localhost:4222"] +# ## Use Transport Layer Security +# secure = false +# ## subject(s) to consume +# subjects = ["telegraf"] +# ## name a queue group +# queue_group = "telegraf_consumers" +# +# ## Data format to consume. +# ## Each data format has it's own unique set of configuration options, read +# ## more about them here: +# ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md +# data_format = "influx" + + +# # Read NSQ topic for metrics. +# [[inputs.nsq_consumer]] +# ## An string representing the NSQD TCP Endpoint +# server = "localhost:4150" +# topic = "telegraf" +# channel = "consumer" +# max_in_flight = 100 +# +# ## Data format to consume. +# ## Each data format has it's own unique set of configuration options, read +# ## more about them here: +# ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md +# data_format = "influx" + + +# # Statsd Server +# [[inputs.statsd]] +# ## Address and port to host UDP listener on +# service_address = ":8125" +# ## Delete gauges every interval (default=false) +# delete_gauges = false +# ## Delete counters every interval (default=false) +# delete_counters = false +# ## Delete sets every interval (default=false) +# delete_sets = false +# ## Delete timings & histograms every interval (default=true) +# delete_timings = true +# ## Percentiles to calculate for timing & histogram stats +# percentiles = [90] +# +# ## separator to use between elements of a statsd metric +# metric_separator = "_" +# +# ## Parses tags in the datadog statsd format +# ## http://docs.datadoghq.com/guides/dogstatsd/ +# parse_data_dog_tags = false +# +# ## Statsd data translation templates, more info can be read here: +# ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md#graphite +# # templates = [ +# # "cpu.* measurement*" +# # ] +# +# ## Number of UDP messages allowed to queue up, once filled, +# ## the statsd server will start dropping packets +# allowed_pending_messages = 10000 +# +# ## Number of timing/histogram values to track per-measurement in the +# ## calculation of percentiles. Raising this limit increases the accuracy +# ## of percentiles but also increases the memory usage and cpu time. +# percentile_limit = 1000 + + +# # Stream a log file, like the tail -f command +# [[inputs.tail]] +# ## files to tail. +# ## These accept standard unix glob matching rules, but with the addition of +# ## ** as a "super asterisk". ie: +# ## "/var/log/**.log" -> recursively find all .log files in /var/log +# ## "/var/log/*/*.log" -> find all .log files with a parent dir in /var/log +# ## "/var/log/apache.log" -> just tail the apache log file +# ## +# ## See https://github.com/gobwas/glob for more examples +# ## +# files = ["/var/mymetrics.out"] +# ## Read file from beginning. +# from_beginning = false +# +# ## Data format to consume. +# ## Each data format has it's own unique set of configuration options, read +# ## more about them here: +# ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md +# data_format = "influx" + + +# # Generic TCP listener +# [[inputs.tcp_listener]] +# ## Address and port to host TCP listener on +# service_address = ":8094" +# +# ## Number of TCP messages allowed to queue up. Once filled, the +# ## TCP listener will start dropping packets. +# allowed_pending_messages = 10000 +# +# ## Maximum number of concurrent TCP connections to allow +# max_tcp_connections = 250 +# +# ## Data format to consume. +# ## Each data format has it's own unique set of configuration options, read +# ## more about them here: +# ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md +# data_format = "influx" + + +# # Generic UDP listener +# [[inputs.udp_listener]] +# ## Address and port to host UDP listener on +# service_address = ":8092" +# +# ## Number of UDP messages allowed to queue up. Once filled, the +# ## UDP listener will start dropping packets. +# allowed_pending_messages = 10000 +# +# ## Data format to consume. +# ## Each data format has it's own unique set of configuration options, read +# ## more about them here: +# ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md +# data_format = "influx" + + +# # A Webhooks Event collector +# [[inputs.webhooks]] +# ## Address and port to host Webhook listener on +# service_address = ":1619" +# +# [inputs.webhooks.github] +# path = "/github" +# +# [inputs.webhooks.mandrill] +# path = "/mandrill" +# +# [inputs.webhooks.rollbar] +# path = "/rollbar" +