Prometheus监控栈 监控docker和进程

监控docker,Prometheus监控栈:Prometheus+Grafana+Alertmanager

一、概述

1.1 监控docker的意义

基于程序运行的性能、便捷性、隔离性等优点,docker程序事实上已经成为了企业云原生部署的标准选择。那么docker环境是否稳定docker上运行的各类容器程序cpu使用率、内存使用、网络、磁盘空间等性能参数,就非常有必要。

1.2 docker stats命令

最简单的docker容器性能监控命令是

复制代码
[root@localhost docker-compose]# docker stats
CONTAINER ID   NAME                CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDS
140431bf950a   rabbitmq-exporter   0.00%     17.18MiB / 1.698GiB   0.99%     21.3kB / 16.9kB   19.1MB / 0B       9
511fd54a30ee   rabbitmq            0.12%     81.42MiB / 1.698GiB   4.68%     7.54kB / 14.8kB   89MB / 5.47MB     88
5d4431494b53   redis_exporter      0.00%     16.65MiB / 1.698GiB   0.96%     50.8kB / 23.7kB   19MB / 0B         8
7c5ed9c5bcb3   redis               0.12%     11.01MiB / 1.698GiB   0.63%     7.44kB / 44.6kB   25MB / 0B         5
abfbeea9c8b2   tomcat              0.06%     122.3MiB / 1.698GiB   7.03%     21.3kB / 131kB    140MB / 324kB     34
a677312e0a4f   mysql               0.57%     403.5MiB / 1.698GiB   23.20%    16.6kB / 194kB    159MB / 34.7MB    38
4cf34c624eb3   mongo               0.52%     83.96MiB / 1.698GiB   4.83%     42kB / 412kB      116MB / 1.08MB    35
fa9c15e17146   nginx               0.00%     5.066MiB / 1.698GiB   0.29%     5.36kB / 2.82kB   18.5MB / 8.19kB   2
e91b588c19b1   nginx-exporter      0.00%     6.164MiB / 1.698GiB   0.35%     7.02kB / 6.98kB   1.72MB / 0B       7
546daf48ef30   mysqld_exporter     0.00%     11.1MiB / 1.698GiB    0.64%     200kB / 82.7kB    18.9MB / 0B       7
65a825b21669   mongodb_exporter    0.01%     18.16MiB / 1.698GiB   1.04%     420kB / 117kB     28.2MB / 0B       5
#这里是实时监控的

1.3 基于cAdvisor组件的docker容器监控

之前prometheus部罢时,已经安装了prometheus、node_exporter以及cAdvisor(监控容器)的组件。yaml的回顾

复制代码
  #监控docker容器
  cadvisor:  #它是整个监控栈的"容器资源探针",专门负责自动收集宿主机上所有运行容器的实时性能数据。监控容器
    image: m.daocloud.io/gcr.io/cadvisor/cadvisor:v0.47.2
    container_name: cadvisor #指定容器名称,便于管理。
    restart: always   #确保服务中断后自动重启。
    privileged: true
    devices: 
      - /dev/kmsg
    volumes:
      - /etc/localtime:/etc/localtime:ro #同步宿主机时间
      - /:/rootfs:ro  #挂载宿主机根目录(只读)。cAdvisor从这里读取主机整体的文件系统使用情况、容器镜像层等信息。
      - /var/run:/var/run:rw #挂载Docker运行时目录(读写)。这是唯一需要读写权限的挂载。cAdvisor通过该目录下的Unix套接字(如 /var/run/docker.sock)与Docker守护进程通信,动态发现和查询所有容器的详细信息(如状态、配置)。
      - /sys/fs/cgroup:/sys/fs/cgroup:ro #挂载系统信息目录(只读)。/sys 是Linux内核暴露硬件和设备信息的虚拟文件系统,cAdvisor从这里获取CPU、内存、网络设备等全局硬件指标。
      - /var/lib/docker/:/var/lib/docker:ro  #挂载Docker数据目录(只读)。这里存储了容器的镜像、可写层等实际数据,cAdvisor通过分析它来计算各容器的精确磁盘使用量。
    networks:  #加入监控专用网络,使Prometheus能通过 cadvisor:8080 访问其指标接口。
      - monitoring
    expose:   #仅暴露端口给内部网络。但不映射到宿主机。
      - '8080'

二、cAdvisor组件介绍

CAdvisor是谷歌开源的一款用于展示和分析容器运行状态的可视化工具,通过在主机上运行

CAdvisor用户可以轻松的获取到当前主机上容器的运行统计信息,并以图标的形式向用户展示

通过默认的8080端口,可以访问到cAdvisor的数据信息。

2.1 cAdvisor的图形界面暴露

修改prometheus中对自身docker平台的cAdvisor组件配置,露8080端口

cd /data/docker-compose

vi docker-compose.yaml

复制代码
  cadvisor:  #它是整个监控栈的"容器资源探针",专门负责自动收集宿主机上所有运行容器的实时性能数据。
    image: m.daocloud.io/gcr.io/cadvisor/cadvisor:v0.47.2
    container_name: cadvisor #指定容器名称,便于管理。
    restart: always   #确保服务中断后自动重启。
    privileged: true
    devices:
      - /dev/kmsg
    volumes:
      - /etc/localtime:/etc/localtime:ro #同步宿主机时间
      - /:/rootfs:ro  #挂载宿主机根目录(只读)。cAdvisor从这里读取主机整体的文件系统使用情况、容器镜像层等信息。
      - /var/run:/var/run:rw #挂载Docker运行时目录(读写)。这是唯一需要读写权限的挂载。cAdvisor通过该目录下的Unix套接字(如 /var/run/docker.sock)与Docker守护进程通信,动态发现和查询所有容器的详细信息(如状态、配置)。
      - /sys/:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro  #挂载Docker数据目录(只读)。这里存储了容器的镜像、可写层等实际数据,cAdvisor通过分
析它来计算各容器的精确磁盘使用量。
      - /var/run/docker.sock:/var/run/docker.sock:rw
    command:
      - '--docker_only=true'
      - '--housekeeping_interval=10s'
      - '--disable_metrics=percpu,sched,tcp,udp,disk' # 减少一些不常用的指标,降低负载
    networks:  #加入监控专用网络,使Prometheus能通过 cadvisor:8080 访问其指标接口。
      - monitoring
    expose:   #仅暴露端口给内部网络。但不映射到宿主机。
      - '8080'
    ports:
      - '8080:8080'

使用docker-compose重启程序

复制代码
docker-compose up -d

访问cAdvisor的图形界面

复制代码
http://192.168.92.11:8080/containers/

2.2 cAdvisor的监控数据暴露

prometheus中,暴露8080端口后,即可访问到metrics数据(prometheus所需的数据格式)

复制代码
http://192.168.92.11:8080/metrics

2.3 test上cAdvisor的部署

test上,进入docker-compose的目录

vi /data/docker-compose/docker-compose.yaml

复制代码
  #监控docker容器
  cadvisor:  #它是整个监控栈的"容器资源探针",专门负责自动收集宿主机上所有运行容器的实时性能数据。监控容器
    image: m.daocloud.io/gcr.io/cadvisor/cadvisor:v0.47.2
    container_name: cadvisor #指定容器名称,便于管理。
    restart: always   #确保服务中断后自动重启。
    privileged: true
    devices:
      - /dev/kmsg
    volumes:
      - /etc/localtime:/etc/localtime:ro #同步宿主机时间
      - /:/rootfs:ro  #挂载宿主机根目录(只读)。cAdvisor从这里读取主机整体的文件系统使用情况、容器镜像层等信息。
      - /var/run:/var/run:rw #挂载Docker运行时目录(读写)。这是唯一需要读写权限的挂载。cAdvisor通过该目录下的Unix套接字(如 /var/run/docker.sock)与Docker守护进程通信,动态发现和查询所有容器的详细信息(如状态、配置)。
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro  #挂载Docker数据目录(只读)。这里存储了容器的镜像、可写层等实际数据,cAdvisor通过分
析它来计算各容器的精确磁盘使用量。
      - /dev/kmsg:/dev/kmsg  # 关键:挂载内核日志设备
      - /var/run/docker.sock:/var/run/docker.sock:rw
    command:
      - '--docker_only=true'
      - '--housekeeping_interval=10s'
      - '--disable_metrics=percpu,sched,tcp,udp,disk' # 减少一些不常用的指标,降低负载
    expose:   #仅暴露端口给内部网络。但不映射到宿主机。
      - '8080'
    #添加配置,用于暴露8080端口
    ports:
      - '8090:8080'

访问cAdvisor的链接确保可以访问

复制代码
http://192.168.92.12:8090/metrics

2.4 prometheus中增加对于tests的docker平台的监控

cd /data/docker-prometheus/prometheus

vi prometheus.yml

复制代码
  # 3. cAdvisor 容器监控,Google开发的容器监控工具
  - job_name: 'cadvisor'
    scrape_interval: 60s
    static_configs:
      - targets: ['cadvisor:8080']
        labels:
          instance: 'Prometheus服务器'
      - targets: ['192.168.92.12:8090']
        labels:
          instance: 'test服务器的docker监控'

重新加载配置

复制代码
#在prometheus中执行
curl -X POST http://localhost:9090/-/reload

访问192.168.92.11:9090,看看test的cAdvisor有没有up

三、常用的docker监控指标

复制代码
CPU 监控指标
container_cpu_load_average_10s (gauge)

含义:过去10秒容器CPU平均负载

用途:监控容器短期CPU负载情况,反映系统繁忙程度
container_cpu_usage_seconds_total (counter)

含义:容器在每个CPU内核上累计占用时间(单位:秒)

用途:计算CPU使用率的基础指标,需结合时间差计算
container_cpu_system_seconds_total (counter)

含义:System CPU累计占用时间(单位:秒)

用途:监控内核态CPU使用情况,反映系统调用开销
container_cpu_user_seconds_total (counter)

含义:User CPU累计占用时间(单位:秒)

用途:监控用户态CPU使用情况,反映应用代码执行开销
文件系统监控指标
container_fs_usage_bytes (gauge)

含义:容器中文件系统的使用量(单位:字节)

用途:监控容器磁盘空间使用情况
container_fs_limit_bytes (gauge)

含义:容器可以使用的文件系统总量(单位:字节)

用途:了解容器磁盘配额限制
container_fs_reads_bytes_total (counter)

含义:容器累计读取数据的总量(单位:字节)

用途:监控磁盘I/O读取负载,评估读取性能
container_fs_writes_bytes_total (counter)

含义:容器累计写入数据的总量(单位:字节)

用途:监控磁盘I/O写入负载,评估写入性能和磁盘寿命
内存监控指标
container_memory_max_usage_bytes (gauge)

含义:容器的最大内存使用量(单位:字节)

用途:了解历史峰值内存使用情况,用于容量规划
container_memory_usage_bytes (gauge)

含义:容器当前的内存使用量

用途:实时监控内存使用情况,检测内存泄漏
container_spec_memory_limit_bytes (gauge)

含义:容器内存使用量限制

用途:了解容器内存配额,计算使用率
machine_memory_bytes (gauge)

含义:当前主机的内存总量

用途:提供主机资源基准,用于计算整体资源使用率
网络监控指标
container_network_receive_bytes_total (counter)

含义:容器网络累计接收数据总量(单位:字节)

用途:监控入站网络流量,评估带宽使用情况
container_network_transmit_bytes_total (counter)

含义:容器网络累计发送数据总量(单位:字节)

用途:监控出站网络流量,评估带宽使用情况和费用成本
指标类型说明
gauge:瞬时值指标,可增可减,如内存使用量、CPU负载
counter:累积值指标,只增不减(除非重置),如总请求数、总I/O字节数
常用计算公式
CPU使用率:(container_cpu_usage_seconds_total的增量) / (采样时间间隔 × CPU核心数)
内存使用率:container_memory_usage_bytes / container_spec_memory_limit_bytes × 100%
磁盘使用率:container_fs_usage_bytes / container_fs_limit_bytes × 100%
网络吞吐量:container_network_receive/transmit_bytes_total的增量 / 采样时间间隔

四、grafana中添加docker的监控模版

id=11600


哪里都正常,唯独grafana表盘没有数据

prometheus可以查到,cAdvisor - /可以看到,docker stats也可以看到数据进行监控

gemini:这是cadvisor,docker和rhel系统之间的一个版本代差和权限隔离导致的经典坑,prometheus查到的数据没有name的标签

Grafana仪表盘没有数据,最主要的原因 就是使用的那个预设仪表盘(很可能是Grafana官网的"Docker监控"仪表盘,如ID: 193),它的查询语句里依赖 nameimage 等容器标识标签来过滤和分组数据。但是prometheus查询返回的没有name和image标签

这时候只能改一下promql(在图表中点击edit,把PromQL换成下面的,点Run queries,再点Apply)


监控进程,Prometheus监控栈:Prometheus+Grafana+Alertmanager

一、软件环境介绍

1.1 为什么要监控进程

之前我们做的监控对象,大多数是比较成熟的中间件(redis、tomcat、springboot程序、mysq!程序等等),实际的企业业务运行过程中,可能出现tomcat容器依然存活、但是其中运行的javaweb程序挂掉的情况(或者mysql-docker容器存在,依然往外统计数据抛数据,但是容器内的mysql进程挂掉的情况)。

因此,对业务访问链路中的核心进程施加监控,是非常有必要的。

1.2 怎么在prometheus中监控进程

如果想要对主机的进程进行监控,例如chronyd,sshd等服务进程以及自定义脚本程序运行状态监控。我们使用node exporter就不能实现需求了,此时就需要使用process-exporter来做进程状态的监控。

1.3 主机清单

职责 ip地址 备注
Prometheus服务器 192.168.92.11 docker-compose模式的prometheus
待监控Linux 192.168.92.12 待准备组件:process-exporter

二、prometheus监控进程

docker安装(略)

docker-compose安装(略)

2.1 process_exporter的安装位置及意义

2.2 待监控Linux部署process-exporter

二进制安装或者docker安装(或者docker-compose安装),此处选用docker-compose安装

test(对应上图的Centos2-Linux服务器)机器上,修改process.yaml文件(描述需要监控哪些进程,它是一个配置文件)

复制代码
# 创建数据目录
mkdir -p /data/process-exporter
cd /data/process-exporter

# 创建配置文件目录
mkdir -p config

# 创建配置文件
cat > config/process.yml << 'EOF'
process_names: #定义一组进程匹配规则。
  - name: "{{.Comm}}"
    cmdline: #定义匹配进程的命令行规则
      - '.+' #'.+' 表示匹配任意非空命令行,即监控所有进程。
EOF

# 监控指定进程配置
process_names:
  - name: "{{.Matches}}"
    cmdline: ['nginx']  # 唯一标识

  - name: "{{.Matches}}"
    cmdline: ['mongod']

  - name: "{{.Matches}}"
    cmdline: ['mysqld']

  - name: "{{.Matches}}"
    cmdline: ['redis-server']

  - name: "{{.Matches}}"
    cmdline: ['org.apache.zookeeper.server.quorum.QuorumPeerMain']

  - name: "{{.Matches}}"
    cmdline: ['org.apache.hadoop.mapreduce.v2.hs.JobHistoryServer']

  - name: "{{.Matches}}"
    cmdline: ['org.apache.hadoop.hdfs.qjournal.server.JournalNode']

# 注:cmdline为所选进程的唯一标识,可通过 ps -ef 查询
# 如果对应进程不存在,则不会监控该进程

部署process-exporter

复制代码
cd /data/docker-compose
vi docker-compose.yaml

增加process-exporter节点

复制代码
version: '3.3' #指定使用的 Docker Compose 文件格式版本。
services: #定义所有容器服务的根节点。
  process-exporter: #服务名称。
    image: ncabatoff/process-exporter #指定使用的官方Process Exporter镜像。
    container_name: process-exporter #为容器指定一个固定的名称
    restart: always #容器异常退出时会自动重启,确保监控服务高可用。
    privileged: true #关键权限配置。授予容器访问宿主机内核信息的特权
    volumes: #目录挂载,实现容器内外的数据互通。    
      - /proc:/host/proc:ro
      - /data/process-exporter/config:/config:ro
    command:
      - --procfs=/host/proc
      - --config.path=/config/process.yml
    ports:
      - "9256:9256"

启动docker-compose

复制代码
docker-compose up -d

检查:

复制代码
docker ps -a | grep process
#访问以下url,http://192.168.92.12:9256/metrics

2.3 Prometheus中增加process-exporter对象

prometheus中进入prometheus目录

复制代码
#进入docker-prometheus目录
cd /data/docker-prometheus

#修改prometheus.yml
vi prometheus/prometheus.yml

添加待监控的process-exporter

复制代码
- job_name: 'process-exporter'
  scrape_interval: 30s
  scrape_timeout: 15s
  static_configs:
    - targets: ['192.168.92.12:9256']
      labels:
        instance: 'process进程监控'

保存配置后,让配置生效

复制代码
curl -X POST http://localhost:9090/-/reload

刷新访问http://192.168.92.11:9090/targets?search=,确认新监控的process进程监控是否生效

2.4 process进程监控指标说明

复制代码
namedprocess_namegroup_num_procs - 运行的进程总数
namedprocess_namegroup_num_threads - 进程的线程总数
namedprocess_namegroup_states - 按状态(Running/Sleeping/Other/Zombie)统计的进程数
namedprocess_namegroup_cpu_seconds_total - 进程累计CPU使用时间(秒)
namedprocess_namegroup_read_bytes_total - 进程累计读取字节数
namedprocess_namegroup_write_bytes_total - 进程累计写入字节数
namedprocess_namegroup_memory_bytes - 进程当前内存使用量(字节)
namedprocess_namegroup_open_filedesc - 进程当前打开的文件描述符数量
namedprocess_namegroup_worst_fd_ratio - 进程文件描述符使用率(当前/最大)
namedprocess_namegroup_thread_count - 线程总数
namedprocess_namegroup_thread_cpu_seconds_total - 线程累计CPU使用时间(秒)
namedprocess_namegroup_thread_io_bytes_total - 线程累计I/O字节数

2.5 grafana中对进程进行监控

copy id to clipboard->grafana的dashboards中Import dashboard

https:/gralana.com/grafana/dashboards/4279-rabbitmg-monitomng/

https://grafana.com/grafana/dashboards/8378/


。解决process-exporter升级到0.5.0+之后,cpu相关的两个图形不显示数据的问题Top processes By Total CPU cores used图形脚本(点击edit,把PromQL换成下面的,点Run queries,再点Apply)

复制代码
topk(5, rate(namedprocess_namegroup_cpu_seconds_total{groupname=~"$processes", instance=~"$host"}[5m]))

。Top processes By System CPU cores used图形脚本(点击edit,把PromQL换成下面的,点Run queries,再点Apply)

复制代码
topk(5, rate(namedprocess_namegroup_cpu_seconds_total{mode="system", groupname=~"$processes", instance=~"$host"}[5m]))

最后左侧边栏点Browse,再点Save dashboard,完成更新

相关推荐
hhzz6 小时前
Docker 搭建 NextCloud + OnlyOffice 完整教程(Linux Centos7系统)
linux·docker·容器·onlyoffice·nextcloud
一条闲鱼_mytube7 小时前
CI/CD: TektonCI 深入浅出教程
容器·kubernetes·tekton
记得开心一点嘛7 小时前
k8s部署微服务项目
微服务·容器·kubernetes
勇气要爆发8 小时前
Docker:软件开发的“标准集装箱”
运维·docker·容器
luckily灬8 小时前
Docker执行hello-world报错&Docker镜像源DNS解析异常处理
linux·docker
赴前尘9 小时前
docker 安装并使用 ollama
docker·llama
想学后端的前端工程师10 小时前
【Docker容器化部署实战指南:从入门到生产实践】
运维·docker·容器
Damon小智10 小时前
NiFi实现数据存储到数据库
数据库·mysql·docker·postgresql·nifi
北欧人写代码11 小时前
K8s 限制节点内存使用率,内存不足时自动驱逐POD
云原生·容器·kubernetes