-
Notifications
You must be signed in to change notification settings - Fork 329
perf(prometheus): optimize duplicate metric splitting to O(N) complexity #1383
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
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This PR optimizes the Prometheus parser's metric splitting algorithm to reduce time complexity from O(N*M) to O(N) where N is the buffer size and M is the number of metric chunks. The optimization replaces repeated bytes.Index calls with a single-pass scan using bytes.IndexByte to quickly locate potential delimiters.
- Replaces dual
bytes.Indexcalls per iteration with efficientbytes.IndexBytescanning - Adds logic to skip current delimiter when positioned at one, ensuring forward progress
- Improves performance for large Prometheus metric payloads with many duplicate metrics
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| p := bytes.IndexByte(rest[scanOffset:], '#') | ||
| if p == -1 { | ||
| idx = -1 | ||
| break | ||
| } | ||
|
|
||
| // Potential delimiter found at relative index (scanOffset + p) | ||
| candidate := rest[scanOffset+p:] | ||
|
|
||
| // Verify if it is indeed a header | ||
| if bytes.HasPrefix(candidate, helpHeader) || bytes.HasPrefix(candidate, typeHeader) { | ||
| idx = scanOffset + p | ||
| break | ||
| } | ||
|
|
||
| // False alarm (e.g. '#' inside a label or comment), continue scanning | ||
| scanOffset += p + 1 |
Copilot
AI
Dec 25, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The variable name 'p' conflicts with the Parser receiver variable in the method signature. While this is scoped within the for loop, it reduces readability and could be confusing. Consider using a more descriptive name like 'hashPos' or 'pos' instead.
| p := bytes.IndexByte(rest[scanOffset:], '#') | |
| if p == -1 { | |
| idx = -1 | |
| break | |
| } | |
| // Potential delimiter found at relative index (scanOffset + p) | |
| candidate := rest[scanOffset+p:] | |
| // Verify if it is indeed a header | |
| if bytes.HasPrefix(candidate, helpHeader) || bytes.HasPrefix(candidate, typeHeader) { | |
| idx = scanOffset + p | |
| break | |
| } | |
| // False alarm (e.g. '#' inside a label or comment), continue scanning | |
| scanOffset += p + 1 | |
| hashPos := bytes.IndexByte(rest[scanOffset:], '#') | |
| if hashPos == -1 { | |
| idx = -1 | |
| break | |
| } | |
| // Potential delimiter found at relative index (scanOffset + hashPos) | |
| candidate := rest[scanOffset+hashPos:] | |
| // Verify if it is indeed a header | |
| if bytes.HasPrefix(candidate, helpHeader) || bytes.HasPrefix(candidate, typeHeader) { | |
| idx = scanOffset + hashPos | |
| break | |
| } | |
| // False alarm (e.g. '#' inside a label or comment), continue scanning | |
| scanOffset += hashPos + 1 |
No description provided.