Skip to content

docs: Add Hubble as observability source - #1782

Merged
Andrei Kvapil (kvaps) merged 1 commit into
cozystack:mainfrom
majiayu000:fix-749-add-hubble-as-observability-so-0102-0411
Jan 20, 2026
Merged

Andrei Kvapil (kvaps) merged 1 commit into
cozystack:mainfrom
majiayu000:fix-749-add-hubble-as-observability-so-0102-0411

Conversation

@majiayu000

@majiayu000 lif (majiayu000) commented Jan 1, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #749

Changes

  • Add documentation explaining how to enable Hubble for network observability in Grafana
  • Add four Grafana dashboards for Hubble metrics visualization (Overview, DNS, L7 HTTP, Network)
  • Register Hubble dashboards in the monitoring package

Summary by CodeRabbit

  • New Features

    • Introduced Hubble DNS Overview dashboard for namespace-level DNS metrics visibility.
    • Introduced Hubble L7 HTTP Metrics dashboard for HTTP request and performance monitoring.
    • Introduced Hubble Network Overview dashboard for network flows and policy insights.
  • Documentation

    • Added comprehensive Hubble observability guide covering setup, configuration, and troubleshooting.

✏️ Tip: You can customize this high-level summary in your review settings.

Add documentation explaining how to enable Hubble for network
observability in Grafana. Include four pre-built Hubble dashboards
(overview, dns-namespace, l7-http-metrics, network-overview) and
register them in the monitoring hub's dashboard list.

Closes #749

Signed-off-by: majiayu000 <[email protected]>
@dosubot dosubot Bot added size/XXL This PR changes 1000+ lines, ignoring generated files kind/feature Categorizes issue or PR as related to a new feature labels Jan 1, 2026
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello lif (@majiayu000), I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances network observability by integrating Hubble with Grafana. It provides clear instructions for enabling Hubble within the Cilium setup and introduces a suite of specialized Grafana dashboards. These dashboards offer detailed insights into DNS queries, L7 HTTP traffic, and general network flow patterns, allowing users to monitor and troubleshoot network behavior more effectively.

Highlights

  • Hubble Documentation: New documentation has been added to guide users on enabling Hubble for network observability within the Cilium configuration.
  • Grafana Dashboards: Four new Grafana dashboards have been introduced to visualize Hubble metrics, covering DNS, L7 HTTP, and overall network flow.
  • Dashboard Registration: The newly added Hubble dashboards are registered within the monitoring package, making them accessible in Grafana.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment Gemini (@gemini-code-assist) Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on Gemini (@gemini-code-assist) comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩

@coderabbitai

coderabbitai Bot commented Jan 1, 2026 •

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

The pull request introduces Hubble as a network observability source for the Cozystack monitoring stack by adding three Grafana dashboard definitions for DNS, HTTP, and network metrics, along with implementation documentation and dashboard registry entries.

Changes

Cohort / File(s) Summary
Grafana Dashboards
dashboards/hubble/dns-namespace.json, dashboards/hubble/l7-http-metrics.json, dashboards/hubble/network-overview.json
Three new dashboards added with Prometheus queries for DNS query rates, HTTP request metrics (volume, latency, success rates), and network flow analytics. Each includes templated variables for cluster, namespace, and workload filtering with dark theme styling and standard time range defaults (now-1h to now-6h).
Documentation
docs/hubble-observability.md
New guide detailing Hubble prerequisites, configuration steps (hubble, relay, UI, metrics), exposed components, dashboard access, available metrics, and troubleshooting (status checks, metrics endpoints, ServiceMonitor verification).
Dashboard Registry
packages/extra/monitoring/dashboards.list
Four new entries added: Hubble overview, DNS namespace overview, L7 HTTP metrics, and network overview dashboards.

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant Cozystack
    participant Hubble as Hubble Component
    participant Prometheus
    participant Grafana

    User->>Cozystack: Enable Hubble in Monitoring stack
    activate Cozystack
    Cozystack->>Hubble: Deploy & configure Hubble
    activate Hubble
    Hubble->>Hubble: Collect network metrics<br/>(flows, DNS, HTTP, policies)
    deactivate Hubble
    
    Hubble->>Prometheus: Expose metrics via endpoint
    activate Prometheus
    Prometheus->>Prometheus: Scrape Hubble metrics<br/>(at configured intervals)
    deactivate Prometheus
    
    deactivate Cozystack
    
    User->>Grafana: Access Hubble dashboards
    activate Grafana
    Grafana->>Prometheus: Query metrics<br/>(DNS, HTTP, Network panels)
    Prometheus-->>Grafana: Return time-series data
    Grafana->>Grafana: Render panels &<br/>visualizations
    Grafana-->>User: Display dashboards
    deactivate Grafana
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 Hubble now shines bright in networks wide,
With DNS flows and metrics as our guide,
Three dashboards bloom in Grafana's embrace,
Network observability finds its place! 🌐✨

Pre-merge checks

✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately reflects the main change: adding Hubble as a network observability source with documentation and Grafana dashboards.
Linked Issues check ✅ Passed The PR directly addresses issue #749 by adding Hubble observability support with documentation, four pre-built Grafana dashboards, and dashboard registration in the monitoring package.
Out of Scope Changes check ✅ Passed All changes are directly related to implementing Hubble observability: documentation, dashboard definitions, and dashboard registration. No unrelated modifications detected.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request introduces Hubble observability by adding new documentation, four Grafana dashboards, and registering them. The changes are a great addition. I've found a few issues in the new dashboards, including incorrect queries, inconsistent units, and leftover demo tags. Specifically, one query for CPU usage by source uses the wrong namespace variable, which will lead to incorrect data. Several other panels are missing the method label in their by clauses, which will result in incorrect legends. I've also suggested updating a dashboard that uses a deprecated panel type for better maintainability. Please see my detailed comments for suggestions on how to fix these issues.

},
"editorMode": "code",
"exemplar": false,
"expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=~\"${cluster}\", namespace=~\"${destination_namespace}\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=~\"${cluster}\", namespace=~\"${destination_namespace}\", workload=~\"${source_workload}\"}\n) by (namespace, workload)",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

high

The PromQL query for the "CPU Usage by Source" panel incorrectly uses ${destination_namespace} to filter metrics, but the panel is intended to show data for the source. This will lead to incorrect data being displayed. You should use ${source_namespace} instead.

Suggested change
"expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=~\"${cluster}\", namespace=~\"${destination_namespace}\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=~\"${cluster}\", namespace=~\"${destination_namespace}\", workload=~\"${source_workload}\"}\n) by (namespace, workload)",
"expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=~\"${cluster}\", namespace=~\"${source_namespace}\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=~\"${cluster}\", namespace=~\"${source_namespace}\", workload=~\"${source_workload}\"}\n) by (namespace, workload)",

"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"expr": "topk(10, sum(rate(hubble_dns_queries_total{cluster=~\"$cluster\", source_namespace=~\"$source_namespace\", destination_namespace=~\"$destination_namespace\"}[$__rate_interval])*60) by (query))",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The expression for this panel multiplies the rate by 60, which likely converts it to requests per minute. However, the panel's unit is set to reqps (requests per second). This is inconsistent. To fix this, you should either change the unit to reqpm or remove the *60 from the expression to match the reqps unit. Given the unit, removing *60 is the more direct fix.

Suggested change
"expr": "topk(10, sum(rate(hubble_dns_queries_total{cluster=~\"$cluster\", source_namespace=~\"$source_namespace\", destination_namespace=~\"$destination_namespace\"}[$__rate_interval])*60) by (query))",
"expr": "topk(10, sum(rate(hubble_dns_queries_total{cluster=~\"$cluster\", source_namespace=~\"$source_namespace\", destination_namespace=~\"$destination_namespace\"}[$__rate_interval])) by (query))",

"schemaVersion": 38,
"style": "dark",
"tags": [
"kubecon-demo"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The tag kubecon-demo seems to be a leftover from a demonstration. It should be replaced with a more generic and descriptive tag like hubble to better categorize the dashboard.

Suggested change
"kubecon-demo"
"hubble"

},
"editorMode": "code",
"exemplar": false,
"expr": "round(sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, source_namespace, source_workload, status), 0.001)",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The legendFormat for this panel includes {{ method }}, but the method label is missing from the by clause in the PromQL query. This will cause the literal string {{ method }} to be displayed in the legend. Please add method to the by clause to correctly display the HTTP method.

Suggested change
"expr": "round(sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, source_namespace, source_workload, status), 0.001)",
"expr": "round(sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, method, source_namespace, source_workload, status), 0.001)",

},
"editorMode": "code",
"exemplar": false,
"expr": "sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\",status!~\"5.*\"}[$__rate_interval])) by (cluster, source_namespace, source_workload)\n/\nsum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, source_namespace, source_workload)",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The legendFormat for this panel includes {{ method }}, but the method label is missing from the by clause in the PromQL query. This will cause the literal string {{ method }} to be displayed in the legend. Please add method to the by clause in both parts of the query to correctly display the HTTP method.

Suggested change
"expr": "sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\",status!~\"5.*\"}[$__rate_interval])) by (cluster, source_namespace, source_workload)\n/\nsum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, source_namespace, source_workload)",
"expr": "sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\",status!~\"5.*\"}[$__rate_interval])) by (cluster, method, source_namespace, source_workload)\n/\nsum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, method, source_namespace, source_workload)",

},
"editorMode": "code",
"exemplar": false,
"expr": "round(sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, destination_namespace, destination_workload, status), 0.001)",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The legendFormat for this panel includes {{ method }}, but the method label is missing from the by clause in the PromQL query. This will cause the literal string {{ method }} to be displayed in the legend. Please add method to the by clause to correctly display the HTTP method.

Suggested change
"expr": "round(sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, destination_namespace, destination_workload, status), 0.001)",
"expr": "round(sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, method, destination_namespace, destination_workload, status), 0.001)",

},
"editorMode": "code",
"exemplar": false,
"expr": "sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\",status!~\"5.*\"}[$__rate_interval])) by (cluster, destination_namespace, destination_workload)\n/\nsum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, destination_namespace, destination_workload)",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The legendFormat for this panel includes {{ method }}, but the method label is missing from the by clause in the PromQL query. This will cause the literal string {{ method }} to be displayed in the legend. Please add method to the by clause in both parts of the query to correctly display the HTTP method.

Suggested change
"expr": "sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\",status!~\"5.*\"}[$__rate_interval])) by (cluster, destination_namespace, destination_workload)\n/\nsum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, destination_namespace, destination_workload)",
"expr": "sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\",status!~\"5.*\"}[$__rate_interval])) by (cluster, method, destination_namespace, destination_workload)\n/\nsum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, method, destination_namespace, destination_workload)",

},
"editorMode": "code",
"expr": "topk(10, sum(rate(hubble_flows_processed_total{cluster=~\"$cluster\", source_namespace=~\"$source_namespace\", destination_namespace=~\"$destination_namespace\"}[$__rate_interval])) by (destination))",
"legendFormat": "{{source}}",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The query for this panel groups by destination, but the legendFormat is set to {{source}}. This will result in incorrect labels in the legend. It should be {{destination}}.

Suggested change
"legendFormat": "{{source}}",
"legendFormat": "{{destination}}",

"schemaVersion": 38,
"style": "dark",
"tags": [
"kubecon-demo"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The tag kubecon-demo seems to be a leftover from a demonstration. It should be replaced with a more generic and descriptive tag like hubble to better categorize the dashboard.

Suggested change
"kubecon-demo"
"hubble"

clickhouse/altinity-clickhouse-operator-dashboard
storage/linstor
seaweedfs/seaweedfs
hubble/overview

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The hubble/overview dashboard uses the legacy graph panel type, which is deprecated in newer Grafana versions. The other Hubble dashboards added in this PR use the modern timeseries panel type. For consistency and future maintainability, please update the hubble/overview dashboard to use timeseries panels instead of graph panels.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 9

🧹 Nitpick comments (1)
dashboards/hubble/network-overview.json (1)

801-826: Hardcoded pod name in override reduces portability.

The override references a specific pod name kube-dns-7d44cdb5d5-g85vg which is environment-specific and will not work correctly in other clusters. Consider removing this override or using a pattern-based approach if this was intended to filter out specific noise.

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2d6e50b and d0bad07.

📒 Files selected for processing (6)
  • dashboards/hubble/dns-namespace.json
  • dashboards/hubble/l7-http-metrics.json
  • dashboards/hubble/network-overview.json
  • dashboards/hubble/overview.json
  • docs/hubble-observability.md
  • packages/extra/monitoring/dashboards.list
🧰 Additional context used
📓 Path-based instructions (1)
**/*.md

📄 CodeRabbit inference engine (AGENTS.md)

Git commits should follow [component] Description format and include --signoff flag

Files:

  • docs/hubble-observability.md
🪛 LanguageTool
docs/hubble-observability.md

[style] ~3-~3: Consider a different adjective to strengthen your wording.
Context: ...orm built on top of Cilium. It provides deep visibility into the communication and b...

(DEEP_PROFOUND)

🔇 Additional comments (3)
dashboards/hubble/dns-namespace.json (1)

1-602: Dashboard looks well-structured.

The DNS namespace dashboard is properly configured with consistent query expressions, appropriate templating variables, and correct panel configurations.

docs/hubble-observability.md (1)

1-99: Documentation is comprehensive and well-organized.

The documentation provides clear guidance on prerequisites, configuration, accessing dashboards, available metrics, and troubleshooting steps. This will help users effectively enable and use Hubble for network observability.

packages/extra/monitoring/dashboards.list (1)

42-45: No action needed. The dashboards/hubble/overview.json file exists in the repository, and the entry in dashboards.list is correct.

Likely an incorrect or invalid review comment.

Comment on lines +131 to +142
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"expr": "round(sum(rate(hubble_http_requests_total{reporter=~\"${reporter}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\"}[$__rate_interval])), 0.001)",
"refId": "A"
}
],
"title": "Incoming Request Volume",
"type": "stat"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Missing cluster filter in query.

This panel's query does not include the cluster filter (cluster=~"${cluster}"), unlike other panels in this dashboard. This inconsistency may cause unexpected results when users select a specific cluster.

🔎 Proposed fix
-          "expr": "round(sum(rate(hubble_http_requests_total{reporter=~\"${reporter}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\"}[$__rate_interval])), 0.001)",
+          "expr": "round(sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", reporter=~\"${reporter}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\"}[$__rate_interval])), 0.001)",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"expr": "round(sum(rate(hubble_http_requests_total{reporter=~\"${reporter}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\"}[$__rate_interval])), 0.001)",
"refId": "A"
}
],
"title": "Incoming Request Volume",
"type": "stat"
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"expr": "round(sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", reporter=~\"${reporter}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\"}[$__rate_interval])), 0.001)",
"refId": "A"
}
],
"title": "Incoming Request Volume",
"type": "stat"
🤖 Prompt for AI Agents
In dashboards/hubble/l7-http-metrics.json around lines 131 to 142, the
Prometheus expression for the "Incoming Request Volume" panel is missing the
cluster label filter; update the metric selector to include
cluster=~"${cluster}" (i.e., add cluster=~"${cluster}" inside the {...} selector
alongside reporter, destination_namespace and destination_workload) so the query
is consistent with other panels and respects the dashboard's cluster variable.

Comment on lines +436 to +449
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"exemplar": false,
"expr": "round(sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, source_namespace, source_workload, status), 0.001)",
"interval": "",
"legendFormat": "{{ cluster }} {{ method }} {{ source_namespace }}/{{ source_workload }}: {{ status }}",
"range": true,
"refId": "A"
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Legend format references non-existent labels.

The legendFormat includes {{ method }} but the query aggregates by cluster, source_namespace, source_workload, status only. The method label won't be available, resulting in empty values in the legend. Either add method to the by clause or remove it from the legend format.

🔎 Proposed fix (remove from legend)
-          "legendFormat": "{{ cluster }} {{ method }} {{ source_namespace }}/{{ source_workload }}: {{ status }}",
+          "legendFormat": "{{ cluster }} {{ source_namespace }}/{{ source_workload }}: {{ status }}",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"exemplar": false,
"expr": "round(sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, source_namespace, source_workload, status), 0.001)",
"interval": "",
"legendFormat": "{{ cluster }} {{ method }} {{ source_namespace }}/{{ source_workload }}: {{ status }}",
"range": true,
"refId": "A"
}
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"exemplar": false,
"expr": "round(sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, source_namespace, source_workload, status), 0.001)",
"interval": "",
"legendFormat": "{{ cluster }} {{ source_namespace }}/{{ source_workload }}: {{ status }}",
"range": true,
"refId": "A"
}
🤖 Prompt for AI Agents
In dashboards/hubble/l7-http-metrics.json around lines 436 to 449, the
legendFormat references {{ method }} but the Prometheus expr groups by only
cluster, source_namespace, source_workload, and status so method will be
missing; fix by including method in the aggregation clause (add method to the
"by (...)" list in the expr) so the label exists for the legend, or
alternatively remove {{ method }} from legendFormat if you prefer not to group
by it.

Comment on lines +537 to +550
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"exemplar": false,
"expr": "sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\",status!~\"5.*\"}[$__rate_interval])) by (cluster, source_namespace, source_workload)\n/\nsum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, source_namespace, source_workload)",
"interval": "",
"legendFormat": "{{ cluster }} {{ method }} {{ source_namespace }}/{{ source_workload }}",
"range": true,
"refId": "A"
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Legend format references non-existent label.

Same issue: {{ method }} in the legend format but method is not in the aggregation. This will display empty values.

🔎 Proposed fix
-          "legendFormat": "{{ cluster }} {{ method }} {{ source_namespace }}/{{ source_workload }}",
+          "legendFormat": "{{ cluster }} {{ source_namespace }}/{{ source_workload }}",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"exemplar": false,
"expr": "sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\",status!~\"5.*\"}[$__rate_interval])) by (cluster, source_namespace, source_workload)\n/\nsum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, source_namespace, source_workload)",
"interval": "",
"legendFormat": "{{ cluster }} {{ method }} {{ source_namespace }}/{{ source_workload }}",
"range": true,
"refId": "A"
}
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"exemplar": false,
"expr": "sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\",status!~\"5.*\"}[$__rate_interval])) by (cluster, source_namespace, source_workload)\n/\nsum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, source_namespace, source_workload)",
"interval": "",
"legendFormat": "{{ cluster }} {{ source_namespace }}/{{ source_workload }}",
"range": true,
"refId": "A"
}
🤖 Prompt for AI Agents
In dashboards/hubble/l7-http-metrics.json around lines 537 to 550, the legend
uses {{ method }} but the PromQL aggregations do not include a method label so
it will render empty; fix by either removing {{ method }} from the legend or
adding method to the aggregation grouping on both numerator and denominator
(e.g., include method in the by(...) lists and in both sum(rate(...))
expressions) so the label exists and is consistent across the ratio.

Comment on lines +763 to +777
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"exemplar": false,
"expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=~\"${cluster}\", namespace=~\"${destination_namespace}\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=~\"${cluster}\", namespace=~\"${destination_namespace}\", workload=~\"${source_workload}\"}\n) by (namespace, workload)",
"interval": "",
"legendFormat": "{{ cluster }} {{ namespace }}/{{ workload }}",
"range": true,
"refId": "A"
}
],

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Legend format references non-existent label.

The legendFormat references {{ cluster }} but the query aggregates by namespace, workload only. The cluster label won't be available in the result.

🔎 Proposed fix
-          "legendFormat": "{{ cluster }} {{ namespace }}/{{ workload }}",
+          "legendFormat": "{{ namespace }}/{{ workload }}",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"exemplar": false,
"expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=~\"${cluster}\", namespace=~\"${destination_namespace}\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=~\"${cluster}\", namespace=~\"${destination_namespace}\", workload=~\"${source_workload}\"}\n) by (namespace, workload)",
"interval": "",
"legendFormat": "{{ cluster }} {{ namespace }}/{{ workload }}",
"range": true,
"refId": "A"
}
],
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"exemplar": false,
"expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=~\"${cluster}\", namespace=~\"${destination_namespace}\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=~\"${cluster}\", namespace=~\"${destination_namespace}\", workload=~\"${source_workload}\"}\n) by (namespace, workload)",
"interval": "",
"legendFormat": "{{ namespace }}/{{ workload }}",
"range": true,
"refId": "A"
}
],
🤖 Prompt for AI Agents
In dashboards/hubble/l7-http-metrics.json around lines 763 to 777, the
legendFormat references {{ cluster }} but the Prometheus query only aggregates
by namespace and workload so the cluster label will not be present; fix by
either adding cluster to the aggregation (e.g., include cluster in the by(...)
clause and any necessary grouping keys in the inner expressions) or remove {{
cluster }} from legendFormat (e.g., use "{{ namespace }}/{{ workload }}" or
another existing label) so the legend only references labels returned by the
query.

Comment on lines +877 to +891
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"exemplar": false,
"expr": "round(sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, destination_namespace, destination_workload, status), 0.001)",
"interval": "",
"legendFormat": "{{ cluster }} {{ method }} {{ destination_namespace }}/{{ destination_workload }}: {{ status }}",
"range": true,
"refId": "A"
}
],

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Legend format references non-existent label.

The legendFormat includes {{ method }} but the aggregation is by cluster, destination_namespace, destination_workload, status — method is not included.

🔎 Proposed fix
-          "legendFormat": "{{ cluster }} {{ method }} {{ destination_namespace }}/{{ destination_workload }}: {{ status }}",
+          "legendFormat": "{{ cluster }} {{ destination_namespace }}/{{ destination_workload }}: {{ status }}",
🤖 Prompt for AI Agents
In dashboards/hubble/l7-http-metrics.json around lines 877 to 891, the legend
references {{ method }} but the Prometheus aggregation groups only by cluster,
destination_namespace, destination_workload, and status; either remove {{ method
}} from the legend or include method in the aggregation and query so the label
exists. Fix by updating the expr to aggregate by (cluster,
destination_namespace, destination_workload, status, method) if you want method
shown, or remove {{ method }} from legendFormat if method should not be
displayed; ensure the labels used in legendFormat exactly match the labels
present in the grouped query.

Comment on lines +978 to +991
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"exemplar": false,
"expr": "sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\",status!~\"5.*\"}[$__rate_interval])) by (cluster, destination_namespace, destination_workload)\n/\nsum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, destination_namespace, destination_workload)",
"interval": "",
"legendFormat": "{{ cluster }} {{ method }} {{ destination_namespace }}/{{ destination_workload }}",
"range": true,
"refId": "A"
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Legend format references non-existent label.

Same issue with {{ method }} not being in the aggregation.

🔎 Proposed fix
-          "legendFormat": "{{ cluster }} {{ method }} {{ destination_namespace }}/{{ destination_workload }}",
+          "legendFormat": "{{ cluster }} {{ destination_namespace }}/{{ destination_workload }}",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"exemplar": false,
"expr": "sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\",status!~\"5.*\"}[$__rate_interval])) by (cluster, destination_namespace, destination_workload)\n/\nsum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, destination_namespace, destination_workload)",
"interval": "",
"legendFormat": "{{ cluster }} {{ method }} {{ destination_namespace }}/{{ destination_workload }}",
"range": true,
"refId": "A"
}
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"exemplar": false,
"expr": "sum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\",status!~\"5.*\"}[$__rate_interval])) by (cluster, destination_namespace, destination_workload)\n/\nsum(rate(hubble_http_requests_total{cluster=~\"${cluster}\", destination_namespace=~\"${destination_namespace}\", destination_workload=~\"${destination_workload}\", reporter=\"${reporter}\", source_namespace=~\"${source_namespace}\", source_workload=~\"${source_workload}\"}[$__rate_interval])) by (cluster, destination_namespace, destination_workload)",
"interval": "",
"legendFormat": "{{ cluster }} {{ destination_namespace }}/{{ destination_workload }}",
"range": true,
"refId": "A"
}
🤖 Prompt for AI Agents
In dashboards/hubble/l7-http-metrics.json around lines 978-991 the legend
references {{ method }} but the PromQL aggregation doesn't include the method
label, so either remove {{ method }} from legend or add method to both
aggregations' by(...) clauses; to fix, update both sum(rate(...)[...])) by (...)
expressions to include method (e.g., by (cluster, destination_namespace,
destination_workload, method)) so the method label exists for the legend, or
alternatively delete {{ method }} from legendFormat if you prefer not to
aggregate by method.

Comment on lines +1202 to +1216
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"exemplar": false,
"expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=~\"${cluster}\", namespace=~\"${destination_namespace}\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=~\"${cluster}\", namespace=~\"${destination_namespace}\", workload=\"${destination_workload}\"}\n) by (namespace, workload)",
"interval": "",
"legendFormat": "{{ cluster }} {{ namespace }}/{{ workload }}",
"range": true,
"refId": "A"
}
],

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Legend format references non-existent label.

The query aggregates by namespace, workload but the legend references {{ cluster }}.

🔎 Proposed fix
-          "legendFormat": "{{ cluster }} {{ namespace }}/{{ workload }}",
+          "legendFormat": "{{ namespace }}/{{ workload }}",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"exemplar": false,
"expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=~\"${cluster}\", namespace=~\"${destination_namespace}\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=~\"${cluster}\", namespace=~\"${destination_namespace}\", workload=\"${destination_workload}\"}\n) by (namespace, workload)",
"interval": "",
"legendFormat": "{{ cluster }} {{ namespace }}/{{ workload }}",
"range": true,
"refId": "A"
}
],
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"exemplar": false,
"expr": "sum(\n node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{cluster=~\"${cluster}\", namespace=~\"${destination_namespace}\"}\n * on(namespace,pod)\n group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{cluster=~\"${cluster}\", namespace=~\"${destination_namespace}\", workload=\"${destination_workload}\"}\n) by (namespace, workload)",
"interval": "",
"legendFormat": "{{ namespace }}/{{ workload }}",
"range": true,
"refId": "A"
}
],
🤖 Prompt for AI Agents
In dashboards/hubble/l7-http-metrics.json around lines 1202-1216 the Prometheus
query groups metrics by namespace and workload but the panel legend references
{{ cluster }} which is not included in the aggregation, causing an empty label;
fix by either adding cluster to the aggregation (e.g., include cluster in the
by(...) clause or ensure the joined metric exposes a cluster label) so the label
exists, or remove {{ cluster }} from legendFormat (e.g., change legendFormat to
"{{ namespace }}/{{ workload }}") depending on whether you want cluster shown.

Comment on lines +410 to +424
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"expr": "topk(10, sum(rate(hubble_flows_processed_total{cluster=~\"$cluster\", source_namespace=~\"$source_namespace\", destination_namespace=~\"$destination_namespace\"}[$__rate_interval])) by (destination))",
"legendFormat": "{{source}}",
"range": true,
"refId": "A"
}
],
"title": "Top 10 destinations",
"type": "bargauge"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Legend format mismatch with aggregation.

The panel title is "Top 10 destinations" and aggregates by destination, but the legendFormat uses {{source}}. This appears to be a copy-paste error from the "Top 10 sources" panel.

🔎 Proposed fix
-            "legendFormat": "{{source}}",
+            "legendFormat": "{{destination}}",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"expr": "topk(10, sum(rate(hubble_flows_processed_total{cluster=~\"$cluster\", source_namespace=~\"$source_namespace\", destination_namespace=~\"$destination_namespace\"}[$__rate_interval])) by (destination))",
"legendFormat": "{{source}}",
"range": true,
"refId": "A"
}
],
"title": "Top 10 destinations",
"type": "bargauge"
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "${DS_PROMETHEUS}"
},
"editorMode": "code",
"expr": "topk(10, sum(rate(hubble_flows_processed_total{cluster=~\"$cluster\", source_namespace=~\"$source_namespace\", destination_namespace=~\"$destination_namespace\"}[$__rate_interval])) by (destination))",
"legendFormat": "{{destination}}",
"range": true,
"refId": "A"
}
],
"title": "Top 10 destinations",
"type": "bargauge"
🤖 Prompt for AI Agents
In dashboards/hubble/network-overview.json around lines 410 to 424, the panel
aggregates by destination (title "Top 10 destinations") but the legendFormat is
incorrectly set to "{{source}}"; change the legendFormat to "{{destination}}" so
the displayed legend matches the aggregation, ensuring the label reflects the
destination dimension used in the query.

Comment on lines +631 to +632
"title": "Missing ICMP Echo Replys",
"type": "timeseries"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Typo in panel title.

"Replys" should be "Replies".

🔎 Proposed fix
-        "title": "Missing ICMP Echo Replys",
+        "title": "Missing ICMP Echo Replies",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"title": "Missing ICMP Echo Replys",
"type": "timeseries"
"title": "Missing ICMP Echo Replies",
"type": "timeseries"
🤖 Prompt for AI Agents
In dashboards/hubble/network-overview.json around lines 631-632, the panel title
contains a typo: "Missing ICMP Echo Replys" should be corrected to "Missing ICMP
Echo Replies"; update the JSON title string accordingly to use the correct
spelling "Replies" and ensure the file remains valid JSON after the change.

@kvaps Andrei Kvapil (kvaps) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM, thank you!

@dosubot dosubot Bot added the lgtm This PR has been approved by a maintainer label Jan 19, 2026
@kvaps
Andrei Kvapil (kvaps) merged commit 1a7e756 into cozystack:main Jan 20, 2026
28 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

kind/feature Categorizes issue or PR as related to a new feature lgtm This PR has been approved by a maintainer size/XXL This PR changes 1000+ lines, ignoring generated files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add Hubble as observability source

2 participants