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'}
请注意,导出的指标是在当前流程中完成的创建,修改和删除的计数器。它们不是模型中对象数量的度量。