文章目录
  1. 1. 准备工作
  2. 2. 搭建环境
  3. 3. 数据收集
  4. 4. Exporter
  5. 5. Push Gateway
  6. 6. Grafana

Prometheus是一个开源的监控解决方案,包括数据采集、汇聚、存储、可视化、监控、告警等。除了基本的监控数据,也支持通过自定义exporter来获取自己想要的数据。本文从零开始用容器搭建一个prometheus环境,并介绍一些基本功能。

准备工作

我们需要先安装virtualBoxvagrant。通过vagrant来驱动virtualBox搭建一个虚拟测试环境。首先在本地任意路径新建一个空文件夹比如test,运行以下命令:

virtual box host
1
2
3
4
mkdir test
cd test
vagrant init minimum/ubuntu-trusty64-docker
vi Vagrantfile

里面应该有一句config.vm.box = "minimum/ubuntu-trusty64-docker",在它的下面添加如下代码,相当于给它分配一台IP是192.168.33.18的虚拟机。

Vagrantfile
1
config.vm.network "private_network", ip: "192.168.33.18"

这个vagrant镜像已经在ubuntu的基础上帮我们安装了docker,用起来很方便。然后在终端运行以下命令启动并连接虚拟机。

virtual box host
1
2
vagrant up
vagrant ssh

搭建环境

Prometheus的环境搭建起来非常简单,只要一个docker镜像即可。绿色的压缩包安装方式可以参考官方文档。此外还需要一个配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cat << EOF >prometheus.yml
global:
scrape_interval: 15s
external_labels:
monitor: 'codelab-monitor'
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
target_groups:
- targets: ['localhost:9090']
EOF
sudo mkdir /etc/prometheus
sudo mv prometheus.yml /etc/prometheus

配置文件中,scrape_interval指的是数据获取间隔,prometheus这个任务里的scrape_interval将会在这个任务里覆盖掉默认的global全局值,也就是这个任务每5秒钟获取一次数据,其它任务则是每15秒钟。完整的配置文件格式,请参考官方文档。接下来启动Prometheus:

1
2
3
4
5
6
/usr/bin/docker run -d \
--name=prometheus \
--publish=9090:9090 \
-v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /var/prometheus/storage:/prometheus \
prom/prometheus:0.17.0

启动完成后,将会在http://192.168.33.18:9090看到prometheus的首页:

数据收集

http://192.168.33.18:9090/metrics可以看到prometheus收集到的数据。其中有一个prometheus_target_interval_length_seconds,表示真实的数据获取间隔。在prometheus首页输入它并回车,就可以看到一系列的数据,它们有着不同的quantile,从0.01至0.99不等。0.99的意思是有99%的数据都在这个值以内。如果我们只关心这个数,我们可以输入prometheus_target_interval_length_seconds{quantile="0.99"}来查看。查询还支持函数,比如count(prometheus_target_interval_length_seconds)可以查询数量。完整的表达式可以参考官方文档

点击Console旁边的Graph标签就可以看见时序图了:

可以随意选择指标和函数试一试,比如rate(prometheus_local_storage_chunk_ops_total[1m])

Exporter

Prometheus支持官方/非官方的许多种exporter,如HAProxy,Jenkins,MySQL等,也有一些软件直接支持Prometheus而无需exporter,如Etcd,Kubernetes等。我们试一下node exporter:

1
2
3
4
docker run -d \
--name=ne \
-p 9100:9100 \
prom/node-exporter

Node exporter暴露的端口是9100,所以我们需要修改一下prometheus的配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
cat << EOF >prometheus.yml
global:
scrape_interval: 15s
external_labels:
monitor: 'codelab-monitor'
scrape_configs:
- job_name: 'node'
scrape_interval: 5s
target_groups:
- targets: ['192.168.33.18:9100']
EOF
sudo cp prometheus.yml /etc/prometheus

重启prometheus:

1
2
3
docker stop prometheus
sudo rm -rf /var/prometheus/storage
docker start prometheus

这样在页面上就可以选择节点的一些指标了。也可以访问http://192.168.33.18:9100/来直接查看Exporter的指标。

Push Gateway

Prometheus采集数据是用的pull也就是拉模型,这从我们刚才设置的5秒参数就能看出来。但是有些数据并不适合采用这样的方式,对这样的数据可以使用Push Gateway服务。它就相当于一个缓存,当数据采集完成之后,就上传到这里,由Prometheus稍后再pull过来。我们来试一下,首先启动Push Gateway:

1
2
3
4
docker run -d \
--name=pg \
-p 9091:9091 \
prom/pushgateway

可以访问http://192.168.33.18:9091/来查看它的页面。下个命令将会往Push Gateway上传数据:

1
echo "some_metric 3.14" | curl --data-binary @- http://192.168.33.18:9091/metrics/job/some_job

效果是酱紫滴:

而在Prometheus的配置文件里,只要把端口换成9100便能采集到Push Gateway的数据了。

Grafana

Grafana是目前比较流行的监控可视化UI,它从2.5.0版开始直接支持Prometheus的数据。我们来试一下。首先启动grafana:

1
2
3
4
docker run -d \
--name grafana \
-p 3000:3000 \
grafana/grafana:2.6.0

打开http://192.168.33.18:3000/,就能看到grafana的登录页面了。输入默认的admin/admin登录grafana。选择左侧的Data Sources,然后点击上面的Add new按钮,便可以把prometheus作为数据源导入grafana:

输入下面的值:

然后点击Add按钮。之后会出来一个Test Connection的按钮,点击它便可以收到Data source is working的消息。点击左边的Dashboards回到主页,点击上面的Home,选择+ New,会出来一个绿色的小竖条,点击它便会弹出来一个菜单:

选择Add PanelGraph,便会出来一个图。然后就可以在Query里输入prometheus支持的查询了:

文章目录
  1. 1. 准备工作
  2. 2. 搭建环境
  3. 3. 数据收集
  4. 4. Exporter
  5. 5. Push Gateway
  6. 6. Grafana