python 监控_了解指标并使用Python进行监控
python 監控
當我第一次遇到counter和gauge以及帶有顏色和數字的圖表時,我的React是避免使用該圖表,這些圖表的顏色和數字分別標記為“平均”和“ 90以上”。 就像我看到了它們一樣,但是我不在乎,因為我不了解它們或它們如何有用。 由于我的工作不需要我關注它們,因此它們仍然被忽略。
那是大約兩年前。 隨著我職業的發展,我想更多地了解我們的網絡應用程序,也就是當我開始了解指標時。
我到目前為止了解監視的三個階段是:
- 階段1:什么? (在其他地方看)
- 階段2:如果沒有指標,我們真的是盲目。
- 階段3:如何避免錯誤地執行指標?
我目前處于第二階段,將分享我到目前為止所學的知識。 我正在逐步進入第3階段,在本文結尾的那部分旅程中,我將提供一些資源。
讓我們開始吧!
軟件先決條件
我的GitHub倉庫 。 您將需要安裝docker和docker-compose才能使用它們。我為什么要監視?
進行監視的主要原因如下:
- 了解正常和異常的系統與服務行為
- 進行容量規劃,向上或向下擴展
- 協助進行性能故障排除
- 了解軟件/硬件更改的影響
- 響應測量改變系統行為
- 在系統出現意外行為時發出警報
指標和指標類型
為了我們的目的, 度量是在給定的時間點上一定數量的觀察值。 博客帖子上的點擊總數,參加演講的總人數,在緩存系統中找不到數據的次數,您網站上已登錄用戶的數量,所有這些都是指標的示例。
它們大致分為三類:
專柜
考慮您的個人博客。 您剛剛發布了一條帖子,并希望隨時關注它獲得的點擊次數,這個數字只會增加。 這是計數器的一個示例。 它的值從0開始,并在博客文章的生存期內增加。 圖形上,計數器如下所示:
反指標總是會增加。
量規
假設您想跟蹤每天或每周的點擊數,而不是隨著時間推移博客帖子的總點擊數。 該指標稱為儀表 ,其值可以上升或下降。 在圖形上,量規如下所示:
量度指標可以增加或減少。
儀表的值通常在特定的時間范圍內具有上限和下限 。
直方圖和計時器
直方圖 (如Prometheus所稱)或計時器 (如StatsD所稱)是跟蹤采樣觀測值的度量。 與計數器或儀表不同,直方圖指標的值不一定顯示向上或向下的模式。 我知道這沒有多大意義,而且似乎與衡量標準沒有什么不同。 與標準表相比,您期望對直方圖數據執行的操作有所不同。 因此,監視系統需要知道指標是直方圖類型,才能執行這些操作。
直方圖指標可以增加或減少。
演示1:計算和報告指標
演示1是使用Flask框架編寫的基本Web應用程序。 它演示了我們如何計算和報告指標。
src目錄在app.py具有應用程序,其中src/helpers/middleware.py包含以下內容:
from flask import requestimport csv
import time
def start_timer():
request.start_time = time.time()
def stop_timer(response):
# convert this into milliseconds for statsd
resp_time = (time.time() - request.start_time)*1000
with open('metrics.csv', 'a', newline='') as f:
csvwriter = csv.writer(f)
csvwriter.writerow([str(int(time.time())), str(resp_time)])
return response
def setup_metrics(app):
app.before_request(start_timer)
app.after_request(stop_timer)
從應用程序調用setup_metrics() ,它將配置在處理請求之前調用start_timer()函數,在處理請求之后但發送響應之前配置stop_timer()函數。 在上面的函數中,我們編寫了timestamp以及處理請求所花費的時間(以毫秒為單位)。
當我們在demo1目錄中運行demo1 docker-compose up時,它將啟動Web應用程序,然后啟動一個向Web應用程序發出大量請求的客戶端容器。 您將看到一個由兩列創建的src/metrics.csv文件: timestamp和request_latency 。
查看此文件,我們可以推斷出兩件事:
- 已經生成了很多數據
- 沒有度量指標的觀察結果與之相關的任何特征
沒有與度量標準觀測值相關聯的特征,我們無法說出該度量標準與哪個HTTP端點相關聯,或者無法確定該度量標準是從哪個應用程序節點生成的。 因此,我們需要使用適當的元數據對每個指標觀察進行限定。
統計101
如果我們回想一下高中數學,即使是含糊其詞,也應該記住一些統計學術語,包括均值,中位數,百分位數和直方圖。 讓我們簡要回顧一下它們,而不必像在高中時那樣判斷它們的用處。
意思
平均值或數字列表的平均值是數字的總和除以列表的基數。 3、2和10的平均值是(3+2+10)/3 = 5 。
中位數
中位數是另一種平均值,但計算方法有所不同。 它是從最小到最大(反之亦然)排序的數字列表中的中心數字。 在我們上面的列表(2,3,10)中,中位數是3。 這取決于列表中的項目數。
百分位
百分位數是一種度量,它使我們有了一個度量,低于該度量的一定百分比( k )的數字。 從某種意義上說,它給我們的是如何這一措施相做的一個想法 k我們的數據的百分比。 例如,以上列表的第95個百分值為9.29999。 百分位數度量范圍從0到100(不包括在內)。 零個百分點是一組數字中的最低分數。 你們中有些人可能還記得中位數是第50個百分位數,結果是3。
某些監視系統將百分位數度量值稱為upper_X ,其中X是百分位數。 高90表示第90個百分位的值。
分位數
q分位數是在一組N個數字中對q N進行排名的度量。 q的值在0到1(包括兩者)之間。 當q為0.5時,該值為中位數。 分位數與百分位數之間的關系是, q分位數處的度量等于100 q百分位數處的度量。
直方圖
我們之前了解的度量直方圖是監視系統的實現細節 。 在統計數據中,直方圖是將數據分組為存儲桶的圖形。 讓我們考慮一個不同的,人為的示例:閱讀您的博客的人們的年齡。 如果您掌握了這些數據,并且希望按組粗略地了解讀者的年齡,則繪制直方圖將顯示如下圖:
累積直方圖
累積直方圖是直方圖,其中每個桶的計數包括以前桶的數量,故名累積 。 上述數據集的累積直方圖如下所示:
為什么我們需要統計?
在上面的演示1中,我們觀察到在報告指標時會生成大量數據。 使用指標時,我們需要統計信息,因為它們太多了。 我們不在乎個人價值觀,而是整體行為。 我們期望值顯示的行為是所觀察系統的行為的代理。
演示2:向指標添加特征
在上面的演示1應用程序中,當我們計算并報告請求延遲時,它指的是由幾個特征唯一標識的特定請求。 其中一些是:
- HTTP端點
- HTTP方法
- 正在運行的主機/節點的標識符
如果將這些特征附加到度量標準觀察值,則每個度量標準周圍會有更多上下文。 讓我們探索在示例2中為我們的指標添加特征。
現在,在編寫指標時, src/helpers/middleware.py文件將多個列寫入CSV文件:
node_ids = ['10.0.1.1', '10.1.3.4']def start_timer():
request.start_time = time.time()
def stop_timer(response):
# convert this into milliseconds for statsd
resp_time = (time.time() - request.start_time)*1000
node_id = node_ids[random.choice(range(len(node_ids)))]
with open('metrics.csv', 'a', newline='') as f:
csvwriter = csv.writer(f)
csvwriter.writerow([
str(int(time.time())), 'webapp1', node_id,
request.endpoint, request.method, str(response.status_code),
str(resp_time)
])
return response
由于這是一個演示,因此在報告指標時,我可以自由地報告隨機IP作為節點ID。 當我們在demo2目錄中運行docker-compose up時,它將導致一個包含多列的CSV文件。
用pandas分析指標
現在,我們將使用pandas分析此CSV文件。 運行docker-compose up將打印一個URL,我們將使用該URL打開Jupyter會話。 一旦將Analysis.ipynb筆記本上載到會話中,就可以將CSV文件讀取到pandas DataFrame中:
import pandas as pdmetrics = pd.read_csv('/data/metrics.csv', index_col=0)
index_col指定我們要使用timestamp作為索引。
由于我們添加的每個特征都是DataFrame中的一列,因此我們可以基于以下列執行分組和聚合:
import numpy as npmetrics.groupby(['node_id', 'http_status']).latency.aggregate(np.percentile, 99.999)
請參考Jupyter筆記本以獲取有關數據的更多示例分析。
我應該監視什么?
軟件系統具有許多變量,其值在其生命周期中會發生變化。 該軟件在某種操作系統上運行,并且操作系統變量也會更改。 我認為,您擁有的數據越多,出現問題時就越好。
我建議監視的關鍵操作系統指標是:
- CPU使用率
- 系統內存使用率
- 文件描述符的用法
- 磁盤使用情況
要監視的其他關鍵指標將取決于您的軟件應用程序。
網絡應用
如果您的軟件是偵聽并處理客戶端請求的網絡應用程序,則要衡量的關鍵指標是:
- 傳入的請求數(計數器)
- 未處理的錯誤(計數器)
- 請求延遲(直方圖/計時器)
- 排隊時間,如果您的應用程序中有隊列(直方圖/計時器)
- 隊列大小(如果應用程序中存在隊列)
- 工作進程/線程使用情況(儀表)
如果您的網絡應用程序在滿足客戶端請求的上下文中向其他服務發出請求,則它應具有度量標準來記錄與這些服務的通信行為。 監視的關鍵指標包括請求數量,請求延遲和響應狀態。
HTTP Web應用程序后端
HTTP應用程序應監視以上所有內容。 此外,他們應保留有關非200 HTTP狀態計數的細化數據,這些計數由所有其他HTTP狀態代碼分組。 如果您的Web應用程序具有用戶注冊和登錄功能,則它也應該具有這些指標。
長時間運行的流程
盡管不是網絡服務器,但運行很長時間的進程(例如Rabbit MQ使用者或任務隊列工作器)仍在拾取任務并對其進行處理的模型上工作。 因此,我們應該監視已處理請求的數量以及這些進程的請求延遲。
無論應用程序類型如何,每個指標都應具有與其相關的適當元數據 。
將監控集成到Python應用程序中
將監視集成到Python應用程序中涉及兩個組件:
- 更新您的應用程序以計算和報告指標
- 設置監視基礎結構以容納應用程序的指標并允許對其進行查詢
記錄和報告指標的基本思想是:
def work ( ) :requests + = 1
# report counter
start_time = time . time ( )
# < do the work >
# calculate and report latency
work_latency = time . time ( ) - start_time
...
考慮到上述模式,我們經常利用裝飾器 , 上下文管理器和中間件 (用于網絡應用程序)來計算和報告指標。 在演示1和演示2中,我們在Flask應用程序中使用了裝飾器。
推和推模型用于指標報告
本質上,從Python應用程序報告指標有兩種模式。 在拉模型中,監視系統在預定義的HTTP端點“刮”應用程序。 在推送模型中,應用程序將數據發送到監視系統。
Prometheus是在拉模型中工作的監視系統的一個示例。 StatsD是監視系統的示例,其中應用程序將度量標準推送到系統。
整合統計數據
要將StatsD集成到Python應用程序中,我們將使用StatsD Python客戶端 ,然后更新指標報告代碼,以使用適當的庫調用將數據推送到StatsD中。
首先,我們需要創建一個client實例:
statsd = statsd.StatsClient(host='statsd', port=8125, prefix='webapp1')prefix關鍵字參數會將指定的prefix添加到通過此客戶端報告的所有指標。
有了客戶后,我們可以使用以下方法報告timer的值:
statsd.timing(key, resp_time)要增加計數器:
statsd.incr(key)為了將元數據與度量相關聯,將密鑰定義為metadata1.metadata2.metric ,其中每個metadataX都是一個允許聚合和分組的字段。
演示應用程序StatsD是將Python Flask應用程序與statsd集成的完整示例。
整合普羅米修斯
要使用Prometheus監視系統,我們將使用Promethius Python客戶端 。 我們將首先創建適當的度量標準類的對象:
REQUEST_LATENCY = Histogram ( 'request_latency_seconds' , 'Request latency' ,[ 'app_name' , 'endpoint' ]
)
上述語句中的第三個參數是與度量標準關聯的labels 。 這些labels定義了與單個指標值關聯的元數據。
記錄特定的度量觀察值:
REQUEST_LATENCY. labels ( 'webapp' , request. path ) . observe ( resp_time )下一步是在我們的應用程序中定義Prometheus可以抓取的HTTP端點。 這通常是一個稱為/metrics的端點:
@app.route('/metrics')def metrics():
return Response(prometheus_client.generate_latest(), mimetype=CONTENT_TYPE_LATEST)
演示應用程序Prometheus是將Python Flask應用程序與prometheus集成的完整示例。
哪個更好:StatsD或Prometheus?
下一個自然的問題是:我應該使用StatsD還是Prometheus? 我已經寫了一些有關該主題的文章,您可能會發現它們很有用:
- 使用Prometheus監視多進程Python應用程序的選項
- 使用Prometheus監視同步Python Web應用程序
- 使用Prometheus監視異步Python Web應用程序
指標使用方式
我們已經了解了為什么要在應用程序中設置監視,但是現在讓我們更深入地研究其中兩個:警報和自動縮放。
使用指標進行警報
指標的主要用途是創建警報。 例如,如果過去五分鐘內HTTP 500的數量增加,則可能要向相關人員發送電子郵件或尋呼通知。 我們用于設置警報的方式取決于我們的監視設置。 對于Prometheus,我們可以使用Alertmanager ;對于StatsD,我們可以使用Nagios 。
使用指標進行自動縮放
指標不僅可以讓我們了解我們當前的基礎架構是否配置過多或不足,還可以幫助在云基礎架構中實施自動擴展策略。 例如,如果過去五分鐘我們服務器上的工作進程使用率通常達到90%,則我們可能需要水平擴展。 我們如何實施擴展取決于云基礎架構。 默認情況下,AWS Auto Scaling允許根據系統CPU使用率,網絡流量和其他因素來擴展策略。 但是,要使用應用程序指標來按比例放大或縮小,我們必須發布自定義CloudWatch指標 。
多服務架構中的應用程序監視
當我們超越單一應用程序體系結構(例如,客戶端請求可以觸發對多個服務的調用,然后再將響應發送回)時,我們需要指標中的更多內容。 我們需要統一的延遲指標視圖,以便我們可以看到每個服務花費多少時間來響應請求。 這可以通過分布式跟蹤啟用。
您可以在我的博客文章通過Zipkin在Python應用程序中介紹分布式跟蹤中看到一個Python中的分布式跟蹤示例。
要記住的要點
總之,請確保記住以下幾點:
- 了解指標類型在監控系統中的含義
- 知道監視系統需要什么度量單位的數據
- 監控應用程序中最關鍵的組件
- 在最關鍵的階段監視應用程序的行為
以上假設您不必管理監視系統。 如果這是您工作的一部分,那么您還有很多事情要考慮!
其他資源
以下是我發現在監視教育過程中非常有用的一些資源:
一般
- 監控分布式系統
- 可觀察性和監控最佳實踐
- 誰想要幾秒鐘?
StatsD /石墨
- StatsD指標類型
普羅米修斯
- 普羅米修斯度量類型
- 普羅米修斯量規如何工作?
- 為什么普羅米修斯直方圖是累積的?
- 監控Python中的批處理作業
- Prometheus:在SoundCloud進行監聽
避免錯誤(例如,第3階段的學習)
當我們學習監控的基礎知識時,務必要注意我們不想犯的錯誤。 這是我遇到的一些有見地的資源:
- 如何不測量延遲
- 普羅米修斯的直方圖:一個災難的故事
- 為什么平均吸吮和百分位數很棒
- 您所知道的有關延遲的一切都是錯誤的
- 誰改變了我的第99個百分點的延遲?
- 日志,指標和圖形
- HdrHistogram:更好的延遲捕獲方法
要了解更多信息,請參加阿米特·薩哈(Amit Saha)的演講, 計數器,量規,上限90,哦,我的天! ,在PyCon克利夫蘭2018年 。
翻譯自: https://opensource.com/article/18/4/metrics-monitoring-and-python
python 監控
總結
以上是生活随笔為你收集整理的python 监控_了解指标并使用Python进行监控的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GISer还有机会屌丝逆袭吗?
- 下一篇: PHP随机生成一个8位的纯数字编号