Django集成Prometheus+Grafana

node-exporter部署

Prometheus的相关文章我在前面已经写过蛮多的了、关于 Prometheus 的基础知识这里我就不再详细描述了;感兴趣的小伙伴可以在我的博客首页自行搜索。今天我们来讲一讲Django是如何集成 Prometheus 实现监控告警的。这里我们为了方便测试、我们通过 Docker 快速部署 Prometheus和Grafana。为了方便数据采集、我们还需要把 node-exporter 部署好;开始之前我们先去把需要的 Docker 镜像拉取到本地。

docker pull prom/node-exporter
docker pull prom/prometheus
docker pull grafana/grafana

注:相关镜像也可以直接查看docker官方库:https://hub.docker.com/

然后我们通过下面的命令快速启动node-exporter:

docker run -d -p 9100:9100 \
  -v "/proc:/host/proc:ro" \
  -v "/sys:/host/sys:ro" \
  -v "/:/rootfs:ro" \
  --net="host" \
  prom/node-exporter

这里我们采用9100端口来暴露node-exporter、命令执行完成以后我们来查看一下服务是否已经正常启动:

[root@ZabbixServer ~]# docker ps -a | grep node-exporter
a9d3039079bf   prom/node-exporter   "/bin/node_exporter"   9 hours ago   Up 9 hours    peaceful_payne
[root@ZabbixServer ~]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5234/nginx: worker
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      6027/sshd
tcp6       0      0 :::9100                 :::*                    LISTEN      26039/node_exporter
tcp6       0      0 :::22                   :::*                    LISTEN      6027/sshd
[root@ZabbixServer ~]# 

从上面我们可以看到node-exporter已经正常启动、我们可以去http://172.16.200.110:9100/metrics;从下图我们可以看到node-exporter已经开始采集数据了、有了这些基础数据我们就可以做数据展示了:

image-20210202213102474

Prometheus 部署

下面我们就可以来安装 Prometheus 了、这里我们来编排一个yml文件、内容如下:

# 创建yaml文件
mkdir /opt/prometheus
cd /opt/prometheus/
vim prometheus.yml

# Yaml文件
global:
  scrape_interval:     60s
  evaluation_interval: 60s

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ['172.16.200.110:9090']
        labels:
          instance: prometheus

  - job_name: node-exporter
    static_configs:
      - targets: ['172.16.200.110:9100']
        labels:
          instance: node-exporter

然后我们通过Docker命令来启动prometheus:

docker run  -d \
  -p 9090:9090 \
  -v /opt/prometheus/prometheus.yml  \
  prom/prometheus \
  --web.enable-lifecycle \
  --web.enable-admin-api \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/prometheus \
  --web.console.libraries=/usr/share/prometheus/console_libraries

注:默认的 Prometheus 是不开启 enable-lifecycle 的、这里我们为了方便后面的热更新、我们把 web.enable-lifecycle 和 web.enable-admin-api 等配置开启。

创建完成我们来查看服务是否已经正常启动:

[root@ZabbixServer ~]# docker ps -a | grep prometheus
44c5a06b1243   prom/prometheus   "/bin/prometheus --c…"   9 hours ago    Up 9 hours    0.0.0.0:9090->9090/tcp   nice_sutherland
[root@ZabbixServer ~]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5234/nginx: worker  
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      6027/sshd                
tcp6       0      0 :::9100                 :::*                    LISTEN      26039/node_exporter 
tcp6       0      0 :::22                   :::*                    LISTEN      6027/sshd           
tcp6       0      0 :::9090                 :::*                    LISTEN      26876/docker-proxy  
[root@ZabbixServer ~]# 

prometheus服务启动正常以后我们可以直接去访问http://172.16.200.110:9090/targets,从下图我们可以看到两个Targets的state状态是UP、然后我们去安装Grafana。

image-20210202220115840

Grafana部署

Grafana需要做数据持久化、不然我们重启Grafana服务以后所以的配置信息将会丢失。我们在opt目录下面新建一个名为grafana-storage的空文件夹用来做数据持久化。

# 新建空文件夹grafana-storage,用来做数据持久化
mkdir /opt/grafana-storage

# 设置权限
chmod 755 -R /opt/grafana-storage
# 注:因为grafana用户会在这个目录写入文件,直接设置755。

然后我们通过下面的Docker命令来创建grafana:

docker run -d \
  -p 3000:3000 \
  --name=grafana \
  -v /opt/grafana-storage:/var/lib/grafana \
  grafana/grafana

创建完成我们再次来查看服务是否已经正常启动:

[root@ZabbixServer ~]# docker ps -a | grep grafana
106d1f3b35f2   grafana/grafana                        "/run.sh"                10 hours ago    Up 10 hours                 0.0.0.0:3000->3000/tcp              grafana
[root@ZabbixServer ~]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5234/nginx: worker  
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      6027/sshd             
tcp6       0      0 :::9100                 :::*                    LISTEN      26039/node_exporter 
tcp6       0      0 :::22                   :::*                    LISTEN      6027/sshd           
tcp6       0      0 :::3000                 :::*                    LISTEN      27231/docker-proxy  
tcp6       0      0 :::9090                 :::*                    LISTEN      29542/docker-proxy  
[root@ZabbixServer ~]#

我们通过http://172.16.200.110:3000/login去访问Grafana、默认的账号密码都是admin;登录之后Grafana会要求我们重置密码、我们连续两次输入新密码就可以直接跳转到Grafana首页:

image-20210202221255392

image-20210202221337119

Django-Prometheus部署

Prometheus社区已经为许多技术栈(Nodejs,Spring Boot,Django等等)准备好了许多开源的第三方库,这些第三方库你可以直接拿来使用。而Django-Prometheus 正是 Prometheus.io 上用来监控应用程序并监视一些数据的 Django 控件;它可以将Django的监控数据暴露给Prometheus。

我们先去虚拟环境里面安装 django-prometheus ,安装完成以后我们需要去 settings.py 文件里面(这里我把配置内容引入到 settings/pro_settings.py 文件中)注册 django-prometheus APP;并把django-prometheus相关的中间件注册进来。具体如下:

INSTALLED_APPS = [
   ...
   'django_prometheus',
   ...
]

MIDDLEWARE = [
    'django_prometheus.middleware.PrometheusBeforeMiddleware',
    ......
    'django_prometheus.middleware.PrometheusAfterMiddleware',
]

注:这里需要注意一下、我们需要在把django-prometheus的中间件引入MIDDLEWARE的最上方和最下方;这样django-prometheus才可以正常采集到我们需要的数据。

然后我们把django-prometheus的URL配置进来:

urlpatterns = [
    ...
    path('', include('django_prometheus.urls')),
]

配置完成之后我们通过 systemctl restart datasite_uwsgi 重启django应用;然后我们去访问 http://172.16.200.111:8000/metrics:

image-20210203170519583

从上图我们可以看到、我们现在已经可以正常拿到 django-prometheus 采集的 metrics了。这里因为我的 Django 应用部署在另外一台主机上;Grafana+Prometheus+node-exporter在一台机器上。前面我们已经开启了 Prometheus 的热更新功能、我们现在进入 docker 容器里面去修改yaml文件;docker 容器的 yaml 文件路径为:/etc/prometheus/prometheus.yml 、具体操作如下:

# 进入容器内部修改yaml文件
[root@ZabbixServer ~]# docker ps -a | grep prom
6c5e1fde5524   prom/prometheus   "/bin/prometheus --w…"   3 hours ago    Up 3 hours   0.0.0.0:9090->9090/tcp  vibrant_nightingale
a9d3039079bf   prom/node-exporter    "/bin/node_exporter"   33 hours ago   Up 33 hours   peaceful_payne
[root@ZabbixServer ~]# docker exec -it -u root 6c5e1fde5524 /bin/sh
/prometheus # vi /etc/prometheus/prometheus.yml 
/prometheus # exit
[root@ZabbixServer ~]# 

# yaml文件内容如下
global:
  scrape_interval:     60s
  evaluation_interval: 60s

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ['172.16.200.110:9090']
        labels:
          instance: prometheus

  - job_name: node-exporter
    static_configs:
      - targets: ['172.16.200.110:9100']
        labels:
          instance: node-exporter

  # Django主机
  - job_name: node-exporter-datasite
    static_configs:
      - targets: ['172.16.200.111:9100']
        labels:
          instance: node-exporter-datesite

  # Django应用
  - job_name: datasite
    static_configs:
      - targets: ['172.16.200.111:8000']
        labels:
          instance: datesite

# 在线热更新
curl -X POST "http://172.16.200.110:9090/-/reload"

注:这里我单独再Django主机上部署了 node-exporter 用来采集 Django主机的基础数据进行监控。

从下图我们可以看到、热更新完成之后 Prometheus 已经成功拿到了两个 Targets 且 State 状态是 UP。

image-20210203204956955

现在我们去Grafana里面把Prometheus的数据源添加进来、然后我们添加一个9528的Dashboard;然后我们直接去查看刚才添加的Dashboard已经有数据上来了。

image-20210203210835415

image-20210203211007136

image-20210203210735223

推荐文章