您的位置:首页 > 运维架构

Prometheus监控使用实践

2018-03-01 00:00 691 查看
摘要: 记录Prometheus的大致介绍,部署实践中遇到的一些问题,以及一些注意点。

Prometheus介绍

Prometheus是一套开源监控报警系统(包括时序列数据库TSDB),自2012年来被许多公司与组织所采用。其中Prometheus的特点如下:

多维数据模型(时序列数据由metric名和一组key/value组成)

在多维度上灵活的查询语言(PromQL)

不依赖分布式存储,单主节点工作.

通过基于HTTP的pull方式采集时序数据

可以通过中间网关进行时序列数据推送(pushing)

目标服务器可以通过发现服务或者静态配置实现

多种可视化和仪表盘支持

其中Prometheus生态系统可以有多个组件构成,大多组件都是独立工作的,可以有选择的配置自己需要的服务,主要有以下:

Prometheus 主服务,用来抓取和存储时序数据

client library 用来构造应用或 exporter 代码 (go,java,python,ruby)

push 网关可用来支持短连接任务

可视化的dashboard (两种选择,promdash 和 grafana.目前主流选择是 grafana.)

实验性的报警管理端(alertmanager,单独进行报警汇总,分发,屏蔽等 )



2. Prometheus简单部署(Linux-Centos)

先在官网下载对应安装包(https://prometheus.io/download/),放在Linux中进行解压。具体执行命令如下:

tar xvfz prometheus-*.tar.gz
cd prometheus-*

在prometheus文件目录中有一个prometheus.yml文件,使用的是是整个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).

# 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作为监控的对象名称,每个job-name不可以重复,其中static_configs下的targets参数很关键,决定了监听的服务地址。在prometheus文件目录下,可以通过如下命令去启动关闭服务。

//启动prometheus服务
nohup ./prometheus --config.file=prometheus.yml

//查询启动的prometheus服务
ps -ef |grep prometheus

//关闭prometheus服务
kill -9 {prometheus-id}

在启动服务之后,我们可以在虚拟机内访问 http://localhost:9090查看监控状况,也可通过虚拟机的映射地址远程访问。大致如下图所示



3. Prometheus中PromQL语法记录

在上面的第一个查询框中,可以通过PromQL语句对采集的数据进行处理展示,故把常用的PromQL语法记录如下。

常见匹配符

+,-,*,/,%,^(加,减,乘,除,取余,幂次方)
==,!=,>,<,>=,<=(等于,不等于,大于,小于,大于等于,小于等于)

常见函数

sum(求和),min(取最小),max(取最大),avg(取平均),count (计数器)
stddev (计算偏差),stdvar (计算方差),count_values(每个元素独立值数量),bottomk (取倒数几个),topk(取前几位)

具体使用

查询指标name为http_requests_total   条件为job,handler 的数据:
http_requests_total{job="apiserver", handler="/api/comments"}

取5min内 其他条件同上的数据:
http_requests_total{job="apiserver", handler="/api/comments"}[5m]

匹配job名称以server结尾的数据:
http_requests_total{job=~".*server"}

匹配status不等于4xx的数据:
http_requests_total{status!~"4.."}

查询5min内,每秒指标为http_requests_total的数据比率:
rate(http_requests_total[5m])

根据job分组,取每秒数据数量:
sum(rate(http_requests_total[5m])) by (job)

取各个实例的未使用内存量(以MB为单位)
(instance_memory_limit_bytes - instance_memory_usage_bytes) / 1024 / 1024
以app,proc为分组,取未使用内存量(以MB为单位)
sum( instance_memory_limit_bytes - instance_memory_usage_bytes) by (app, proc) / 1024 / 1024

假如数据如下:
instance_cpu_time_ns{app="lion", proc="web", rev="34d0f99", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="elephant", proc="worker", rev="34d0f99", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="turtle", proc="api", rev="4d3a513", env="prod", job="cluster-manager"}
instance_cpu_time_ns{app="fox", proc="widget", rev="4d3a513", env="prod", job="cluster-manager"}

以app,proc为分组,取花费时间前三的数据:
topk(3, sum(rate(instance_cpu_time_ns[5m])) by (app, proc))

以app分组,取数据的个数:
count(instance_cpu_time_ns) by (app)

http每秒的平均响应时间:
rate(basename_sum[5m]) / rate(basename_count[5m])

后续会继续更新prometheus配合其他组件、监控多种服务的实践记录,若此文存在不足或漏洞,也请在评论中不吝指教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Prometheus