我理解了 prometheus 的使用方式,并使用 django-prometheus 进行了尝试

因为没有找到多少关于django-prometheus的文章,所以我自己试了试。
因为之前没有接触过prometheus,所以我尝试跟着一起学习。

简介

image.png

苦恼不已

因为一开始我以为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的端点是否被正确识别。

image.png

只要在Prometheus容器中可见,那么这里出现的端点就可以了。

返回顶部,打开“在光标处插入度量单位”的选择菜单,并选择一个合适的选项。

image.png

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

如果以 `django_http_requests_total_by_method_total` 为例。

image.png

我试着用Grafana看一下。

登录 Grafana

账号/密码都是admin。

选择”配置 > 数据源”

image.png

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

http://prometheus_prometheus_1:9090
image.png

你可以试着询问一下

image.png

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

image.png

试试获取更多关于Django的项目。

手册
https://github.com/korfuri/django-prometheus 的使用手册

很简单。

如果要获取数据库的状态

image.png

只需要一种选项:将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'),
    },
}

如果选择使用模型的话

image.png

在 models.Model 前加上一个足够就好。

class Dog(models.Model):

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

from django_prometheus.models import ExportModelOperationsMixin
class Dog(ExportModelOperationsMixin('dog'), models.Model):

每个模型都能看到动作。太厉害了。

image.png

结束了!

bannerAds