← Назад к вопросам

Что такое Grafana?

2.0 Middle🔥 191 комментариев
#Stream API и функциональное программирование#Многопоточность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Grafana

Grafana — это открытая платформа для мониторинга и визуализации метрик приложений и инфраструктуры в реальном времени. Она является незаменимым инструментом для DevOps инженеров и Java разработчиков при управлении production-окружением.

Основные характеристики Grafana

Определение

Grafana — это веб-приложение, которое подключается к различным источникам данных (Data Sources) и создает красивые, информативные дашборды для визуализации метрик.

Архитектура

Java Application (JVM metrics)
       |
       v
Prometheus (Time Series Database)
       |
       v
Grafana (Visualization & Dashboards)
       |
       v
Browser (Real-time monitoring)

Поддерживаемые источники данных

Grafana может работать с множеством источников метрик:

  1. Prometheus — самый популярный источник

    # Java приложение экспортирует метрики в Prometheus формате
    java_heap_memory_used{instance="localhost:8080"} 1024000000
    java_threads_live 42
    http_requests_total{method="GET", status="200"} 5423
    
  2. InfluxDB — база данных временных рядов

    time-series data с временными меткам
    
  3. Elasticsearch — для логов и метрик

    Интегрируется с ELK stack (Elasticsearch-Logstash-Kibana)
    
  4. Graphite — классическая система мониторинга

  5. CloudWatch — мониторинг AWS ресурсов

  6. Datadog, New Relic, AppDynamics и другие

Как использует Java разработчик

1. Добавляем библиотеку Micrometer

Micrometer — это фасад для различных мониторинговых систем:

<!-- pom.xml -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-core</artifactId>
</dependency>

<!-- Для экспорта в Prometheus -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

2. Конфигурируем Spring Boot (application.yml)

management:
  endpoints:
    web:
      exposure:
        include: prometheus,health,info
  metrics:
    export:
      prometheus:
        enabled: true

spring:
  application:
    name: my-java-app
    version: 1.0.0

3. Создаем кастомные метрики

import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Timer;
import org.springframework.stereotype.Service;

@Service
public class OrderService {
    private final MeterRegistry meterRegistry;
    private final Counter ordersCreated;
    private final Timer orderProcessingTime;
    
    public OrderService(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
        
        // Счетчик заказов
        this.ordersCreated = Counter.builder("orders.created")
            .description("Total orders created")
            .register(meterRegistry);
        
        // Таймер обработки
        this.orderProcessingTime = Timer.builder("orders.processing.time")
            .description("Time to process an order")
            .publishPercentiles(0.5, 0.95, 0.99)
            .register(meterRegistry);
    }
    
    public void createOrder(Order order) {
        return orderProcessingTime.record(() -> {
            // Бизнес-логика
            saveOrder(order);
            ordersCreated.increment();
        });
    }
    
    // Gauge — текущее значение
    public void registerQueueSize(Supplier<Integer> queueSizeSupplier) {
        meterRegistry.gauge("queue.size", queueSizeSupplier);
    }
}

4. Метрики доступны по URL

# Prometheus метрики в текстовом формате
curl http://localhost:8080/actuator/prometheus

# Результат:
java_lang_OperatingSystem_ProcessCpuLoad 0.25
java_lang_MemoryPool_Usage_bytes{id="PS Survivor Space"} 8192000
java_lang_ThreadInfo_ThreadCount 42
orders_created_total 1523
orders_processing_time_seconds_max 2.456
orders_processing_time_seconds_count 5421

Основные компоненты Grafana

1. Dashboards (Дашборды)

Визуальные панели для отслеживания метрик:

┌─────────────────────────────────────┐
│  CPU Usage (%)       Memory Usage (%)│
│  ┌──────────┐       ┌──────────────┐│
│  │  45%     │       │  72%         ││
│  └──────────┘       └──────────────┘│
│                                     │
│  Request Rate (per sec)  Error Rate |
│  ┌──────────────────┐  ┌──────────┐│
│  │ /\ /\ /\ /\ /\ │  │   0.5%  ││
│  │/  \/  \/  \/    │  │         ││
│  └──────────────────┘  └──────────┘│
└─────────────────────────────────────┘

2. Panels (Панели)

Различные типы визуализации:

  • Graph — линейные графики
  • Gauge — стрелочный измеритель (0-100%)
  • Stat — текущее числовое значение
  • Heatmap — тепловая карта
  • Table — таблица данных
  • Pie Chart — круговая диаграмма
  • Bar Chart — столбчатая диаграмма

3. Alerts (Оповещения)

Автоматические алерты при нарушении условий:

# Alert rule
Alert: HighCpuUsage
If: cpu_usage > 80
For: 5m
Then: Send to Slack, PagerDuty, Email

4. Variables (Переменные)

Параметры дашборда для фильтрации:

variables:
  - name: instance
    type: dropdown
    values: [localhost:8080, prod-server-1:8080, prod-server-2:8080]
  
  - name: timerange
    type: time picker
    default: Last 1 hour

Практический пример: мониторинг Java приложения

Конфигурация Docker Compose

version: '3.8'
services:
  java-app:
    build: .
    ports:
      - "8080:8080"
    environment:
      MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE: prometheus
  
  prometheus:
    image: prom/prometheus:latest
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
  
  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      GF_SECURITY_ADMIN_PASSWORD: admin
    depends_on:
      - prometheus

Prometheus конфигурация (prometheus.yml)

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'java-app'
    static_configs:
      - targets: ['localhost:8080']
    metrics_path: '/actuator/prometheus'

Создание дашборда в Grafana

{
  "dashboard": {
    "title": "Java Application Monitoring",
    "panels": [
      {
        "title": "JVM Heap Memory",
        "targets": [
          {
            "expr": "jvm_memory_used_bytes{area='heap'}"
          }
        ],
        "type": "graph"
      },
      {
        "title": "HTTP Requests Per Second",
        "targets": [
          {
            "expr": "rate(http_requests_total[1m])"
          }
        ]
      },
      {
        "title": "Error Rate",
        "targets": [
          {
            "expr": "rate(http_requests_total{status=~'5..'}[1m])"
          }
        ]
      }
    ]
  }
}

Ключевые метрики для Java приложений

JVM Метрики

// Память
jvm_memory_used_bytes
jvm_memory_max_bytes
jvm_memory_committed_bytes

// Потоки
jvm_threads_live
jvm_threads_peak
jvm_threads_daemon

// Garbage Collection
jvm_gc_pause_seconds
jvm_gc_memory_freed_bytes

Приложения метрики

// HTTP
http_requests_total
http_requests_duration_seconds
http_requests_size_bytes

// Database
db_connections_active
db_connections_idle
db_query_duration_seconds

// Business
orders_created_total
users_registered_total
revenue_total

Создание алертов

// Example: Alert if error rate > 5% for 5 minutes
Alert: HighErrorRate
Expr: (rate(http_requests_total{status=~'5..'}[1m])) / (rate(http_requests_total[1m])) > 0.05
For: 5m
Annotations:
  summary: "High error rate detected"
  description: "Error rate is {{ $value | humanizePercentage }}"
Labels:
  severity: critical
  team: backend

Интеграция с Slack

# Конфигурация уведомлений
notification_channels:
  - name: "Slack Backend Team"
    type: slack
    settings:
      url: "https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
      channel: "#alerts"
      mention_groups: "@backend-team"

Лучшие практики

1. Экспортируй правильные метрики

// Не экспортируй слишком детальные метрики
// Это может замедлить систему

// ХОРОШО: Агрегированные метрики
meterRegistry.timer("http.requests").record(duration, TimeUnit.MILLISECONDS);

// ПЛОХО: Чересчур детальные метрики на каждый запрос
for (Request r : requests) {
    meterRegistry.gauge("request.detail." + r.getId(), () -> r.getDuration());
}

2. Используй правильные типы метрик

// Counter — только растет
Counter.builder("orders.created").register(registry);

// Gauge — может меняться в обе стороны
meterRegistry.gauge("queue.size", queueSize);

// Timer — для измерения времени
Timer.builder("operation.duration").register(registry);

3. Давай осмысленные имена

✓ http_requests_duration_seconds_bucket
✗ req_dur

✓ jvm_memory_used_bytes{area="heap"}
✗ mem

Заключение

Grafana — это мощный инструмент для мониторинга Java приложений. Вместе с Prometheus и Micrometer она позволяет:

  • Отслеживать производительность приложения в реальном времени
  • Обнаруживать проблемы и узкие места
  • Настраивать автоматические оповещения
  • Делиться дашбордами с командой
  • Принимать обоснованные решения на основе данных

Для modern Java разработчика понимание мониторинга критично при работе с production-системами.