Prometheus监控使用实践

  1. 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配合其他组件、监控多种服务的实践记录,若此文存在不足或漏洞,也请在评论中不吝指教。

猜你喜欢

转载自my.oschina.net/u/3293263/blog/1627306