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'}

    请注意,导出的指标是在当前流程中完成的创建,修改和删除的计数器。它们不是模型中对象数量的度量。

原文地址:https://www.cnblogs.com/Zhao159461/p/13180876.html