Prometheus是一套开源监控报警系统(包括时序列数据库TSDB),自2012年来被许多公司与组织所采用。其中Prometheus的特色以下:java
其中Prometheus生态系统能够有多个组件构成,大多组件都是独立工做的,能够有选择的配置本身须要的服务,主要有如下:python
2. Prometheus简单部署(Linux-Centos)web
先在官网下载对应安装包(https://prometheus.io/download/),放在Linux中进行解压。具体执行命令以下:数据库
tar xvfz prometheus-*.tar.gz cd prometheus-*
在prometheus文件目录中有一个prometheus.yml文件,使用的是是整个Prometheus运行的主配置文件,其中默认配置包含了大多标准配置及自控配置:api
# 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文件目录下,能够经过以下命令去启动关闭服务。ruby
//启动prometheus服务 nohup ./prometheus --config.file=prometheus.yml //查询启动的prometheus服务 ps -ef |grep prometheus //关闭prometheus服务 kill -9 {prometheus-id}
在启动服务以后,咱们能够在虚拟机内访问 http://localhost:9090查看监控情况,也可经过虚拟机的映射地址远程访问。大体以下图所示服务器
3. Prometheus中PromQL语法记录app
在上面的第一个查询框中,能够经过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配合其余组件、监控多种服务的实践记录,若此文存在不足或漏洞,也请在评论中不吝指教。