From 198ce94364b3115e43799fd6795b2563c81f66bd Mon Sep 17 00:00:00 2001 From: Jimmy Song Date: Tue, 26 Sep 2017 16:58:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=89=E8=A3=85prometheus=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- images/kubernetes-prometheus-monitoring.jpg | Bin 0 -> 224540 bytes .../grafana-import-dashboards-job.yaml | 67 - .../prometheus/grafana-net-2-dashboard.json | 623 +++++ .../prometheus/grafana-net-737-dashboard.json | 1200 ++++++++++ .../import-grafana-dashboard.yaml} | 0 manifests/prometheus/kube-state-metrics.log | 40 - .../prometheus/prometheus-configmaps.yaml | 2090 +++++++++++++++++ .../prometheus/prometheus-datasource.json | 6 + .../prometheus-monitoring-serviceaccount.yaml | 11 + .../prometheus/prometheus-monitoring.yaml | 1847 +-------------- ...rometheus-to-monitor-kuberentes-cluster.md | 57 +- 11 files changed, 3980 insertions(+), 1961 deletions(-) create mode 100644 images/kubernetes-prometheus-monitoring.jpg delete mode 100644 manifests/prometheus/grafana-import-dashboards-job.yaml create mode 100644 manifests/prometheus/grafana-net-2-dashboard.json create mode 100644 manifests/prometheus/grafana-net-737-dashboard.json rename manifests/{test/centos-test.yaml => prometheus/import-grafana-dashboard.yaml} (100%) delete mode 100644 manifests/prometheus/kube-state-metrics.log create mode 100644 manifests/prometheus/prometheus-configmaps.yaml create mode 100644 manifests/prometheus/prometheus-datasource.json create mode 100644 manifests/prometheus/prometheus-monitoring-serviceaccount.yaml diff --git a/images/kubernetes-prometheus-monitoring.jpg b/images/kubernetes-prometheus-monitoring.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4faf6ea8b3fd61c13d65e8779335806d47e14be9 GIT binary patch literal 224540 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 zഞ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 z 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 N@mF0-9eMuW1OSx7ODX^W literal 0 HcmV?d00001 diff --git a/manifests/prometheus/grafana-import-dashboards-job.yaml b/manifests/prometheus/grafana-import-dashboards-job.yaml deleted file mode 100644 index 183a86fab..000000000 --- a/manifests/prometheus/grafana-import-dashboards-job.yaml +++ /dev/null @@ -1,67 +0,0 @@ -apiVersion: batch/v1 -kind: Job -metadata: - name: grafana-import-dashboards - namespace: monitoring - labels: - app: grafana - component: import-dashboards -spec: - template: - metadata: - name: grafana-import-dashboards - labels: - app: grafana - component: import-dashboards - annotations: - pod.beta.kubernetes.io/init-containers: '[ - { - "name": "wait-for-endpoints", - "image": "sz-pg-oam-docker-hub-001.tendcloud.com/library/giantswarm-tiny-tools", - "imagePullPolicy": "IfNotPresent", - "command": ["fish", "-c", "echo \"waiting for endpoints...\"; while true; set endpoints (curl -s --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt --header \"Authorization: Bearer \"(cat /var/run/secrets/kubernetes.io/serviceaccount/token) https://kubernetes.default/api/v1/namespaces/monitoring/endpoints/grafana); echo $endpoints | jq \".\"; if test (echo $endpoints | jq -r \".subsets[]?.addresses // [] | length\") -gt 0; exit 0; end; echo \"waiting...\";sleep 1; end"], - "args": ["monitoring", "grafana"] - } - ]' - spec: - serviceAccountName: prometheus-k8s - containers: - - name: grafana-import-dashboards - image: sz-pg-oam-docker-hub-001.tendcloud.com/library/giantswarm-tiny-tools - command: ["/bin/sh", "-c"] - workingDir: /opt/grafana-import-dashboards - args: - - > - for file in *-datasource.json ; do - if [ -e "$file" ] ; then - echo "importing $file" && - curl --silent --fail --show-error \ - --request POST http://admin:admin@grafana:3000/api/datasources \ - --header "Content-Type: application/json" \ - --data-binary "@$file" ; - echo "" ; - fi - done ; - for file in *-dashboard.json ; do - if [ -e "$file" ] ; then - echo "importing $file" && - ( echo '{"dashboard":'; \ - cat "$file"; \ - echo ',"overwrite":true,"inputs":[{"name":"DS_PROMETHEUS","type":"datasource","pluginId":"prometheus","value":"prometheus"}]}' ) \ - | jq -c '.' \ - | curl --silent --fail --show-error \ - --request POST http://admin:admin@grafana:3000/api/dashboards/import \ - --header "Content-Type: application/json" \ - --data-binary "@-" ; - echo "" ; - fi - done - - volumeMounts: - - name: config-volume - mountPath: /opt/grafana-import-dashboards - restartPolicy: Never - volumes: - - name: config-volume - configMap: - name: grafana-import-dashboards \ No newline at end of file diff --git a/manifests/prometheus/grafana-net-2-dashboard.json b/manifests/prometheus/grafana-net-2-dashboard.json new file mode 100644 index 000000000..2df827382 --- /dev/null +++ b/manifests/prometheus/grafana-net-2-dashboard.json @@ -0,0 +1,623 @@ + { + "__inputs": [{ + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + }], + "__requires": [{ + "type": "panel", + "id": "singlestat", + "name": "Singlestat", + "version": "" + }, { + "type": "panel", + "id": "text", + "name": "Text", + "version": "" + }, { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + }, { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "3.1.0" + }, { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }], + "id": null, + "title": "Prometheus Stats", + "tags": [], + "style": "dark", + "timezone": "browser", + "editable": true, + "hideControls": true, + "sharedCrosshair": false, + "rows": [{ + "collapse": false, + "editable": true, + "height": 178, + "panels": [{ + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": ["rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)"], + "datasource": "", + "decimals": 1, + "editable": true, + "error": false, + "format": "s", + "id": 5, + "interval": null, + "links": [], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "span": 3, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "(time() - process_start_time_seconds{job=\"prometheus\"})", + "intervalFactor": 2, + "refId": "A", + "step": 4 + }], + "thresholds": "", + "title": "Uptime", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [{ + "op": "=", + "text": "N/A", + "value": "null" + }], + "valueName": "current", + "mappingTypes": [{ + "name": "value to text", + "value": 1 + }, { + "name": "range to text", + "value": 2 + }], + "rangeMaps": [{ + "from": "null", + "to": "null", + "text": "N/A" + }], + "mappingType": 1, + "gauge": { + "show": false, + "minValue": 0, + "maxValue": 100, + "thresholdMarkers": true, + "thresholdLabels": false + } + }, { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": ["rgba(50, 172, 45, 0.97)", "rgba(237, 129, 40, 0.89)", "rgba(245, 54, 54, 0.9)"], + "datasource": "", + "editable": true, + "error": false, + "format": "none", + "id": 6, + "interval": null, + "links": [], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "span": 3, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": true + }, + "targets": [{ + "expr": "prometheus_local_storage_memory_series", + "intervalFactor": 2, + "refId": "A", + "step": 4 + }], + "thresholds": "1,5", + "title": "Local Storage Memory Series", + "type": "singlestat", + "valueFontSize": "70%", + "valueMaps": [], + "valueName": "current", + "mappingTypes": [{ + "name": "value to text", + "value": 1 + }, { + "name": "range to text", + "value": 2 + }], + "rangeMaps": [{ + "from": "null", + "to": "null", + "text": "N/A" + }], + "mappingType": 1, + "gauge": { + "show": false, + "minValue": 0, + "maxValue": 100, + "thresholdMarkers": true, + "thresholdLabels": false + } + }, { + "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": "", + "editable": true, + "error": false, + "format": "none", + "id": 7, + "interval": null, + "links": [], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "span": 3, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": true + }, + "targets": [{ + "expr": "prometheus_local_storage_indexing_queue_length", + "intervalFactor": 2, + "refId": "A", + "step": 4 + }], + "thresholds": "500,4000", + "title": "Interal Storage Queue Length", + "type": "singlestat", + "valueFontSize": "70%", + "valueMaps": [{ + "op": "=", + "text": "Empty", + "value": "0" + }], + "valueName": "current", + "mappingTypes": [{ + "name": "value to text", + "value": 1 + }, { + "name": "range to text", + "value": 2 + }], + "rangeMaps": [{ + "from": "null", + "to": "null", + "text": "N/A" + }], + "mappingType": 1, + "gauge": { + "show": false, + "minValue": 0, + "maxValue": 100, + "thresholdMarkers": true, + "thresholdLabels": false + } + }, { + "content": "\"Prometheus\nPrometheus\n\n

You're using Prometheus, an open-source systems monitoring and alerting toolkit originally built at SoundCloud. For more information, check out the Grafana and Prometheus projects.

", + "editable": true, + "error": false, + "id": 9, + "links": [], + "mode": "html", + "span": 3, + "style": {}, + "title": "", + "transparent": true, + "type": "text" + }], + "title": "New row" + }, { + "collapse": false, + "editable": true, + "height": 227, + "panels": [{ + "aliasColors": { + "prometheus": "#C15C17", + "{instance=\"localhost:9090\",job=\"prometheus\"}": "#C15C17" + }, + "bars": false, + "datasource": "", + "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": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 9, + "stack": false, + "steppedLine": false, + "targets": [{ + "expr": "rate(prometheus_local_storage_ingested_samples_total[5m])", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{job}}", + "metric": "", + "refId": "A", + "step": 2 + }], + "timeFrom": null, + "timeShift": null, + "title": "Samples ingested (rate-5m)", + "tooltip": { + "shared": true, + "value_type": "cumulative", + "ordering": "alphabetical", + "msResolution": false + }, + "type": "graph", + "yaxes": [{ + "show": true, + "min": null, + "max": null, + "logBase": 1, + "format": "short" + }, { + "show": true, + "min": null, + "max": null, + "logBase": 1, + "format": "short" + }], + "xaxis": { + "show": true + } + }, { + "content": "#### Samples Ingested\nThis graph displays the count of samples ingested by the Prometheus server, as measured over the last 5 minutes, per time series in the range vector. When troubleshooting an issue on IRC or Github, this is often the first stat requested by the Prometheus team. ", + "editable": true, + "error": false, + "id": 8, + "links": [], + "mode": "markdown", + "span": 2.995914043583536, + "style": {}, + "title": "", + "transparent": true, + "type": "text" + }], + "title": "New row" + }, { + "collapse": false, + "editable": true, + "height": "250px", + "panels": [{ + "aliasColors": { + "prometheus": "#F9BA8F", + "{instance=\"localhost:9090\",interval=\"5s\",job=\"prometheus\"}": "#F9BA8F" + }, + "bars": false, + "datasource": "", + "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": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [{ + "expr": "rate(prometheus_target_interval_length_seconds_count[5m])", + "intervalFactor": 2, + "legendFormat": "{{job}}", + "refId": "A", + "step": 2 + }], + "timeFrom": null, + "timeShift": null, + "title": "Target Scrapes (last 5m)", + "tooltip": { + "shared": true, + "value_type": "cumulative", + "ordering": "alphabetical", + "msResolution": false + }, + "type": "graph", + "yaxes": [{ + "show": true, + "min": null, + "max": null, + "logBase": 1, + "format": "short" + }, { + "show": true, + "min": null, + "max": null, + "logBase": 1, + "format": "short" + }], + "xaxis": { + "show": true + } + }, { + "aliasColors": {}, + "bars": false, + "datasource": "", + "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": 14, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [{ + "expr": "prometheus_target_interval_length_seconds{quantile!=\"0.01\", quantile!=\"0.05\"}", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{quantile}} ({{interval}})", + "metric": "", + "refId": "A", + "step": 2 + }], + "timeFrom": null, + "timeShift": null, + "title": "Scrape Duration", + "tooltip": { + "shared": true, + "value_type": "cumulative", + "ordering": "alphabetical", + "msResolution": false + }, + "type": "graph", + "yaxes": [{ + "show": true, + "min": null, + "max": null, + "logBase": 1, + "format": "short" + }, { + "show": true, + "min": null, + "max": null, + "logBase": 1, + "format": "short" + }], + "xaxis": { + "show": true + } + }, { + "content": "#### Scrapes\nPrometheus scrapes metrics from instrumented jobs, either directly or via an intermediary push gateway for short-lived jobs. Target scrapes will show how frequently targets are scraped, as measured over the last 5 minutes, per time series in the range vector. Scrape Duration will show how long the scrapes are taking, with percentiles available as series. ", + "editable": true, + "error": false, + "id": 11, + "links": [], + "mode": "markdown", + "span": 3, + "style": {}, + "title": "", + "transparent": true, + "type": "text" + }], + "title": "New row" + }, { + "collapse": false, + "editable": true, + "height": "250px", + "panels": [{ + "aliasColors": {}, + "bars": false, + "datasource": "", + "decimals": null, + "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": 12, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 9, + "stack": false, + "steppedLine": false, + "targets": [{ + "expr": "prometheus_evaluator_duration_milliseconds{quantile!=\"0.01\", quantile!=\"0.05\"}", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{quantile}}", + "refId": "A", + "step": 2 + }], + "timeFrom": null, + "timeShift": null, + "title": "Rule Eval Duration", + "tooltip": { + "shared": true, + "value_type": "cumulative", + "ordering": "alphabetical", + "msResolution": false + }, + "type": "graph", + "yaxes": [{ + "show": true, + "min": null, + "max": null, + "logBase": 1, + "format": "percentunit", + "label": "" + }, { + "show": true, + "min": null, + "max": null, + "logBase": 1, + "format": "short" + }], + "xaxis": { + "show": true + } + }, { + "content": "#### Rule Evaluation Duration\nThis graph panel plots the duration for all evaluations to execute. The 50th percentile, 90th percentile and 99th percentile are shown as three separate series to help identify outliers that may be skewing the data.", + "editable": true, + "error": false, + "id": 15, + "links": [], + "mode": "markdown", + "span": 3, + "style": {}, + "title": "", + "transparent": true, + "type": "text" + }], + "title": "New row" + }], + "time": { + "from": "now-5m", + "to": "now" + }, + "timepicker": { + "now": true, + "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": [] + }, + "annotations": { + "list": [] + }, + "refresh": false, + "schemaVersion": 12, + "version": 0, + "links": [{ + "icon": "info", + "tags": [], + "targetBlank": true, + "title": "Grafana Docs", + "tooltip": "", + "type": "link", + "url": "http://www.grafana.org/docs" + }, { + "icon": "info", + "tags": [], + "targetBlank": true, + "title": "Prometheus Docs", + "type": "link", + "url": "http://prometheus.io/docs/introduction/overview/" + }], + "gnetId": 2, + "description": "The official, pre-built Prometheus Stats Dashboard." + } diff --git a/manifests/prometheus/grafana-net-737-dashboard.json b/manifests/prometheus/grafana-net-737-dashboard.json new file mode 100644 index 000000000..7d6839195 --- /dev/null +++ b/manifests/prometheus/grafana-net-737-dashboard.json @@ -0,0 +1,1200 @@ + { + "__inputs": [{ + "name": "DS_PROMETHEUS", + "label": "prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + }], + "__requires": [{ + "type": "panel", + "id": "singlestat", + "name": "Singlestat", + "version": "" + }, { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + }, { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "3.1.0" + }, { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }], + "id": null, + "title": "Kubernetes Pod Resources", + "description": "Shows resource usage of Kubernetes pods.", + "tags": [ + "kubernetes" + ], + "style": "dark", + "timezone": "browser", + "editable": true, + "hideControls": false, + "sharedCrosshair": false, + "rows": [{ + "collapse": false, + "editable": true, + "height": "250px", + "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": "", + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "180px", + "id": 4, + "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": 4, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum (container_memory_working_set_bytes{id=\"/\",instance=~\"^$\"}) / sum (machine_memory_bytes{instance=~\"^$\"}) * 100", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 2 + }], + "thresholds": "65, 90", + "timeFrom": "1m", + "timeShift": null, + "title": "Memory Working Set", + "transparent": false, + "type": "singlestat", + "valueFontSize": "80%", + "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": "", + "decimals": 2, + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "180px", + "id": 6, + "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": 4, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum(rate(container_cpu_usage_seconds_total{id=\"/\",instance=~\"^$\"}[1m])) / sum (machine_cpu_cores{instance=~\"^$\"}) * 100", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + }], + "thresholds": "65, 90", + "timeFrom": "1m", + "timeShift": null, + "title": "Cpu Usage", + "type": "singlestat", + "valueFontSize": "80%", + "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": "", + "decimals": 2, + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "180px", + "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": 4, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum(container_fs_usage_bytes{id=\"/\",instance=~\"^$\"}) / sum(container_fs_limit_bytes{id=\"/\",instance=~\"^$\"}) * 100", + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 10 + }], + "thresholds": "65, 90", + "timeFrom": "1m", + "timeShift": null, + "title": "Filesystem Usage", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [{ + "op": "=", + "text": "N/A", + "value": "null" + }], + "valueName": "current" + }, { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "", + "decimals": 2, + "editable": true, + "error": false, + "format": "bytes", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "1px", + "hideTimeOverride": 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": "20%", + "prefix": "", + "prefixFontSize": "20%", + "rangeMaps": [{ + "from": "null", + "text": "N/A", + "to": "null" + }], + "span": 2, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum(container_memory_working_set_bytes{id=\"/\",instance=~\"^$\"})", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + }], + "thresholds": "", + "timeFrom": "1m", + "title": "Used", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [{ + "op": "=", + "text": "N/A", + "value": "null" + }], + "valueName": "current" + }, { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "", + "decimals": 2, + "editable": true, + "error": false, + "format": "bytes", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "1px", + "hideTimeOverride": 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, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum (machine_memory_bytes{instance=~\"^$\"})", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + }], + "thresholds": "", + "timeFrom": "1m", + "title": "Total", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [{ + "op": "=", + "text": "N/A", + "value": "null" + }], + "valueName": "current" + }, { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "", + "decimals": 2, + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "1px", + "hideTimeOverride": 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": " cores", + "postfixFontSize": "30%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [{ + "from": "null", + "text": "N/A", + "to": "null" + }], + "span": 2, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum (rate (container_cpu_usage_seconds_total{id=\"/\",instance=~\"^$\"}[1m]))", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + }], + "thresholds": "", + "timeFrom": "1m", + "timeShift": null, + "title": "Used", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [{ + "op": "=", + "text": "N/A", + "value": "null" + }], + "valueName": "current" + }, { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "", + "decimals": 2, + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "1px", + "hideTimeOverride": true, + "id": 12, + "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": " cores", + "postfixFontSize": "30%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [{ + "from": "null", + "text": "N/A", + "to": "null" + }], + "span": 2, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum (machine_cpu_cores{instance=~\"^$\"})", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + }], + "thresholds": "", + "timeFrom": "1m", + "title": "Total", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [{ + "op": "=", + "text": "N/A", + "value": "null" + }], + "valueName": "current" + }, { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "", + "decimals": 2, + "editable": true, + "error": false, + "format": "bytes", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "1px", + "hideTimeOverride": true, + "id": 13, + "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, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum(container_fs_usage_bytes{id=\"/\",instance=~\"^$\"})", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + }], + "thresholds": "", + "timeFrom": "1m", + "title": "Used", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [{ + "op": "=", + "text": "N/A", + "value": "null" + }], + "valueName": "current" + }, { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "", + "decimals": 2, + "editable": true, + "error": false, + "format": "bytes", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "1px", + "hideTimeOverride": true, + "id": 14, + "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, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum (container_fs_limit_bytes{id=\"/\",instance=~\"^$\"})", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + }], + "thresholds": "", + "timeFrom": "1m", + "title": "Total", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [{ + "op": "=", + "text": "N/A", + "value": "null" + }], + "valueName": "current" + }, { + "aliasColors": {}, + "bars": false, + "datasource": "", + "decimals": 2, + "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)", + "thresholdLine": false + }, + "height": "200px", + "id": 32, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 200, + "sort": "current", + "sortDesc": 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": [{ + "expr": "sum(rate(container_network_receive_bytes_total{instance=~\"^$\",namespace=~\"^$\"}[1m]))", + "interval": "", + "intervalFactor": 2, + "legendFormat": "receive", + "metric": "network", + "refId": "A", + "step": 240 + }, { + "expr": "- sum(rate(container_network_transmit_bytes_total{instance=~\"^$\",namespace=~\"^$\"}[1m]))", + "interval": "", + "intervalFactor": 2, + "legendFormat": "transmit", + "metric": "network", + "refId": "B", + "step": 240 + }], + "timeFrom": null, + "timeShift": null, + "title": "Network", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [{ + "format": "Bps", + "label": "transmit / receive", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + }] + }], + "showTitle": true, + "title": "all pods" + }, { + "collapse": false, + "editable": true, + "height": "250px", + "panels": [{ + "aliasColors": {}, + "bars": false, + "datasource": "", + "decimals": 3, + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "height": "", + "id": 17, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": null, + "sort": "current", + "sortDesc": 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": [{ + "expr": "sum(rate(container_cpu_usage_seconds_total{image!=\"\",name=~\"^k8s_.*\",instance=~\"^$\",namespace=~\"^$\"}[1m])) by (pod_name)", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ pod_name }}", + "metric": "container_cpu", + "refId": "A", + "step": 240 + }], + "timeFrom": null, + "timeShift": null, + "title": "Cpu Usage", + "tooltip": { + "msResolution": true, + "shared": false, + "sort": 2, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [{ + "format": "none", + "label": "cores", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + }] + }, { + "aliasColors": {}, + "bars": false, + "datasource": "", + "decimals": 2, + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "id": 33, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": null, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 12, + "stack": false, + "steppedLine": false, + "targets": [{ + "expr": "sum (container_memory_working_set_bytes{image!=\"\",name=~\"^k8s_.*\",instance=~\"^$\",namespace=~\"^$\"}) by (pod_name)", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ pod_name }}", + "metric": "", + "refId": "A", + "step": 240 + }], + "timeFrom": null, + "timeShift": null, + "title": "Memory Working Set", + "tooltip": { + "msResolution": false, + "shared": false, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [{ + "format": "bytes", + "label": "used", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + }] + }, { + "aliasColors": {}, + "bars": false, + "datasource": "", + "decimals": 2, + "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": 16, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 200, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 12, + "stack": false, + "steppedLine": false, + "targets": [{ + "expr": "sum (rate (container_network_receive_bytes_total{image!=\"\",name=~\"^k8s_.*\",instance=~\"^$\",namespace=~\"^$\"}[1m])) by (pod_name)", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ pod_name }} < in", + "metric": "network", + "refId": "A", + "step": 240 + }, { + "expr": "- sum (rate (container_network_transmit_bytes_total{image!=\"\",name=~\"^k8s_.*\",instance=~\"^$\",namespace=~\"^$\"}[1m])) by (pod_name)", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ pod_name }} > out", + "metric": "network", + "refId": "B", + "step": 240 + }], + "timeFrom": null, + "timeShift": null, + "title": "Network", + "tooltip": { + "msResolution": false, + "shared": false, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [{ + "format": "Bps", + "label": "transmit / receive", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + }] + }, { + "aliasColors": {}, + "bars": false, + "datasource": "", + "decimals": 2, + "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": 34, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 200, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 12, + "stack": false, + "steppedLine": false, + "targets": [{ + "expr": "sum(container_fs_usage_bytes{image!=\"\",name=~\"^k8s_.*\",instance=~\"^$\",namespace=~\"^$\"}) by (pod_name)", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ pod_name }}", + "metric": "network", + "refId": "A", + "step": 240 + }], + "timeFrom": null, + "timeShift": null, + "title": "Filesystem", + "tooltip": { + "msResolution": false, + "shared": false, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [{ + "format": "bytes", + "label": "used", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + }] + }], + "showTitle": true, + "title": "each pod" + }], + "time": { + "from": "now-3d", + "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": [{ + "allValue": ".*", + "current": {}, + "datasource": "", + "hide": 0, + "includeAll": true, + "label": "Instance", + "multi": false, + "name": "instance", + "options": [], + "query": "label_values(instance)", + "refresh": 1, + "regex": "", + "type": "query" + }, { + "current": {}, + "datasource": "", + "hide": 0, + "includeAll": true, + "label": "Namespace", + "multi": true, + "name": "namespace", + "options": [], + "query": "label_values(namespace)", + "refresh": 1, + "regex": "", + "type": "query" + }] + }, + "annotations": { + "list": [] + }, + "refresh": false, + "schemaVersion": 12, + "version": 8, + "links": [], + "gnetId": 737 + } diff --git a/manifests/test/centos-test.yaml b/manifests/prometheus/import-grafana-dashboard.yaml similarity index 100% rename from manifests/test/centos-test.yaml rename to manifests/prometheus/import-grafana-dashboard.yaml diff --git a/manifests/prometheus/kube-state-metrics.log b/manifests/prometheus/kube-state-metrics.log deleted file mode 100644 index c6a5d8813..000000000 --- a/manifests/prometheus/kube-state-metrics.log +++ /dev/null @@ -1,40 +0,0 @@ - -2017-09-25T11:53:14.559200871Z E0925 11:53:14.558983 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/statefulset.go:68: Failed to list *v1beta1.StatefulSet: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list statefulsets.apps at the cluster scope. (get statefulsets.apps) -2017-09-25T11:53:14.560711186Z E0925 11:53:14.560539 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/persistentvolumeclaim.go:60: Failed to list *v1.PersistentVolumeClaim: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list persistentvolumeclaims at the cluster scope. (get persistentvolumeclaims) -2017-09-25T11:53:14.561043368Z E0925 11:53:14.560920 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/cronjob.go:86: Failed to list *v2alpha1.CronJob: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list cronjobs.batch at the cluster scope. (get cronjobs.batch) -2017-09-25T11:53:14.56211475Z E0925 11:53:14.561906 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/job.go:106: Failed to list *v1.Job: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list jobs.batch at the cluster scope. (get jobs.batch) -2017-09-25T11:53:15.560928538Z E0925 11:53:15.560732 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/statefulset.go:68: Failed to list *v1beta1.StatefulSet: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list statefulsets.apps at the cluster scope. (get statefulsets.apps) -2017-09-25T11:53:15.562265859Z E0925 11:53:15.562102 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/persistentvolumeclaim.go:60: Failed to list *v1.PersistentVolumeClaim: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list persistentvolumeclaims at the cluster scope. (get persistentvolumeclaims) -2017-09-25T11:53:15.563239559Z E0925 11:53:15.563067 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/cronjob.go:86: Failed to list *v2alpha1.CronJob: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list cronjobs.batch at the cluster scope. (get cronjobs.batch) -2017-09-25T11:53:15.564390281Z E0925 11:53:15.564196 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/job.go:106: Failed to list *v1.Job: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list jobs.batch at the cluster scope. (get jobs.batch) -2017-09-25T11:53:16.562666898Z E0925 11:53:16.562450 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/statefulset.go:68: Failed to list *v1beta1.StatefulSet: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list statefulsets.apps at the cluster scope. (get statefulsets.apps) -2017-09-25T11:53:16.563807986Z E0925 11:53:16.563638 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/persistentvolumeclaim.go:60: Failed to list *v1.PersistentVolumeClaim: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list persistentvolumeclaims at the cluster scope. (get persistentvolumeclaims) -2017-09-25T11:53:16.564821972Z E0925 11:53:16.564628 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/cronjob.go:86: Failed to list *v2alpha1.CronJob: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list cronjobs.batch at the cluster scope. (get cronjobs.batch) -2017-09-25T11:53:16.565848893Z E0925 11:53:16.565669 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/job.go:106: Failed to list *v1.Job: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list jobs.batch at the cluster scope. (get jobs.batch) -2017-09-25T11:53:17.56438821Z E0925 11:53:17.564155 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/statefulset.go:68: Failed to list *v1beta1.StatefulSet: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list statefulsets.apps at the cluster scope. (get statefulsets.apps) -2017-09-25T11:53:17.565381358Z E0925 11:53:17.565189 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/persistentvolumeclaim.go:60: Failed to list *v1.PersistentVolumeClaim: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list persistentvolumeclaims at the cluster scope. (get persistentvolumeclaims) -2017-09-25T11:53:17.566231354Z E0925 11:53:17.566131 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/cronjob.go:86: Failed to list *v2alpha1.CronJob: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list cronjobs.batch at the cluster scope. (get cronjobs.batch) -2017-09-25T11:53:17.567286798Z E0925 11:53:17.567131 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/job.go:106: Failed to list *v1.Job: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list jobs.batch at the cluster scope. (get jobs.batch) -2017-09-25T11:53:18.570368569Z E0925 11:53:18.570150 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/job.go:106: Failed to list *v1.Job: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list jobs.batch at the cluster scope. (get jobs.batch) -2017-09-25T11:53:18.570406501Z E0925 11:53:18.570163 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/cronjob.go:86: Failed to list *v2alpha1.CronJob: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list cronjobs.batch at the cluster scope. (get cronjobs.batch) -2017-09-25T11:53:18.570413661Z E0925 11:53:18.570184 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/persistentvolumeclaim.go:60: Failed to list *v1.PersistentVolumeClaim: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list persistentvolumeclaims at the cluster scope. (get persistentvolumeclaims) -2017-09-25T11:53:18.57041935Z E0925 11:53:18.570218 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/statefulset.go:68: Failed to list *v1beta1.StatefulSet: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list statefulsets.apps at the cluster scope. (get statefulsets.apps) -2017-09-25T11:53:19.57212411Z E0925 11:53:19.571840 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/job.go:106: Failed to list *v1.Job: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list jobs.batch at the cluster scope. (get jobs.batch) -2017-09-25T11:53:19.573109252Z E0925 11:53:19.572911 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/cronjob.go:86: Failed to list *v2alpha1.CronJob: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list cronjobs.batch at the cluster scope. (get cronjobs.batch) -2017-09-25T11:53:19.574044784Z E0925 11:53:19.573810 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/persistentvolumeclaim.go:60: Failed to list *v1.PersistentVolumeClaim: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list persistentvolumeclaims at the cluster scope. (get persistentvolumeclaims) -2017-09-25T11:53:19.575346655Z E0925 11:53:19.575102 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/statefulset.go:68: Failed to list *v1beta1.StatefulSet: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list statefulsets.apps at the cluster scope. (get statefulsets.apps) -2017-09-25T11:53:20.573827161Z E0925 11:53:20.573560 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/job.go:106: Failed to list *v1.Job: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list jobs.batch at the cluster scope. (get jobs.batch) -2017-09-25T11:53:20.574666239Z E0925 11:53:20.574441 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/cronjob.go:86: Failed to list *v2alpha1.CronJob: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list cronjobs.batch at the cluster scope. (get cronjobs.batch) -2017-09-25T11:53:20.57573655Z E0925 11:53:20.575493 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/persistentvolumeclaim.go:60: Failed to list *v1.PersistentVolumeClaim: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list persistentvolumeclaims at the cluster scope. (get persistentvolumeclaims) -2017-09-25T11:53:20.576839576Z E0925 11:53:20.576603 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/statefulset.go:68: Failed to list *v1beta1.StatefulSet: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list statefulsets.apps at the cluster scope. (get statefulsets.apps) -2017-09-25T11:53:21.575665021Z E0925 11:53:21.575429 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/job.go:106: Failed to list *v1.Job: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list jobs.batch at the cluster scope. (get jobs.batch) -2017-09-25T11:53:21.576522006Z E0925 11:53:21.576324 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/cronjob.go:86: Failed to list *v2alpha1.CronJob: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list cronjobs.batch at the cluster scope. (get cronjobs.batch) -2017-09-25T11:53:21.577614983Z E0925 11:53:21.577404 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/persistentvolumeclaim.go:60: Failed to list *v1.PersistentVolumeClaim: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list persistentvolumeclaims at the cluster scope. (get persistentvolumeclaims) -2017-09-25T11:53:21.578577469Z E0925 11:53:21.578373 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/statefulset.go:68: Failed to list *v1beta1.StatefulSet: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list statefulsets.apps at the cluster scope. (get statefulsets.apps) -2017-09-25T11:53:22.577373226Z E0925 11:53:22.577121 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/job.go:106: Failed to list *v1.Job: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list jobs.batch at the cluster scope. (get jobs.batch) -2017-09-25T11:53:22.578267576Z E0925 11:53:22.578043 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/cronjob.go:86: Failed to list *v2alpha1.CronJob: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list cronjobs.batch at the cluster scope. (get cronjobs.batch) -2017-09-25T11:53:22.579199644Z E0925 11:53:22.579002 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/persistentvolumeclaim.go:60: Failed to list *v1.PersistentVolumeClaim: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list persistentvolumeclaims at the cluster scope. (get persistentvolumeclaims) -2017-09-25T11:53:22.580366842Z E0925 11:53:22.580177 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/statefulset.go:68: Failed to list *v1beta1.StatefulSet: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list statefulsets.apps at the cluster scope. (get statefulsets.apps) -2017-09-25T11:53:23.578999887Z E0925 11:53:23.578734 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/job.go:106: Failed to list *v1.Job: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list jobs.batch at the cluster scope. (get jobs.batch) -2017-09-25T11:53:23.58002011Z E0925 11:53:23.579820 1 reflector.go:201] k8s.io/kube-state-metrics/collectors/cronjob.go:86: Failed to list *v2alpha1.CronJob: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list cronjobs.batch at the cluster scope. (get cronjobs.batch) - diff --git a/manifests/prometheus/prometheus-configmaps.yaml b/manifests/prometheus/prometheus-configmaps.yaml new file mode 100644 index 000000000..79b87eb9f --- /dev/null +++ b/manifests/prometheus/prometheus-configmaps.yaml @@ -0,0 +1,2090 @@ +apiVersion: v1 +data: + grafana-net-2-dashboard.json: | + { + "__inputs": [{ + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + }], + "__requires": [{ + "type": "panel", + "id": "singlestat", + "name": "Singlestat", + "version": "" + }, { + "type": "panel", + "id": "text", + "name": "Text", + "version": "" + }, { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + }, { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "3.1.0" + }, { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }], + "id": null, + "title": "Prometheus Stats", + "tags": [], + "style": "dark", + "timezone": "browser", + "editable": true, + "hideControls": true, + "sharedCrosshair": false, + "rows": [{ + "collapse": false, + "editable": true, + "height": 178, + "panels": [{ + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": ["rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)"], + "datasource": "${DS_PROMETHEUS}", + "decimals": 1, + "editable": true, + "error": false, + "format": "s", + "id": 5, + "interval": null, + "links": [], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "span": 3, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "(time() - process_start_time_seconds{job=\"prometheus\"})", + "intervalFactor": 2, + "refId": "A", + "step": 4 + }], + "thresholds": "", + "title": "Uptime", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [{ + "op": "=", + "text": "N/A", + "value": "null" + }], + "valueName": "current", + "mappingTypes": [{ + "name": "value to text", + "value": 1 + }, { + "name": "range to text", + "value": 2 + }], + "rangeMaps": [{ + "from": "null", + "to": "null", + "text": "N/A" + }], + "mappingType": 1, + "gauge": { + "show": false, + "minValue": 0, + "maxValue": 100, + "thresholdMarkers": true, + "thresholdLabels": false + } + }, { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": ["rgba(50, 172, 45, 0.97)", "rgba(237, 129, 40, 0.89)", "rgba(245, 54, 54, 0.9)"], + "datasource": "${DS_PROMETHEUS}", + "editable": true, + "error": false, + "format": "none", + "id": 6, + "interval": null, + "links": [], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "span": 3, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": true + }, + "targets": [{ + "expr": "prometheus_local_storage_memory_series", + "intervalFactor": 2, + "refId": "A", + "step": 4 + }], + "thresholds": "1,5", + "title": "Local Storage Memory Series", + "type": "singlestat", + "valueFontSize": "70%", + "valueMaps": [], + "valueName": "current", + "mappingTypes": [{ + "name": "value to text", + "value": 1 + }, { + "name": "range to text", + "value": 2 + }], + "rangeMaps": [{ + "from": "null", + "to": "null", + "text": "N/A" + }], + "mappingType": 1, + "gauge": { + "show": false, + "minValue": 0, + "maxValue": 100, + "thresholdMarkers": true, + "thresholdLabels": false + } + }, { + "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_PROMETHEUS}", + "editable": true, + "error": false, + "format": "none", + "id": 7, + "interval": null, + "links": [], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "span": 3, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": true + }, + "targets": [{ + "expr": "prometheus_local_storage_indexing_queue_length", + "intervalFactor": 2, + "refId": "A", + "step": 4 + }], + "thresholds": "500,4000", + "title": "Interal Storage Queue Length", + "type": "singlestat", + "valueFontSize": "70%", + "valueMaps": [{ + "op": "=", + "text": "Empty", + "value": "0" + }], + "valueName": "current", + "mappingTypes": [{ + "name": "value to text", + "value": 1 + }, { + "name": "range to text", + "value": 2 + }], + "rangeMaps": [{ + "from": "null", + "to": "null", + "text": "N/A" + }], + "mappingType": 1, + "gauge": { + "show": false, + "minValue": 0, + "maxValue": 100, + "thresholdMarkers": true, + "thresholdLabels": false + } + }, { + "content": "\"Prometheus\nPrometheus\n\n

You're using Prometheus, an open-source systems monitoring and alerting toolkit originally built at SoundCloud. For more information, check out the Grafana and Prometheus projects.

", + "editable": true, + "error": false, + "id": 9, + "links": [], + "mode": "html", + "span": 3, + "style": {}, + "title": "", + "transparent": true, + "type": "text" + }], + "title": "New row" + }, { + "collapse": false, + "editable": true, + "height": 227, + "panels": [{ + "aliasColors": { + "prometheus": "#C15C17", + "{instance=\"localhost:9090\",job=\"prometheus\"}": "#C15C17" + }, + "bars": false, + "datasource": "${DS_PROMETHEUS}", + "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": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 9, + "stack": false, + "steppedLine": false, + "targets": [{ + "expr": "rate(prometheus_local_storage_ingested_samples_total[5m])", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{job}}", + "metric": "", + "refId": "A", + "step": 2 + }], + "timeFrom": null, + "timeShift": null, + "title": "Samples ingested (rate-5m)", + "tooltip": { + "shared": true, + "value_type": "cumulative", + "ordering": "alphabetical", + "msResolution": false + }, + "type": "graph", + "yaxes": [{ + "show": true, + "min": null, + "max": null, + "logBase": 1, + "format": "short" + }, { + "show": true, + "min": null, + "max": null, + "logBase": 1, + "format": "short" + }], + "xaxis": { + "show": true + } + }, { + "content": "#### Samples Ingested\nThis graph displays the count of samples ingested by the Prometheus server, as measured over the last 5 minutes, per time series in the range vector. When troubleshooting an issue on IRC or Github, this is often the first stat requested by the Prometheus team. ", + "editable": true, + "error": false, + "id": 8, + "links": [], + "mode": "markdown", + "span": 2.995914043583536, + "style": {}, + "title": "", + "transparent": true, + "type": "text" + }], + "title": "New row" + }, { + "collapse": false, + "editable": true, + "height": "250px", + "panels": [{ + "aliasColors": { + "prometheus": "#F9BA8F", + "{instance=\"localhost:9090\",interval=\"5s\",job=\"prometheus\"}": "#F9BA8F" + }, + "bars": false, + "datasource": "${DS_PROMETHEUS}", + "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": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [{ + "expr": "rate(prometheus_target_interval_length_seconds_count[5m])", + "intervalFactor": 2, + "legendFormat": "{{job}}", + "refId": "A", + "step": 2 + }], + "timeFrom": null, + "timeShift": null, + "title": "Target Scrapes (last 5m)", + "tooltip": { + "shared": true, + "value_type": "cumulative", + "ordering": "alphabetical", + "msResolution": false + }, + "type": "graph", + "yaxes": [{ + "show": true, + "min": null, + "max": null, + "logBase": 1, + "format": "short" + }, { + "show": true, + "min": null, + "max": null, + "logBase": 1, + "format": "short" + }], + "xaxis": { + "show": true + } + }, { + "aliasColors": {}, + "bars": false, + "datasource": "${DS_PROMETHEUS}", + "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": 14, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 4, + "stack": false, + "steppedLine": false, + "targets": [{ + "expr": "prometheus_target_interval_length_seconds{quantile!=\"0.01\", quantile!=\"0.05\"}", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{quantile}} ({{interval}})", + "metric": "", + "refId": "A", + "step": 2 + }], + "timeFrom": null, + "timeShift": null, + "title": "Scrape Duration", + "tooltip": { + "shared": true, + "value_type": "cumulative", + "ordering": "alphabetical", + "msResolution": false + }, + "type": "graph", + "yaxes": [{ + "show": true, + "min": null, + "max": null, + "logBase": 1, + "format": "short" + }, { + "show": true, + "min": null, + "max": null, + "logBase": 1, + "format": "short" + }], + "xaxis": { + "show": true + } + }, { + "content": "#### Scrapes\nPrometheus scrapes metrics from instrumented jobs, either directly or via an intermediary push gateway for short-lived jobs. Target scrapes will show how frequently targets are scraped, as measured over the last 5 minutes, per time series in the range vector. Scrape Duration will show how long the scrapes are taking, with percentiles available as series. ", + "editable": true, + "error": false, + "id": 11, + "links": [], + "mode": "markdown", + "span": 3, + "style": {}, + "title": "", + "transparent": true, + "type": "text" + }], + "title": "New row" + }, { + "collapse": false, + "editable": true, + "height": "250px", + "panels": [{ + "aliasColors": {}, + "bars": false, + "datasource": "${DS_PROMETHEUS}", + "decimals": null, + "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": 12, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 9, + "stack": false, + "steppedLine": false, + "targets": [{ + "expr": "prometheus_evaluator_duration_milliseconds{quantile!=\"0.01\", quantile!=\"0.05\"}", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{quantile}}", + "refId": "A", + "step": 2 + }], + "timeFrom": null, + "timeShift": null, + "title": "Rule Eval Duration", + "tooltip": { + "shared": true, + "value_type": "cumulative", + "ordering": "alphabetical", + "msResolution": false + }, + "type": "graph", + "yaxes": [{ + "show": true, + "min": null, + "max": null, + "logBase": 1, + "format": "percentunit", + "label": "" + }, { + "show": true, + "min": null, + "max": null, + "logBase": 1, + "format": "short" + }], + "xaxis": { + "show": true + } + }, { + "content": "#### Rule Evaluation Duration\nThis graph panel plots the duration for all evaluations to execute. The 50th percentile, 90th percentile and 99th percentile are shown as three separate series to help identify outliers that may be skewing the data.", + "editable": true, + "error": false, + "id": 15, + "links": [], + "mode": "markdown", + "span": 3, + "style": {}, + "title": "", + "transparent": true, + "type": "text" + }], + "title": "New row" + }], + "time": { + "from": "now-5m", + "to": "now" + }, + "timepicker": { + "now": true, + "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": [] + }, + "annotations": { + "list": [] + }, + "refresh": false, + "schemaVersion": 12, + "version": 0, + "links": [{ + "icon": "info", + "tags": [], + "targetBlank": true, + "title": "Grafana Docs", + "tooltip": "", + "type": "link", + "url": "http://www.grafana.org/docs" + }, { + "icon": "info", + "tags": [], + "targetBlank": true, + "title": "Prometheus Docs", + "type": "link", + "url": "http://prometheus.io/docs/introduction/overview/" + }], + "gnetId": 2, + "description": "The official, pre-built Prometheus Stats Dashboard." + } + grafana-net-737-dashboard.json: | + { + "__inputs": [{ + "name": "DS_PROMETHEUS", + "label": "prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + }], + "__requires": [{ + "type": "panel", + "id": "singlestat", + "name": "Singlestat", + "version": "" + }, { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + }, { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "3.1.0" + }, { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }], + "id": null, + "title": "Kubernetes Pod Resources", + "description": "Shows resource usage of Kubernetes pods.", + "tags": [ + "kubernetes" + ], + "style": "dark", + "timezone": "browser", + "editable": true, + "hideControls": false, + "sharedCrosshair": false, + "rows": [{ + "collapse": false, + "editable": true, + "height": "250px", + "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_PROMETHEUS}", + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "180px", + "id": 4, + "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": 4, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum (container_memory_working_set_bytes{id=\"/\",instance=~\"^$instance$\"}) / sum (machine_memory_bytes{instance=~\"^$instance$\"}) * 100", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 2 + }], + "thresholds": "65, 90", + "timeFrom": "1m", + "timeShift": null, + "title": "Memory Working Set", + "transparent": false, + "type": "singlestat", + "valueFontSize": "80%", + "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_PROMETHEUS}", + "decimals": 2, + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "180px", + "id": 6, + "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": 4, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum(rate(container_cpu_usage_seconds_total{id=\"/\",instance=~\"^$instance$\"}[1m])) / sum (machine_cpu_cores{instance=~\"^$instance$\"}) * 100", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + }], + "thresholds": "65, 90", + "timeFrom": "1m", + "timeShift": null, + "title": "Cpu Usage", + "type": "singlestat", + "valueFontSize": "80%", + "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_PROMETHEUS}", + "decimals": 2, + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "180px", + "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": 4, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum(container_fs_usage_bytes{id=\"/\",instance=~\"^$instance$\"}) / sum(container_fs_limit_bytes{id=\"/\",instance=~\"^$instance$\"}) * 100", + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 10 + }], + "thresholds": "65, 90", + "timeFrom": "1m", + "timeShift": null, + "title": "Filesystem Usage", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [{ + "op": "=", + "text": "N/A", + "value": "null" + }], + "valueName": "current" + }, { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "${DS_PROMETHEUS}", + "decimals": 2, + "editable": true, + "error": false, + "format": "bytes", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "1px", + "hideTimeOverride": 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": "20%", + "prefix": "", + "prefixFontSize": "20%", + "rangeMaps": [{ + "from": "null", + "text": "N/A", + "to": "null" + }], + "span": 2, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum(container_memory_working_set_bytes{id=\"/\",instance=~\"^$instance$\"})", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + }], + "thresholds": "", + "timeFrom": "1m", + "title": "Used", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [{ + "op": "=", + "text": "N/A", + "value": "null" + }], + "valueName": "current" + }, { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "${DS_PROMETHEUS}", + "decimals": 2, + "editable": true, + "error": false, + "format": "bytes", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "1px", + "hideTimeOverride": 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, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum (machine_memory_bytes{instance=~\"^$instance$\"})", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + }], + "thresholds": "", + "timeFrom": "1m", + "title": "Total", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [{ + "op": "=", + "text": "N/A", + "value": "null" + }], + "valueName": "current" + }, { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "${DS_PROMETHEUS}", + "decimals": 2, + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "1px", + "hideTimeOverride": 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": " cores", + "postfixFontSize": "30%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [{ + "from": "null", + "text": "N/A", + "to": "null" + }], + "span": 2, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum (rate (container_cpu_usage_seconds_total{id=\"/\",instance=~\"^$instance$\"}[1m]))", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + }], + "thresholds": "", + "timeFrom": "1m", + "timeShift": null, + "title": "Used", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [{ + "op": "=", + "text": "N/A", + "value": "null" + }], + "valueName": "current" + }, { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "${DS_PROMETHEUS}", + "decimals": 2, + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "1px", + "hideTimeOverride": true, + "id": 12, + "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": " cores", + "postfixFontSize": "30%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [{ + "from": "null", + "text": "N/A", + "to": "null" + }], + "span": 2, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum (machine_cpu_cores{instance=~\"^$instance$\"})", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + }], + "thresholds": "", + "timeFrom": "1m", + "title": "Total", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [{ + "op": "=", + "text": "N/A", + "value": "null" + }], + "valueName": "current" + }, { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "${DS_PROMETHEUS}", + "decimals": 2, + "editable": true, + "error": false, + "format": "bytes", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "1px", + "hideTimeOverride": true, + "id": 13, + "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, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum(container_fs_usage_bytes{id=\"/\",instance=~\"^$instance$\"})", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + }], + "thresholds": "", + "timeFrom": "1m", + "title": "Used", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [{ + "op": "=", + "text": "N/A", + "value": "null" + }], + "valueName": "current" + }, { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "${DS_PROMETHEUS}", + "decimals": 2, + "editable": true, + "error": false, + "format": "bytes", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "height": "1px", + "hideTimeOverride": true, + "id": 14, + "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, + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [{ + "expr": "sum (container_fs_limit_bytes{id=\"/\",instance=~\"^$instance$\"})", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + }], + "thresholds": "", + "timeFrom": "1m", + "title": "Total", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [{ + "op": "=", + "text": "N/A", + "value": "null" + }], + "valueName": "current" + }, { + "aliasColors": {}, + "bars": false, + "datasource": "${DS_PROMETHEUS}", + "decimals": 2, + "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)", + "thresholdLine": false + }, + "height": "200px", + "id": 32, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 200, + "sort": "current", + "sortDesc": 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": [{ + "expr": "sum(rate(container_network_receive_bytes_total{instance=~\"^$instance$\",namespace=~\"^$namespace$\"}[1m]))", + "interval": "", + "intervalFactor": 2, + "legendFormat": "receive", + "metric": "network", + "refId": "A", + "step": 240 + }, { + "expr": "- sum(rate(container_network_transmit_bytes_total{instance=~\"^$instance$\",namespace=~\"^$namespace$\"}[1m]))", + "interval": "", + "intervalFactor": 2, + "legendFormat": "transmit", + "metric": "network", + "refId": "B", + "step": 240 + }], + "timeFrom": null, + "timeShift": null, + "title": "Network", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [{ + "format": "Bps", + "label": "transmit / receive", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + }] + }], + "showTitle": true, + "title": "all pods" + }, { + "collapse": false, + "editable": true, + "height": "250px", + "panels": [{ + "aliasColors": {}, + "bars": false, + "datasource": "${DS_PROMETHEUS}", + "decimals": 3, + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "height": "", + "id": 17, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": null, + "sort": "current", + "sortDesc": 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": [{ + "expr": "sum(rate(container_cpu_usage_seconds_total{image!=\"\",name=~\"^k8s_.*\",instance=~\"^$instance$\",namespace=~\"^$namespace$\"}[1m])) by (pod_name)", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ pod_name }}", + "metric": "container_cpu", + "refId": "A", + "step": 240 + }], + "timeFrom": null, + "timeShift": null, + "title": "Cpu Usage", + "tooltip": { + "msResolution": true, + "shared": false, + "sort": 2, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [{ + "format": "none", + "label": "cores", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + }] + }, { + "aliasColors": {}, + "bars": false, + "datasource": "${DS_PROMETHEUS}", + "decimals": 2, + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "id": 33, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": null, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 12, + "stack": false, + "steppedLine": false, + "targets": [{ + "expr": "sum (container_memory_working_set_bytes{image!=\"\",name=~\"^k8s_.*\",instance=~\"^$instance$\",namespace=~\"^$namespace$\"}) by (pod_name)", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ pod_name }}", + "metric": "", + "refId": "A", + "step": 240 + }], + "timeFrom": null, + "timeShift": null, + "title": "Memory Working Set", + "tooltip": { + "msResolution": false, + "shared": false, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [{ + "format": "bytes", + "label": "used", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + }] + }, { + "aliasColors": {}, + "bars": false, + "datasource": "${DS_PROMETHEUS}", + "decimals": 2, + "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": 16, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 200, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 12, + "stack": false, + "steppedLine": false, + "targets": [{ + "expr": "sum (rate (container_network_receive_bytes_total{image!=\"\",name=~\"^k8s_.*\",instance=~\"^$instance$\",namespace=~\"^$namespace$\"}[1m])) by (pod_name)", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ pod_name }} < in", + "metric": "network", + "refId": "A", + "step": 240 + }, { + "expr": "- sum (rate (container_network_transmit_bytes_total{image!=\"\",name=~\"^k8s_.*\",instance=~\"^$instance$\",namespace=~\"^$namespace$\"}[1m])) by (pod_name)", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ pod_name }} > out", + "metric": "network", + "refId": "B", + "step": 240 + }], + "timeFrom": null, + "timeShift": null, + "title": "Network", + "tooltip": { + "msResolution": false, + "shared": false, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [{ + "format": "Bps", + "label": "transmit / receive", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + }] + }, { + "aliasColors": {}, + "bars": false, + "datasource": "${DS_PROMETHEUS}", + "decimals": 2, + "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": 34, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 200, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 12, + "stack": false, + "steppedLine": false, + "targets": [{ + "expr": "sum(container_fs_usage_bytes{image!=\"\",name=~\"^k8s_.*\",instance=~\"^$instance$\",namespace=~\"^$namespace$\"}) by (pod_name)", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{ pod_name }}", + "metric": "network", + "refId": "A", + "step": 240 + }], + "timeFrom": null, + "timeShift": null, + "title": "Filesystem", + "tooltip": { + "msResolution": false, + "shared": false, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [{ + "format": "bytes", + "label": "used", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + }] + }], + "showTitle": true, + "title": "each pod" + }], + "time": { + "from": "now-3d", + "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": [{ + "allValue": ".*", + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "hide": 0, + "includeAll": true, + "label": "Instance", + "multi": false, + "name": "instance", + "options": [], + "query": "label_values(instance)", + "refresh": 1, + "regex": "", + "type": "query" + }, { + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "hide": 0, + "includeAll": true, + "label": "Namespace", + "multi": true, + "name": "namespace", + "options": [], + "query": "label_values(namespace)", + "refresh": 1, + "regex": "", + "type": "query" + }] + }, + "annotations": { + "list": [] + }, + "refresh": false, + "schemaVersion": 12, + "version": 8, + "links": [], + "gnetId": 737 + } + prometheus-datasource.json: | + { + "name": "prometheus", + "type": "prometheus", + "url": "http://prometheus:9090", + "access": "proxy", + "basicAuth": false + } +kind: ConfigMap +metadata: + creationTimestamp: null + name: grafana-import-dashboards + namespace: monitoring +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: grafana-import-dashboards + namespace: monitoring + labels: + app: grafana + component: import-dashboards +spec: + template: + metadata: + name: grafana-import-dashboards + labels: + app: grafana + component: import-dashboards + annotations: + pod.beta.kubernetes.io/init-containers: '[ + { + "name": "wait-for-endpoints", + "image": "192.168.1.60:5000/giantswarm/tiny-tools", + "imagePullPolicy": "IfNotPresent", + "command": ["fish", "-c", "echo \"waiting for endpoints...\"; while true; set endpoints (curl -s --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt --header \"Authorization: Bearer \"(cat /var/run/secrets/kubernetes.io/serviceaccount/token) https://kubernetes.default/api/v1/namespaces/monitoring/endpoints/grafana); echo $endpoints | jq \".\"; if test (echo $endpoints | jq -r \".subsets[]?.addresses // [] | length\") -gt 0; exit 0; end; echo \"waiting...\";sleep 1; end"], + "args": ["monitoring", "grafana"] + } + ]' + spec: + serviceAccountName: prometheus-k8s + containers: + - name: grafana-import-dashboards + image: 192.168.1.60:5000/giantswarm/tiny-tools + command: ["/bin/sh", "-c"] + workingDir: /opt/grafana-import-dashboards + args: + - > + for file in *-datasource.json ; do + if [ -e "$file" ] ; then + echo "importing $file" && + curl --silent --fail --show-error \ + --request POST http://admin:admin@grafana:3000/api/datasources \ + --header "Content-Type: application/json" \ + --data-binary "@$file" ; + echo "" ; + fi + done ; + for file in *-dashboard.json ; do + if [ -e "$file" ] ; then + echo "importing $file" && + ( echo '{"dashboard":'; \ + cat "$file"; \ + echo ',"overwrite":true,"inputs":[{"name":"DS_PROMETHEUS","type":"datasource","pluginId":"prometheus","value":"prometheus"}]}' ) \ + | jq -c '.' \ + | curl --silent --fail --show-error \ + --request POST http://admin:admin@grafana:3000/api/dashboards/import \ + --header "Content-Type: application/json" \ + --data-binary "@-" ; + echo "" ; + fi + done + + volumeMounts: + - name: config-volume + mountPath: /opt/grafana-import-dashboards + restartPolicy: Never + volumes: + - name: config-volume + configMap: + name: grafana-import-dashboards +--- +# apiVersion: extensions/v1beta1 +# kind: Ingress +# metadata: +# name: grafana +# namespace: monitoring +# spec: +# rules: +# - host: ..k8s.gigantic.io +# http: +# paths: +# - path: / +# backend: +# serviceName: grafana +# servicePort: 3000 +--- +apiVersion: v1 +kind: Service +metadata: + name: grafana + namespace: monitoring + labels: + app: grafana + component: core +spec: + type: NodePort + ports: + - port: 3000 + selector: + app: grafana + component: core +--- +apiVersion: v1 +data: + prometheus.yaml: | + global: + scrape_interval: 10s + scrape_timeout: 10s + evaluation_interval: 10s + rule_files: + - "/etc/prometheus-rules/*.rules" + + scrape_configs: + - job_name: 'kubernetes-apiservers' + + kubernetes_sd_configs: + - role: endpoints + + scheme: https + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + relabel_configs: + - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] + action: keep + regex: default;kubernetes;https + - job_name: 'kubernetes-nodes' + scheme: https + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + + kubernetes_sd_configs: + - role: node + + relabel_configs: + - action: labelmap + regex: __meta_kubernetes_node_label_(.+) + - target_label: __address__ + replacement: kubernetes.default:443 + - source_labels: [__meta_kubernetes_node_name] + regex: (.+) + target_label: __metrics_path__ + replacement: /api/v1/nodes/${1}/proxy/metrics + + - job_name: 'kubernetes-cadvisor' + scheme: https + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + + kubernetes_sd_configs: + - role: node + + relabel_configs: + - action: labelmap + regex: __meta_kubernetes_node_label_(.+) + - target_label: __address__ + replacement: kubernetes.default:443 + - source_labels: [__meta_kubernetes_node_name] + regex: (.+) + target_label: __metrics_path__ + replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor + + - job_name: 'kubernetes-service-endpoints' + + kubernetes_sd_configs: + - role: endpoints + + relabel_configs: + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] + action: keep + regex: true + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] + action: replace + target_label: __scheme__ + regex: (https?) + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] + action: replace + target_label: __metrics_path__ + regex: (.+) + - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] + action: replace + target_label: __address__ + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - source_labels: [__meta_kubernetes_namespace] + action: replace + target_label: kubernetes_namespace + - source_labels: [__meta_kubernetes_service_name] + action: replace + target_label: kubernetes_name + + - job_name: 'kubernetes-services' + + metrics_path: /probe + params: + module: [http_2xx] + + kubernetes_sd_configs: + - role: service + + relabel_configs: + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe] + action: keep + regex: true + - source_labels: [__address__] + target_label: __param_target + - target_label: __address__ + replacement: blackbox-exporter.example.com:9115 + - source_labels: [__param_target] + target_label: instance + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - source_labels: [__meta_kubernetes_namespace] + target_label: kubernetes_namespace + - source_labels: [__meta_kubernetes_service_name] + target_label: kubernetes_name + + - job_name: 'kubernetes-pods' + + kubernetes_sd_configs: + - role: pod + + relabel_configs: + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] + action: keep + regex: true + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] + action: replace + target_label: __metrics_path__ + regex: (.+) + - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] + action: replace + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + target_label: __address__ + - action: labelmap + regex: __meta_kubernetes_pod_label_(.+) + - source_labels: [__meta_kubernetes_namespace] + action: replace + target_label: kubernetes_namespace + - source_labels: [__meta_kubernetes_pod_name] + action: replace + target_label: kubernetes_pod_name +kind: ConfigMap +metadata: + creationTimestamp: null + name: prometheus-core + namespace: monitoring \ No newline at end of file diff --git a/manifests/prometheus/prometheus-datasource.json b/manifests/prometheus/prometheus-datasource.json new file mode 100644 index 000000000..70c7b781a --- /dev/null +++ b/manifests/prometheus/prometheus-datasource.json @@ -0,0 +1,6 @@ + "name": "prometheus", + "type": "prometheus", + "url": "http://prometheus:9090", + "access": "proxy", + "basicAuth": false + } diff --git a/manifests/prometheus/prometheus-monitoring-serviceaccount.yaml b/manifests/prometheus/prometheus-monitoring-serviceaccount.yaml new file mode 100644 index 000000000..bb6f87142 --- /dev/null +++ b/manifests/prometheus/prometheus-monitoring-serviceaccount.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: prometheus-k8s + namespace: monitoring +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: kube-state-metrics + namespace: monitoring diff --git a/manifests/prometheus/prometheus-monitoring.yaml b/manifests/prometheus/prometheus-monitoring.yaml index b034bbac3..777538595 100644 --- a/manifests/prometheus/prometheus-monitoring.yaml +++ b/manifests/prometheus/prometheus-monitoring.yaml @@ -402,1847 +402,6 @@ spec: - name: grafana-persistent-storage emptyDir: {} --- -apiVersion: v1 -data: - grafana-net-2-dashboard.json: | - { - "__inputs": [{ - "name": "DS_PROMETHEUS", - "label": "Prometheus", - "description": "", - "type": "datasource", - "pluginId": "prometheus", - "pluginName": "Prometheus" - }], - "__requires": [{ - "type": "panel", - "id": "singlestat", - "name": "Singlestat", - "version": "" - }, { - "type": "panel", - "id": "text", - "name": "Text", - "version": "" - }, { - "type": "panel", - "id": "graph", - "name": "Graph", - "version": "" - }, { - "type": "grafana", - "id": "grafana", - "name": "Grafana", - "version": "3.1.0" - }, { - "type": "datasource", - "id": "prometheus", - "name": "Prometheus", - "version": "1.0.0" - }], - "id": null, - "title": "Prometheus Stats", - "tags": [], - "style": "dark", - "timezone": "browser", - "editable": true, - "hideControls": true, - "sharedCrosshair": false, - "rows": [{ - "collapse": false, - "editable": true, - "height": 178, - "panels": [{ - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": ["rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)"], - "datasource": "${DS_PROMETHEUS}", - "decimals": 1, - "editable": true, - "error": false, - "format": "s", - "id": 5, - "interval": null, - "links": [], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "span": 3, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "targets": [{ - "expr": "(time() - process_start_time_seconds{job=\"prometheus\"})", - "intervalFactor": 2, - "refId": "A", - "step": 4 - }], - "thresholds": "", - "title": "Uptime", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [{ - "op": "=", - "text": "N/A", - "value": "null" - }], - "valueName": "current", - "mappingTypes": [{ - "name": "value to text", - "value": 1 - }, { - "name": "range to text", - "value": 2 - }], - "rangeMaps": [{ - "from": "null", - "to": "null", - "text": "N/A" - }], - "mappingType": 1, - "gauge": { - "show": false, - "minValue": 0, - "maxValue": 100, - "thresholdMarkers": true, - "thresholdLabels": false - } - }, { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": ["rgba(50, 172, 45, 0.97)", "rgba(237, 129, 40, 0.89)", "rgba(245, 54, 54, 0.9)"], - "datasource": "${DS_PROMETHEUS}", - "editable": true, - "error": false, - "format": "none", - "id": 6, - "interval": null, - "links": [], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "span": 3, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": true - }, - "targets": [{ - "expr": "prometheus_local_storage_memory_series", - "intervalFactor": 2, - "refId": "A", - "step": 4 - }], - "thresholds": "1,5", - "title": "Local Storage Memory Series", - "type": "singlestat", - "valueFontSize": "70%", - "valueMaps": [], - "valueName": "current", - "mappingTypes": [{ - "name": "value to text", - "value": 1 - }, { - "name": "range to text", - "value": 2 - }], - "rangeMaps": [{ - "from": "null", - "to": "null", - "text": "N/A" - }], - "mappingType": 1, - "gauge": { - "show": false, - "minValue": 0, - "maxValue": 100, - "thresholdMarkers": true, - "thresholdLabels": false - } - }, { - "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_PROMETHEUS}", - "editable": true, - "error": false, - "format": "none", - "id": 7, - "interval": null, - "links": [], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "span": 3, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": true - }, - "targets": [{ - "expr": "prometheus_local_storage_indexing_queue_length", - "intervalFactor": 2, - "refId": "A", - "step": 4 - }], - "thresholds": "500,4000", - "title": "Interal Storage Queue Length", - "type": "singlestat", - "valueFontSize": "70%", - "valueMaps": [{ - "op": "=", - "text": "Empty", - "value": "0" - }], - "valueName": "current", - "mappingTypes": [{ - "name": "value to text", - "value": 1 - }, { - "name": "range to text", - "value": 2 - }], - "rangeMaps": [{ - "from": "null", - "to": "null", - "text": "N/A" - }], - "mappingType": 1, - "gauge": { - "show": false, - "minValue": 0, - "maxValue": 100, - "thresholdMarkers": true, - "thresholdLabels": false - } - }, { - "content": "\"Prometheus\nPrometheus\n\n

You're using Prometheus, an open-source systems monitoring and alerting toolkit originally built at SoundCloud. For more information, check out the Grafana and Prometheus projects.

", - "editable": true, - "error": false, - "id": 9, - "links": [], - "mode": "html", - "span": 3, - "style": {}, - "title": "", - "transparent": true, - "type": "text" - }], - "title": "New row" - }, { - "collapse": false, - "editable": true, - "height": 227, - "panels": [{ - "aliasColors": { - "prometheus": "#C15C17", - "{instance=\"localhost:9090\",job=\"prometheus\"}": "#C15C17" - }, - "bars": false, - "datasource": "${DS_PROMETHEUS}", - "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": 3, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 9, - "stack": false, - "steppedLine": false, - "targets": [{ - "expr": "rate(prometheus_local_storage_ingested_samples_total[5m])", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{job}}", - "metric": "", - "refId": "A", - "step": 2 - }], - "timeFrom": null, - "timeShift": null, - "title": "Samples ingested (rate-5m)", - "tooltip": { - "shared": true, - "value_type": "cumulative", - "ordering": "alphabetical", - "msResolution": false - }, - "type": "graph", - "yaxes": [{ - "show": true, - "min": null, - "max": null, - "logBase": 1, - "format": "short" - }, { - "show": true, - "min": null, - "max": null, - "logBase": 1, - "format": "short" - }], - "xaxis": { - "show": true - } - }, { - "content": "#### Samples Ingested\nThis graph displays the count of samples ingested by the Prometheus server, as measured over the last 5 minutes, per time series in the range vector. When troubleshooting an issue on IRC or Github, this is often the first stat requested by the Prometheus team. ", - "editable": true, - "error": false, - "id": 8, - "links": [], - "mode": "markdown", - "span": 2.995914043583536, - "style": {}, - "title": "", - "transparent": true, - "type": "text" - }], - "title": "New row" - }, { - "collapse": false, - "editable": true, - "height": "250px", - "panels": [{ - "aliasColors": { - "prometheus": "#F9BA8F", - "{instance=\"localhost:9090\",interval=\"5s\",job=\"prometheus\"}": "#F9BA8F" - }, - "bars": false, - "datasource": "${DS_PROMETHEUS}", - "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": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 5, - "stack": false, - "steppedLine": false, - "targets": [{ - "expr": "rate(prometheus_target_interval_length_seconds_count[5m])", - "intervalFactor": 2, - "legendFormat": "{{job}}", - "refId": "A", - "step": 2 - }], - "timeFrom": null, - "timeShift": null, - "title": "Target Scrapes (last 5m)", - "tooltip": { - "shared": true, - "value_type": "cumulative", - "ordering": "alphabetical", - "msResolution": false - }, - "type": "graph", - "yaxes": [{ - "show": true, - "min": null, - "max": null, - "logBase": 1, - "format": "short" - }, { - "show": true, - "min": null, - "max": null, - "logBase": 1, - "format": "short" - }], - "xaxis": { - "show": true - } - }, { - "aliasColors": {}, - "bars": false, - "datasource": "${DS_PROMETHEUS}", - "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": 14, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 4, - "stack": false, - "steppedLine": false, - "targets": [{ - "expr": "prometheus_target_interval_length_seconds{quantile!=\"0.01\", quantile!=\"0.05\"}", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{quantile}} ({{interval}})", - "metric": "", - "refId": "A", - "step": 2 - }], - "timeFrom": null, - "timeShift": null, - "title": "Scrape Duration", - "tooltip": { - "shared": true, - "value_type": "cumulative", - "ordering": "alphabetical", - "msResolution": false - }, - "type": "graph", - "yaxes": [{ - "show": true, - "min": null, - "max": null, - "logBase": 1, - "format": "short" - }, { - "show": true, - "min": null, - "max": null, - "logBase": 1, - "format": "short" - }], - "xaxis": { - "show": true - } - }, { - "content": "#### Scrapes\nPrometheus scrapes metrics from instrumented jobs, either directly or via an intermediary push gateway for short-lived jobs. Target scrapes will show how frequently targets are scraped, as measured over the last 5 minutes, per time series in the range vector. Scrape Duration will show how long the scrapes are taking, with percentiles available as series. ", - "editable": true, - "error": false, - "id": 11, - "links": [], - "mode": "markdown", - "span": 3, - "style": {}, - "title": "", - "transparent": true, - "type": "text" - }], - "title": "New row" - }, { - "collapse": false, - "editable": true, - "height": "250px", - "panels": [{ - "aliasColors": {}, - "bars": false, - "datasource": "${DS_PROMETHEUS}", - "decimals": null, - "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": 12, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": true, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 9, - "stack": false, - "steppedLine": false, - "targets": [{ - "expr": "prometheus_evaluator_duration_milliseconds{quantile!=\"0.01\", quantile!=\"0.05\"}", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{quantile}}", - "refId": "A", - "step": 2 - }], - "timeFrom": null, - "timeShift": null, - "title": "Rule Eval Duration", - "tooltip": { - "shared": true, - "value_type": "cumulative", - "ordering": "alphabetical", - "msResolution": false - }, - "type": "graph", - "yaxes": [{ - "show": true, - "min": null, - "max": null, - "logBase": 1, - "format": "percentunit", - "label": "" - }, { - "show": true, - "min": null, - "max": null, - "logBase": 1, - "format": "short" - }], - "xaxis": { - "show": true - } - }, { - "content": "#### Rule Evaluation Duration\nThis graph panel plots the duration for all evaluations to execute. The 50th percentile, 90th percentile and 99th percentile are shown as three separate series to help identify outliers that may be skewing the data.", - "editable": true, - "error": false, - "id": 15, - "links": [], - "mode": "markdown", - "span": 3, - "style": {}, - "title": "", - "transparent": true, - "type": "text" - }], - "title": "New row" - }], - "time": { - "from": "now-5m", - "to": "now" - }, - "timepicker": { - "now": true, - "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": [] - }, - "annotations": { - "list": [] - }, - "refresh": false, - "schemaVersion": 12, - "version": 0, - "links": [{ - "icon": "info", - "tags": [], - "targetBlank": true, - "title": "Grafana Docs", - "tooltip": "", - "type": "link", - "url": "http://www.grafana.org/docs" - }, { - "icon": "info", - "tags": [], - "targetBlank": true, - "title": "Prometheus Docs", - "type": "link", - "url": "http://prometheus.io/docs/introduction/overview/" - }], - "gnetId": 2, - "description": "The official, pre-built Prometheus Stats Dashboard." - } - grafana-net-737-dashboard.json: | - { - "__inputs": [{ - "name": "DS_PROMETHEUS", - "label": "prometheus", - "description": "", - "type": "datasource", - "pluginId": "prometheus", - "pluginName": "Prometheus" - }], - "__requires": [{ - "type": "panel", - "id": "singlestat", - "name": "Singlestat", - "version": "" - }, { - "type": "panel", - "id": "graph", - "name": "Graph", - "version": "" - }, { - "type": "grafana", - "id": "grafana", - "name": "Grafana", - "version": "3.1.0" - }, { - "type": "datasource", - "id": "prometheus", - "name": "Prometheus", - "version": "1.0.0" - }], - "id": null, - "title": "Kubernetes Pod Resources", - "description": "Shows resource usage of Kubernetes pods.", - "tags": [ - "kubernetes" - ], - "style": "dark", - "timezone": "browser", - "editable": true, - "hideControls": false, - "sharedCrosshair": false, - "rows": [{ - "collapse": false, - "editable": true, - "height": "250px", - "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_PROMETHEUS}", - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "height": "180px", - "id": 4, - "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": 4, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "targets": [{ - "expr": "sum (container_memory_working_set_bytes{id=\"/\",instance=~\"^$instance$\"}) / sum (machine_memory_bytes{instance=~\"^$instance$\"}) * 100", - "interval": "", - "intervalFactor": 2, - "legendFormat": "", - "refId": "A", - "step": 2 - }], - "thresholds": "65, 90", - "timeFrom": "1m", - "timeShift": null, - "title": "Memory Working Set", - "transparent": false, - "type": "singlestat", - "valueFontSize": "80%", - "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_PROMETHEUS}", - "decimals": 2, - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "height": "180px", - "id": 6, - "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": 4, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "targets": [{ - "expr": "sum(rate(container_cpu_usage_seconds_total{id=\"/\",instance=~\"^$instance$\"}[1m])) / sum (machine_cpu_cores{instance=~\"^$instance$\"}) * 100", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 10 - }], - "thresholds": "65, 90", - "timeFrom": "1m", - "timeShift": null, - "title": "Cpu Usage", - "type": "singlestat", - "valueFontSize": "80%", - "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_PROMETHEUS}", - "decimals": 2, - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "height": "180px", - "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": 4, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "targets": [{ - "expr": "sum(container_fs_usage_bytes{id=\"/\",instance=~\"^$instance$\"}) / sum(container_fs_limit_bytes{id=\"/\",instance=~\"^$instance$\"}) * 100", - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "", - "metric": "", - "refId": "A", - "step": 10 - }], - "thresholds": "65, 90", - "timeFrom": "1m", - "timeShift": null, - "title": "Filesystem Usage", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [{ - "op": "=", - "text": "N/A", - "value": "null" - }], - "valueName": "current" - }, { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "${DS_PROMETHEUS}", - "decimals": 2, - "editable": true, - "error": false, - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "height": "1px", - "hideTimeOverride": 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": "20%", - "prefix": "", - "prefixFontSize": "20%", - "rangeMaps": [{ - "from": "null", - "text": "N/A", - "to": "null" - }], - "span": 2, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "targets": [{ - "expr": "sum(container_memory_working_set_bytes{id=\"/\",instance=~\"^$instance$\"})", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 10 - }], - "thresholds": "", - "timeFrom": "1m", - "title": "Used", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [{ - "op": "=", - "text": "N/A", - "value": "null" - }], - "valueName": "current" - }, { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "${DS_PROMETHEUS}", - "decimals": 2, - "editable": true, - "error": false, - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "height": "1px", - "hideTimeOverride": 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, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "targets": [{ - "expr": "sum (machine_memory_bytes{instance=~\"^$instance$\"})", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 10 - }], - "thresholds": "", - "timeFrom": "1m", - "title": "Total", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [{ - "op": "=", - "text": "N/A", - "value": "null" - }], - "valueName": "current" - }, { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "${DS_PROMETHEUS}", - "decimals": 2, - "editable": true, - "error": false, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "height": "1px", - "hideTimeOverride": 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": " cores", - "postfixFontSize": "30%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [{ - "from": "null", - "text": "N/A", - "to": "null" - }], - "span": 2, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "targets": [{ - "expr": "sum (rate (container_cpu_usage_seconds_total{id=\"/\",instance=~\"^$instance$\"}[1m]))", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 10 - }], - "thresholds": "", - "timeFrom": "1m", - "timeShift": null, - "title": "Used", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [{ - "op": "=", - "text": "N/A", - "value": "null" - }], - "valueName": "current" - }, { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "${DS_PROMETHEUS}", - "decimals": 2, - "editable": true, - "error": false, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "height": "1px", - "hideTimeOverride": true, - "id": 12, - "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": " cores", - "postfixFontSize": "30%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [{ - "from": "null", - "text": "N/A", - "to": "null" - }], - "span": 2, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "targets": [{ - "expr": "sum (machine_cpu_cores{instance=~\"^$instance$\"})", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 10 - }], - "thresholds": "", - "timeFrom": "1m", - "title": "Total", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [{ - "op": "=", - "text": "N/A", - "value": "null" - }], - "valueName": "current" - }, { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "${DS_PROMETHEUS}", - "decimals": 2, - "editable": true, - "error": false, - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "height": "1px", - "hideTimeOverride": true, - "id": 13, - "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, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "targets": [{ - "expr": "sum(container_fs_usage_bytes{id=\"/\",instance=~\"^$instance$\"})", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 10 - }], - "thresholds": "", - "timeFrom": "1m", - "title": "Used", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [{ - "op": "=", - "text": "N/A", - "value": "null" - }], - "valueName": "current" - }, { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "${DS_PROMETHEUS}", - "decimals": 2, - "editable": true, - "error": false, - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "height": "1px", - "hideTimeOverride": true, - "id": 14, - "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, - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "targets": [{ - "expr": "sum (container_fs_limit_bytes{id=\"/\",instance=~\"^$instance$\"})", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 10 - }], - "thresholds": "", - "timeFrom": "1m", - "title": "Total", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [{ - "op": "=", - "text": "N/A", - "value": "null" - }], - "valueName": "current" - }, { - "aliasColors": {}, - "bars": false, - "datasource": "${DS_PROMETHEUS}", - "decimals": 2, - "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)", - "thresholdLine": false - }, - "height": "200px", - "id": 32, - "isNew": true, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": 200, - "sort": "current", - "sortDesc": 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": [{ - "expr": "sum(rate(container_network_receive_bytes_total{instance=~\"^$instance$\",namespace=~\"^$namespace$\"}[1m]))", - "interval": "", - "intervalFactor": 2, - "legendFormat": "receive", - "metric": "network", - "refId": "A", - "step": 240 - }, { - "expr": "- sum(rate(container_network_transmit_bytes_total{instance=~\"^$instance$\",namespace=~\"^$namespace$\"}[1m]))", - "interval": "", - "intervalFactor": 2, - "legendFormat": "transmit", - "metric": "network", - "refId": "B", - "step": 240 - }], - "timeFrom": null, - "timeShift": null, - "title": "Network", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "transparent": false, - "type": "graph", - "xaxis": { - "show": true - }, - "yaxes": [{ - "format": "Bps", - "label": "transmit / receive", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - }] - }], - "showTitle": true, - "title": "all pods" - }, { - "collapse": false, - "editable": true, - "height": "250px", - "panels": [{ - "aliasColors": {}, - "bars": false, - "datasource": "${DS_PROMETHEUS}", - "decimals": 3, - "editable": true, - "error": false, - "fill": 0, - "grid": { - "threshold1": null, - "threshold1Color": "rgba(216, 200, 27, 0.27)", - "threshold2": null, - "threshold2Color": "rgba(234, 112, 112, 0.22)" - }, - "height": "", - "id": 17, - "isNew": true, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": 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": [{ - "expr": "sum(rate(container_cpu_usage_seconds_total{image!=\"\",name=~\"^k8s_.*\",instance=~\"^$instance$\",namespace=~\"^$namespace$\"}[1m])) by (pod_name)", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{ pod_name }}", - "metric": "container_cpu", - "refId": "A", - "step": 240 - }], - "timeFrom": null, - "timeShift": null, - "title": "Cpu Usage", - "tooltip": { - "msResolution": true, - "shared": false, - "sort": 2, - "value_type": "cumulative" - }, - "transparent": false, - "type": "graph", - "xaxis": { - "show": true - }, - "yaxes": [{ - "format": "none", - "label": "cores", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - }] - }, { - "aliasColors": {}, - "bars": false, - "datasource": "${DS_PROMETHEUS}", - "decimals": 2, - "editable": true, - "error": false, - "fill": 0, - "grid": { - "threshold1": null, - "threshold1Color": "rgba(216, 200, 27, 0.27)", - "threshold2": null, - "threshold2Color": "rgba(234, 112, 112, 0.22)" - }, - "id": 33, - "isNew": true, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 12, - "stack": false, - "steppedLine": false, - "targets": [{ - "expr": "sum (container_memory_working_set_bytes{image!=\"\",name=~\"^k8s_.*\",instance=~\"^$instance$\",namespace=~\"^$namespace$\"}) by (pod_name)", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{ pod_name }}", - "metric": "", - "refId": "A", - "step": 240 - }], - "timeFrom": null, - "timeShift": null, - "title": "Memory Working Set", - "tooltip": { - "msResolution": false, - "shared": false, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "show": true - }, - "yaxes": [{ - "format": "bytes", - "label": "used", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - }] - }, { - "aliasColors": {}, - "bars": false, - "datasource": "${DS_PROMETHEUS}", - "decimals": 2, - "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": 16, - "isNew": true, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": 200, - "sort": "avg", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 12, - "stack": false, - "steppedLine": false, - "targets": [{ - "expr": "sum (rate (container_network_receive_bytes_total{image!=\"\",name=~\"^k8s_.*\",instance=~\"^$instance$\",namespace=~\"^$namespace$\"}[1m])) by (pod_name)", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{ pod_name }} < in", - "metric": "network", - "refId": "A", - "step": 240 - }, { - "expr": "- sum (rate (container_network_transmit_bytes_total{image!=\"\",name=~\"^k8s_.*\",instance=~\"^$instance$\",namespace=~\"^$namespace$\"}[1m])) by (pod_name)", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{ pod_name }} > out", - "metric": "network", - "refId": "B", - "step": 240 - }], - "timeFrom": null, - "timeShift": null, - "title": "Network", - "tooltip": { - "msResolution": false, - "shared": false, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "show": true - }, - "yaxes": [{ - "format": "Bps", - "label": "transmit / receive", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - }] - }, { - "aliasColors": {}, - "bars": false, - "datasource": "${DS_PROMETHEUS}", - "decimals": 2, - "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": 34, - "isNew": true, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": 200, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "span": 12, - "stack": false, - "steppedLine": false, - "targets": [{ - "expr": "sum(container_fs_usage_bytes{image!=\"\",name=~\"^k8s_.*\",instance=~\"^$instance$\",namespace=~\"^$namespace$\"}) by (pod_name)", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{ pod_name }}", - "metric": "network", - "refId": "A", - "step": 240 - }], - "timeFrom": null, - "timeShift": null, - "title": "Filesystem", - "tooltip": { - "msResolution": false, - "shared": false, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "show": true - }, - "yaxes": [{ - "format": "bytes", - "label": "used", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - }] - }], - "showTitle": true, - "title": "each pod" - }], - "time": { - "from": "now-3d", - "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": [{ - "allValue": ".*", - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "hide": 0, - "includeAll": true, - "label": "Instance", - "multi": false, - "name": "instance", - "options": [], - "query": "label_values(instance)", - "refresh": 1, - "regex": "", - "type": "query" - }, { - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "hide": 0, - "includeAll": true, - "label": "Namespace", - "multi": true, - "name": "namespace", - "options": [], - "query": "label_values(namespace)", - "refresh": 1, - "regex": "", - "type": "query" - }] - }, - "annotations": { - "list": [] - }, - "refresh": false, - "schemaVersion": 12, - "version": 8, - "links": [], - "gnetId": 737 - } - prometheus-datasource.json: | - { - "name": "prometheus", - "type": "prometheus", - "url": "http://prometheus:9090", - "access": "proxy", - "basicAuth": false - } -kind: ConfigMap -metadata: - creationTimestamp: null - name: grafana-import-dashboards - namespace: monitoring ---- apiVersion: batch/v1 kind: Job metadata: @@ -2262,9 +421,9 @@ spec: pod.beta.kubernetes.io/init-containers: '[ { "name": "wait-for-endpoints", - "image": "sz-pg-oam-docker-hub-001.tendcloud.com/library/giantswarm-tiny-tools", + "image": "sz-pg-oam-docker-hub-001.tendcloud.com/library/centos:7.2.1511 "imagePullPolicy": "IfNotPresent", - "command": ["fish", "-c", "echo \"waiting for endpoints...\"; while true; set endpoints (curl -sX GET -H \"Authorization:bearer `cat /var/run/secrets/kubernetes.io/serviceaccount/token`\" -k https://kubernetes.default/api/v1/namespaces/monitoring/endpoints/grafana); echo $endpoints | jq \".\"; if test (echo $endpoints | jq -r \".subsets[]?.addresses // [] | length\") -gt 0; exit 0; end; echo \"waiting...\";sleep 1; end"], + "command": ["bash", "-c", "echo \"waiting for endpoints...\"; while true; set endpoints (curl -sX GET -H \"Authorization:bearer `cat /var/run/secrets/kubernetes.io/serviceaccount/token`\" -k https://kubernetes.default/api/v1/namespaces/monitoring/endpoints/grafana); echo $endpoints | jq \".\"; if test (echo $endpoints | jq -r \".subsets[]?.addresses // [] | length\") -gt 0; exit 0; end; echo \"waiting...\";sleep 1; end"], "args": ["monitoring", "grafana"] } ]' @@ -2272,7 +431,7 @@ spec: serviceAccountName: prometheus-k8s containers: - name: grafana-import-dashboards - image: sz-pg-oam-docker-hub-001.tendcloud.com/library/giantswarm-tiny-tools + image: sz-pg-oam-docker-hub-001.tendcloud.com/library/centos:7.2.1511 command: ["/bin/sh", "-c"] workingDir: /opt/grafana-import-dashboards args: diff --git a/practice/using-prometheus-to-monitor-kuberentes-cluster.md b/practice/using-prometheus-to-monitor-kuberentes-cluster.md index 6e2216ca2..5fc65be7f 100644 --- a/practice/using-prometheus-to-monitor-kuberentes-cluster.md +++ b/practice/using-prometheus-to-monitor-kuberentes-cluster.md @@ -26,22 +26,58 @@ ## 部署 +我将部署时需要用的的配置文件分成了 namespace、serviceaccount、configmaps、clusterrolebinding 和最后的部署 prometheus、grafana 的过程。 + ```yaml ## 创建 monitoring namespaece kubectl create -f prometheus-monitoring-ns.yaml -## 创建 RBAC -kubectl create -f prometheus-monitoring-rbac.yaml -## 部署 Premetheus +## 创建 serviceaccount +kubectl create -f prometheus-monitoring-serviceaccount.yaml +## 创建 configmaps +kubectl create -f prometheus-configmaps.yaml +## 创建 clusterrolebinding +kubectl create clusterrolebinding kube-state-metrics --clusterrole=cluster-admin --serviceaccount=monitoring:kube-state-metrics +kubectl create clusterrolebinding prometheus --clusterrole=cluster-admin --serviceaccount=monitoring:prometheus +## 部署 Prometheus kubectl create -f prometheus-monitoring.yaml ``` -创建 RBAC 的过程考虑替换成下面的命令: +访问 kubernetes 任何一个 node 上的 Grafana service 的 nodeport: + +![Grafana页面](../images/kubernetes-prometheus-monitoring.jpg) + +该图中的数据显示明显有问题,还需要修正。 + +`prometheus-monitoring.yaml` 文件中有一个 Job 就是用来导入 grafana dashboard 配置信息的,如果该 Job 执行失败,可以单独在在 `monitoring` 的 namespace 中启动一个容器,将 `manifests/prometheus` 目录下的 json 文件复制到容器中,然后进入容器 json 文件的目录下执行: ```bash -kubectl create clusterrolebinding prometheus-monitoring --clusterrole=cluster-admin --serviceaccount=monitoring:default + for file in *-datasource.json ; do + if [ -e "$file" ] ; then + echo "importing $file" && + curl --silent --fail --show-error \ + --request POST http://admin:admin@grafana:3000/api/datasources \ + --header "Content-Type: application/json" \ + --data-binary "@$file" ; + echo "" ; + fi + done ; + for file in *-dashboard.json ; do + if [ -e "$file" ] ; then + echo "importing $file" && + ( echo '{"dashboard":'; \ + cat "$file"; \ + echo ',"overwrite":true,"inputs":[{"name":"DS_PROMETHEUS","type":"datasource","pluginId":"prometheus","value":"prometheus"}]}' ) \ + | jq -c '.' \ + | curl --silent --fail --show-error \ + --request POST http://admin:admin@grafana:3000/api/dashboards/import \ + --header "Content-Type: application/json" \ + --data-binary "@-" ; + echo "" ; + fi + done ``` -注意需要修改 YAML 文件中的 serviceaccount 和 clusterrolebinding 目前还未完成。 +这样也可以向 grafana 中导入 dashboard。 ## 存在的问题 @@ -56,14 +92,15 @@ kubectl create clusterrolebinding prometheus-monitoring --clusterrole=cluster-ad 在部署 Prometheus 之前应该先创建 serviceaccount、clusterrole、clusterrolebinding 等对象,否则在安装过程中可能因为权限问题而导致各种错误,所以这些配置应该写在一个单独的文件中,而不应该跟其他部署写在一起,即使要写在一个文件中,也应该写在文件的最前面,因为使用 `kubectl` 部署的时候,kubectl 不会判断 YAML 文件中的资源依赖关系,只是简单的从头部开始执行部署,因此写在文件前面的对象会先部署。 -也可以绕过复杂的 RBAC 设置,直接使用下面的命令设置为 serviceaccount 设置成 admin 模式。 +**解决方法** + +也可以绕过复杂的 RBAC 设置,直接使用下面的命令将对应的 serviceaccount 设置成 admin 权限,如下: ```bash -kubectl create clusterrolebinding prometheus-monitoring --clusterrole=cluster-admin --serviceaccount=monitoring:default +kubectl create clusterrolebinding kube-state-metrics --clusterrole=cluster-admin --serviceaccount=monitoring:kube-state-metrics +kubectl create clusterrolebinding prometheus --clusterrole=cluster-admin --serviceaccount=monitoring:prometheus ``` -这需要修改原配置中的 serviceaccount,并去掉原来的 clusterrolebinding。 - 参考 [RBAC——基于角色的访问控制](../guide/rbac.md) ### 2. API 兼容问题