Prometheus-PromQL
Prometheus-PromQL
基于v3.5
工作原理
graph TD
A[Query Input] --> B[Parser]
B --> C[Engine]
C --> D[Query Execution]
D --> E[Result Output]
%% Parser Module
subgraph Parser["Parser (parser/)"]
B1[Lexical Analysis] --> B2[Syntax Parsing]
B2 --> B3[AST Generation]
B3 --> B4[Validation]
end
%% Engine Module
subgraph Engine["Engine (engine.go)"]
C1[Query Initialization] --> C2[Query Planning]
C2 --> C3[Query Evaluation]
C3 --> C4[Result Aggregation]
end
%% Query Execution Module
subgraph QueryExecution["Query Execution"]
D1[Querier Interaction] --> D2[Series Selection]
D2 --> D3[Expression Evaluation]
D3 --> D4[Data Aggregation]
end
%% Core Functions Mapping
B2 -- "generated_parser.y.go" --> F1[Parse Expression]
B3 -- "ast.go" --> F2[Generate AST]
C1 -- "engine.go" --> F3[NewInstantQuery/NewRangeQuery]
C2 -- "engine.go" --> F4[execEvalStmt]
C3 -- "engine.go" --> F5[evaluator.Eval]
D1 -- "engine.go" --> F6[populateSeries]
D3 -- "engine.go" --> F7[calculateDuration]
D4 -- "engine.go" --> F8[handleAggregationError]
启动顺序
graph TD
A[Engine初始化] --> B[配置EngineOpts]
B --> C[创建Query对象]
C --> D[执行Query.Exec]
D --> E[调用Engine.exec]
E --> F[检查上下文是否完成]
F --> G[插入Query到ActiveQueryTracker]
G --> H[执行查询准备阶段]
H --> I[调用execEvalStmt执行查询]
I --> J[创建Evaluator]
J --> K[调用Evaluator.Eval]
K --> L[处理查询结果]
L --> M[记录查询日志]
M --> N[返回查询结果]
- Engine初始化 (NewEngine)
初始化 Engine 对象时,传入 EngineOpts 配置(如超时时间、最大样本数等)。
关键字段包括 timeout、maxSamplesPerQuery、activeQueryTracker 等。 - 创建Query对象
通过 Engine.NewInstantQuery 或 Engine.NewRangeQuery 创建查询对象。
查询对象包含解析后的 PromQL 表达式和相关的查询选项。 - 执行Query.Exec
调用 Query.Exec(ctx) 方法开始执行查询。
此方法会调用 Engine.exec 来处理查询的生命周期。 - 检查上下文是否完成
在 Engine.exec 中,首先检查上下文是否被取消或超时。
如果上下文已完成,则直接返回错误。 - 插入Query到ActiveQueryTracker
将查询插入到 ActiveQueryTracker 中以跟踪活跃查询。
如果达到最大并发查询限制,此步骤会阻塞直到有空闲槽位。 - 执行查询准备阶段
调用 Engine.execEvalStmt 执行查询的准备阶段。
包括解析表达式、构建查询器(Querier)、设置时间范围等。 - 调用Evaluator.Eval
创建 Evaluator 对象并调用其 Eval 方法。
根据表达式的类型(如 Matrix、Vector、Scalar),执行相应的计算逻辑。
处理查询结果 - 根据表达式类型,将结果转换为 Matrix、Vector 或 Scalar。
如果结果是 Matrix,可能需要进一步排序或过滤。 - 记录查询日志
将查询的统计信息和结果记录到日志中。
日志内容包括查询字符串、执行时间、警告信息等。 - 返回查询结果
最终返回查询结果,包含数据值、警告信息和可能的错误
详细流程
初始化
1 | queryEngine = promql.NewEngine(opts) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Joohwan!
评论



