«

Prometheus 实战系列:初识体验

本系列将围绕 Prometheus 及其生态,介绍 Prometheus 监控体系,偏重应用和实战,帮忙大家快速建立对 Prometheus 的认识,提高实战水平。

本文将介绍 Prometheus 的配置、部署,在有了这些基本实战体验之后,简要介绍其架构及组件。

一、部署

正如前文所说,Prometheus 基于 Go 语言开发,可编译成独立的软件包。针对 Prometheus 组件下载,官方提供了多个平台的预编译二进制和 Docker 镜像两种方式,推荐你都能自行下载部署体验下。

1、下载

  1. 二进制下载:https://prometheus.io/download/
    除了登录网页下载,还可以通过命令行下载,以 Linux 64位为例:
export VERSION=2.10.0  
# -k 表示 --insecure
curl -k https://github.com/prometheus/prometheus/releases/download/v${VERSION}/prometheus-${VERSION}.linux-amd64.tar.gz  
# 或者通过 wget 下载
wget --no-check-certificate https://github.com/prometheus/prometheus/releases/download/v${VERSION}/prometheus-${VERSION}.linux-amd64.tar.gz  

继而解压测试:

tar -zxvf prometheus-${VERSION}.linux-amd64.tar.gz  
cd prometheus-${VERSION}.linux-amd64  
# 测试
./prometheus --version
prometheus, version 2.10.0 (branch: HEAD, revision: d20e84d0fb64aff2f62a977adc8cfb656da4e286)  
  build user:       root@a49185acd9b0
  build date:       20190525-12:28:13
  go version:       go1.12.5
  1. Docker 镜像下载:https://hub.docker.com/u/prom
docker pull prom/prometheus  

2、配置

无论你采用哪些部署方式,运行 prometheus 都需要有一个配置文件,对应的启动参数为:--config.file="prometheus.yml"。解压安装包,就包含了一个默认的配置文件 prometheus.yml

该配置文件大致分为 4 个部分,考虑我们暂时不需要告警,可以只保留一下两个部分:

  1. global:用来配置全局设置,比如抓取时间
  2. scrape_configs:抓取点集合,告诉 Prometheus 要抓取哪些服务
# 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).

# 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']

接下来,我们需要创建一个本地目录,用来存储采集的数据,默认路径为:data/,对应的启动参数为:--storage.tsdb.path="data/"

mkdir -p data  

3、二进制部署

做好了上步中的默认配置,再通过二进制来启动 prometheus,就非常简单,直接启动即可:

./prometheus

除了会默认采用第 2 步中的配置文件和存储路径,还会默认在本地启动一个 9090 的服务,对应的启动参数是:--web.listen-address="0.0.0.0:9090"

正常情况下,输出如下:

level=info ts=2019-06-05T07:48:27.540Z caller=main.go:286 msg="no time or size retention was set so using the default time retention" duration=15d  
level=info ts=2019-06-05T07:48:27.541Z caller=main.go:322 msg="Starting Prometheus" version="(version=2.10.0, branch=HEAD, revision=d20e84d0fb64aff2f62a977adc8cfb656da4e286)"  
level=info ts=2019-06-05T07:48:27.541Z caller=main.go:323 build_context="(go=go1.12.5, user=root@a49185acd9b0, date=20190525-12:28:13)"  
level=info ts=2019-06-05T07:48:27.541Z caller=main.go:324 host_details="(Linux 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 HSH1000058306 (none))"  
level=info ts=2019-06-05T07:48:27.541Z caller=main.go:325 fd_limits="(soft=1024, hard=4096)"  
level=info ts=2019-06-05T07:48:27.541Z caller=main.go:326 vm_limits="(soft=unlimited, hard=unlimited)"  
level=info ts=2019-06-05T07:48:27.542Z caller=main.go:645 msg="Starting TSDB ..."  
level=info ts=2019-06-05T07:48:27.542Z caller=web.go:417 component=web msg="Start listening for connections" address=0.0.0.0:9090  
level=info ts=2019-06-05T07:48:27.549Z caller=main.go:660 fs_type=EXT4_SUPER_MAGIC  
level=info ts=2019-06-05T07:48:27.549Z caller=main.go:661 msg="TSDB started"  
level=info ts=2019-06-05T07:48:27.549Z caller=main.go:730 msg="Loading configuration file" filename=prometheus.yml  
level=info ts=2019-06-05T07:48:27.551Z caller=main.go:758 msg="Completed loading of configuration file" filename=prometheus.yml  
level=info ts=2019-06-05T07:48:27.551Z caller=main.go:614 msg="Server is ready to receive web requests."  

之后在浏览器输入:http://IP:9090 访问即可。

4、容器部署

使用 docker 容器安装部署也是非常方便,同样采用第 2 步中的默认配置,docker 启动命令如下:

docker run -d --name=prometheus \  
    -p 9090:9090 \
    -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
    prom/prometheus:v2.10.0

查看 docker 日志,正常也能看到如上的日志输出:

docker logs -f prometheus  

同样可以通过浏览器访问:http://IP:9090

5、Kubernetes 部署

Prometheus 和 Kubernetes 关系这么紧密,可以说部署也是原生支持,社区还有 Operator 的更友好的部署方式,限于篇幅,这块将在后续的文章中实战介绍。

二、架构

官方提供的 Prometheus 的架构图及其相关生态系统组件,非常值得参考学习:

其中标红的框是 Prometheus 监控体系自身组件: 1. Prometheus Server:核心组件,负责周期性的从 Exporter 拉取和存储监控数据,可以通过静态配置或服务发现的方式管理监控目标,监控数据存储在时间序列数据库中,对外提供PromQL查询、HTTP API接口
2. Prometheus web UI: 自带UI,可以用来做基本的可视化展示和PromQL语句验证。更丰富强大的图表展示,将采用 Grafana 来做,后续也会重点介绍。
3. pushgateway:push 的方式将指标数据推送到该网关
4. alertmanager:处理报警的报警组件
其中 1 和 2 部署好之后就有了,3 和 4 都是可选组件,可按需部署。

图中左侧还有一类组件非常重要,就是 Jobs/exporters。这些都是用来暴露指标和接口,用于给 Prometheus 抓取或主动推送给 Pushgateway 供 Prometheus 抓取。

Exporter 的生态非常丰富,之所以 Prometheus 能异军突起,丰富强大的Exporter功不可没。在官方wiki提供的列表中,就包含 500 多种 Exporters。

在图中上部,还有一个蓝色的边框表示的 Service discovery。这块功能也非常强大,支持通过服务发现来自动发现监控目标,后续通过 Kubernetes 来部署时会看到其强大的便利性。

三、小结

最后结合整张图的数据流过程,总结 Prometheus 核心功能如下:

Prometheus 直接抓取(Pull)或者通过 Pushgateway 网关简介抓取(PUsh)指标数据,可直接存储在本地节点(Node)磁盘(HDD/SSD)中,并对这些数据进行一些规则(rule)处理,用来生产一些聚合数据(metrics)或者告警信息(alerts),结合强大的PromQL,暴露 HTTP 接口,提供给自身Web UI 、Grafana或其他客户端来可视化监控数据。

分享