# Grafana Panels and Visualizations - Detailed Reference ## What is a Panel? A panel is the basic building block of a Grafana dashboard. Each panel combines: - A **query** (or multiple queries) to a data source - A **visualization type** to display the data - **Field configuration** (units, thresholds, color mappings) - Optional **transformations** to reshape the data before display --- ## Panel Editor Open the panel editor by clicking a panel's title > Edit, or clicking **Add visualization** for a new panel. ### Panel Editor Layout **Top bar**: Back to dashboard, Discard changes, Save dashboard **Center**: Visualization preview (live update as you configure) **Toggle**: "Table view" - shows raw query results as a table for debugging **Right sidebar tabs**: 1. **Query** - configure data sources and write queries 2. **Transform** - apply data transformations 3. **Alert** - create alert rules from this panel 4. Below tabs: visualization-specific options and field config ### Query Tab - **Data source selector**: Choose which data source to query - **Query editor**: Data-source-specific interface (PromQL for Prometheus, LogQL for Loki, SQL for databases) - **Query options**: - Max data points: Limit data points fetched - Min interval: Minimum auto-calculated interval - Interval: Override the auto-calculated interval - Relative time: Override dashboard time range for this panel only - Time shift: Shift the time range (e.g., to compare to last week) - **+ Query**: Add multiple queries (labeled A, B, C...) - **Expression**: Add server-side math expressions combining query results --- ## Visualization Types ### Time Series (default) Best for: Metrics over time, continuous data - Renders as lines, points, or bars - Supports multiple series - Configurable line width, fill, point size - Supports thresholds as colored background regions - Supports annotations overlay - **Graph styles**: Lines, Bars, Points; can mix per series - **Stacking**: None, Normal, 100% - **Axis**: Left Y, Right Y, hidden - Default visualization - supports alerting ### Stat Best for: Single important metric (KPI display) - Shows one or more values as large text - Supports sparkline background - Color modes: value, background, none - Can show last value, mean, sum, etc. - Great for dashboards that need quick status overviews ### Bar Chart Best for: Comparing categorical data - Horizontal or vertical orientation - Grouped or stacked - Supports labels on bars ### Gauge Best for: Showing a value relative to min/max range - Circular gauge with arc - Configurable thresholds set colors - Shows current value prominently ### Bar Gauge Best for: Multiple metrics as horizontal/vertical bars - Useful for comparing many items - Supports thresholds for color coding - Modes: gradient, retro LCD, basic ### Table Best for: Tabular data, multi-column metrics - Supports sorting by column - Column width customization - Cell display modes: color text, color background, gradient gauge - Pagination for large datasets - Can embed sparklines in cells ### Heatmap Best for: Distribution over time, histogram-over-time - X axis: time; Y axis: buckets; Color: density/value - Supports pre-bucketed data (Prometheus histogram) and raw values - Tooltip shows exact bucket counts ### Histogram Best for: Value distribution analysis - Groups values into buckets - Can combine multiple series - Configurable bucket size ### Pie Chart Best for: Proportional data, parts-of-whole - Pie or donut style - Labels: name, value, percentage ### Logs Best for: Log data from Loki, Elasticsearch, etc. - Displays raw log lines with timestamp - Log level coloring (info/warn/error) - Search/filter within results - Deduplication and time wrapping - Prettify JSON option ### Traces Best for: Distributed tracing visualization (Tempo) - Renders trace spans as a waterfall/Gantt chart - Shows service name, operation, duration - Click to drill into trace details ### Flame Graph Best for: CPU profiling data (Pyroscope) - Visualizes call stacks by CPU time - Click to zoom into subtrees ### Node Graph Best for: Service dependency maps, network topology - Renders nodes and edges - Node color/size configurable by metric ### Geomap Best for: Geographic data visualization - Layers: markers, heatmap, route - Multiple base map options (OpenStreetMap, CARTO, etc.) - Supports GeoJSON data ### Canvas Best for: Custom layouts, process diagrams, status boards - Drag-and-drop element placement - Elements: text, metric value, rectangle, ellipse, icon, image, connections - Dynamic data binding per element ### State Timeline Best for: State changes over time (on/off, OK/warn/crit) - Horizontal bands showing state duration - Each series = one row - Color per state value ### Status History Best for: Periodic state checks over time - Grid: Y=services, X=time buckets - Color per state ### XY Chart Best for: Correlation between two metrics - Scatter plot - X and Y axis from different fields - Bubble size from a third field ### Candlestick Best for: Financial OHLC data - Open/High/Low/Close representation - Volume bars ### Text Best for: Documentation panels, headers - Renders Markdown or HTML ### Alert List Best for: Dashboard overview of current alert states ### Dashboard List Best for: Navigation panels linking to other dashboards --- ## Field Configuration (Standard Options) Available for most visualizations under the visualization options panel. | Option | Description | |--------|-------------| | Unit | Display unit (bytes, seconds, %, requests/sec, etc.) | | Min / Max | Override auto-detected min/max for scales | | Decimals | Number of decimal places | | Display name | Override the series/field name | | Color scheme | Fixed, thresholds-based, palette, etc. | | No value | Text to display when value is null | ### Thresholds Define color-coded boundaries: - **Absolute**: Fixed numeric values (e.g., >90 = red, >70 = yellow, else green) - **Percentage**: Relative to min/max Example threshold config: ``` Base (default): Green 70: Yellow (warn) 90: Red (crit) ``` ### Value Mappings Transform raw values into human-readable labels or colors: - **Value to text**: e.g., `1` -> "OK", `0` -> "Down" - **Range to text**: e.g., `0-50` -> "Low" - **Regex to text**: Match patterns ### Data Links Create clickable links from panel values: - Link to other dashboards with variable values interpolated - Link to external systems (e.g., Kibana, PagerDuty) - Use `${__value.raw}` and `${__field.name}` in URLs --- ## Field Overrides Apply specific field options to individual series/columns rather than all data: 1. Click **+ Add field override** in the Overrides section 2. Choose override target: - Fields with name (exact match) - Fields with name matching regex - Fields with type (number, string, time) - Fields returned by query (A, B, C...) 3. Add properties to override (unit, color, alias, thresholds, etc.) Example: In a table with columns `cpu_idle` and `cpu_used`, set `cpu_used` to show as percentage and color by threshold while leaving `cpu_idle` with default styling. --- ## Transformations Transformations reshape query data before rendering. Apply multiple in sequence. Access: Panel editor > Transform tab > Add transformation ### Most-Used Transformations | Transformation | Description | |----------------|-------------| | **Reduce** | Collapse a time series to a single value (last, mean, sum, max, min) | | **Filter by name** | Keep only specific fields/columns | | **Filter by value** | Filter rows where a field matches a condition | | **Organize fields** | Rename, reorder, or hide fields | | **Merge** | Combine multiple query results into one table | | **Join by field** | SQL-style join on a common field (e.g., time) | | **Group by** | Group rows and aggregate (count, sum, mean, etc.) | | **Sort by** | Sort rows by a field | | **Limit** | Keep only first N rows | | **Add field from calculation** | Add a new column computed from existing columns | | **Convert field type** | Change a field's data type | | **Rename by regex** | Batch rename fields using regex | | **Extract fields** | Parse JSON or regex from a string field | | **Labels to fields** | Convert label key/values into separate columns | | **Rows to fields** | Pivot: turn row values into column headers | | **Prepare time series** | Normalize time series format | | **Time series to table** | Convert time series format to table format | Enable "Debug" toggle on any transformation to see input/output for troubleshooting. --- ## Query Options ### Multiple queries Add multiple queries (A, B, C...) to one panel. They are overlaid in the visualization. Use this to compare metrics or show multiple services on one graph. ### Expressions (server-side) Server-side expressions allow math across query results: - **Math**: `$A + $B`, `$A / $B * 100` - **Reduce**: Collapse a series to scalar - **Resample**: Change time resolution of a series - **Classic conditions**: Threshold logic (used in alerting) Example - calculate error rate as percentage: ``` Query A: total_requests{job="api"} Query B: error_requests{job="api"} Expression C (Math): $B / $A * 100 Display C as percentage ``` ### Important query variables These variables are available in queries: | Variable | Description | |----------|-------------| | `$__interval` | Auto-calculated interval based on time range and resolution | | `$__rate_interval` | Interval suitable for rate() functions (at least 4x scrape interval) | | `$__from` | Start of the current time range (ms epoch) | | `$__to` | End of the current time range (ms epoch) | | `$__range` | Duration of current time range (e.g., "6h") | | `$__range_s` | Duration in seconds | | `$__range_ms` | Duration in milliseconds | Example PromQL using interval variable: ```promql rate(http_requests_total[${__rate_interval}]) ``` --- ## Panel Inspect Click panel menu (3-dot) > **Inspect** to access: - **Data**: Raw table view of the data powering the panel - **Stats**: Query performance (time, row count) - **JSON**: Panel JSON model - **Query**: Equivalent of query inspector showing raw query and response --- ## Performance Tips 1. Limit max data points to avoid over-fetching 2. Use recording rules in Prometheus for expensive queries 3. Set longer min intervals for historical dashboards 4. Use `$__interval` variable in queries to align with time resolution 5. Use `$__rate_interval` instead of hardcoded intervals for rate() queries 6. Avoid too many panels on one dashboard (aim for <20)