Что такое Prometheus и Grafana? Зачем они нужны?go-78

Что такое Prometheus?

Prometheus — это open-source система мониторинга и алертинга с временными рядами данных. Разработана в SoundCloud, сейчас входит в CNCF (Cloud Native Computing Foundation).

Ключевые особенности:

  • Мультимерная модель данных с временными метками
  • Собственный эффективный язык запросов PromQL
  • Pull-модель сбора метрик (с возможностью push через gateway)
  • Автономность (не требует распределённого хранилища)
  • Встроенная поддержка service discovery

Что такое Grafana?

Grafana — это платформа для визуализации и анализа метрик с открытым исходным кодом. Позволяет создавать интерактивные дашборды для данных из различных источников, включая Prometheus.

Основные возможности Grafana:

  • Поддержка множества бэкендов (Prometheus, Graphite, InfluxDB и др.)
  • Гибкие и настраиваемые панели визуализации
  • Система алертинга
  • Поддержка аннотаций
  • Организация dashboards в папки и теги

Как работают вместе?

Типичный стек мониторинга:

  1. Prometheus собирает и хранит метрики
  2. Grafana визуализирует данные из Prometheus
  3. Alertmanager (часть Prometheus) обрабатывает алерты

Зачем они нужны?

Для разработчиков и DevOps:

  1. Мониторинг производительности

    • Загрузка CPU/памяти
    • Latency сервисов
    • Rate ошибок
  2. Выявление аномалий

    • Необычные скачки метрик
    • Паттерны деградации производительности
  3. Анализ трендов

    • Как меняется нагрузка со временем
    • Эффективность оптимизаций
  4. Автоматические алерты

    • Уведомления о проблемах до сбоев

Примеры использования в Go-приложениях

  1. Интеграция Prometheus клиента:
import (
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

func main() {
    // Регистрируем метрики
    requestsTotal := prometheus.NewCounter(prometheus.CounterOpts{
        Name: "http_requests_total",
        Help: "Total number of HTTP requests",
    })
    prometheus.MustRegister(requestsTotal)

    // Экспортер метрик
    http.Handle("/metrics", promhttp.Handler())
    go http.ListenAndServe(":2112", nil)
}
  1. Пример PromQL запроса:
rate(http_requests_total{status="500"}[5m]) / rate(http_requests_total[5m])
  1. Конфигурация Prometheus (prometheus.yml):
scrape_configs:
  - job_name: 'my_go_service'
    scrape_interval: 15s
    static_configs:
      - targets: ['localhost:2112']

Ключевые преимущества

Prometheus:

  • Простота развертывания
  • Мощный язык запросов (PromQL)
  • Нативная поддержка Kubernetes
  • Эффективное хранение временных рядов

Grafana:

  • Богатые возможности визуализации
  • Поддержка множества источников данных
  • Гибкие dashboards
  • Широкие возможности для кастомизации

Практические примеры метрик для Go

  1. Runtime метрики:
goCollector := prometheus.NewGoCollector()
prometheus.MustRegister(goCollector)
  1. Бизнес-метрики:
ordersProcessed := prometheus.NewCounterVec(
    prometheus.CounterOpts{
        Name: "orders_processed_total",
        Help: "Total number of processed orders",
    },
    []string{"status", "payment_method"},
)
  1. Гистограммы для latency:
httpDurations := prometheus.NewHistogramVec(
    prometheus.HistogramOpts{
        Name:    "http_request_duration_seconds",
        Help:    "HTTP request duration distribution",
        Buckets: prometheus.DefBuckets,
    },
    []string{"path", "method"},
)

Развертывание и масштабирование

Для production-сред обычно используют:

  1. Prometheus в HA-режиме с Thanos или Cortex
  2. Grafana с внешней базой dashboards (PostgreSQL/MySQL)
  3. Alertmanager для дедупликации и маршрутизации алертов

Резюмируем

Prometheus и Grafana образуют мощный тандем для мониторинга Go-приложений. Prometheus отвечает за сбор и хранение метрик, Grafana — за их визуализацию. Вместе они позволяют:

  • В реальном времени отслеживать состояние системы
  • Оперативно выявлять проблемы
  • Анализировать исторические данные
  • Настраивать превентивные алерты