作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


背景

已知:在prometheus中,每个业务节点通过prometheus client API 来在本地汇聚数据。

然后提供HTTP协议,通过 /metrics 路径把业务节点上的metric数据暴露给prometheus.

协议采用文本格式+GZIP压缩,虽然GZIP压缩率比较高,但是文本协议终归还是不够精简。

思路

如何让每个expoter上的数据传输尽可能的精简呢?

  1. 二进制协议
  2. 通过字典来合并重复的字符串
  3. 既然是一次完整的采样,那么时间戳一定都是一样的。只要采用一个时间戳就行了。
  4. 浮点数如果没有小数部分,就按整数来存储;整数采用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上的数据,如何更加精简?的更多相关文章

  1. HttpClient get和HttpClient Post请求的方式获取服务器的返回数据

    1.转自:https://blog.csdn.net/alinshen/article/details/78221567?utm_source=blogxgwz4 /*  * 演示通过HttpClie ...

  2. ios - 如何获取app上的数据

    做过ios开发的人应该都用过Charles,通常叫它花瓶.Charles是Mac下常用的对网络流量进行分析的工具,类似于Windows下的Fiddler.在开发iOS程序的时候,往往需要调试客户端和服 ...

  3. 获取百度地图POI数据一(详解百度返回的POI数据)

    POI是一切可以抽象为空间点的现实世界的实体,比如餐馆,酒店,车站,停车场等.POI数据具有空间坐标和各种属性,是各种地图查询软件的基础数据之一.百度地图作为国内顶尖的地图企业,其上具有丰富的POI数 ...

  4. 22SpringMvc_jsp页面上的数据传递到控制器的说明

    假设有这个一个业务:在jsp页面上写入数据,然后把这个数据传递到后台. 效果如下:

  5. Amzon MWS API开发之 上传数据

    亚马逊上传数据,现有能操作的功能有很多:库存数量.跟踪号.价格.商品....... 我们可以设置FeedType值,根据需要,再上传对应的xml文件即可. 下面可以看看FeedType类型 这次我们拿 ...

  6. 如何判断一个C++对象是否在堆栈上(通过VirtualQuery这个API来获取堆栈的起始地址,然后就可以得到答案了),附许多精彩评论

      昨天有人在QQ群里问到如何判断一个C++对象是否在堆栈上, 我在网上搜索了下, 搜到这个么一个CSDN的帖子http://topic.csdn.net/t/20060124/10/4532966. ...

  7. 获取UILabel上最后一个字符串的位置。获取文字长度和高度,自动换行

    //行的高度. -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPat ...

  8. 获取第上一个兄弟元素 屏蔽浏览器的差异(PreviousElementSibling)

    //获取element上一个兄弟元素 function getPreviousElementSibling(element){ //能力检测 判断是否支持PreviousElementSibling ...

  9. 大一C语言学习笔记(11)---编程篇--写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积,要求 0 bug;

    考核内容: 写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积: 答案: #include<stdio.h ...

  10. 使用IO映射的方式获取tiny4412板子上的ID号

    在以前的文章中,有一篇 基于ARM-contexA9-Linux驱动开发:如何获取板子上独有的ID号 在那篇文章中,具体可以参考.那时候我使用了简单的字符设备驱动框架,最终的ID号通过read方法可将 ...

随机推荐

  1. 创元集团的数智化实践 这次选择了和火山引擎 VeDI 搭档

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,上海创元化妆品有限公司(以下简称"创元集团")与火山引擎数智平台 VeDI 达成合作,旨 ...

  2. 火山引擎DataLeap:3步打造“指标管理”体系,幸福里数据中心是这么做的

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 一家企业,为什么要搭建指标体系? 一句话总结来说,全面.合理的指标体系可以帮助企业统一目标,将业务环节量化,帮助策 ...

  3. yaml/json/ini 配置读取

    ConfigParser 安装 ConfigParser 是解析配置文件的第三方库,须要安装 pip install ConfigParser pip install ConfigParser Con ...

  4. Vue3--使用脚手架创建一个vue应用,实现todolist

    一.安装脚手架,运行项目 1.1 安装,运行 首先安装 16.0 或更高版本的 Node.js 然后在cmd安装并执行 create-vue 它是 Vue 官方的项目脚手架工具 npm init vu ...

  5. WebRTC SDP 详解和剖析

    WebRTC 是 Web Real-Time Communication,即网页实时通信的缩写,是 RTC 协议的一种 Web 实现,项目由 Google 开源,并和 IETF 和 W3C 制定了行业 ...

  6. GOS会计凭证上传附件

    1.GOS介绍 GOS是一个连接文档和SAP内各种对象的工具,在SAP的一些凭证中,可以通过GOS进行附件的上传.查看和删除等功能,例如采购订单.会计凭证等. 如果没有这个按钮,可以将当前登录用户的类 ...

  7. OOALV 不同ALV调用相同屏幕

    一.一次创建,多次调用 当使用OOALV开发平台,存在点击不同位置,跳转到一个ALV,除ALV内容不一致以外,其他都一样. 常规方法,即跳转到多少个ALV,就创建多少个SCREEN.而屏幕对应的输入输 ...

  8. Java 键值对数据本地保存与读取

    代码: package com.sux.demo.utils; import com.alibaba.fastjson.JSONObject; import java.io.File; import ...

  9. leaflet 绘制 带箭头的线

    箭头不是画的线段,是贴的图标,再按方向旋转一下. 代码: //添加箭头线 function addLineDirection(polylinePointArr, source, target) { v ...

  10. 一个NASA、Google都在用的开源CMS:wagtail

    说起开源CMS,你会想到哪些呢?WordPress?DoraCMS?joomla? 今天再给大家推荐一个非常好用的开源CMS:Wagtail 如果您正在选型的话,可以了解一下Wagtail的特点: 基 ...