微服務:指標和健康監控

banq發表於2022-09-04

在執行或多或少真實的軟體系統時,可以(並且應該)收集大量不同的指標,特別是根據微服務架構原則設計的。在這種情況下,收集和儲存此類狀態資料的過程通常稱為監控。

原始碼: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

相關文章