Dashboards: Add a config setting that limits the number of series that will be displayed in a panel. Users can opt in to render all series. (#103405)

* Limit series in panels in dashboards

* fix mangled comment
pull/103878/head
Oscar Kilhed 3 months ago committed by GitHub
parent 906004c7ae
commit 50499fa749
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 3
      conf/defaults.ini
  2. 1
      packages/grafana-data/src/types/config.ts
  3. 1
      packages/grafana-runtime/src/config.ts
  4. 1
      pkg/api/dtos/frontend_settings.go
  5. 1
      pkg/api/frontendsettings.go
  6. 2
      pkg/setting/setting.go
  7. 2
      public/app/features/dashboard-scene/serialization/layoutSerializers/utils.ts
  8. 1
      public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts
  9. 1
      public/app/features/dashboard-scene/utils/utils.ts

@ -472,6 +472,9 @@ default_home_dashboard_path =
# Dashboards UIDs to report performance metrics for. * can be used to report metrics for all dashboards
dashboard_performance_metrics =
# Maximum number of series that will be showed in a single panel. Users can opt in to rendering all series. Default is 0 (unlimited).
panel_series_limit =
################################### Data sources #########################
[datasources]
# Upper limit of data sources that Grafana will return. This limit is a temporary configuration and it will be deprecated when pagination will be introduced on the list data sources API.

@ -227,6 +227,7 @@ export interface GrafanaConfig {
rudderstackIntegrationsUrl: string | undefined;
analyticsConsoleReporting: boolean;
dashboardPerformanceMetrics: string[];
panelSeriesLimit: number;
sqlConnectionLimits: SqlConnectionLimits;
sharedWithMeFolderUID?: string;
rootFolderUID?: string;

@ -184,6 +184,7 @@ export class GrafanaBootConfig implements GrafanaConfig {
rudderstackIntegrationsUrl: undefined;
analyticsConsoleReporting = false;
dashboardPerformanceMetrics: string[] = [];
panelSeriesLimit = 0;
sqlConnectionLimits = {
maxOpenConns: 100,
maxIdleConns: 100,

@ -194,6 +194,7 @@ type FrontendSettingsDTO struct {
AnalyticsConsoleReporting bool `json:"analyticsConsoleReporting"`
DashboardPerformanceMetrics []string `json:"dashboardPerformanceMetrics"`
PanelSeriesLimit int `json:"panelSeriesLimit"`
FeedbackLinksEnabled bool `json:"feedbackLinksEnabled"`
ApplicationInsightsConnectionString string `json:"applicationInsightsConnectionString"`

@ -216,6 +216,7 @@ func (hs *HTTPServer) getFrontendSettings(c *contextmodel.ReqContext) (*dtos.Fro
RudderstackIntegrationsUrl: hs.Cfg.RudderstackIntegrationsURL,
AnalyticsConsoleReporting: hs.Cfg.FrontendAnalyticsConsoleReporting,
DashboardPerformanceMetrics: hs.Cfg.DashboardPerformanceMetrics,
PanelSeriesLimit: hs.Cfg.PanelSeriesLimit,
FeedbackLinksEnabled: hs.Cfg.FeedbackLinksEnabled,
ApplicationInsightsConnectionString: hs.Cfg.ApplicationInsightsConnectionString,
ApplicationInsightsEndpointUrl: hs.Cfg.ApplicationInsightsEndpointUrl,

@ -226,6 +226,7 @@ type Cfg struct {
MinRefreshInterval string
DefaultHomeDashboardPath string
DashboardPerformanceMetrics []string
PanelSeriesLimit int
// Auth
LoginCookieName string
@ -1149,6 +1150,7 @@ func (cfg *Cfg) parseINIFile(iniFile *ini.File) error {
cfg.MinRefreshInterval = valueAsString(dashboards, "min_refresh_interval", "5s")
cfg.DefaultHomeDashboardPath = dashboards.Key("default_home_dashboard_path").MustString("")
cfg.DashboardPerformanceMetrics = util.SplitString(dashboards.Key("dashboard_performance_metrics").MustString(""))
cfg.PanelSeriesLimit = dashboards.Key("panel_series_limit").MustInt(0)
if err := readUserSettings(iniFile, cfg); err != nil {
return err

@ -67,6 +67,7 @@ export function buildVizPanel(panel: PanelKind, id?: number): VizPanel {
displayMode: panel.spec.transparent ? 'transparent' : 'default',
hoverHeader: !panel.spec.title && !timeOverrideShown,
hoverHeaderOffset: 0,
seriesLimit: config.panelSeriesLimit,
$data: createPanelDataProvider(panel),
titleItems,
$behaviors: [],
@ -106,6 +107,7 @@ export function buildLibraryPanel(panel: LibraryPanelKind, id?: number): VizPane
const vizPanelState: VizPanelState = {
key: getVizPanelKeyForPanelId(id ?? panel.spec.id),
titleItems,
seriesLimit: config.panelSeriesLimit,
$behaviors: [
new LibraryPanelBehavior({
uid: panel.spec.libraryPanel.uid,

@ -322,6 +322,7 @@ export function buildGridItemForPanel(panel: PanelModel): DashboardGridItem {
options: panel.options ?? {},
fieldConfig: panel.fieldConfig,
pluginVersion: panel.pluginVersion,
seriesLimit: config.panelSeriesLimit,
displayMode: panel.transparent ? 'transparent' : undefined,
// To be replaced with it's own option persited option instead derived
hoverHeader: !panel.title && !timeOverrideShown,

@ -328,6 +328,7 @@ export function getDefaultVizPanel(): VizPanel {
return new VizPanel({
title: newPanelTitle,
pluginId: defaultPluginId,
seriesLimit: config.panelSeriesLimit,
titleItems: [new VizPanelLinks({ menu: new VizPanelLinksMenu({}) })],
hoverHeaderOffset: 0,
$behaviors: [],

Loading…
Cancel
Save