Skip to content
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

Split index request in 24h intervals #8910

Closed
salvacorts opened this issue Mar 27, 2023 · 0 comments · Fixed by #8909
Closed

Split index request in 24h intervals #8910

salvacorts opened this issue Mar 27, 2023 · 0 comments · Fixed by #8909
Assignees

Comments

@salvacorts
Copy link
Contributor

salvacorts commented Mar 27, 2023

The latest version of Grafana shows the approximate size of a query (grafana/grafana#62109). This is done via the index stats API endpoint. We currently do not split those stats requests by time so a single index gateway may end up processing huge stats requests (E.g. {app=~".+"} for 30d).

On top of that, at #8670, we applied a time split of 24h intervals to all index stats requests to enforce the max_query_bytes_read and max_querier_bytes_read limits. When the limit is surpassed, the following message get's displayed:

image

As can be seen, the reported bytes read by the query are not the same as those reported by Grafana in the lower right corner of the query editor. This is because:

  1. The index stats request for enforcing the limit is split in subqueries of 24h. The other index stats request is not time split.
  2. When enforcing the limit, we are not displaying the bytes in powers of 2, but powers of 10 (see here). I.e. 1KB is 1000B vs 1KiB is 1024B.
@salvacorts salvacorts self-assigned this Mar 27, 2023
salvacorts added a commit that referenced this issue Mar 29, 2023
**What this PR does / why we need it**:

At #8670, we applied a time split of
24h intervals to all index stats requests to enforce the
`max_query_bytes_read` and `max_querier_bytes_read` limits. When the
limit is surpassed, the following message get's displayed:


![image](https://user-images.githubusercontent.com/8354290/227960400-b74a0397-13ef-4143-a1fc-48d885af55c0.png)

As can be seen, the reported bytes read by the query are not the same as
those reported by Grafana in the lower right corner of the query editor.
This is because:

1. The index stats request for enforcing the limit is split in
subqueries of 24h. The other index stats rquest is not time split.
2. When enforcing the limit, we are not displaying the bytes in powers
of 2, but powers of 10 ([see here][2]). I.e. 1KB is 1000B vs 1KiB is
1024B.

This PR adds the same logic to all index stats requests so we also time
split by 24 intervals all requests that hit the Index Stats API
endpoint. We also use powers of 2 instead of 10 on the message when
enforcing `max_query_bytes_read` and `max_querier_bytes_read`.


![image](https://user-images.githubusercontent.com/8354290/227959491-f57cf7d2-de50-4ee6-8737-faeafb528f99.png)

Note that the library we use under the hoot to print the bytes rounds up
and down to the nearest integer ([see][3]); that's why we see 16GiB
compared to the 15.5GB in the Grafana query editor.

**Which issue(s) this PR fixes**:
Fixes #8910

**Special notes for your reviewer**:

- I refactored the`newQuerySizeLimiter` function and the rest of the
_Tripperwares_ in `rountrip.go` to reuse the new IndexStatsTripperware.
So we configure the split-by-time middleware only once.

**Checklist**
- [x] Reviewed the
[`CONTRIBUTING.md`](https://github.com/grafana/loki/blob/main/CONTRIBUTING.md)
guide (**required**)
- [x] Documentation added
- [x] Tests updated
- [x] `CHANGELOG.md` updated
- [ ] Changes that require user attention or interaction to upgrade are
documented in `docs/sources/upgrading/_index.md`


[1]: https://grafana.com/docs/loki/latest/api/#index-stats
[2]:
https://github.com/grafana/loki/blob/main/pkg/querier/queryrange/limits.go#L367-L368
[3]: https://github.com/dustin/go-humanize/blob/master/bytes.go#L75-L78
grafanabot pushed a commit that referenced this issue Mar 30, 2023
**What this PR does / why we need it**:

At #8670, we applied a time split of
24h intervals to all index stats requests to enforce the
`max_query_bytes_read` and `max_querier_bytes_read` limits. When the
limit is surpassed, the following message get's displayed:

![image](https://user-images.githubusercontent.com/8354290/227960400-b74a0397-13ef-4143-a1fc-48d885af55c0.png)

As can be seen, the reported bytes read by the query are not the same as
those reported by Grafana in the lower right corner of the query editor.
This is because:

1. The index stats request for enforcing the limit is split in
subqueries of 24h. The other index stats rquest is not time split.
2. When enforcing the limit, we are not displaying the bytes in powers
of 2, but powers of 10 ([see here][2]). I.e. 1KB is 1000B vs 1KiB is
1024B.

This PR adds the same logic to all index stats requests so we also time
split by 24 intervals all requests that hit the Index Stats API
endpoint. We also use powers of 2 instead of 10 on the message when
enforcing `max_query_bytes_read` and `max_querier_bytes_read`.

![image](https://user-images.githubusercontent.com/8354290/227959491-f57cf7d2-de50-4ee6-8737-faeafb528f99.png)

Note that the library we use under the hoot to print the bytes rounds up
and down to the nearest integer ([see][3]); that's why we see 16GiB
compared to the 15.5GB in the Grafana query editor.

**Which issue(s) this PR fixes**:
Fixes #8910

**Special notes for your reviewer**:

- I refactored the`newQuerySizeLimiter` function and the rest of the
_Tripperwares_ in `rountrip.go` to reuse the new IndexStatsTripperware.
So we configure the split-by-time middleware only once.

**Checklist**
- [x] Reviewed the
[`CONTRIBUTING.md`](https://github.com/grafana/loki/blob/main/CONTRIBUTING.md)
guide (**required**)
- [x] Documentation added
- [x] Tests updated
- [x] `CHANGELOG.md` updated
- [ ] Changes that require user attention or interaction to upgrade are
documented in `docs/sources/upgrading/_index.md`

[1]: https://grafana.com/docs/loki/latest/api/#index-stats
[2]:
https://github.com/grafana/loki/blob/main/pkg/querier/queryrange/limits.go#L367-L368
[3]: https://github.com/dustin/go-humanize/blob/master/bytes.go#L75-L78

(cherry picked from commit ee69f2b)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant