我理解了 prometheus 的使用方式,并使用 django-prometheus 进行了尝试
因为没有找到多少关于django-prometheus的文章,所以我自己试了试。
因为之前没有接触过prometheus,所以我尝试跟着一起学习。
简介

苦恼不已
因为一开始我以为django-prometheus是代理,所以完全无法理解,纠结了一段时间。但实际上django-prometheus只是提供API,而prometheus会从该API获取数据。
尝试运行django-prometheus。
教程
https://docs.timescale.com/latest/tutorials/tutorial-howto-monitor-django-prometheus
mkdir django-prometheus
cd django-prometheus
python -m pip install Django
django-admin startproject mysite
cd mysite
python manage.py runserver
# ctrl + c
python -m pip install django-prometheus
编辑settings.py文件。在middleware部分插入现有的设置。必须在开头和结尾位置。请注意。
INSTALLED_APPS = [
...
'django_prometheus',
...
]
MIDDLEWARE = [
'django_prometheus.middleware.PrometheusBeforeMiddleware',
# All your other middlewares go here, including the default
# middlewares like SessionMiddleware, CommonMiddleware,
# CsrfViewmiddleware, SecurityMiddleware, etc.
'django_prometheus.middleware.PrometheusAfterMiddleware',
]
from django.conf.urls import url, include
urlpatterns = [
...
url('', include('django_prometheus.urls')),
]
Django 启动
python manage.py runserver 0.0.0.0:8000
curl localhost:8000/metrics
只要在浏览器中能看到 /metrics 就可以
启动 Prometheus / Grafana
我会直接使用这个很棒的compose。虽然也会启动不相关的容器,但为了学习,我会保持它们一起启动。
请参考以下链接:
https://github.com/vegasbrianc/prometheus/blob/master/docker-compose.yml
首先,拿掉音量按键然后启动。
#https://github.com/vegasbrianc/prometheus/blob/master/docker-compose.yml
version: '3.7'
volumes:
prometheus_data: {}
grafana_data: {}
networks:
front-tier:
back-tier:
services:
prometheus:
image: prom/prometheus:v2.1.0
# volumes:
# - ./prometheus/:/etc/prometheus/
# - prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
- '--web.console.templates=/usr/share/prometheus/consoles'
ports:
- 9090:9090
links:
- cadvisor:cadvisor
- alertmanager:alertmanager
# - pushgateway:pushgateway
depends_on:
- cadvisor
# - pushgateway
networks:
- back-tier
restart: always
# deploy:
# placement:
# constraints:
# - node.hostname == ${HOSTNAME}
node-exporter:
image: prom/node-exporter
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- --collector.filesystem.ignored-mount-points
- "^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)"
ports:
- 9100:9100
networks:
- back-tier
restart: always
deploy:
mode: global
alertmanager:
image: prom/alertmanager
ports:
- 9093:9093
# volumes:
# - ./alertmanager/:/etc/alertmanager/
networks:
- back-tier
restart: always
command:
- '--config.file=/etc/alertmanager/config.yml'
- '--storage.path=/alertmanager'
# deploy:
# placement:
# constraints:
# - node.hostname == ${HOSTNAME}
cadvisor:
image: google/cadvisor
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
ports:
- 8080:8080
networks:
- back-tier
restart: always
deploy:
mode: global
grafana:
image: grafana/grafana
user: "472"
depends_on:
- prometheus
ports:
- 3000:3000
# volumes:
# - grafana_data:/var/lib/grafana
# - ./grafana/provisioning/:/etc/grafana/provisioning/
# env_file:
# - ./grafana/config.monitoring
networks:
- back-tier
- front-tier
restart: always
# pushgateway:
# image: prom/pushgateway
# restart: always
# expose:
# - 9091
# ports:
# - "9091:9091"
# networks:
# - back-tier
一旦启动后,为了更改prometheus的配置,需要复制现有文件。
docker cp prometheus_prometheus_1:/etc/prometheus .
vim prometheus/prometheus.yml
将 django-prometheus 正在运行的终端点放入最后一行的目标中。
我们不需要 /metrics (默认情况下,每个人都会从那里获取,已经写明了)。
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090', '192.168.1.2:8000'] <------ ここにdjango-prometheusが動いてるサーバを足す
然后,更改 volumes 以加载该 prometheus.yml 文件,并重新创建。
services:
prometheus:
image: prom/prometheus:v2.1.0
volumes: <------------- ここだけ
- ./prometheus/:/etc/prometheus/ <------------- 変える
# - prometheus_data:/prometheus
普羅米修斯行動驗證
用浏览器打开 prometheus
打开菜单,选择状态 > 目标
如果Prometheus在本地上,则可以使用“http://localhost:9090/targets”打开。
确认Django的端点是否被正确识别。

只要在Prometheus容器中可见,那么这里出现的端点就可以了。
返回顶部,打开“在光标处插入度量单位”的选择菜单,并选择一个合适的选项。

按下“执行”按钮 → 如果有返回值,则表示正常。
如果以 `django_http_requests_total_by_method_total` 为例。

我试着用Grafana看一下。
登录 Grafana
账号/密码都是admin。
选择”配置 > 数据源”

按下“添加数据源”按钮,选择Prometheus。
在URL栏中输入可以由docker网络访问的Prometheus的URL,然后保存并测试即可。
http://prometheus_prometheus_1:9090

你可以试着询问一下

当看到图表时,表示成功!

试试获取更多关于Django的项目。
手册
https://github.com/korfuri/django-prometheus 的使用手册
很简单。
如果要获取数据库的状态

只需要一种选项:将mysql或任何其他东西转换为django,仅仅改为django_prometheus。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
}
↓↓↓↓↓↓↓↓↓↓↓↓↓↓
DATABASES = {
'default': {
'ENGINE': 'django_prometheus.db.backends.sqlite3', <-------
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
}
如果选择使用模型的话

在 models.Model 前加上一个足够就好。
class Dog(models.Model):
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
from django_prometheus.models import ExportModelOperationsMixin
class Dog(ExportModelOperationsMixin('dog'), models.Model):
每个模型都能看到动作。太厉害了。

结束了!