一步步教你用Prometheus搭建實時監控系統系列(一)——上帝之火,普羅米修斯的崛起

来源:https://www.cnblogs.com/bryan31/archive/2020/07/22/13362617.html
-Advertisement-
Play Games

上帝之火 本系列講述的是開源實時監控告警解決方案Prometheus,這個單詞很牛逼。每次我都能聯想到帶來上帝之火的希臘之神,普羅米修斯。而這個開源的logo也是火,個人挺喜歡這個logo的設計。 本系列著重介紹Prometheus以及如何用它和其周邊的生態來搭建一套屬於自己的實時監控告警平臺。 本 ...


上帝之火

本系列講述的是開源實時監控告警解決方案Prometheus,這個單詞很牛逼。每次我都能聯想到帶來上帝之火的希臘之神,普羅米修斯。而這個開源的logo也是火,個人挺喜歡這個logo的設計。

本系列著重介紹Prometheus以及如何用它和其周邊的生態來搭建一套屬於自己的實時監控告警平臺。

本系列受眾對象為初次接觸Prometheus的用戶,大神勿噴,偏重於操作和實戰,但是重要的概念也會精煉出提及下。系列主要分為以下幾塊

  • Prometheus各個概念介紹和搭建,如何抓取數據(本次分享內容)
  • 如何推送數據至Prometheus,推送和拉取分別用於什麼樣的場景
  • Prometheus數據的結構以及查詢語言PromQL的使用
  • Java應用如何和Prometheus集成,如何啟用服務發現,如果自定義業務指標
  • Prometheus如何和Grafana可視化套件進行集成和設置告警
  • 教你如何手寫一個集成了監控Dubbo各個指標的java套件
  • 實際案例分享,如何做各個業務端和系統端的監控大盤

Prometheus以及時序資料庫的基本概念

Prometheus現在在Github有3w多的star,基本上過萬星的開源工具,可以認為是社區里絕對的主流,社區也相當活躍,可以有大量的經驗可以借鑒。在企業級系統中,可以放心的使用。

file

Prometheus 是由 SoundCloud 開發的開源監控報警系統和時序列資料庫。從字面上理解,Prometheus 由兩個部分組成,一個是監控報警系統,另一個是自帶的時序資料庫(TSDB)

關於時序資料庫(TSDB)這裡要說下,我們可以簡單的理解為一個優化後用來處理時間序列數據的資料庫,並且數據中的數組是由時間進行索引的。相比於傳統的結構化資料庫主要有幾個好處:

  • 時間序列數據專註於海量數據的快速攝取。時序資料庫視數據的每一次變化為一條新的數據,從而可以去衡量變化:分析過去的變化,監測現在的變化,以及預測未來將如何變化,傳統結構化數據在數據量小的時候能做到,在數據量大的時候就需要花費大量的成本。
  • 高精度數據保存時間較短,中等或更低精度的摘要數據保留時間較長。對於實時監控來說,不一定需要每一個精準的數據,而是固定時間段時間數據的摘要。這對於結構化資料庫來說就意味著要進行篩選,在保證大量的寫入同時還要進行帥選,這是一個超出結構化資料庫設計來處理的工作量。
  • 資料庫本身必須連續計算來自高精度數據的摘要以進行長期存儲。這些計算既包括一些簡單的聚合,同時也有一些複雜計算。傳統資料庫無法承受那麼大量的計算。因為必須去實時統計這些聚合和複雜運算。

開始搭建Prometheus

https://prometheus.io/

Prometheue官網Download標簽頁進行下載,這裡以linux版本為例:

file

下載好之後,解壓,運行

nohup /data/prometheus/prometheus --web.listen-address=0.0.0.0:9090 --config.file=/data/prometheus/prometheus.yml --web.enable-lifecycle --storage.tsdb.path=/data/prometheus/data --storage.tsdb.retention.time=15d &

這樣,就簡單的搭建起來Prometheus服務端了。這時候,我們可以在web上訪問

http://127.0.0.1:9090

就可以訪問到管理頁面

file

界面上幾個標簽說明下:

Alert:用來配置告警規則。之後我們會用Grafana自身的告警界面配置來代替這個。

Graph:用來運行PromQL語句的一個控制台,並且可以把運行出來的語句用用圖形化進行展示,此塊我們後面章節會介紹到。

Status:包含系統信息,系統狀態,配置信息,目標節點的狀態,服務發現狀態等元信息的查看。

Prometheus整體架構以及生態

file

這張圖是官方的整體架構圖。米黃色部分是Prometheus自己的組件,綠色的為第三方的中間件和應用。

簡單介紹下整個Prometheus的生態架構:

  1. Prometheus獲取數據的方式只有一種,就是scrape,也稱作pull,意為拉取。Prometheus每隔一段時間會從目標(target)這裡以Http協議拉取指標(metrics),這些目標可以是應用,也可以是代理,緩存中間件,資料庫等等一些中間件。
  2. 拉取出來的數據Prometheus會存到自己的TSDB資料庫。自己的WebUI控制台以及Grafana可以對其數據進行時間範圍內的不斷查詢,繪製成實時圖表工展現。
  3. Prometheus 支持例如zookeeper,consul之類的服務發現中間件,用以對目標(target)的自動發現。而不用一個個去配置target了。
  4. alertManager組件支持自定義告警規則,告警渠道也支持很多種

拉取數據

Prometheus主要是通過拉取的方式獲取數據,說簡單點,就是每隔固定時間去訪問配置的targettarget就是一個獲取數據的url。

現在我們就來模擬一個數據源,並讓prometheus去拉取。

新建一個springboot的web項目,pom依賴加上

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

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

application.properties裡加上

server.port=8080
anagement.endpoints.web.exposure.include=*

啟動完畢後,我們就可以在頁面上訪問如下地址:

http://127.0.0.1:8080/actuator/prometheus

得到如下數據:

file

關於actuator如何監控應用指標以及自定義指標我會在之後的系列里單獨分析,這裡只要理解成我們啟動了一個服務,提供了一個url能列出一些kv形式的指標就行了。

例如jvm_memory_max_bytes{area="heap",id="PS Old Gen",} 2.863661056E9這個指標,前面是key,後面為value。

其中key上又分key namekey labels,key name就是``jvm_memory_max_byteskey labels有2個。

這個指標提供了jvm的最大記憶體,其中areaheap,表明這是堆記憶體區域,idPS Old Gen,表明這是老年代。綜合起來看,這個指標就是jvm中老年代的最大值。數值類型是byte,換算下來大概是286M左右。

我們有指標的數據源後,再在prometheus 的根目錄下編輯prometheus.yml文件,添加如下配置:

- job_name: 'test'
    scrape_interval: 5s
    metrics_path: '/actuator/prometheus'
    static_configs:
    - targets: ['localhost:8080']
      labels:
          instance: demo

這個配置表示:prometheue每隔5秒鐘從http://localhost:8080/actuator/prometheus這個url拉取指標,並且為每個指標添加instance這個標簽。

添加完畢後,重啟prometheus。進入web頁面中的targets頁面。如果前面步驟沒問題的話,會看到:

file

狀態為UP表明prometheue已經成功獲取到了這個target 的數據。

在查詢頁面上輸入剛纔那個指標的key:

file

這裡每個value都是prometheus最近一次抓取的數據。你每執行一次,數據都會變。

這裡為什麼會有多條數據呢,是因為每個指標他們的標簽不一樣。完全一樣的標簽會被歸為一種指標。

Graph這標簽可以看到在時間序列下,某個指標的變化趨勢

file

上圖展示了系統cpu指標的變化圖。

最後

如今微服務盛行,小規模的企業的微服務節點也快上百了,Prometheus生態能夠用最小的代價使所有的數據實時可視化。這對於開發和運維來說,意義在於,所有的數據不再是黑盒了,至少我個人覺得所有的數據能夠被觀測和分析,是具有安全感的。

這個系列旨在利用實戰操作教你一步步搭建自己系統和業務監控大盤。後面會繼續更新。下一個章節將分析:搭建pushgateway去push數據到prometheus,以及2種不同的數據獲取方式分別用於什麼樣的場景。

聯繫作者

歡迎微信公眾號關註 「元人部落

關註後回覆 "資料" 免費獲取50G的技術資料,包含一整套企業級微服務課程以及一套秒殺課程

file


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、JavaScript 和 html 代碼的結合方式 1. 第一種方式 只需要在 head 標簽中,或者在 body 標簽中, 使用 script 標簽 來書寫 JavaScript 代碼 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
  • 什麼是Redis Redis 是一個開源(BSD許可)的,記憶體中的數據結構存儲系統,它可以用作資料庫、緩存和消息中間件。 它支持多種類型的數據結構,如字元串, 散列, 列表, 集合, 有序集合與範圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢 ...
  • 一. 本篇要學習的內容和知識結構概覽 二. 知識點逐條分析 1. 使用函數重載 C++允許為同一個函數定義幾個版本, 從而使一個函數名具有多種功能, 這稱之為函數重載. 像這樣: 雖然函數名一樣, 但是參數列表不一樣, 一個求兩個整型參數的最大值, 一個求三個整型參數的最大值. 2. 新的基本數據類 ...
  • 1. 前言 我們真實的伺服器不應該直接暴露到公網上去,否則更加容易泄露伺服器的信息,也更加容易受到攻擊。一個比較“平民化”的方案是使用Nginx反向代理它。今天就來聊一聊使用Nginx反向代理的一些能力,Nginx代理能幫助我們實現很多非常有效的API控制功能。這也解釋了我為什麼一直推薦使用Ngin ...
  • 線程池 “線程池”,顧名思義就是一個線程緩存,線程是稀缺資源,如果被無限制的創建,不僅會消耗系統資源,還會降低系統的穩定性,因此Java中提供線程池對線程進行統一分配、調優和監控 線程池介紹 在web開發中,伺服器需要接受並處理請求,所以會為一個請求來分配一個線程來進行處理。如果每次請求都新創建一個 ...
  • Java NIO是一種基於通道和緩衝區的I/O方式,已經被廣泛的應用,成為解決高併發與大量連接和I/O處理問題的有效方式。 Java NIO相關組件 Java NIO主要有三個核心部分組成,分別是:Channel(通道),Buffer(緩衝區), Selector(選擇器) Channel Chan ...
  • 存儲結構 threadLocal存儲於Thread類上的ThreadLocalMap類型的threadLocals中。 從ThreadLocalMap的名字上可以看出其結構類似於HashMap,它也是使用key-value結構的Entry數組table來存儲ThreadLocal和值。 但區別在於E ...
  • ###extern ######作用1:讓編譯器按C規則編譯函數名和變數名(保持名稱原樣,c++由於可以重載所以名稱前後會添加符號) #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif ######作用2:在頭文件中 ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...