Prometheus是一个开源的监控解决方案,包括数据采集、汇聚、存储、可视化、监控、告警等。除了基本的监控数据,也支持通过自定义exporter来获取自己想要的数据。本文从零开始用容器搭建一个prometheus环境,并介绍一些基本功能。
我们需要先安装virtualBox和vagrant。通过vagrant来驱动virtualBox搭建一个虚拟测试环境。首先在本地任意路径新建一个空文件夹比如test
,运行以下命令:
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的虚拟机。
1
|
config.vm.network
"private_network",
ip:
"192.168.33.18"
|
这个vagrant镜像已经在ubuntu的基础上帮我们安装了docker,用起来很方便。然后在终端运行以下命令启动并连接虚拟机。
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)
可以查询数量。完整的表达式可以参考官方文档。
可以随意选择指标和函数试一试,比如rate(prometheus_local_storage_chunk_ops_total[1m])
。
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的指标。
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是目前比较流行的监控可视化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 Panel和Graph,便会出来一个图。然后就可以在Query里输入prometheus支持的查询了:
http://qinghua.github.io/prometheus/