Prometheus安装及使用

该图说明了普罗米修斯(Prometheus)及其一些生态系统组件的整体架构:

image
我们用到了下面exporter:
node_exporter – 用于机器系统数据收集(主要是cpu等信息的收集)

首先安装GO

每个需要检测的服务器都要安装go

$ yum install go
$ go version
$ go version go1.6.3 linux/amd64

下载安装Prometheus(https://prometheus.io/download/)

$ wget https://github.com/prometheus/prometheus/releases/download/v2.3.0/prometheus-2.3.0.linux-amd64.tar.gz
$ tar zxvf prometheus-2.3.0.linux-amd64.tar.gz -C /usr/local/
$ ln -sv /usr/local/prometheus-2.3.0.linux-amd64/ /usr/local/prometheus
$ cd /usr/local/prometheus

首先,在创造上的主机文件系统的最小Prometheus配置文件prometheus.yml (替换你要监控的IP地址):


# 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: ['localhost:9090']

  - job_name: linux
    static_configs:
    - targets: ['192.168.5.71:9100','192.168.5.73:9100']


192.168.5.73是我们另一个服务器的IP,端口则是对应的exporter的监听端口。

启动Prometheus

$  ./prometheus --config.file=prometheus.yml

如果想后台运行的话就用nohup

$  nohup ./prometheus --config.file=prometheus.yml &

Prometheus内置了一个web界面,我们可通过http://monitor_host:9090进行访问:

image

安装并运行exporter

下载exporters并解压到被监控端服务器:

$ wget https://github.com/prometheus/node_exporter/releases/download/v0.14.0/node_exporter-0.14.0.linux-amd64.tar.gz
$ tar xvf node_exporter-0.14.0.linux-amd64.tar.gz -C /usr/local/
$ nohup /usr/local/node_exporter-0.14.0.linux-amd64/node_exporter &

我们再次回到Status->Targets页面,可以看到两个Target的状态已经变成UP了:

image
Prometheus自带的图形并不够强大,于是我们可以使用Grafana作为Prometheus的Dashboard。

安装运行Grafana

Grafana安装配置介绍

$ wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.2.0-1.x86_64.rpm 
$ sudo yum localinstall grafana-4.2.0-1.x86_64.rpm

编辑配置文件/etc/grafana/grafana.ini,修改dashboards.json段落下两个参数的值:

[dashboards.json]
enabled = true
path = /var/lib/grafana/dashboard

安装仪表盘(Percona提供)

$ git clone https://github.com/percona/grafana-dashboards.git
$ cp -r grafana-dashboards/dashboards /var/lib/grafana

运行以下命令为Grafana打个补丁,不然图表不能正常显示:

$ sed -i 's/expr=\(.\)\.replace(\(.\)\.expr,\(.\)\.scopedVars\(.*\)var \(.\)=\(.\)\.interval/expr=\1.replace(\2.expr,\3.scopedVars\4var \5=\1.replace(\6.interval, \3.scopedVars)/' /usr/share/grafana/public/app/plugins/datasource/prometheus/datasource.js
$ sed -i 's/,range_input/.replace(\/"{\/g,"\\"").replace(\/}"\/g,"\\""),range_input/; s/step_input:""/step_input:this.target.step/' /usr/share/grafana/public/app/plugins/datasource/prometheus/query_ctrl.js

最后我们运行Grafana服务

$ systemctl daemon-reload
$ systemctl start grafana-server
$ systemctl status grafana-server

我们可通过http://monitor_host:3000访问Grafana网页界面(缺省的帐号/密码为admin/admin):
image

给Grafana添加数据源,数据源有多种,例如:Graphite、CloudWatch、Elasticsearch、InfluxDB、OpenTSDB、Prometheus。这里我们选择用Prometheus:

image

下面是展示部分数据分析图:

image

Grafana基本概念以及使用

Data Source:

grafana确切的说是一个前端展示工具,将数据以非常美观直接的图形展示出来。那么这些数据必须有一个来源吧,grafana获取数据的地方就称为Data Source。官方文档上说grafana支持以下数据源:Graphite, InfluxDB, OpenTSDB, Prometheus, Elasticsearch, CloudWatch。在Grafana 3.0+之后,grafana不仅仅支持上面说的这些数据源,还支持一些其它的数据源,这些就称为Grafana Plugins,grafana支持的插件非常多(grafana支持的插件传送门),只要做一些简单的插件安装配置,你就能获取丰富的数据源,后面的文章会讲解如何安装配置使用grafana-zabbix,elasticsearch等插件。

DashBoard:

仪表盘,就像汽车仪表盘一样可以展示很多信息,包括车速,水箱温度等。Grafana的DashBoard就是以各种图形的方式来展示从Datasource拿到的数据。

Row:

DashBoard的基本组成单元,一个DashBoard可以包含很多个row。一个row可以展示一种信息或者多种信息的组合,比如系统内存使用率,CPU五分钟及十分钟平均负载等。所以在一个DashBoard上可以集中展示很多内容。

Panel:

面板,实际上就是row展示信息的方式,支持表格(table),列表(alert list),热图(Heatmap)等多种方式,具体可以去官网上查阅。

Query Editor:

用来指定获取哪一部分数据。类似于sql查询语句,比如你要在某个row里面展示test这张表的数据,那么Query Editor里面就可以写成select *from test。这只是一种比方,实际上每个DataSource获取数据的方式都不一样,所以写法也不一样,比如像zabbix,数据是以指定某个监控项的方式来获取的。

Organization:

org是一个很大的概念,每个用户可以拥有多个org,grafana有一个默认的main org。用户登录后可以在不同的org之间切换,前提是该用户拥有多个org。不同的org之间完全不一样,包括datasource,dashboard等都不一样。创建一个org就相当于开了一个全新的视图,所有的datasource,dashboard等都要再重新开始创建。

User:

这个概念应该很简单,不用多说。Grafana里面用户有三种角色admin,editor,viewer。admin权限最高,可以执行任何操作,包括创建用户,新增Datasource,创建DashBoard。editor角色不可以创建用户,不可以新增Datasource,可以创建DashBoard。viewer角色仅可以查看DashBoard。在2.1版本及之后新增了一种角色read only editor(只读编辑模式),这种模式允许用户修改DashBoard,但是不允许保存。每个user可以拥有多个organization。

prometheus监控设备基础项

简单整理一些常规的监控查询语句,也可以直接从grafana官网下载相关的模板,模板中有相当高效优质的查询语句,推荐使用模板

cpu一分钟负载

node_load1

cpu五分钟负载

node_load5

cpu十五分钟负载

node_load15

内存总量

node_memory_MemTotal

占用内存(不准确)

node_memory_MemTotal-node_memory_MemFree

可用内存

node_memory_MemFree

可用空间

node_filesystem_avail{device=~”/dev/.+”}

总空间

node_filesystem_size{device=~”/dev/.+”}

已用空间

node_filesystem_size{device=~”/dev/.+”}-node_filesystem_avail{device=~”/dev/.+”}

IO读byte

node_disk_bytes_read{device=~”sd.+”}

IO写byte

node_disk_bytes_written{device=~”sd.+”}

接收流量统计

node_network_receive_bytes{device=~”eth.+”}

发送流量统计

node_network_transmit_bytes{device=~”eth.+”}

运行时间

node_boot_time

Prometheus查询

Prometheus提供了一种功能表达式语言,允许用户实时选择和汇总时间序列数据。表达式的结果可以显示为图形,在Prometheus的表达式浏览器中显示为表格数据,或者由外部系统通过HTTP API使用。

假如我要计算go_gc_duration_seconds_sum,在Metrics里的query写下

go_gc_duration_seconds_sum

(注意:Panel data source不要选错,选择你一开始设定的数据源)如下图:
image

  • =:选择与提供的字符串完全相同的标签。
  • !=:选择不等于提供的字符串的标签。
  • =~:选择正则表达式匹配提供的字符串(或子字符串)的标签。
  • !~:选择不与提供的字符串(或子字符串)正则表达式匹配的标签。

可以通过{}来进行监测服务器的过滤,例如选择job=“linux”的服务器,在Metrics里的query写下:

go_gc_duration_seconds_sum{job="linux"}

如下图:
image
当然可以选择自己想要监控的服务器名称,例如选择71和73这两个服务器,在Metrics里的query写下:

go_gc_duration_seconds_sum{instance=~"192.168.5.71:9100|192.168.5.73:9100"}

如下图:
image

如果计算连个服务器数据的和,在表达式前加sum(),若果是求平均,加avg(),这里算求和,在Metrics里的query写下:

sum(go_gc_duration_seconds_sum{instance=~"192.168.5.71:9100|192.168.5.73:9100"})

(注意:Legend format可以编写你算出来的表达式的名字)如下图:
image

同理,其他聚合函数如平均avg(),最小min(),最大max()等等。

如果一个查询方法经常使用,例如:

sum(go_gc_duration_seconds_sum{instance=~"192.168.5.71:9100|192.168.5.73:9100"})

=~可以搭配通配符来使用,例如:

go_gc_duration_seconds_sum{instance=~".*:9100"}

意思为把所有后缀为:9100的instance全部计算出来。

常用的表达式写入rule文件中,写入之后,在在Metrics里的query中写你定义的record中的名字即可。这样做的好处是在收集数据时在时序数据库中就已经存好了你要查询的值,直接调用即可,不用再次计算,节省CPU。

rate(查询语句)[5m]

代表5分钟内的数据

点这里查看更多查询语法

Prometheus录制规则

录制规则允许您预先计算经常需要或计算成本高的表达式,并将其结果保存为一组新的时间序列。因此,查询预先计算的结果通常比每次需要时执行原始表达式快得多。这对于仪表板尤其有用,仪表板需要在每次刷新时重复查询相同的表达式。

规则文件的语法是:

groups:
  [ - <rule_group> ]

一个简单的示例规则文件是:

groups:
  - name: example
    rules:
    - record: job:http_inprogress_requests:sum
      expr: sum(http_inprogress_requests) by (job)

<rule_group>

# The name of the group. Must be unique within a file.
name: <string>

# How often rules in the group are evaluated.
[ interval: <duration> | default = global.evaluation_interval ]

rules:
  [ - <rule> ... ]

Prometheus动态配置目标

最简单的配置是静态目标:

scrape_configs:
  - job_name: 'prometheus'

    static_configs:
      - targets: ['localhost:9090', 'localhost:9100']
        labels:
          group: 'prometheus'

更改此文件后,可以发送 SIGHUP 触发配置重新加载。

Prometheus 提供了服务发现功能,可以从 consul, dns, kubernetes, file 等等多种来源发现新的目标。

其中最简单的是从文件发现服务。

例如 /usr/local/prometheus/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: ['localhost:9090']

  - job_name: linux
    static_configs:
    - targets: ['192.168.5.71:9100']
      labels:
        group: "bbb"
  - job_name: 'test'
    file_sd_configs:
      - files: ['/usr/local/prometheus/test_sd_config/*.yml']
        refresh_interval: 5s

启动 prometheus:

nohup ./prometheus --config.file=prometheus.yml &

创建 /usr/local/prometheus/test_sd_config/test.yml 如下

- targets: [ "192.168.5.75:9100" ]
  labels:
    group: "aaa"

5s内就会自动读取 test.yml 并添加新的目标。
可用浏览器打开Prometheus 9090 端口,
查看 Status 中的 Configuration, Targets, Service Discovery,
可以看到新添加的目标。

去掉导航栏

在Grafana页面中,按F12打开控制台,看source中加载的css文件,里面有一个带数字的css(好像是一共有两个css,其中一个),去linux中的public/css文件夹中找到相应的css文件,前面加上

.navbar-inner{display:none};

然后重启Grafana服务(一定要关掉服务,不然不能加载出修改的css)

有关于Prometheus的介绍、概念、使用等具体问题请参考下面网址:

Prometheus官网

有关于Grafana的介绍、概念、使用等具体问题请参考下面网址:

Grafana官网


一个好奇的人