Prometheus和Django項目增加prometheus與grafana
1.什么是Prometheus?
prom存儲的是一個時序數據,即按照相同時序(相同名稱和標簽),時間維度存儲連續數據的集合;
時序是有名字(metrics)以及一組的key/value標簽定義的,具有相同名字以及標簽屬於相同時序。
-
prom的特點:
多維度的數據模型
靈活的查詢語句
不依賴於分布式存儲,單個服務器節點是自主的
通過基於HTTP的pull方式采集時序數據
可以用過中間件網關進行或者靜態配置來發現目標服務對象
支持多種多樣的圖標和界面展示,比如grafana等等
-
prom的基本原理:
prom的基本原理是通過HTTP協議周期性抓取被監控組件的狀態,任意組件只要提供對應的HTTP的接口就可以直接進入監控,不需要任何的SDK或者其他的集成過程非常適合做虛擬化環境監控系統,比如VM,Docker,K8S等,輸出被監控組件信息的HTTP的接口被叫做exporter
-
prom的服務過程:
- prometheus daemon負責定時去目標抓取metrics(指標)數據,那個抓取目標需要要暴露一個http服務的接口給它定時抓取,prom支持配置文件,文本文件,Zookeeper等方式進行抓取目標,prom采用pull方式監控,即服務器可以直接通過目標pull數據或者間接通過中間網關來push數據;
- prom在本地存儲抓取的所有數據,並通過一定規則進行清洗和整理數據,並得到的結果存儲到新的時間序列中;
- prom通過promql和其他的可視化地展示收集數據。prom支持很多種表可視化,例如grafana,自帶的promdash以及自身提供的模版引擎等等。prom還提供了HTTP API的查詢方式
- PushGateway支持client主動推送的metrics到pushgateway,而prom只是定時去gateway上抓取數據
- alertmanager是獨立於prom的一個組件,可以支持prom的查詢語句,提供十分靈活的報警方式;
2.Prometheus工作流程:
監控服務可以監控每一項具體事務,大到整個服務器,小到一個進程,一個數據庫,或者是一個系統的單元;
首先,我們需要理解Prometheus服務本身,另一個是監控本身;
其次,怎么實現監控到我們監控的對象?
-
如果需要被監控到自己的服務,需要我們服務設置endpoint暴露給Prometheus,暴露的endpoint里面會有一組監控的數據名字和當前值;
-
為了方便監控,Prometheus提供了客戶端的庫(Go/Python/Ruby/Java)
-
Prometheus本身提供UI界面,可以通過查詢語言PromQL,查詢你想要的監控數據;
-
Grafana將Prometheus數據可視化;
3.Django暴露監控數據
-
pip install Django-prometheus
安裝django-prometheus -
配置文件中加入:
# settings.py BASE_INSTALLED_APPS = [ ..., "django-prometheus", ] MIDDLEWARE = [ "django_prometheus.middleware.PrometheusBeforeMiddleware", ... "django_prometheus.middleware.PrometheusAfterMiddleware" ]
-
監控url
urlpatterns = [ ... url('/',include('django_prometheus.urls')), ... ]
-
組態:
Prometheus使用基於直方圖的分組來監視延遲。默認的存儲桶在: https : //github.com/prometheus/client_python/blob/master/prometheus_client/core.py 您可以為延遲定義自定義存儲桶,添加更多存儲桶會降低性能,但會提高准確性:https://prometheus.io/docs/practices/histograms/
-
監控數據庫
可以監視SQLite,MySQL,PostgreSQL數據庫,只需要替換原來的屬性
ENGINE
,替換Django.db.backends
成django_prometheus.db.backends
.DATABASE = { 'default':{ 'ENGINE':'django_prometheus.db.backends.sqlite3', 'NAME':os.path.join(BASE_DIR,'db.sqlite3') } }
-
監控緩存:
可以監控基於文件的內容緩存,redis緩存,只需要更換由django_prometheus緩存的backend,替換
django.core.cache.backends
成django_prometheus.cache.backends
CACHES = { 'default':{ 'BACKEND':'django_prometheus.cache.backends.filebased.FileBaseCache', 'LOCATION':'var/tmp/django_cache', } }
-
監控models
如果想監控模型的創建、刪除、更新頻率,這樣可以增加一個mixin到模型中,向已經存在的模型類增加是安全的,因為不需要進行migration;
如果你的模型是:
class UserInfo(models.Model): name = models.CharField(max_length=100, unique=True) age = models.PositiveIntegerField(blank=True, null=True)
增加
ExportModelOperationsMixin
替換成:from django_prometheus.models import ExportModelOperationMixin class UserInfo(ExportModelOperationMixin('userinfo'), models.Model): name = models.CharField(max_length=100, unique=True) age = models.PositiveIntegerField(blank=True, null=True)
導出3個metrics,
Django_model_inserts_total{model='userinfo'}
,django_model_updates_total{model='user info'}
,django_model_deletes_total{model='userinfo'}
請注意,導出的指標是在當前流程中完成的創建,修改和刪除的計數器。它們不是模型中對象數量的度量。