Skip to content

perf(grafana): add user_id filter to direct cml_data queries - #60

Merged
cchwala merged 1 commit into
mainfrom
perf/grafana-add-user-id-filter
Jul 16, 2026
Merged

perf(grafana): add user_id filter to direct cml_data queries#60
cchwala merged 1 commit into
mainfrom
perf/grafana-add-user-id-filter

Conversation

@cchwala

@cchwala cchwala commented Jul 16, 2026

Copy link
Copy Markdown
Member

The four queries in cml-realtime.json that hit cml_data directly (RSL/TSL × auto/raw) filtered only by cml_id. The PostgreSQL planner therefore scanned data for all users matching that CML id, taking 12-16 s for a 2-day window on a hypertable with ~1 B rows.

Adding AND user_id = '${__user.login}' supplies user_id as a literal constant (Grafana substitutes the variable before sending SQL to PostgreSQL), enabling the composite index on (user_id, cml_id, time DESC) to restrict the scan to only the authenticated user's data. Measured speedup: ~1.4 s vs ~16 s (~11×) for a 2-day window.

Note: Row-Level Security cannot be used here because TimescaleDB rejects ENABLE ROW LEVEL SECURITY when compression is active on the hypertable. The composite index with an explicit user_id predicate achieves the equivalent performance benefit.

The ${__user.login} Grafana variable matches the PostgreSQL role name because Grafana and PostgreSQL user provisioning are kept in sync via users.yml / generate_config.py.

The four queries in cml-realtime.json that hit cml_data directly
(RSL/TSL × auto/raw) filtered only by cml_id. The PostgreSQL planner
therefore scanned data for all users matching that CML id, taking
12-16 s for a 2-day window on a hypertable with ~1 B rows.

Adding AND user_id = '${__user.login}' supplies user_id as a literal
constant (Grafana substitutes the variable before sending SQL to
PostgreSQL), enabling the composite index on (user_id, cml_id, time DESC)
to restrict the scan to only the authenticated user's data.  Measured
speedup: ~1.4 s vs ~16 s (~11×) for a 2-day window.

Note: Row-Level Security cannot be used here because TimescaleDB
rejects ENABLE ROW LEVEL SECURITY when compression is active on the
hypertable. The composite index with an explicit user_id predicate
achieves the equivalent performance benefit.

The ${__user.login} Grafana variable matches the PostgreSQL role name
because Grafana and PostgreSQL user provisioning are kept in sync via
users.yml / generate_config.py.
@codecov

codecov Bot commented Jul 16, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 87.59%. Comparing base (878224d) to head (4d093a5).

Additional details and impacted files
@@            Coverage Diff             @@
##             main      #60      +/-   ##
==========================================
+ Coverage   86.10%   87.59%   +1.48%     
==========================================
  Files          39       35       -4     
  Lines        3418     3038     -380     
==========================================
- Hits         2943     2661     -282     
+ Misses        475      377      -98     
Flag Coverage Δ
mno_simulator 86.12% <ø> (ø)
parser 92.00% <ø> (ø)
scripts ?
webserver 73.78% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@cchwala
cchwala merged commit ca55ee2 into main Jul 16, 2026
6 checks passed
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 this pull request may close these issues.

1 participant