基于Prometheus电表读数计算分时电费
基于Prometheus实现分时电费计算方案
要解决这个问题,核心是通过Prometheus记录规则,结合时间函数拆分不同时段的用电量增量,再乘以对应电价后累加得到累计电费指标。以下是具体实现步骤:
1. 核心思路
利用Prometheus的increase()函数获取电表计数器的周期增量,通过hour()和minute()函数判断当前时段,拆分低价/高价时段的用电量,分别乘以对应电价后累加,最终生成累计电费指标。
2. 记录规则配置
创建Prometheus记录规则文件(比如electricity_cost_rules.yaml),添加以下规则组(按分钟执行,适配电表采集频率):
groups: - name: electricity_cost_calculation interval: 1m # 与电表数据采集频率匹配 rules: # 步骤1:计算当前1分钟内的用电量增量(自动处理计数器重置) - record: electricity:usage:increment:1m expr: increase(electricity_meter_total[1m]) # 步骤2:标记当前是否处于低价时段(00:30-04:30),返回1(是)或0(否) - record: electricity:tariff:is_low expr: | (hour() == 0 and minute() >= 30) or (hour() >= 1 and hour() <= 3) or (hour() == 4 and minute() < 30) # 步骤3:计算当前1分钟的低价电费增量(替换0.3为实际低价电价) - record: electricity:cost:low:increment expr: electricity:usage:increment:1m * electricity:tariff:is_low * 0.3 # 步骤4:计算当前1分钟的高价电费增量(替换0.6为实际高价电价) - record: electricity:cost:high:increment expr: electricity:usage:increment:1m * (1 - electricity:tariff:is_low) * 0.6 # 步骤5:生成累计总电费指标(统计所有历史周期的电费增量之和) - record: electricity:cost:total expr: sum_over_time(electricity:cost:low:increment[1y]) + sum_over_time(electricity:cost:high:increment[1y])
3. 关键细节说明
- 时段判断逻辑:覆盖00:30-01:00、01:00-04:00、04:00-04:30三个区间,确保低价时段无遗漏;
- 计数器重置处理:
increase()函数会自动识别电表计数器的重置(比如电表清零),无需额外处理; - 精度控制:上述规则按分钟级划分时段,如果需要更精确的跨分钟时段计算(比如00:29-00:30这类跨时段的分钟),可以通过计算时段占比调整,示例如下:
之后将电费增量计算中的- record: electricity:tariff:low_ratio expr: | # 处理00:29-00:30分钟,低价时段占1/60 (hour() == 0 and minute() == 29) * (60 - minute())/60 + # 处理00:30-03:59分钟,全时段为低价 ((hour() == 0 and minute() >=30) or (hour() >=1 and hour() <=3)) * 1 + # 处理04:00-04:29分钟,全时段为低价 (hour() ==4 and minute() <30) * 1electricity:tariff:is_low替换为electricity:tariff:low_ratio即可。
4. 验证指标
配置完成后,重启Prometheus或加载规则,即可通过PromQL查询electricity:cost:total获取累计电费,也可查询electricity:cost:low:increment/electricity:cost:high:increment查看单周期的电费增量。
内容的提问来源于stack exchange,提问作者Andrew Wilkinson
相关产品推荐
相关产品推荐

