微服务:指标和健康监控


在运行或多或少真实的软件系统时,可以(并且应该)收集大量不同的指标,特别是根据微服务架构原则设计的。在这种情况下,收集和存储此类状态数据的过程通常称为监控。

源代码:https ://github.com/dtimchenko/custom-microservices-project

基础设施监控:
基础设施组件和层的监控在某种程度上是一个已解决的问题。从开源的角度来看,NagiosZabbixRiemannOpenNMSIcinga等知名品牌在此占据主导地位。

应用程序监控:
基础设施当然属于“必须监控”的类别,但监控的应用程序方面可以说更有趣,更接近主题。

普罗米修斯
Prometheus是一个开源系统监控和警报工具包,最初在SoundCloud构建。自 2012 年成立以来,许多公司和组织都采用了 Prometheus,该项目拥有非常活跃的开发者和用户社区。它现在是一个独立的开源项目,独立于任何公司进行维护。为了强调这一点,并明确项目的治理结构,Prometheus 于 2016 年加入云原生计算基金会,成为继Kubernetes之后的第二个托管项目。
Prometheus 将其指标收集并存储为时间序列数据,即指标信息与记录时的时间戳以及称为标签的可选键值对一起存储。

普罗米修斯的主要特点是:

  • 具有由度量名称和键/值对标识的时间序列数据的多维数据模型
  • PromQL,一种利用这种维度的灵活查询语言
  • 不依赖分布式存储;单个服务器节点是自治的
  • 时间序列收集通过 HTTP 上的拉模型进行
  • 通过中间网关支持推送时间序列
  • 通过服务发现或静态配置发现目标
  • 多种图形模式和仪表板支持

AlertManager是一个独立的二进制进程,用于处理Prometheus服务器实例发送的警报。由于JCG Car Rentals平台选择 Prometheus作为指标和监控平台,因此管理警报也成为合乎逻辑的选择。
基本上,有几个步骤可以遵循。该过程包括配置和运行AlertManager实例,配置Prometheus与该AlertManager实例通信,最后在Prometheus中定义警报规则。


Grafana
Grafana 是一个数据库分析和监控工具。它允许您创建对您很重要的关键指标的仪表板可视化。Grafana 拥有一个蓬勃发展的爱好者社区,他们共享可重用的仪表板。
Grafana 支持大量数据源。而且,由于该应用程序是开源的,因此您可以确定,一旦发布了新数据源,就会有人为其添加支持。Grafana 最常见的用例是显示时间序列数据,例如内存或 CPU 随着时间的推移以及当前使用情况数据。
您可以自己托管 Grafana,使用 AWS 中的托管服务或让创建者为您托管它。Grafana 在您的计算机或服务器上作为进程运行,您可以通过浏览器访问该界面。您的仪表板可以将您的数据显示为单个数字、图形、图表,​​甚至是热图。
Grafana 通过为您提供分析和监控数据库所需的工具来帮助您识别和解决性能问题。它不仅可以帮助解决问题,还可以通过使用警报帮助您主动进行维护。Grafana 是开源的,与广泛的数据库兼容,并且拥有一个蓬勃发展的社区。

Micrometer
Micrometer 为最流行的监控系统的检测客户端提供了一个简单的外观,允许您检测基于 JVM 的应用程序代码,而无需供应商锁定。想想 SLF4J,但对于指标。
Micrometer 为计时器、仪表、计数器、分布摘要和长任务计时器提供了与供应商无关的接口,具有维度数据模型,当与维度监控系统配合使用时,允许有效访问特定命名的度量,并具有向下钻取的能力跨越其维度。
作为一个仪表门面,Micrometer 允许您使用具有供应商中立界面的维度度量来仪表代码,并在最后一步决定监控系统。使用 Micrometer 检测您的核心库代码允许将库包含在将指标发送到不同后端的应用程序中。

应用程序遥测和微服务
对于开发团队来说,捕获遥测数据是了解应用程序内部情况的关键。您需要构建遥测基础设施来捕获和处理数据。遥测处理基础设施的两个主要功能是:

  • 收集和公开遥测数据——需要对 BMC 微服务进行检测以公开标准和自定义指标
  • 处理和存储遥测数据——BMC 应用程序开发环境可以摄取大量指标数据(包括对 Prometheus 格式的支持),同时以时序格式对其进行丰富和存储,以便对其进行处理和进一步可视化

开始
让我们从一个简单的两步过程开始,以集成 Prometheus 和 Micrometer。
添加micrometer-registry-prometheus注册表。

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>


声明一个 bean 类型MeterRegistryCustomizer<PrometheusMeterRegistry>.
这将生成一个新的端点—— /actuator/prometheus

@Configuration
public class MicrometerConfig {

    @Value("${spring.application.name}")
    private String appName;

    @Bean
    public MeterRegistryCustomizer<PrometheusMeterRegistry> configureMetricsRegistry() {
        return registry -> registry.config().commonTags(
"appName", appName);
    }

    @Bean
    public TimedAspect timedAspect(MeterRegistry meterRegistry){
        return new TimedAspect(meterRegistry);
    }

}

@Timed注解将用于监控方法时间执行。

 @PostMapping(
            consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE},
            produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
    @Timed(value = "registerCustomer.time", description = "time to register a new customer")
    public ResponseEntity<Customer> registerCustomer(@RequestBody @Valid CustomerRegistrationRequest customerRequest){
        log.info(
"new customer registration request {}", customerRequest);
        return ResponseEntity.ok(customerService.registerCustomer(customerRequest));
    }

要运行Prometheus和Grafana,我们将使用 docker-compose。

prometheus:
    container_name: prometheus
    image: prom/prometheus:v2.35.0
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - 9090:9090
    depends_on:
      - customer
      - fraud
      - apigw
    networks:
      - monitoring
  grafana:
    container_name: grafana
    image: grafana/grafana:8.5.1
    ports:
      - 3000:3000
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin
    networks:
      - monitoring
    depends_on:
      - prometheus

Prometheus 是一个时间序列数据库,它通过 HTTP 定期拉取我们的度量数据来存储它。要正确配置它,我们需要提供prometheus.yaml配置:

global:
  scrape_interval:     5s
  evaluation_interval: 5s

scrape_configs:
  - job_name: 'apigw'
    metrics_path: '/actuator/prometheus'
    static_configs:
    - targets: ['apigw:8082']
  - job_name: 'customer'
    metrics_path: '/actuator/prometheus'
    static_configs:
    - targets: [ 'customer:8011' ]
  - job_name: 'fraud'
    metrics_path: '/actuator/prometheus'
    static_configs:
    - targets: [ 'fraud:8012' ] 


更多点击标题
源代码:https ://github.com/dtimchenko/custom-microservices-project