Gymterview
middle

Что такое Grafana и как визуализировать метрики?

Grafana — open-source платформа для визуализации, мониторинга и анализа данных из множества источников. Grafana не хранит данные — только визуализирует их из подключённых data sources.

Аналогия из жизни: Grafana — это телевизор с множеством входов (HDMI, USB, антенна). Он не создаёт контент, но показывает видео из любого подключённого источника в удобном формате.

Ключевые компоненты

Компонент Описание
Data Sources Подключения к хранилищам: Prometheus (PromQL), Loki (LogQL), Tempo, Elasticsearch, PostgreSQL
Dashboards Набор панелей для визуализации данных
Panels Отдельные визуализации: Time series, Stat, Gauge, Table, Heatmap, Logs, Traces
Настройка data sources (provisioning)
# grafana/provisioning/datasources/datasources.yml
apiVersion: 1
datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
    jsonData:
      exemplarTraceIdDestinations:
        - name: traceID
          datasourceUid: tempo

  - name: Loki
    type: loki
    access: proxy
    url: http://loki:3100
    jsonData:
      derivedFields:
        - name: TraceID
          matcherRegex: "traceId=(\\w+)"
          url: "$${__value.raw}"
          datasourceUid: tempo

  - name: Tempo
    type: tempo
    access: proxy
    url: http://tempo:3200
    jsonData:
      tracesToLogsV2:
        datasourceUid: loki
        filterByTraceID: true
      tracesToMetrics:
        datasourceUid: prometheus

Стандартные дашборды для Spring Boot

ID Название Что показывает
4701 JVM (Micrometer) Heap, non-heap, GC, threads, classloading
11378 Spring Boot Statistics HTTP requests, response times, error rates
6756 HikariCP Connections (active, idle, pending), timeouts
7362 Kafka Consumer Lag, records consumed, fetch latency

Пример PromQL-запросов для дашборда

Пример
# HTTP Requests Rate (по статусу)
sum by (status) (rate(http_server_requests_seconds_count{application="$application"}[5m]))

# HTTP Response Time (p99, p95, p50)
histogram_quantile(0.99, sum(rate(http_server_requests_seconds_bucket{application="$application"}[5m])) by (le))

# JVM Heap Used
jvm_memory_used_bytes{application="$application", area="heap"}

# HikariCP Active Connections
hikaricp_connections_active{application="$application"}

Переменные (Variables) в дашбордах

Переменные позволяют создавать параметризованные дашборды:

Пример
# Variable: application
Type: Query
Query: label_values(jvm_memory_used_bytes, application)

# Variable: instance
Type: Query
Query: label_values(jvm_memory_used_bytes{application="$application"}, instance)

Используются в запросах как $application, $instance.

Docker Compose для локального observability-стека
# docker-compose-observability.yml
version: '3.8'
services:
  prometheus:
    image: prom/prometheus:v2.53.0
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - ./prometheus/alert_rules.yml:/etc/prometheus/alert_rules.yml
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.retention.time=7d'
      - '--web.enable-lifecycle'

  grafana:
    image: grafana/grafana:11.1.0
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_INSTALL_PLUGINS=grafana-clock-panel
    volumes:
      - ./grafana/provisioning:/etc/grafana/provisioning
      - grafana-data:/var/lib/grafana

  loki:
    image: grafana/loki:3.1.0
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml

  tempo:
    image: grafana/tempo:2.5.0
    ports:
      - "3200:3200"
      - "4317:4317"    # OTLP gRPC
      - "4318:4318"    # OTLP HTTP
    command: ["-config.file=/etc/tempo/tempo.yaml"]
    volumes:
      - ./tempo/tempo.yaml:/etc/tempo/tempo.yaml

  promtail:
    image: grafana/promtail:3.1.0
    volumes:
      - /var/log:/var/log
      - ./promtail/config.yml:/etc/promtail/config.yml
    command: -config.file=/etc/promtail/config.yml

volumes:
  grafana-data:

Важное

  • Grafana не хранит данные — только визуализирует. Данные остаются в Prometheus, Loki, Tempo и т.д.
  • Dashboard as Code: дашборды можно хранить как JSON и версионировать в Git (provisioning).
  • Корреляция сигналов: настройте связи между Prometheus -> Tempo (exemplars), Loki -> Tempo (derived fields), Tempo -> Loki/Prometheus (trace-to-logs/metrics).
  • Grafana поддерживает Explore режим для ad-hoc запросов (отладки), в отличие от дашбордов, которые предназначены для постоянного мониторинга.

Частые ошибки

  • Перегруженные дашборды: 30 панелей на одном дашборде — нечитаемо. Разделяйте по уровням: Overview -> Service -> Detail.
  • Хардкод значений: используйте переменные ($application, $instance) вместо конкретных имён в запросах.
  • Отсутствие документации на дашборде: добавляйте Text-панели с описанием, что мониторится и какие пороговые значения нормальны.
  • Не настроенные корреляции: клик из графика метрик должен вести к трейсу, из трейса — к логам.

Как используется в 2026

  • Grafana 11+ с нативной поддержкой AI-ассистента (Grafana LLM) для генерации PromQL/LogQL запросов.
  • Grafana Scenes — новый фреймворк для программного создания дашбордов на TypeScript.
  • Grafana OnCall — встроенный инструмент для управления дежурствами и эскалациями.
  • Unified Alerting — единая система алертинга для всех data sources (Prometheus, Loki, SQL и др.).
  • Grafana Cloud с бесплатным уровнем — популярный выбор для стартапов.

На собеседовании: подчеркните, что Grafana — инструмент визуализации, а не хранения данных. Упомяните корреляцию сигналов (metrics -> traces -> logs) — это показывает зрелое понимание observability-стека. Знание конкретных dashboard ID (4701, 11378) производит хорошее впечатление.