Это 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! На этом сегодняшняя раздача подошла к концу.Собрать индикаторные коды относительно просто.Друзья со схожими потребностями могут попробовать.Надеюсь всем будет полезно.Если что-то не так,надеюсь каждый поднимет и дорастет вместе;
Чистота делает код отличным, а в деталях только небо и земля