Prometheus+Grafana性能监控

前言

  • 前几年做性能测试监控部署了telegraf+infludb+grafana,方便查看和存档性能监控数据,随着K8s流行起来,Prometheus方案开始得到各大厂青睐,最近尝试部署Prometheus+Grafana,再配合各种exporter,丰富性能测试监控手段。

Prometheus简介

概念

  • Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本。

  • 2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation), 将Prometheus纳入其下第二大开源项目。

  • Prometheus目前在开源社区相当活跃。

  • Prometheus和Heapster(Heapster是K8S的一个子项目,用于获取集群的性能数据。)相比功能更完善、更全面。Prometheus性能也足够支持上万台规模的集群。

官网地址:https://prometheus.io/

特点

  1. 多维度数据模型

  2. 高效灵活的查询语句

  3. 不依赖分布式存储,单个服务器节点是自主的

  4. 通过基于HTTP的pull方式采集时序数据

  5. 可以通过中间网关进行时序列数据推送

  6. 通过服务发现或者静态配置来发现目标服务对象

  7. 支持多种多样的图表和界面展示,比如Grafana等

组件

  1. promethues server:主要获取和存储时间序列数据

  2. exporters:主要作为agent收集数据发送到prometheus server,不同的数据收集由不同的exporters实现,如监控服务器有node-exporters,redis有redis-exporter。

  1. pushgateway:允许短暂和批处理的jobs推送它们的数据到prometheus;由于这类工作的存在时间不长,需要他们主动将数据推送到pushgateway,然后由pushgateway将数据发送给prometheus。

  2. alertmanager:实现prometheus的告警功能。

架构

image

Grafana

  • Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。

特点

  1. 展示方式:快速灵活的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方库中具有丰富的仪表盘插件,比如热图、折线图、图表等多种展示方式;

  2. 数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等;

  3. 通知提醒:以可视方式定义最重要指标的警报规则,Grafana将不断计算并发送通知,在数据达到阈值时通过Slack、PagerDuty等获得通知;

  4. 混合展示:在同一图表中混合使用不同的数据源,可以基于每个查询指定数据源,甚至自定义数据源;

  5. 注释:使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记;

  6. 过滤器:Ad-hoc过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询

安装部署

prometheus

  • 手动下载,并根据yml配置文件启动服务

download the latest release

wget https://github.com/prometheus/prometheus/releases/download/v*/prometheus-*.*-amd64.tar.gz
tar xvf prometheus-*.*-amd64.tar.gz
cd prometheus-*
nohup ./prometheus --config.file=./prometheus.yml &

grafana

  • 手动下载,并根据yml配置文件启动服务

download the latest release

wget https://dl.grafana.com/oss/release/grafana-7.5.6-1.x86_64.rpm
sudo yum install grafana-7.5.6-1.x86_64.rpm

docker安装

  • docker-compose统一安装prometheus及grafana
cd /opt
mkdir -p prometheus/config/
mkdir -p grafana/data
chmod 777 grafana/data
mkdir -p /data/prometheus
chmod 777 /data/prometheus
  • 创建prometheus.yml配置文件
cd /opt/prometheus/config/
touch prometheus.yml
  • 编辑prometheus.yml配置文件
#my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  #scrape_timeout is set to the global default (10s).

#Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      #- alertmanager:9093

#Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  #- "first_rules.yml"
  #- "second_rules.yml"

#A scrape configuration containing exactly one endpoint to scrape:
#Here it's Prometheus itself.
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: ['192.168.9.140:9090']


  - job_name: "node"
    static_configs:
    - targets: ["192.168.9.140:9100"]

  - job_name: "qianmingyanqian"
    static_configs:
    - targets: ["11.12.108.226:9100","11.12.108.225:9100"]

  ## config for the multiple Redis targets that the exporter will scrape
  - job_name: "redis_exporter_targets"
    scrape_interval: 5s
    static_configs:
      - targets:
        - redis://192.168.9.140:6379
        - redis://192.168.9.140:7001
        - redis://192.168.9.140:7004
    metrics_path: /scrape
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.9.140:9121
  • 创建docker-compose_prometheus_grafana.yml配置文件
cd /opt
mkdir docker-compose
touch docker-compose_prometheus_grafana.yml
  • 编辑docker-compose_prometheus_grafana.yml文件并键入
version: '2'

networks:
  monitor:
    driver: bridge

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    hostname: prometheus
    restart: always
    volumes:
      - /opt/prometheus/config:/etc/prometheus
      - /data/prometheus:/prometheus
    ports:
      - "9090:9090"
    expose:
      - "8086"
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--log.level=info'
      - '--web.listen-address=0.0.0.0:9090'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention=15d'
      - '--query.max-concurrency=50'
    networks:
      - monitor

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    hostname: grafana
    restart: always
    volumes:
      - /opt/grafana/data:/var/lib/grafana
    ports:
      - "3000:3000"
      - "26:26"
    networks:
      - monitor
    depends_on:
      - prometheus
  • docker-compose运行docker容器
docker-compose -p prometheus_grafana -f docker-compose_prometheus_grafana.yml up -d
  • 启动成功通过浏览器9090端口访问prometheus服务
image
  • 通过浏览器3000端口访问grafana服务
image

监控服务器node

安装并运行node_exporter

  • 在待被监控的服务器上下载并安装node_exporter

download the latest release

wget https://github.com/prometheus/node_exporter/releases/download/v*/node_exporter-*.*-amd64.tar.gz
tar xvfz node_exporter-*.*-amd64.tar.gz
cd node_exporter-*.*-amd64
nohup ./node_exporter &
  • 或者使用docker安装,创建docker-compose_node-exporter.yml配置文件
cd /opt/docker-compose
touch docker-compose_node-exporter.yml
  • 编辑docker-compose_node-exporter.yml配置文件如下:
---
version: '3.8'

services:
  node_exporter:
    image: quay.io/prometheus/node-exporter:latest
    container_name: node_exporter
    command:
      - '--path.rootfs=/host'
    network_mode: host
    pid: host
    restart: unless-stopped
    volumes:
      - '/:/host:ro,rslave'
  • docker-compose运行docker容器
docker-compose -p node_exporter -f docker-compose_node-exporter.yml up -d
  • 尝试访问以下
curl http://192.168.9.140:9100/metrics
  • 返回以下数据证明服务正常
# HELP node_xfs_read_calls_total Number of read(2) system calls made to files in a filesystem.
# TYPE node_xfs_read_calls_total counter
node_xfs_read_calls_total{device="dm-1"} 10196
node_xfs_read_calls_total{device="dm-2"} 17401
node_xfs_read_calls_total{device="dm-3"} 970
node_xfs_read_calls_total{device="dm-4"} 10
node_xfs_read_calls_total{device="dm-5"} 19
node_xfs_read_calls_total{device="dm-6"} 132
node_xfs_read_calls_total{device="sda2"} 16378
node_xfs_read_calls_total{device="sda3"} 2.67817784e+09
node_xfs_read_calls_total{device="sda6"} 1.053587e+06

配置Prometheus

  • prometheus.yml追加以下内容
  - job_name: "node"
    static_configs:
    - targets: ["192.168.9.140:9100"]
  • 修改配置文件后需重启prometheus容器
docker restart CONTAINER ID
  • 成功后如下图
image

配置Grafana

  • 登陆后添加数据源
image
  • 选择Prometheus
image
  • 在URL输入框键入http://192.168.9.140:9090,如图所示,并保存
image
  • 添加Dashboards
image
  • 导入模板https://grafana.com/grafana/dashboards/1860,并load成功

更多模板参考

image
  • 详细监控页面,可根据需求选择监控时间段
image

监控redis

安装并运行redis_exporter

  • 在待被监控的redis服务器上下载并安装redis_exporter

download the latest release

wget https://github.com/oliver006/redis_exporter/releases/download/v1.23.1/redis_exporter-v1.23.1.linux-386.tar.gz
tar zxvf redis_exporter-v1.23.1.linux-386.tar.gz
nohup ./redis_exporter -redis.addr 192.168.9.140:6379 -redis.password 111111 &
  • 或者使用docker安装
docker run -d --name redis_exporter -p 9121:9121 oliver006/redis_exporter --redis.addr=192.168.9.140:6379 --redis.password=111111

配置Prometheus

  • redis单实例,prometheus.yml追加以下内容
## config for scraping the exporter itself
- job_name: 'redis_exporter'
  scrape_interval: 5s
  static_configs:
    - targets:[192.168.9.140:9121]
  • redis集群,prometheus.yml追加以下内容
  ## config for the multiple Redis targets that the exporter will scrape
  - job_name: "redis_exporter_targets"
    scrape_interval: 5s
    static_configs:
      - targets:
        - redis://192.168.9.140:6379
        - redis://192.168.9.140:7001
        - redis://192.168.9.140:7004
    metrics_path: /scrape
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.9.140:9121
  • 修改配置文件后需重启prometheus容器
docker restart CONTAINER ID
  • 成功后如下图
image

配置Grafana

  • 添加Dashboards,导入模板https://grafana.com/grafana/dashboards/11835,并load成功
image
  • 详细监控页面,可根据需求选择监控时间段
image

监控mysql

安装并运行mysqld_exporter

  • 首先授权用户
root@localhost 14:43:  [(none)]>CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'mysql_exporter';
Query OK, 0 rows affected (0.04 sec)

root@localhost 14:43:  [(none)]>GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
Query OK, 0 rows affected (0.03 sec)
  • 创建my.cnf配置文件
cd /opt
touch .my.cnf
vim .my.cnf
  • 配置文件键入以下内容
[ client ]
user = exporter
password = mysql_exporter
  • 在待被监控的mysql服务器上下载并安装mysqld_exporter

download the latest release

wget https://github.com/prometheus/mysqld_exporter/releases/download/v*/mysqld_exporter-*.*-amd64.tar.gz
tar xvfz mysqld_exporter-*.*-amd64.tar.gz
cd mysqld_exporter-*.*-amd64
nohup ./mysqld_exporter --config.my-cnf=/opt/.my.cnf &
  • 或者使用docker安装,创建docker-compose_mysqld-exporter.yml配置文件
cd /opt/docker-compose
touch docker-compose_mysqld-exporter.yml
  • 编辑docker-compose_mysqld-exporter.yml配置文件如下:
version: '2'

networks:
    monitor:
        driver: bridge

services:
    mysql-exporter:
        image: prom/mysqld-exporter
        container_name: mysql-exporter
        hostname: mysql-exporter
        restart: always
        ports:
            - "9104:9104"
        networks:
            - my-mysql-network

        environment:
            DATA_SOURCE_NAME: "exporter:mysql_exporter@(192.168.9.140:3306)/"
networks:
    my-mysql-network:
        driver: bridge
  • docker-compose运行docker容器
docker-compose -p mysql_exporter -f docker-compose_mysqld-exporter.yml up -d

配置Prometheus

  • prometheus.yml追加以下内容
- job_name: 'mysql' 
    static_configs: 
    - targets: ['192.168.9.140:9104'] 
        labels: 
            instance: mysql
  • 修改配置文件后需重启prometheus容器
docker restart CONTAINER ID
  • 成功后如下图
image

配置Grafana

  • 添加Dashboards,导入模板https://grafana.com/grafana/dashboards/11323,并load成功
image
  • 详细监控页面,可根据需求选择监控时间段
image

如果只想单纯监控MySQL或MongoDB,可以考虑PMM(Percona Monitoring and Management)监控工具,添加了慢查询收集等额外功能

问题修复

Prometheus

  • Prometheus服务启动后通过浏览器访问9090端口提示以下错误信息
Warning: Error fetching server time: Detected 785.6099998950958 seconds time difference between your browser and the server.
  • 到装prometheus的机器上,同步一下时钟
ntpdate time3.aliyun.com

redis_exporter

  • prometheus.yml配置不正确可能会提示too many redis instances

  • redis_exporter启动后通过Prometheus服务web页面/targets下scrape也可能会出现以下错误,此时一般为redis_exporter启动时密码配置不正确,如部分redis实例不需要密码强行配置密码,或者redis实例需要密码而没有配置密码

- redis_exporter_last_scrape_error{err="dial redis: unknown network redis"} 1

mysqld_exporter

  • 创建mysql用户时可能提示以下错误
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
  • 刷新权限后再次执行即可
flush privileges;

后记

  • 除了上述Linux服务器、Redis、Mysql等,还可以通过其他exporter监控对应组件,工具不是万能的,适合并且能够快速定位性能瓶颈最重要。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容