利用Prometheus做指标统计

news/2024/5/19 0:57:23 标签: prometheus

目录

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

一:背景与思想

  • 背景:目前公司需要统计一些数据, 而这些数据有些量非常大(千万量级的数据)。
    • 如果在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源码分析。 该大神详解的相当透彻, 我不必赘述了。

http://www.niftyadmin.cn/n/1005657.html

相关文章

React | 再战Redux

✨ 个人主页:CoderHing 🖥️ React.js专栏:React.js 再战Redux 🙋‍♂️ 个人简介:一个不甘平庸的平凡人🍬 💫 系列专栏:吊打面试官系列 16天学会Vue 7天学会微信小程序 Node专栏…

上手vue2的学习笔记2之安装vue的踩坑经历

上一篇笔记 上手vue2的学习笔记1之了解前端三剑客,简单介绍了学习vue框架之前应该具备的基础知识和四个我认为非常有用的学习链接,建议大家动手实践一下,更多深刻的理解前端三剑客之间的关系。 这一篇笔记主要介绍我在安装vue过程中遇到的坑…

四.流程控制语句

1、条件语句 Go 编程语言中 if 条件语句的语法如下: 1、基本形式 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } If 在布尔表达式为 true 时,其后紧跟的语句块执行,如果false 则不执行。 package main import "fmt" fu…

现在低代码平台推进阻力那么大,有没有最好的解决办法?

前言 低代码是一种快速设计和开发软件应用程序并且手动编码最少的方法。通过在图形界面中使用可视化建模来组装和配置应用程序,开发人员可以跳过所有基础架构让开发速度提升起来。 一、发现问题 1.“在踏出一步之前,首先考虑能否退回去” 现在低代码平…

PHP 的 Logo 为什么是大象?

因为大象是世界上最好的动物。 当然,这只是开玩笑,那么为什么PHP的LOGO是大象呢?还有哪些关于PHP的LOGO的有趣的事情呢? 吉祥物-大象 ElePHPant 是一款可爱的 PHP 吉祥物,其设计中有一头大象。 最初的LOGO 1998 年…

GitHub打不开的解决方案(超简单)

在国内,github官网经常面临打不开或访问极慢的问题,不挂梯子(VPN,飞机,魔法)使用体验极差,那有什么好办法解决GitHub官网访问不了的问题?今天小布教你几招轻松访问github官网。 git…

【线程池】Java线程池的内部类Worker详解

目录 一、简介 二、Worker类对象的类图 三、Worker类对象的解释 4.2 Worker继承自AQS有何意义? 四、Worker的主要代码 4.1 运行worker 4.2 worker和ThreadPool的关系 五、Worker源码分析 5.1 Worker实现接口Runnable,执行run方法 5.2 核心方法…

上手vue2的学习笔记1之了解前端三剑客

纯小白学习前端开发,找学习资料也花费了一些时间,后续配置环境,也走了很多弯路,这里梳理一下这几天的学习资料,做一个简单的总结。 1.初步了解vue Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&a…