Micrometer监控指标上报Starrocks

news/2025/11/29 9:13:56/文章来源:https://www.cnblogs.com/w1570631036/p/19260657

一、 背景与目标

监控最主要还是上报到Prometheus,可惜成本实在是高昂,特别是存储时间要求得越久,我们这里探索了下micrometer转换成json,然后存储到starrocks这类mpp olap引擎,通过starrocks的存算分离架构,降低成本。


二、 总体架构

Spring Boot + Micrometer --指标采集--> Kafka --消息流--> Flink --清洗/聚合/分流--> StarRocks (metric_data / metric_series)

三、Spring Boot MeterRegister 发送至kafka

在此之前,我们上报Prometheus的时候,一般都是再Spring Boot中配置micrometer-registry-prometheus即可,这种方式主要是Pull模式,暴露/actuator/prometheus的指标,然后由Prometheus抓取。同时还有一种Step模式,即:定义一个周期T,周期结束时相关指标清零。

特性 Step(Delta)模式 Cumulative(累计)模式
值含义 当前时间窗的增量 从启动至今的总和
是否清零 是(周期切换后清零)
场景 Push 型采集系统 Pull 型采集系统
数据延迟影响 延迟会导致丢失当前周期数据 延迟只影响分辨率,不丢数据
计算速率方式 注册表已按步长计算 采集端函数计算
如果采用累计模式,存储到数据库里则是不断增加的值,如果要计算某一段分钟或者小时的值,则需要使用窗口函数,对数据库压力巨大。相比之下,直接在采集的时候就做好差分,对数据库压力很小,故Step步长模式更适合我们。

3.1 代码样例

先是定义export的配置,也可以做成通用的spring-boot-starter给别的服务用。

@Data  
@Component  
@ConfigurationProperties(prefix = "management.metrics.export.kafka")  
public class KafkaMeterRegistryConfig implements StepRegistryConfig {  private String topic = "default_topic";  private Duration step = Duration.ofSeconds(30);  @Override  @NonNull    public String prefix() {  return "management.metrics.export.kafka";  }  @Override  public String get(@NotNull String key) {  return null;  }  @Override  @NonNull   public Duration step() {  return step;  }  
}

其次,通过扩展定义您自己的计量表注册表StepMeterRegistry,如下所示:

public class KafkaMeterRegistry extends StepMeterRegistry {  private final KafkaTemplate<String, String> kafkaTemplate;  private final String topic;  public KafkaMeterRegistry(KafkaMeterRegistryConfig config,  Clock clock,  KafkaTemplate<String, String> kafkaTemplate) {  super(config, clock);  this.kafkaTemplate = kafkaTemplate;  this.topic = config.getTopic();  start(new NamedThreadFactory("kafka-metrics-publisher"));  log.info("KafkaMeterRegistry created");  }  @Override  protected void publish() {  // 每个step结束后该方法被调用  long ts = System.currentTimeMillis();  for (Meter meter : this.getMeters()) {  //关键字:窗口切换  //不要在 publish() 里重复调用同一个 meter.measure() 多次,否则第一次调用就清零了,后面会拿到零值。  //不要依赖 publish() 之后还去别处用同一个 StepMeterRegistry 的 Meter 做跨周期累计,因为 step 运行就是为时间窗统计设计的,跨周期值会被清零。  for (Measurement ms : meter.measure()) {  ...准备数据kafkaTemplate.send(topic, jsonString);  }  }  }  @NotNull  @Override    protected TimeUnit getBaseTimeUnit() {  return TimeUnit.MILLISECONDS; // 发送数据时间单位  }  
}

最后,创建注册表配置和计量表注册表相关的BEAN。如果您使用 Spring Boot,可以按如下方式操作:

@Configuration  
public class MetricsConfig {  @Bean  public KafkaMeterRegistry customMeterRegistry(KafkaMeterRegistryConfig kafkaMeterRegistryConfig,  Clock clock,  KafkaTemplate<String, String> kafkaTemplate) {  return new KafkaMeterRegistry(kafkaMeterRegistryConfig, clock, kafkaTemplate);  }  }

3.2 底层如何实现Step模式

目前,核心疑问点在于是如何清零的?是否有丢数据的可能?
在 Micrometer 中,步长周期(Step Interval)的处理逻辑主要由 StepMeterRegistry 完成,这类 Registry(例如 DatadogMeterRegistryAtlasMeterRegistry)会确保每个时间窗口的指标值是该窗口的增量数据,而不是自应用启动以来的累计值。

Pasted image 20251126164809

┌─ StepMeterRegistry.publish()  ← 定时任务  
│  
├─ meter.measure()  ← 对 StepCounter 调用 measure  
│  
├─ StepCounter.poll()  
│    ├─ double v = count.get()  
│    ├─ count.set(0.0)           ← 清零  
│    ├─ lastStepTime.set(now)    ← 标记窗口开始时间  
│    └─ 返回当前窗口的值给 publish  

简单的说,就是:

  1. StepMeterRegistry 定时(按 step 配置)调用 publish()
  2. publish() 会遍历所有的 meter,包括 Counter。
  3. 对 StepCounter 而言,poll() 会返回当前窗口增量并清零。
  4. 下一个步骤周期继续从 0 开始累加。

因此,清零是在采集周期触发,其条件是:

  • now - lastStepTime >= stepMillis

处理完后发送到kafka就是类似:

{"ts": "2024-06-01 12:00:00.000","name": "http_server_requests_total_time","env": "prod","labels": { "uri": "/api/orders", "method": "POST" },"value": 3.14159
}

四、 存储方案对比

我们以一串json为例

{  "metricName": "cpu_usage",  "labels": {  "host": "server-01",  "region": "us-east"  },  "timestamp": "2025-10-15T08:01:12.123Z",  "value": 0.73  
}  

直接可以对第一层key建表,metricName、timestamp、value都可以直接约定为列,目前问题的核心主要有两个:
(1)labels如何存储
(2)针对Histogram、Summary、Gauge的上报如何处理。
我们先来解决第一个问题,labels如何存储。

4.1 方案一:字符串拼接

如果维度比较少的情况下,确实可以考虑通过字符串截取来实现,比如上面的存储为server-01|us-east,通过split竖线来获取响应的字段,例如:

SPLIT_PART('server-01|us-east', '|', 1) AS host_value,
SPLIT_PART('server-01|us-east', '|', 2) AS region_value

这种如果labels多的情况下,需要自行约定字符串的顺序,而且数据量的情况下,SPLIT_PART性能消耗也比较大。

4.2 方案二:指标表 + 标签维表 + 倒排索引

flowchart LR A[Micrometer采集] --> B[Kafka队列] B --> C[Flink ETL] C --> D[StarRocks metric_data] C --> E[StarRocks metric_series] E -->|倒排索引| F[标签快速检索] D --> F

这种主要是想把指标和labels拆出来放到不同的两个表里,同时使用一个唯一id关联为一批数据,一开始有点豁然开朗,后来一想,(1)维度如果很多,但是只查一个维度的数据,这种关联不准确;(2)如果要关联查询,特别是维度多的情况下,sql复杂度翻好几倍,维护性大大降低。

4.3 方案三:Flat JSON 存储

考虑了一下简单粗暴的方法,labels直接存储为JSON列,刚好看到starrocks的新特性Flat JSON,Flat JSON的核心原理是在导入时检测JSON数据,并从JSON数据中提取常用字段,作为标准类型数据存储。在查询JSON时,这些常用字段优化了JSON的查询速度,刚好符合我们的条件。

CREATE TABLE monitor_data  
(  ts      DATETIME COMMENT '指标时间',  name STRING COMMENT '指标名称',  env STRING COMMENT '环境',  dc STRING COMMENT '数据中心',  biz_id BIGINT COMMENT '业务 ID',  labels  JSON COMMENT '指标标签(JSON 格式)',  value   DOUBLE COMMENT '指标值'  
)  ENGINE = OLAP DUPLICATE KEY(`ts`,`name`,`env`,`dc`,`biz_id`)  
COMMENT "监控"  
PARTITION BY date_trunc('day', ts)  
DISTRIBUTED BY HASH(`name`,`env`,`dc`,`biz_id`)  
ORDER BY (`name`,`ts`)  
PROPERTIES (  
"compression" = "LZ4",  
"flat_json.enable" = "true",
"fast_schema_evolution" = "false",  
"partition_live_number" = "366",  
"replicated_storage" = "true",  
"replication_num" = "3"  
);

五、Flink入库

starrocks是可以直接通过jdbc方式入库的,但是JDBC 适合低并发、小批量,容易出现性能问题,对于复杂多表、多源、字段更新场景,Kafka + Flink + StarRocks 是最安全高效的方案。具体也不展开讲解,这个配合下公司基建来即可。

六、入库后样例

  • 写入数据后展示:
ts name env dc biz_id labels value
2024-06-01 12:00:00 http_requests_count prod eu 0 3.14159
  • 最近 5 分钟各接口请求数(以 http_requests_count 为例,按 method/status 维度聚合):
SELECTJSON_VALUE(labels, '$.method') AS method,JSON_VALUE(labels, '$.status') AS status,SUM(value) AS total_requests
FROM monitor_data
WHERE name = 'http_requests_count'AND ts >= NOW() - INTERVAL 5 MINUTEAND env = 'prod'
GROUP BY method, status
ORDER BY total_requests DESC;

参考:

Custom Meter Registry

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/980383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用时间sql语句

取得当天0时0分0秒和23时59分59秒--MYSQL SELECT DATE_FORMAT(SYSDATE(), %Y-%m-%d 23:59:59) FROM DUAL; SELECT DATE_FORMAT(SYSDATE(), %Y-%m-%d 00:00:00) FROM DAUL; --ORACLE SELECT TRUNC(SYSDATE)+1-1/86400 …

2025年重力式货架品牌口碑排行榜前十强权威推荐

摘要 随着物流行业的快速发展,重力式货架作为高效仓储解决方案的重要组成部分,在2025年迎来了新一轮技术革新与市场洗牌。本文基于行业数据调研、技术参数对比及用户口碑反馈,综合评出本年度重力式货架品牌前十强榜…

2025年导热油旋转接头厂家权威推荐榜单:高速高压旋转接头/高温旋转接头‌/高速旋转接头‌源头厂家精选

在高温流体传输领域,可靠密封的背后,是精密制造与创新技术的完美融合。 在工业流体传输系统持续向高温、高压、高效率方向发展的背景下,导热油旋转接头作为热油管路中的核心密封部件,其耐高温稳定性、密封可靠性及…

2025实力强的加氢反应釜TOP5推荐:实力强的加氢反应釜哪

当前,化工、能源、材料等领域的科研与生产对加氢反应釜的需求日益严苛,不仅要求设备具备稳定的高温高压耐受性能,更需兼顾数据精准度、安全防护与定制化适配能力。然而,市场上设备质量参差不齐,部分产品存在数据误…

2025年AGV无线充电能快速响应、定制规格及零部件制造厂家

为帮AGV集成商、智能制造企业高效锁定适配需求的无线充电合作伙伴,避免选型走弯路,我们从技术响应速度(如定制方案交付周期、故障处理时效)、定制化能力(规格适配性、场景兼容性)、零部件品质(稳定性、耐久性)…

2025年钢木货架品牌排行榜前十强权威推荐

摘要 随着仓储物流行业的快速发展,钢木货架作为仓储设备的重要组成部分,其市场需求持续增长。2025年钢木货架行业呈现出智能化、定制化、高效化的发展趋势,各大品牌纷纷加大技术研发投入。本文基于市场调研数据和用…

实用指南:八大排序算法

实用指南:八大排序算法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…

2025年兰州钢木货架品牌综合推荐榜单:甘肃三阳货架领跑行业

摘要 随着仓储物流行业的快速发展,兰州钢木货架市场需求持续增长,2025年行业规模预计突破15亿元。本文基于市场调研数据、用户口碑评价和技术实力分析,为您呈现兰州地区钢木货架品牌综合推荐榜单。榜单数据来源于行…

告别盲人摸象,数据分析的抽样方法总结

当你踏入数据分析的大门时,可能会被海量的数据淹没,感到无从下手。 想象一下,你想了解一座巨大森林里所有树木的平均高度,难道要一棵一棵地去测量吗?这显然不现实。 这时,“抽样” 这个强大的工具就该登场了! 本…

2025年甘肃穿梭式货架十大品牌权威推荐榜单

摘要 随着西北地区仓储物流行业的快速发展,穿梭式货架作为高效仓储解决方案的重要组成部分,在甘肃地区呈现出蓬勃发展的态势。本文基于市场调研数据和行业专家评价,为您呈现2025年甘肃地区穿梭式货架品牌综合排名,…

2025年钢球厂家权威推荐榜单:不锈钢球/钢珠‌/不锈钢珠‌源头厂家精选

在工业基础件领域,小小钢球看似不起眼,却堪称机械的“关节”,其精度与质量直接关系到整个设备系统的运转效率与寿命。 在工业制造领域,钢球作为轴承、汽车配件、精密仪器等关键部件的核心元素,其质量直接决定着机…

2025年兰州仓储货架品牌排名TOP5:三阳货架领跑行业

摘要:随着西北地区物流仓储业的快速发展,2025年兰州仓储货架行业迎来新一轮技术革新与市场洗牌。本文基于行业数据、技术实力、客户口碑等多维度评估,为您权威解析兰州地区仓储货架品牌TOP5排名。甘肃三阳仓储设备有…

2025年实验室反应釜仪器公司年度排名:莱北仪器公司概况

在科研仪器领域,反应釜作为化工、材料、制药等行业的核心实验设备,其性能、设计与便携性直接影响实验效率与安全性。面对市场上参差不齐的仪器厂商,如何选择适配科研需求的设备?以下结合仪器公司概况、产品外观设计…

2025年度杭州人工智能创新能力与客户满意度排行榜,智搜未来

为帮助企业精准筛选兼具技术创新与服务口碑的AI营销服务商,避免选型误区,我们从人工智能创新能力(如技术底层架构、功能迭代速度)、客户满意度(含真实评价反馈、问题响应效率)、行业落地案例(垂直领域适配性、业…

2025 年 11 月衬塑管道定制厂家最新推荐:优质企业全面剖析,助企业精准选品

引言在化工、医药、环保、食品等关键行业,衬塑管道作为核心防腐设备,其品质与定制能力直接影响生产安全与效率。当前市场中,产品性能差异显著,部分产品难以适配复杂工况,定制服务也存在响应滞后问题。 为筛选优质…

前端加密繞過

1、搭建encrypt-labs靶场,复现AES加密绕过和加签绕过实验 [搭建encrypt-labs靶场][AES加密绕过]-第一关[加签绕过实验]-第六关2、复习内网渗透基础课件中的Kerberos协议并理解黄金、白银票据原理Kerberos-[流程 clien…

数据库运维:mysql 数据库迁移方法-mysqldump

数据库运维需要掌握的技能之一数据库的迁移,而MySQL数据库是我们常用的数据库之一,掌握mysql 数据库的数据迁移,也是必备的技能选项。数据库的迁移,我们必须要思考如下几个点:需要迁移数据库的数据量大小需要迁移…

2025年液压多通路旋转接头厂家权威推荐榜单:液压旋转接头/高温旋转接头‌/高速旋转接头‌源头厂家精选

在工业流体传输领域,可靠密封的背后,是精密制造与创新技术的完美融合。 在工业自动化飞速发展的今天,液压多通路旋转接头作为关键基础元件,其性能直接影响整个流体传输系统的运行效率与稳定性。2025年行业数据显示…

2025年兰州牛肉面加盟品牌推荐排行榜Top5

摘要 兰州牛肉面作为中国餐饮文化的瑰宝,近年来行业发展迅速,加盟模式成为创业者热门选择。2025年,随着消费升级和品牌化趋势,优质加盟公司凭借全产业链支持和成熟服务体系脱颖而出。本文基于市场调研和用户口碑,…

2025年陇尚合牛肉面加盟top10:权威排名与深度解析

摘要 兰州牛肉面行业在2025年持续蓬勃发展,得益于消费升级和餐饮连锁化趋势,加盟模式成为创业者热门选择。本文基于市场调研和行业数据,综合评估品牌实力、加盟支持、口碑评价等维度,发布2025年牛肉面加盟品牌排名…