Prometheus的指标数据以时序数据结构存储。Prometheus的基本形式是以时间顺序存储的标签化的具名数据值。以API调用次数为例,其指标形如:
http_api_count { path="/book", method="GET" } 234
http_api_count { path="/book", method="POST" } 67
其中,http_api_count
是指标的名,path
和method
是指标的标签的名,最后的数据是这个指标的值。这里的值只能是数值。
不同类型的指标,具有不同的行为和设定,会影响到指标的使用方式。Prometheus支持的指标类型有4种。
用于只会增长而会不会下降的数据的计量。同一个Counter的不同项之间一般可以进行有意义的组合,如累加、百分比等。
可用计数器表示的数据示例:
一个接口的已经处理的请求个数,加上另一个接口的已处理请求个数,会可以得出请求个数的总合。是一个新的有意义的指标。
用于可能有上下波动的数据的计量。同一个Guage的不同项之间,一般不太存在有意义的组合。
可用仪表盘表示的数据示例包括:
一个Kafka Topic的消息处理延迟,与另一个Kafka Topic的延迟,相加,不会产生出新的有实际意义的新指标。
单个Prometheus节点大约可以承载每秒100万条数据。这个数据量的计算维度是,每个唯一的标签组合记为一条独立数据。以如下指标为例:
trading_volume_accumulated { currency="CNY", user="hugo" } 10000
currency
大概有200个,user
是注册用户的ID,如果有1万注册用户,这个指标,假设每秒更新一次,那么,每秒就会有10000 * 200 = 200万数据产生。然后基本上就达到Prometheus的处理能力极限了。
这是也在设计数据指标时,最常见的问题:标签的值域过大,导致数据量暴增,很快就撑垮了prometheus系统。
label_values(jvm_memory_used_bytes{application="$application",namespace="$namespace"}, pod)
或
label_values(application)