Prometheus普罗米修斯,是一项SoundCloud开源的监控和报警解决方案,能够实现与当下最流行的Kubernetes无缝连接,使得普罗米修斯逐渐成为主流监控方案
homebrew安装prometheus:
$ brew install prometheus
编写配置文件 prometheus.yml :
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: 'codelab-monitor'
# 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=` to any timeseries scraped from this config.
- job_name: 'prometheus'
# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
指定配置文件,运行 prometheus :
$ prometheus --config.file=prometheus.yml
打开localhost:9090就可以看到prometheus的监控页面了:
可以展示的数据从metrics中来,所以你可以打开localhost:9090/metrics查看都有哪些指标可以显示。
界面太难看了有木有,所以我们需要Grafana~
Grafana是一款美观强大的开源监控指标可视化展示框架,操作简单,视觉酷炫!
homebrew安装Grafana:
$ brew install grafana
启动:
$ brew services start grafana
启动后,打开localhost:3000就可以看到Grafana界面了。首先是一个登录页面,默认用户名和密码都是admin。登录,修改用户名密码blablabla…
添加数据源,顾名思义,需要展示的数据从哪里来,Prometheus啊,加上这个数据源,如下图
后续操作就更简单了,Add panel添加新的仪表盘监控,Add Query写入Prometheus的SQL,数据就展示出来了。
其他的功能,比如添加文件夹分组啊、改panel title啊、import JSON file啊之类的多点一点就会了
import JSON file功能不错,在Grafana中你的数据展示设置和配置是以JSON文件的格式保存的,import JSON file可以支持上传和下载JSON文件,Grafana官网有很丰富的Dashboards供你选择,免去了自己一步一步把监控都建出来的烦恼。搜索到想要的Dashboard后,输入id号就OK了,如下图
以上操作都是在本地进行的,在应用到kubernetes之前,我们先操作一下本地Docker运行的方法做个过渡。这里使用官方deom举例,即使用Prometheus + cAdvisor + Grafana监控Redis服务
cAdvisor(container Advisor简称)是分析和运行容器暴露的资源使用情况和性能数据的工具,能够直接使用Prometheus metrics。
1、编写 prometheus.yml 文件,使Prometheus能够由cAdvisor刷新metrics:
scrape_configs:
- job_name: cadvisor
scrape_interval: 5s
static_configs:
- targets:
- cadvisor:8080
2、编写 docker-compose.yml 制作Docker组件以运行这三个容器:
version: '3.2'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- 9090:9090
command:
- --config.file=/etc/prometheus/prometheus.yml
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
depends_on:
- cadvisor
cadvisor:
image: google/cadvisor:latest
container_name: cadvisor
ports:
- 8080:8080
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
depends_on:
- redis
redis:
image: redis:latest
container_name: redis
ports:
- 6379:6379
运行容器:
$ docker-compose up
如官方文档所述,成功运行三个容器后,你会看到最后一行会打印出如下内容:
prometheus | level=info ts=2018-07-12T22:02:40.5195272Z caller=main.go:500 msg="Server is ready to receive web requests."
另启终端运行docker-compose ps
,有类似如下输出:
Name Command State Ports
----------------------------------------------------------------------------
cadvisor /usr/bin/cadvisor -logtostderr Up 8080/tcp
prometheus /bin/prometheus --config.f ... Up 0.0.0.0:9090->9090/tcp
redis docker-entrypoint.sh redis ... Up 0.0.0.0:6379->6379/tcp
同样是在本地打开Grafana就可以展示数据,后面就不再赘述了
这个没有实践条件,简单来说就是把三个镜像部署到 k8s 上,通过暴露端口,本地 Grafana 监听 k8s 上的 Prometheus ,获取 metrics。由于是内部资源,没有权限,cAdvisor 获取pod资源信息失败,毕竟不是运维,也不去深究了,好在公司k8s集群已经集成了 Prometheus 和 Grafana,所以只需要在自己的服务上使用 Prometheus_Client 项目,在服务代码内,添加一些自定义 metrics ,然后在 prometheus.yml 中给到 Prometheus 的 target 就可以使用了,再在 server.yml 文件中使用 annotations 给 kubernetes 提供一个 Prometheus 的发现,就OK了。
annotations:
prometheus.io/scrape: "true"
Prometheus_Client 项目 README.md 写的很详细,功能也比较简单,不再赘述了。