Navigating the tab bar between the three [Nginx OTel] dashboards leaves them broken, because dataset scope is enforced via a removable app-state filter that the Links panel carries over and never clears.
Repro
Open Request Health (works) → Server Internals (works) → back to Request Health → the log panels show no data.
Cause
- Each dashboard scopes data with a dashboard-level
data_stream.dataset filter pill (not inside the Lens queries):
- Request Health:
∈ {nginx.access.otel, nginx.error.otel, nginxreceiver.otel} (bool-should)
- Server Internals:
= nginxreceiver.otel (match_phrase)
- Traffic & Capacity:
∈ {nginx.access.otel, nginxreceiver.otel} (bool-should)
- The tab bar is a Links panel; its dashboard links use the default
useCurrentFilters: true, so navigating carries the current filter pills to the destination.
- Source and destination filters share
meta.key = data_stream.dataset but differ in shape (bool-should vs match_phrase), so Kibana stacks them instead of deduping → they get AND-ed together.
Returning to Request Health leaves = nginxreceiver.otel AND ∈ {access, error, nginxreceiver}, whose intersection is nginxreceiver.otel only. Request Health's panels query the nginx.access / nginx.error log datasets, so they now match nothing. Server Internals masks the bug because its panels are the nginxreceiver metrics.
Confirmed against packages/nginx_otel/kibana/dashboard/*.json on main.
Suggested fix
- Scope each Lens layer by dataset in its own query, rather than relying on a removable app-state filter; and/or
- Set
useCurrentFilters: false on the Links panel's dashboard links so navigation doesn't carry filters over.
Navigating the tab bar between the three
[Nginx OTel]dashboards leaves them broken, because dataset scope is enforced via a removable app-state filter that the Links panel carries over and never clears.Repro
Open Request Health (works) → Server Internals (works) → back to Request Health → the log panels show no data.
Cause
data_stream.datasetfilter pill (not inside the Lens queries):∈ {nginx.access.otel, nginx.error.otel, nginxreceiver.otel}(bool-should)= nginxreceiver.otel(match_phrase)∈ {nginx.access.otel, nginxreceiver.otel}(bool-should)useCurrentFilters: true, so navigating carries the current filter pills to the destination.meta.key = data_stream.datasetbut differ in shape (bool-should vs match_phrase), so Kibana stacks them instead of deduping → they get AND-ed together.Returning to Request Health leaves
= nginxreceiver.otelAND∈ {access, error, nginxreceiver}, whose intersection isnginxreceiver.otelonly. Request Health's panels query thenginx.access/nginx.errorlog datasets, so they now match nothing. Server Internals masks the bug because its panels are the nginxreceiver metrics.Confirmed against
packages/nginx_otel/kibana/dashboard/*.jsononmain.Suggested fix
useCurrentFilters: falseon the Links panel's dashboard links so navigation doesn't carry filters over.