Быстрый старт

Сервис мониторинга (услуга 1.16) позволяет собирать следующие типы метрик:
  • счетчик (Counter) — хранит значения, которые увеличиваются с течением времени (например, количество запросов к серверу);
  • шкала (Gauge) — хранит значения, которые с течением времени могут как увеличиваться, так и уменьшаться (например, объем используемой оперативной памяти или количество операций ввода-вывода);
  • гистограмма (Histogram) — хранит информацию об изменении некоторого параметра в течение определенного промежутка (например, общее количество запросов к серверу в период с 11 до 12 часов и количество запросов к этому же серверов в период с 11.30 до 11.40);
  • сводка результатов (DistributionSummary) — как и гистограмма, хранит информацию об изменении значения некоторого параметра за временной интервал, но также позволяет рассчитывать квантили для скользящих временных интервалов.
Существуют различные библиотеки для сбора метрик в формате Prometheus.

Пример подключения

Ниже указана последовательность действий для выставления метрик в формате Prometheus из прикладного приложения, написанного на Spring Boot.
  1. Добавьте зависимости на Spring Boot Actuator и Micrometer в maven репозиторий:
    pom.xml type=xml
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-core</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
        </dependency>
    
  2. Укажите порт Actuator, фильтр включенных endpoints и системные теги, которые автоматически будут добавлены к прикладным метрикам (файл application.yml):
    application.yml type=yml
    server:
      port: 8080
    
    management:
      endpoint:
        health.show-details: always
    endpoints:
      web:
      exposure:
        include: "*"
    metrics:
      tags:
      application: ${spring.application.name}
      namespace: ${POD_NAMESPACE:local}
      pod: ${POD_NAME:local}
      node_name: ${NODE_NAME:local}
    
  3. Создайте прикладные метрики в проекте (с помощью micrometer):
    CounterController.java type=java
    @RestController
    public class CounterController {
    
        private static final String COUNTER_WITH_TAG_NAME = "simple.counterWithTags";
        private static final String COUNTER_WITH_TAG_DESCRIPTION = "Just a simple counter with tags";
        private static final String TAG_NAME_1 = "terbank";
        private static final String TAG_NAME_2 = "vsp";
    
        private final MeterRegistry meterRegistry;
    
        private Counter simpleCounter;
        private Counter simpleCounterWithTags;
        private Counter simpleCounterWithTags2;
    
        public CounterController(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
        }
    
        /**
        * Инициализация метрик типа Counter
        */
        @PostConstruct
        public void init() {
            simpleCounter = Counter.builder("simple.counter")
                    .description("Just a simple counter")
                    .register(meterRegistry);
    
            simpleCounterWithTags = Counter.builder(COUNTER_WITH_TAG_NAME)
                    .description(COUNTER_WITH_TAG_DESCRIPTION)
                    .tag(TAG_NAME_1, "sib")
                    .tag(TAG_NAME_2, "111")
                    .register(meterRegistry);
    
            simpleCounterWithTags2 = Counter.builder(COUNTER_WITH_TAG_NAME)
                    .description(COUNTER_WITH_TAG_DESCRIPTION)
                    .tag(TAG_NAME_1, "msk")
                    .tag(TAG_NAME_2, "111")
                    .register(meterRegistry);
        }
    
        @PutMapping("/counter")
        public String incrementCounter() {
            simpleCounter.increment();
            return String.format("Counter has been increases\nCurrent value: %s", simpleCounter.count());
        }
    
        @PutMapping("/counter-with-tags/terbank/sib")
        public String incrementCounterTags1() {
            simpleCounterWithTags.increment(1);
            return String.format("Counter has been increases\nCurrent value: %s", simpleCounterWithTags.count());
        }
    
        @PutMapping("/counter-with-tags/terbank/msk")
        public String incrementCounterTags2() {
            simpleCounterWithTags2.increment(2);
            return String.format("Counter has been increases\nCurrent value: %s", simpleCounterWithTags2.count());
        }
    }
    
    С помощью REST API сервиса возможна генерация собственных метрик типа Counter:
    Sending_Example type=sh
    curl -X PUT "/demo/monitoring-rest/counter" -H "accept: */*"
    curl -X PUT "/demo/monitoring-rest/counter-with-tags/terbank/msk" -H "accept: */*"
    
    В каждом из ответов можно увидеть, что общий счетчик метрик был увеличен на n-ное количество. Пример:
    Answer
    Counter has been increases
    Current value: 1.0
    

Настройка конфигурации для Kubernetes

Способ 1 (рекомендуемый):
Для того, чтобы Prometheus мог идентифицировать сервис и получать от него информацию, необходимо добавить аннотации на уровне развёртывания ПО (файл Deployment.yml) и указать путь до метрик приложения.
Deployment.yml type=yml
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    metadata:
      annotations:
        prometheus.io.path: /actuator/prometheus
        prometheus.io.port: '8080'
        prometheus.io.scrape: 'true'
    spec:
      containers:
        ports:
        - containerPort: 8080
Способ 2:
Для того, чтобы Prometheus мог идентифицировать сервис и получать от него информацию, необходимо создать Service и указать путь до метрик приложения.
Service.yml type=yml
apiVersion: v1
kind: Service
metadata:
  name: monitoring-rest
  annotations:
    description: "Exposes Prometheus App by CLuster Ip"
    prometheus.io.scrape: "true"
    prometheus.io.path: "/monitoring-rest/actuator/prometheus"
    prometheus.io.port: "8081"
  labels:
    app: monitoring-rest
spec:
  type: LoadBalancer
  ports:
    - name: http
      port: 8080
      targetPort: 8080
    - name: http-actuator
      port: 8081
      targetPort: 8081
  selector:
    app: monitoring-rest

Grafana: графики мониторинга

Графики мониторинга метрик можно увидеть в Grafana.
Логин/пароль для входа в Grafana: grafana_login/grafana_password
.
Рисунок

Увеличить

Ознакомиться с уже построенным дашбордом по сценарию выше можно в разделе демопримера.
Графики мониторинга метрик можно увидеть в Grafana, построив его вручную или импортировав из файла. Последовательность действий описана в разделе Отслеживание метрик.

Демопримеры

В демопримерах реализованы стандартные сценарии, демонстрирующие работу отдельных сервисов Платформы ГосТех. Отправка тестовых запросов в демопримерах позволит вам ознакомиться с функциями того или иного сервиса. Доступные демопримеры и описания реализованной в них функциональности представлены ниже.
Мониторинг
Генерация метрик, их получение и просмотр в Grafana
Предыдущий раздел
1.16 Мониторинг
Следующий раздел
Алертинг
Была ли страница полезной?