From cf7e8c27f228337e840101b1b2601b51ee2480d7 Mon Sep 17 00:00:00 2001 From: dannc Date: Wed, 5 Oct 2022 10:48:00 +0700 Subject: [PATCH] homework 10.3: complete 1 task, add partially complete 2 task --- readme.md | 1 + .../10.3/img/grafana_datasource.png | Bin 0 -> 35960 bytes src/homework/10-monitoring/10.3/readme.md | 62 + .../10.3/stack/docker-compose.yml | 44 + .../10.3/stack/grafana/dashboard_backup.json | 298 +++ ...r Prometheus Monitoring-1571332751387.json | 1831 +++++++++++++++++ .../provisioning/dashboards/dashboard.yml | 12 + .../provisioning/datasources/datasource.yml | 51 + .../10.3/stack/prometheus/prometheus.yml | 13 + 9 files changed, 2312 insertions(+) create mode 100644 src/homework/10-monitoring/10.3/img/grafana_datasource.png create mode 100644 src/homework/10-monitoring/10.3/readme.md create mode 100644 src/homework/10-monitoring/10.3/stack/docker-compose.yml create mode 100644 src/homework/10-monitoring/10.3/stack/grafana/dashboard_backup.json create mode 100644 src/homework/10-monitoring/10.3/stack/grafana/provisioning/dashboards/Docker Prometheus Monitoring-1571332751387.json create mode 100644 src/homework/10-monitoring/10.3/stack/grafana/provisioning/dashboards/dashboard.yml create mode 100644 src/homework/10-monitoring/10.3/stack/grafana/provisioning/datasources/datasource.yml create mode 100644 src/homework/10-monitoring/10.3/stack/prometheus/prometheus.yml diff --git a/readme.md b/readme.md index be8c3ed..3b48293 100644 --- a/readme.md +++ b/readme.md @@ -49,3 +49,4 @@ * [09.6. Gitlab](/src/homework/09-ci/9.6) * [10.1. Зачем и что нужно мониторить](/src/homework/10-monitoring/10.1) * [10.2. Системы мониторинга](/src/homework/10-monitoring/10.2) +* [10.3. Системы Grafana](/src/homework/10-monitoring/10.3) diff --git a/src/homework/10-monitoring/10.3/img/grafana_datasource.png b/src/homework/10-monitoring/10.3/img/grafana_datasource.png new file mode 100644 index 0000000000000000000000000000000000000000..6d941b0bbb3a66676e6723c76f9e62f13d156df3 GIT binary patch literal 35960 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 literal 0 HcmV?d00001 diff --git a/src/homework/10-monitoring/10.3/readme.md b/src/homework/10-monitoring/10.3/readme.md new file mode 100644 index 0000000..f94af95 --- /dev/null +++ b/src/homework/10-monitoring/10.3/readme.md @@ -0,0 +1,62 @@ +Выполнение [домашнего задания](https://github.com/netology-code/mnt-homeworks/blob/MNT-13/10-monitoring-03-grafana/README.md) +по теме "10.3. Системы Grafana" + +## Q/A + +### Задание 1 + +> Cамостоятельно разверните grafana, где в роли источника данных будет выступать prometheus, а сборщиком данных node-exporter: +> +> * `grafana` +> * `prometheus-server` +> * `prometheus node-exporter` +> +> Запустите связку prometheus-grafana. +> Зайдите в веб-интерфейс Grafana, используя авторизационные данные, указанные в манифесте docker-compose. +> Подключите поднятый вами prometheus как источник данных. +> Решение домашнего задания - скриншот веб-интерфейса grafana со списком подключенных Datasource. +> В решении к домашнему заданию приведите также все конфигурации/скрипты/манифесты, которые вы использовали в процессе решения задания. + +`docker-compose` и остальная конфигурация расположена в директории [stack](./stack). +При поднятии контейнеров в `grafana` автоматически создаётся `data-source` к `prometheus`, +а так же dashboard по мониторингу контейнера `prometheus`. + +![grafana_datasource](./img/grafana_datasource.png) + +### Задание 2 + +> Изучите самостоятельно ресурсы: +> - [promql-for-humans](https://timber.io/blog/promql-for-humans/#cpu-usage-by-instance) +> - [understanding prometheus cpu metrics](https://www.robustperception.io/understanding-machine-cpu-usage) +> +> Создайте Dashboard и в ней создайте следующие Panels: +> - Утилизация CPU для nodeexporter (в процентах, 100-idle) +> - CPULA 1/5/15 +> - Количество свободной оперативной памяти +> - Количество места на файловой системе +> +> Для решения данного ДЗ приведите promql запросы для выдачи этих метрик, а также скриншот получившейся Dashboard. + +Метрики и текст запросов для них + +- Утилизация CPU для nodeexporter (в процентах, 100-idle) + +```text +100 * (1 - avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[1m]))) +``` + +- CPULA 1/5/15 + +```text +avg(node_load1{}) +avg(node_load5{}) +avg(node_load15{}) +``` + +- Количество свободной оперативной памяти + +// todo + +- Количество места на файловой системе + +// todo diff --git a/src/homework/10-monitoring/10.3/stack/docker-compose.yml b/src/homework/10-monitoring/10.3/stack/docker-compose.yml new file mode 100644 index 0000000..df212a2 --- /dev/null +++ b/src/homework/10-monitoring/10.3/stack/docker-compose.yml @@ -0,0 +1,44 @@ +--- +version: "3.9" + +services: + node-exporter: + image: prom/node-exporter:v1.4.0 + container_name: node-exporter + volumes: + - /proc:/host/proc:ro + - /sys:/host/sys:ro + - /:/rootfs:ro + command: + - "--path.procfs=/host/proc" + - "--path.rootfs=/rootfs" + - "--path.sysfs=/host/sys" + - "--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)" + expose: + - 9100 + + prometheus: + image: prom/prometheus:v2.37.1 + container_name: prometheus + volumes: + - ./prometheus/:/etc/prometheus/ + command: + - "--config.file=/etc/prometheus/prometheus.yml" + - "--storage.tsdb.path=/prometheus" + - "--web.console.libraries=/etc/prometheus/console_libraries" + - "--web.console.templates=/etc/prometheus/consoles" + - "--web.enable-lifecycle" + expose: + - 9090 + depends_on: + node-exporter: + condition: service_completed_successfully + + grafana: + image: grafana/grafana:9.1.7 + expose: + - 3000 + ports: + - "3000:3000" + volumes: + - ./grafana/provisioning/:/etc/grafana/provisioning/ diff --git a/src/homework/10-monitoring/10.3/stack/grafana/dashboard_backup.json b/src/homework/10-monitoring/10.3/stack/grafana/dashboard_backup.json new file mode 100644 index 0000000..407e8d3 --- /dev/null +++ b/src/homework/10-monitoring/10.3/stack/grafana/dashboard_backup.json @@ -0,0 +1,298 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 2, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "semi-dark-yellow", + "value": 1 + }, + { + "color": "semi-dark-orange", + "value": 4 + }, + { + "color": "semi-dark-red", + "value": 11 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "avg(node_load1{})" + }, + "properties": [ + { + "id": "displayName", + "value": "loadavg1" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "avg(node_load5{})" + }, + "properties": [ + { + "id": "displayName", + "value": "loadavg5" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "avg(node_load15{})" + }, + "properties": [ + { + "id": "displayName", + "value": "loadavg15" + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 13, + "x": 0, + "y": 0 + }, + "id": 4, + "options": { + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": true, + "showThresholdMarkers": true + }, + "pluginVersion": "9.1.7", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "expr": "avg(node_load1{})", + "legendFormat": "__auto", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "expr": "avg(node_load5{})", + "hide": false, + "legendFormat": "__auto", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "expr": "avg(node_load15{})", + "hide": false, + "legendFormat": "__auto", + "range": true, + "refId": "C" + } + ], + "title": "CPU Load Average", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 71, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "dashed" + } + }, + "displayName": "средняя нагрузка", + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 0.8 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "средняя нагрузка" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 13, + "x": 0, + "y": 6 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "expr": "100 * (1 - avg by(instance)(irate(node_cpu_seconds_total{mode=\"idle\"}[1m])))", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Нагрузка на node", + "type": "timeseries" + } + ], + "refresh": false, + "schemaVersion": 37, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "node-exporter", + "uid": "NwsNrL44z", + "version": 1, + "weekStart": "" +} diff --git a/src/homework/10-monitoring/10.3/stack/grafana/provisioning/dashboards/Docker Prometheus Monitoring-1571332751387.json b/src/homework/10-monitoring/10.3/stack/grafana/provisioning/dashboards/Docker Prometheus Monitoring-1571332751387.json new file mode 100644 index 0000000..57715cc --- /dev/null +++ b/src/homework/10-monitoring/10.3/stack/grafana/provisioning/dashboards/Docker Prometheus Monitoring-1571332751387.json @@ -0,0 +1,1831 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "Docker Monitoring Template", + "editable": true, + "gnetId": 179, + "graphTooltip": 1, + "id": 1, + "iteration": 1571330223815, + "links": [], + "panels": [ + { + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 17, + "panels": [], + "title": "Host Info", + "type": "row" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "Prometheus", + "decimals": null, + "format": "s", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 7, + "w": 3, + "x": 0, + "y": 1 + }, + "id": 15, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "options": {}, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "time() - process_start_time_seconds{job=\"prometheus\"}", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "thresholds": "", + "title": "Uptime", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "Prometheus", + "format": "short", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 3, + "y": 1 + }, + "id": 35, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "options": {}, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false, + "ymax": null, + "ymin": null + }, + "tableColumn": "", + "targets": [ + { + "expr": "count(count(node_cpu_seconds_total{instance=~\"$node\", mode='system'}) by (cpu))", + "instant": true, + "refId": "A" + } + ], + "thresholds": "", + "timeFrom": null, + "timeShift": null, + "title": "CPU Cores", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": true, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "Prometheus", + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 7, + "w": 5, + "x": 6, + "y": 1 + }, + "id": 13, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "options": {}, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(ALERTS)", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "thresholds": "0,1", + "title": "Alerts", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "0" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": true, + "colorValue": false, + "colors": [ + "#d44a3a", + "rgba(237, 129, 40, 0.89)", + "#299c46" + ], + "datasource": "Prometheus", + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 7, + "w": 4, + "x": 11, + "y": 1 + }, + "id": 11, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "options": {}, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(up)", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "thresholds": "0,1", + "title": "Targets Online", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "#d44a3a", + "rgba(237, 129, 40, 0.89)", + "#299c46" + ], + "datasource": "Prometheus", + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 7, + "w": 4, + "x": 15, + "y": 1 + }, + "id": 31, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "options": {}, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": true + }, + "tableColumn": "", + "targets": [ + { + "expr": "count(rate(container_last_seen{job=\"cadvisor\", name!=\"\"}[5m]))", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "thresholds": "0,1", + "title": "Running Containers", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": null, + "decimals": null, + "format": "decbytes", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 3, + "x": 3, + "y": 5 + }, + "id": 37, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "options": {}, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false, + "ymax": null, + "ymin": null + }, + "tableColumn": "", + "targets": [ + { + "expr": "node_memory_MemTotal_bytes{instance=~\"$node\"}", + "refId": "A" + } + ], + "thresholds": "", + "timeFrom": null, + "timeShift": null, + "title": "Host Memory", + "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": "Prometheus", + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 0, + "y": 8 + }, + "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, + "options": {}, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "(sum(node_memory_MemTotal_bytes) - sum(node_memory_MemFree_bytes +node_memory_Buffers_bytes + node_memory_Cached_bytes) ) / sum(node_memory_MemTotal_bytes) * 100", + "format": "time_series", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 10 + } + ], + "thresholds": "65, 90", + "title": "Memory 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": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 6, + "y": 8 + }, + "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, + "options": {}, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "100 - (avg(irate(node_cpu_seconds_total{instance=~\"$node\",mode=\"idle\"}[5m])) * 100)", + "format": "time_series", + "interval": "1m", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 10 + } + ], + "thresholds": "65, 90", + "title": "CPU 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": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 6, + "w": 7, + "x": 12, + "y": 8 + }, + "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, + "options": {}, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "avg( node_filesystem_avail_bytes {mountpoint=\"/\"} / node_filesystem_size_bytes{mountpoint=\"/\"})", + "interval": "10s", + "intervalFactor": 1, + "metric": "", + "refId": "A", + "step": 10 + } + ], + "thresholds": "65, 90", + "title": "Filesystem usage", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "aliasColors": { + "RECEIVE": "#ea6460", + "SENT": "#1f78c1", + "TRANSMIT": "#1f78c1" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 4, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 6, + "x": 0, + "y": 14 + }, + "id": 25, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(container_network_receive_bytes_total{id=\"/\"}[$interval])) by (id)", + "format": "time_series", + "interval": "2m", + "intervalFactor": 2, + "legendFormat": "RECEIVE", + "refId": "A" + }, + { + "expr": "- sum(rate(container_network_transmit_bytes_total{id=\"/\"}[$interval])) by (id)", + "format": "time_series", + "interval": "2m", + "intervalFactor": 2, + "legendFormat": "TRANSMIT", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Node Network Traffic", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Available Memory": "#508642", + "Used Memory": "#bf1b00" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 3, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 6, + "x": 6, + "y": 14 + }, + "id": 27, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_memory_MemTotal_bytes) - sum(node_memory_MemAvailable_bytes)", + "format": "time_series", + "interval": "2m", + "intervalFactor": 2, + "legendFormat": "Used Memory", + "refId": "B" + }, + { + "expr": "sum(node_memory_MemAvailable_bytes)", + "format": "time_series", + "interval": "2m", + "intervalFactor": 2, + "legendFormat": "Available Memory", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Node Mermory", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Available Memory": "#508642", + "Free Storage": "#447ebc", + "Total Storage Available": "#508642", + "Used Memory": "#bf1b00", + "Used Storage": "#bf1b00" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fill": 3, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 7, + "x": 12, + "y": 14 + }, + "id": 28, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_free_bytes {job=\"node-exporter\", instance=~\".*9100\", device=~\"/dev/.*\", mountpoint!=\"/var/lib/docker/aufs\"}) ", + "format": "time_series", + "interval": "2m", + "intervalFactor": 2, + "legendFormat": "Free Storage", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Filesystem Available", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 19, + "panels": [], + "repeat": null, + "title": "Container Performance", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 3, + "editable": true, + "error": false, + "fill": 0, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 10, + "w": 6, + "x": 0, + "y": 24 + }, + "id": 3, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(container_cpu_usage_seconds_total{image!=\"\"}[1m])) by (id,name)", + "format": "time_series", + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "{{ name }}", + "metric": "container_cpu_user_seconds_total", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Container CPU usage", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percentunit", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "fill": 0, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 10, + "w": 6, + "x": 6, + "y": 24 + }, + "id": 2, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "container_memory_max_usage_bytes{image!=\"\"}", + "format": "time_series", + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "{{ name }}", + "metric": "container_memory_usage:sort_desc", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Container Memory Usage", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "columns": [], + "datasource": "Prometheus", + "fontSize": "100%", + "gridPos": { + "h": 13, + "w": 10, + "x": 12, + "y": 24 + }, + "id": 23, + "links": [], + "options": {}, + "pageSize": null, + "scroll": true, + "showHeader": true, + "sort": { + "col": 0, + "desc": true + }, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "date" + }, + { + "alias": "", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "number", + "unit": "short" + } + ], + "targets": [ + { + "expr": "ALERTS", + "format": "table", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Alerts", + "transform": "table", + "type": "table" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "fill": 0, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 14, + "w": 6, + "x": 0, + "y": 34 + }, + "id": 8, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sort_desc(sum by (name) (rate(container_network_receive_bytes_total{image!=\"\"}[1m] ) ))", + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "{{ name }}", + "metric": "container_network_receive_bytes_total", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Container Network Input", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "fill": 0, + "fillGradient": 0, + "grid": {}, + "gridPos": { + "h": 14, + "w": 6, + "x": 6, + "y": 34 + }, + "id": 9, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sort_desc(sum by (name) (rate(container_network_transmit_bytes_total{image!=\"\"}[1m] ) ))", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{ name }}", + "metric": "container_network_transmit_bytes_total", + "refId": "B", + "step": 4 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Container Network Output", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "columns": [], + "datasource": "Prometheus", + "fontSize": "100%", + "gridPos": { + "h": 10, + "w": 10, + "x": 12, + "y": 37 + }, + "id": 30, + "links": [], + "options": {}, + "pageSize": 10, + "scroll": true, + "showHeader": true, + "sort": { + "col": 0, + "desc": true + }, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "link": false, + "linkUrl": "", + "pattern": "Time", + "type": "date" + }, + { + "alias": "", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "number", + "unit": "short" + } + ], + "targets": [ + { + "expr": "cadvisor_version_info", + "format": "table", + "instant": false, + "interval": "15m", + "intervalFactor": 2, + "legendFormat": "cAdvisor Version: {{cadvisorVersion}}", + "refId": "A" + }, + { + "expr": "prometheus_build_info", + "format": "table", + "interval": "15m", + "intervalFactor": 2, + "legendFormat": "Prometheus Version: {{version}}", + "refId": "B" + }, + { + "expr": "node_exporter_build_info", + "format": "table", + "interval": "15m", + "intervalFactor": 2, + "legendFormat": "Node-Exporter Version: {{version}}", + "refId": "C" + } + ], + "title": "Running Versions", + "transform": "table", + "type": "table" + } + ], + "refresh": "10s", + "schemaVersion": 20, + "style": "dark", + "tags": [ + "docker", + "prometheus, ", + "node-exporter", + "cadvisor" + ], + "templating": { + "list": [ + { + "auto": false, + "auto_count": 30, + "auto_min": "10s", + "current": { + "text": "1m", + "value": "1m" + }, + "hide": 0, + "label": "interval", + "name": "interval", + "options": [ + { + "selected": true, + "text": "1m", + "value": "1m" + }, + { + "selected": false, + "text": "10m", + "value": "10m" + }, + { + "selected": false, + "text": "30m", + "value": "30m" + }, + { + "selected": false, + "text": "1h", + "value": "1h" + }, + { + "selected": false, + "text": "6h", + "value": "6h" + }, + { + "selected": false, + "text": "12h", + "value": "12h" + }, + { + "selected": false, + "text": "1d", + "value": "1d" + }, + { + "selected": false, + "text": "7d", + "value": "7d" + }, + { + "selected": false, + "text": "14d", + "value": "14d" + }, + { + "selected": false, + "text": "30d", + "value": "30d" + } + ], + "query": "1m,10m,30m,1h,6h,12h,1d,7d,14d,30d", + "refresh": 2, + "skipUrlSync": false, + "type": "interval" + }, + { + "allValue": null, + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": "Prometheus", + "definition": "label_values(node_exporter_build_info{name=~'$name'},instance)", + "hide": 0, + "includeAll": true, + "label": "IP", + "multi": true, + "name": "node", + "options": [], + "query": "label_values(node_exporter_build_info{name=~'$name'},instance)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": "Prometheus", + "definition": "label_values(node_exporter_build_info,env)", + "hide": 0, + "includeAll": true, + "label": "Env", + "multi": true, + "name": "env", + "options": [], + "query": "label_values(node_exporter_build_info,env)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": "Prometheus", + "definition": "label_values(node_exporter_build_info{env=~'$env'},name)", + "hide": 0, + "includeAll": true, + "label": "CPU Name", + "multi": true, + "name": "name", + "options": [], + "query": "label_values(node_exporter_build_info{env=~'$env'},name)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-5m", + "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" + ] + }, + "timezone": "browser", + "title": "Docker Prometheus Monitoring", + "uid": "64nrElFmk", + "version": 2 +} diff --git a/src/homework/10-monitoring/10.3/stack/grafana/provisioning/dashboards/dashboard.yml b/src/homework/10-monitoring/10.3/stack/grafana/provisioning/dashboards/dashboard.yml new file mode 100644 index 0000000..e1f37c7 --- /dev/null +++ b/src/homework/10-monitoring/10.3/stack/grafana/provisioning/dashboards/dashboard.yml @@ -0,0 +1,12 @@ +--- +apiVersion: 1 + +providers: + - name: 'Prometheus' + orgId: 1 + folder: '' + type: file + disableDeletion: false + editable: true + options: + path: /etc/grafana/provisioning/dashboards diff --git a/src/homework/10-monitoring/10.3/stack/grafana/provisioning/datasources/datasource.yml b/src/homework/10-monitoring/10.3/stack/grafana/provisioning/datasources/datasource.yml new file mode 100644 index 0000000..e198148 --- /dev/null +++ b/src/homework/10-monitoring/10.3/stack/grafana/provisioning/datasources/datasource.yml @@ -0,0 +1,51 @@ +--- +# config file version +apiVersion: 1 + +# list of datasources that should be deleted from the database +deleteDatasources: + - name: Prometheus + orgId: 1 + +# list of datasources to insert/update depending +# whats available in the database +datasources: + # name of the datasource. Required + - name: Prometheus + # datasource type. Required + type: prometheus + # access mode. direct or proxy. Required + access: proxy + # org id. will default to orgId 1 if not specified + orgId: 1 + # url + url: http://prometheus:9090 + # database password, if used + password: + # database user, if used + user: + # database name, if used + database: + # enable/disable basic auth + basicAuth: false + # basic auth username, if used + basicAuthUser: + # basic auth password, if used + basicAuthPassword: + # enable/disable with credentials headers + withCredentials: + # mark as default datasource. Max one per org + isDefault: true + # fields that will be converted to json and stored in json_data + jsonData: + graphiteVersion: "1.1" + tlsAuth: false + tlsAuthWithCACert: false + # json object of data that will be encrypted. + secureJsonData: + tlsCACert: "..." + tlsClientCert: "..." + tlsClientKey: "..." + version: 1 + # allow users to edit datasources from the UI. + editable: true diff --git a/src/homework/10-monitoring/10.3/stack/prometheus/prometheus.yml b/src/homework/10-monitoring/10.3/stack/prometheus/prometheus.yml new file mode 100644 index 0000000..9920bf7 --- /dev/null +++ b/src/homework/10-monitoring/10.3/stack/prometheus/prometheus.yml @@ -0,0 +1,13 @@ +--- +global: + scrape_interval: 15s + +scrape_configs: + - job_name: "prometheus" + scrape_interval: 30s + static_configs: + - targets: ["localhost:9090"] + + - job_name: "node" + static_configs: + - targets: ["node-exporter:9100"]