前言
技巧篇:进阶之路:Prometheus —— 技巧篇
理解篇:进阶之路:Prometheus —— 理解篇
一、关于Prometheus
Prometheus是一套开源的监控系统,它将所有信息都存储为时间序列数据;因此实现一种Profiling监控方式,实时分析系统运行的状态、执行时间、调用次数等,以找到系统的热点,为性能优化提供依据。
Prometheus提供了4中不同的Metrics类型: Counter, Gauge, Histogram, Summary。
Counter:只增不减的计数器
计数器可以用于记录只会增加不会减少的指标类型,比如记录应用请求的总量,cpu使用时间等。
对于Counter类型的指标,只包含一个inc()方法,用于计数器+1。
一般而言,Counter类型的metrics指标在命名中我们使用_total结束,如http_requests_total。
Gauge: 可增可减的仪表盘
对于这类可增可减的指标,可以用于反应应用的当前状态。
例如在监控主机时,主机当前空闲的内存大小,可用内存大小。或者容器当前的cpu使用率,内存使用率。
对于Gauge指标的对象则包含两个主要的方法inc()以及dec(),用户添加或者减少计数。
Histogram:自带buckets区间用于统计分布统计图
主要用于在指定分布范围内(Buckets)记录大小或者事件发生的次数。
Summary: 客户端定义的数据分布统计图
Summary和Histogram非常类型相似,都可以统计事件发生的次数或者大小,以及其分布情况。
Summary和Histogram都提供了对于事件的计数_count以及值的汇总_sum。 因此使用_count,和_sum时间序列可以计算出相同的内容,例如http每秒的平均响应时间:rate(basename_sum[5m]) / rate(basename_count[5m])。
同时Summary和Histogram都可以计算和统计样本的分布情况,比如中位数,9分位数等等。其中 0.0<= 分位数Quantiles <= 1.0。
不同在于Histogram可以通过histogram_quantile函数在服务器端计算分位数。 而Sumamry的分位数则是直接在客户端进行定义。因此对于分位数的计算。 Summary在通过PromQL进行查询时有更好的性能表现,而Histogram则会消耗更多的资源。相对的对于客户端而言Histogram消耗的资源更少。
二、配置步骤
1.引入依赖
<!-- prometheus -->
<dependency><groupId>io.prometheus</groupId><artifactId>simpleclient</artifactId><version>0.3.0</version>
</dependency>
<dependency><groupId>io.prometheus</groupId><artifactId>simpleclient_hotspot</artifactId><version>0.3.0</version>
</dependency>
<dependency><groupId>io.prometheus</groupId><artifactId>simpleclient_servlet</artifactId><version>0.3.0</version>
</dependency>
2.配置bean
import io.prometheus.client.exporter.MetricsServlet;
import io.prometheus.client.hotspot.DefaultExports;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic ServletRegistrationBean servletRegistrationBean(){DefaultExports.initialize();return new ServletRegistrationBean(new MetricsServlet(), "/metrics"); //第二个参数可以自定义,但是不可省略}
}
3.自定义监控指标
name方法定义指标名
help方法定义指标描述
import io.prometheus.client.Counter;
import io.prometheus.client.Gauge;//Counter
static final Counter counter = Counter.build().name("my_counter_total").help("A counter used to describe the debt").register();
counter.inc();//Gauge
static final Gauge gauge = Gauge.build().name("my_gauge").help("A gauge to describe the rest of the money").register();
gauge.inc();
gauge.dec();
4.prometheus.yml
metrics_path的值对应第二步中的"/prometheus"参数,默认为"/metrics"
targets对应需要被监控的项目的地址
- job_name: 'MyMetrics'metrics_path: '/metrics' //此行也可省略static_configs:- targets: - 'localhost:8080'
三、参考
http://www.cnblogs.com/smallSevens/p/7905596.html
小白所学尚浅,文章内容是根据参考+实践理解所得,如果有错误的地方欢迎指正!