This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
prometheus_grafana_loki_-_observability [2026/05/12 16:00] val |
prometheus_grafana_loki_-_observability [2026/05/27 09:24] (current) val [Модуль 2. Сбор и анализ метрик с Prometheus] |
||
|---|---|---|---|
| Line 13: | Line 13: | ||
| * Настроить учет работы систем, сервисов и сетей предприятия с точки зрения: метрик (Service Level Indicator - SLI), целей команды предприятия (Service Level Objective - SLO) и гарантий для клиентов (Service Level Agreement - SLA) | * Настроить учет работы систем, сервисов и сетей предприятия с точки зрения: метрик (Service Level Indicator - SLI), целей команды предприятия (Service Level Objective - SLO) и гарантий для клиентов (Service Level Agreement - SLA) | ||
| + | |||
| + | ===== После окончания обучения слушатель будет знать ===== | ||
| + | |||
| + | * Фундаментальные понятия мониторинга | ||
| + | * Показатели качества (SLI/SLO/SLA) | ||
| + | * Технические термины мониторинга | ||
| + | * Основные этапы мониторинга | ||
| + | |||
| + | ===== После окончания обучения слушатель будет уметь ===== | ||
| + | |||
| + | * Разворачивать стек продуктов Prometheus, Grafana, Loki | ||
| + | * Настраивать сбор метрик в Prometheus с использование exporter | ||
| + | * Автоматизировать поиск и добавлять собственные источники метрик | ||
| + | * Использровать язык запросов PromQL для анализа и визуализации измерений | ||
| + | * Настраивать сбор, фильтрацию и анализ журналов с использованием Loki и языка LogQL | ||
| + | * Использовать готовые и создавать собственные dashboard в Grafana | ||
| + | * Настраивать уведомления в Prometheus Alertmanager с использованием готовых и собственных правил | ||
| + | * Настраивать маршрутизацию уведомлений с использованием Email и Webhook | ||
| + | * Настраивать уведомления в Grafana | ||
| ===== Модуль 1. Основы наблюдаемости и архитектура стека ===== | ===== Модуль 1. Основы наблюдаемости и архитектура стека ===== | ||
| Line 26: | Line 45: | ||
| ==== Практика ==== | ==== Практика ==== | ||
| - | * Установка [[Сервис Prometheus]] и [[Сервис Grafana]] | + | * Развертывание стенда предприятия |
| ===== Модуль 2. Сбор и анализ метрик с Prometheus ===== | ===== Модуль 2. Сбор и анализ метрик с Prometheus ===== | ||
| - | * Настройка экспортера ([[Сервис Prometheus#prometheus-node-exporter]] для метрик ОС), принцип pull-модели, Service Discovery | + | * Установка [[Сервис Prometheus]] |
| + | * Использование экспортеров, принцип pull-модели | ||
| + | * Пример [[Сервис Prometheus#prometheus-node-exporter]] для сбора метрик ОС, оценка загрузки CPU, RAM, сети, задержки ввода/вывода | ||
| * Язык [[Сервис Prometheus#Запросы PromQL]]: Изучение типов данных (счетчики, измеряемые величины, гистограммы), операторов и агрегаций | * Язык [[Сервис Prometheus#Запросы PromQL]]: Изучение типов данных (счетчики, измеряемые величины, гистограммы), операторов и агрегаций | ||
| - | * Оценка загрузки CPU, RAM, сети, задержки ввода/вывода | + | * Пример [[Сервис Prometheus#prometheus-apache-exporter]] для сбора метрик "штатного" приложения, [[Сервис HTTP#Нагрузочное тестирование]] |
| - | * Настройка экспортера ([[Сервис Prometheus#prometheus-pushgateway]] и [[Сервис Prometheus#Пример сбора метрик из приложения]] | + | * Service Discovery |
| + | * Использование push-модели [[Сервис Prometheus#prometheus-pushgateway]] и [[Сервис Prometheus#Отправка метрик из приложения]] | ||
| + | * prometheus federation | ||
| ===== Модуль 3. Централизация логов с Loki ===== | ===== Модуль 3. Централизация логов с Loki ===== | ||
| - | * Установка Grafana Loki | + | * Установка Loki |
| * Установка и настройка Promtail для доставки логов приложений и системных журналов | * Установка и настройка Promtail для доставки логов приложений и системных журналов | ||
| * Язык LogQL, фильтрация и анализ логов (поиск ошибок, парсинг JSON, агрегация статистики по логам) | * Язык LogQL, фильтрация и анализ логов (поиск ошибок, парсинг JSON, агрегация статистики по логам) | ||
| Line 43: | Line 67: | ||
| ===== Модуль 4. Визуализация данных и дашборды в Grafana ===== | ===== Модуль 4. Визуализация данных и дашборды в Grafana ===== | ||
| + | * Установка [[Сервис Grafana]] | ||
| * [[Сервис Grafana#Подключение Prometheus]] и Loki к Grafana. | * [[Сервис Grafana#Подключение Prometheus]] и Loki к Grafana. | ||
| - | * Создание [[Сервис Grafana#Grafana dashboard]], типы панелей (Time series, Table, Stat, Logs), настройка внешнего вида и переменных, интерактивные дашборды | + | * [[Сервис Grafana#Импорт готовых dashboard]] в Grafana |
| - | * Пример дашборда "Мониторинг сервера" с метриками (CPU/RAM) и виджетом последних ошибок из логов | + | * [[Сервис Grafana#Создание dashboard]] "Мониторинг сервиса" с метриками приложения, статусами сервисов от которых оно зависит и виджетами последних ошибок из логов |
| + | * Типы панелей (Time series, Table, Stat, Logs), настройка внешнего вида и переменных, интерактивные дашборды | ||
| ===== Модуль 5. Алертинг и обнаружение проблем ===== | ===== Модуль 5. Алертинг и обнаружение проблем ===== | ||
| - | * Prometheus + Alertmanager, создание правил алертинга (например, "сервер не отвечает", "много 500-х ошибок") | + | * Установка [[Сервис Prometheus#prometheus-alertmanager]] |
| - | * Настройка маршрутизации уведомлений (Email, Telegram) | + | * [[Сервис Prometheus#Настройка маршрутизации уведомлений]] (Email, Webhook) и [[Сервис Prometheus#Тестирование alertmanager]] |
| + | * [[Сервис Prometheus#Подключение готовых правил alertmanager]] | ||
| + | * [[Сервис Prometheus#Подключение Alertmanager к Prometheus]] | ||
| + | * [[Сервис Prometheus#Создание правил alertmanager]] | ||
| * Управление инцидентами, настройка silence (подавление алертов), агрегация нотификаций | * Управление инцидентами, настройка silence (подавление алертов), агрегация нотификаций | ||
| - | * Grafana Alerting, настройка алертов непосредственно в интерфейсе Grafana | + | * [[Сервис Grafana#Настройка уведомлений]] непосредственно в интерфейсе Grafana (вместе с оценкой пороговых значений, на примере [[Сервис Prometheus#Отправка метрик из приложения]]) |
| ===== Идеи для курса ===== | ===== Идеи для курса ===== | ||
| Line 59: | Line 88: | ||
| ===== Черновик ===== | ===== Черновик ===== | ||
| - | <code> | ||
| - | root@server:~# cat /usr/local/bin/roundcube_monitor.sh | ||
| - | </code><code> | ||
| - | #!/usr/bin/env bash | ||
| - | set -euo pipefail | ||
| - | |||
| - | ROUND_URL="${1:-http://server.corp13.un/mail/}" | ||
| - | LOGIN="${2:-student}" | ||
| - | PASSWORD="${3:-password}" | ||
| - | |||
| - | TMP_DIR="$(mktemp -d)" | ||
| - | COOKIE_JAR="$TMP_DIR/cookies.txt" | ||
| - | LOGIN_PAGE="$TMP_DIR/login.html" | ||
| - | RESPONSE_PAGE="$TMP_DIR/response.html" | ||
| - | LOGOUT_PAGE="$TMP_DIR/logout.html" | ||
| - | |||
| - | cleanup() { | ||
| - | rm -rf "$TMP_DIR" | ||
| - | } | ||
| - | trap cleanup EXIT | ||
| - | |||
| - | extract_token() { | ||
| - | local file="$1" | ||
| - | grep -oP 'name="_token"\s+value="\K[^"]+' "$file" | head -n1 || true | ||
| - | } | ||
| - | |||
| - | echo "1) Открываю форму входа: $ROUND_URL" | ||
| - | curl -ksSL \ | ||
| - | -c "$COOKIE_JAR" \ | ||
| - | -b "$COOKIE_JAR" \ | ||
| - | "$ROUND_URL" \ | ||
| - | -o "$LOGIN_PAGE" | ||
| - | |||
| - | TOKEN="$(extract_token "$LOGIN_PAGE")" | ||
| - | |||
| - | if [[ -z "$TOKEN" ]]; then | ||
| - | echo "CRITICAL: не найден _token на странице логина" | ||
| - | exit 2 | ||
| - | fi | ||
| - | |||
| - | echo "2) Найден CSRF token" | ||
| - | |||
| - | echo "3) Отправляю форму логина" | ||
| - | curl -ksSL \ | ||
| - | -c "$COOKIE_JAR" \ | ||
| - | -b "$COOKIE_JAR" \ | ||
| - | -e "$ROUND_URL" \ | ||
| - | -A "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124 Safari/537.36" \ | ||
| - | -H "Content-Type: application/x-www-form-urlencoded" \ | ||
| - | --data-urlencode "_token=$TOKEN" \ | ||
| - | --data-urlencode "_task=login" \ | ||
| - | --data-urlencode "_action=login" \ | ||
| - | --data-urlencode "_timezone=Europe/Moscow" \ | ||
| - | --data-urlencode "_url=" \ | ||
| - | --data-urlencode "_user=$LOGIN" \ | ||
| - | --data-urlencode "_pass=$PASSWORD" \ | ||
| - | "$ROUND_URL?_task=login" \ | ||
| - | -o "$RESPONSE_PAGE" | ||
| - | |||
| - | if grep -qiE 'Invalid request|Invalid security token|request token' "$RESPONSE_PAGE"; then | ||
| - | echo "CRITICAL: ошибка CSRF/token при логине" | ||
| - | exit 2 | ||
| - | fi | ||
| - | |||
| - | if grep -qiE 'login failed|authentication failed|invalid password|failed to login' "$RESPONSE_PAGE"; then | ||
| - | echo "CRITICAL: логин не выполнен" | ||
| - | exit 2 | ||
| - | fi | ||
| - | |||
| - | if grep -qi '_task=mail' "$RESPONSE_PAGE" || grep -qi 'logout' "$RESPONSE_PAGE"; then | ||
| - | echo "OK: вход в Roundcube выполнен" | ||
| - | else | ||
| - | echo "WARNING: результат логина неоднозначен" | ||
| - | exit 1 | ||
| - | fi | ||
| - | |||
| - | echo "4) Выполняю logout" | ||
| - | |||
| - | POST_LOGIN_TOKEN="$(extract_token "$RESPONSE_PAGE")" | ||
| - | if [[ -z "$POST_LOGIN_TOKEN" ]]; then | ||
| - | POST_LOGIN_TOKEN="$TOKEN" | ||
| - | fi | ||
| - | |||
| - | curl -ksSL \ | ||
| - | -c "$COOKIE_JAR" \ | ||
| - | -b "$COOKIE_JAR" \ | ||
| - | -e "$ROUND_URL?_task=mail" \ | ||
| - | "$ROUND_URL?_task=logout&_token=$POST_LOGIN_TOKEN" \ | ||
| - | -o "$LOGOUT_PAGE" | ||
| - | |||
| - | if grep -qiE 'request check failed|invalid security token' "$LOGOUT_PAGE"; then | ||
| - | echo "CRITICAL: logout не выполнен, ошибка token" | ||
| - | exit 2 | ||
| - | fi | ||
| - | |||
| - | if grep -qiE 'login' "$LOGOUT_PAGE" || grep -qi 'logged out' "$LOGOUT_PAGE" || grep -qi '_task=login' "$LOGOUT_PAGE"; then | ||
| - | echo "OK: logout выполнен" | ||
| - | exit 0 | ||
| - | fi | ||
| - | |||
| - | echo "WARNING: logout отправлен, но результат неоднозначен" | ||
| - | exit 1 | ||
| - | </code> | ||
| - | |||
| - | <code> | ||
| - | root@server:~# cat /usr/local/bin/mywall.sh | ||
| - | </code><code> | ||
| - | #!/bin/sh | ||
| - | for MY_T in $(w | grep pts | awk '{print $2}') | ||
| - | do | ||
| - | echo "$1" | jq > /dev/$MY_T | ||
| - | done | ||
| - | </code> | ||