前言
運維工程師的3大核心職能:服務器資源管理、變更管理、故障管理;
目前開發了一些云原生專案,這些專案采用K8s部署,我想通過1款監控系統對
- 物理服務器層
- K8s集群層
- 運行在K8s集群之上的基礎設施類應用+業務類應用(應用層)
進行全方位無死角監控;
一款監控系統軟體應具備以下核心功能
- 資料采集:通過pull/push的方式采集資料
- 資料存盤:SQL、NoSQL(K/V、Document、Colum列式存盤、TSDB時序資料庫)
- 展示:Grafana
- 告警:通過各種媒介(E-maill、短信、微信、釘釘)通知到報警接收人
一、Prometheus監控系統概述
Prometheus是前Goole工程師模仿Goole的Brogmon監控系統,而開發出來開源監控系統;
Kubernets是參考Goole的Borg系統開發的容器編排工具,所以Promeytheus更適用于監控Kubernets集群;
Prometheus的優勢
- Metric有獨創的指標格式
- 多維度標簽,每個獨立的標簽組合都代表1個獨立的時間序列
- 內建時序資料的聚合、切割、切片功能
- 支持雙精度浮點型資料,但無法存盤日志
- 被監控端自動發現
- 資料時序存盤:Prometheus內置TSDB,通過PromQL進行TSDB的查詢
Prometheus的劣勢
- 無法存盤日志,使用Lock或者ELK/EFK收集日志;
- Prometheus內建的時序(Time Series)資料庫只能存盤1個月歷史資料;
二、Prometheus監控系統組成

PrometheusServer
PrometheusServer無需配置,既可自動發現待監控的目標物件Target;
PrometheusServer的Retrieval(監控資訊采集器) 只能通過Pull的方式,從被監控端拉取監控資料;
PushGateway
如果Prometheus的被監控端是1些短期存在的應用程式, 只能通過Push的方式推送報警,可以借助PushGateway組件;
被監控端推送(Push)監控資料到PushGateway,PrometheusServer的Retrieval(監控資訊采集器) 通過Pull的方式,從PushGateway拉取監控資料;
AlertManager
PrometheusServer只能產生報警資料但無法告警,PrometheusServer通過Push的方式,向AlertManager組件推送告警資訊;
AlertManager再把各種告警資訊,通過各種告警媒介,通知到各種告警接收人;
Exporter
凡是可以對外向PrometheusServer出口監控資料的程式都可以成為1個Exporter,1個Exporter的實體稱為1個PromethusTarget;
Exporter也稱為指標暴露器,針對于沒有內置儀表盤、沒有內建測量系統的被監控應用程式,就需要對接1個Exporter監控代理程式,Exporter監控代理可以出口該應用程式監控資料(轉換成PrometheusServer可支持的資料格式),以便于該應用程式可以被PrometheusServer所Pull;
遠端TSDB
資料就是金礦,但Prometheus內建的時序(Time Series)資料庫只能存盤1個月歷史資料;
如果想要保存更長時間的歷史監控資料可以使用遠端的TSDB例如InfluxDB,對歷史告警資料進行長期存盤;
有了大量的歷史告警資料以及日志,就可以通過機器學習技術,做告警趨勢預測,最終達成智能運維目標;
自定義Exporter
Exporter來源主要2個方面,1是Prometheus社區提供的,2是用戶自定義的;
基礎設施類應用監控:MySQL/Redis/Nginx.......都可以從Prometheus社區獲取相應的Exporter
業務類應用的監控(應用程式內置儀表板): 如果程式員自己開發的程式,運行程序中出現了Exception如何隨時隨地告警呢?我自定義了1個Exporter集成到代碼中;
import prometheus_client from prometheus_client import Gauge from prometheus_client.core import CollectorRegistry from flask import Response, Flask app = Flask(__name__) REGISTRY = CollectorRegistry(auto_describe=False) # 撰寫Prom陳述句并定義監控指標 test1 = Gauge( "test1", # 自定義監控指標1的名稱 "程式例外1", registry=REGISTRY) test2 = Gauge( "test2", # 自定義監控指標2的名稱 "程式例外2", registry=REGISTRY) @app.route('/metrics') def metrics(): # 將引數傳入監控項內 test1.set(12) test2.set(13) return Response(prometheus_client.generate_latest(REGISTRY), mimetype="text/plain") @app.route('/') def index(): return "<h1>Customized Exporter</h1><br> <a href='https://www.cnblogs.com/sss4/archive/2022/11/14/metrics'>Metrics</a>" if __name__ == "__main__": app.run(host='0.0.0.0', port=9100, debug=True)Python程式自定義Exporter
這樣PrometheusServer就可以來拉取(Pull)Exporter代理記錄好的告警指標了;
參考
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/533534.html
標籤:其他
上一篇:openGL庫環境簡單配置
下一篇:一次金融APP的解密歷程
