Skip to content

Conversation

@eeldaly
Copy link
Contributor

@eeldaly eeldaly commented Jan 14, 2026

What this PR does:
Add an active api tracker to print api requests in a querier on OOMKill / crash

Example log:

"These API calls didn't finish in prometheus' last run:"apis="[
{\"Method\":\"GET\",
\"Path\":\"/prometheus/api/v1/series\",
\"User-Agent\":\"PostmanRuntime/7.49.1\",
\"X-Request-ID\":\"\",
\"X-Scope-OrgID\":\"12345\",
\"end\":\"\",
\"limit\":\"100\",
\"matches\"\"metric_0metric_0metric_0m,metric_1metric_1metric_1m,metric_2metric_2metric_2m,metric_3metric_3metric\",
\"number-of-matches\":5,
\"start\":\"\",
\"timestamp_sec\":1768349758
}]"

Checklist

  • Tests updated
  • Documentation added
  • CHANGELOG.md updated - the order of entries should be [CHANGE], [FEATURE], [ENHANCEMENT], [BUGFIX]

Signed-off-by: Essam Eldaly <eeldaly@amazon.com>
Signed-off-by: Essam Eldaly <eeldaly@amazon.com>
"github.com/edsrzf/mmap-go"
)

type APITracker struct {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we make this tracker generic? Move to a better package maybe in utils. I feel it can be used in query frontend and more components as well. Maybe a generic name can be RequestsTracker. Make sure when inserting entries we can insert arbitrary entries?

entryMap["timestamp_sec"] = time.Now().Unix()
entryMap["Path"] = r.URL.Path
entryMap["Method"] = r.Method
entryMap["User-Agent"] = r.Header.Get("User-Agent")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need this?

entryMap["Method"] = r.Method
entryMap["User-Agent"] = r.Header.Get("User-Agent")
entryMap["X-Scope-OrgID"] = r.Header.Get("X-Scope-OrgID")
entryMap["X-Request-ID"] = r.Header.Get("X-Request-ID")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We shouldn't hardcode the request ID. It is extracted from the context

entryMap["Path"] = r.URL.Path
entryMap["Method"] = r.Method
entryMap["User-Agent"] = r.Header.Get("User-Agent")
entryMap["X-Scope-OrgID"] = r.Header.Get("X-Scope-OrgID")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Extract user ID from context. There is helper function to do it

Signed-off-by: Essam Eldaly <eeldaly@amazon.com>
Copy link
Contributor

@justinjung04 justinjung04 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thank you!

eeldaly and others added 2 commits January 23, 2026 14:23
Signed-off-by: Essam Eldaly <eeldaly@amazon.com>
Signed-off-by: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com>
@eeldaly
Copy link
Contributor Author

eeldaly commented Jan 28, 2026

One issue that still needs to be addressed is that the request id is not yet in the context at the time of it being added to the tracker. Getting request id from context currently returns an empty string

Signed-off-by: Essam Eldaly <eeldaly@amazon.com>
@eeldaly eeldaly requested a review from yeya24 January 30, 2026 21:44
Signed-off-by: Essam Eldaly <eeldaly@amazon.com>
Signed-off-by: Essam Eldaly <eeldaly@amazon.com>
Signed-off-by: Essam Eldaly <eeldaly@amazon.com>
Signed-off-by: Essam Eldaly <eeldaly@amazon.com>
…caped characters

Signed-off-by: Essam Eldaly <eeldaly@amazon.com>
}
fieldValueEncoded = fieldValueEncoded[1 : len(fieldValueEncoded)-1]
fieldValueEncodedTrimmed := trimStringByBytes(fieldValueEncoded, size)
fieldValueEncodedTrimmed = "\"" + removeHalfCutEscapeChar(fieldValueEncodedTrimmed) + "\""

Check failure

Code scanning / CodeQL

Potentially unsafe quoting Critical

If this
JSON value
contains a double quote, it could break out of the enclosing quotes.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems relevant. It seems very likely for the field value to have double quotes?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The json encode puts double quotes which I remove on 107 and add back on 109 after trimming the string to the correct size. Let me know if theres a cleaner way to trim the string.

Originally, I was not encoding the string before trimming but this caused issues where escaping characters when encoding json makes the string larger than desired.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll take another look at it tmrw to see if theres a cleaner way and make sure its working well as intended

Signed-off-by: Essam Eldaly <eeldaly@amazon.com>
@eeldaly eeldaly requested a review from yeya24 February 4, 2026 21:20
Signed-off-by: Essam Eldaly <eeldaly@amazon.com>
Signed-off-by: Essam Eldaly <eeldaly@amazon.com>
Copy link
Contributor

@yeya24 yeya24 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lint failure is also relevant

Extract(r *http.Request) []byte
}

type DefaultExtractor struct{}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's remove DefaultExtractor as it is not used anywhere.

}
fieldValueEncoded = fieldValueEncoded[1 : len(fieldValueEncoded)-1]
fieldValueEncodedTrimmed := trimStringByBytes(fieldValueEncoded, size)
fieldValueEncodedTrimmed = "\"" + removeHalfCutEscapeChar(fieldValueEncodedTrimmed) + "\""
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems relevant. It seems very likely for the field value to have double quotes?

Signed-off-by: Essam Eldaly <eeldaly@amazon.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants