【一个构想】pull方式获取expoter上的数据,如何更加精简?
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
背景
已知:在prometheus中,每个业务节点通过prometheus client API 来在本地汇聚数据。
然后提供HTTP协议,通过 /metrics 路径把业务节点上的metric数据暴露给prometheus.
协议采用文本格式+GZIP压缩,虽然GZIP压缩率比较高,但是文本协议终归还是不够精简。
思路
如何让每个expoter上的数据传输尽可能的精简呢?
- 二进制协议
- 通过字典来合并重复的字符串
- 既然是一次完整的采样,那么时间戳一定都是一样的。只要采用一个时间戳就行了。
- 浮点数如果没有小数部分,就按整数来存储;整数采用7bit的变长编码,节约空间。
具体存储格式
序列化后的格式可以表示如下:
message Metric{
map<int32, int32> labels = 1; //用下标来表示字典中存储的第N个字符串
repeated float64 values = 2;
}
message Metrics{
bytes gzip_dict = 1; //字典表,经过GZIP压缩
repeated Metric metrics = 2; // 监控数据
int64 global_timestamp = 3; //全局的时间戳
}
运行期的字典,可以表示如下:
type LabelDictForEncode struct{
Data []byte //所有的label name 和 label value顺序存放在大数组中,用\0分割
Labels map[string]int // 每个字符串,指向大数组中的下标
}
type LabelDictForDecode struct{
Data []byte //所有的label name 和 label value顺序存放在大数组中,用\0分割
Labels map[int][]byte //下标,指向大数组中的某一段
}
因此,可以把:
foo{label1="value1",label2="value2"}
bar{label1="value1",label2="value3"}
简化为以下字典:
- foo
- bar
- label1
- label2
- value1
- value2
- value3
相同的内容越多,压缩的空间越大。
当然,还可以排序,合并相同前缀……
最后,每个metric只要索引字典里面的值就可以了。
传输前使用ZSTD压缩,占用空间会进一步缩小。
【一个构想】pull方式获取expoter上的数据,如何更加精简?的更多相关文章
- HttpClient get和HttpClient Post请求的方式获取服务器的返回数据
1.转自:https://blog.csdn.net/alinshen/article/details/78221567?utm_source=blogxgwz4 /* * 演示通过HttpClie ...
- ios - 如何获取app上的数据
做过ios开发的人应该都用过Charles,通常叫它花瓶.Charles是Mac下常用的对网络流量进行分析的工具,类似于Windows下的Fiddler.在开发iOS程序的时候,往往需要调试客户端和服 ...
- 获取百度地图POI数据一(详解百度返回的POI数据)
POI是一切可以抽象为空间点的现实世界的实体,比如餐馆,酒店,车站,停车场等.POI数据具有空间坐标和各种属性,是各种地图查询软件的基础数据之一.百度地图作为国内顶尖的地图企业,其上具有丰富的POI数 ...
- 22SpringMvc_jsp页面上的数据传递到控制器的说明
假设有这个一个业务:在jsp页面上写入数据,然后把这个数据传递到后台. 效果如下:
- Amzon MWS API开发之 上传数据
亚马逊上传数据,现有能操作的功能有很多:库存数量.跟踪号.价格.商品....... 我们可以设置FeedType值,根据需要,再上传对应的xml文件即可. 下面可以看看FeedType类型 这次我们拿 ...
- 如何判断一个C++对象是否在堆栈上(通过VirtualQuery这个API来获取堆栈的起始地址,然后就可以得到答案了),附许多精彩评论
昨天有人在QQ群里问到如何判断一个C++对象是否在堆栈上, 我在网上搜索了下, 搜到这个么一个CSDN的帖子http://topic.csdn.net/t/20060124/10/4532966. ...
- 获取UILabel上最后一个字符串的位置。获取文字长度和高度,自动换行
//行的高度. -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPat ...
- 获取第上一个兄弟元素 屏蔽浏览器的差异(PreviousElementSibling)
//获取element上一个兄弟元素 function getPreviousElementSibling(element){ //能力检测 判断是否支持PreviousElementSibling ...
- 大一C语言学习笔记(11)---编程篇--写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积,要求 0 bug;
考核内容: 写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积: 答案: #include<stdio.h ...
- 使用IO映射的方式获取tiny4412板子上的ID号
在以前的文章中,有一篇 基于ARM-contexA9-Linux驱动开发:如何获取板子上独有的ID号 在那篇文章中,具体可以参考.那时候我使用了简单的字符设备驱动框架,最终的ID号通过read方法可将 ...
随机推荐
- selenium-web自动化(po模型)
什么是po模型呢?简单理解就是:把每个页面当成一个对象,给这些页面当成一个类,主要就是完成元素定位和业务操作:把它和测试脚本区分开来,需要什么取这些页面类去调用即可.这样的好处在于页面元素发生变化时, ...
- 【django-Vue】项目day01 pip永久换源 虚拟环境搭建 项目前后端创建 项目目录调整
目录 昨日回顾 1 企业项目类型 2 企业项目开发流程 3 路飞项目需求 4 pip永久换源 5 虚拟环境搭建 5.1 使用pycharm创建虚拟环境 5.2 通用方案创建虚拟环境 6 luffy项目 ...
- 【Vue day01】前端发展介绍 Vue的快速使用 插值语法 指令系统之文本指令、事件指令、属性指令
目录 前端发展介绍 Vue框架入门 M-V-VM思想(重要) 组件化开发 单页面应用 Vue的快速使用 前期准备 快速使用 对象与标签绑定 查看Vue对象 插值语法 三目运算符 指令系统之文本指令 v ...
- 拥抱智能,AI 视频编码技术的新探索
随着视频与交互在日常生活中的作用日益突显,愈发多样的视频场景与不断提高的视觉追求对视频编码提出更高的挑战.相较于人们手工设计的多种视频编码技术,AI 编码可以从大数据中自我学习到更广泛的信号内在编码规 ...
- SpringCloud Alibaba技术栈(一)微服务介绍
B 站黑马视频教程:Here 源码-笔记:Code for Github 第一章 微服务总览 1. 软件系统架构的历史 软件系统架构大致经历了:单体应用架构->垂直应用架构->分布式架构- ...
- ==和equals的区别和联系,StringBuffer和StringBuilder,clone方法
==和equals的区别和联系? ( 1)对于==,比较的是值是否相等 如果作用于基本数据类型的变量,则直接比较其存储的 "值"是否相等: 如果作用于引用类型的变量,则比较的是所指 ...
- Linux下安装neo4j
Linux下安装neo4j 一.JDK安装 参照https://www.cnblogs.com/yclh/p/14849228.html 中jdk1.8的安装 二.下载neo4j 下载地址:https ...
- uni-app点赞效果
- Latex常用数学符号输入方法
引用CSDN博文 https://blog.csdn.net/qq_25368751/article/details/87888974
- Oracle实例的启动和关闭
启动模式 1.NoMount 模式(启动实例不加载数据库) 命令:startup nomount 讲解:这种启动模式只会创建实例,并不加载数据库,Oracle仅为实例创建各种内存结构和服务进程,不会打 ...
