当前位置: 首页 > news >正文

新乡网站建设哪家好备案 网站名称

新乡网站建设哪家好,备案 网站名称,网站优化竞争对手分析,运城环保局网站王建设让我详细分析Grafana源码中计算step的完整逻辑,它确实比简单的intervalMs/1000复杂得多。 完整的Step计算流程 1. 入口点:[models.Parse](file://F:\JavaProject\grafana-release-11.2.0\pkg\promlib\models\query.go#L190-L274)函数 在pkg/promlib/mode…

让我详细分析Grafana源码中计算step的完整逻辑,它确实比简单的intervalMs/1000复杂得多。

完整的Step计算流程

1. 入口点:[models.Parse](file://F:\JavaProject\grafana-release-11.2.0\pkg\promlib\models\query.go#L190-L274)函数

pkg/promlib/models/query.go中:

func Parse(span trace.Span, query backend.DataQuery, dsScrapeInterval string, intervalCalculator intervalv2.Calculator, fromAlert bool, enableScope bool) (*Query, error) {model := &internalQueryModel{}if err := json.Unmarshal(query.JSON, model); err != nil {return nil, err}// Final step value for prometheuscalculatedStep, err := calculatePrometheusInterval(model.Interval, dsScrapeInterval, int64(model.IntervalMS), model.IntervalFactor, query, intervalCalculator)if err != nil {return nil, err}// ...return &Query{Expr:          expr,Step:          calculatedStep,  // 这就是最终的step值// ...}, nil
}

2. 核心计算函数:calculatePrometheusInterval

func calculatePrometheusInterval(queryInterval, dsScrapeInterval string,intervalMs, intervalFactor int64,query backend.DataQuery,intervalCalculator intervalv2.Calculator,
) (time.Duration, error) {// 保存原始queryInterval用于后续比较originalQueryInterval := queryInterval// 如果使用变量(如$__interval),则清空queryIntervalif isVariableInterval(queryInterval) {queryInterval = ""}// 1. 获取最小间隔minInterval, err := gtime.GetIntervalFrom(dsScrapeInterval, queryInterval, intervalMs, 15*time.Second)if err != nil {return time.Duration(0), err}// 2. 使用intervalCalculator计算间隔calculatedInterval := intervalCalculator.Calculate(query.TimeRange, minInterval, query.MaxDataPoints)// 3. 计算安全间隔safeInterval := intervalCalculator.CalculateSafeInterval(query.TimeRange, int64(safeResolution))// 4. 选择较大的间隔值adjustedInterval := safeInterval.Valueif calculatedInterval.Value > safeInterval.Value {adjustedInterval = calculatedInterval.Value}// 5. 特殊处理$__rate_interval情况if originalQueryInterval == varRateInterval || originalQueryInterval == varRateIntervalAlt {// Rate interval有特殊计算逻辑return calculateRateInterval(adjustedInterval, dsScrapeInterval), nil} else {// 6. 应用intervalFactorqueryIntervalFactor := intervalFactorif queryIntervalFactor == 0 {queryIntervalFactor = 1}return time.Duration(int64(adjustedInterval) * queryIntervalFactor), nil}
}

3. intervalCalculator的实现

pkg/promlib/intervalv2/intervalv2.go中:

func (ic *intervalCalculator) Calculate(timerange backend.TimeRange, minInterval time.Duration, maxDataPoints int64) Interval {to := timerange.To.UnixNano()from := timerange.From.UnixNano()resolution := maxDataPointsif resolution == 0 {resolution = DefaultRes  // 默认1500}// 核心计算:(时间范围) / (最大数据点数)calculatedInterval := time.Duration((to - from) / resolution)// 如果计算出的间隔小于最小间隔,则使用最小间隔if calculatedInterval < minInterval {return Interval{Text: gtime.FormatInterval(minInterval), Value: minInterval}}// 对计算出的间隔进行四舍五入调整rounded := gtime.RoundInterval(calculatedInterval)return Interval{Text: gtime.FormatInterval(rounded), Value: rounded}
}

4. gtime.RoundInterval的实现

这个函数在SDK中,用于将计算出的间隔四舍五入到标准值:

// 这是简化版的逻辑,实际更复杂
func RoundInterval(interval time.Duration) time.Duration {// 根据不同的间隔范围,四舍五入到标准值switch {case interval < 15*time.Second:return 15 * time.Secondcase interval < 30*time.Second:return 30 * time.Secondcase interval < 1*time.Minute:return 1 * time.Minute// ... 更多情况default:return interval}
}

5. 特殊情况:Rate Interval计算

func calculateRateInterval(queryInterval time.Duration,requestedMinStep string,
) time.Duration {scrape := requestedMinStepif scrape == "" {scrape = "15s"}scrapeIntervalDuration, err := gtime.ParseIntervalStringToTimeDuration(scrape)if err != nil {return time.Duration(0)}// Rate interval = max(queryInterval + scrapeInterval, 4 * scrapeInterval)rateInterval := time.Duration(int64(math.Max(float64(queryInterval+scrapeIntervalDuration), float64(4)*float64(scrapeIntervalDuration))))return rateInterval
}

实际计算示例

假设:

  • 时间范围:1小时 (3,600,000毫秒)
  • maxDataPoints:1147
  • intervalMs:从面板宽度计算得出
  • dsScrapeInterval:“15s”

计算过程:

  1. calculatedInterval = 3,600,000ms / 1147 ≈ 3139ms
  2. RoundInterval(3139ms) → 5000ms (四舍五入到标准值)
  3. safeInterval = 3,600,000ms / 11000 ≈ 327ms (安全间隔)
  4. adjustedInterval = max(5000ms, 327ms) = 5000ms
  5. 如果没有intervalFactor,则最终step = 5000ms = 5s

与简单intervalMs/1000的区别

  1. 四舍五入:计算结果会被四舍五入到标准间隔值
  2. 最小间隔限制:不会小于数据源的scrape间隔
  3. 安全间隔:会考虑一个安全的上限
  4. 特殊变量处理:对$__rate_interval等变量有特殊处理
  5. intervalFactor:可以放大间隔
  6. 显式step优先:如果查询中设置了step字段,会直接使用

Java实现建议

基于这个复杂的逻辑,您的Java实现应该包括:

public class PrometheusStepCalculator {public static long calculateStep(Long explicitStep,           // 显式设置的step(秒)String interval,             // 查询中的interval字段long intervalMs,             // 前端计算的intervalMslong intervalFactor,         // intervalFactorString dsScrapeInterval,     // 数据源scrape间隔(如"15s")long timeRangeMs,            // 查询时间范围(毫秒)long maxDataPoints          // maxDataPoints) {// 1. 显式step优先if (explicitStep != null) {return explicitStep;}// 2. 处理变量情况if (isVariableInterval(interval)) {interval = "";}// 3. 获取最小间隔long minInterval = getMinInterval(dsScrapeInterval, interval, intervalMs);// 4. 计算基本间隔long calculatedInterval = calculateBaseInterval(timeRangeMs, maxDataPoints);// 5. 四舍五入到标准值long roundedInterval = roundInterval(calculatedInterval);// 6. 计算安全间隔long safeInterval = calculateSafeInterval(timeRangeMs);// 7. 选择较大值long adjustedInterval = Math.max(roundedInterval, safeInterval);// 8. 应用最小间隔限制adjustedInterval = Math.max(adjustedInterval, minInterval);// 9. 应用intervalFactorif (intervalFactor <= 0) {intervalFactor = 1;}long finalInterval = adjustedInterval * intervalFactor;// 10. 转换为秒return finalInterval / 1000;}// 实现各个辅助方法...
}

这解释了为什么您的观察数据与简单的intervalMs/1000不一致,因为Grafana进行了复杂的调整和优化。

http://www.dtcms.com/a/465909.html

相关文章:

  • 版本控制器 git(5)--- git 标签管理
  • BShare HTTPS 集成与排查实战,从 SDK 接入到 iOS 真机调试(bshare https、签名、回调、抓包)
  • 基于同步压缩连续小波变换(SS-CWT)的微震图像去噪与起始检测
  • 太原网站建设工作室wordpress的内链插件
  • 简述网站开发流程 旅游做网站送邮箱
  • 湖北省住房建设厅网站网站备案登记查询系统
  • uri: mongodb://jack:123456@localhost://27017 数据库访问其他的写法
  • 在K8s中,seaweedFS 和 Longhorn 的比较
  • 146、【OS】【Nuttx】【周边】效果呈现方案解析:特殊变量$
  • 实现流水灯
  • 培 网站建设方案 doc台州seo网站推广
  • vue前端面试题——记录一次面试当中遇到的题(3)
  • Vuex的工作流程
  • 学习笔记:Vue Router 动态路由与参数匹配详解
  • seo怎样新建网站wordpress 底部模板
  • 高性能场景推荐使用PostgreSQL
  • 用一颗MCU跑通7B大模型:RISC-V+SRAM极致量化实战
  • 前端开发框架全景解析:从演进到实践与未来趋势
  • 葫芦岛做网站百度经验发布平台
  • 做网站找合作伙伴南昌网站建设精英
  • (二)deepseek控制机械臂-机械臂提示词设置测试
  • Blender概念抽象有机体模型资产生成器预设 Organic Generator V1.0附使用教程
  • Go语言实战:高并发服务器设计与实现
  • 数字化转型:概念性名词浅谈(第七十讲)
  • 云服务器安装最新版本的nodejs
  • 一键提交网站优质作文网站
  • csv excel
  • A* 工程实践全指南:从启发式设计到可视化与性能优化
  • Python+requests+excel 接口自动化测试框架
  • [Dify] 将外部数据库表或 Excel 转为知识库内容的最佳实践