-
Notifications
You must be signed in to change notification settings - Fork 317
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Supports PromQL natively #596
Comments
https://github.com/vthriller/promql this crate may be useful, but seems out dated. |
Thanks for the link. It looks great! Prometheus has switched to a yacc(goyacc) based parser, so the pure hand-written one might be outdated, but it's still precious to learn from. |
MotivationThe PromQL supported by Prometheus is used widely in cloud-native observability. We want to enable it natively in the GreptimeDB. Design(draft)Including:
So our design will focus on these three parts too. ParserLooks like Prometheus is using yacc to generate the parser. I think we can use it too. Hand-wiring is another choice, but I think it's not necessary. Using the same grammar file is a better way to make our parser compatible with Prometheus easily. Engine(Evaluator)The evaluator is the core part of the engine: // An evaluator evaluates given expressions over given fixed timestamps. It
// is attached to an engine through which it connects to a querier and reports
// errors. On timeout or cancellation of its context it terminates.
type evaluator struct {
ctx context.Context
startTimestamp int64 // Start time in milliseconds.
endTimestamp int64 // End time in milliseconds.
interval int64 // Interval in milliseconds.
maxSamples int
currentSamples int
logger log.Logger
lookbackDelta time.Duration
samplesStats *stats.QuerySamples
noStepSubqueryIntervalFn func(rangeMillis int64) int64
} The core function is eval: // eval evaluates the given expression as the given AST expression node requires.
func (ev *evaluator) eval(expr parser.Expr) (parser.Value, storage.Warnings) {
....
} It would be the most complex part of our work. There are 70 functions at functions.go. They can be implemented step by step. StorageTODO TestPrometheus provides a compatible test suite for other implementations. https://github.com/promlabs/promql-compliance-tester MilestonesThe first milestone may be in 2023, January. Make the PromQL run and let the compatible test cases pass over 60%. |
Follow-up works are tracked at #1042 |
What problem does the new feature solve?
Right now GreptimeDB only supports SQL and gRPC protocols to query data.
PromQL prevails in cloud-native observability. We want to support PromQL natively in GreptimeDB, so I open this issue to track it.
What does the feature do?
Supports PromQL natively.
Implementation challenges
There are some challenges to supporting PromQL in GreptimeDB:
Procedure
SeriesNormalize
plan #787InstantManipulator
for PromQL extension #803group by
&group without
feat: plan some aggregate expr in PromQL planner #870increase
/idelta
/irate
feat: implincrease
andirate
/idelta
in PromQL #880Compliance Test
https://github.com/prometheus/compliance/tree/main/promql
The follow-up works are tracked at #1042
The text was updated successfully, but these errors were encountered: