Django中的監控組件Prometheus


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服務本身,另一個是監控本身;

image-20200728193306046

其次,怎么實現監控到我們監控的對象?
  1. 如果需要被監控到自己的服務,需要我們服務設置endpoint暴露給Prometheus,暴露的endpoint里面會有一組監控的數據名字和當前值;

  2. 為了方便監控,Prometheus提供了客戶端的庫(Go/Python/Ruby/Java)

  3. Prometheus本身提供UI界面,可以通過查詢語言PromQL,查詢你想要的監控數據;

  4. Grafana將Prometheus數據可視化;

3.Django暴露監控數據

  1. pip install Django-prometheus 安裝django-prometheus

  2. 配置文件中加入:

    # settings.py
    BASE_INSTALLED_APPS = [
      ...,
      "django-prometheus",
    ]
    MIDDLEWARE = [
      "django_prometheus.middleware.PrometheusBeforeMiddleware",
      ...
      "django_prometheus.middleware.PrometheusAfterMiddleware"
    ]
    
  3. 監控url

    urlpatterns = [
    ...
      url('/',include('django_prometheus.urls')),
     ...
    ]
    
  4. 組態:

    Prometheus使用基於直方圖的分組來監視延遲。默認的存儲桶在:
    https : //github.com/prometheus/client_python/blob/master/prometheus_client/core.py
    
    您可以為延遲定義自定義存儲桶,添加更多存儲桶會降低性能,但會提高准確性:https://prometheus.io/docs/practices/histograms/
    
    
    
  5. 監控數據庫

    可以監視SQLite,MySQL,PostgreSQL數據庫,只需要替換原來的屬性ENGINE,替換Django.db.backendsdjango_prometheus.db.backends.

    DATABASE = {
      'default':{
        'ENGINE':'django_prometheus.db.backends.sqlite3',
        'NAME':os.path.join(BASE_DIR,'db.sqlite3')
      }
    }
    
  6. 監控緩存:

    可以監控基於文件的內容緩存,redis緩存,只需要更換由django_prometheus緩存的backend,替換django.core.cache.backendsdjango_prometheus.cache.backends

    CACHES = {
      'default':{
        'BACKEND':'django_prometheus.cache.backends.filebased.FileBaseCache',
        'LOCATION':'var/tmp/django_cache',
      }
    
    }
    
  7. 監控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'}

    請注意,導出的指標是在當前流程中完成的創建,修改和刪除的計數器。它們不是模型中對象數量的度量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM