天天看點

Prometheus 到底 NB 在哪裡?- 每天5分鐘玩轉 Docker 容器技術(84)

本節讨論 Prometheus 的核心,多元資料模型。我們先來看一個例子。

比如要監控容器 <code>webapp1</code> 的記憶體使用情況,最傳統和典型的方法是定義一個名額 <code>container_memory_usage_bytes_webapp1</code> 來記錄 <code>webapp1</code> 的記憶體使用資料。假如每1分鐘取一次樣,那麼在資料庫裡就會有類似下面的記錄。

Prometheus 到底 NB 在哪裡?- 每天5分鐘玩轉 Docker 容器技術(84)

好,現在需求發生了點變化,我們需要知道所有 webapp 容器的記憶體使用情況。如果還是采用前面的方法,就不得不增加新的名額 <code>container_memory_usage_bytes_webapp2</code>、<code>container_memory_usage_bytes_webapp3</code>…

像 Graphite 這類更進階的監控方案采用了更為優雅的階層化資料模型。為了滿足上面的需求,Graphite 會定義名額 <code>container.memory_usage_bytes.webapp1</code>、<code>container.memory_usage_bytes.webapp2</code>、<code>container.memory_usage_bytes.webapp3</code>…

然後就可以用 <code>container.memory_usage_bytes.webapp*</code> 擷取所有的 webapp 的記憶體使用資料。

此外,Graphite 還支援 <code>sum()</code> 等函數對名額進行計算和處理,比如 <code>sum(container.memory_usage_bytes.webapp*)</code> 可以得到所有 webapp 容器占用的總記憶體量。

目前為止問題處理得都很好。但客戶總是會提出更多的需求:現在不僅要按容器名字統計記憶體使用量,還要按鏡像來統計;或者想對比一下某一組容器在生産環境和測試環境中對記憶體使用的不同情況。

當然你可以說:隻要定義更多的名額就能滿足這些需求。比如 <code>container.memory_usage_bytes.image1.webapp1</code>、<code>container.memory_usage_bytes.webapp1.prod</code>等。

但問題在于我們沒辦法提前預知客戶要用這些資料回答怎樣的問題,是以我們沒辦法提前定義好所有的名額。

下面來看看 Prometheus 的解決方案。

Prometheus 隻需要定義一個全局的名額 <code>container_memory_usage_bytes</code>,然後通過添加不同的次元資料來滿足不同的業務需求。

比如對于前面 webapp1 的三條取樣資料,轉換成 Prometheus 多元資料将變成:

Prometheus 到底 NB 在哪裡?- 每天5分鐘玩轉 Docker 容器技術(84)

後面三列 <code>container_name</code>、<code>image</code>、<code>env</code> 就是資料的三個次元。想象一下,如果不同 <code>env</code>(prod、test、dev),不同 <code>image</code>(mycom/webapp:1.2、mycom/webapp:1.3)的容器,它們的記憶體使用資料中标注了這三個次元資訊,那麼将能滿足很多業務需求,比如:

計算 webapp2 的平均記憶體使用情況:avg(container_memory_usage_bytes{container_name=“webapp2”})

計算運作 mycom/webapp:1.3 鏡像的所有容器記憶體使用總量:sum(container_memory_usage_bytes{image=“mycom/webapp:1.3”})

統計不同運作環境中 webapp 容器記憶體使用總量:sum(container_memory_usage_bytes{container_name=~“webapp”}) by (env)

這裡隻列了幾個例子,不過已經能夠說明 Prometheus 資料模型的優勢了:

通過次元對資料進行說明,附加更多的業務資訊,進而滿足不同業務的需求。同時次元是可以動态添加的,比如再給資料加上一個 <code>user</code> 次元,就可以按使用者來統計容器記憶體使用量了。

Prometheus 豐富的查詢語言能夠靈活、充分地挖掘資料的價值。前面示例中的 avg、sum、by 隻是查詢語言中很小的一部分功能,已經為我們展現了 Prometheus 對多元資料進行分片、聚合的強大能力。

現在我們已經知道 Prometheus 的強大之處了,再 NB 的東西也得落地,下一節就開始實踐。

書籍:

1.《每天5分鐘玩轉Docker容器技術》

<a href="https://item.jd.com/16936307278.html" target="_blank">https://item.jd.com/16936307278.html</a>

2.《每天5分鐘玩轉OpenStack》

<a href="https://item.jd.com/12086376.html" target="_blank">https://item.jd.com/12086376.html</a>

Prometheus 到底 NB 在哪裡?- 每天5分鐘玩轉 Docker 容器技術(84)