目录

  • 一:背景与思想
  • 二:相关链接
  • 三:编写Prometheus接口调用工具
  • 四:问题


一:背景与思想

  • 背景:目前公司需要统计一些数据, 而这些数据有些量非常大(千万量级的数据)。
  • 如果在mysql中做统计, 可能会引发慢查询或者造成mysql集群负载过高的问题。
  • 目前业务没有将这些数据同步到ES等数据库, 如果为了统计而调整业务, 这个改造成本比较高。
  • 目前这些指标, 都通过打点, 上报到了Prometheus, 因此尝试利用Prometheus来做一些指标统计工作。
  • 核心思想:
  • 调用Prometheus的HTTP接口, 向接口发送PromQL语句, 解析响应来获取指标信息。

二:相关链接

  • PromQL快速入门
  • Prometheus源码分析
  • 源码: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源码分析。 该大神详解的相当透彻, 我不必赘述了。


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6