Prometheus的Client Library提供度量的四种基本类型包括:Counter,Gauge,Histogram,Summary。
当访问Exporter的/metrics API地址时我们可以看到类似于一下返回值,其中HELP用于说明度量类型,TYPE用于数据类型说明。
# HELP obs_internetrecv 公网流出流量
# TYPE obs_internetrecv gauge
obs_internetrecv{reskey="duoyun-buck-lzc-0830-1",restype="obs",platform="apsara",instanceUuid="duoyun-buck-lzc-0830-1",cloudTypeId="666677",platformAuthId="740026",orgId="767",} 0.0
四种数据类型
1.Counter计数器
Counter类型,Counter类型好比计数器,只增不减(除非系统发生了重置),用于统计类似于:CPU运行时间,API访问总次数,异常发生次数等等场景。这些指标的特点就是增加不减少。
public class PrometheusMetricsInterceptor extends HandlerInterceptorAdapter {
static final Counter requestCounter = Counter.build()
.name("io_namespace_http_requests_total")
.labelNames("path", "method", "code")
.help("Total requests.").register();
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String requestURI = request.getRequestURI();
String method = request.getMethod();
int status = response.getStatus();
requestCounter.labels(requestURI, method, String.valueOf(status)).inc();
//调用inc()函数,每次请求发生时计数+1
super.afterCompletion(request, response, handler, ex);
}
}
2.Gauge(仪表盘类型)(天穹目前主要用这个)
Gauge是可增可减的指标类,可以用于反应当前应用的状态。比如在监控实例时,主机当前的内存大小,可用内存大小。
public class PrometheusMetricsInterceptor extends HandlerInterceptorAdapter {
static final Gauge inprogressRequests = Gauge.build()
.name("io_namespace_http_inprogress_requests").labelNames("path", "method", "code")
.help("Inprogress requests.").register();
// 计数器+1
public boolean inc(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
String method = request.getMethod();
int status = response.getStatus();
inprogressRequests.labels(requestURI, method, String.valueOf(status)).inc();
return super.preHandle(request, response, handler);
}
// 计数器-1
public void dec(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String requestURI = request.getRequestURI();
String method = request.getMethod();
int status = response.getStatus();
inprogressRequests.labels(requestURI, method, String.valueOf(status)).dec();
super.afterCompletion(request, response, handler, ex);
}
// 设置为零
public void setZero(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String requestURI = request.getRequestURI();
String method = request.getMethod();
int status = response.getStatus();
inprogressRequests.labels(requestURI, method, String.valueOf(status)).set(0);
super.afterCompletion(request, response, handler, ex);
}
}
3.Histogram(直方图类型)(还需要再理解)
Histogram 由以下组成
_bucket{le=""},
_bucket{le="+Inf"},
_sum,
_count
主要用于表示一段时间范围内对数据进行采样(通常是请求持续时间或响应大小),并能够对其指定区间以及总数进行统计,通常它采集的数据展示为直方图。
4.Summary(摘要类型)(还需要再理解)
与Histogram类型类似,摘要用于表示一段时间内的数据采样的结果(通常是请求持续时间或响应大小等),但它直接存储了分位数(通过客户端计算,然后展示出来),而非通过区间来计算(Histogram的分位数需要通过histogram_quantile(φfloat,b instant-vector)函数计算得到)。因此,对于分位数的计算,Summary在通过PromQL进行查询时有更好的性能表现,而Histogram则会消耗更多的资源。反之,对于客户端而言,Histogram消耗的资源更少。在选择这两种方式时,用户应该根据自己的实际场景选择。
Histogram是在服务端计算的,Summary是在客户端计算的。
Histogram和Summary主用用于统计和分析样本的分布情况。