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

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

  • 相关阅读:
    [HDU5184] Brackets
    L2-036 网红点打卡攻略 (25 分)
    L2-017 人以群分 (25 分)
    L2-029 特立独行的幸福 (25 分)
    L2-035 完全二叉树的层序遍历 (25 分)
    L2-031 深入虎穴 (25 分)
    L2-020 功夫传人 (25 分)
    第 50 场双周赛
    L2-027 名人堂与代金券 (25 分)
    L2-024 部落 (25 分)
  • 原文地址:https://www.cnblogs.com/Zhao159461/p/13180876.html
Copyright © 2020-2023  润新知