Пользовательские метрики | Позвольте Prometheus контролировать ваше приложение

Java задняя часть
Пользовательские метрики | Позвольте Prometheus контролировать ваше приложение

Это 12-й день моего участия в Gengwen Challenge, пожалуйста, проверьте подробности мероприятия:Обновить вызов

Предисловие:

В этой статье в качестве примера будет использоваться Spring Boot/Spring Cloud, чтобы представить определение и представление пользовательских индикаторов мониторинга с использованием Prometheus SDK, а также представить фактические сценарии использования четырех различных типов индикаторов (счетчик, датчик, гистограмма, сводка) в Prometheus. ;

Предыстория требований:

Для нового проекта, над которым я недавно работаю, мне нужно внедрить мониторинг Prometheus после выхода в интернет и настроить мониторинг индикаторов, которые мне нужны в проекте.Я использую существующую Grafana компании, и я не создавал Grafana +Панель инструментов Prometheus В следующей статье мы расскажем о том, как использовать Grafana+Prometheus для создания панелей управления проектами, поэтому я не буду вдаваться в подробности здесь! Смотрите текст ниже👇👇👇;

Для некоторых серверных приложений и архитектуры среды. Вообще говоря, мы обычно собираем индикаторы мониторинга с нескольких уровней:

  • Входной шлюз: это может быть балансировщик нагрузки, такой как Nginx/HaProxy, или запись микросервиса, предоставляемая такой платформой, как Spring Cloud Zuul. Вообще говоря, нам нужно собрать все данные индикатора, связанные с Http Request. Например, адрес запроса, метод HTTP, код состояния возврата, время ответа и т. д. Таким образом, такая информация, как деловое давление и статус обслуживания, может быть проанализирована с помощью исторических данных этих показателей.
  • Служба приложений: для служб приложений основным использованием ресурсов является само приложение. Например, если это программа Java, ее можно подсчитать непосредственно с помощью информации JVM. Если она развернута в контейнере, ее можно рассчитать с помощью ресурса использование Контейнера.статистика. Помимо использования ресурсов, в некоторых особых случаях мы также можем собирать в приложении некоторые бизнес-показатели.
  • Инфраструктура: использование ресурсов виртуальных машин или физических машин и т. д.
  • Другое: базы данных, кэши, очереди сообщений и другие промежуточные состояния, используемые в среде кластера.

Для приведенных выше централизованных сценариев, в дополнение к непосредственному использованию экспортера, предоставляемого сообществом Prometheus, в различных проектах также может потребоваться реализация некоторых пользовательских экспортеров для выполнения требований по сбору и мониторингу индикаторов для конкретных целей.

Система мониторинга в основном состоит из следующих структур:

  • Целевая служба: эта служба является онлайн-службой каждой группы.После доступа к общедоступному пакету службы мониторинга, предоставляемому архитектурной группой, после запуска службы будет открыт интерфейс мониторинга данных /actuator/prometheus, а также некоторые из наших индикаторов данных мониторинга. также выставлены.Вот, прямой запросhttp://localhost:8080/actuator/prometheusТолько что
  • Служба сбора данных: служба prometheus, которая в основном отвечает за сбор данных, предоставляемых каждым целевым интерфейсом службы через регулярные промежутки времени, и интеграцию данных в интерфейс в соответствии с форматом данных [Metric] для мониторинга и отображения служб.
  • Служба отображения данных: Grafana, эта служба представляет собой простую службу отображения данных, которая может поддерживать отображение данных различных служб сбора данных, включая prometheus, и предоставлять некоторые функции для работы с различными составными сценариями отображения.

Метод доступа

пом зависимости:

<!--监控点开始-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    <version>${starter-actuator.version}</version>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient</artifactId>
    <version>${prometheus-simpleclient.version}</version>
</dependency>
<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_spring_boot</artifactId>
    <version>${prometheus-simpleclient.version}</version>
</dependency>
<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_hotspot</artifactId>
    <version>${prometheus-simpleclient.version}</version>
</dependency>
<!--监控点结束-->

файл конфигурации application.properties:

management.metrics.export.prometheus.enabled=true
management.metrics.export.prometheus.step=1m
management.metrics.export.prometheus.descriptions=true
management.web.server.auto-time-requests=true
management.endpoints.prometheus.id=produce-server
management.endpoints.web.exposure.include=health,info,env,prometheus,metrics,httptrace,threaddump,heapdump,springmetrics,git
management.health.rabbit.enabled=false

Различные проекты предъявляют разные требования к открытым интерфейсам, и приведенные выше параметры management.endpoints.web.exposure.include можно соответствующим образом настроить для каждой среды значений.

В проект добавлен новый компонент сбора данных prometheus:

import io.micrometer.core.instrument.ImmutableTag;
import io.micrometer.core.instrument.Metrics;
import io.micrometer.core.instrument.Tag;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;

/**
 * levelDb自定义监控指标
 *
 * @author taoze
 * @version 1.0
 * @date 4/27/21 10:42 AM
 */
@Component
@Slf4j
public class LevelDbMetrics {

    /**
     * levelDB监控项
     */
    private AtomicLong levelDBHead = Metrics.gauge("a.levelDb.head", init(), new AtomicLong(0));
    private AtomicLong levelDBTail = Metrics.gauge("a.levelDb.tail", init(), new AtomicLong(0));

    /**
     * 初始化tag
     *
     * @return
     */
    List<Tag> init() {
        List<Tag> list = new ArrayList<>();
        String ip = null;
        try {
            ip = InetAddress.getLocalHost().getHostAddress();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        list.add(new ImmutableTag("host", StringUtils.isBlank(ip) ? "127.0.0.1" : ip));
        return list;
    }

    public void setLevelDBHead(Long head) {
        levelDBHead.set(head);
        log.info("levelDB head = [{}]", levelDBHead.get());
    }

    public void setLevelDBTail(Long tail) {
        levelDBTail.set(tail);
        log.info("levelDB tail = [{}]", levelDBTail.get());
    }
}
  • хотите выставить пользовательские данные в/actuator/prometheus, вам нужно создатьMetricsобъекта, а затем обновить данные этого объекта, и, наконец, вызвать интерфейс из этогоMetricsПолучить указанные данные из данных, хранящихся в объекте
  • При обновлении значения вызывайте метод setLevelDBHead или setLevelDBTail или используйте временную задачу для регулярного изменения значения.

Типы индикаторов метрик и сценарии использования:

  • Счетчик, счетчик, который только увеличивается и не уменьшается
  • Датчик, панель инструментов, которую можно добавить или удалить.
  • Гистограмма, поставляется с интервалом сегментов для диаграммы статистического распределения
  • Сводная, определяемая клиентом диаграмма распределения данных

Помимо вышеперечисленных методов, мы также можем拦截器/过滤器: используется для подсчета всех запросов приложений и т. д.

Индикаторы мониторинга мобильного телефона методом WebMvcConfigurerAdapter:

@SpringBootApplication
@EnablePrometheusEndpoint
public class SpringApplication extends WebMvcConfigurerAdapter implements CommandLineRunner {

    @Autowired
    private CustomExporter customExporter;

    ...省略的代码

    @Override
    public void run(String... args) throws Exception {
        ...省略的代码
        customExporter.register();
    }
}

Ok! На этом сегодняшняя раздача подошла к концу.Собрать индикаторные коды относительно просто.Друзья со схожими потребностями могут попробовать.Надеюсь всем будет полезно.Если что-то не так,надеюсь каждый поднимет и дорастет вместе;

Чистота делает код отличным, а в деталях только небо и земля