一:背景与思想
- 背景:目前公司需要统计一些数据, 而这些数据有些量非常大(千万量级的数据)。
- 如果在mysql中做统计, 可能会引发慢查询或者造成mysql集群负载过高的问题。
- 目前业务没有将这些数据同步到ES等数据库, 如果为了统计而调整业务, 这个改造成本比较高。
- 目前这些指标, 都通过打点, 上报到了Prometheus, 因此尝试利用Prometheus来做一些指标统计工作。
- 核心思想:
- 调用Prometheus的HTTP接口, 向接口发送PromQL语句, 解析响应来获取指标信息。
二:相关链接
- PromQL快速入门: https://blog.csdn.net/tototuzuoquan/article/details/119719591
- Prometheus源码分析: https://blog.csdn.net/qq_36648860/article/details/115768087
- 源码:https://github.com/prometheus/prometheus
三:编写Prometheus接口调用工具
import time
import requests
import urllib
prometheus_url = """http://公司Prometheus接口域名/api/v1/query?query={}&dedup=true&partial_response=true&time={}&_={}"""
class PrometheusUtils(object):
def send(self, promql, timestamp):
"""
:param promql: 普罗米修斯查询语句
:param timestamp: 毫秒级时间戳(13位)
:return: 响应信息
"""
url = prometheus_url.format(urllib.quote_plus(promql), timestamp / 1000, timestamp)
print(url)
resp = requests.get(url=url)
return resp.json()
if __name__ == '__main__':
timestamp = time.mktime(time.strptime("2023-06-28 00:00:00", "%Y-%m-%d %H:%M:%S"))
print(int(timestamp * 1000))
resp = PrometheusUtils().send(
promql="""increase(指标名称{product_name="xshl", qulali_status="0"}[1d])""",
timestamp=int(timestamp * 1000))
print(resp)
四:问题
- 这种方式统计的数据不是完全准确的, 目前测试来看, 当数据量过万的时候, 统计数据与实际值, 可能相差个位数。 如果是千万级, 统计数据与真实值, 相差百位数量级的误差。
- 误差来源。
这个是因为prometheus是个时间数据库, 取两个时间点, 计算增量的时候。 会选最近的两个点做增量计算, 然后再加上一些预言推测。 例如:取2023-06-29 00:00:00 到2023-06-30 00:00:00的增量。 但是数据库只有2023-06-29 00:00:01 和2023-06-30 23:59:59 这两个点的数据。 因此增量 = 2023-06-29 00:00:01 和2023-06-30 23:59:59的差值 + 2023-06-29 00:00:00到2023-06-29 00:00:01的预测 + 2023-06-30 23:59:59 到2023-06-30 00:00:00的预测值。
- 误差分析
- 请查看相关链接中的Prometheus源码分析。 该大神详解的相当透彻, 我不必赘述了。
文章来源地址https://www.toymoban.com/news/detail-524285.html
文章来源:https://www.toymoban.com/news/detail-524285.html
到了这里,关于利用Prometheus做指标统计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!