From a68f8107df71a21398e65173fe7b14939462b63e Mon Sep 17 00:00:00 2001 From: "Arati R." <33031346+suntala@users.noreply.github.com> Date: Thu, 3 Jul 2025 07:13:56 +0200 Subject: [PATCH 01/19] Unified Storage/Large Object Support: Add test for dashboardv2 support (#107470) * Add more unit tests to cover dashboardv2 and cross version unmarshalling Signed-off-by: Bruno Abrantes * Change import name of meta v1 * Rename TestLargeDashboardSupport since there are tests for multiple versions * Simplify TestLargeDashboardSupportV2 * Use v1 in TestLargeDashboardSupportCrossVersion, simplify original dash * Marshal spec in TestLargeDashboardSupportCrossVersion * Remove TestLargeDashboardSupportCrossVersion --------- Signed-off-by: Bruno Abrantes Co-authored-by: Bruno Abrantes --- pkg/registry/apis/dashboard/large_test.go | 118 +++++++++++++++++++++- 1 file changed, 114 insertions(+), 4 deletions(-) diff --git a/pkg/registry/apis/dashboard/large_test.go b/pkg/registry/apis/dashboard/large_test.go index 9b86adf4011..cdeeb0310f8 100644 --- a/pkg/registry/apis/dashboard/large_test.go +++ b/pkg/registry/apis/dashboard/large_test.go @@ -6,14 +6,15 @@ import ( "testing" "github.com/stretchr/testify/require" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" dashv1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1beta1" + dashv2 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1" ) -func TestLargeDashboardSupport(t *testing.T) { +func TestLargeDashboardSupportV1(t *testing.T) { devdash := "../../../../devenv/dev-dashboards/all-panels.json" // nolint:gosec @@ -22,7 +23,7 @@ func TestLargeDashboardSupport(t *testing.T) { require.NoError(t, err) dash := &dashv1.Dashboard{ - ObjectMeta: v1.ObjectMeta{ + ObjectMeta: metav1.ObjectMeta{ Name: "test", Namespace: "test", }, @@ -57,7 +58,7 @@ func TestLargeDashboardSupport(t *testing.T) { // Now make it big again rehydratedDash := &dashv1.Dashboard{ - ObjectMeta: v1.ObjectMeta{ + ObjectMeta: metav1.ObjectMeta{ Name: "test", Namespace: "test", }, @@ -71,3 +72,112 @@ func TestLargeDashboardSupport(t *testing.T) { require.True(t, found) require.Len(t, panels, expectedPanelCount) } + +func TestLargeDashboardSupportV2(t *testing.T) { + // Test RebuildSpec functionality specifically for v2 dashboards + // This tests the json.Unmarshal(blob, &dash.Spec) path for structured specs + // unlike v0/v1 which use the UnmarshalJSON path for unstructured specs + + // Create a v2 dashboard with structured spec + originalV2Dash := &dashv2.Dashboard{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-v2", + Namespace: "test", + }, + Spec: dashv2.DashboardSpec{ + Title: "Test V2 Dashboard", + Description: stringPtr("A test dashboard for v2 large object support"), + Tags: []string{"test", "v2", "large-object"}, + Editable: boolPtr(true), + LiveNow: boolPtr(false), + Preload: false, + Annotations: []dashv2.DashboardAnnotationQueryKind{ + { + Kind: "AnnotationQuery", + Spec: dashv2.DashboardAnnotationQuerySpec{ + Name: "Test Annotation", + }, + }, + }, + Elements: map[string]dashv2.DashboardElement{ + "panel-1": { + PanelKind: &dashv2.DashboardPanelKind{}, + }, + }, + Layout: dashv2.DashboardGridLayoutKindOrRowsLayoutKindOrAutoGridLayoutKindOrTabsLayoutKind{}, + TimeSettings: dashv2.DashboardTimeSettingsSpec{}, + CursorSync: dashv2.DashboardDashboardCursorSyncOff, + Variables: []dashv2.DashboardVariableKind{}, + Links: []dashv2.DashboardDashboardLink{}, + }, + } + + scheme := runtime.NewScheme() + err := dashv2.AddToScheme(scheme) + require.NoError(t, err) + + largeObject := NewDashboardLargeObjectSupport(scheme, 0) + + // Marshal the original spec to use as our "blob" data + originalSpecBlob, err := json.Marshal(originalV2Dash.Spec) + require.NoError(t, err) + + // Create a copy to test reduction + dashToReduce := originalV2Dash.DeepCopy() + + // Convert the dashboard to a small value (ReduceSpec) + err = largeObject.ReduceSpec(dashToReduce) + require.NoError(t, err) + + // Verify only essential fields remain after reduction + require.Equal(t, "Test V2 Dashboard", dashToReduce.Spec.Title) + require.Equal(t, stringPtr("A test dashboard for v2 large object support"), dashToReduce.Spec.Description) + require.Equal(t, []string{"test", "v2", "large-object"}, dashToReduce.Spec.Tags) + + // Everything else should be empty/default + require.Empty(t, dashToReduce.Spec.Annotations) + require.Empty(t, dashToReduce.Spec.Elements) + require.Nil(t, dashToReduce.Spec.Layout.GridLayoutKind) + require.Empty(t, dashToReduce.Spec.Variables) + require.Empty(t, dashToReduce.Spec.Links) + + // Now test RebuildSpec - this is the key test for v2! + rehydratedDash := &dashv2.Dashboard{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-v2-rehydrated", + Namespace: "test", + }, + } + + // This tests the json.Unmarshal(blob, &dash.Spec) path for v2 dashboards + err = largeObject.RebuildSpec(rehydratedDash, originalSpecBlob) + require.NoError(t, err) + + // Verify the full dashboard spec is restored correctly + require.Equal(t, originalV2Dash.Spec.Title, rehydratedDash.Spec.Title) + require.Equal(t, originalV2Dash.Spec.Description, rehydratedDash.Spec.Description) + require.Equal(t, originalV2Dash.Spec.Tags, rehydratedDash.Spec.Tags) + require.Equal(t, originalV2Dash.Spec.Editable, rehydratedDash.Spec.Editable) + require.Equal(t, originalV2Dash.Spec.LiveNow, rehydratedDash.Spec.LiveNow) + require.Equal(t, originalV2Dash.Spec.Preload, rehydratedDash.Spec.Preload) + + // Verify annotations are restored + require.Len(t, rehydratedDash.Spec.Annotations, 1) + annotation := rehydratedDash.Spec.Annotations[0] + require.Equal(t, "AnnotationQuery", annotation.Kind) + require.Equal(t, "Test Annotation", annotation.Spec.Name) + + // Verify elements are restored + require.Len(t, rehydratedDash.Spec.Elements, 1) + _, exists := rehydratedDash.Spec.Elements["panel-1"] + require.True(t, exists) +} + +// Helper functions for pointer types +func stringPtr(s string) *string { + return &s +} + +func boolPtr(b bool) *bool { + return &b +} From e076c74869cd602109bd0b4dcac246a7426d5d02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Thu, 3 Jul 2025 10:38:12 +0200 Subject: [PATCH 02/19] sqltemplate, dbimpl: Remove single-method function types (#107525) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove dbProviderFunc function. This removes one extra indirection that made the code bit more difficult to navigate. * Remove indirection function types implementing single-method interfaces. This streamlines the code and makes it bit easier to navigate. * Update pkg/storage/unified/sql/sqltemplate/dialect_mysql.go Co-authored-by: Mustafa Sencer Özcan <32759850+mustafasencer@users.noreply.github.com> --------- Co-authored-by: Mustafa Sencer Özcan <32759850+mustafasencer@users.noreply.github.com> --- pkg/storage/unified/sql/db/dbimpl/dbimpl.go | 29 ++++++------ .../unified/sql/sqltemplate/args_test.go | 2 +- .../unified/sql/sqltemplate/dialect.go | 29 +----------- .../unified/sql/sqltemplate/dialect_mysql.go | 35 +++++++------- .../sql/sqltemplate/dialect_postgresql.go | 29 ++++++------ .../unified/sql/sqltemplate/dialect_sqlite.go | 26 +++++++---- .../unified/sql/sqltemplate/dialect_test.go | 46 ++----------------- 7 files changed, 69 insertions(+), 127 deletions(-) diff --git a/pkg/storage/unified/sql/db/dbimpl/dbimpl.go b/pkg/storage/unified/sql/db/dbimpl/dbimpl.go index 231e9525a6c..4db1ca56a85 100644 --- a/pkg/storage/unified/sql/db/dbimpl/dbimpl.go +++ b/pkg/storage/unified/sql/db/dbimpl/dbimpl.go @@ -43,21 +43,7 @@ func ProvideResourceDB(grafanaDB infraDB.DB, cfg *setting.Cfg, tracer trace.Trac if err != nil { return nil, fmt.Errorf("provide Resource DB: %w", err) } - var once sync.Once - var resourceDB db.DB - - return dbProviderFunc(func(ctx context.Context) (db.DB, error) { - once.Do(func() { - resourceDB, err = p.init(ctx) - }) - return resourceDB, err - }), nil -} - -type dbProviderFunc func(context.Context) (db.DB, error) - -func (f dbProviderFunc) Init(ctx context.Context) (db.DB, error) { - return f(ctx) + return p, nil } type resourceDBProvider struct { @@ -68,6 +54,10 @@ type resourceDBProvider struct { tracer trace.Tracer registerMetrics bool logQueries bool + + once sync.Once + resourceDB db.DB + initErr error } func newResourceDBProvider(grafanaDB infraDB.DB, cfg *setting.Cfg, tracer trace.Tracer) (p *resourceDBProvider, err error) { @@ -124,7 +114,14 @@ func newResourceDBProvider(grafanaDB infraDB.DB, cfg *setting.Cfg, tracer trace. } } -func (p *resourceDBProvider) init(ctx context.Context) (db.DB, error) { +func (p *resourceDBProvider) Init(ctx context.Context) (db.DB, error) { + p.once.Do(func() { + p.resourceDB, p.initErr = p.initDB(ctx) + }) + return p.resourceDB, p.initErr +} + +func (p *resourceDBProvider) initDB(ctx context.Context) (db.DB, error) { p.log.Info("Initializing Resource DB", "db_type", p.engine.Dialect().DriverName(), diff --git a/pkg/storage/unified/sql/sqltemplate/args_test.go b/pkg/storage/unified/sql/sqltemplate/args_test.go index 732b2c2915f..23c17f8dc74 100644 --- a/pkg/storage/unified/sql/sqltemplate/args_test.go +++ b/pkg/storage/unified/sql/sqltemplate/args_test.go @@ -71,7 +71,7 @@ func TestArg_ArgList(t *testing.T) { } var a args - a.d = argFmtSQL92 + a.d = MySQL for i, tc := range testCases { a.Reset() diff --git a/pkg/storage/unified/sql/sqltemplate/dialect.go b/pkg/storage/unified/sql/sqltemplate/dialect.go index 918545fdb25..2f2e74cf557 100644 --- a/pkg/storage/unified/sql/sqltemplate/dialect.go +++ b/pkg/storage/unified/sql/sqltemplate/dialect.go @@ -3,7 +3,6 @@ package sqltemplate import ( "bytes" "errors" - "strconv" "strings" ) @@ -92,7 +91,6 @@ func ParseRowLockingClause(s ...string) (RowLockingClause, error) { return opt, nil } -// Row-locking clause options. const ( SelectForShare RowLockingClause = "SHARE" SelectForShareNoWait RowLockingClause = "SHARE NOWAIT" @@ -129,9 +127,6 @@ var rowLockingClauseAll = rowLockingClauseMap{ SelectForUpdateSkipLocked: SelectForUpdateSkipLocked, } -// standardIdent provides standard SQL escaping of identifiers. -type standardIdent struct{} - func escapeIdentity(s string, quote rune, clean func(string) string) (string, error) { if s == "" { return "", ErrEmptyIdent @@ -154,31 +149,11 @@ func escapeIdentity(s string, quote rune, clean func(string) string) (string, er return buffer.String(), nil } -func (standardIdent) Ident(s string) (string, error) { +// standardIdent provides standard SQL escaping of identifiers. +func standardIdent(s string) (string, error) { return escapeIdentity(s, '"', func(s string) string { // not sure we should support escaping quotes in table/column names, // but it is valid so we will support it for now return strings.ReplaceAll(s, `"`, `""`) }) } - -type argPlaceholderFunc func(int) string - -func (f argPlaceholderFunc) ArgPlaceholder(argNum int) string { - return f(argNum) -} - -var ( - argFmtSQL92 = argPlaceholderFunc(func(int) string { - return "?" - }) - argFmtPositional = argPlaceholderFunc(func(argNum int) string { - return "$" + strconv.Itoa(argNum) - }) -) - -type name string - -func (n name) DialectName() string { - return string(n) -} diff --git a/pkg/storage/unified/sql/sqltemplate/dialect_mysql.go b/pkg/storage/unified/sql/sqltemplate/dialect_mysql.go index 14fd18e0456..d5c3aba0f41 100644 --- a/pkg/storage/unified/sql/sqltemplate/dialect_mysql.go +++ b/pkg/storage/unified/sql/sqltemplate/dialect_mysql.go @@ -6,26 +6,17 @@ import ( // MySQL is the default implementation of Dialect for the MySQL DMBS, // currently supporting MySQL-8.x. -var MySQL = mysql{ - rowLockingClauseMap: rowLockingClauseAll, - argPlaceholderFunc: argFmtSQL92, - name: "mysql", +var MySQL = mysql{} + +type mysql struct{} + +func (m mysql) DialectName() string { + return "mysql" } -var _ Dialect = MySQL - -type mysql struct { - backtickIdent - rowLockingClauseMap - argPlaceholderFunc - name -} - -// MySQL always supports backticks for identifiers -// https://dev.mysql.com/doc/refman/8.4/en/identifiers.html -type backtickIdent struct{} - -func (backtickIdent) Ident(s string) (string, error) { +func (m mysql) Ident(s string) (string, error) { + // MySQL always supports backticks for identifiers + // https://dev.mysql.com/doc/refman/8.4/en/identifiers.html if strings.ContainsRune(s, '`') { return "", ErrInvalidIdentInput } @@ -34,6 +25,14 @@ func (backtickIdent) Ident(s string) (string, error) { }) } +func (m mysql) ArgPlaceholder(argNum int) string { + return "?" +} + +func (m mysql) SelectFor(s ...string) (string, error) { + return rowLockingClauseAll.SelectFor(s...) +} + func (mysql) CurrentEpoch() string { return "CAST(FLOOR(UNIX_TIMESTAMP(NOW(6)) * 1000000) AS SIGNED)" } diff --git a/pkg/storage/unified/sql/sqltemplate/dialect_postgresql.go b/pkg/storage/unified/sql/sqltemplate/dialect_postgresql.go index a0dd76010eb..bdab9beea75 100644 --- a/pkg/storage/unified/sql/sqltemplate/dialect_postgresql.go +++ b/pkg/storage/unified/sql/sqltemplate/dialect_postgresql.go @@ -2,28 +2,29 @@ package sqltemplate import ( "errors" + "fmt" "strings" ) // PostgreSQL is an implementation of Dialect for the PostgreSQL DMBS. -var PostgreSQL = postgresql{ - rowLockingClauseMap: rowLockingClauseAll, - argPlaceholderFunc: argFmtPositional, - name: "postgres", -} +var PostgreSQL = postgresql{} -var _ Dialect = PostgreSQL - -// PostgreSQL-specific errors. var ( ErrPostgreSQLUnsupportedIdent = errors.New("identifiers in PostgreSQL cannot contain the character with code zero") ) -type postgresql struct { - standardIdent - rowLockingClauseMap - argPlaceholderFunc - name +type postgresql struct{} + +func (p postgresql) DialectName() string { + return "postgres" +} + +func (p postgresql) ArgPlaceholder(argNum int) string { + return fmt.Sprintf("$%d", argNum) +} + +func (p postgresql) SelectFor(s ...string) (string, error) { + return rowLockingClauseAll.SelectFor(s...) } func (p postgresql) Ident(s string) (string, error) { @@ -33,7 +34,7 @@ func (p postgresql) Ident(s string) (string, error) { return "", ErrPostgreSQLUnsupportedIdent } - return p.standardIdent.Ident(s) + return standardIdent(s) } func (postgresql) CurrentEpoch() string { diff --git a/pkg/storage/unified/sql/sqltemplate/dialect_sqlite.go b/pkg/storage/unified/sql/sqltemplate/dialect_sqlite.go index f84ea78c477..457b5f101a9 100644 --- a/pkg/storage/unified/sql/sqltemplate/dialect_sqlite.go +++ b/pkg/storage/unified/sql/sqltemplate/dialect_sqlite.go @@ -1,20 +1,26 @@ package sqltemplate // SQLite is an implementation of Dialect for the SQLite DMBS. -var SQLite = sqlite{ - argPlaceholderFunc: argFmtSQL92, - name: "sqlite", +var SQLite = sqlite{} + +type sqlite struct{} + +func (s sqlite) DialectName() string { + return "sqlite" } -var _ Dialect = SQLite - -type sqlite struct { +func (s sqlite) Ident(i string) (string, error) { // See: // https://www.sqlite.org/lang_keywords.html - standardIdent - rowLockingClauseMap - argPlaceholderFunc - name + return standardIdent(i) +} + +func (s sqlite) ArgPlaceholder(argNum int) string { + return "?" +} + +func (s sqlite) SelectFor(s2 ...string) (string, error) { + return rowLockingClauseMap(nil).SelectFor(s2...) } func (sqlite) CurrentEpoch() string { diff --git a/pkg/storage/unified/sql/sqltemplate/dialect_test.go b/pkg/storage/unified/sql/sqltemplate/dialect_test.go index 65ba2bd9c28..9c914892818 100644 --- a/pkg/storage/unified/sql/sqltemplate/dialect_test.go +++ b/pkg/storage/unified/sql/sqltemplate/dialect_test.go @@ -6,6 +6,10 @@ import ( "testing" ) +var _ Dialect = MySQL +var _ Dialect = SQLite +var _ Dialect = PostgreSQL + func TestSelectForOption_Valid(t *testing.T) { t.Parallel() @@ -133,7 +137,7 @@ func TestStandardIdent_Ident(t *testing.T) { } for i, tc := range testCases { - gotOutput, gotErr := standardIdent{}.Ident(tc.input) + gotOutput, gotErr := standardIdent(tc.input) if !errors.Is(gotErr, tc.err) { t.Fatalf("unexpected error %v in test case %d", gotErr, i) } @@ -142,43 +146,3 @@ func TestStandardIdent_Ident(t *testing.T) { } } } - -func TestArgPlaceholderFunc(t *testing.T) { - t.Parallel() - - testCases := []struct { - input int - valuePositional string - }{ - { - input: 1, - valuePositional: "$1", - }, - { - input: 16, - valuePositional: "$16", - }, - } - - for i, tc := range testCases { - got := argFmtSQL92(tc.input) - if got != "?" { - t.Fatalf("[argFmtSQL92] unexpected value %q in test case %d", got, i) - } - - got = argFmtPositional(tc.input) - if got != tc.valuePositional { - t.Fatalf("[argFmtPositional] unexpected value %q in test case %d", got, i) - } - } -} - -func TestName_Name(t *testing.T) { - t.Parallel() - - const v = "some dialect name" - n := name(v) - if n.DialectName() != v { - t.Fatalf("unexpected dialect name %q", n.DialectName()) - } -} From a7bfd8e351738471847bb37899dc6cd7d9663dfc Mon Sep 17 00:00:00 2001 From: Misi Date: Thu, 3 Jul 2025 10:53:33 +0200 Subject: [PATCH 03/19] Auth: Remove ssoSettingsApi feature toggle (#107528) * Remove ssoSettingsApi feature toggle * Clean up * lint * Fix tests --- .../feature-toggles/index.md | 1 - .../src/types/featureToggles.gen.ts | 5 - pkg/api/api.go | 13 +- pkg/api/frontendsettings_test.go | 2 +- pkg/login/social/connectors/azuread_oauth.go | 4 +- .../social/connectors/azuread_oauth_test.go | 12 +- pkg/login/social/connectors/generic_oauth.go | 4 +- .../social/connectors/generic_oauth_test.go | 20 +-- pkg/login/social/connectors/github_oauth.go | 4 +- .../social/connectors/github_oauth_test.go | 10 +- pkg/login/social/connectors/gitlab_oauth.go | 4 +- .../social/connectors/gitlab_oauth_test.go | 10 +- pkg/login/social/connectors/google_oauth.go | 4 +- .../social/connectors/google_oauth_test.go | 10 +- .../social/connectors/grafana_com_oauth.go | 4 +- .../connectors/grafana_com_oauth_test.go | 10 +- pkg/login/social/connectors/okta_oauth.go | 4 +- .../social/connectors/okta_oauth_test.go | 6 +- pkg/login/social/socialimpl/service.go | 69 +++------- pkg/login/social/socialimpl/service_test.go | 101 +++++++++------ pkg/services/authn/authnimpl/registration.go | 3 +- pkg/services/featuremgmt/registry.go | 9 -- pkg/services/featuremgmt/toggles_gen.csv | 1 - pkg/services/featuremgmt/toggles_gen.go | 4 - pkg/services/featuremgmt/toggles_gen.json | 3 +- pkg/services/ldap/service/ldap.go | 2 +- pkg/services/ldap/service/ldap_test.go | 3 - pkg/services/navtree/navtreeimpl/admin.go | 2 +- .../ssosettings/ssosettingsimpl/service.go | 6 +- .../ssosettingstests/service_fake.go | 119 ++++++++++++++++++ public/app/features/auth-config/index.ts | 2 +- .../app/features/auth-config/state/actions.ts | 5 +- public/app/routes/routes.tsx | 10 +- 33 files changed, 265 insertions(+), 201 deletions(-) create mode 100644 pkg/services/ssosettings/ssosettingstests/service_fake.go diff --git a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md index ef2ca7ab494..a3e2776142e 100644 --- a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md +++ b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md @@ -50,7 +50,6 @@ Most [generally available](https://grafana.com/docs/release-life-cycle/#general- | `dashboardSceneForViewers` | Enables dashboard rendering using Scenes for viewer roles | Yes | | `dashboardSceneSolo` | Enables rendering dashboards using scenes for solo panels | Yes | | `dashboardScene` | Enables dashboard rendering using scenes for all roles | Yes | -| `ssoSettingsApi` | Enables the SSO settings API and the OAuth configuration UIs in Grafana | Yes | | `logsInfiniteScrolling` | Enables infinite scrolling for the Logs panel in Explore and Dashboards | Yes | | `logRowsPopoverMenu` | Enable filtering menu displayed when text of a log line is selected | Yes | | `alertingQueryOptimization` | Optimizes eligible queries in order to reduce load on datasources | | diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts index 167962c0745..46aa38792a9 100644 --- a/packages/grafana-data/src/types/featureToggles.gen.ts +++ b/packages/grafana-data/src/types/featureToggles.gen.ts @@ -393,11 +393,6 @@ export interface FeatureToggles { */ pdfTables?: boolean; /** - * Enables the SSO settings API and the OAuth configuration UIs in Grafana - * @default true - */ - ssoSettingsApi?: boolean; - /** * Allow pan and zoom in canvas panel */ canvasPanelPanZoom?: boolean; diff --git a/pkg/api/api.go b/pkg/api/api.go index d9ba624d32b..12de28eaa90 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -254,18 +254,15 @@ func (hs *HTTPServer) registerRoutes() { adminAuthPageEvaluator := func() ac.Evaluator { authnSettingsEval := ssoutils.EvalAuthenticationSettings(hs.Cfg) - if hs.Features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsApi) { - return ac.EvalAny(authnSettingsEval, ssoutils.OauthSettingsEvaluator(hs.Cfg)) - } - return authnSettingsEval + + return ac.EvalAny(authnSettingsEval, ssoutils.OauthSettingsEvaluator(hs.Cfg)) } r.Get("/admin/authentication", authorize(adminAuthPageEvaluator()), hs.Index) r.Get("/admin/authentication/ldap", authorize(ac.EvalPermission(ac.ActionLDAPStatusRead)), hs.Index) - if hs.Features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsApi) { - providerParam := ac.Parameter(":provider") - r.Get("/admin/authentication/:provider", authorize(ac.EvalPermission(ac.ActionSettingsRead, ac.ScopeSettingsOAuth(providerParam))), hs.Index) - } + + providerParam := ac.Parameter(":provider") + r.Get("/admin/authentication/:provider", authorize(ac.EvalPermission(ac.ActionSettingsRead, ac.ScopeSettingsOAuth(providerParam))), hs.Index) // authed api r.Group("/api", func(apiRoute routing.RouteRegister) { diff --git a/pkg/api/frontendsettings_test.go b/pkg/api/frontendsettings_test.go index 8c2daa46414..b84a1ae679a 100644 --- a/pkg/api/frontendsettings_test.go +++ b/pkg/api/frontendsettings_test.go @@ -99,7 +99,7 @@ func setupTestEnvironment(t *testing.T, cfg *setting.Cfg, features featuremgmt.F pluginsCDNService: pluginsCDN, pluginAssets: pluginsAssets, namespacer: request.GetNamespaceMapper(cfg), - SocialService: socialimpl.ProvideService(cfg, features, &usagestats.UsageStatsMock{}, supportbundlestest.NewFakeBundleService(), remotecache.NewFakeCacheStorage(), nil, &ssosettingstests.MockService{}), + SocialService: socialimpl.ProvideService(cfg, features, &usagestats.UsageStatsMock{}, supportbundlestest.NewFakeBundleService(), remotecache.NewFakeCacheStorage(), nil, ssosettingstests.NewFakeService()), managedPluginsService: managedplugins.NewNoop(), tracer: tracing.InitializeTracerForTest(), DataSourcesService: &datafakes.FakeDataSourceService{}, diff --git a/pkg/login/social/connectors/azuread_oauth.go b/pkg/login/social/connectors/azuread_oauth.go index d09265407f3..f06373df124 100644 --- a/pkg/login/social/connectors/azuread_oauth.go +++ b/pkg/login/social/connectors/azuread_oauth.go @@ -106,9 +106,7 @@ func NewAzureADProvider(info *social.OAuthInfo, cfg *setting.Cfg, orgRoleMapper appendUniqueScope(provider.Config, social.OfflineAccessScope) } - if features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsApi) { - ssoSettings.RegisterReloadable(social.AzureADProviderName, provider) - } + ssoSettings.RegisterReloadable(social.AzureADProviderName, provider) return provider } diff --git a/pkg/login/social/connectors/azuread_oauth_test.go b/pkg/login/social/connectors/azuread_oauth_test.go index c882a550071..88e2f6039c3 100644 --- a/pkg/login/social/connectors/azuread_oauth_test.go +++ b/pkg/login/social/connectors/azuread_oauth_test.go @@ -841,7 +841,7 @@ func TestSocialAzureAD_UserInfo(t *testing.T) { tt.fields.cfg, ProvideOrgRoleMapper(tt.fields.cfg, &orgtest.FakeOrgService{ExpectedOrgs: []*org.OrgDTO{{ID: 4, Name: "Org4"}, {ID: 5, Name: "Org5"}}}), - &ssosettingstests.MockService{}, + ssosettingstests.NewFakeService(), featuremgmt.WithFeatures(), cache) @@ -1019,7 +1019,7 @@ func TestSocialAzureAD_SkipOrgRole(t *testing.T) { tt.fields.cfg, ProvideOrgRoleMapper(tt.fields.cfg, &orgtest.FakeOrgService{ExpectedOrgs: []*org.OrgDTO{{ID: 4, Name: "Org4"}, {ID: 5, Name: "Org5"}}}), - &ssosettingstests.MockService{}, + ssosettingstests.NewFakeService(), featuremgmt.WithFeatures(), cache) @@ -1119,7 +1119,7 @@ func TestSocialAzureAD_InitializeExtraFields(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewAzureADProvider(tc.settings, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures(), nil) + s := NewAzureADProvider(tc.settings, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures(), nil) require.Equal(t, tc.want.forceUseGraphAPI, s.forceUseGraphAPI) require.Equal(t, tc.want.allowedOrganizations, s.allowedOrganizations) @@ -1280,7 +1280,7 @@ func TestSocialAzureAD_Validate(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewAzureADProvider(&social.OAuthInfo{}, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures(), nil) + s := NewAzureADProvider(&social.OAuthInfo{}, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures(), nil) if tc.requester == nil { tc.requester = &user.SignedInUser{IsGrafanaAdmin: false} @@ -1360,7 +1360,7 @@ func TestSocialAzureAD_Reload(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewAzureADProvider(tc.info, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures(), nil) + s := NewAzureADProvider(tc.info, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures(), nil) err := s.Reload(context.Background(), tc.settings) if tc.expectError { @@ -1417,7 +1417,7 @@ func TestSocialAzureAD_Reload_ExtraFields(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewAzureADProvider(tc.info, setting.NewCfg(), nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures(), remotecache.FakeCacheStorage{}) + s := NewAzureADProvider(tc.info, setting.NewCfg(), nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures(), remotecache.FakeCacheStorage{}) err := s.Reload(context.Background(), tc.settings) require.NoError(t, err) diff --git a/pkg/login/social/connectors/generic_oauth.go b/pkg/login/social/connectors/generic_oauth.go index 0209b4bb0da..7d1d5842a47 100644 --- a/pkg/login/social/connectors/generic_oauth.go +++ b/pkg/login/social/connectors/generic_oauth.go @@ -79,9 +79,7 @@ func NewGenericOAuthProvider(info *social.OAuthInfo, cfg *setting.Cfg, orgRoleMa allowedOrganizations: allowedOrganizations, } - if features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsApi) { - ssoSettings.RegisterReloadable(social.GenericOAuthProviderName, provider) - } + ssoSettings.RegisterReloadable(social.GenericOAuthProviderName, provider) return provider } diff --git a/pkg/login/social/connectors/generic_oauth_test.go b/pkg/login/social/connectors/generic_oauth_test.go index f61b06b0a98..881ed9fd541 100644 --- a/pkg/login/social/connectors/generic_oauth_test.go +++ b/pkg/login/social/connectors/generic_oauth_test.go @@ -458,7 +458,7 @@ func TestUserInfoSearchesForEmailAndOrgRoles(t *testing.T) { EmailAttributePath: "email", }, cfg, orgRoleMapper, - &ssosettingstests.MockService{}, + ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) provider.info.RoleAttributePath = tc.RoleAttributePath @@ -507,7 +507,7 @@ func TestUserInfoSearchesForEmailAndOrgRoles(t *testing.T) { EmailAttributePath: "email", }, cfg, orgRoleMapper, - &ssosettingstests.MockService{}, + ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) body, err := json.Marshal(map[string]any{"info": map[string]any{"roles": []string{"engineering", "SRE"}}}) @@ -600,7 +600,7 @@ func TestUserInfoSearchesForLogin(t *testing.T) { }, }, setting.NewCfg(), ProvideOrgRoleMapper(setting.NewCfg(), orgtest.NewOrgServiceFake()), - &ssosettingstests.MockService{}, + ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) for _, tc := range testCases { @@ -700,7 +700,7 @@ func TestUserInfoSearchesForName(t *testing.T) { }, setting.NewCfg(), ProvideOrgRoleMapper(setting.NewCfg(), orgtest.NewOrgServiceFake()), - &ssosettingstests.MockService{}, + ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) for _, tc := range testCases { @@ -782,7 +782,7 @@ func TestUserInfoSearchesForGroup(t *testing.T) { ApiUrl: ts.URL, }, setting.NewCfg(), ProvideOrgRoleMapper(setting.NewCfg(), orgtest.NewOrgServiceFake()), - &ssosettingstests.MockService{}, + ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) token := &oauth2.Token{ @@ -802,7 +802,7 @@ func TestUserInfoSearchesForGroup(t *testing.T) { func TestPayloadCompression(t *testing.T) { provider := NewGenericOAuthProvider(&social.OAuthInfo{ EmailAttributePath: "email", - }, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + }, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) tests := []struct { Name string @@ -957,7 +957,7 @@ func TestSocialGenericOAuth_InitializeExtraFields(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewGenericOAuthProvider(tc.settings, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGenericOAuthProvider(tc.settings, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) require.Equal(t, tc.want.nameAttributePath, s.nameAttributePath) require.Equal(t, tc.want.loginAttributePath, s.loginAttributePath) @@ -1176,7 +1176,7 @@ func TestSocialGenericOAuth_Validate(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewGenericOAuthProvider(&social.OAuthInfo{}, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGenericOAuthProvider(&social.OAuthInfo{}, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) if tc.requester == nil { tc.requester = &user.SignedInUser{IsGrafanaAdmin: false} @@ -1256,7 +1256,7 @@ func TestSocialGenericOAuth_Reload(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewGenericOAuthProvider(tc.info, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGenericOAuthProvider(tc.info, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) err := s.Reload(context.Background(), tc.settings) if tc.expectError { @@ -1354,7 +1354,7 @@ func TestGenericOAuth_Reload_ExtraFields(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewGenericOAuthProvider(tc.info, setting.NewCfg(), nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGenericOAuthProvider(tc.info, setting.NewCfg(), nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) err := s.Reload(context.Background(), tc.settings) require.NoError(t, err) diff --git a/pkg/login/social/connectors/github_oauth.go b/pkg/login/social/connectors/github_oauth.go index f5f0b43b3f3..619e7fa63c5 100644 --- a/pkg/login/social/connectors/github_oauth.go +++ b/pkg/login/social/connectors/github_oauth.go @@ -85,9 +85,7 @@ func NewGitHubProvider(info *social.OAuthInfo, cfg *setting.Cfg, orgRoleMapper * provider.log.Warn("Failed to parse team ids. Team ids must be a list of numbers.", "teamIds", teamIdsSplitted) } - if features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsApi) { - ssoSettings.RegisterReloadable(social.GitHubProviderName, provider) - } + ssoSettings.RegisterReloadable(social.GitHubProviderName, provider) return provider } diff --git a/pkg/login/social/connectors/github_oauth_test.go b/pkg/login/social/connectors/github_oauth_test.go index 90b648f5f84..b6cfeeb5aa3 100644 --- a/pkg/login/social/connectors/github_oauth_test.go +++ b/pkg/login/social/connectors/github_oauth_test.go @@ -390,7 +390,7 @@ func TestSocialGitHub_UserInfo(t *testing.T) { }, cfg, ProvideOrgRoleMapper(cfg, &orgtest.FakeOrgService{ExpectedOrgs: []*org.OrgDTO{{ID: 4, Name: "Org4"}, {ID: 5, Name: "Org5"}}}), - &ssosettingstests.MockService{}, + ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) token := &oauth2.Token{ @@ -471,7 +471,7 @@ func TestSocialGitHub_InitializeExtraFields(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewGitHubProvider(tc.settings, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGitHubProvider(tc.settings, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) require.Equal(t, tc.want.teamIds, s.teamIds) require.Equal(t, tc.want.allowedOrganizations, s.allowedOrganizations) @@ -598,7 +598,7 @@ func TestSocialGitHub_Validate(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewGitHubProvider(&social.OAuthInfo{}, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGitHubProvider(&social.OAuthInfo{}, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) if tc.requester == nil { tc.requester = &user.SignedInUser{IsGrafanaAdmin: false} @@ -679,7 +679,7 @@ func TestSocialGitHub_Reload(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewGitHubProvider(tc.info, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGitHubProvider(tc.info, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) err := s.Reload(context.Background(), tc.settings) if tc.expectError { @@ -738,7 +738,7 @@ func TestGitHub_Reload_ExtraFields(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewGitHubProvider(tc.info, setting.NewCfg(), nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGitHubProvider(tc.info, setting.NewCfg(), nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) err := s.Reload(context.Background(), tc.settings) require.NoError(t, err) diff --git a/pkg/login/social/connectors/gitlab_oauth.go b/pkg/login/social/connectors/gitlab_oauth.go index 7497c24d619..8545040aa0f 100644 --- a/pkg/login/social/connectors/gitlab_oauth.go +++ b/pkg/login/social/connectors/gitlab_oauth.go @@ -57,9 +57,7 @@ func NewGitLabProvider(info *social.OAuthInfo, cfg *setting.Cfg, orgRoleMapper * SocialBase: newSocialBase(social.GitlabProviderName, orgRoleMapper, info, features, cfg), } - if features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsApi) { - ssoSettings.RegisterReloadable(social.GitlabProviderName, provider) - } + ssoSettings.RegisterReloadable(social.GitlabProviderName, provider) return provider } diff --git a/pkg/login/social/connectors/gitlab_oauth_test.go b/pkg/login/social/connectors/gitlab_oauth_test.go index 3963864974d..09a621f645f 100644 --- a/pkg/login/social/connectors/gitlab_oauth_test.go +++ b/pkg/login/social/connectors/gitlab_oauth_test.go @@ -209,7 +209,7 @@ func TestSocialGitlab_UserInfo(t *testing.T) { SkipOrgRoleSync: tt.Cfg.SkipOrgRoleSync, OrgMapping: tt.Cfg.OrgMapping, // OrgAttributePath: "", - }, cfg, orgMapper, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + }, cfg, orgMapper, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") @@ -398,7 +398,7 @@ func TestSocialGitlab_extractFromToken(t *testing.T) { }, &setting.Cfg{ AutoAssignOrgRole: "", - }, nil, &ssosettingstests.MockService{}, + }, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) // Test case: successful extraction @@ -489,7 +489,7 @@ func TestSocialGitlab_GetGroupsNextPage(t *testing.T) { defer mockServer.Close() // Create a SocialGitlab instance with the mock server URL - s := NewGitLabProvider(&social.OAuthInfo{ApiUrl: mockServer.URL}, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGitLabProvider(&social.OAuthInfo{ApiUrl: mockServer.URL}, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) // Call getGroups and verify that it returns all groups expectedGroups := []string{"admins", "editors", "viewers", "serveradmins"} @@ -611,7 +611,7 @@ func TestSocialGitlab_Validate(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewGitLabProvider(&social.OAuthInfo{}, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGitLabProvider(&social.OAuthInfo{}, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) if tc.requester == nil { tc.requester = &user.SignedInUser{IsGrafanaAdmin: false} @@ -692,7 +692,7 @@ func TestSocialGitlab_Reload(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewGitLabProvider(tc.info, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGitLabProvider(tc.info, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) err := s.Reload(context.Background(), tc.settings) if tc.expectError { diff --git a/pkg/login/social/connectors/google_oauth.go b/pkg/login/social/connectors/google_oauth.go index de72b011eaf..2191a2c01e8 100644 --- a/pkg/login/social/connectors/google_oauth.go +++ b/pkg/login/social/connectors/google_oauth.go @@ -58,9 +58,7 @@ func NewGoogleProvider(info *social.OAuthInfo, cfg *setting.Cfg, orgRoleMapper * provider.log.Warn("Using legacy Google API URL, please update your configuration") } - if features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsApi) { - ssoSettings.RegisterReloadable(social.GoogleProviderName, provider) - } + ssoSettings.RegisterReloadable(social.GoogleProviderName, provider) return provider } diff --git a/pkg/login/social/connectors/google_oauth_test.go b/pkg/login/social/connectors/google_oauth_test.go index 4865c259674..0446a749adc 100644 --- a/pkg/login/social/connectors/google_oauth_test.go +++ b/pkg/login/social/connectors/google_oauth_test.go @@ -204,7 +204,7 @@ func TestSocialGoogle_retrieveGroups(t *testing.T) { AutoAssignOrgRole: "", }, nil, - &ssosettingstests.MockService{}, + ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) got, err := s.retrieveGroups(context.Background(), tt.args.client, tt.args.userData) @@ -693,7 +693,7 @@ func TestSocialGoogle_UserInfo(t *testing.T) { }, cfg, ProvideOrgRoleMapper(cfg, &orgtest.FakeOrgService{ExpectedOrgs: []*org.OrgDTO{{ID: 4, Name: "Org4"}, {ID: 5, Name: "Org5"}}}), - &ssosettingstests.MockService{}, + ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) gotData, err := s.UserInfo(context.Background(), tt.args.client, tt.args.token) @@ -834,7 +834,7 @@ func TestSocialGoogle_Validate(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewGoogleProvider(&social.OAuthInfo{}, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGoogleProvider(&social.OAuthInfo{}, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) if tc.requester == nil { tc.requester = &user.SignedInUser{IsGrafanaAdmin: false} @@ -915,7 +915,7 @@ func TestSocialGoogle_Reload(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewGoogleProvider(tc.info, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGoogleProvider(tc.info, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) err := s.Reload(context.Background(), tc.settings) if tc.expectError { @@ -968,7 +968,7 @@ func TestIsHDAllowed(t *testing.T) { t.Run(tc.name, func(t *testing.T) { info := &social.OAuthInfo{} info.AllowedDomains = tc.allowedDomains - s := NewGoogleProvider(info, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGoogleProvider(info, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) s.validateHD = tc.validateHD err := s.isHDAllowed(tc.email) diff --git a/pkg/login/social/connectors/grafana_com_oauth.go b/pkg/login/social/connectors/grafana_com_oauth.go index a4efd5cd116..aea507ffdf7 100644 --- a/pkg/login/social/connectors/grafana_com_oauth.go +++ b/pkg/login/social/connectors/grafana_com_oauth.go @@ -57,9 +57,7 @@ func NewGrafanaComProvider(info *social.OAuthInfo, cfg *setting.Cfg, orgRoleMapp allowedOrganizations: allowedOrganizations, } - if features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsApi) { - ssoSettings.RegisterReloadable(social.GrafanaComProviderName, provider) - } + ssoSettings.RegisterReloadable(social.GrafanaComProviderName, provider) return provider } diff --git a/pkg/login/social/connectors/grafana_com_oauth_test.go b/pkg/login/social/connectors/grafana_com_oauth_test.go index a9ee26bbbd2..32def336540 100644 --- a/pkg/login/social/connectors/grafana_com_oauth_test.go +++ b/pkg/login/social/connectors/grafana_com_oauth_test.go @@ -41,7 +41,7 @@ func TestSocialGrafanaCom_UserInfo(t *testing.T) { provider := NewGrafanaComProvider(social.NewOAuthInfo(), cfg, ProvideOrgRoleMapper(cfg, &orgtest.FakeOrgService{}), - &ssosettingstests.MockService{}, + ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) type conf struct { @@ -140,7 +140,7 @@ func TestSocialGrafanaCom_InitializeExtraFields(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewGrafanaComProvider(tc.settings, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGrafanaComProvider(tc.settings, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) require.Equal(t, tc.want.allowedOrganizations, s.allowedOrganizations) }) @@ -209,7 +209,7 @@ func TestSocialGrafanaCom_Validate(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewGrafanaComProvider(&social.OAuthInfo{}, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGrafanaComProvider(&social.OAuthInfo{}, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) if tc.requester == nil { tc.requester = &user.SignedInUser{IsGrafanaAdmin: false} @@ -309,7 +309,7 @@ func TestSocialGrafanaCom_Reload(t *testing.T) { cfg := &setting.Cfg{ GrafanaComURL: GrafanaComURL, } - s := NewGrafanaComProvider(tc.info, cfg, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGrafanaComProvider(tc.info, cfg, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) err := s.Reload(context.Background(), tc.settings) if tc.expectError { @@ -370,7 +370,7 @@ func TestSocialGrafanaCom_Reload_ExtraFields(t *testing.T) { cfg := &setting.Cfg{ GrafanaComURL: GrafanaComURL, } - s := NewGrafanaComProvider(tc.info, cfg, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewGrafanaComProvider(tc.info, cfg, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) err := s.Reload(context.Background(), tc.settings) require.NoError(t, err) diff --git a/pkg/login/social/connectors/okta_oauth.go b/pkg/login/social/connectors/okta_oauth.go index ffa3a32a350..597051f7eae 100644 --- a/pkg/login/social/connectors/okta_oauth.go +++ b/pkg/login/social/connectors/okta_oauth.go @@ -54,9 +54,7 @@ func NewOktaProvider(info *social.OAuthInfo, cfg *setting.Cfg, orgRoleMapper *Or appendUniqueScope(provider.Config, social.OfflineAccessScope) } - if features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsApi) { - ssoSettings.RegisterReloadable(social.OktaProviderName, provider) - } + ssoSettings.RegisterReloadable(social.OktaProviderName, provider) return provider } diff --git a/pkg/login/social/connectors/okta_oauth_test.go b/pkg/login/social/connectors/okta_oauth_test.go index 69c94bdf3bc..73fadd37454 100644 --- a/pkg/login/social/connectors/okta_oauth_test.go +++ b/pkg/login/social/connectors/okta_oauth_test.go @@ -200,7 +200,7 @@ func TestSocialOkta_UserInfo(t *testing.T) { cfg, ProvideOrgRoleMapper(cfg, &orgtest.FakeOrgService{ExpectedOrgs: []*org.OrgDTO{{ID: 4, Name: "Org4"}, {ID: 5, Name: "Org5"}}}), - &ssosettingstests.MockService{}, + ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) // create a oauth2 token with a id_token @@ -372,7 +372,7 @@ func TestSocialOkta_Validate(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewOktaProvider(&social.OAuthInfo{}, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewOktaProvider(&social.OAuthInfo{}, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) if tc.requester == nil { tc.requester = &user.SignedInUser{IsGrafanaAdmin: false} @@ -452,7 +452,7 @@ func TestSocialOkta_Reload(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - s := NewOktaProvider(tc.info, &setting.Cfg{}, nil, &ssosettingstests.MockService{}, featuremgmt.WithFeatures()) + s := NewOktaProvider(tc.info, &setting.Cfg{}, nil, ssosettingstests.NewFakeService(), featuremgmt.WithFeatures()) err := s.Reload(context.Background(), tc.settings) if tc.expectError { diff --git a/pkg/login/social/socialimpl/service.go b/pkg/login/social/socialimpl/service.go index 65a9a5573cc..ace96529443 100644 --- a/pkg/login/social/socialimpl/service.go +++ b/pkg/login/social/socialimpl/service.go @@ -25,11 +25,6 @@ import ( "github.com/grafana/grafana/pkg/setting" ) -var ( - allOauthes = []string{social.GitHubProviderName, social.GitlabProviderName, social.GoogleProviderName, social.GenericOAuthProviderName, social.GrafanaNetProviderName, - social.GrafanaComProviderName, social.AzureADProviderName, social.OktaProviderName} -) - type SocialService struct { cfg *setting.Cfg @@ -53,56 +48,30 @@ func ProvideService(cfg *setting.Cfg, usageStats.RegisterMetricsFunc(ss.getUsageStats) - if features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsApi) { - allSettings, err := ssoSettings.List(context.Background()) + allSettings, err := ssoSettings.List(context.Background()) + if err != nil { + ss.log.Error("Failed to get SSO settings", "error", err) + } + + for _, ssoSetting := range allSettings { + // ignore non-oauth2 providers + if !slices.Contains(ssosettings.AllOAuthProviders, ssoSetting.Provider) { + continue + } + + info, err := connectors.CreateOAuthInfoFromKeyValuesWithLogging(ss.log, ssoSetting.Provider, ssoSetting.Settings) if err != nil { - ss.log.Error("Failed to get SSO settings", "error", err) + ss.log.Error("Failed to create OAuthInfo for provider", "error", err, "provider", ssoSetting.Provider) + continue } - for _, ssoSetting := range allSettings { - // ignore non-oauth2 providers - if !slices.Contains(ssosettings.AllOAuthProviders, ssoSetting.Provider) { - continue - } - - info, err := connectors.CreateOAuthInfoFromKeyValuesWithLogging(ss.log, ssoSetting.Provider, ssoSetting.Settings) - if err != nil { - ss.log.Error("Failed to create OAuthInfo for provider", "error", err, "provider", ssoSetting.Provider) - continue - } - - conn, err := createOAuthConnector(ssoSetting.Provider, info, cfg, orgRoleMapper, ssoSettings, features, cache) - if err != nil { - ss.log.Error("Failed to create OAuth provider", "error", err, "provider", ssoSetting.Provider) - continue - } - - ss.socialMap[ssoSetting.Provider] = conn + conn, err := createOAuthConnector(ssoSetting.Provider, info, cfg, orgRoleMapper, ssoSettings, features, cache) + if err != nil { + ss.log.Error("Failed to create OAuth provider", "error", err, "provider", ssoSetting.Provider) + continue } - } else { - for _, name := range allOauthes { - sec := cfg.Raw.Section("auth." + name) - settingsKVs := convertIniSectionToMap(sec) - - info, err := connectors.CreateOAuthInfoFromKeyValuesWithLogging(ss.log, name, settingsKVs) - if err != nil { - ss.log.Error("Failed to create OAuthInfo for provider", "error", err, "provider", name) - continue - } - - if !info.Enabled { - continue - } - - if name == social.GrafanaNetProviderName { - name = social.GrafanaComProviderName - } - - conn, _ := createOAuthConnector(name, info, cfg, orgRoleMapper, ssoSettings, features, cache) - - ss.socialMap[name] = conn - } + ss.socialMap[ssoSetting.Provider] = conn } ss.registerSupportBundleCollectors(bundleRegistry) diff --git a/pkg/login/social/socialimpl/service_test.go b/pkg/login/social/socialimpl/service_test.go index e188fbb53d9..870c13cf8e3 100644 --- a/pkg/login/social/socialimpl/service_test.go +++ b/pkg/login/social/socialimpl/service_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/google/go-cmp/cmp" "github.com/stretchr/testify/require" "gopkg.in/ini.v1" @@ -28,26 +29,14 @@ func TestMain(m *testing.M) { } func TestIntegrationSocialService_ProvideService(t *testing.T) { - type testEnv struct { - features featuremgmt.FeatureToggles - } testCases := []struct { name string - setup func(t *testing.T, env *testEnv) + setup func(t *testing.T) expectedSocialMapLength int expectedGenericOAuthSkipOrgRoleSync bool }{ { - name: "should load only enabled social connectors when ssoSettingsApi is disabled", - setup: nil, - expectedSocialMapLength: 1, - expectedGenericOAuthSkipOrgRoleSync: false, - }, - { - name: "should load all social connectors when ssoSettingsApi is enabled", - setup: func(t *testing.T, env *testEnv) { - env.features = featuremgmt.WithFeatures(featuremgmt.FlagSsoSettingsApi) - }, + name: "should load all social connectors when ssoSettingsApi is enabled", expectedSocialMapLength: 7, expectedGenericOAuthSkipOrgRoleSync: false, }, @@ -88,17 +77,14 @@ func TestIntegrationSocialService_ProvideService(t *testing.T) { t.Run(tc.name, func(t *testing.T) { ctx := context.Background() - env := &testEnv{ - features: featuremgmt.WithFeatures(), - } if tc.setup != nil { - tc.setup(t, env) + tc.setup(t) } usageInsights := &usagestats.UsageStatsMock{} supportBundle := supportbundlestest.NewFakeBundleService() - socialService := ProvideService(cfg, env.features, usageInsights, supportBundle, remotecache.NewFakeStore(t), nil, ssoSettingsSvc) + socialService := ProvideService(cfg, featuremgmt.WithFeatures(), usageInsights, supportBundle, remotecache.NewFakeStore(t), nil, ssoSettingsSvc) require.Equal(t, tc.expectedSocialMapLength, len(socialService.GetOAuthProviders())) genericOAuthInfo := socialService.GetOAuthInfoProvider("generic_oauth") @@ -160,6 +146,9 @@ func TestIntegrationSocialService_ProvideService_GrafanaComGrafanaNet(t *testing TokenUrl: "/api/oauth2/token", Enabled: true, ClientId: "grafanaComClientId", + Extra: map[string]string{ + "allowed_organizations": "", + }, }, }, { @@ -178,6 +167,9 @@ func TestIntegrationSocialService_ProvideService_GrafanaComGrafanaNet(t *testing TokenUrl: "/api/oauth2/token", Enabled: true, ClientId: "grafanaNetClientId", + Extra: map[string]string{ + "allowed_organizations": "", + }, }, }, { @@ -196,6 +188,9 @@ func TestIntegrationSocialService_ProvideService_GrafanaComGrafanaNet(t *testing TokenUrl: "/api/oauth2/token", Enabled: true, ClientId: "grafanaComClientId", + Extra: map[string]string{ + "allowed_organizations": "", + }, }, }, { @@ -208,28 +203,19 @@ func TestIntegrationSocialService_ProvideService_GrafanaComGrafanaNet(t *testing [auth.grafananet] enabled = false client_id = grafanaNetClientId`, - expectedGrafanaComOAuthInfo: nil, + expectedGrafanaComOAuthInfo: &social.OAuthInfo{ + AuthStyle: "inheader", + AuthUrl: "/oauth2/authorize", + TokenUrl: "/api/oauth2/token", + Enabled: false, + ClientId: "grafanaComClientId", + Extra: map[string]string{ + "allowed_organizations": "", + }, + }, }, } - cfg := setting.NewCfg() - secrets := secretsfake.NewMockService(t) - accessControl := acimpl.ProvideAccessControl(featuremgmt.WithFeatures()) - sqlStore := db.InitTestDB(t) - - ssoSettingsSvc := ssosettingsimpl.ProvideService( - cfg, - sqlStore, - accessControl, - routing.NewRouteRegister(), - featuremgmt.WithFeatures(), - secrets, - &usagestats.UsageStatsMock{}, - nil, - nil, - &licensing.OSSLicensingService{}, - ) - for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { iniFile, err := ini.Load([]byte(tc.rawIniContent)) @@ -238,8 +224,45 @@ func TestIntegrationSocialService_ProvideService_GrafanaComGrafanaNet(t *testing cfg := setting.NewCfg() cfg.Raw = iniFile + secrets := secretsfake.NewMockService(t) + accessControl := acimpl.ProvideAccessControl(featuremgmt.WithFeatures()) + sqlStore := db.InitTestDB(t) + + ssoSettingsSvc := ssosettingsimpl.ProvideService( + cfg, + sqlStore, + accessControl, + routing.NewRouteRegister(), + featuremgmt.WithFeatures(), + secrets, + &usagestats.UsageStatsMock{}, + nil, + nil, + &licensing.OSSLicensingService{}, + ) + socialService := ProvideService(cfg, featuremgmt.WithFeatures(), &usagestats.UsageStatsMock{}, supportbundlestest.NewFakeBundleService(), remotecache.NewFakeStore(t), nil, ssoSettingsSvc) - require.EqualValues(t, tc.expectedGrafanaComOAuthInfo, socialService.GetOAuthInfoProvider("grafana_com")) + + // Create a custom comparison that treats nil slices as equal to empty slices for the tests + opts := cmp.Options{ + cmp.Transformer("normalizeSlice", func(s []string) []string { + if s == nil { + return []string{} + } + return s + }), + cmp.Transformer("normalizeMap", func(m map[string]string) map[string]string { + if m == nil { + return map[string]string{} + } + return m + }), + } + + actual := socialService.GetOAuthInfoProvider("grafana_com") + if diff := cmp.Diff(tc.expectedGrafanaComOAuthInfo, actual, opts); diff != "" { + t.Errorf("OAuthInfo mismatch (-want +got):\n%s", diff) + } }) } } diff --git a/pkg/services/authn/authnimpl/registration.go b/pkg/services/authn/authnimpl/registration.go index e8fa578ad39..7eadac99083 100644 --- a/pkg/services/authn/authnimpl/registration.go +++ b/pkg/services/authn/authnimpl/registration.go @@ -58,8 +58,7 @@ func ProvideRegistration( var passwordClients []authn.PasswordClient // always register LDAP if LDAP is enabled in SSO settings - ssoSettingsLDAP := features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsApi) && features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsLDAP) - if cfg.LDAPAuthEnabled || ssoSettingsLDAP { + if cfg.LDAPAuthEnabled || features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsLDAP) { ldap := clients.ProvideLDAP(cfg, ldapService, userService, authInfoService) proxyClients = append(proxyClients, ldap) passwordClients = append(passwordClients, ldap) diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index fe6fe7d4fab..cfa967694a8 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -651,15 +651,6 @@ var ( FrontendOnly: false, Owner: grafanaOperatorExperienceSquad, }, - { - Name: "ssoSettingsApi", - Description: "Enables the SSO settings API and the OAuth configuration UIs in Grafana", - Stage: FeatureStageGeneralAvailability, - Expression: "true", - AllowSelfServe: true, - FrontendOnly: false, - Owner: identityAccessTeam, - }, { Name: "canvasPanelPanZoom", Description: "Allow pan and zoom in canvas panel", diff --git a/pkg/services/featuremgmt/toggles_gen.csv b/pkg/services/featuremgmt/toggles_gen.csv index 5b44906dfc1..6739f18dd88 100644 --- a/pkg/services/featuremgmt/toggles_gen.csv +++ b/pkg/services/featuremgmt/toggles_gen.csv @@ -86,7 +86,6 @@ dashboardScene,GA,@grafana/dashboards-squad,false,false,true dashboardNewLayouts,experimental,@grafana/dashboards-squad,false,false,true panelFilterVariable,experimental,@grafana/dashboards-squad,false,false,true pdfTables,preview,@grafana/grafana-operator-experience-squad,false,false,false -ssoSettingsApi,GA,@grafana/identity-access-team,false,false,false canvasPanelPanZoom,preview,@grafana/dataviz-squad,false,false,true logsInfiniteScrolling,GA,@grafana/observability-logs,false,false,true logRowsPopoverMenu,GA,@grafana/observability-logs,false,false,true diff --git a/pkg/services/featuremgmt/toggles_gen.go b/pkg/services/featuremgmt/toggles_gen.go index bc513ac82d5..67685845005 100644 --- a/pkg/services/featuremgmt/toggles_gen.go +++ b/pkg/services/featuremgmt/toggles_gen.go @@ -355,10 +355,6 @@ const ( // Enables generating table data as PDF in reporting FlagPdfTables = "pdfTables" - // FlagSsoSettingsApi - // Enables the SSO settings API and the OAuth configuration UIs in Grafana - FlagSsoSettingsApi = "ssoSettingsApi" - // FlagCanvasPanelPanZoom // Allow pan and zoom in canvas panel FlagCanvasPanelPanZoom = "canvasPanelPanZoom" diff --git a/pkg/services/featuremgmt/toggles_gen.json b/pkg/services/featuremgmt/toggles_gen.json index c1cb552b6bb..9b00950e11f 100644 --- a/pkg/services/featuremgmt/toggles_gen.json +++ b/pkg/services/featuremgmt/toggles_gen.json @@ -2839,7 +2839,8 @@ "metadata": { "name": "ssoSettingsApi", "resourceVersion": "1750434297879", - "creationTimestamp": "2023-11-08T09:50:01Z" + "creationTimestamp": "2023-11-08T09:50:01Z", + "deletionTimestamp": "2025-07-02T14:16:57Z" }, "spec": { "description": "Enables the SSO settings API and the OAuth configuration UIs in Grafana", diff --git a/pkg/services/ldap/service/ldap.go b/pkg/services/ldap/service/ldap.go index 0a72f93721b..0a7144f99c1 100644 --- a/pkg/services/ldap/service/ldap.go +++ b/pkg/services/ldap/service/ldap.go @@ -56,7 +56,7 @@ func ProvideService(cfg *setting.Cfg, features featuremgmt.FeatureToggles, ssoSe ssoSettings: ssoSettings, } - if s.features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsApi) && s.features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsLDAP) { + if s.features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsLDAP) { s.ssoSettings.RegisterReloadable(social.LDAPProviderName, s) ldapSettings, err := s.ssoSettings.GetForProvider(context.Background(), social.LDAPProviderName) diff --git a/pkg/services/ldap/service/ldap_test.go b/pkg/services/ldap/service/ldap_test.go index d58efaf49aa..72accd20613 100644 --- a/pkg/services/ldap/service/ldap_test.go +++ b/pkg/services/ldap/service/ldap_test.go @@ -6,7 +6,6 @@ import ( "sync" "testing" - "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/ldap" "github.com/grafana/grafana/pkg/services/ssosettings/models" "github.com/stretchr/testify/require" @@ -309,7 +308,6 @@ func TestReload(t *testing.T) { for _, tt := range testCases { t.Run(tt.description, func(t *testing.T) { ldapImpl := &LDAPImpl{ - features: featuremgmt.WithManager(featuremgmt.FlagSsoSettingsApi), loadingMutex: &sync.Mutex{}, } @@ -544,7 +542,6 @@ func TestValidate(t *testing.T) { for _, tt := range testCases { t.Run(tt.description, func(t *testing.T) { ldapImpl := &LDAPImpl{ - features: featuremgmt.WithManager(featuremgmt.FlagSsoSettingsApi), loadingMutex: &sync.Mutex{}, } diff --git a/pkg/services/navtree/navtreeimpl/admin.go b/pkg/services/navtree/navtreeimpl/admin.go index 7bc0bd5e102..7337a832d71 100644 --- a/pkg/services/navtree/navtreeimpl/admin.go +++ b/pkg/services/navtree/navtreeimpl/admin.go @@ -183,7 +183,7 @@ func (s *ServiceImpl) getAdminNode(c *contextmodel.ReqContext) (*navtree.NavLink configNodes = append(configNodes, usersNode) if authConfigUIAvailable && hasAccess(ssoutils.EvalAuthenticationSettings(s.cfg)) || - (hasAccess(ssoutils.OauthSettingsEvaluator(s.cfg)) && s.features.IsEnabled(ctx, featuremgmt.FlagSsoSettingsApi)) { + hasAccess(ssoutils.OauthSettingsEvaluator(s.cfg)) { configNodes = append(configNodes, &navtree.NavLink{ Text: "Authentication", Id: "authentication", diff --git a/pkg/services/ssosettings/ssosettingsimpl/service.go b/pkg/services/ssosettings/ssosettingsimpl/service.go index 6f27368b095..458c0a21b6a 100644 --- a/pkg/services/ssosettings/ssosettingsimpl/service.go +++ b/pkg/services/ssosettings/ssosettingsimpl/service.go @@ -93,10 +93,8 @@ func ProvideService(cfg *setting.Cfg, sqlStore db.DB, ac ac.AccessControl, usageStats.RegisterMetricsFunc(svc.getUsageStats) - if features.IsEnabledGlobally(featuremgmt.FlagSsoSettingsApi) { - ssoSettingsApi := api.ProvideApi(svc, routeRegister, ac) - ssoSettingsApi.RegisterAPIEndpoints() - } + ssoSettingsApi := api.ProvideApi(svc, routeRegister, ac) + ssoSettingsApi.RegisterAPIEndpoints() return svc } diff --git a/pkg/services/ssosettings/ssosettingstests/service_fake.go b/pkg/services/ssosettings/ssosettingstests/service_fake.go new file mode 100644 index 00000000000..f629d25a296 --- /dev/null +++ b/pkg/services/ssosettings/ssosettingstests/service_fake.go @@ -0,0 +1,119 @@ +package ssosettingstests + +import ( + context "context" + + "github.com/grafana/grafana/pkg/apimachinery/identity" + "github.com/grafana/grafana/pkg/services/ssosettings" + models "github.com/grafana/grafana/pkg/services/ssosettings/models" +) + +var _ ssosettings.Service = (*FakeService)(nil) + +type FakeService struct { + ExpectedSSOSetting *models.SSOSettings + ExpectedSSOSettings []*models.SSOSettings + ExpectedError error + ExpectedReloadablesRegistry map[string]ssosettings.Reloadable + + ActualSSOSettings models.SSOSettings + ActualPatchData map[string]any + ActualProvider string + ActualRequester identity.Requester + + ListFn func(ctx context.Context) ([]*models.SSOSettings, error) + ListWithRedactedSecretsFn func(ctx context.Context) ([]*models.SSOSettings, error) + GetForProviderFn func(ctx context.Context, provider string) (*models.SSOSettings, error) + GetForProviderWithRedactedSecretsFn func(ctx context.Context, provider string) (*models.SSOSettings, error) + UpsertFn func(ctx context.Context, settings *models.SSOSettings, requester identity.Requester) error + DeleteFn func(ctx context.Context, provider string) error + PatchFn func(ctx context.Context, provider string, data map[string]any) error + RegisterReloadableFn func(provider string, reloadable ssosettings.Reloadable) + ReloadFn func(ctx context.Context, provider string) +} + +func NewFakeService() *FakeService { + return &FakeService{ + ExpectedReloadablesRegistry: make(map[string]ssosettings.Reloadable), + } +} + +func (f *FakeService) List(ctx context.Context) ([]*models.SSOSettings, error) { + if f.ListFn != nil { + return f.ListFn(ctx) + } + return f.ExpectedSSOSettings, f.ExpectedError +} + +func (f *FakeService) ListWithRedactedSecrets(ctx context.Context) ([]*models.SSOSettings, error) { + if f.ListWithRedactedSecretsFn != nil { + return f.ListWithRedactedSecretsFn(ctx) + } + return f.ExpectedSSOSettings, f.ExpectedError +} + +func (f *FakeService) GetForProvider(ctx context.Context, provider string) (*models.SSOSettings, error) { + if f.GetForProviderFn != nil { + return f.GetForProviderFn(ctx, provider) + } + f.ActualProvider = provider + return f.ExpectedSSOSetting, f.ExpectedError +} + +func (f *FakeService) GetForProviderWithRedactedSecrets(ctx context.Context, provider string) (*models.SSOSettings, error) { + if f.GetForProviderWithRedactedSecretsFn != nil { + return f.GetForProviderWithRedactedSecretsFn(ctx, provider) + } + f.ActualProvider = provider + return f.ExpectedSSOSetting, f.ExpectedError +} + +func (f *FakeService) Upsert(ctx context.Context, settings *models.SSOSettings, requester identity.Requester) error { + if f.UpsertFn != nil { + return f.UpsertFn(ctx, settings, requester) + } + + f.ActualSSOSettings = *settings + f.ActualRequester = requester + + return f.ExpectedError +} + +func (f *FakeService) Delete(ctx context.Context, provider string) error { + if f.DeleteFn != nil { + return f.DeleteFn(ctx, provider) + } + + f.ActualProvider = provider + + return f.ExpectedError +} + +func (f *FakeService) Patch(ctx context.Context, provider string, data map[string]any) error { + if f.PatchFn != nil { + return f.PatchFn(ctx, provider, data) + } + + f.ActualProvider = provider + f.ActualPatchData = data + + return f.ExpectedError +} + +func (f *FakeService) RegisterReloadable(provider string, reloadable ssosettings.Reloadable) { + if f.RegisterReloadableFn != nil { + f.RegisterReloadableFn(provider, reloadable) + return + } + + f.ExpectedReloadablesRegistry[provider] = reloadable +} + +func (f *FakeService) Reload(ctx context.Context, provider string) { + if f.ReloadFn != nil { + f.ReloadFn(ctx, provider) + return + } + + f.ActualProvider = provider +} diff --git a/public/app/features/auth-config/index.ts b/public/app/features/auth-config/index.ts index cca2b7208af..c927b22e701 100644 --- a/public/app/features/auth-config/index.ts +++ b/public/app/features/auth-config/index.ts @@ -53,7 +53,7 @@ export async function getAuthProviderStatus(providerId: string): Promise> export function loadProviders(provider = ''): ThunkResult> { return async (dispatch) => { - if (!config.featureToggles.ssoSettingsApi) { - return []; - } const result = await getBackendSrv().get(`/api/v1/sso-settings${provider ? `/${provider}` : ''}`); dispatch(providersLoaded(provider ? [result] : result)); return result; diff --git a/public/app/routes/routes.tsx b/public/app/routes/routes.tsx index 252b8703bd4..e1baf824794 100644 --- a/public/app/routes/routes.tsx +++ b/public/app/routes/routes.tsx @@ -301,7 +301,7 @@ export function getAppRoutes(): RouteDescriptor[] { path: '/admin/authentication', roles: () => contextSrv.evaluatePermission([AccessControlAction.SettingsWrite]), component: - config.licenseInfo.enabledFeatures?.saml || config.ldapEnabled || config.featureToggles.ssoSettingsApi + config.licenseInfo.enabledFeatures?.saml || config.ldapEnabled ? SafeDynamicImport( () => import(/* webpackChunkName: "AdminAuthentication" */ '../features/auth-config/AuthProvidersListPage') @@ -319,11 +319,9 @@ export function getAppRoutes(): RouteDescriptor[] { { path: '/admin/authentication/:provider', roles: () => contextSrv.evaluatePermission([AccessControlAction.SettingsWrite]), - component: config.featureToggles.ssoSettingsApi - ? SafeDynamicImport( - () => import(/* webpackChunkName: "AdminAuthentication" */ '../features/auth-config/ProviderConfigPage') - ) - : () => , + component: SafeDynamicImport( + () => import(/* webpackChunkName: "AdminAuthentication" */ '../features/auth-config/ProviderConfigPage') + ), }, { path: '/admin/settings', From f51db112d457f3379f73f378f88c30c4edd6e38c Mon Sep 17 00:00:00 2001 From: Dana Axinte <53751979+dana-axinte@users.noreply.github.com> Date: Thu, 3 Jul 2025 10:41:38 +0100 Subject: [PATCH 04/19] SecretsManager: Add decrypt service (#107473) * SecretsManager: Add decrypt service Co-authored-by: Dana Axinte <53751979+dana-axinte@users.noreply.github.com> * Missed space to sync files --- pkg/registry/apis/secret/decrypt/service.go | 36 +++++++ .../apis/secret/decrypt/service_test.go | 101 ++++++++++++++++++ pkg/registry/apis/secret/service/decrypt.go | 36 +++++++ 3 files changed, 173 insertions(+) create mode 100644 pkg/registry/apis/secret/decrypt/service.go create mode 100644 pkg/registry/apis/secret/decrypt/service_test.go create mode 100644 pkg/registry/apis/secret/service/decrypt.go diff --git a/pkg/registry/apis/secret/decrypt/service.go b/pkg/registry/apis/secret/decrypt/service.go new file mode 100644 index 00000000000..115c073aee2 --- /dev/null +++ b/pkg/registry/apis/secret/decrypt/service.go @@ -0,0 +1,36 @@ +package decrypt + +import ( + "context" + + "github.com/grafana/grafana/pkg/registry/apis/secret/contracts" + "github.com/grafana/grafana/pkg/registry/apis/secret/service" + "github.com/grafana/grafana/pkg/registry/apis/secret/xkube" +) + +type OSSDecryptService struct { + decryptStore contracts.DecryptStorage +} + +var _ service.DecryptService = &OSSDecryptService{} + +func ProvideDecryptService(decryptStore contracts.DecryptStorage) *OSSDecryptService { + return &OSSDecryptService{ + decryptStore: decryptStore, + } +} + +func (d *OSSDecryptService) Decrypt(ctx context.Context, namespace string, names ...string) (map[string]service.DecryptResult, error) { + results := make(map[string]service.DecryptResult, len(names)) + + for _, name := range names { + exposedSecureValue, err := d.decryptStore.Decrypt(ctx, xkube.Namespace(namespace), name) + if err != nil { + results[name] = service.NewDecryptResultErr(err) + } else { + results[name] = service.NewDecryptResultValue(&exposedSecureValue) + } + } + + return results, nil +} diff --git a/pkg/registry/apis/secret/decrypt/service_test.go b/pkg/registry/apis/secret/decrypt/service_test.go new file mode 100644 index 00000000000..665a6730527 --- /dev/null +++ b/pkg/registry/apis/secret/decrypt/service_test.go @@ -0,0 +1,101 @@ +package decrypt + +import ( + "context" + "errors" + "testing" + + secretv0alpha1 "github.com/grafana/grafana/pkg/apis/secret/v0alpha1" + "github.com/grafana/grafana/pkg/registry/apis/secret/service" + "github.com/grafana/grafana/pkg/registry/apis/secret/xkube" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestDecryptService(t *testing.T) { + t.Parallel() + + ctx := context.Background() + + t.Run("when there are only errors from the storage, the service returns them in the map", func(t *testing.T) { + t.Parallel() + + mockErr := errors.New("mock error") + mockStorage := &MockDecryptStorage{} + mockStorage.On("Decrypt", mock.Anything, mock.Anything, mock.Anything).Return(secretv0alpha1.ExposedSecureValue(""), mockErr) + decryptedValuesResp := map[string]service.DecryptResult{ + "secure-value-1": service.NewDecryptResultErr(mockErr), + } + + decryptService := &OSSDecryptService{ + decryptStore: mockStorage, + } + + resp, err := decryptService.Decrypt(ctx, "default", "secure-value-1") + require.NotNil(t, resp) + require.NoError(t, err) + require.EqualValues(t, decryptedValuesResp, resp) + }) + + t.Run("when there is no error from the storage, it returns a map of the decrypted values", func(t *testing.T) { + t.Parallel() + + mockStorage := &MockDecryptStorage{} + // Set up the mock to return a different value for each name in the test + exposedSecureValue1 := secretv0alpha1.NewExposedSecureValue("value1") + exposedSecureValue2 := secretv0alpha1.NewExposedSecureValue("value2") + mockStorage.On("Decrypt", mock.Anything, xkube.Namespace("default"), "secure-value-1"). + Return(exposedSecureValue1, nil) + mockStorage.On("Decrypt", mock.Anything, xkube.Namespace("default"), "secure-value-2"). + Return(exposedSecureValue2, nil) + + decryptedValuesResp := map[string]service.DecryptResult{ + "secure-value-1": service.NewDecryptResultValue(&exposedSecureValue1), + "secure-value-2": service.NewDecryptResultValue(&exposedSecureValue2), + } + + decryptService := &OSSDecryptService{ + decryptStore: mockStorage, + } + + resp, err := decryptService.Decrypt(ctx, "default", "secure-value-1", "secure-value-2") + require.NotNil(t, resp) + require.NoError(t, err) + require.EqualValues(t, decryptedValuesResp, resp) + }) + + t.Run("when there is an error from the storage, the service returns a map of errors and decrypted values", func(t *testing.T) { + t.Parallel() + + mockErr := errors.New("mock error") + mockStorage := &MockDecryptStorage{} + exposedSecureValue := secretv0alpha1.NewExposedSecureValue("value") + mockStorage.On("Decrypt", mock.Anything, xkube.Namespace("default"), "secure-value-1"). + Return(exposedSecureValue, nil) + mockStorage.On("Decrypt", mock.Anything, xkube.Namespace("default"), "secure-value-2"). + Return(secretv0alpha1.ExposedSecureValue(""), mockErr) + + decryptedValuesResp := map[string]service.DecryptResult{ + "secure-value-1": service.NewDecryptResultValue(&exposedSecureValue), + "secure-value-2": service.NewDecryptResultErr(mockErr), + } + + decryptService := &OSSDecryptService{ + decryptStore: mockStorage, + } + + resp, err := decryptService.Decrypt(ctx, "default", "secure-value-1", "secure-value-2") + require.NotNil(t, resp) + require.NoError(t, err) + require.EqualValues(t, decryptedValuesResp, resp) + }) +} + +type MockDecryptStorage struct { + mock.Mock +} + +func (m *MockDecryptStorage) Decrypt(ctx context.Context, namespace xkube.Namespace, name string) (secretv0alpha1.ExposedSecureValue, error) { + args := m.Called(ctx, namespace, name) + return args.Get(0).(secretv0alpha1.ExposedSecureValue), args.Error(1) +} diff --git a/pkg/registry/apis/secret/service/decrypt.go b/pkg/registry/apis/secret/service/decrypt.go new file mode 100644 index 00000000000..d9b19ed2e76 --- /dev/null +++ b/pkg/registry/apis/secret/service/decrypt.go @@ -0,0 +1,36 @@ +package service + +import ( + "context" + + secretv0alpha1 "github.com/grafana/grafana/pkg/apis/secret/v0alpha1" +) + +// DecryptResult is the (union) result of a decryption operation. +// It contains the decrypted `value` when the decryption succeeds, and the `err` when it fails. +// It is not possible to construct a `DecryptResult` where both `value` and `err` are set from another package. +type DecryptResult struct { + value *secretv0alpha1.ExposedSecureValue + err error +} + +func (d DecryptResult) Error() error { + return d.err +} + +func (d DecryptResult) Value() *secretv0alpha1.ExposedSecureValue { + return d.value +} + +func NewDecryptResultErr(err error) DecryptResult { + return DecryptResult{err: err} +} + +func NewDecryptResultValue(value *secretv0alpha1.ExposedSecureValue) DecryptResult { + return DecryptResult{value: value} +} + +// DecryptService is the inferface for the decrypt service. +type DecryptService interface { + Decrypt(ctx context.Context, namespace string, names ...string) (map[string]DecryptResult, error) +} From 9652f07e560a1d996dc4b7fde9aa96d21fbaa5ef Mon Sep 17 00:00:00 2001 From: Josh Hunt Date: Thu, 3 Jul 2025 10:51:11 +0100 Subject: [PATCH 05/19] Storybook: Serve msw worker from relative path (#107561) --- packages/grafana-ui/.storybook/preview.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/grafana-ui/.storybook/preview.ts b/packages/grafana-ui/.storybook/preview.ts index bff4cd763b7..41311f34244 100644 --- a/packages/grafana-ui/.storybook/preview.ts +++ b/packages/grafana-ui/.storybook/preview.ts @@ -51,6 +51,9 @@ if (process.env.NODE_ENV === 'development') { */ initialize({ onUnhandledRequest: 'bypass', + serviceWorker: { + url: 'mockServiceWorker.js', + }, }); const preview: Preview = { From 041c343a86dedf8e0bcf0cde6867babcc14cef88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= Date: Thu, 3 Jul 2025 11:57:40 +0200 Subject: [PATCH 06/19] Unified storage: Respect GF_DATABASE_URL override (#105331) * Database for unified storage resources now reuses DB code that respects URL override. Access instrument_queries via section getter. --- .../unified/sql/db/dbimpl/db_engine.go | 27 ++----- .../unified/sql/db/dbimpl/db_engine_test.go | 73 +++++++++++++++++-- pkg/storage/unified/sql/db/dbimpl/dbimpl.go | 28 ++++--- 3 files changed, 91 insertions(+), 37 deletions(-) diff --git a/pkg/storage/unified/sql/db/dbimpl/db_engine.go b/pkg/storage/unified/sql/db/dbimpl/db_engine.go index ccc994ec715..9712de24f02 100644 --- a/pkg/storage/unified/sql/db/dbimpl/db_engine.go +++ b/pkg/storage/unified/sql/db/dbimpl/db_engine.go @@ -12,7 +12,6 @@ import ( "github.com/grafana/grafana/pkg/util/xorm" "github.com/grafana/grafana/pkg/services/sqlstore" - "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/storage/unified/sql/db" ) @@ -20,33 +19,21 @@ import ( // driver. const tlsConfigName = "db_engine_tls" -func getEngine(cfg *setting.Cfg) (*xorm.Engine, error) { - dbSection := cfg.SectionWithEnvOverrides("database") - dbType := dbSection.Key("type").String() - if dbType == "" { - return nil, fmt.Errorf("no database type specified") - } - - switch dbType { +func getEngine(config *sqlstore.DatabaseConfig) (*xorm.Engine, error) { + switch config.Type { case dbTypeMySQL, dbTypePostgres, dbTypeSQLite: - config, err := sqlstore.NewDatabaseConfig(cfg, nil) - if err != nil { - return nil, nil - } - - engine, err := xorm.NewEngine(dbType, config.ConnectionString) + engine, err := xorm.NewEngine(config.Type, config.ConnectionString) if err != nil { return nil, fmt.Errorf("open database: %w", err) } - engine.SetMaxOpenConns(dbSection.Key("max_open_conn").MustInt(0)) - engine.SetMaxIdleConns(dbSection.Key("max_idle_conn").MustInt(4)) - maxLifetime := time.Duration(dbSection.Key("conn_max_lifetime").MustInt(14400)) * time.Second - engine.SetConnMaxLifetime(maxLifetime) + engine.SetMaxOpenConns(config.MaxOpenConn) + engine.SetMaxIdleConns(config.MaxIdleConn) + engine.SetConnMaxLifetime(time.Duration(config.ConnMaxLifetime) * time.Second) return engine, nil default: - return nil, fmt.Errorf("unsupported database type: %s", dbType) + return nil, fmt.Errorf("unsupported database type: %s", config.Type) } } diff --git a/pkg/storage/unified/sql/db/dbimpl/db_engine_test.go b/pkg/storage/unified/sql/db/dbimpl/db_engine_test.go index d85260b161a..fbaa147070a 100644 --- a/pkg/storage/unified/sql/db/dbimpl/db_engine_test.go +++ b/pkg/storage/unified/sql/db/dbimpl/db_engine_test.go @@ -9,11 +9,14 @@ import ( "math/big" "os" "path/filepath" + "strings" "testing" "time" - "github.com/grafana/grafana/pkg/setting" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/grafana/grafana/pkg/setting" ) func newValidMySQLGetter(withKeyPrefix bool) confGetter { @@ -30,7 +33,7 @@ func newValidMySQLGetter(withKeyPrefix bool) confGetter { }, prefix) } -func TestGetEngine(t *testing.T) { +func TestNewResourceDbProvider(t *testing.T) { t.Parallel() t.Run("MySQL engine", func(t *testing.T) { @@ -43,9 +46,10 @@ func TestGetEngine(t *testing.T) { dbSection.Key("user").SetValue("user") dbSection.Key("password").SetValue("password") - engine, err := getEngine(cfg) + engine, err := newResourceDBProvider(nil, cfg, nil) require.NoError(t, err) require.NotNil(t, engine) + require.Equal(t, dbTypeMySQL, engine.engine.Dialect().DriverName()) }) t.Run("Postgres engine", func(t *testing.T) { @@ -58,9 +62,10 @@ func TestGetEngine(t *testing.T) { dbSection.Key("user").SetValue("user") dbSection.Key("password").SetValue("password") - engine, err := getEngine(cfg) + engine, err := newResourceDBProvider(nil, cfg, nil) require.NoError(t, err) require.NotNil(t, engine) + require.Equal(t, dbTypePostgres, engine.engine.Dialect().DriverName()) }) t.Run("SQLite engine", func(t *testing.T) { @@ -70,9 +75,20 @@ func TestGetEngine(t *testing.T) { dbSection.Key("type").SetValue(dbTypeSQLite) dbSection.Key("path").SetValue(":memory:") - engine, err := getEngine(cfg) + engine, err := newResourceDBProvider(nil, cfg, nil) require.NoError(t, err) require.NotNil(t, engine) + require.Equal(t, dbTypeSQLite, engine.engine.Dialect().DriverName()) + }) + + t.Run("No database type", func(t *testing.T) { + t.Parallel() + cfg := setting.NewCfg() + + engine, err := newResourceDBProvider(nil, cfg, nil) + require.Error(t, err) + require.Nil(t, engine) + require.Contains(t, err.Error(), "unknown") }) t.Run("Unknown database type", func(t *testing.T) { @@ -81,13 +97,56 @@ func TestGetEngine(t *testing.T) { dbSection := cfg.SectionWithEnvOverrides("database") dbSection.Key("type").SetValue("unknown") - engine, err := getEngine(cfg) + engine, err := newResourceDBProvider(nil, cfg, nil) require.Error(t, err) require.Nil(t, engine) - require.Contains(t, err.Error(), "unsupported database type") + require.Contains(t, err.Error(), "unknown") }) } +func TestDatabaseConfigOverridenByEnvVariable(t *testing.T) { + prevEnv := os.Environ() + t.Cleanup(func() { + // Revert env variables to state before this test. + os.Clearenv() + for _, e := range prevEnv { + sp := strings.SplitN(e, "=", 2) + if len(sp) == 2 { + assert.NoError(t, os.Setenv(sp[0], sp[1])) + } + } + }) + + tmpDir := t.TempDir() + + require.NoError(t, os.MkdirAll(filepath.Join(tmpDir, "conf"), 0750)) + // We need to include database.url in defaults, otherwise it won't be overridden by environment variable! + require.NoError(t, os.WriteFile(filepath.Join(tmpDir, "conf/defaults.ini"), []byte("[log.console]\nlevel =\n[database]\nurl = \n"), 0644)) + + dbConfig := ` +[database] +type = postgres +host = localhost +name = grafana +user = user +password = password +` + require.NoError(t, os.WriteFile(filepath.Join(tmpDir, "conf/custom.ini"), []byte(dbConfig), 0644)) + + // Override database URL + require.NoError(t, os.Setenv("GF_DATABASE_URL", "mysql://gf:pwd@overthere:3306/grafana")) + + cfg := setting.NewCfg() + require.NoError(t, cfg.Load(setting.CommandLineArgs{HomePath: tmpDir})) + + engine, err := newResourceDBProvider(nil, cfg, nil) + require.NoError(t, err) + require.NotNil(t, engine) + // Verify that GF_DATABASE_URL value is used. + require.Equal(t, dbTypeMySQL, engine.engine.Dialect().DriverName()) + require.Contains(t, engine.engine.DataSourceName(), "overthere:3306") +} + func TestGetEngineMySQLFromConfig(t *testing.T) { t.Parallel() diff --git a/pkg/storage/unified/sql/db/dbimpl/dbimpl.go b/pkg/storage/unified/sql/db/dbimpl/dbimpl.go index 4db1ca56a85..0109d994afd 100644 --- a/pkg/storage/unified/sql/db/dbimpl/dbimpl.go +++ b/pkg/storage/unified/sql/db/dbimpl/dbimpl.go @@ -11,13 +11,15 @@ import ( "go.opentelemetry.io/otel/trace" "go.opentelemetry.io/otel/trace/noop" + "github.com/grafana/grafana/pkg/services/sqlstore" + "github.com/grafana/grafana/pkg/util/xorm" + infraDB "github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/storage/unified/sql/db" "github.com/grafana/grafana/pkg/storage/unified/sql/db/migrations" "github.com/grafana/grafana/pkg/storage/unified/sql/db/otel" - "github.com/grafana/grafana/pkg/util/xorm" ) const ( @@ -31,8 +33,8 @@ const grafanaDBInstrumentQueriesKey = "instrument_queries" var errGrafanaDBInstrumentedNotSupported = errors.New("the Resource API is " + "attempting to leverage the database from core Grafana defined in the" + " [database] INI section since a database configuration was not provided" + - " in the [resource_api] section. But we detected that the key `" + - grafanaDBInstrumentQueriesKey + "` is enabled in [database], and that" + + " in the [resource_api] section. But we detected that the key" + + " `instrument_queries` is enabled in [database], and that" + " setup is currently unsupported. Please, consider disabling that flag") func ProvideResourceDB(grafanaDB infraDB.DB, cfg *setting.Cfg, tracer trace.Tracer) (db.DBProvider, error) { @@ -66,7 +68,11 @@ func newResourceDBProvider(grafanaDB infraDB.DB, cfg *setting.Cfg, tracer trace. // as fallback, and as it uses a dedicated INI section, then keys are not // prefixed with "db_" getter := newConfGetter(cfg.SectionWithEnvOverrides("resource_api"), "db_") - fallbackGetter := newConfGetter(cfg.SectionWithEnvOverrides("database"), "") + fallbackConfig, fallbackErr := sqlstore.NewDatabaseConfig(cfg, nil) + if fallbackErr != nil { + // Ignore error here and keep going. + fallbackConfig = nil + } logger := log.New("entity-db") p = &resourceDBProvider{ @@ -78,7 +84,6 @@ func newResourceDBProvider(grafanaDB infraDB.DB, cfg *setting.Cfg, tracer trace. } dbType := getter.String("type") - grafanaDBType := fallbackGetter.String("type") switch { // Deprecated: First try with the config in the "resource_api" section, which is specific to Unified Storage case dbType == dbTypePostgres: @@ -97,20 +102,23 @@ func newResourceDBProvider(grafanaDB infraDB.DB, cfg *setting.Cfg, tracer trace. return p, fmt.Errorf("invalid db type specified: %s", dbType) // If we have an empty Resource API db config, try with the core Grafana database config - case grafanaDBType != "": - logger.Info("Using database section", "db_type", grafanaDBType) + case fallbackConfig != nil && fallbackConfig.Type != "": + logger.Info("Using database section", "db_type", fallbackConfig.Type) p.registerMetrics = true - p.engine, err = getEngine(cfg) + p.engine, err = getEngine(fallbackConfig) return p, err case grafanaDB != nil: // try to use the grafana db connection (should only happen in tests) - if fallbackGetter.Bool(grafanaDBInstrumentQueriesKey) { + if newConfGetter(cfg.SectionWithEnvOverrides("database"), "").Bool(grafanaDBInstrumentQueriesKey) { return nil, errGrafanaDBInstrumentedNotSupported } p.engine = grafanaDB.GetEngine() return p, nil default: - return p, fmt.Errorf("no database type specified") + if fallbackErr != nil { + return nil, fallbackErr + } + return nil, fmt.Errorf("no database type specified") } } From b7153d4d20a57816ac988a13a89920333d32bdf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mustafa=20Sencer=20=C3=96zcan?= <32759850+mustafasencer@users.noreply.github.com> Date: Thu, 3 Jul 2025 12:02:05 +0200 Subject: [PATCH 07/19] fix: grpc resource delete error when qos enabled (#107560) --- pkg/storage/unified/resource/server.go | 24 +++++----- pkg/storage/unified/sql/server.go | 4 +- pkg/util/scheduler/queue.go | 22 ++++----- pkg/util/scheduler/queue_test.go | 52 +++++++++++----------- pkg/util/scheduler/scheduler.go | 4 +- pkg/util/scheduler/scheduler_bench_test.go | 6 +-- pkg/util/scheduler/scheduler_test.go | 6 +-- 7 files changed, 57 insertions(+), 61 deletions(-) diff --git a/pkg/storage/unified/resource/server.go b/pkg/storage/unified/resource/server.go index 6e74bec40cd..35dc9de717b 100644 --- a/pkg/storage/unified/resource/server.go +++ b/pkg/storage/unified/resource/server.go @@ -146,7 +146,7 @@ type BlobSupport interface { } type QOSEnqueuer interface { - Enqueue(ctx context.Context, tenantID string, runnable func(ctx context.Context)) error + Enqueue(ctx context.Context, tenantID string, runnable func()) error } type BlobConfig struct { @@ -602,7 +602,7 @@ func (s *server) Create(ctx context.Context, req *resourcepb.CreateRequest) (*re res *resourcepb.CreateResponse err error ) - runErr := s.runInQueue(ctx, req.Key.Namespace, func(ctx context.Context) { + runErr := s.runInQueue(ctx, req.Key.Namespace, func() { res, err = s.create(ctx, user, req) }) if runErr != nil { @@ -656,7 +656,7 @@ func (s *server) Update(ctx context.Context, req *resourcepb.UpdateRequest) (*re res *resourcepb.UpdateResponse err error ) - runErr := s.runInQueue(ctx, req.Key.Namespace, func(ctx context.Context) { + runErr := s.runInQueue(ctx, req.Key.Namespace, func() { res, err = s.update(ctx, user, req) }) if runErr != nil { @@ -724,7 +724,7 @@ func (s *server) Delete(ctx context.Context, req *resourcepb.DeleteRequest) (*re err error ) - runErr := s.runInQueue(ctx, req.Key.Namespace, func(ctx context.Context) { + runErr := s.runInQueue(ctx, req.Key.Namespace, func() { res, err = s.delete(ctx, user, req) }) if runErr != nil { @@ -776,10 +776,6 @@ func (s *server) delete(ctx context.Context, user claims.AuthInfo, req *resource PreviousRV: latest.ResourceVersion, GUID: uuid.New().String(), } - requester, ok := claims.AuthInfoFrom(ctx) - if !ok { - return nil, apierrors.NewBadRequest("unable to get user") - } marker := &unstructured.Unstructured{} err = json.Unmarshal(latest.Value, marker) if err != nil { @@ -794,7 +790,7 @@ func (s *server) delete(ctx context.Context, user claims.AuthInfo, req *resource obj.SetUpdatedTimestamp(&now.Time) obj.SetManagedFields(nil) obj.SetFinalizers(nil) - obj.SetUpdatedBy(requester.GetUID()) + obj.SetUpdatedBy(user.GetUID()) obj.SetGeneration(utils.DeletedGeneration) obj.SetAnnotation(utils.AnnoKeyKubectlLastAppliedConfig, "") // clears it event.Value, err = marker.MarshalJSON() @@ -832,7 +828,7 @@ func (s *server) Read(ctx context.Context, req *resourcepb.ReadRequest) (*resour res *resourcepb.ReadResponse err error ) - runErr := s.runInQueue(ctx, req.Key.Namespace, func(ctx context.Context) { + runErr := s.runInQueue(ctx, req.Key.Namespace, func() { res, err = s.read(ctx, user, req) }) if runErr != nil { @@ -1339,7 +1335,7 @@ func (s *server) GetBlob(ctx context.Context, req *resourcepb.GetBlobRequest) (* return rsp, nil } -func (s *server) runInQueue(ctx context.Context, tenantID string, runnable func(ctx context.Context)) error { +func (s *server) runInQueue(ctx context.Context, tenantID string, runnable func()) error { boff := backoff.New(ctx, backoff.Config{ MinBackoff: DefaultMinBackoff, MaxBackoff: DefaultMaxBackoff, @@ -1351,9 +1347,9 @@ func (s *server) runInQueue(ctx context.Context, tenantID string, runnable func( err error ) wg.Add(1) - wrapped := func(ctx context.Context) { - runnable(ctx) - wg.Done() + wrapped := func() { + defer wg.Done() + runnable() } for boff.Ongoing() { err = s.queue.Enqueue(ctx, tenantID, wrapped) diff --git a/pkg/storage/unified/sql/server.go b/pkg/storage/unified/sql/server.go index 93f55900fd6..97163958972 100644 --- a/pkg/storage/unified/sql/server.go +++ b/pkg/storage/unified/sql/server.go @@ -21,8 +21,8 @@ import ( type QOSEnqueueDequeuer interface { services.Service - Enqueue(ctx context.Context, tenantID string, runnable func(ctx context.Context)) error - Dequeue(ctx context.Context) (func(ctx context.Context), error) + Enqueue(ctx context.Context, tenantID string, runnable func()) error + Dequeue(ctx context.Context) (func(), error) } // ServerOptions contains the options for creating a new ResourceServer diff --git a/pkg/util/scheduler/queue.go b/pkg/util/scheduler/queue.go index b065d92804f..f2c1458987f 100644 --- a/pkg/util/scheduler/queue.go +++ b/pkg/util/scheduler/queue.go @@ -25,7 +25,7 @@ var ErrMissingTenantID = errors.New("item requires TenantID") type tenantQueue struct { id string - items []func(ctx context.Context) + items []func() isActive bool } @@ -42,13 +42,13 @@ func (tq *tenantQueue) isEmpty() bool { func (tq *tenantQueue) isFull(maxSize int) bool { return maxSize > 0 && len(tq.items) >= maxSize } -func (tq *tenantQueue) addItem(runnable func(ctx context.Context)) { +func (tq *tenantQueue) addItem(runnable func()) { tq.items = append(tq.items, runnable) } type enqueueRequest struct { tenantID string - runnable func(ctx context.Context) + runnable func() respChan chan error } @@ -57,7 +57,7 @@ type dequeueRequest struct { } type dequeueResponse struct { - runnable func(ctx context.Context) + runnable func() err error } @@ -71,8 +71,8 @@ type activeTenantsLenRequest struct { type NoopQueue struct{} -func (*NoopQueue) Enqueue(ctx context.Context, _ string, runnable func(ctx context.Context)) error { - runnable(ctx) +func (*NoopQueue) Enqueue(ctx context.Context, _ string, runnable func()) error { + runnable() return nil } @@ -143,11 +143,11 @@ func NewQueue(opts *QueueOptions) *Queue { q.queueLength = promauto.With(opts.Registerer).NewGaugeVec(prometheus.GaugeOpts{ Name: "queue_length", Help: "Number of items in the queue", - }, []string{"namespace"}) + }, []string{"tenant"}) q.discardedRequests = promauto.With(opts.Registerer).NewCounterVec(prometheus.CounterOpts{ Name: "discarded_requests_total", Help: "Total number of discarded requests", - }, []string{"namespace", "reason"}) + }, []string{"tenant", "reason"}) q.enqueueDuration = promauto.With(opts.Registerer).NewHistogram(prometheus.HistogramOpts{ Name: "enqueue_duration_seconds", Help: "Duration of enqueue operation in seconds", @@ -200,7 +200,7 @@ func (q *Queue) handleEnqueueRequest(req enqueueRequest) { if !exists { tq = &tenantQueue{ id: req.tenantID, - items: make([]func(ctx context.Context), 0, 8), + items: make([]func(), 0, 8), } q.tenantQueues[req.tenantID] = tq } @@ -263,7 +263,7 @@ func (q *Queue) dispatcherLoop(ctx context.Context) error { // Enqueue adds a work item to the appropriate tenant's qos. // It blocks only if the dispatcher is busy or the tenant queue is full. -func (q *Queue) Enqueue(ctx context.Context, tenantID string, runnable func(ctx context.Context)) error { +func (q *Queue) Enqueue(ctx context.Context, tenantID string, runnable func()) error { if runnable == nil { return ErrNilRunnable } @@ -303,7 +303,7 @@ func (q *Queue) Enqueue(ctx context.Context, tenantID string, runnable func(ctx // Dequeue removes and returns a work item from the qos using linked-list round-robin. // It blocks until an item is available for any tenant, the queue is closed, // or the context is cancelled. -func (q *Queue) Dequeue(ctx context.Context) (func(ctx context.Context), error) { +func (q *Queue) Dequeue(ctx context.Context) (func(), error) { if q.State() != services.Running { return nil, ErrQueueClosed } diff --git a/pkg/util/scheduler/queue_test.go b/pkg/util/scheduler/queue_test.go index 1f56603bf3c..baf70a9b835 100644 --- a/pkg/util/scheduler/queue_test.go +++ b/pkg/util/scheduler/queue_test.go @@ -54,7 +54,7 @@ func TestQueue(t *testing.T) { // Enqueue items for i := 0; i < numItems; i++ { - err := q.Enqueue(ctx, tenantID, func(ctx context.Context) { + err := q.Enqueue(ctx, tenantID, func() { processed.Add(1) }) require.NoError(t, err, "Enqueue should succeed") @@ -72,7 +72,7 @@ func TestQueue(t *testing.T) { runnable, err := q.Dequeue(dequeueCtx) require.NoError(t, err, "Dequeue should succeed") require.NotNil(t, runnable, "Dequeued runnable should not be nil") - runnable(ctx) + runnable() }() } @@ -86,7 +86,7 @@ func TestQueue(t *testing.T) { require.NoError(t, services.StartAndAwaitRunning(ctx, qSimple)) for i := 0; i < numItems; i++ { - err := qSimple.Enqueue(ctx, tenantID, func(ctx context.Context) {}) + err := qSimple.Enqueue(ctx, tenantID, func() {}) require.NoError(t, err) } require.Equal(t, numItems, qSimple.Len(), "Queue length after enqueue (simple)") @@ -131,8 +131,8 @@ func TestQueue(t *testing.T) { var results []string var resultsMu sync.Mutex - makeRunnable := func(id string) func(ctx context.Context) { - return func(ctx context.Context) { + makeRunnable := func(id string) func() { + return func() { resultsMu.Lock() results = append(results, id) resultsMu.Unlock() @@ -163,7 +163,7 @@ func TestQueue(t *testing.T) { cancel() require.NoError(t, err, "Dequeue %d should succeed", i) require.NotNil(t, runnable, "Dequeued runnable %d should not be nil", i) - runnable(ctx) // Execute to record the tenant ID + runnable() // Execute to record the tenant ID } // Check execution order - should alternate between tenants @@ -187,16 +187,16 @@ func TestQueue(t *testing.T) { tenantID := "tenant-limited" // Enqueue up to the limit - err := q.Enqueue(ctx, tenantID, func(ctx context.Context) {}) + err := q.Enqueue(ctx, tenantID, func() {}) require.NoError(t, err) - err = q.Enqueue(ctx, tenantID, func(ctx context.Context) {}) + err = q.Enqueue(ctx, tenantID, func() {}) require.NoError(t, err) require.Equal(t, 2, q.Len()) require.Equal(t, 1, q.ActiveTenantsLen()) // Enqueue one more, expect error - err = q.Enqueue(ctx, tenantID, func(ctx context.Context) {}) + err = q.Enqueue(ctx, tenantID, func() {}) require.ErrorIs(t, err, ErrTenantQueueFull, "Expected ErrTenantQueueFull") // Len should still be 2 @@ -210,7 +210,7 @@ func TestQueue(t *testing.T) { require.Equal(t, 1, q.Len()) // Now enqueue should succeed again - err = q.Enqueue(ctx, tenantID, func(ctx context.Context) {}) + err = q.Enqueue(ctx, tenantID, func() {}) require.NoError(t, err, "Enqueue should succeed after dequeueing one item") require.Equal(t, 2, q.Len(), "Length should be back to 2") }) @@ -264,7 +264,7 @@ func TestQueue(t *testing.T) { require.NoError(t, services.StopAndAwaitTerminated(context.Background(), q)) // Now try to enqueue - should return ErrQueueClosed - err := q.Enqueue(context.Background(), "tenant-id", func(ctx context.Context) {}) + err := q.Enqueue(context.Background(), "tenant-id", func() {}) require.ErrorIs(t, err, ErrQueueClosed, "Enqueue after Stop should return ErrQueueClosed") }) @@ -272,7 +272,7 @@ func TestQueue(t *testing.T) { t.Parallel() ctx := context.Background() q := NewQueue(QueueOptionsWithDefaults(nil)) - err := q.Enqueue(ctx, "tenant-id", func(ctx context.Context) {}) + err := q.Enqueue(ctx, "tenant-id", func() {}) require.ErrorIs(t, err, ErrQueueClosed, "Enqueue before Start should return ErrQueueClosed") }) @@ -337,7 +337,7 @@ func TestQueue(t *testing.T) { } // Execute the runnable which will update our tracking - runnable(ctx) + runnable() // Check if we've processed all expected items mu.Lock() @@ -365,7 +365,7 @@ func TestQueue(t *testing.T) { for j := 0; j < itemsPerProducer; j++ { itemID := fmt.Sprintf("p%d-item%d", producerID, j) - err := q.Enqueue(ctx, tenantID, func(ctx context.Context) { + err := q.Enqueue(ctx, tenantID, func() { mu.Lock() processedItems[itemID] = 1 mu.Unlock() @@ -420,7 +420,7 @@ func TestQueue(t *testing.T) { // Enqueue a slow item for tenant A wg.Add(1) - err := q.Enqueue(ctx, tenantA, func(ctx context.Context) { + err := q.Enqueue(ctx, tenantA, func() { defer wg.Done() time.Sleep(300 * time.Millisecond) // Simulate slow processing completionOrder <- "A-slow" @@ -430,14 +430,14 @@ func TestQueue(t *testing.T) { // Enqueue regular items for other tenants for i := 0; i < 2; i++ { wg.Add(1) - err := q.Enqueue(ctx, tenantB, func(ctx context.Context) { + err := q.Enqueue(ctx, tenantB, func() { defer wg.Done() completionOrder <- fmt.Sprintf("B-%d", i) }) require.NoError(t, err) wg.Add(1) - err = q.Enqueue(ctx, tenantC, func(ctx context.Context) { + err = q.Enqueue(ctx, tenantC, func() { defer wg.Done() completionOrder <- fmt.Sprintf("C-%d", i) }) @@ -446,7 +446,7 @@ func TestQueue(t *testing.T) { // Enqueue another item for tenant A wg.Add(1) - err = q.Enqueue(ctx, tenantA, func(ctx context.Context) { + err = q.Enqueue(ctx, tenantA, func() { defer wg.Done() completionOrder <- "A-fast" }) @@ -462,7 +462,7 @@ func TestQueue(t *testing.T) { if err != nil { return } - runnable(ctx) + runnable() } }() } @@ -523,9 +523,9 @@ func TestQueue(t *testing.T) { require.NoError(t, q.AwaitRunning(context.Background()), "Queue should be running") // Enqueue items for different tenants - err := q.Enqueue(context.Background(), "tenant1", func(ctx context.Context) {}) + err := q.Enqueue(context.Background(), "tenant1", func() {}) require.NoError(t, err) - err = q.Enqueue(context.Background(), "tenant2", func(ctx context.Context) {}) + err = q.Enqueue(context.Background(), "tenant2", func() {}) require.NoError(t, err) // Check active tenants @@ -544,9 +544,9 @@ func TestQueue(t *testing.T) { require.NoError(t, q.AwaitRunning(context.Background()), "Queue should be running") // Enqueue items - err := q.Enqueue(context.Background(), "tenant1", func(ctx context.Context) {}) + err := q.Enqueue(context.Background(), "tenant1", func() {}) require.NoError(t, err) - err = q.Enqueue(context.Background(), "tenant1", func(ctx context.Context) {}) + err = q.Enqueue(context.Background(), "tenant1", func() {}) require.NoError(t, err) // Check queue length @@ -567,7 +567,7 @@ func TestQueue(t *testing.T) { processed := make(chan struct{}) // Enqueue an item that signals when processed - err := q.Enqueue(context.Background(), "tenant1", func(ctx context.Context) { + err := q.Enqueue(context.Background(), "tenant1", func() { close(processed) }) require.NoError(t, err) @@ -582,7 +582,7 @@ func TestQueue(t *testing.T) { runnable, err := q.Dequeue(ctx) require.NoError(t, err) require.NotNil(t, runnable) - runnable(ctx) + runnable() }() // Wait for the item to be processed @@ -599,7 +599,7 @@ func TestQueue(t *testing.T) { wg.Wait() // Check that the queue is closed - err = q.Enqueue(context.Background(), "tenant1", func(ctx context.Context) {}) + err = q.Enqueue(context.Background(), "tenant1", func() {}) require.ErrorIs(t, err, ErrQueueClosed) }) } diff --git a/pkg/util/scheduler/scheduler.go b/pkg/util/scheduler/scheduler.go index 6f781c2536e..f530f9522d0 100644 --- a/pkg/util/scheduler/scheduler.go +++ b/pkg/util/scheduler/scheduler.go @@ -26,7 +26,7 @@ const ( type WorkQueue interface { services.Service - Dequeue(ctx context.Context) (runnable func(ctx context.Context), err error) + Dequeue(ctx context.Context) (runnable func(), err error) } // Worker processes items from the QoS request queue @@ -62,7 +62,7 @@ func (w *Worker) dequeueWithRetries(ctx context.Context) error { for boff.Ongoing() { runnable, err := w.queue.Dequeue(ctx) if err == nil { - runnable(ctx) + runnable() break } diff --git a/pkg/util/scheduler/scheduler_bench_test.go b/pkg/util/scheduler/scheduler_bench_test.go index 64d79a2bd5d..5ac13880615 100644 --- a/pkg/util/scheduler/scheduler_bench_test.go +++ b/pkg/util/scheduler/scheduler_bench_test.go @@ -46,7 +46,7 @@ func benchScheduler(b *testing.B, numWorkers, numTenants, itemsPerTenant int) { for i := 0; i < numTenants; i++ { tenantID := tenantIDs[i] for j := 0; j < itemsPerTenant; j++ { - require.NoError(b, q.Enqueue(context.Background(), tenantID, func(_ context.Context) { + require.NoError(b, q.Enqueue(context.Background(), tenantID, func() { processed.Add(1) wg.Done() })) @@ -166,7 +166,7 @@ func BenchmarkSchedulerFairness(b *testing.B) { tenantID := tenantIDs[i] tenantIdx := i for j := 0; j < itemsPerTenant; j++ { - require.NoError(b, q.Enqueue(context.Background(), tenantID, func(_ context.Context) { + require.NoError(b, q.Enqueue(context.Background(), tenantID, func() { processedPerTenant[tenantIdx].Add(1) wg.Done() })) @@ -248,7 +248,7 @@ func BenchmarkSchedulerFairnessAlternating(b *testing.B) { for i := 0; i < numTenants; i++ { tenantID := tenantIDs[i] tenantIdx := i - require.NoError(b, q.Enqueue(context.Background(), tenantID, func(_ context.Context) { + require.NoError(b, q.Enqueue(context.Background(), tenantID, func() { processedPerTenant[tenantIdx].Add(1) wg.Done() })) diff --git a/pkg/util/scheduler/scheduler_test.go b/pkg/util/scheduler/scheduler_test.go index 9d185df39c7..55a1484f34a 100644 --- a/pkg/util/scheduler/scheduler_test.go +++ b/pkg/util/scheduler/scheduler_test.go @@ -151,7 +151,7 @@ func TestScheduler(t *testing.T) { itemID := i tenantIndex := itemID % 10 tenantID := fmt.Sprintf("tenant-%d", tenantIndex) - require.NoError(t, q.Enqueue(context.Background(), tenantID, func(_ context.Context) { + require.NoError(t, q.Enqueue(context.Background(), tenantID, func() { processed.Store(itemID, true) time.Sleep(10 * time.Millisecond) wg.Done() @@ -199,12 +199,12 @@ func TestScheduler(t *testing.T) { require.NoError(t, services.StartAndAwaitRunning(context.Background(), scheduler)) for i := 0; i < 5; i++ { - require.NoError(t, q.Enqueue(context.Background(), "tenant-1", func(_ context.Context) { + require.NoError(t, q.Enqueue(context.Background(), "tenant-1", func() { processed.Add(1) })) } - require.NoError(t, q.Enqueue(context.Background(), "tenant-1", func(_ context.Context) { + require.NoError(t, q.Enqueue(context.Background(), "tenant-1", func() { close(taskStarted) time.Sleep(1 * time.Second) processed.Add(1) From 93c14c52daf5d717ce6e3d11ee9cafb4c08d4960 Mon Sep 17 00:00:00 2001 From: Ivan Ortega Alba Date: Thu, 3 Jul 2025 12:23:51 +0200 Subject: [PATCH 08/19] Migrations: Compare backend and frontend outputs to ensure feature parity (#106851) * wip: trying to understand how to get the ds info from migrator * add datasource info provider * Use DS service to fetch DS data * add more tests cases to match with migrator cases * Add snapshots * Non-existing DS * Add different DS for snapshots * fix import * Fix tests: guard against double initialization * don't use full datasource package in test * min version should be 35 * fix test * fix conversion test * Dashboards: Support schemaVersion v35 migration in backend * Dashboards: Support schemaVersion v34 migration in backend * Dashboards: Support schemaVersion v33 migration in backend * Apply suggestions from code review Co-authored-by: Stephanie Hingtgen * Apply feedback * Remove unused parameters * Refactor to follow Go patterns * Update logic * Only write final migration result as output * Compare backend and frontend results * Improve snapshots to cover all possible use cases * Linter * wip make it consistent v33 * apply feedback * Return default when the ref cannot be found * Update apps/dashboard/pkg/migration/schemaversion/v33.go Co-authored-by: Stephanie Hingtgen * apply feedback * Use same mocks backend/frontend * restore migrations * update snapshots * Adapt migration tests to use min versions * Ensure v40-v41 works * Ensure v39-v40 works * Simplify the naming of the files * adjust jest to new input convention * Ensure every migration v36-v41 works * Improve v38 naming * Ensure v36 migrates correctly * Skip v36 refs migrations on rows * Treat rows as frontend and ensure same results for v36 * Ensure v34 runs with the same logic than the frontend * Leave empty stadistics as valid option * ensure v33 is working as the frontend * Update tests * Undo frontend changes for legend handling * Remove filtering by version in the frontend * linter * Clean up v33 input JSON --------- Co-authored-by: Todd Treece <360020+toddtreece@users.noreply.github.com> Co-authored-by: Haris Rozajac Co-authored-by: Stephanie Hingtgen --- apps/dashboard/pkg/migration/migrate_test.go | 83 +- .../schemaversion/datasource_utils.go | 16 +- .../schemaversion/datasource_utils_test.go | 144 +-- .../pkg/migration/schemaversion/v33_test.go | 62 +- .../pkg/migration/schemaversion/v34.go | 262 +++-- .../pkg/migration/schemaversion/v34_test.go | 338 ++++-- .../pkg/migration/schemaversion/v36.go | 205 +++- .../pkg/migration/schemaversion/v36_test.go | 1002 +++++++++++------ .../pkg/migration/schemaversion/v37.go | 124 +- .../pkg/migration/schemaversion/v37_test.go | 352 ++++-- .../pkg/migration/schemaversion/v38.go | 90 +- .../pkg/migration/schemaversion/v38_test.go | 486 +++++--- .../pkg/migration/schemaversion/v39.go | 65 +- .../pkg/migration/schemaversion/v39_test.go | 317 +++++- .../pkg/migration/schemaversion/v40.go | 33 + .../pkg/migration/schemaversion/v40_test.go | 41 +- .../pkg/migration/schemaversion/v41.go | 30 + .../pkg/migration/schemaversion/v41_test.go | 16 + .../input/32.panel_ds_name_to_ref.json | 561 --------- .../input/33.multiple_stats_cloudwatch.json | 375 ------ .../input/34.ensure_x_axis_visibility.json | 251 ----- .../testdata/input/35.ds_name_to_ref.json | 231 ---- .../input/36.legend_normalization.json | 125 -- .../37.timeseries_table_display_mode.json | 362 ------ .../input/38.transform_timeseries_table.json | 155 --- .../testdata/input/39.refresh_true.json | 136 --- .../input/40.time_picker_time_options.json | 136 --- .../input/v33.panel_ds_name_to_ref.json | 166 +++ .../input/v34.multiple_stats_cloudwatch.json | 366 ++++++ .../input/v35.ensure_x_axis_visibility.json | 100 ++ .../testdata/input/v36.ds_name_to_ref.json | 286 +++++ .../input/v37.legend_normalization.json | 126 +++ .../v38.table_displaymode_comprehensive.json | 187 +++ .../v38.timeseries_table_display_mode.json | 187 +++ .../input/v39.transform_timeseries_table.json | 145 +++ .../input/v40.refresh_empty_string.json | 10 + .../testdata/input/v40.refresh_false.json | 10 + .../testdata/input/v40.refresh_not_set.json | 9 + .../testdata/input/v40.refresh_numeric.json | 10 + .../testdata/input/v40.refresh_string.json | 10 + .../testdata/input/v40.refresh_true.json | 10 + .../testdata/input/v41.no_time_picker.json | 10 + .../v41.time_picker_no_time_options.json | 7 + .../input/v41.time_picker_time_options.json | 14 + .../output/32.panel_ds_name_to_ref.33.json | 660 ----------- .../output/32.panel_ds_name_to_ref.34.json | 719 ------------ .../output/32.panel_ds_name_to_ref.35.json | 732 ------------ .../output/32.panel_ds_name_to_ref.36.json | 831 -------------- .../output/32.panel_ds_name_to_ref.37.json | 840 -------------- .../output/32.panel_ds_name_to_ref.38.json | 840 -------------- .../output/32.panel_ds_name_to_ref.39.json | 840 -------------- .../output/32.panel_ds_name_to_ref.40.json | 840 -------------- .../output/32.panel_ds_name_to_ref.41.json | 828 -------------- .../33.multiple_stats_cloudwatch.34.json | 462 -------- .../33.multiple_stats_cloudwatch.35.json | 475 -------- .../33.multiple_stats_cloudwatch.36.json | 531 --------- .../33.multiple_stats_cloudwatch.37.json | 540 --------- .../33.multiple_stats_cloudwatch.38.json | 540 --------- .../33.multiple_stats_cloudwatch.39.json | 540 --------- .../33.multiple_stats_cloudwatch.40.json | 540 --------- .../33.multiple_stats_cloudwatch.41.json | 528 --------- .../34.ensure_x_axis_visibility.35.json | 273 ----- .../34.ensure_x_axis_visibility.36.json | 326 ------ .../34.ensure_x_axis_visibility.37.json | 335 ------ .../34.ensure_x_axis_visibility.38.json | 335 ------ .../34.ensure_x_axis_visibility.39.json | 335 ------ .../34.ensure_x_axis_visibility.40.json | 335 ------ .../34.ensure_x_axis_visibility.41.json | 323 ------ .../testdata/output/35.ds_name_to_ref.36.json | 294 ----- .../testdata/output/35.ds_name_to_ref.37.json | 303 ----- .../testdata/output/35.ds_name_to_ref.38.json | 303 ----- .../testdata/output/35.ds_name_to_ref.39.json | 303 ----- .../testdata/output/35.ds_name_to_ref.40.json | 303 ----- .../testdata/output/35.ds_name_to_ref.41.json | 291 ----- .../output/36.legend_normalization.37.json | 144 --- .../output/36.legend_normalization.38.json | 144 --- .../output/36.legend_normalization.39.json | 144 --- .../output/36.legend_normalization.40.json | 144 --- .../output/36.legend_normalization.41.json | 132 --- .../37.timeseries_table_display_mode.38.json | 387 ------- .../37.timeseries_table_display_mode.39.json | 387 ------- .../37.timeseries_table_display_mode.40.json | 387 ------- .../37.timeseries_table_display_mode.41.json | 375 ------ .../38.transform_timeseries_table.39.json | 167 --- .../38.transform_timeseries_table.40.json | 167 --- .../38.transform_timeseries_table.41.json | 155 --- .../testdata/output/39.refresh_true.40.json | 146 --- .../testdata/output/39.refresh_true.41.json | 134 --- .../40.time_picker_time_options.41.json | 134 --- .../output/v33.panel_ds_name_to_ref.json | 270 +++++ .../output/v34.multiple_stats_cloudwatch.json | 639 +++++++++++ .../output/v35.ensure_x_axis_visibility.json | 260 +++++ .../testdata/output/v36.ds_name_to_ref.json | 370 ++++++ .../output/v37.legend_normalization.json | 130 +++ .../v38.table_displaymode_comprehensive.json | 223 ++++ .../v38.timeseries_table_display_mode.json | 223 ++++ .../v39.transform_timeseries_table.json | 159 +++ .../output/v40.refresh_empty_string.json | 10 + .../testdata/output/v40.refresh_false.json | 10 + .../testdata/output/v40.refresh_not_set.json | 10 + .../testdata/output/v40.refresh_numeric.json | 10 + .../testdata/output/v40.refresh_string.json | 10 + .../testdata/output/v40.refresh_true.json | 10 + .../testdata/output/v41.no_time_picker.json | 10 + .../v41.time_picker_no_time_options.json | 18 + .../output/v41.time_picker_time_options.json | 24 + .../dashboard/pkg/migration/testutil/mocks.go | 42 +- .../dashboard/state/DashboardMigrator.ts | 16 +- .../state/DashboardMigratorToBackend.test.ts | 125 ++ 109 files changed, 6762 insertions(+), 21950 deletions(-) delete mode 100644 apps/dashboard/pkg/migration/testdata/input/32.panel_ds_name_to_ref.json delete mode 100644 apps/dashboard/pkg/migration/testdata/input/33.multiple_stats_cloudwatch.json delete mode 100644 apps/dashboard/pkg/migration/testdata/input/34.ensure_x_axis_visibility.json delete mode 100644 apps/dashboard/pkg/migration/testdata/input/35.ds_name_to_ref.json delete mode 100644 apps/dashboard/pkg/migration/testdata/input/36.legend_normalization.json delete mode 100644 apps/dashboard/pkg/migration/testdata/input/37.timeseries_table_display_mode.json delete mode 100644 apps/dashboard/pkg/migration/testdata/input/38.transform_timeseries_table.json delete mode 100644 apps/dashboard/pkg/migration/testdata/input/39.refresh_true.json delete mode 100644 apps/dashboard/pkg/migration/testdata/input/40.time_picker_time_options.json create mode 100644 apps/dashboard/pkg/migration/testdata/input/v33.panel_ds_name_to_ref.json create mode 100644 apps/dashboard/pkg/migration/testdata/input/v34.multiple_stats_cloudwatch.json create mode 100644 apps/dashboard/pkg/migration/testdata/input/v35.ensure_x_axis_visibility.json create mode 100644 apps/dashboard/pkg/migration/testdata/input/v36.ds_name_to_ref.json create mode 100644 apps/dashboard/pkg/migration/testdata/input/v37.legend_normalization.json create mode 100644 apps/dashboard/pkg/migration/testdata/input/v38.table_displaymode_comprehensive.json create mode 100644 apps/dashboard/pkg/migration/testdata/input/v38.timeseries_table_display_mode.json create mode 100644 apps/dashboard/pkg/migration/testdata/input/v39.transform_timeseries_table.json create mode 100644 apps/dashboard/pkg/migration/testdata/input/v40.refresh_empty_string.json create mode 100644 apps/dashboard/pkg/migration/testdata/input/v40.refresh_false.json create mode 100644 apps/dashboard/pkg/migration/testdata/input/v40.refresh_not_set.json create mode 100644 apps/dashboard/pkg/migration/testdata/input/v40.refresh_numeric.json create mode 100644 apps/dashboard/pkg/migration/testdata/input/v40.refresh_string.json create mode 100644 apps/dashboard/pkg/migration/testdata/input/v40.refresh_true.json create mode 100644 apps/dashboard/pkg/migration/testdata/input/v41.no_time_picker.json create mode 100644 apps/dashboard/pkg/migration/testdata/input/v41.time_picker_no_time_options.json create mode 100644 apps/dashboard/pkg/migration/testdata/input/v41.time_picker_time_options.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.33.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.34.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.35.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.36.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.37.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.38.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.39.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.40.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.41.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.34.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.35.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.36.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.37.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.38.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.39.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.40.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.41.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.35.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.36.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.37.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.38.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.39.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.40.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.41.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.36.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.37.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.38.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.39.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.40.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.41.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.37.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.38.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.39.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.40.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.41.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.38.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.39.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.40.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.41.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.39.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.40.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.41.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/39.refresh_true.40.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/39.refresh_true.41.json delete mode 100644 apps/dashboard/pkg/migration/testdata/output/40.time_picker_time_options.41.json create mode 100644 apps/dashboard/pkg/migration/testdata/output/v33.panel_ds_name_to_ref.json create mode 100644 apps/dashboard/pkg/migration/testdata/output/v34.multiple_stats_cloudwatch.json create mode 100644 apps/dashboard/pkg/migration/testdata/output/v35.ensure_x_axis_visibility.json create mode 100644 apps/dashboard/pkg/migration/testdata/output/v36.ds_name_to_ref.json create mode 100644 apps/dashboard/pkg/migration/testdata/output/v37.legend_normalization.json create mode 100644 apps/dashboard/pkg/migration/testdata/output/v38.table_displaymode_comprehensive.json create mode 100644 apps/dashboard/pkg/migration/testdata/output/v38.timeseries_table_display_mode.json create mode 100644 apps/dashboard/pkg/migration/testdata/output/v39.transform_timeseries_table.json create mode 100644 apps/dashboard/pkg/migration/testdata/output/v40.refresh_empty_string.json create mode 100644 apps/dashboard/pkg/migration/testdata/output/v40.refresh_false.json create mode 100644 apps/dashboard/pkg/migration/testdata/output/v40.refresh_not_set.json create mode 100644 apps/dashboard/pkg/migration/testdata/output/v40.refresh_numeric.json create mode 100644 apps/dashboard/pkg/migration/testdata/output/v40.refresh_string.json create mode 100644 apps/dashboard/pkg/migration/testdata/output/v40.refresh_true.json create mode 100644 apps/dashboard/pkg/migration/testdata/output/v41.no_time_picker.json create mode 100644 apps/dashboard/pkg/migration/testdata/output/v41.time_picker_no_time_options.json create mode 100644 apps/dashboard/pkg/migration/testdata/output/v41.time_picker_time_options.json create mode 100644 public/app/features/dashboard/state/DashboardMigratorToBackend.test.ts diff --git a/apps/dashboard/pkg/migration/migrate_test.go b/apps/dashboard/pkg/migration/migrate_test.go index cd98fd5eccf..dfe60091bbc 100644 --- a/apps/dashboard/pkg/migration/migrate_test.go +++ b/apps/dashboard/pkg/migration/migrate_test.go @@ -5,7 +5,6 @@ import ( "fmt" "os" "path/filepath" - "strconv" "strings" "testing" @@ -13,6 +12,7 @@ import ( "github.com/grafana/grafana/apps/dashboard/pkg/migration" "github.com/grafana/grafana/apps/dashboard/pkg/migration/schemaversion" + "github.com/grafana/grafana/apps/dashboard/pkg/migration/testutil" ) const INPUT_DIR = "testdata/input" @@ -22,24 +22,8 @@ func TestMigrate(t *testing.T) { files, err := os.ReadDir(INPUT_DIR) require.NoError(t, err) - migration.Initialize(&mockDataSourceInfoProvider{ - dataSourceInfo: []schemaversion.DataSourceInfo{ - { - Default: true, - UID: "default-ds-uid", - ID: 1, - Type: "prometheus", - Name: "Default Test Datasource", - }, - { - UID: "non-default-test-ds-uid", - ID: 2, - Type: "loki", - Name: "Non Default Test Datasource", - APIVersion: "1", - }, - }, - }) + // Use the same datasource provider as the frontend test to ensure consistency + migration.Initialize(testutil.GetTestProvider()) t.Run("minimum version check", func(t *testing.T) { err := migration.Migrate(map[string]interface{}{ @@ -55,7 +39,13 @@ func TestMigrate(t *testing.T) { continue } - inputDash, inputVersion, name := load(t, filepath.Join(INPUT_DIR, f.Name())) + // Validate filename format + if !strings.HasPrefix(f.Name(), "v") || !strings.HasSuffix(f.Name(), ".json") { + t.Fatalf("input filename must use v{N}.{name}.json format, got: %s", f.Name()) + } + + inputDash := loadDashboard(t, filepath.Join(INPUT_DIR, f.Name())) + inputVersion := getSchemaVersion(t, inputDash) t.Run("input check "+f.Name(), func(t *testing.T) { // use input version as the target version to ensure there are no changes @@ -69,20 +59,18 @@ func TestMigrate(t *testing.T) { require.JSONEq(t, string(expectedDash), string(outBytes), "%s input check did not match", f.Name()) }) - for targetVersion := inputVersion + 1; targetVersion <= schemaversion.LATEST_VERSION; targetVersion++ { - testName := fmt.Sprintf("%s v%d to v%d", name, inputVersion, targetVersion) - t.Run(testName, func(t *testing.T) { - testMigration(t, inputDash, name, inputVersion, targetVersion) - }) - } + testName := fmt.Sprintf("%s v%d to v%d", f.Name(), inputVersion, schemaversion.LATEST_VERSION) + t.Run(testName, func(t *testing.T) { + testMigration(t, inputDash, f.Name(), inputVersion, schemaversion.LATEST_VERSION) + }) } } -func testMigration(t *testing.T, dash map[string]interface{}, name string, inputVersion, targetVersion int) { +func testMigration(t *testing.T, dash map[string]interface{}, inputFileName string, inputVersion, targetVersion int) { t.Helper() require.NoError(t, migration.Migrate(dash, targetVersion), "%d migration failed", targetVersion) - outPath := filepath.Join(OUTPUT_DIR, fmt.Sprintf("%d.%s.%d.json", inputVersion, name, targetVersion)) + outPath := filepath.Join(OUTPUT_DIR, inputFileName) outBytes, err := json.MarshalIndent(dash, "", " ") require.NoError(t, err, "failed to marshal migrated dashboard") @@ -99,33 +87,30 @@ func testMigration(t *testing.T, dash map[string]interface{}, name string, input require.JSONEq(t, string(existingBytes), string(outBytes), "%s did not match", outPath) } -func parseInputName(t *testing.T, name string) (int, string) { +func getSchemaVersion(t *testing.T, dash map[string]interface{}) int { t.Helper() - parts := strings.SplitN(filepath.Base(name), ".", 3) - if len(parts) < 3 { - t.Fatalf("invalid input filename: %s", name) + version, ok := dash["schemaVersion"] + require.True(t, ok, "dashboard missing schemaVersion") + + switch v := version.(type) { + case int: + return v + case float64: + return int(v) + default: + t.Fatalf("invalid schemaVersion type: %T", version) + return 0 } - iv, err := strconv.Atoi(parts[0]) - require.NoError(t, err, "failed to parse input version") - return iv, parts[1] } -func load(t *testing.T, path string) (dash map[string]interface{}, inputVersion int, name string) { +func loadDashboard(t *testing.T, path string) map[string]interface{} { + t.Helper() // We can ignore gosec G304 here since it's a test // nolint:gosec inputBytes, err := os.ReadFile(path) - require.NoError(t, err, "failed to read embedded input file") + require.NoError(t, err, "failed to read input file") + + var dash map[string]interface{} require.NoError(t, json.Unmarshal(inputBytes, &dash), "failed to unmarshal dashboard JSON") - inputVersion, name = parseInputName(t, path) - return dash, inputVersion, name -} - -var _ schemaversion.DataSourceInfoProvider = &mockDataSourceInfoProvider{} - -type mockDataSourceInfoProvider struct { - dataSourceInfo []schemaversion.DataSourceInfo -} - -func (m *mockDataSourceInfoProvider) GetDataSourceInfo() []schemaversion.DataSourceInfo { - return m.dataSourceInfo + return dash } diff --git a/apps/dashboard/pkg/migration/schemaversion/datasource_utils.go b/apps/dashboard/pkg/migration/schemaversion/datasource_utils.go index 18620b39a4c..6b1dfa9e449 100644 --- a/apps/dashboard/pkg/migration/schemaversion/datasource_utils.go +++ b/apps/dashboard/pkg/migration/schemaversion/datasource_utils.go @@ -40,9 +40,10 @@ func GetInstanceSettings(nameOrRef interface{}, datasources []DataSourceInfo) *D return GetDefaultDSInstanceSettings(datasources) } - // Check if it's a reference object without UID - should return default + // Check if it's a reference object if ref, ok := nameOrRef.(map[string]interface{}); ok { if _, hasUID := ref["uid"]; !hasUID { + // Reference object without UID should return default return GetDefaultDSInstanceSettings(datasources) } // It's a reference object with UID, search for matching UID @@ -56,7 +57,8 @@ func GetInstanceSettings(nameOrRef interface{}, datasources []DataSourceInfo) *D } } } - return GetDefaultDSInstanceSettings(datasources) + // Unknown UID-only reference should return nil (preserve it) + return nil } // Check if it's a string @@ -76,7 +78,7 @@ func GetInstanceSettings(nameOrRef interface{}, datasources []DataSourceInfo) *D } } } - return GetDefaultDSInstanceSettings(datasources) + return nil } // MigrateDatasourceNameToRef converts a datasource name/uid string to a reference object @@ -100,7 +102,13 @@ func MigrateDatasourceNameToRef(nameOrRef interface{}, options map[string]bool, return GetDataSourceRef(ds) } - if dsName, ok := nameOrRef.(string); ok && dsName != "" { + // Handle string cases (including empty strings) + if dsName, ok := nameOrRef.(string); ok { + if dsName == "" { + // Empty string should return empty object (frontend behavior) + return map[string]interface{}{} + } + // Unknown datasource name should be preserved as UID-only reference return map[string]interface{}{ "uid": dsName, } diff --git a/apps/dashboard/pkg/migration/schemaversion/datasource_utils_test.go b/apps/dashboard/pkg/migration/schemaversion/datasource_utils_test.go index 8e199288d0c..723b36d90e0 100644 --- a/apps/dashboard/pkg/migration/schemaversion/datasource_utils_test.go +++ b/apps/dashboard/pkg/migration/schemaversion/datasource_utils_test.go @@ -81,35 +81,35 @@ func TestGetDefaultDSInstanceSettings(t *testing.T) { { name: "no default datasource", datasources: []schemaversion.DataSourceInfo{ - {UID: "ds1", Type: "prometheus", Name: "DS1", Default: false}, - {UID: "ds2", Type: "elasticsearch", Name: "DS2", Default: false}, + {UID: "existing-ref-uid", Type: "prometheus", Name: "Existing Ref Name", Default: false}, + {UID: "existing-target-uid", Type: "elasticsearch", Name: "Existing Target Name", Default: false}, }, expected: nil, }, { name: "single default datasource", datasources: []schemaversion.DataSourceInfo{ - {UID: "ds1", Type: "prometheus", Name: "DS1", Default: false}, - {UID: "default-ds", Type: "prometheus", Name: "Default", Default: true, APIVersion: "v1"}, - {UID: "ds2", Type: "elasticsearch", Name: "DS2", Default: false}, + {UID: "existing-ref-uid", Type: "prometheus", Name: "Existing Ref Name", Default: false}, + {UID: "default-ds-uid", Type: "prometheus", Name: "Default Test Datasource Name", Default: true, APIVersion: "v1"}, + {UID: "existing-target-uid", Type: "elasticsearch", Name: "Existing Target Name", Default: false}, }, expected: &schemaversion.DataSourceInfo{ - UID: "default-ds", + UID: "default-ds-uid", Type: "prometheus", - Name: "Default", + Name: "Default Test Datasource Name", APIVersion: "v1", }, }, { name: "multiple default datasources returns first", datasources: []schemaversion.DataSourceInfo{ - {UID: "ds1", Type: "prometheus", Name: "Default1", Default: true, APIVersion: "v1"}, - {UID: "ds2", Type: "elasticsearch", Name: "Default2", Default: true, APIVersion: "v2"}, + {UID: "first-default", Type: "prometheus", Name: "First Default", Default: true, APIVersion: "v1"}, + {UID: "second-default", Type: "elasticsearch", Name: "Second Default", Default: true, APIVersion: "v2"}, }, expected: &schemaversion.DataSourceInfo{ - UID: "ds1", + UID: "first-default", Type: "prometheus", - Name: "Default1", + Name: "First Default", APIVersion: "v1", }, }, @@ -125,9 +125,9 @@ func TestGetDefaultDSInstanceSettings(t *testing.T) { func TestGetInstanceSettings(t *testing.T) { datasources := []schemaversion.DataSourceInfo{ - {UID: "default-ds", Type: "prometheus", Name: "Default", Default: true, APIVersion: "v1"}, - {UID: "other-ds", Type: "elasticsearch", Name: "Elasticsearch", Default: false, APIVersion: "v2"}, - {UID: "test-uid", Type: "influxdb", Name: "InfluxDB", Default: false}, + {UID: "default-ds-uid", Type: "prometheus", Name: "Default Test Datasource Name", Default: true, APIVersion: "v1"}, + {UID: "existing-target-uid", Type: "elasticsearch", Name: "Existing Target Name", Default: false, APIVersion: "v2"}, + {UID: "existing-ref-uid", Type: "prometheus", Name: "Existing Ref Name", Default: false, APIVersion: "v1"}, } tests := []struct { @@ -139,9 +139,9 @@ func TestGetInstanceSettings(t *testing.T) { name: "nil should return default", nameOrRef: nil, expected: &schemaversion.DataSourceInfo{ - UID: "default-ds", + UID: "default-ds-uid", Type: "prometheus", - Name: "Default", + Name: "Default Test Datasource Name", APIVersion: "v1", }, }, @@ -149,51 +149,51 @@ func TestGetInstanceSettings(t *testing.T) { name: "default string should return default", nameOrRef: "default", expected: &schemaversion.DataSourceInfo{ - UID: "default-ds", + UID: "default-ds-uid", Type: "prometheus", - Name: "Default", + Name: "Default Test Datasource Name", APIVersion: "v1", }, }, { name: "lookup by UID", - nameOrRef: "other-ds", + nameOrRef: "existing-target-uid", expected: &schemaversion.DataSourceInfo{ - UID: "other-ds", + UID: "existing-target-uid", Type: "elasticsearch", - Name: "Elasticsearch", + Name: "Existing Target Name", APIVersion: "v2", }, }, { name: "lookup by name", - nameOrRef: "Elasticsearch", + nameOrRef: "Existing Target Name", expected: &schemaversion.DataSourceInfo{ - UID: "other-ds", + UID: "existing-target-uid", Type: "elasticsearch", - Name: "Elasticsearch", + Name: "Existing Target Name", APIVersion: "v2", }, }, { name: "lookup by UID without apiVersion", - nameOrRef: "test-uid", + nameOrRef: "existing-ref-uid", expected: &schemaversion.DataSourceInfo{ - UID: "test-uid", - Type: "influxdb", - Name: "InfluxDB", - APIVersion: "", + UID: "existing-ref-uid", + Type: "prometheus", + Name: "Existing Ref Name", + APIVersion: "v1", }, }, { name: "lookup by reference object with UID", nameOrRef: map[string]interface{}{ - "uid": "other-ds", + "uid": "existing-target-uid", }, expected: &schemaversion.DataSourceInfo{ - UID: "other-ds", + UID: "existing-target-uid", Type: "elasticsearch", - Name: "Elasticsearch", + Name: "Existing Target Name", APIVersion: "v2", }, }, @@ -203,39 +203,29 @@ func TestGetInstanceSettings(t *testing.T) { "type": "prometheus", }, expected: &schemaversion.DataSourceInfo{ - UID: "default-ds", + UID: "default-ds-uid", Type: "prometheus", - Name: "Default", + Name: "Default Test Datasource Name", APIVersion: "v1", }, }, { - name: "unknown datasource should return default", + name: "unknown datasource should return nil", nameOrRef: "unknown-ds", - expected: &schemaversion.DataSourceInfo{ - UID: "default-ds", - Type: "prometheus", - Name: "Default", - APIVersion: "v1", - }, + expected: nil, }, { - name: "empty string should return default", + name: "empty string should return nil", nameOrRef: "", - expected: &schemaversion.DataSourceInfo{ - UID: "default-ds", - Type: "prometheus", - Name: "Default", - APIVersion: "v1", - }, + expected: nil, }, { name: "unsupported input type should return default", nameOrRef: 123, expected: &schemaversion.DataSourceInfo{ - UID: "default-ds", + UID: "default-ds-uid", Type: "prometheus", - Name: "Default", + Name: "Default Test Datasource Name", APIVersion: "v1", }, }, @@ -251,9 +241,9 @@ func TestGetInstanceSettings(t *testing.T) { func TestMigrateDatasourceNameToRef(t *testing.T) { datasources := []schemaversion.DataSourceInfo{ - {UID: "default-ds", Type: "prometheus", Name: "Default", Default: true, APIVersion: "v1"}, - {UID: "other-ds", Type: "elasticsearch", Name: "Elasticsearch", Default: false, APIVersion: "v2"}, - {UID: "test-uid", Type: "influxdb", Name: "InfluxDB", Default: false}, + {UID: "default-ds-uid", Type: "prometheus", Name: "Default Test Datasource Name", Default: true, APIVersion: "v1"}, + {UID: "existing-target-uid", Type: "elasticsearch", Name: "Existing Target Name", Default: false, APIVersion: "v2"}, + {UID: "existing-ref-uid", Type: "prometheus", Name: "Existing Ref Name", Default: false, APIVersion: "v1"}, } t.Run("returnDefaultAsNull: true", func(t *testing.T) { @@ -287,39 +277,33 @@ func TestMigrateDatasourceNameToRef(t *testing.T) { }, { name: "lookup by UID", - nameOrRef: "other-ds", + nameOrRef: "existing-target-uid", expected: map[string]interface{}{ - "uid": "other-ds", + "uid": "existing-target-uid", "type": "elasticsearch", "apiVersion": "v2", }, }, { name: "lookup by name", - nameOrRef: "Elasticsearch", + nameOrRef: "Existing Target Name", expected: map[string]interface{}{ - "uid": "other-ds", + "uid": "existing-target-uid", "type": "elasticsearch", "apiVersion": "v2", }, }, { - name: "unknown datasource should return default reference", + name: "unknown datasource should preserve as UID", nameOrRef: "unknown-ds", expected: map[string]interface{}{ - "uid": "default-ds", - "type": "prometheus", - "apiVersion": "v1", + "uid": "unknown-ds", }, }, { - name: "empty string should return default reference", + name: "empty string should return empty object", nameOrRef: "", - expected: map[string]interface{}{ - "uid": "default-ds", - "type": "prometheus", - "apiVersion": "v1", - }, + expected: map[string]interface{}{}, }, } @@ -343,7 +327,7 @@ func TestMigrateDatasourceNameToRef(t *testing.T) { name: "nil should return default reference", nameOrRef: nil, expected: map[string]interface{}{ - "uid": "default-ds", + "uid": "default-ds-uid", "type": "prometheus", "apiVersion": "v1", }, @@ -352,7 +336,7 @@ func TestMigrateDatasourceNameToRef(t *testing.T) { name: "default should return default reference", nameOrRef: "default", expected: map[string]interface{}{ - "uid": "default-ds", + "uid": "default-ds-uid", "type": "prometheus", "apiVersion": "v1", }, @@ -370,30 +354,24 @@ func TestMigrateDatasourceNameToRef(t *testing.T) { }, { name: "lookup by UID", - nameOrRef: "other-ds", + nameOrRef: "existing-target-uid", expected: map[string]interface{}{ - "uid": "other-ds", + "uid": "existing-target-uid", "type": "elasticsearch", "apiVersion": "v2", }, }, { - name: "unknown datasource should return default reference", + name: "unknown datasource should preserve as UID", nameOrRef: "unknown-ds", expected: map[string]interface{}{ - "uid": "default-ds", - "type": "prometheus", - "apiVersion": "v1", + "uid": "unknown-ds", }, }, { - name: "empty string should return default reference", + name: "empty string should return empty object", nameOrRef: "", - expected: map[string]interface{}{ - "uid": "default-ds", - "type": "prometheus", - "apiVersion": "v1", - }, + expected: map[string]interface{}{}, }, } @@ -414,7 +392,7 @@ func TestMigrateDatasourceNameToRef(t *testing.T) { } result := schemaversion.MigrateDatasourceNameToRef(nameOrRef, options, datasources) expected := map[string]interface{}{ - "uid": "default-ds", + "uid": "default-ds-uid", "type": "prometheus", "apiVersion": "v1", } @@ -424,7 +402,7 @@ func TestMigrateDatasourceNameToRef(t *testing.T) { t.Run("integer input should return default reference", func(t *testing.T) { result := schemaversion.MigrateDatasourceNameToRef(123, options, datasources) expected := map[string]interface{}{ - "uid": "default-ds", + "uid": "default-ds-uid", "type": "prometheus", "apiVersion": "v1", } diff --git a/apps/dashboard/pkg/migration/schemaversion/v33_test.go b/apps/dashboard/pkg/migration/schemaversion/v33_test.go index 7ab70cd568e..61916a1e8e2 100644 --- a/apps/dashboard/pkg/migration/schemaversion/v33_test.go +++ b/apps/dashboard/pkg/migration/schemaversion/v33_test.go @@ -126,10 +126,10 @@ func TestV33(t *testing.T) { "schemaVersion": 32, "panels": []interface{}{ map[string]interface{}{ - "datasource": "Elasticsearch", + "datasource": "Existing Target Name", "targets": []interface{}{ map[string]interface{}{ - "datasource": "Elasticsearch", + "datasource": "Existing Target Name", }, }, }, @@ -141,14 +141,14 @@ func TestV33(t *testing.T) { map[string]interface{}{ "datasource": map[string]interface{}{ "type": "elasticsearch", - "uid": "other-ds", + "uid": "existing-target-uid", "apiVersion": "v2", }, "targets": []interface{}{ map[string]interface{}{ "datasource": map[string]interface{}{ "type": "elasticsearch", - "uid": "other-ds", + "uid": "existing-target-uid", "apiVersion": "v2", }, }, @@ -163,10 +163,10 @@ func TestV33(t *testing.T) { "schemaVersion": 32, "panels": []interface{}{ map[string]interface{}{ - "datasource": "other-ds", + "datasource": "existing-target-uid", "targets": []interface{}{ map[string]interface{}{ - "datasource": "other-ds", + "datasource": "existing-target-uid", }, }, }, @@ -178,14 +178,14 @@ func TestV33(t *testing.T) { map[string]interface{}{ "datasource": map[string]interface{}{ "type": "elasticsearch", - "uid": "other-ds", + "uid": "existing-target-uid", "apiVersion": "v2", }, "targets": []interface{}{ map[string]interface{}{ "datasource": map[string]interface{}{ "type": "elasticsearch", - "uid": "other-ds", + "uid": "existing-target-uid", "apiVersion": "v2", }, }, @@ -195,7 +195,7 @@ func TestV33(t *testing.T) { }, }, { - name: "panel with unknown datasource should return default reference", + name: "panel with unknown datasource should preserve as UID", input: map[string]interface{}{ "schemaVersion": 32, "panels": []interface{}{ @@ -214,16 +214,12 @@ func TestV33(t *testing.T) { "panels": []interface{}{ map[string]interface{}{ "datasource": map[string]interface{}{ - "uid": "default-ds", - "type": "prometheus", - "apiVersion": "v1", + "uid": "unknown-datasource", }, "targets": []interface{}{ map[string]interface{}{ "datasource": map[string]interface{}{ - "uid": "default-ds", - "type": "prometheus", - "apiVersion": "v1", + "uid": "unknown-datasource", }, }, }, @@ -237,13 +233,13 @@ func TestV33(t *testing.T) { "schemaVersion": 32, "panels": []interface{}{ map[string]interface{}{ - "datasource": "Elasticsearch", + "datasource": "Existing Target Name", "targets": []interface{}{ map[string]interface{}{ "datasource": "default", }, map[string]interface{}{ - "datasource": "other-ds", + "datasource": "existing-target-uid", }, map[string]interface{}{ "datasource": "unknown-ds", @@ -258,7 +254,7 @@ func TestV33(t *testing.T) { map[string]interface{}{ "datasource": map[string]interface{}{ "type": "elasticsearch", - "uid": "other-ds", + "uid": "existing-target-uid", "apiVersion": "v2", }, "targets": []interface{}{ @@ -268,15 +264,13 @@ func TestV33(t *testing.T) { map[string]interface{}{ "datasource": map[string]interface{}{ "type": "elasticsearch", - "uid": "other-ds", + "uid": "existing-target-uid", "apiVersion": "v2", }, }, map[string]interface{}{ "datasource": map[string]interface{}{ - "uid": "default-ds", - "type": "prometheus", - "apiVersion": "v1", + "uid": "unknown-ds", }, }, }, @@ -290,7 +284,7 @@ func TestV33(t *testing.T) { "schemaVersion": 32, "panels": []interface{}{ map[string]interface{}{ - "datasource": "Elasticsearch", + "datasource": "Existing Target Name", }, }, }, @@ -300,7 +294,7 @@ func TestV33(t *testing.T) { map[string]interface{}{ "datasource": map[string]interface{}{ "type": "elasticsearch", - "uid": "other-ds", + "uid": "existing-target-uid", "apiVersion": "v2", }, }, @@ -315,13 +309,13 @@ func TestV33(t *testing.T) { map[string]interface{}{ "type": "row", "collapsed": true, - "datasource": "Elasticsearch", + "datasource": "Existing Target Name", "panels": []interface{}{ map[string]interface{}{ "datasource": "default", "targets": []interface{}{ map[string]interface{}{ - "datasource": "other-ds", + "datasource": "existing-target-uid", }, }, }, @@ -329,7 +323,7 @@ func TestV33(t *testing.T) { "datasource": "unknown-ds", "targets": []interface{}{ map[string]interface{}{ - "datasource": "Elasticsearch", + "datasource": "Existing Target Name", }, }, }, @@ -345,7 +339,7 @@ func TestV33(t *testing.T) { "collapsed": true, "datasource": map[string]interface{}{ "type": "elasticsearch", - "uid": "other-ds", + "uid": "existing-target-uid", "apiVersion": "v2", }, "panels": []interface{}{ @@ -355,7 +349,7 @@ func TestV33(t *testing.T) { map[string]interface{}{ "datasource": map[string]interface{}{ "type": "elasticsearch", - "uid": "other-ds", + "uid": "existing-target-uid", "apiVersion": "v2", }, }, @@ -363,15 +357,13 @@ func TestV33(t *testing.T) { }, map[string]interface{}{ "datasource": map[string]interface{}{ - "uid": "default-ds", - "type": "prometheus", - "apiVersion": "v1", + "uid": "unknown-ds", }, "targets": []interface{}{ map[string]interface{}{ "datasource": map[string]interface{}{ "type": "elasticsearch", - "uid": "other-ds", + "uid": "existing-target-uid", "apiVersion": "v2", }, }, @@ -389,7 +381,7 @@ func TestV33(t *testing.T) { "schemaVersion": 32, "panels": []interface{}{ map[string]interface{}{ - "datasource": "Elasticsearch", + "datasource": "Existing Target Name", "targets": []interface{}{ map[string]interface{}{ "datasource": "default", @@ -407,7 +399,7 @@ func TestV33(t *testing.T) { map[string]interface{}{ "datasource": map[string]interface{}{ "type": "elasticsearch", - "uid": "other-ds", + "uid": "existing-target-uid", "apiVersion": "v2", }, "targets": []interface{}{ diff --git a/apps/dashboard/pkg/migration/schemaversion/v34.go b/apps/dashboard/pkg/migration/schemaversion/v34.go index 08da28b5c06..90620e059d7 100644 --- a/apps/dashboard/pkg/migration/schemaversion/v34.go +++ b/apps/dashboard/pkg/migration/schemaversion/v34.go @@ -71,6 +71,7 @@ func V34(dashboard map[string]interface{}) error { if !hasNested { continue } + for _, nestedPanel := range nestedPanels { np, ok := nestedPanel.(map[string]interface{}) if !ok { @@ -108,63 +109,60 @@ func migrateCloudWatchQueriesInPanel(panel map[string]interface{}) { continue } - // Check if this query has multiple statistics - statistics, hasStatistics := t["statistics"].([]interface{}) - if !hasStatistics || len(statistics) <= 1 { - // Convert single statistic or no statistics to proper format - if hasStatistics && len(statistics) == 1 { - if stat, ok := statistics[0].(string); ok { - t["statistic"] = stat - } - } - delete(t, "statistics") + // Add CloudWatch fields if missing + if _, exists := t["metricEditorMode"]; !exists { + t["metricEditorMode"] = 0 + } + if _, exists := t["metricQueryType"]; !exists { + t["metricQueryType"] = 0 + } + + // Get valid statistics (including null and empty strings) + validStats, isEmpty := getValidStatistics(t["statistics"]) + + // Handle empty array case (preserve it) + if isEmpty { + // Keep empty array as-is newTargets = append(newTargets, t) continue } - // Split query with multiple statistics into separate queries - // First, collect all valid statistics - var validStatistics []string - for _, stat := range statistics { - statString, ok := stat.(string) - if !ok { - continue - } - validStatistics = append(validStatistics, statString) - } + // Remove statistics field for processing + delete(t, "statistics") - // If no valid statistics found, remove statistics field and keep original query - if len(validStatistics) == 0 { - delete(t, "statistics") + // Handle based on number of valid statistics + switch len(validStats) { + case 0: + // No valid statistics - keep query as-is newTargets = append(newTargets, t) - continue - } - - // Create separate queries for each valid statistic - for i, statString := range validStatistics { - // Create a copy of the original query - newQuery := make(map[string]interface{}) - for k, v := range t { - if k != "statistics" { - newQuery[k] = v + case 1: + // Single statistic - set statistic field if not null + if validStats[0] != nil { + if statString, ok := validStats[0].(string); ok { + t["statistic"] = statString } } + newTargets = append(newTargets, t) + default: + // Multiple statistics - create separate queries + for i, stat := range validStats { + newQuery := copyMap(t) + if stat != nil { + if statString, ok := stat.(string); ok { + newQuery["statistic"] = statString + } + } - // Set the single statistic - newQuery["statistic"] = statString - - if i == 0 { - // First query replaces the original - newTargets = append(newTargets, newQuery) - } else { - // Additional queries get new refIds and are added at the end - newQuery["refId"] = generateNextRefId(append(targets, additionalTargets...), len(additionalTargets)) - additionalTargets = append(additionalTargets, newQuery) + if i == 0 { + newTargets = append(newTargets, newQuery) + } else { + newQuery["refId"] = generateNextRefId(append(targets, additionalTargets...), len(additionalTargets)) + additionalTargets = append(additionalTargets, newQuery) + } } } } - // Append additional queries at the end panel["targets"] = append(newTargets, additionalTargets...) } @@ -192,95 +190,117 @@ func migrateCloudWatchAnnotationQueries(dashboard map[string]interface{}) { continue } - // Check if this annotation has multiple statistics - statistics, hasStatistics := a["statistics"].([]interface{}) - if !hasStatistics || len(statistics) <= 1 { - // Convert single statistic to proper format - if hasStatistics && len(statistics) == 1 { - if stat, ok := statistics[0].(string); ok { - // Create new annotation with single statistic - newAnnotation := make(map[string]interface{}) - for k, v := range a { - if k != "statistics" { - newAnnotation[k] = v - } + // Get original name for suffix generation + originalName, _ := a["name"].(string) + + // Get valid statistics (including null and empty strings) + validStats, isEmpty := getValidStatistics(a["statistics"]) + + // Handle empty array case (preserve it) + if isEmpty { + // Keep empty array as-is + annotationsList[i] = a + continue + } + + // Handle based on number of valid statistics + switch len(validStats) { + case 0: + // No valid statistics - remove statistics field + delete(a, "statistics") + annotationsList[i] = a + case 1: + // Single statistic - set statistic field if not null + delete(a, "statistics") + if validStats[0] != nil { + if statString, ok := validStats[0].(string); ok { + a["statistic"] = statString + } + } + annotationsList[i] = a + default: + // Multiple statistics - create separate annotations + delete(a, "statistics") + for j, stat := range validStats { + newAnnotation := copyMap(a) + + if stat != nil { + if statString, ok := stat.(string); ok { + newAnnotation["statistic"] = statString } - newAnnotation["statistic"] = stat + } + + // Add suffix to name + if originalName != "" { + suffix := getSuffixForStat(stat) + newAnnotation["name"] = originalName + " - " + suffix + } + + if j == 0 { annotationsList[i] = newAnnotation + } else { + additionalAnnotations = append(additionalAnnotations, newAnnotation) } - } else { - // Always remove statistics field, even if empty or no statistics - newAnnotation := make(map[string]interface{}) - for k, v := range a { - if k != "statistics" { - newAnnotation[k] = v - } - } - annotationsList[i] = newAnnotation - } - continue - } - - // Split annotation with multiple statistics into separate annotations - // First, collect all valid statistics - var validStatistics []string - for _, stat := range statistics { - statString, ok := stat.(string) - if !ok { - continue - } - validStatistics = append(validStatistics, statString) - } - - // If no valid statistics found, remove statistics field and keep original annotation - if len(validStatistics) == 0 { - // Create new annotation without statistics field - newAnnotation := make(map[string]interface{}) - for k, v := range a { - if k != "statistics" { - newAnnotation[k] = v - } - } - annotationsList[i] = newAnnotation - continue - } - - // Create new annotations for each valid statistic, replace original with first one - originalName, hasName := a["name"].(string) - - for j, statString := range validStatistics { - // Create new annotation for this statistic - newAnnotation := make(map[string]interface{}) - for k, v := range a { - if k != "statistics" { - newAnnotation[k] = v - } - } - - // Set the single statistic - newAnnotation["statistic"] = statString - - // Set the name with statistic suffix if multiple valid statistics - if len(validStatistics) > 1 && hasName { - newAnnotation["name"] = originalName + " - " + statString - } - - if j == 0 { - // Replace the original annotation with the first new one - annotationsList[i] = newAnnotation - } else { - // Add additional annotations to be appended later - additionalAnnotations = append(additionalAnnotations, newAnnotation) } } } - // Add additional annotations to the end of the list if len(additionalAnnotations) > 0 { annotations["list"] = append(annotationsList, additionalAnnotations...) } } +// getValidStatistics extracts valid statistics from the statistics field +func getValidStatistics(statisticsField interface{}) ([]interface{}, bool) { + statistics, ok := statisticsField.([]interface{}) + if !ok { + return nil, false + } + + // Special case: empty arrays should be preserved + if len(statistics) == 0 { + return nil, true // Return nil with true flag to indicate "empty array" + } + + var valid []interface{} + for _, stat := range statistics { + // Include null and strings (including empty strings) + if stat == nil || isString(stat) { + valid = append(valid, stat) + } + } + return valid, false +} + +// getSuffixForStat returns the appropriate suffix for annotation names +func getSuffixForStat(stat interface{}) string { + if stat == nil { + return "null" + } + if statString, ok := stat.(string); ok { + if statString == "" { + return "" + } + return statString + } + return "" +} + +// copyMap creates a shallow copy of a map +func copyMap(original map[string]interface{}) map[string]interface{} { + copy := make(map[string]interface{}) + for k, v := range original { + copy[k] = v + } + return copy +} + +// isString checks if value is a string +func isString(value interface{}) bool { + _, ok := value.(string) + return ok +} + // isCloudWatchQuery checks if a query target is a CloudWatch query. func isCloudWatchQuery(target map[string]interface{}) bool { // Check for required CloudWatch query fields diff --git a/apps/dashboard/pkg/migration/schemaversion/v34_test.go b/apps/dashboard/pkg/migration/schemaversion/v34_test.go index 586ecabe0db..4399e2573d2 100644 --- a/apps/dashboard/pkg/migration/schemaversion/v34_test.go +++ b/apps/dashboard/pkg/migration/schemaversion/v34_test.go @@ -36,28 +36,34 @@ func TestV34(t *testing.T) { "type": "timeseries", "targets": []interface{}{ map[string]interface{}{ - "refId": "A", - "dimensions": map[string]interface{}{"InstanceId": "i-123"}, - "namespace": "AWS/EC2", - "region": "us-east-1", - "metricName": "CPUUtilization", - "statistic": "Average", + "refId": "A", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "metricName": "CPUUtilization", + "statistic": "Average", + "metricEditorMode": 0, + "metricQueryType": 0, }, map[string]interface{}{ - "refId": "B", - "dimensions": map[string]interface{}{"InstanceId": "i-123"}, - "namespace": "AWS/EC2", - "region": "us-east-1", - "metricName": "CPUUtilization", - "statistic": "Maximum", + "refId": "B", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "metricName": "CPUUtilization", + "statistic": "Maximum", + "metricEditorMode": 0, + "metricQueryType": 0, }, map[string]interface{}{ - "refId": "C", - "dimensions": map[string]interface{}{"InstanceId": "i-123"}, - "namespace": "AWS/EC2", - "region": "us-east-1", - "metricName": "CPUUtilization", - "statistic": "Minimum", + "refId": "C", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "metricName": "CPUUtilization", + "statistic": "Minimum", + "metricEditorMode": 0, + "metricQueryType": 0, }, }, }, @@ -90,12 +96,14 @@ func TestV34(t *testing.T) { "id": 1, "targets": []interface{}{ map[string]interface{}{ - "refId": "A", - "dimensions": map[string]interface{}{"InstanceId": "i-123"}, - "namespace": "AWS/EC2", - "region": "us-east-1", - "metricName": "CPUUtilization", - "statistic": "Average", + "refId": "A", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "metricName": "CPUUtilization", + "statistic": "Average", + "metricEditorMode": 0, + "metricQueryType": 0, }, }, }, @@ -197,13 +205,20 @@ func TestV34(t *testing.T) { "annotations": map[string]interface{}{ "list": []interface{}{ map[string]interface{}{ - "name": "CloudWatch Annotation", + "name": "CloudWatch Annotation - Sum", "dimensions": map[string]interface{}{"InstanceId": "i-123"}, "namespace": "AWS/EC2", "region": "us-east-1", "prefixMatching": false, "statistic": "Sum", }, + map[string]interface{}{ + "name": "CloudWatch Annotation - null", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "prefixMatching": false, + }, }, }, }, @@ -236,6 +251,13 @@ func TestV34(t *testing.T) { "prefixMatching": false, "statistic": "Sum", }, + map[string]interface{}{ + "name": "CloudWatch Annotation - null", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "prefixMatching": false, + }, map[string]interface{}{ "name": "CloudWatch Annotation - Average", "dimensions": map[string]interface{}{"InstanceId": "i-123"}, @@ -310,12 +332,14 @@ func TestV34(t *testing.T) { "id": 1, "targets": []interface{}{ map[string]interface{}{ - "refId": "A", - "dimensions": map[string]interface{}{"InstanceId": "i-123"}, - "namespace": "AWS/EC2", - "region": "us-east-1", - "metricName": "CPUUtilization", - "statistic": "Average", + "refId": "A", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "metricName": "CPUUtilization", + "statistic": "Average", + "metricEditorMode": 0, + "metricQueryType": 0, }, map[string]interface{}{ "refId": "B", @@ -323,12 +347,14 @@ func TestV34(t *testing.T) { "datasource": "prometheus", }, map[string]interface{}{ - "refId": "C", - "dimensions": map[string]interface{}{"InstanceId": "i-123"}, - "namespace": "AWS/EC2", - "region": "us-east-1", - "metricName": "CPUUtilization", - "statistic": "Maximum", + "refId": "C", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "metricName": "CPUUtilization", + "statistic": "Maximum", + "metricEditorMode": 0, + "metricQueryType": 0, }, }, }, @@ -360,11 +386,13 @@ func TestV34(t *testing.T) { "id": 1, "targets": []interface{}{ map[string]interface{}{ - "refId": "A", - "dimensions": map[string]interface{}{"InstanceId": "i-123"}, - "namespace": "AWS/EC2", - "region": "us-east-1", - "metricName": "CPUUtilization", + "refId": "A", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "metricName": "CPUUtilization", + "metricEditorMode": 0, + "metricQueryType": 0, }, }, }, @@ -427,11 +455,14 @@ func TestV34(t *testing.T) { "id": 1, "targets": []interface{}{ map[string]interface{}{ - "refId": "A", - "dimensions": map[string]interface{}{"InstanceId": "i-123"}, - "namespace": "AWS/EC2", - "region": "us-east-1", - "metricName": "CPUUtilization", + "refId": "A", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "metricName": "CPUUtilization", + "statistics": []interface{}{}, + "metricEditorMode": 0, + "metricQueryType": 0, }, }, }, @@ -464,12 +495,23 @@ func TestV34(t *testing.T) { "id": 1, "targets": []interface{}{ map[string]interface{}{ - "refId": "A", - "dimensions": map[string]interface{}{"InstanceId": "i-123"}, - "namespace": "AWS/EC2", - "region": "us-east-1", - "metricName": "CPUUtilization", - "statistic": "Average", + "refId": "A", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "metricName": "CPUUtilization", + "metricEditorMode": 0, + "metricQueryType": 0, + }, + map[string]interface{}{ + "refId": "B", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "metricName": "CPUUtilization", + "statistic": "Average", + "metricEditorMode": 0, + "metricQueryType": 0, }, }, }, @@ -502,11 +544,13 @@ func TestV34(t *testing.T) { "id": 1, "targets": []interface{}{ map[string]interface{}{ - "refId": "A", - "dimensions": map[string]interface{}{"InstanceId": "i-123"}, - "namespace": "AWS/EC2", - "region": "us-east-1", - "metricName": "CPUUtilization", + "refId": "A", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "metricName": "CPUUtilization", + "metricEditorMode": 0, + "metricQueryType": 0, }, }, }, @@ -541,24 +585,28 @@ func TestV34(t *testing.T) { "id": 1, "targets": []interface{}{ map[string]interface{}{ - "refId": "A", - "dimensions": map[string]interface{}{"InstanceId": "i-123"}, - "namespace": "AWS/EC2", - "region": "us-east-1", - "metricName": "CPUUtilization", - "statistic": "Average", - "period": "300", - "alias": "CPU Usage", + "refId": "A", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "metricName": "CPUUtilization", + "statistic": "Average", + "period": "300", + "alias": "CPU Usage", + "metricEditorMode": 0, + "metricQueryType": 0, }, map[string]interface{}{ - "refId": "B", - "dimensions": map[string]interface{}{"InstanceId": "i-123"}, - "namespace": "AWS/EC2", - "region": "us-east-1", - "metricName": "CPUUtilization", - "statistic": "Maximum", - "period": "300", - "alias": "CPU Usage", + "refId": "B", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "metricName": "CPUUtilization", + "statistic": "Maximum", + "period": "300", + "alias": "CPU Usage", + "metricEditorMode": 0, + "metricQueryType": 0, }, }, }, @@ -650,36 +698,44 @@ func TestV34(t *testing.T) { "id": 4, "targets": []interface{}{ map[string]interface{}{ - "refId": "C", - "dimensions": map[string]interface{}{"InstanceId": "i-123"}, - "namespace": "AWS/EC2", - "region": "default", - "metricName": "CPUUtilization", - "statistic": "Average", + "refId": "C", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "default", + "metricName": "CPUUtilization", + "statistic": "Average", + "metricEditorMode": 0, + "metricQueryType": 0, }, map[string]interface{}{ - "refId": "B", - "dimensions": map[string]interface{}{"InstanceId": "i-123"}, - "namespace": "AWS/EC2", - "region": "us-east-2", - "metricName": "CPUUtilization", - "statistic": "Sum", + "refId": "B", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-2", + "metricName": "CPUUtilization", + "statistic": "Sum", + "metricEditorMode": 0, + "metricQueryType": 0, }, map[string]interface{}{ - "refId": "A", - "dimensions": map[string]interface{}{"InstanceId": "i-123"}, - "namespace": "AWS/EC2", - "region": "default", - "metricName": "CPUUtilization", - "statistic": "Minimum", + "refId": "A", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "default", + "metricName": "CPUUtilization", + "statistic": "Minimum", + "metricEditorMode": 0, + "metricQueryType": 0, }, map[string]interface{}{ - "refId": "D", - "dimensions": map[string]interface{}{"InstanceId": "i-123"}, - "namespace": "AWS/EC2", - "region": "default", - "metricName": "CPUUtilization", - "statistic": "p12.21", + "refId": "D", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "default", + "metricName": "CPUUtilization", + "statistic": "p12.21", + "metricEditorMode": 0, + "metricQueryType": 0, }, }, }, @@ -687,20 +743,24 @@ func TestV34(t *testing.T) { "id": 5, "targets": []interface{}{ map[string]interface{}{ - "refId": "A", - "dimensions": map[string]interface{}{"InstanceId": "i-456"}, - "namespace": "AWS/EC2", - "region": "us-west-1", - "metricName": "NetworkIn", - "statistic": "Sum", + "refId": "A", + "dimensions": map[string]interface{}{"InstanceId": "i-456"}, + "namespace": "AWS/EC2", + "region": "us-west-1", + "metricName": "NetworkIn", + "statistic": "Sum", + "metricEditorMode": 0, + "metricQueryType": 0, }, map[string]interface{}{ - "refId": "B", - "dimensions": map[string]interface{}{"InstanceId": "i-456"}, - "namespace": "AWS/EC2", - "region": "us-west-1", - "metricName": "NetworkIn", - "statistic": "Min", + "refId": "B", + "dimensions": map[string]interface{}{"InstanceId": "i-456"}, + "namespace": "AWS/EC2", + "region": "us-west-1", + "metricName": "NetworkIn", + "statistic": "Min", + "metricEditorMode": 0, + "metricQueryType": 0, }, }, }, @@ -709,6 +769,64 @@ func TestV34(t *testing.T) { }, }, }, + { + name: "preserves existing metricEditorMode and metricQueryType values", + input: map[string]interface{}{ + "panels": []interface{}{ + map[string]interface{}{ + "id": 1, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "metricName": "CPUUtilization", + "statistics": []interface{}{"Average", "Maximum"}, + "metricEditorMode": 1, + "metricQueryType": 1, + "period": "300", + "alias": "CPU Usage", + }, + }, + }, + }, + }, + expected: map[string]interface{}{ + "schemaVersion": int(34), + "panels": []interface{}{ + map[string]interface{}{ + "id": 1, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "metricName": "CPUUtilization", + "statistic": "Average", + "period": "300", + "alias": "CPU Usage", + "metricEditorMode": 1, + "metricQueryType": 1, + }, + map[string]interface{}{ + "refId": "B", + "dimensions": map[string]interface{}{"InstanceId": "i-123"}, + "namespace": "AWS/EC2", + "region": "us-east-1", + "metricName": "CPUUtilization", + "statistic": "Maximum", + "period": "300", + "alias": "CPU Usage", + "metricEditorMode": 1, + "metricQueryType": 1, + }, + }, + }, + }, + }, + }, } runMigrationTests(t, tests, schemaversion.V34) } diff --git a/apps/dashboard/pkg/migration/schemaversion/v36.go b/apps/dashboard/pkg/migration/schemaversion/v36.go index c02c2c058c7..5c8b3c8f592 100644 --- a/apps/dashboard/pkg/migration/schemaversion/v36.go +++ b/apps/dashboard/pkg/migration/schemaversion/v36.go @@ -1,8 +1,77 @@ package schemaversion -// V36 migrates dashboard datasource references from string names to UIDs. -// This migration converts datasource references in annotations, template variables, and panels -// from the old format (string name or UID) to the new format (object with uid, type, apiVersion). +// V36 migrates dashboard datasource references from legacy string format to structured UID-based objects. +// +// This migration addresses a critical evolution in Grafana's datasource architecture where datasource +// identification shifted from potentially ambiguous display names to reliable UIDs. The original format +// used string references that could break when datasources were renamed, moved between organizations, +// or when multiple datasources shared similar names. This created reliability and portability issues +// for dashboard sharing and automation workflows. +// +// The migration works by: +// 1. Processing annotations, template variables, and panels (including nested panels in rows) +// 2. Converting string datasource references to structured objects containing uid, type, and apiVersion +// 3. Handling null/missing datasource references by setting appropriate defaults +// 4. Maintaining consistency between panel and target datasource configurations +// 5. Preserving special datasource types like Mixed datasources and expression queries +// +// This transformation provides several critical benefits: +// - Eliminates datasource reference breakage when datasources are renamed +// - Enables reliable dashboard export/import across different Grafana instances +// - Supports advanced datasource features that require type and version information +// - Prepares the schema for future datasource management enhancements +// - Maintains backward compatibility while establishing a robust foundation +// +// The migration handles complex scenarios including: +// - Panels with missing datasource configuration (set to default) +// - Mixed datasource panels with heterogeneous targets +// - Expression queries that reference other queries +// - Template variables that depend on datasource queries +// - Annotation queries from various datasource types +// +// Example transformations: +// +// Before migration (string reference): +// +// datasource: "prometheus-prod" +// // or +// datasource: null +// +// After migration (structured object): +// +// datasource: { +// uid: "prometheus-uid-123", +// type: "prometheus", +// apiVersion: "v1" +// } +// +// Before migration (panel with targets): +// +// panel: { +// datasource: "CloudWatch", +// targets: [{ +// datasource: null, +// refId: "A" +// }] +// } +// +// After migration (consistent references): +// +// panel: { +// datasource: { +// uid: "cloudwatch-uid-456", +// type: "cloudwatch", +// apiVersion: "v1" +// }, +// targets: [{ +// datasource: { +// uid: "cloudwatch-uid-456", +// type: "cloudwatch", +// apiVersion: "v1" +// }, +// refId: "A" +// }] +// } func V36(dsInfo DataSourceInfoProvider) SchemaVersionMigrationFunc { datasources := dsInfo.GetDataSourceInfo() return func(dashboard map[string]interface{}) error { @@ -34,11 +103,8 @@ func migrateAnnotations(dashboard map[string]interface{}, datasources []DataSour continue } - ds, exists := queryMap["datasource"] - if !exists { - continue - } - + // Always migrate datasource, even if it doesn't exist (will be set to default) + ds := queryMap["datasource"] queryMap["datasource"] = MigrateDatasourceNameToRef(ds, map[string]bool{"returnDefaultAsNull": false}, datasources) } } @@ -55,6 +121,7 @@ func migrateTemplateVariables(dashboard map[string]interface{}, datasources []Da return } + defaultDS := GetDefaultDSInstanceSettings(datasources) for _, variable := range list { varMap, ok := variable.(map[string]interface{}) if !ok { @@ -67,11 +134,12 @@ func migrateTemplateVariables(dashboard map[string]interface{}, datasources []Da } ds, exists := varMap["datasource"] - if !exists { - continue + // Handle null datasource variables by setting to default + if !exists || ds == nil { + varMap["datasource"] = GetDataSourceRef(defaultDS) + } else { + varMap["datasource"] = MigrateDatasourceNameToRef(ds, map[string]bool{"returnDefaultAsNull": false}, datasources) } - - varMap["datasource"] = MigrateDatasourceNameToRef(ds, map[string]bool{"returnDefaultAsNull": false}, datasources) } } @@ -88,30 +156,68 @@ func migratePanels(dashboard map[string]interface{}, datasources []DataSourceInf continue } migratePanelDatasources(panelMap, datasources) + + // Handle nested panels in collapsed rows + nestedPanels, hasNested := panelMap["panels"].([]interface{}) + if !hasNested { + continue + } + + for _, nestedPanel := range nestedPanels { + np, ok := nestedPanel.(map[string]interface{}) + if !ok { + continue + } + migratePanelDatasources(np, datasources) + } } } // migratePanelDatasources updates datasource references in a single panel and its targets func migratePanelDatasources(panelMap map[string]interface{}, datasources []DataSourceInfo) { - targets, hasTargets := panelMap["targets"].([]interface{}) - if !hasTargets || len(targets) == 0 { - return - } + // NOTE: Even though row panels don't technically need datasource or targets fields, + // we process them anyway to exactly match frontend behavior and avoid inconsistencies + // between frontend and backend migrations. The frontend DashboardMigrator processes + // all panels uniformly without special row panel handling. + defaultDS := GetDefaultDSInstanceSettings(datasources) panelDataSourceWasDefault := false + // Handle targets - treat empty arrays same as missing targets (matches frontend behavior) + targets, hasTargets := panelMap["targets"].([]interface{}) + if !hasTargets || len(targets) == 0 { + targets = []interface{}{ + map[string]interface{}{ + "refId": "A", + }, + } + panelMap["targets"] = targets + hasTargets = true + } + // Handle panel datasource - if ds, exists := panelMap["datasource"]; exists { - if ds == nil { - defaultDS := GetDefaultDSInstanceSettings(datasources) + ds, exists := panelMap["datasource"] + if !exists || ds == nil { + // Set to default if panel has targets (matches frontend logic) + panelMap["datasource"] = GetDataSourceRef(defaultDS) + panelDataSourceWasDefault = true + } else { + // Migrate existing non-null datasource (should be null after V33) + migrated := MigrateDatasourceNameToRef(ds, map[string]bool{"returnDefaultAsNull": true}, datasources) + if migrated == nil { + // If migration returned nil, set to default panelMap["datasource"] = GetDataSourceRef(defaultDS) panelDataSourceWasDefault = true } else { - panelMap["datasource"] = MigrateDatasourceNameToRef(ds, map[string]bool{"returnDefaultAsNull": true}, datasources) + panelMap["datasource"] = migrated } } // Handle target datasources + if !hasTargets { + return + } + for _, target := range targets { targetMap, ok := target.(map[string]interface{}) if !ok { @@ -120,48 +226,43 @@ func migratePanelDatasources(panelMap map[string]interface{}, datasources []Data ds, exists := targetMap["datasource"] - // Check if target datasource is null or has no uid - isNullOrNoUID := !exists || ds == nil - if !isNullOrNoUID { - dsMap, ok := ds.(map[string]interface{}) - if ok { - uid, hasUID := dsMap["uid"] - if !hasUID || uid == nil { - isNullOrNoUID = true - } + // Check if target datasource is null, missing, or has no uid + needsDefault := false + if !exists || ds == nil { + needsDefault = true + } else if dsMap, ok := ds.(map[string]interface{}); ok { + uid, hasUID := dsMap["uid"] + if !hasUID || uid == nil { + needsDefault = true } } - if isNullOrNoUID { - // If panel doesn't have mixed datasource, use panel's datasource + if needsDefault { + // Use panel's datasource if it's not mixed panelDS, ok := panelMap["datasource"].(map[string]interface{}) - if !ok { - continue - } - - uid, hasUID := panelDS["uid"].(string) - if hasUID && uid != "-- Mixed --" { - targetMap["datasource"] = panelDS + if ok { + uid, hasUID := panelDS["uid"].(string) + if hasUID && uid != "-- Mixed --" { + targetMap["datasource"] = panelDS + } else { + // If panel is mixed, migrate target datasource independently + targetMap["datasource"] = MigrateDatasourceNameToRef(ds, map[string]bool{"returnDefaultAsNull": false}, datasources) + } } } else { // Migrate existing target datasource - targetDS := MigrateDatasourceNameToRef(ds, map[string]bool{"returnDefaultAsNull": false}, datasources) - targetMap["datasource"] = targetDS + targetMap["datasource"] = MigrateDatasourceNameToRef(ds, map[string]bool{"returnDefaultAsNull": false}, datasources) } // Update panel datasource if it was default and target is not an expression - if !panelDataSourceWasDefault { - continue - } - - targetDS, ok := targetMap["datasource"].(map[string]interface{}) - if !ok { - continue - } - - uid, ok := targetDS["uid"].(string) - if ok && uid != "__expr__" { - panelMap["datasource"] = targetDS + if panelDataSourceWasDefault { + targetDS, ok := targetMap["datasource"].(map[string]interface{}) + if ok { + uid, ok := targetDS["uid"].(string) + if ok && uid != "__expr__" { + panelMap["datasource"] = targetDS + } + } } } } diff --git a/apps/dashboard/pkg/migration/schemaversion/v36_test.go b/apps/dashboard/pkg/migration/schemaversion/v36_test.go index d97ec5f761d..7bc4b5cba80 100644 --- a/apps/dashboard/pkg/migration/schemaversion/v36_test.go +++ b/apps/dashboard/pkg/migration/schemaversion/v36_test.go @@ -22,14 +22,16 @@ func TestV36(t *testing.T) { }, }, { - name: "panel with null datasource should get default datasource", + name: "panel with null datasource and targets should get default datasource", input: map[string]interface{}{ "schemaVersion": 35, "panels": []interface{}{ map[string]interface{}{ "datasource": nil, "targets": []interface{}{ - map[string]interface{}{}, + map[string]interface{}{ + "refId": "A", + }, }, }, }, @@ -40,14 +42,86 @@ func TestV36(t *testing.T) { map[string]interface{}{ "datasource": map[string]interface{}{ "type": "prometheus", - "uid": "default-ds", + "uid": "default-ds-uid", "apiVersion": "v1", }, "targets": []interface{}{ map[string]interface{}{ + "refId": "A", "datasource": map[string]interface{}{ "type": "prometheus", - "uid": "default-ds", + "uid": "default-ds-uid", + "apiVersion": "v1", + }, + }, + }, + }, + }, + }, + }, + { + name: "panel with null datasource and empty targets array should get default datasource and targets", + input: map[string]interface{}{ + "schemaVersion": 35, + "panels": []interface{}{ + map[string]interface{}{ + "id": 2, + "datasource": nil, + "targets": []interface{}{}, + }, + }, + }, + expected: map[string]interface{}{ + "schemaVersion": 36, + "panels": []interface{}{ + map[string]interface{}{ + "id": 2, + "datasource": map[string]interface{}{ + "type": "prometheus", + "uid": "default-ds-uid", + "apiVersion": "v1", + }, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": map[string]interface{}{ + "type": "prometheus", + "uid": "default-ds-uid", + "apiVersion": "v1", + }, + }, + }, + }, + }, + }, + }, + { + name: "panel with null datasource and no targets property should get default datasource and targets", + input: map[string]interface{}{ + "schemaVersion": 35, + "panels": []interface{}{ + map[string]interface{}{ + "id": 3, + "datasource": nil, + }, + }, + }, + expected: map[string]interface{}{ + "schemaVersion": 36, + "panels": []interface{}{ + map[string]interface{}{ + "id": 3, + "datasource": map[string]interface{}{ + "type": "prometheus", + "uid": "default-ds-uid", + "apiVersion": "v1", + }, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": map[string]interface{}{ + "type": "prometheus", + "uid": "default-ds-uid", "apiVersion": "v1", }, }, @@ -67,10 +141,12 @@ func TestV36(t *testing.T) { }, "targets": []interface{}{ map[string]interface{}{ - "datasource": "Elasticsearch", + "refId": "A", + "datasource": "existing-target-uid", }, map[string]interface{}{ - "datasource": "other-ds", + "refId": "B", + "datasource": "existing-ref-uid", }, }, }, @@ -85,17 +161,19 @@ func TestV36(t *testing.T) { }, "targets": []interface{}{ map[string]interface{}{ + "refId": "A", "datasource": map[string]interface{}{ "type": "elasticsearch", - "uid": "other-ds", + "uid": "existing-target-uid", "apiVersion": "v2", }, }, map[string]interface{}{ + "refId": "B", "datasource": map[string]interface{}{ - "type": "elasticsearch", - "uid": "other-ds", - "apiVersion": "v2", + "type": "prometheus", + "uid": "existing-ref-uid", + "apiVersion": "v1", }, }, }, @@ -109,12 +187,14 @@ func TestV36(t *testing.T) { "schemaVersion": 35, "panels": []interface{}{ map[string]interface{}{ - "datasource": "Default", + "datasource": "existing-ref-uid", "targets": []interface{}{ map[string]interface{}{ + "refId": "A", "datasource": nil, }, map[string]interface{}{ + "refId": "B", "datasource": map[string]interface{}{ "uid": nil, }, @@ -129,21 +209,23 @@ func TestV36(t *testing.T) { map[string]interface{}{ "datasource": map[string]interface{}{ "type": "prometheus", - "uid": "default-ds", + "uid": "existing-ref-uid", "apiVersion": "v1", }, "targets": []interface{}{ map[string]interface{}{ + "refId": "A", "datasource": map[string]interface{}{ "type": "prometheus", - "uid": "default-ds", + "uid": "existing-ref-uid", "apiVersion": "v1", }, }, map[string]interface{}{ + "refId": "B", "datasource": map[string]interface{}{ "type": "prometheus", - "uid": "default-ds", + "uid": "existing-ref-uid", "apiVersion": "v1", }, }, @@ -153,13 +235,221 @@ func TestV36(t *testing.T) { }, }, { - name: "dashboard with annotations using default datasource", + name: "panel with null datasource should inherit from target datasource (panelDataSourceWasDefault logic)", + input: map[string]interface{}{ + "schemaVersion": 35, + "panels": []interface{}{ + map[string]interface{}{ + "datasource": nil, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": "existing-target-uid", + }, + }, + }, + }, + }, + expected: map[string]interface{}{ + "schemaVersion": 36, + "panels": []interface{}{ + map[string]interface{}{ + "datasource": map[string]interface{}{ + "type": "elasticsearch", + "uid": "existing-target-uid", + "apiVersion": "v2", + }, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": map[string]interface{}{ + "type": "elasticsearch", + "uid": "existing-target-uid", + "apiVersion": "v2", + }, + }, + }, + }, + }, + }, + }, + { + name: "panel with expression queries should not inherit panel datasource from expression", + input: map[string]interface{}{ + "schemaVersion": 35, + "panels": []interface{}{ + map[string]interface{}{ + "datasource": nil, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": "existing-target-uid", + }, + map[string]interface{}{ + "refId": "B", + "datasource": map[string]interface{}{ + "uid": "__expr__", + "type": "__expr__", + }, + }, + }, + }, + }, + }, + expected: map[string]interface{}{ + "schemaVersion": 36, + "panels": []interface{}{ + map[string]interface{}{ + "datasource": map[string]interface{}{ + "type": "elasticsearch", + "uid": "existing-target-uid", + "apiVersion": "v2", + }, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": map[string]interface{}{ + "type": "elasticsearch", + "uid": "existing-target-uid", + "apiVersion": "v2", + }, + }, + map[string]interface{}{ + "refId": "B", + "datasource": map[string]interface{}{ + "uid": "__expr__", + "type": "__expr__", + }, + }, + }, + }, + }, + }, + }, + { + name: "panel with unknown datasource name should preserve as UID", + input: map[string]interface{}{ + "schemaVersion": 35, + "panels": []interface{}{ + map[string]interface{}{ + "datasource": "unknown-datasource", + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": "another-unknown-ds", + }, + }, + }, + }, + }, + expected: map[string]interface{}{ + "schemaVersion": 36, + "panels": []interface{}{ + map[string]interface{}{ + "datasource": map[string]interface{}{ + "uid": "unknown-datasource", + }, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": map[string]interface{}{ + "uid": "another-unknown-ds", + }, + }, + }, + }, + }, + }, + }, + { + name: "nested panels in collapsed row should be migrated", + input: map[string]interface{}{ + "schemaVersion": 35, + "panels": []interface{}{ + map[string]interface{}{ + "type": "row", + "panels": []interface{}{ + map[string]interface{}{ + "datasource": "existing-ref-uid", + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": nil, + }, + }, + }, + }, + }, + }, + }, + expected: map[string]interface{}{ + "schemaVersion": 36, + "panels": []interface{}{ + map[string]interface{}{ + "type": "row", + "datasource": map[string]interface{}{ + "type": "prometheus", + "uid": "default-ds-uid", + "apiVersion": "v1", + }, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": map[string]interface{}{ + "type": "prometheus", + "uid": "default-ds-uid", + "apiVersion": "v1", + }, + }, + }, + "panels": []interface{}{ + map[string]interface{}{ + "datasource": map[string]interface{}{ + "type": "prometheus", + "uid": "existing-ref-uid", + "apiVersion": "v1", + }, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": map[string]interface{}{ + "type": "prometheus", + "uid": "existing-ref-uid", + "apiVersion": "v1", + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "annotations should migrate datasource references with returnDefaultAsNull: false", input: map[string]interface{}{ "schemaVersion": 35, "annotations": map[string]interface{}{ "list": []interface{}{ map[string]interface{}{ - "datasource": "Default", + "name": "Default Annotation", + "datasource": "default", + }, + map[string]interface{}{ + "name": "Named Datasource Annotation", + "datasource": "Existing Target Name", + }, + map[string]interface{}{ + "name": "UID Datasource Annotation", + "datasource": "existing-target-uid", + }, + map[string]interface{}{ + "name": "Null Datasource Annotation", + "datasource": nil, + }, + map[string]interface{}{ + "name": "Unknown Datasource Annotation", + "datasource": "unknown-ds", }, }, }, @@ -169,343 +459,353 @@ func TestV36(t *testing.T) { "annotations": map[string]interface{}{ "list": []interface{}{ map[string]interface{}{ + "name": "Default Annotation", "datasource": map[string]interface{}{ "type": "prometheus", - "uid": "default-ds", + "uid": "default-ds-uid", "apiVersion": "v1", }, }, - }, - }, - }, - }, - { - name: "dashboard with annotations using non-default datasource by UID", - input: map[string]interface{}{ - "schemaVersion": 35, - "annotations": map[string]interface{}{ - "list": []interface{}{ - map[string]interface{}{ - "datasource": "other-ds", - }, - }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 36, - "annotations": map[string]interface{}{ - "list": []interface{}{ map[string]interface{}{ + "name": "Named Datasource Annotation", "datasource": map[string]interface{}{ "type": "elasticsearch", - "uid": "other-ds", + "uid": "existing-target-uid", "apiVersion": "v2", }, }, + map[string]interface{}{ + "name": "UID Datasource Annotation", + "datasource": map[string]interface{}{ + "type": "elasticsearch", + "uid": "existing-target-uid", + "apiVersion": "v2", + }, + }, + map[string]interface{}{ + "name": "Null Datasource Annotation", + "datasource": map[string]interface{}{ + "type": "prometheus", + "uid": "default-ds-uid", + "apiVersion": "v1", + }, + }, + map[string]interface{}{ + "name": "Unknown Datasource Annotation", + "datasource": map[string]interface{}{ + "uid": "unknown-ds", + }, + }, }, }, }, }, { - name: "dashboard with annotations using non-default datasource by name", - input: map[string]interface{}{ - "schemaVersion": 35, - "annotations": map[string]interface{}{ - "list": []interface{}{ - map[string]interface{}{ - "datasource": "Elasticsearch", - }, - }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 36, - "annotations": map[string]interface{}{ - "list": []interface{}{ - map[string]interface{}{ - "datasource": map[string]interface{}{ - "type": "elasticsearch", - "uid": "other-ds", - "apiVersion": "v2", - }, - }, - }, - }, - }, - }, - { - name: "dashboard with template variables using default datasource", + name: "template variables should migrate query variables only", input: map[string]interface{}{ "schemaVersion": 35, "templating": map[string]interface{}{ "list": []interface{}{ map[string]interface{}{ "type": "query", + "name": "query_var_null", + "datasource": nil, + }, + map[string]interface{}{ + "type": "query", + "name": "query_var_named", + "datasource": "Existing Target Name", + }, + map[string]interface{}{ + "type": "query", + "name": "query_var_uid", + "datasource": "existing-target-uid", + }, + map[string]interface{}{ + "type": "constant", + "name": "non_query_var", + "datasource": nil, + }, + map[string]interface{}{ + "type": "query", + "name": "query_var_unknown", + "datasource": "unknown-ds", + }, + }, + }, + }, + expected: map[string]interface{}{ + "schemaVersion": 36, + "templating": map[string]interface{}{ + "list": []interface{}{ + map[string]interface{}{ + "type": "query", + "name": "query_var_null", + "datasource": map[string]interface{}{ + "type": "prometheus", + "uid": "default-ds-uid", + "apiVersion": "v1", + }, + }, + map[string]interface{}{ + "type": "query", + "name": "query_var_named", + "datasource": map[string]interface{}{ + "type": "elasticsearch", + "uid": "existing-target-uid", + "apiVersion": "v2", + }, + }, + map[string]interface{}{ + "type": "query", + "name": "query_var_uid", + "datasource": map[string]interface{}{ + "type": "elasticsearch", + "uid": "existing-target-uid", + "apiVersion": "v2", + }, + }, + map[string]interface{}{ + "type": "constant", + "name": "non_query_var", + "datasource": nil, + }, + map[string]interface{}{ + "type": "query", + "name": "query_var_unknown", + "datasource": map[string]interface{}{ + "uid": "unknown-ds", + }, + }, + }, + }, + }, + }, + { + name: "comprehensive migration scenario matching integration test structure", + input: map[string]interface{}{ + "schemaVersion": 35, + "title": "Datasource Reference Migration Test Dashboard", + "annotations": map[string]interface{}{ + "list": []interface{}{ + map[string]interface{}{ + "name": "Default Annotation", + "datasource": "default", + }, + map[string]interface{}{ + "name": "Named Datasource Annotation", + "datasource": "Existing Target Name", + }, + map[string]interface{}{ + "name": "UID Datasource Annotation", + "datasource": "existing-target-uid", + }, + map[string]interface{}{ + "name": "Null Datasource Annotation", "datasource": nil, }, }, }, - }, - expected: map[string]interface{}{ - "schemaVersion": 36, "templating": map[string]interface{}{ "list": []interface{}{ map[string]interface{}{ - "type": "query", + "name": "query_var_null", + "type": "query", + "datasource": nil, + }, + map[string]interface{}{ + "name": "query_var_named", + "type": "query", + "datasource": "Existing Target Name", + }, + map[string]interface{}{ + "name": "query_var_uid", + "type": "query", + "datasource": "existing-target-uid", + }, + map[string]interface{}{ + "name": "non_query_var", + "type": "constant", + "datasource": nil, + }, + }, + }, + "panels": []interface{}{ + map[string]interface{}{ + "id": 1, + "title": "Panel with Null Datasource and Targets", + "datasource": nil, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": nil, + }, + }, + }, + map[string]interface{}{ + "id": 2, + "title": "Panel with Null Datasource and Empty Targets", + "datasource": nil, + "targets": []interface{}{}, + }, + map[string]interface{}{ + "id": 3, + "title": "Panel with No Targets Array", + "datasource": nil, + }, + map[string]interface{}{ + "id": 4, + "title": "Panel with Mixed Datasources", + "datasource": map[string]interface{}{ + "uid": "-- Mixed --", + }, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": nil, + }, + map[string]interface{}{ + "refId": "B", + "datasource": map[string]interface{}{ + "uid": "existing-target-uid", + }, + }, + }, + }, + map[string]interface{}{ + "id": 5, + "title": "Panel with Existing Object Datasource", + "datasource": map[string]interface{}{ + "uid": "existing-ref", + "type": "prometheus", + }, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": map[string]interface{}{ + "uid": "existing-target-uid", + "type": "loki", + }, + }, + }, + }, + map[string]interface{}{ + "id": 7, + "title": "Panel with Expression Query", + "datasource": nil, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": map[string]interface{}{ + "uid": "existing-target-uid", + }, + }, + map[string]interface{}{ + "refId": "B", + "datasource": map[string]interface{}{ + "uid": "__expr__", + "type": "__expr__", + }, + }, + }, + }, + map[string]interface{}{ + "id": 8, + "title": "Panel Inheriting from Target", + "datasource": nil, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": map[string]interface{}{ + "uid": "existing-target-uid", + }, + }, + }, + }, + }, + }, + expected: map[string]interface{}{ + "schemaVersion": 36, + "title": "Datasource Reference Migration Test Dashboard", + "annotations": map[string]interface{}{ + "list": []interface{}{ + map[string]interface{}{ + "name": "Default Annotation", "datasource": map[string]interface{}{ "type": "prometheus", - "uid": "default-ds", + "uid": "default-ds-uid", + "apiVersion": "v1", + }, + }, + map[string]interface{}{ + "name": "Named Datasource Annotation", + "datasource": map[string]interface{}{ + "type": "elasticsearch", + "uid": "existing-target-uid", + "apiVersion": "v2", + }, + }, + map[string]interface{}{ + "name": "UID Datasource Annotation", + "datasource": map[string]interface{}{ + "type": "elasticsearch", + "uid": "existing-target-uid", + "apiVersion": "v2", + }, + }, + map[string]interface{}{ + "name": "Null Datasource Annotation", + "datasource": map[string]interface{}{ + "type": "prometheus", + "uid": "default-ds-uid", "apiVersion": "v1", }, }, }, }, - }, - }, - { - name: "dashboard with template variables using non-default datasource by UID", - input: map[string]interface{}{ - "schemaVersion": 35, "templating": map[string]interface{}{ "list": []interface{}{ map[string]interface{}{ - "type": "query", - "datasource": "other-ds", + "name": "query_var_null", + "type": "query", + "datasource": map[string]interface{}{ + "type": "prometheus", + "uid": "default-ds-uid", + "apiVersion": "v1", + }, }, - }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 36, - "templating": map[string]interface{}{ - "list": []interface{}{ map[string]interface{}{ + "name": "query_var_named", "type": "query", "datasource": map[string]interface{}{ "type": "elasticsearch", - "uid": "other-ds", + "uid": "existing-target-uid", "apiVersion": "v2", }, }, - }, - }, - }, - }, - { - name: "dashboard with template variables using non-default datasource by name", - input: map[string]interface{}{ - "schemaVersion": 35, - "templating": map[string]interface{}{ - "list": []interface{}{ - map[string]interface{}{ - "type": "query", - "datasource": "Elasticsearch", - }, - }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 36, - "templating": map[string]interface{}{ - "list": []interface{}{ map[string]interface{}{ + "name": "query_var_uid", "type": "query", "datasource": map[string]interface{}{ "type": "elasticsearch", - "uid": "other-ds", + "uid": "existing-target-uid", "apiVersion": "v2", }, }, - }, - }, - }, - }, - { - name: "dashboard with panels using default datasource", - input: map[string]interface{}{ - "schemaVersion": 35, - "panels": []interface{}{ - map[string]interface{}{ - "datasource": "Default", - "targets": []interface{}{ - map[string]interface{}{ - "datasource": "Default", - }, + map[string]interface{}{ + "name": "non_query_var", + "type": "constant", + "datasource": nil, }, }, }, - }, - expected: map[string]interface{}{ - "schemaVersion": 36, "panels": []interface{}{ map[string]interface{}{ + "id": 1, + "title": "Panel with Null Datasource and Targets", "datasource": map[string]interface{}{ "type": "prometheus", - "uid": "default-ds", - "apiVersion": "v1", - }, - "targets": []interface{}{ - map[string]interface{}{ - "datasource": map[string]interface{}{ - "type": "prometheus", - "uid": "default-ds", - "apiVersion": "v1", - }, - }, - }, - }, - }, - }, - }, - { - name: "dashboard with panels using non-default datasource by UID", - input: map[string]interface{}{ - "schemaVersion": 35, - "panels": []interface{}{ - map[string]interface{}{ - "datasource": "other-ds", - "targets": []interface{}{ - map[string]interface{}{ - "datasource": "other-ds", - }, - }, - }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 36, - "panels": []interface{}{ - map[string]interface{}{ - "datasource": map[string]interface{}{ - "type": "elasticsearch", - "uid": "other-ds", - "apiVersion": "v2", - }, - "targets": []interface{}{ - map[string]interface{}{ - "datasource": map[string]interface{}{ - "type": "elasticsearch", - "uid": "other-ds", - "apiVersion": "v2", - }, - }, - }, - }, - }, - }, - }, - { - name: "dashboard with panels using non-default datasource by name", - input: map[string]interface{}{ - "schemaVersion": 35, - "panels": []interface{}{ - map[string]interface{}{ - "datasource": "Elasticsearch", - "targets": []interface{}{ - map[string]interface{}{ - "datasource": "Elasticsearch", - }, - }, - }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 36, - "panels": []interface{}{ - map[string]interface{}{ - "datasource": map[string]interface{}{ - "type": "elasticsearch", - "uid": "other-ds", - "apiVersion": "v2", - }, - "targets": []interface{}{ - map[string]interface{}{ - "datasource": map[string]interface{}{ - "type": "elasticsearch", - "uid": "other-ds", - "apiVersion": "v2", - }, - }, - }, - }, - }, - }, - }, - { - name: "dashboard with mixed panel and target datasources", - input: map[string]interface{}{ - "schemaVersion": 35, - "panels": []interface{}{ - map[string]interface{}{ - "datasource": "Default", - "targets": []interface{}{ - map[string]interface{}{ - "datasource": "Elasticsearch", - }, - map[string]interface{}{ - "datasource": "other-ds", - }, - }, - }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 36, - "panels": []interface{}{ - map[string]interface{}{ - "datasource": map[string]interface{}{ - "type": "prometheus", - "uid": "default-ds", - "apiVersion": "v1", - }, - "targets": []interface{}{ - map[string]interface{}{ - "datasource": map[string]interface{}{ - "type": "elasticsearch", - "uid": "other-ds", - "apiVersion": "v2", - }, - }, - map[string]interface{}{ - "datasource": map[string]interface{}{ - "type": "elasticsearch", - "uid": "other-ds", - "apiVersion": "v2", - }, - }, - }, - }, - }, - }, - }, - { - name: "panel with null datasource and expression queries should get default datasource", - input: map[string]interface{}{ - "schemaVersion": 35, - "panels": []interface{}{ - map[string]interface{}{ - "datasource": nil, - "targets": []interface{}{ - map[string]interface{}{ - "refId": "A", - }, - map[string]interface{}{ - "refId": "B", - "datasource": map[string]interface{}{ - "uid": "__expr__", - }, - }, - }, - }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 36, - "panels": []interface{}{ - map[string]interface{}{ - "datasource": map[string]interface{}{ - "type": "prometheus", - "uid": "default-ds", + "uid": "default-ds-uid", "apiVersion": "v1", }, "targets": []interface{}{ @@ -513,51 +813,123 @@ func TestV36(t *testing.T) { "refId": "A", "datasource": map[string]interface{}{ "type": "prometheus", - "uid": "default-ds", + "uid": "default-ds-uid", + "apiVersion": "v1", + }, + }, + }, + }, + map[string]interface{}{ + "id": 2, + "title": "Panel with Null Datasource and Empty Targets", + "datasource": map[string]interface{}{ + "type": "prometheus", + "uid": "default-ds-uid", + "apiVersion": "v1", + }, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": map[string]interface{}{ + "type": "prometheus", + "uid": "default-ds-uid", + "apiVersion": "v1", + }, + }, + }, + }, + map[string]interface{}{ + "id": 3, + "title": "Panel with No Targets Array", + "datasource": map[string]interface{}{ + "type": "prometheus", + "uid": "default-ds-uid", + "apiVersion": "v1", + }, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": map[string]interface{}{ + "type": "prometheus", + "uid": "default-ds-uid", + "apiVersion": "v1", + }, + }, + }, + }, + map[string]interface{}{ + "id": 4, + "title": "Panel with Mixed Datasources", + "datasource": map[string]interface{}{ + "uid": "-- Mixed --", + }, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": map[string]interface{}{ + "type": "prometheus", + "uid": "default-ds-uid", "apiVersion": "v1", }, }, map[string]interface{}{ "refId": "B", "datasource": map[string]interface{}{ - "uid": "__expr__", + "uid": "existing-target-uid", }, }, }, }, - }, - }, - }, - { - name: "panel with null datasource should inherit from query datasource", - input: map[string]interface{}{ - "schemaVersion": 35, - "panels": []interface{}{ map[string]interface{}{ - "datasource": nil, + "id": 5, + "title": "Panel with Existing Object Datasource", + "datasource": map[string]interface{}{ + "uid": "existing-ref", + "type": "prometheus", + }, "targets": []interface{}{ map[string]interface{}{ - "datasource": "Elasticsearch", + "refId": "A", + "datasource": map[string]interface{}{ + "uid": "existing-target-uid", + "type": "loki", + }, }, }, }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 36, - "panels": []interface{}{ map[string]interface{}{ + "id": 7, + "title": "Panel with Expression Query", "datasource": map[string]interface{}{ - "type": "elasticsearch", - "uid": "other-ds", - "apiVersion": "v2", + "uid": "existing-target-uid", }, "targets": []interface{}{ map[string]interface{}{ + "refId": "A", "datasource": map[string]interface{}{ - "type": "elasticsearch", - "uid": "other-ds", - "apiVersion": "v2", + "uid": "existing-target-uid", + }, + }, + map[string]interface{}{ + "refId": "B", + "datasource": map[string]interface{}{ + "uid": "__expr__", + "type": "__expr__", + }, + }, + }, + }, + map[string]interface{}{ + "id": 8, + "title": "Panel Inheriting from Target", + "datasource": map[string]interface{}{ + "uid": "existing-target-uid", + }, + "targets": []interface{}{ + map[string]interface{}{ + "refId": "A", + "datasource": map[string]interface{}{ + "uid": "existing-target-uid", }, }, }, diff --git a/apps/dashboard/pkg/migration/schemaversion/v37.go b/apps/dashboard/pkg/migration/schemaversion/v37.go index c040daf842c..684ad8e3d40 100644 --- a/apps/dashboard/pkg/migration/schemaversion/v37.go +++ b/apps/dashboard/pkg/migration/schemaversion/v37.go @@ -1,9 +1,76 @@ package schemaversion -// V37 normalizes legend configuration in panels to use a consistent format: -// - Converts boolean legend values to object format -// - Standardizes hidden legends to use showLegend: false with displayMode: list -// - Ensures visible legends have showLegend: true +// V37 normalizes legend configuration to use `showLegend` property consistently. +// +// This migration addresses inconsistencies in how legend visibility was handled. +// There were two ways to hide the legend: +// 1. Using displayMode: "hidden" +// 2. Using showLegend: false +// +// The migration normalizes both approaches to use showLegend consistently: +// - If displayMode is "hidden" OR showLegend is false, set displayMode to "list" and showLegend to false +// - For all other existing legend objects, ensure showLegend is true +// +// Note: This migration only processes legend configurations that already exist as objects. +// Boolean legend values are not processed by this migration. +// +// Example transformations: +// +// Before migration (hidden displayMode): +// +// options: { +// legend: { +// displayMode: "hidden", +// placement: "bottom" +// } +// } +// +// After migration: +// +// options: { +// legend: { +// displayMode: "list", +// showLegend: false, +// placement: "bottom" +// } +// } +// +// Before migration (showLegend false): +// +// options: { +// legend: { +// displayMode: "table", +// showLegend: false +// } +// } +// +// After migration: +// +// options: { +// legend: { +// displayMode: "list", +// showLegend: false +// } +// } +// +// Before migration (visible legend): +// +// options: { +// legend: { +// displayMode: "table", +// placement: "bottom" +// } +// } +// +// After migration: +// +// options: { +// legend: { +// displayMode: "table", +// placement: "bottom", +// showLegend: true +// } +// } func V37(dashboard map[string]interface{}) error { dashboard["schemaVersion"] = int(37) @@ -12,51 +79,50 @@ func V37(dashboard map[string]interface{}) error { return nil } + // Process all panels, including nested ones + processPanelsV37(panels) + + return nil +} + +// processPanelsV37 recursively processes panels, including nested panels within rows +func processPanelsV37(panels []interface{}) { for _, panel := range panels { p, ok := panel.(map[string]interface{}) if !ok { continue } + // Process nested panels if this is a row panel + if p["type"] == "row" { + if nestedPanels, ok := p["panels"].([]interface{}); ok { + processPanelsV37(nestedPanels) + } + continue + } + options, ok := p["options"].(map[string]interface{}) if !ok { continue } - // Skip if no legend config exists + // Only process legend if it exists and is an object (not boolean) legendValue := options["legend"] - if legendValue == nil { - continue - } - - // Convert boolean legend to object format - if legendBool, ok := legendValue.(bool); ok { - options["legend"] = map[string]interface{}{ - "displayMode": "list", - "showLegend": legendBool, - } - continue - } - - // Handle object format legend legend, ok := legendValue.(map[string]interface{}) - if !ok { + if !ok || legend == nil { continue } - displayMode, hasDisplayMode := legend["displayMode"].(string) + displayMode, _ := legend["displayMode"].(string) showLegend, hasShowLegend := legend["showLegend"].(bool) - // Normalize hidden legends - if (hasDisplayMode && displayMode == "hidden") || (hasShowLegend && !showLegend) { + // If displayMode is "hidden" OR showLegend is false, normalize to hidden legend + if displayMode == "hidden" || (hasShowLegend && !showLegend) { legend["displayMode"] = "list" legend["showLegend"] = false - continue + } else { + // For all other cases, ensure showLegend is true + legend["showLegend"] = true } - - // Ensure visible legends have showLegend true - legend["showLegend"] = true } - - return nil } diff --git a/apps/dashboard/pkg/migration/schemaversion/v37_test.go b/apps/dashboard/pkg/migration/schemaversion/v37_test.go index 71bafee584c..5db1033ea70 100644 --- a/apps/dashboard/pkg/migration/schemaversion/v37_test.go +++ b/apps/dashboard/pkg/migration/schemaversion/v37_test.go @@ -9,96 +9,186 @@ import ( func TestV37(t *testing.T) { tests := []migrationTestCase{ { - name: "no legend config", - input: map[string]interface{}{ - "schemaVersion": 36, - "panels": []interface{}{ - map[string]interface{}{ - "type": "graph", - "options": map[string]interface{}{}, - }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 37, - "panels": []interface{}{ - map[string]interface{}{ - "type": "graph", - "options": map[string]interface{}{}, - }, - }, - }, - }, - { - name: "boolean legend true", + name: "legend normalization with nested panels", input: map[string]interface{}{ + "title": "V37 Legend Normalization Test Dashboard", "schemaVersion": 36, "panels": []interface{}{ + // Boolean legend true (should remain unchanged) map[string]interface{}{ + "type": "timeseries", + "title": "Panel with Boolean Legend True", + "id": 1, "options": map[string]interface{}{ "legend": true, }, }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 37, - "panels": []interface{}{ - map[string]interface{}{ - "options": map[string]interface{}{ - "legend": map[string]interface{}{ - "displayMode": "list", - "showLegend": true, - }, - }, - }, - }, - }, - }, - { - name: "boolean legend false", - input: map[string]interface{}{ - "schemaVersion": 36, - "panels": []interface{}{ + // Boolean legend false (should remain unchanged) map[string]interface{}{ + "type": "timeseries", + "title": "Panel with Boolean Legend False", + "id": 2, "options": map[string]interface{}{ "legend": false, }, }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 37, - "panels": []interface{}{ - map[string]interface{}{ - "options": map[string]interface{}{ - "legend": map[string]interface{}{ - "displayMode": "list", - "showLegend": false, - }, - }, - }, - }, - }, - }, - { - name: "hidden displayMode", - input: map[string]interface{}{ - "schemaVersion": 36, - "panels": []interface{}{ + // Hidden displayMode (should be normalized) map[string]interface{}{ + "type": "graph", + "title": "Panel with Hidden DisplayMode", + "id": 3, "options": map[string]interface{}{ "legend": map[string]interface{}{ "displayMode": "hidden", + "placement": "bottom", + }, + }, + }, + // ShowLegend false (should be normalized) + map[string]interface{}{ + "type": "stat", + "title": "Panel with ShowLegend False", + "id": 4, + "options": map[string]interface{}{ + "legend": map[string]interface{}{ + "displayMode": "table", + "showLegend": false, + }, + }, + }, + // Valid legend with table displayMode (should get showLegend: true) + map[string]interface{}{ + "type": "barchart", + "title": "Panel with Table Legend", + "id": 5, + "options": map[string]interface{}{ + "legend": map[string]interface{}{ + "displayMode": "table", + "placement": "bottom", + }, + }, + }, + // Valid legend with list displayMode (should get showLegend: true) + map[string]interface{}{ + "type": "histogram", + "title": "Panel with List Legend", + "id": 6, + "options": map[string]interface{}{ + "legend": map[string]interface{}{ + "displayMode": "list", + "placement": "right", + }, + }, + }, + // Panel with no options (should remain unchanged) + map[string]interface{}{ + "type": "text", + "title": "Panel with No Options", + "id": 7, + }, + // Panel with no legend config (should remain unchanged) + map[string]interface{}{ + "type": "gauge", + "title": "Panel with No Legend Config", + "id": 8, + "options": map[string]interface{}{ + "reduceOptions": map[string]interface{}{ + "fields": "/.*temperature.*/", + }, + }, + }, + // Panel with nil legend (should remain unchanged) + map[string]interface{}{ + "type": "piechart", + "title": "Panel with Nil Legend", + "id": 9, + "options": map[string]interface{}{ + "legend": nil, + }, + }, + // Row with nested panels + map[string]interface{}{ + "type": "row", + "title": "Row with Nested Panels Having Various Legend Configs", + "id": 10, + "collapsed": false, + "panels": []interface{}{ + // Nested panel with boolean legend (should remain unchanged) + map[string]interface{}{ + "type": "timeseries", + "title": "Nested Panel with Boolean Legend", + "id": 11, + "options": map[string]interface{}{ + "legend": true, + }, + }, + // Nested panel with hidden displayMode (should be normalized) + map[string]interface{}{ + "type": "graph", + "title": "Nested Panel with Hidden DisplayMode", + "id": 12, + "options": map[string]interface{}{ + "legend": map[string]interface{}{ + "displayMode": "hidden", + }, + }, + }, + // Nested panel with showLegend false (should be normalized) + map[string]interface{}{ + "type": "stat", + "title": "Nested Panel with ShowLegend False", + "id": 13, + "options": map[string]interface{}{ + "legend": map[string]interface{}{ + "displayMode": "table", + "showLegend": false, + }, + }, }, }, }, }, }, expected: map[string]interface{}{ + "title": "V37 Legend Normalization Test Dashboard", "schemaVersion": 37, "panels": []interface{}{ + // Boolean legend true (unchanged) map[string]interface{}{ + "type": "timeseries", + "title": "Panel with Boolean Legend True", + "id": 1, + "options": map[string]interface{}{ + "legend": true, + }, + }, + // Boolean legend false (unchanged) + map[string]interface{}{ + "type": "timeseries", + "title": "Panel with Boolean Legend False", + "id": 2, + "options": map[string]interface{}{ + "legend": false, + }, + }, + // Hidden displayMode (normalized) + map[string]interface{}{ + "type": "graph", + "title": "Panel with Hidden DisplayMode", + "id": 3, + "options": map[string]interface{}{ + "legend": map[string]interface{}{ + "displayMode": "list", + "showLegend": false, + "placement": "bottom", + }, + }, + }, + // ShowLegend false (normalized) + map[string]interface{}{ + "type": "stat", + "title": "Panel with ShowLegend False", + "id": 4, "options": map[string]interface{}{ "legend": map[string]interface{}{ "displayMode": "list", @@ -106,62 +196,100 @@ func TestV37(t *testing.T) { }, }, }, - }, - }, - }, - { - name: "showLegend false", - input: map[string]interface{}{ - "schemaVersion": 36, - "panels": []interface{}{ - map[string]interface{}{ - "options": map[string]interface{}{ - "legend": map[string]interface{}{ - "showLegend": false, - }, - }, - }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 37, - "panels": []interface{}{ - map[string]interface{}{ - "options": map[string]interface{}{ - "legend": map[string]interface{}{ - "displayMode": "list", - "showLegend": false, - }, - }, - }, - }, - }, - }, - { - name: "visible legend", - input: map[string]interface{}{ - "schemaVersion": 36, - "panels": []interface{}{ - map[string]interface{}{ - "options": map[string]interface{}{ - "legend": map[string]interface{}{ - "displayMode": "table", - }, - }, - }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 37, - "panels": []interface{}{ + // Valid legend with table displayMode (showLegend added) map[string]interface{}{ + "type": "barchart", + "title": "Panel with Table Legend", + "id": 5, "options": map[string]interface{}{ "legend": map[string]interface{}{ "displayMode": "table", + "placement": "bottom", "showLegend": true, }, }, }, + // Valid legend with list displayMode (showLegend added) + map[string]interface{}{ + "type": "histogram", + "title": "Panel with List Legend", + "id": 6, + "options": map[string]interface{}{ + "legend": map[string]interface{}{ + "displayMode": "list", + "placement": "right", + "showLegend": true, + }, + }, + }, + // Panel with no options (unchanged) + map[string]interface{}{ + "type": "text", + "title": "Panel with No Options", + "id": 7, + }, + // Panel with no legend config (unchanged) + map[string]interface{}{ + "type": "gauge", + "title": "Panel with No Legend Config", + "id": 8, + "options": map[string]interface{}{ + "reduceOptions": map[string]interface{}{ + "fields": "/.*temperature.*/", + }, + }, + }, + // Panel with nil legend (unchanged) + map[string]interface{}{ + "type": "piechart", + "title": "Panel with Nil Legend", + "id": 9, + "options": map[string]interface{}{ + "legend": nil, + }, + }, + // Row with nested panels (nested panels processed) + map[string]interface{}{ + "type": "row", + "title": "Row with Nested Panels Having Various Legend Configs", + "id": 10, + "collapsed": false, + "panels": []interface{}{ + // Nested panel with boolean legend (unchanged) + map[string]interface{}{ + "type": "timeseries", + "title": "Nested Panel with Boolean Legend", + "id": 11, + "options": map[string]interface{}{ + "legend": true, + }, + }, + // Nested panel with hidden displayMode (normalized) + map[string]interface{}{ + "type": "graph", + "title": "Nested Panel with Hidden DisplayMode", + "id": 12, + "options": map[string]interface{}{ + "legend": map[string]interface{}{ + "displayMode": "list", + "showLegend": false, + }, + }, + }, + // Nested panel with showLegend false (normalized) + map[string]interface{}{ + "type": "stat", + "title": "Nested Panel with ShowLegend False", + "id": 13, + "options": map[string]interface{}{ + "legend": map[string]interface{}{ + "displayMode": "list", + "showLegend": false, + }, + }, + }, + }, + }, }, }, }, diff --git a/apps/dashboard/pkg/migration/schemaversion/v38.go b/apps/dashboard/pkg/migration/schemaversion/v38.go index 86727424bec..020cd4ab18f 100644 --- a/apps/dashboard/pkg/migration/schemaversion/v38.go +++ b/apps/dashboard/pkg/migration/schemaversion/v38.go @@ -1,7 +1,75 @@ package schemaversion -// V38 updates the configuration of the table panel to use the new cellOptions format -// and updates the overrides to use the new cellOptions format +// V38 migrates table panel configuration from displayMode to the structured cellOptions format. +// +// This migration addresses limitations in the original table panel cell display configuration where +// the flat displayMode string property could not accommodate the growing complexity of cell rendering +// options. The original design forced all display settings into a single string value, making it +// difficult to add new customization parameters or provide mode-specific configuration options. +// +// The migration works by: +// 1. Locating table panels in the dashboard (including nested panels within rows) +// 2. Examining field configuration defaults and any field overrides for displayMode properties +// 3. Converting string displayMode values to structured cellOptions objects with type and mode +// 4. Updating both field defaults and field override references to use the new property path +// 5. Preserving all existing visual behavior while enabling future cell customization features +// +// This restructuring provides several key benefits: +// - Enables mode-specific configuration options (e.g., gauge thresholds, color schemes) +// - Supports future cell rendering types without breaking existing configurations +// - Provides clearer separation between cell type and rendering mode +// - Maintains backward compatibility while preparing for enhanced table functionality +// +// The migration handles special cases for legacy gauge modes and color background variants, +// ensuring all existing display behaviors are preserved exactly. +// +// Example transformations: +// +// Before migration (field defaults): +// +// fieldConfig: { +// defaults: { +// custom: { +// displayMode: "gradient-gauge" +// } +// } +// } +// +// After migration (field defaults): +// +// fieldConfig: { +// defaults: { +// custom: { +// cellOptions: { +// type: "gauge", +// mode: "gradient" +// } +// } +// } +// } +// +// Before migration (field override): +// +// overrides: [{ +// matcher: { id: "byName", options: "CPU" }, +// properties: [{ +// id: "custom.displayMode", +// value: "color-background-solid" +// }] +// }] +// +// After migration (field override): +// +// overrides: [{ +// matcher: { id: "byName", options: "CPU" }, +// properties: [{ +// id: "custom.cellOptions", +// value: { +// type: "color-background", +// mode: "basic" +// } +// }] +// }] func V38(dashboard map[string]interface{}) error { dashboard["schemaVersion"] = int(38) @@ -10,12 +78,28 @@ func V38(dashboard map[string]interface{}) error { return nil } + // Process all panels, including nested ones + processPanelsV38(panels) + + return nil +} + +// processPanelsV38 recursively processes panels, including nested panels within rows +func processPanelsV38(panels []interface{}) { for _, panel := range panels { p, ok := panel.(map[string]interface{}) if !ok { continue } + // Process nested panels if this is a row panel + if p["type"] == "row" { + if nestedPanels, ok := p["panels"].([]interface{}); ok { + processPanelsV38(nestedPanels) + } + continue + } + // Only process table panels if p["type"] != "table" { continue @@ -48,8 +132,6 @@ func V38(dashboard map[string]interface{}) error { // Update any overrides referencing the cell display mode migrateOverrides(fieldConfig) } - - return nil } // migrateOverrides updates the overrides configuration to use the new cellOptions format diff --git a/apps/dashboard/pkg/migration/schemaversion/v38_test.go b/apps/dashboard/pkg/migration/schemaversion/v38_test.go index 9725fd3af66..1032b784c83 100644 --- a/apps/dashboard/pkg/migration/schemaversion/v38_test.go +++ b/apps/dashboard/pkg/migration/schemaversion/v38_test.go @@ -9,50 +9,213 @@ import ( func TestV38(t *testing.T) { tests := []migrationTestCase{ { - name: "no table panels", - input: map[string]interface{}{ - "schemaVersion": 37, - "title": "Test Dashboard", - "panels": []interface{}{ - map[string]interface{}{ - "type": "graph", - "title": "Panel 1", - }, - }, - }, - expected: map[string]interface{}{ - "title": "Test Dashboard", - "schemaVersion": 38, - "panels": []interface{}{ - map[string]interface{}{ - "type": "graph", - "title": "Panel 1", - }, - }, - }, - }, - { - name: "table panel with basic gauge displayMode", + name: "table migration with nested panels", input: map[string]interface{}{ + "title": "V38 Table Migration Test Dashboard", "schemaVersion": 37, "panels": []interface{}{ + // Basic gauge table map[string]interface{}{ - "type": "table", + "type": "table", + "title": "Table with Basic Gauge", + "id": 1, "fieldConfig": map[string]interface{}{ "defaults": map[string]interface{}{ "custom": map[string]interface{}{ "displayMode": "basic", }, }, + "overrides": []interface{}{}, + }, + }, + // Gradient gauge table + map[string]interface{}{ + "type": "table", + "title": "Table with Gradient Gauge", + "id": 2, + "fieldConfig": map[string]interface{}{ + "defaults": map[string]interface{}{ + "custom": map[string]interface{}{ + "displayMode": "gradient-gauge", + }, + }, + "overrides": []interface{}{}, + }, + }, + // LCD gauge table + map[string]interface{}{ + "type": "table", + "title": "Table with LCD Gauge", + "id": 3, + "fieldConfig": map[string]interface{}{ + "defaults": map[string]interface{}{ + "custom": map[string]interface{}{ + "displayMode": "lcd-gauge", + }, + }, + "overrides": []interface{}{}, + }, + }, + // Color background table + map[string]interface{}{ + "type": "table", + "title": "Table with Color Background", + "id": 4, + "fieldConfig": map[string]interface{}{ + "defaults": map[string]interface{}{ + "custom": map[string]interface{}{ + "displayMode": "color-background", + }, + }, + "overrides": []interface{}{}, + }, + }, + // Color background solid table + map[string]interface{}{ + "type": "table", + "title": "Table with Color Background Solid", + "id": 5, + "fieldConfig": map[string]interface{}{ + "defaults": map[string]interface{}{ + "custom": map[string]interface{}{ + "displayMode": "color-background-solid", + }, + }, + "overrides": []interface{}{}, + }, + }, + // Unknown mode table + map[string]interface{}{ + "type": "table", + "title": "Table with Unknown Mode", + "id": 6, + "fieldConfig": map[string]interface{}{ + "defaults": map[string]interface{}{ + "custom": map[string]interface{}{ + "displayMode": "some-other-mode", + }, + }, + "overrides": []interface{}{}, + }, + }, + // Table with no display mode + map[string]interface{}{ + "type": "table", + "title": "Table with No Display Mode", + "id": 7, + "fieldConfig": map[string]interface{}{ + "defaults": map[string]interface{}{ + "custom": map[string]interface{}{ + "width": 100, + }, + }, + "overrides": []interface{}{}, + }, + }, + // Table with overrides + map[string]interface{}{ + "type": "table", + "title": "Table with Overrides", + "id": 8, + "fieldConfig": map[string]interface{}{ + "defaults": map[string]interface{}{ + "custom": map[string]interface{}{ + "displayMode": "basic", + }, + }, + "overrides": []interface{}{ + map[string]interface{}{ + "matcher": map[string]interface{}{ + "id": "byName", + "options": "Field1", + }, + "properties": []interface{}{ + map[string]interface{}{ + "id": "custom.displayMode", + "value": "gradient-gauge", + }, + }, + }, + map[string]interface{}{ + "matcher": map[string]interface{}{ + "id": "byName", + "options": "Field2", + }, + "properties": []interface{}{ + map[string]interface{}{ + "id": "custom.displayMode", + "value": "color-background", + }, + }, + }, + }, + }, + }, + // Non-table panel (should remain unchanged) + map[string]interface{}{ + "type": "graph", + "title": "Non-table Panel (Should Remain Unchanged)", + "id": 9, + }, + // Row with nested table panels + map[string]interface{}{ + "type": "row", + "title": "Row with Nested Table Panels", + "id": 10, + "collapsed": false, + "panels": []interface{}{ + map[string]interface{}{ + "type": "table", + "title": "Nested Table with Basic Mode", + "id": 11, + "fieldConfig": map[string]interface{}{ + "defaults": map[string]interface{}{ + "custom": map[string]interface{}{ + "displayMode": "basic", + }, + }, + "overrides": []interface{}{}, + }, + }, + map[string]interface{}{ + "type": "table", + "title": "Nested Table with Gradient Gauge", + "id": 12, + "fieldConfig": map[string]interface{}{ + "defaults": map[string]interface{}{ + "custom": map[string]interface{}{ + "displayMode": "gradient-gauge", + }, + }, + "overrides": []interface{}{ + map[string]interface{}{ + "matcher": map[string]interface{}{ + "id": "byName", + "options": "NestedField", + }, + "properties": []interface{}{ + map[string]interface{}{ + "id": "custom.displayMode", + "value": "lcd-gauge", + }, + }, + }, + }, + }, + }, }, }, }, }, expected: map[string]interface{}{ + "title": "V38 Table Migration Test Dashboard", "schemaVersion": 38, "panels": []interface{}{ + // Basic gauge table (migrated) map[string]interface{}{ - "type": "table", + "type": "table", + "title": "Table with Basic Gauge", + "id": 1, "fieldConfig": map[string]interface{}{ "defaults": map[string]interface{}{ "custom": map[string]interface{}{ @@ -62,33 +225,14 @@ func TestV38(t *testing.T) { }, }, }, + "overrides": []interface{}{}, }, }, - }, - }, - }, - { - name: "table panel with gradient-gauge displayMode", - input: map[string]interface{}{ - "schemaVersion": 37, - "panels": []interface{}{ + // Gradient gauge table (migrated) map[string]interface{}{ - "type": "table", - "fieldConfig": map[string]interface{}{ - "defaults": map[string]interface{}{ - "custom": map[string]interface{}{ - "displayMode": "gradient-gauge", - }, - }, - }, - }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 38, - "panels": []interface{}{ - map[string]interface{}{ - "type": "table", + "type": "table", + "title": "Table with Gradient Gauge", + "id": 2, "fieldConfig": map[string]interface{}{ "defaults": map[string]interface{}{ "custom": map[string]interface{}{ @@ -98,33 +242,14 @@ func TestV38(t *testing.T) { }, }, }, + "overrides": []interface{}{}, }, }, - }, - }, - }, - { - name: "table panel with lcd-gauge displayMode", - input: map[string]interface{}{ - "schemaVersion": 37, - "panels": []interface{}{ + // LCD gauge table (migrated) map[string]interface{}{ - "type": "table", - "fieldConfig": map[string]interface{}{ - "defaults": map[string]interface{}{ - "custom": map[string]interface{}{ - "displayMode": "lcd-gauge", - }, - }, - }, - }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 38, - "panels": []interface{}{ - map[string]interface{}{ - "type": "table", + "type": "table", + "title": "Table with LCD Gauge", + "id": 3, "fieldConfig": map[string]interface{}{ "defaults": map[string]interface{}{ "custom": map[string]interface{}{ @@ -134,33 +259,14 @@ func TestV38(t *testing.T) { }, }, }, + "overrides": []interface{}{}, }, }, - }, - }, - }, - { - name: "table panel with color-background displayMode", - input: map[string]interface{}{ - "schemaVersion": 37, - "panels": []interface{}{ + // Color background table (migrated) map[string]interface{}{ - "type": "table", - "fieldConfig": map[string]interface{}{ - "defaults": map[string]interface{}{ - "custom": map[string]interface{}{ - "displayMode": "color-background", - }, - }, - }, - }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 38, - "panels": []interface{}{ - map[string]interface{}{ - "type": "table", + "type": "table", + "title": "Table with Color Background", + "id": 4, "fieldConfig": map[string]interface{}{ "defaults": map[string]interface{}{ "custom": map[string]interface{}{ @@ -170,33 +276,14 @@ func TestV38(t *testing.T) { }, }, }, + "overrides": []interface{}{}, }, }, - }, - }, - }, - { - name: "table panel with color-background-solid displayMode", - input: map[string]interface{}{ - "schemaVersion": 37, - "panels": []interface{}{ + // Color background solid table (migrated) map[string]interface{}{ - "type": "table", - "fieldConfig": map[string]interface{}{ - "defaults": map[string]interface{}{ - "custom": map[string]interface{}{ - "displayMode": "color-background-solid", - }, - }, - }, - }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 38, - "panels": []interface{}{ - map[string]interface{}{ - "type": "table", + "type": "table", + "title": "Table with Color Background Solid", + "id": 5, "fieldConfig": map[string]interface{}{ "defaults": map[string]interface{}{ "custom": map[string]interface{}{ @@ -206,33 +293,14 @@ func TestV38(t *testing.T) { }, }, }, + "overrides": []interface{}{}, }, }, - }, - }, - }, - { - name: "table panel with default displayMode", - input: map[string]interface{}{ - "schemaVersion": 37, - "panels": []interface{}{ + // Unknown mode table (migrated) map[string]interface{}{ - "type": "table", - "fieldConfig": map[string]interface{}{ - "defaults": map[string]interface{}{ - "custom": map[string]interface{}{ - "displayMode": "some-other-mode", - }, - }, - }, - }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 38, - "panels": []interface{}{ - map[string]interface{}{ - "type": "table", + "type": "table", + "title": "Table with Unknown Mode", + "id": 6, "fieldConfig": map[string]interface{}{ "defaults": map[string]interface{}{ "custom": map[string]interface{}{ @@ -241,6 +309,132 @@ func TestV38(t *testing.T) { }, }, }, + "overrides": []interface{}{}, + }, + }, + // Table with no display mode (unchanged) + map[string]interface{}{ + "type": "table", + "title": "Table with No Display Mode", + "id": 7, + "fieldConfig": map[string]interface{}{ + "defaults": map[string]interface{}{ + "custom": map[string]interface{}{ + "width": 100, + }, + }, + "overrides": []interface{}{}, + }, + }, + // Table with overrides (migrated) + map[string]interface{}{ + "type": "table", + "title": "Table with Overrides", + "id": 8, + "fieldConfig": map[string]interface{}{ + "defaults": map[string]interface{}{ + "custom": map[string]interface{}{ + "cellOptions": map[string]interface{}{ + "type": "gauge", + "mode": "basic", + }, + }, + }, + "overrides": []interface{}{ + map[string]interface{}{ + "matcher": map[string]interface{}{ + "id": "byName", + "options": "Field1", + }, + "properties": []interface{}{ + map[string]interface{}{ + "id": "custom.cellOptions", + "value": map[string]interface{}{ + "type": "gauge", + "mode": "gradient", + }, + }, + }, + }, + map[string]interface{}{ + "matcher": map[string]interface{}{ + "id": "byName", + "options": "Field2", + }, + "properties": []interface{}{ + map[string]interface{}{ + "id": "custom.cellOptions", + "value": map[string]interface{}{ + "type": "color-background", + "mode": "gradient", + }, + }, + }, + }, + }, + }, + }, + // Non-table panel (unchanged) + map[string]interface{}{ + "type": "graph", + "title": "Non-table Panel (Should Remain Unchanged)", + "id": 9, + }, + // Row with nested table panels (nested tables migrated) + map[string]interface{}{ + "type": "row", + "title": "Row with Nested Table Panels", + "id": 10, + "collapsed": false, + "panels": []interface{}{ + map[string]interface{}{ + "type": "table", + "title": "Nested Table with Basic Mode", + "id": 11, + "fieldConfig": map[string]interface{}{ + "defaults": map[string]interface{}{ + "custom": map[string]interface{}{ + "cellOptions": map[string]interface{}{ + "type": "gauge", + "mode": "basic", + }, + }, + }, + "overrides": []interface{}{}, + }, + }, + map[string]interface{}{ + "type": "table", + "title": "Nested Table with Gradient Gauge", + "id": 12, + "fieldConfig": map[string]interface{}{ + "defaults": map[string]interface{}{ + "custom": map[string]interface{}{ + "cellOptions": map[string]interface{}{ + "type": "gauge", + "mode": "gradient", + }, + }, + }, + "overrides": []interface{}{ + map[string]interface{}{ + "matcher": map[string]interface{}{ + "id": "byName", + "options": "NestedField", + }, + "properties": []interface{}{ + map[string]interface{}{ + "id": "custom.cellOptions", + "value": map[string]interface{}{ + "type": "gauge", + "mode": "lcd", + }, + }, + }, + }, + }, + }, + }, }, }, }, diff --git a/apps/dashboard/pkg/migration/schemaversion/v39.go b/apps/dashboard/pkg/migration/schemaversion/v39.go index b2881c2ee44..583c77c2f7e 100644 --- a/apps/dashboard/pkg/migration/schemaversion/v39.go +++ b/apps/dashboard/pkg/migration/schemaversion/v39.go @@ -1,7 +1,50 @@ package schemaversion -// V39 updates the configuration of the Timeseries to table transformation -// to support multiple options per query +// V39 migrates timeSeriesTable transformation configuration to support extensible per-query options. +// +// This migration addresses limitations in the original timeSeriesTable transformation design where +// each query could only be configured with a single statistic function. The original refIdToStat +// format was too restrictive for evolving use cases that require multiple configuration parameters +// per query, such as custom formatting, aggregation methods, or display preferences. +// +// The migration works by: +// 1. Locating panels with timeSeriesTable transformations (including nested panels in rows) +// 2. Extracting the existing refIdToStat mapping from transformation options +// 3. Converting each refId-statistic pair to the new nested object structure +// 4. Preserving the statistic function while enabling future option expansion +// 5. Skipping transformations that lack valid refIdToStat configuration +// +// This restructuring enables future enhancements while maintaining backward compatibility: +// - Additional per-query options can be added without breaking existing configurations +// - The stat property preserves current functionality exactly as before +// - New features like custom labels, formats, or calculations can be added seamlessly +// - The structure scales better for complex multi-query transformations +// +// Example transformation: +// +// Before migration: +// +// transformations: [{ +// id: "timeSeriesTable", +// options: { +// refIdToStat: { +// "A": "mean", +// "B": "max", +// "C": "last" +// } +// } +// }] +// +// After migration: +// +// transformations: [{ +// id: "timeSeriesTable", +// options: { +// "A": { stat: "mean" }, +// "B": { stat: "max" }, +// "C": { stat: "last" } +// } +// }] func V39(dashboard map[string]interface{}) error { dashboard["schemaVersion"] = int(39) @@ -10,12 +53,28 @@ func V39(dashboard map[string]interface{}) error { return nil } + // Process all panels, including nested ones + processPanelsV39(panels) + + return nil +} + +// processPanelsV39 recursively processes panels, including nested panels within rows +func processPanelsV39(panels []interface{}) { for _, panel := range panels { p, ok := panel.(map[string]interface{}) if !ok { continue } + // Process nested panels if this is a row panel + if p["type"] == "row" { + if nestedPanels, ok := p["panels"].([]interface{}); ok { + processPanelsV39(nestedPanels) + } + continue + } + transformations, ok := p["transformations"].([]interface{}) if !ok { continue @@ -55,6 +114,4 @@ func V39(dashboard map[string]interface{}) error { t["options"] = transformationOptions } } - - return nil } diff --git a/apps/dashboard/pkg/migration/schemaversion/v39_test.go b/apps/dashboard/pkg/migration/schemaversion/v39_test.go index 2eab71718cc..05ed7020c57 100644 --- a/apps/dashboard/pkg/migration/schemaversion/v39_test.go +++ b/apps/dashboard/pkg/migration/schemaversion/v39_test.go @@ -9,32 +9,32 @@ import ( func TestV39(t *testing.T) { tests := []migrationTestCase{ { - name: "no transformations", - input: map[string]interface{}{ - "schemaVersion": 38, - "title": "Test Dashboard", - "panels": []interface{}{ - map[string]interface{}{ - "title": "Panel 1", - }, - }, - }, - expected: map[string]interface{}{ - "title": "Test Dashboard", - "schemaVersion": 39, - "panels": []interface{}{ - map[string]interface{}{ - "title": "Panel 1", - }, - }, - }, - }, - { - name: "timeSeriesTable transformation with refIdToStat", + name: "comprehensive timeSeriesTable transformation migration with nested panels", input: map[string]interface{}{ + "title": "V39 TimeSeriesTable Transformation Migration Test Dashboard", "schemaVersion": 38, "panels": []interface{}{ + // Single stat timeSeriesTable map[string]interface{}{ + "type": "table", + "title": "Panel with TimeSeriesTable Transformation - Single Stat", + "id": 1, + "transformations": []interface{}{ + map[string]interface{}{ + "id": "timeSeriesTable", + "options": map[string]interface{}{ + "refIdToStat": map[string]interface{}{ + "A": "mean", + }, + }, + }, + }, + }, + // Multiple stats timeSeriesTable + map[string]interface{}{ + "type": "table", + "title": "Panel with TimeSeriesTable Transformation - Multiple Stats", + "id": 2, "transformations": []interface{}{ map[string]interface{}{ "id": "timeSeriesTable", @@ -42,6 +42,121 @@ func TestV39(t *testing.T) { "refIdToStat": map[string]interface{}{ "A": "mean", "B": "max", + "C": "min", + "D": "sum", + }, + }, + }, + }, + }, + // Mixed transformations + map[string]interface{}{ + "type": "graph", + "title": "Panel with TimeSeriesTable Transformation - Mixed with Other Transforms", + "id": 3, + "transformations": []interface{}{ + map[string]interface{}{ + "id": "reduce", + "options": map[string]interface{}{ + "reducers": []interface{}{"mean"}, + }, + }, + map[string]interface{}{ + "id": "timeSeriesTable", + "options": map[string]interface{}{ + "refIdToStat": map[string]interface{}{ + "A": "last", + "B": "first", + }, + }, + }, + map[string]interface{}{ + "id": "organize", + "options": map[string]interface{}{ + "excludeByName": map[string]interface{}{}, + }, + }, + }, + }, + // Non-timeSeriesTable transformation + map[string]interface{}{ + "type": "stat", + "title": "Panel with Non-TimeSeriesTable Transformation (Should Remain Unchanged)", + "id": 4, + "transformations": []interface{}{ + map[string]interface{}{ + "id": "reduce", + "options": map[string]interface{}{ + "reducers": []interface{}{"mean", "max"}, + }, + }, + }, + }, + // Empty refIdToStat + map[string]interface{}{ + "type": "table", + "title": "Panel with TimeSeriesTable - Empty RefIdToStat", + "id": 5, + "transformations": []interface{}{ + map[string]interface{}{ + "id": "timeSeriesTable", + "options": map[string]interface{}{ + "refIdToStat": map[string]interface{}{}, + }, + }, + }, + }, + // No options (should skip) + map[string]interface{}{ + "type": "table", + "title": "Panel with TimeSeriesTable - No Options (Should Skip)", + "id": 6, + "transformations": []interface{}{ + map[string]interface{}{ + "id": "timeSeriesTable", + }, + }, + }, + // Invalid options (should skip) + map[string]interface{}{ + "type": "table", + "title": "Panel with TimeSeriesTable - Invalid Options (Should Skip)", + "id": 7, + "transformations": []interface{}{ + map[string]interface{}{ + "id": "timeSeriesTable", + "options": map[string]interface{}{ + "someOtherOption": "value", + }, + }, + }, + }, + // No transformations + map[string]interface{}{ + "type": "graph", + "title": "Panel with No Transformations (Should Remain Unchanged)", + "id": 8, + }, + // Row with nested panels + map[string]interface{}{ + "type": "row", + "title": "Row with Nested Panels Having TimeSeriesTable Transformations", + "id": 9, + "collapsed": false, + "panels": []interface{}{ + map[string]interface{}{ + "type": "table", + "title": "Nested Panel with TimeSeriesTable", + "id": 10, + "transformations": []interface{}{ + map[string]interface{}{ + "id": "timeSeriesTable", + "options": map[string]interface{}{ + "refIdToStat": map[string]interface{}{ + "NestedA": "median", + "NestedB": "stdDev", + }, + }, }, }, }, @@ -50,9 +165,30 @@ func TestV39(t *testing.T) { }, }, expected: map[string]interface{}{ + "title": "V39 TimeSeriesTable Transformation Migration Test Dashboard", "schemaVersion": 39, "panels": []interface{}{ + // Single stat timeSeriesTable (migrated) map[string]interface{}{ + "type": "table", + "title": "Panel with TimeSeriesTable Transformation - Single Stat", + "id": 1, + "transformations": []interface{}{ + map[string]interface{}{ + "id": "timeSeriesTable", + "options": map[string]interface{}{ + "A": map[string]interface{}{ + "stat": "mean", + }, + }, + }, + }, + }, + // Multiple stats timeSeriesTable (migrated) + map[string]interface{}{ + "type": "table", + "title": "Panel with TimeSeriesTable Transformation - Multiple Stats", + "id": 2, "transformations": []interface{}{ map[string]interface{}{ "id": "timeSeriesTable", @@ -63,41 +199,126 @@ func TestV39(t *testing.T) { "B": map[string]interface{}{ "stat": "max", }, - }, - }, - }, - }, - }, - }, - }, - { - name: "non-timeSeriesTable transformation is not modified", - input: map[string]interface{}{ - "panels": []interface{}{ - map[string]interface{}{ - "transformations": []interface{}{ - map[string]interface{}{ - "id": "otherTransform", - "options": map[string]interface{}{ - "refIdToStat": map[string]interface{}{ - "A": "mean", + "C": map[string]interface{}{ + "stat": "min", + }, + "D": map[string]interface{}{ + "stat": "sum", }, }, }, }, }, - }, - }, - expected: map[string]interface{}{ - "schemaVersion": 39, - "panels": []interface{}{ + // Mixed transformations (timeSeriesTable migrated, others unchanged) map[string]interface{}{ + "type": "graph", + "title": "Panel with TimeSeriesTable Transformation - Mixed with Other Transforms", + "id": 3, "transformations": []interface{}{ map[string]interface{}{ - "id": "otherTransform", + "id": "reduce", "options": map[string]interface{}{ - "refIdToStat": map[string]interface{}{ - "A": "mean", + "reducers": []interface{}{"mean"}, + }, + }, + map[string]interface{}{ + "id": "timeSeriesTable", + "options": map[string]interface{}{ + "A": map[string]interface{}{ + "stat": "last", + }, + "B": map[string]interface{}{ + "stat": "first", + }, + }, + }, + map[string]interface{}{ + "id": "organize", + "options": map[string]interface{}{ + "excludeByName": map[string]interface{}{}, + }, + }, + }, + }, + // Non-timeSeriesTable transformation (unchanged) + map[string]interface{}{ + "type": "stat", + "title": "Panel with Non-TimeSeriesTable Transformation (Should Remain Unchanged)", + "id": 4, + "transformations": []interface{}{ + map[string]interface{}{ + "id": "reduce", + "options": map[string]interface{}{ + "reducers": []interface{}{"mean", "max"}, + }, + }, + }, + }, + // Empty refIdToStat (migrated to empty options) + map[string]interface{}{ + "type": "table", + "title": "Panel with TimeSeriesTable - Empty RefIdToStat", + "id": 5, + "transformations": []interface{}{ + map[string]interface{}{ + "id": "timeSeriesTable", + "options": map[string]interface{}{}, + }, + }, + }, + // No options (unchanged - should skip) + map[string]interface{}{ + "type": "table", + "title": "Panel with TimeSeriesTable - No Options (Should Skip)", + "id": 6, + "transformations": []interface{}{ + map[string]interface{}{ + "id": "timeSeriesTable", + }, + }, + }, + // Invalid options (unchanged - should skip) + map[string]interface{}{ + "type": "table", + "title": "Panel with TimeSeriesTable - Invalid Options (Should Skip)", + "id": 7, + "transformations": []interface{}{ + map[string]interface{}{ + "id": "timeSeriesTable", + "options": map[string]interface{}{ + "someOtherOption": "value", + }, + }, + }, + }, + // No transformations (unchanged) + map[string]interface{}{ + "type": "graph", + "title": "Panel with No Transformations (Should Remain Unchanged)", + "id": 8, + }, + // Row with nested panels (nested panel migrated) + map[string]interface{}{ + "type": "row", + "title": "Row with Nested Panels Having TimeSeriesTable Transformations", + "id": 9, + "collapsed": false, + "panels": []interface{}{ + map[string]interface{}{ + "type": "table", + "title": "Nested Panel with TimeSeriesTable", + "id": 10, + "transformations": []interface{}{ + map[string]interface{}{ + "id": "timeSeriesTable", + "options": map[string]interface{}{ + "NestedA": map[string]interface{}{ + "stat": "median", + }, + "NestedB": map[string]interface{}{ + "stat": "stdDev", + }, + }, }, }, }, diff --git a/apps/dashboard/pkg/migration/schemaversion/v40.go b/apps/dashboard/pkg/migration/schemaversion/v40.go index 3336ee1c1fd..f7db3d6af58 100644 --- a/apps/dashboard/pkg/migration/schemaversion/v40.go +++ b/apps/dashboard/pkg/migration/schemaversion/v40.go @@ -1,5 +1,38 @@ package schemaversion +// V40 normalizes the dashboard refresh property to ensure consistent string typing. +// +// This migration addresses type inconsistencies in dashboard refresh configuration that could +// cause runtime errors or unexpected behavior. Over time, the refresh property has accumulated +// various data types (boolean, numeric, null, undefined) due to different dashboard creation +// methods, API usage patterns, and legacy imports. +// +// The migration works by: +// 1. Checking if the refresh property exists and is already a string type +// 2. Converting any non-string values (boolean true/false, numbers, null) to an empty string +// 3. Ensuring all dashboards have a consistent string-typed refresh property +// +// This normalization is critical because: +// - The frontend refresh logic expects string values for parsing time intervals +// - Non-string values can cause dashboard loading failures +// - Empty string is the standard representation for "no auto-refresh" +// - Consistent typing enables proper validation and UI behavior +// +// Example transformations: +// +// Before migration: +// +// refresh: true // boolean +// refresh: 30 // number (seconds) +// refresh: null // null value +// refresh: undefined // missing property +// +// After migration: +// +// refresh: "" // normalized to empty string +// refresh: "" // normalized to empty string +// refresh: "" // normalized to empty string +// refresh: "" // property added with empty string func V40(dash map[string]interface{}) error { dash["schemaVersion"] = int(40) if _, ok := dash["refresh"].(string); !ok { diff --git a/apps/dashboard/pkg/migration/schemaversion/v40_test.go b/apps/dashboard/pkg/migration/schemaversion/v40_test.go index 041ac473f5d..9212e28bbec 100644 --- a/apps/dashboard/pkg/migration/schemaversion/v40_test.go +++ b/apps/dashboard/pkg/migration/schemaversion/v40_test.go @@ -20,7 +20,7 @@ func TestV40(t *testing.T) { }, }, { - name: "boolean refresh value is converted to an empty string", + name: "boolean refresh value (true) is converted to an empty string", input: map[string]interface{}{ "title": "Test Dashboard", "schemaVersion": 39, @@ -32,6 +32,19 @@ func TestV40(t *testing.T) { "refresh": "", }, }, + { + name: "boolean refresh value (false) is converted to an empty string", + input: map[string]interface{}{ + "title": "Test Dashboard", + "schemaVersion": 39, + "refresh": false, + }, + expected: map[string]interface{}{ + "title": "Test Dashboard", + "schemaVersion": 40, + "refresh": "", + }, + }, { name: "string refresh value is not converted", input: map[string]interface{}{ @@ -45,6 +58,32 @@ func TestV40(t *testing.T) { "refresh": "1m", }, }, + { + name: "empty string refresh value is preserved", + input: map[string]interface{}{ + "title": "Test Dashboard", + "schemaVersion": 39, + "refresh": "", + }, + expected: map[string]interface{}{ + "title": "Test Dashboard", + "schemaVersion": 40, + "refresh": "", + }, + }, + { + name: "numeric refresh value is converted to empty string", + input: map[string]interface{}{ + "title": "Test Dashboard", + "schemaVersion": 39, + "refresh": 60, + }, + expected: map[string]interface{}{ + "title": "Test Dashboard", + "schemaVersion": 40, + "refresh": "", + }, + }, } runMigrationTests(t, tests, schemaversion.V40) diff --git a/apps/dashboard/pkg/migration/schemaversion/v41.go b/apps/dashboard/pkg/migration/schemaversion/v41.go index 1faafea8285..632e80cbdaf 100644 --- a/apps/dashboard/pkg/migration/schemaversion/v41.go +++ b/apps/dashboard/pkg/migration/schemaversion/v41.go @@ -1,5 +1,35 @@ package schemaversion +// V41 removes the deprecated time_options property from dashboard timepicker configuration. +// +// This migration addresses technical debt by cleaning up legacy timepicker settings that have +// been obsolete since Grafana version 5. The time_options property was originally designed to +// allow customization of predefined time range options in the time picker dropdown, but this +// functionality was superseded by more flexible time selection mechanisms. +// +// The migration works by: +// 1. Locating dashboard timepicker configuration objects +// 2. Removing the deprecated time_options property if present +// 3. Preserving all other timepicker settings (refresh_intervals, etc.) +// +// This cleanup prevents potential confusion for developers and ensures the dashboard schema +// remains focused on actively used configuration options. The removal is safe because the +// time_options property has had no functional impact for several major Grafana versions. +// +// Example transformation: +// +// Before migration: +// +// timepicker: { +// refresh_intervals: ["5s", "10s", "30s", "1m"], +// time_options: ["5m", "15m", "1h", "6h", "12h", "24h"] +// } +// +// After migration: +// +// timepicker: { +// refresh_intervals: ["5s", "10s", "30s", "1m"] +// } func V41(dash map[string]interface{}) error { dash["schemaVersion"] = int(41) if timepicker, ok := dash["timepicker"].(map[string]interface{}); ok { diff --git a/apps/dashboard/pkg/migration/schemaversion/v41_test.go b/apps/dashboard/pkg/migration/schemaversion/v41_test.go index 642d6ed41a3..089bd711b87 100644 --- a/apps/dashboard/pkg/migration/schemaversion/v41_test.go +++ b/apps/dashboard/pkg/migration/schemaversion/v41_test.go @@ -22,6 +22,22 @@ func TestV41(t *testing.T) { "timepicker": map[string]interface{}{}, }, }, + { + name: "timepicker without time_options is unchanged", + input: map[string]interface{}{ + "title": "Test Dashboard", + "timepicker": map[string]interface{}{ + "refresh_intervals": []string{"5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"}, + }, + }, + expected: map[string]interface{}{ + "title": "Test Dashboard", + "schemaVersion": 41, + "timepicker": map[string]interface{}{ + "refresh_intervals": []string{"5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"}, + }, + }, + }, { name: "timepicker is not set", input: map[string]interface{}{ diff --git a/apps/dashboard/pkg/migration/testdata/input/32.panel_ds_name_to_ref.json b/apps/dashboard/pkg/migration/testdata/input/32.panel_ds_name_to_ref.json deleted file mode 100644 index f422ffa277e..00000000000 --- a/apps/dashboard/pkg/migration/testdata/input/32.panel_ds_name_to_ref.json +++ /dev/null @@ -1,561 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": "Non Default Test Datasource", - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": "non-default-test-ds-uid", - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": "default", - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": "non-existing-ds", - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "name": "CloudWatch Annotation Single Stat", - "enable": true, - "iconColor": "red", - "dimensions": { - "InstanceId": "i-123456" - }, - "namespace": "AWS/EC2", - "region": "us-east-1", - "prefixMatching": false, - "statistics": ["Average"] - }, - { - "name": "CloudWatch Annotation Multiple Stats", - "enable": true, - "iconColor": "blue", - "dimensions": { - "InstanceId": "i-789012" - }, - "namespace": "AWS/RDS", - "region": "us-west-2", - "prefixMatching": false, - "statistics": ["Maximum", "Minimum", "Sum"] - }, - { - "datasource": "", - "enable": true, - "name": "Test Empty String Annotation", - "type": "dashboard" - }, - { - "datasource": "another-missing-ds", - "enable": true, - "name": "Test Another Non-existing Annotation", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "type": "graph", - "options": {}, - "title": "No Legend Config", - "id": 1, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - } - }, - { - "options": { - "legend": true - }, - "title": "Boolean Legend True", - "id": 2, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - } - }, - { - "options": { - "legend": false - }, - "title": "Boolean Legend False", - "id": 3, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - } - }, - { - "options": { - "legend": { - "displayMode": "hidden" - } - }, - "title": "Hidden DisplayMode", - "id": 4, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - } - }, - { - "options": { - "legend": { - "showLegend": false - } - }, - "title": "ShowLegend False", - "id": 5, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - } - }, - { - "options": { - "legend": { - "displayMode": "table" - } - }, - "title": "Visible Legend", - "id": 6, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - } - }, - { - "datasource": "default", - "title": "Mixed Datasources Panel", - "id": 7, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "targets": [ - { - "datasource": "non-default-test-ds-uid" - }, - { - "datasource": "Non Default Test Datasource" - } - ] - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "title": "Mixed Panel with Mixed Targets", - "id": 8, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "targets": [ - { - "datasource": "non-default-test-ds-uid" - }, - { - "datasource": "Non Default Test Datasource" - } - ] - }, - { - "datasource": "non-existing-ds", - "title": "Non-existing Datasource Panel", - "id": 9, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "targets": [ - { - "datasource": "non-existing-ds" - } - ] - }, - { - "type": "timeseries", - "title": "Timeseries Panel with Hidden Axes", - "id": 10, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [] - } - }, - { - "type": "timeseries", - "title": "CloudWatch Single Query Multiple Stats", - "id": 11, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "targets": [ - { - "refId": "A", - "dimensions": { - "InstanceId": "i-123456" - }, - "namespace": "AWS/EC2", - "region": "us-east-1", - "metricName": "CPUUtilization", - "statistics": ["Average", "Maximum", "Minimum"], - "period": "300", - "alias": "CPU Usage" - } - ] - }, - { - "type": "timeseries", - "title": "Mixed CloudWatch and Prometheus Queries", - "id": 12, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "targets": [ - { - "refId": "A", - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "namespace": "AWS/ApplicationELB", - "region": "us-west-2", - "metricName": "RequestCount", - "statistics": ["Sum", "Average"] - }, - { - "refId": "B", - "expr": "up", - "datasource": "prometheus" - }, - { - "refId": "C", - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "namespace": "AWS/RDS", - "region": "us-east-1", - "metricName": "DatabaseConnections", - "statistics": ["Maximum"] - } - ] - }, - { - "type": "row", - "collapsed": true, - "title": "Collapsed Row with CloudWatch", - "id": 13, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "panels": [ - { - "type": "timeseries", - "title": "Nested CloudWatch Panel", - "id": 14, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "targets": [ - { - "refId": "A", - "dimensions": { - "QueueName": "my-queue" - }, - "namespace": "AWS/SQS", - "region": "us-east-1", - "metricName": "ApproximateNumberOfMessages", - "statistics": ["Average", "Maximum", "Sum"] - } - ] - } - ] - }, - { - "type": "stat", - "title": "V33: Panel with Null Datasource", - "id": 15, - "datasource": null, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 64 - }, - "targets": [ - { - "refId": "A", - "datasource": "non-default-test-ds-uid" - } - ] - }, - { - "type": "stat", - "title": "V33: Panel with Existing Datasource Reference", - "id": 16, - "datasource": { - "uid": "existing-ref-uid", - "type": "prometheus" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 64 - }, - "targets": [ - { - "refId": "A", - "datasource": { - "uid": "existing-target-uid", - "type": "elasticsearch" - } - } - ] - }, - { - "type": "table", - "title": "V33: Panel without Targets", - "id": 17, - "datasource": "Non Default Test Datasource", - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 64 - } - }, - { - "type": "table", - "title": "V33: Panel with Empty Targets Array", - "id": 18, - "datasource": "default", - "gridPos": { - "h": 4, - "w": 6, - "x": 18, - "y": 64 - }, - "targets": [] - }, - { - "type": "graph", - "title": "V33: Target Datasource Edge Cases", - "id": 19, - "datasource": "non-default-test-ds-uid", - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 68 - }, - "targets": [ - { - "refId": "A", - "datasource": null - }, - { - "refId": "B", - "datasource": "default" - }, - { - "refId": "C", - "datasource": "non-existing-ds" - }, - { - "refId": "D" - } - ] - }, - { - "type": "timeseries", - "title": "V33: Mixed Target References", - "id": 20, - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 68 - }, - "targets": [ - { - "refId": "A", - "datasource": { - "uid": "existing-ref", - "type": "prometheus" - } - }, - { - "refId": "B", - "datasource": "Non Default Test Datasource" - }, - { - "refId": "C", - "datasource": "default" - } - ] - }, - { - "type": "stat", - "title": "V33: Panel with Empty String Datasource", - "id": 21, - "datasource": "", - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 76 - }, - "targets": [ - { - "refId": "A", - "datasource": "" - } - ] - }, - { - "type": "table", - "title": "V33: Panel with Another Non-existing Datasource", - "id": 22, - "datasource": "completely-missing-ds", - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 76 - }, - "targets": [ - { - "refId": "A", - "datasource": "also-missing-ds" - }, - { - "refId": "B", - "datasource": "" - } - ] - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 32, - "tags": [], - "templating": { - "list": [ - { - "type": "query", - "datasource": "default", - "name": "default_var" - }, - { - "type": "query", - "datasource": "Non Default Test Datasource", - "name": "es_var_by_name" - }, - { - "type": "query", - "datasource": "non-default-test-ds-uid", - "name": "es_var_by_uid" - }, - { - "type": "query", - "datasource": null, - "name": "null_var" - }, - { - "type": "query", - "datasource": "non-existing-ds", - "name": "non_existing_var" - }, - { - "type": "query", - "datasource": "", - "name": "empty_string_var" - }, - { - "type": "query", - "datasource": "another-non-existing-ds", - "name": "another_non_existing_var" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/33.multiple_stats_cloudwatch.json b/apps/dashboard/pkg/migration/testdata/input/33.multiple_stats_cloudwatch.json deleted file mode 100644 index d6c2facb166..00000000000 --- a/apps/dashboard/pkg/migration/testdata/input/33.multiple_stats_cloudwatch.json +++ /dev/null @@ -1,375 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": "Non Default Test Datasource", - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": "non-default-test-ds-uid", - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": "default", - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": "non-existing-ds", - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "name": "CloudWatch Annotation Single Stat", - "enable": true, - "iconColor": "red", - "dimensions": { - "InstanceId": "i-123456" - }, - "namespace": "AWS/EC2", - "region": "us-east-1", - "prefixMatching": false, - "statistics": ["Average"] - }, - { - "name": "CloudWatch Annotation Multiple Stats", - "enable": true, - "iconColor": "blue", - "dimensions": { - "InstanceId": "i-789012" - }, - "namespace": "AWS/RDS", - "region": "us-west-2", - "prefixMatching": false, - "statistics": ["Maximum", "Minimum", "Sum"] - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "type": "graph", - "options": {}, - "title": "No Legend Config", - "id": 1, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - } - }, - { - "options": { - "legend": true - }, - "title": "Boolean Legend True", - "id": 2, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - } - }, - { - "options": { - "legend": false - }, - "title": "Boolean Legend False", - "id": 3, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - } - }, - { - "options": { - "legend": { - "displayMode": "hidden" - } - }, - "title": "Hidden DisplayMode", - "id": 4, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - } - }, - { - "options": { - "legend": { - "showLegend": false - } - }, - "title": "ShowLegend False", - "id": 5, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - } - }, - { - "options": { - "legend": { - "displayMode": "table" - } - }, - "title": "Visible Legend", - "id": 6, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - } - }, - { - "datasource": "default", - "title": "Mixed Datasources Panel", - "id": 7, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "targets": [ - { - "datasource": "non-default-test-ds-uid" - }, - { - "datasource": "Non Default Test Datasource" - } - ] - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "title": "Mixed Panel with Mixed Targets", - "id": 8, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "targets": [ - { - "datasource": "non-default-test-ds-uid" - }, - { - "datasource": "Non Default Test Datasource" - } - ] - }, - { - "datasource": "non-existing-ds", - "title": "Non-existing Datasource Panel", - "id": 9, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "targets": [ - { - "datasource": "non-existing-ds" - } - ] - }, - { - "type": "timeseries", - "title": "Timeseries Panel with Hidden Axes", - "id": 10, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [] - } - }, - { - "type": "timeseries", - "title": "CloudWatch Single Query Multiple Stats", - "id": 11, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "targets": [ - { - "refId": "A", - "dimensions": { - "InstanceId": "i-123456" - }, - "namespace": "AWS/EC2", - "region": "us-east-1", - "metricName": "CPUUtilization", - "statistics": ["Average", "Maximum", "Minimum"], - "period": "300", - "alias": "CPU Usage" - } - ] - }, - { - "type": "timeseries", - "title": "Mixed CloudWatch and Prometheus Queries", - "id": 12, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "targets": [ - { - "refId": "A", - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "namespace": "AWS/ApplicationELB", - "region": "us-west-2", - "metricName": "RequestCount", - "statistics": ["Sum", "Average"] - }, - { - "refId": "B", - "expr": "up", - "datasource": "prometheus" - }, - { - "refId": "C", - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "namespace": "AWS/RDS", - "region": "us-east-1", - "metricName": "DatabaseConnections", - "statistics": ["Maximum"] - } - ] - }, - { - "type": "row", - "collapsed": true, - "title": "Collapsed Row with CloudWatch", - "id": 13, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "panels": [ - { - "type": "timeseries", - "title": "Nested CloudWatch Panel", - "id": 14, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "targets": [ - { - "refId": "A", - "dimensions": { - "QueueName": "my-queue" - }, - "namespace": "AWS/SQS", - "region": "us-east-1", - "metricName": "ApproximateNumberOfMessages", - "statistics": ["Average", "Maximum", "Sum"] - } - ] - } - ] - } - - ], - "preload": false, - "refresh": true, - "schemaVersion": 33, - "tags": [], - "templating": { - "list": [ - { - "type": "query", - "datasource": "default", - "name": "default_var" - }, - { - "type": "query", - "datasource": "Non Default Test Datasource", - "name": "es_var_by_name" - }, - { - "type": "query", - "datasource": "non-default-test-ds-uid", - "name": "es_var_by_uid" - }, - { - "type": "query", - "datasource": null, - "name": "null_var" - }, - { - "type": "query", - "datasource": "non-existing-ds", - "name": "non_existing_var" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/34.ensure_x_axis_visibility.json b/apps/dashboard/pkg/migration/testdata/input/34.ensure_x_axis_visibility.json deleted file mode 100644 index 76e96197459..00000000000 --- a/apps/dashboard/pkg/migration/testdata/input/34.ensure_x_axis_visibility.json +++ /dev/null @@ -1,251 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": "Non Default Test Datasource", - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": "non-default-test-ds-uid", - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": "default", - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": "non-existing-ds", - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "type": "graph", - "options": {}, - "title": "No Legend Config", - "id": 1, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - } - }, - { - "options": { - "legend": true - }, - "title": "Boolean Legend True", - "id": 2, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - } - }, - { - "options": { - "legend": false - }, - "title": "Boolean Legend False", - "id": 3, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - } - }, - { - "options": { - "legend": { - "displayMode": "hidden" - } - }, - "title": "Hidden DisplayMode", - "id": 4, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - } - }, - { - "options": { - "legend": { - "showLegend": false - } - }, - "title": "ShowLegend False", - "id": 5, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - } - }, - { - "options": { - "legend": { - "displayMode": "table" - } - }, - "title": "Visible Legend", - "id": 6, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - } - }, - { - "datasource": "default", - "title": "Mixed Datasources Panel", - "id": 7, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "targets": [ - { - "datasource": "non-default-test-ds-uid" - }, - { - "datasource": "Non Default Test Datasource" - } - ] - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "title": "Mixed Panel with Mixed Targets", - "id": 8, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "targets": [ - { - "datasource": "non-default-test-ds-uid" - }, - { - "datasource": "Non Default Test Datasource" - } - ] - }, - { - "datasource": "non-existing-ds", - "title": "Non-existing Datasource Panel", - "id": 9, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "targets": [ - { - "datasource": "non-existing-ds" - } - ] - }, - { - "type": "timeseries", - "title": "Timeseries Panel with Hidden Axes", - "id": 10, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [] - } - } - - ], - "preload": false, - "refresh": true, - "schemaVersion": 34, - "tags": [], - "templating": { - "list": [ - { - "type": "query", - "datasource": "default", - "name": "default_var" - }, - { - "type": "query", - "datasource": "Non Default Test Datasource", - "name": "es_var_by_name" - }, - { - "type": "query", - "datasource": "non-default-test-ds-uid", - "name": "es_var_by_uid" - }, - { - "type": "query", - "datasource": null, - "name": "null_var" - }, - { - "type": "query", - "datasource": "non-existing-ds", - "name": "non_existing_var" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/35.ds_name_to_ref.json b/apps/dashboard/pkg/migration/testdata/input/35.ds_name_to_ref.json deleted file mode 100644 index 663536bf817..00000000000 --- a/apps/dashboard/pkg/migration/testdata/input/35.ds_name_to_ref.json +++ /dev/null @@ -1,231 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": "Non Default Test Datasource", - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": "non-default-test-ds-uid", - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": "default", - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": "non-existing-ds", - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "type": "graph", - "options": {}, - "title": "No Legend Config", - "id": 1, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - } - }, - { - "options": { - "legend": true - }, - "title": "Boolean Legend True", - "id": 2, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - } - }, - { - "options": { - "legend": false - }, - "title": "Boolean Legend False", - "id": 3, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - } - }, - { - "options": { - "legend": { - "displayMode": "hidden" - } - }, - "title": "Hidden DisplayMode", - "id": 4, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - } - }, - { - "options": { - "legend": { - "showLegend": false - } - }, - "title": "ShowLegend False", - "id": 5, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - } - }, - { - "options": { - "legend": { - "displayMode": "table" - } - }, - "title": "Visible Legend", - "id": 6, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - } - }, - { - "datasource": "default", - "title": "Mixed Datasources Panel", - "id": 7, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "targets": [ - { - "datasource": "non-default-test-ds-uid" - }, - { - "datasource": "Non Default Test Datasource" - } - ] - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "title": "Mixed Panel with Mixed Targets", - "id": 8, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "targets": [ - { - "datasource": "non-default-test-ds-uid" - }, - { - "datasource": "Non Default Test Datasource" - } - ] - }, - { - "datasource": "non-existing-ds", - "title": "Non-existing Datasource Panel", - "id": 9, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "targets": [ - { - "datasource": "non-existing-ds" - } - ] - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 35, - "tags": [], - "templating": { - "list": [ - { - "type": "query", - "datasource": "default", - "name": "default_var" - }, - { - "type": "query", - "datasource": "Non Default Test Datasource", - "name": "es_var_by_name" - }, - { - "type": "query", - "datasource": "non-default-test-ds-uid", - "name": "es_var_by_uid" - }, - { - "type": "query", - "datasource": null, - "name": "null_var" - }, - { - "type": "query", - "datasource": "non-existing-ds", - "name": "non_existing_var" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/36.legend_normalization.json b/apps/dashboard/pkg/migration/testdata/input/36.legend_normalization.json deleted file mode 100644 index 7776ccdf0cb..00000000000 --- a/apps/dashboard/pkg/migration/testdata/input/36.legend_normalization.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "type": "graph", - "options": {}, - "title": "No Legend Config", - "id": 1, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - } - }, - { - "options": { - "legend": true - }, - "title": "Boolean Legend True", - "id": 2, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - } - }, - { - "options": { - "legend": false - }, - "title": "Boolean Legend False", - "id": 3, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - } - }, - { - "options": { - "legend": { - "displayMode": "hidden" - } - }, - "title": "Hidden DisplayMode", - "id": 4, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - } - }, - { - "options": { - "legend": { - "showLegend": false - } - }, - "title": "ShowLegend False", - "id": 5, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - } - }, - { - "options": { - "legend": { - "displayMode": "table" - } - }, - "title": "Visible Legend", - "id": 6, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - } - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 36, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/37.timeseries_table_display_mode.json b/apps/dashboard/pkg/migration/testdata/input/37.timeseries_table_display_mode.json deleted file mode 100644 index 20fa6fc0371..00000000000 --- a/apps/dashboard/pkg/migration/testdata/input/37.timeseries_table_display_mode.json +++ /dev/null @@ -1,362 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "displayMode": "basic" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Basic Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "displayMode": "gradient-gauge" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Gradient Gauge Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "displayMode": "lcd-gauge" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "LCD Gauge Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "displayMode": "color-background" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Color Background Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "displayMode": "color-background-solid" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Color Background Solid Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "displayMode": "some-other-mode" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Other Display Mode", - "type": "table" - } - - - ], - "preload": false, - "refresh": true, - "schemaVersion": 37, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/38.transform_timeseries_table.json b/apps/dashboard/pkg/migration/testdata/input/38.transform_timeseries_table.json deleted file mode 100644 index 9afbe33c607..00000000000 --- a/apps/dashboard/pkg/migration/testdata/input/38.transform_timeseries_table.json +++ /dev/null @@ -1,155 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "transformations": [ - { - "id": "timeSeriesTable", - "options": { - "refIdToStat": { - "A": "mean", - "B": "max" - } - } - } - ], - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "queryType": "randomWalk", - "refId": "A" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "queryType": "randomWalk", - "refId": "B" - } - ], - "title": "Panel Title", - "type": "timeseries" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 38, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/39.refresh_true.json b/apps/dashboard/pkg/migration/testdata/input/39.refresh_true.json deleted file mode 100644 index 844bd81eb23..00000000000 --- a/apps/dashboard/pkg/migration/testdata/input/39.refresh_true.json +++ /dev/null @@ -1,136 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "queryType": "randomWalk", - "refId": "A" - } - ], - "title": "Panel Title", - "type": "timeseries" - } - ], - "preload": false, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "", - "refresh": true, - "schemaVersion": 39 - } \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/40.time_picker_time_options.json b/apps/dashboard/pkg/migration/testdata/input/40.time_picker_time_options.json deleted file mode 100644 index 5b6071de054..00000000000 --- a/apps/dashboard/pkg/migration/testdata/input/40.time_picker_time_options.json +++ /dev/null @@ -1,136 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "queryType": "randomWalk", - "refId": "A" - } - ], - "title": "Panel Title", - "type": "timeseries" - } - ], - "preload": false, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "", - "refresh": "", - "schemaVersion": 40 - } \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/v33.panel_ds_name_to_ref.json b/apps/dashboard/pkg/migration/testdata/input/v33.panel_ds_name_to_ref.json new file mode 100644 index 00000000000..8bd3c8f1962 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/input/v33.panel_ds_name_to_ref.json @@ -0,0 +1,166 @@ +{ + "schemaVersion": 32, + "title": "V33 Panel Datasource Name to Ref Test", + "panels": [ + { + "type": "stat", + "title": "Panel Datasource: null → should stay null", + "description": "Tests v33 migration behavior when panel datasource is explicitly null. Should remain null after migration (returnDefaultAsNull: true).", + "id": 1, + "datasource": null, + "targets": [ + { + "refId": "A", + "datasource": "non-default-test-ds-uid", + "description": "Target with UID reference should migrate to full object" + } + ] + }, + { + "type": "stat", + "title": "Panel Datasource: existing object → should stay unchanged", + "description": "Tests v33 migration behavior when panel datasource is already a proper object reference. Should remain unchanged.", + "id": 2, + "datasource": { + "uid": "existing-ref-uid", + "type": "prometheus" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "existing-target-uid", + "type": "elasticsearch" + }, + "description": "Target with existing object should remain unchanged" + } + ] + }, + { + "type": "table", + "title": "Panel Datasource: string name → should migrate to object", + "description": "Tests v33 migration when panel datasource is a string name. Should convert to proper object with uid, type, apiVersion.", + "id": 3, + "datasource": "Non Default Test Datasource Name" + }, + { + "type": "table", + "title": "Panel Datasource: string name with empty targets → should migrate", + "description": "Tests v33 migration when panel has datasource string but empty targets array. Panel datasource should still migrate.", + "id": 4, + "datasource": "Default Test Datasource Name", + "targets": [] + }, + { + "type": "graph", + "title": "Target Datasources: mixed null/string/non-existing scenarios", + "description": "Tests v33 target migration with various edge cases: null target (unchanged), valid string (migrated), non-existing string (preserved), missing datasource field (unchanged).", + "id": 5, + "datasource": "non-default-test-ds-uid", + "targets": [ + { + "refId": "A", + "datasource": null, + "description": "Null target datasource should remain null" + }, + { + "refId": "B", + "datasource": "Default Test Datasource Name", + "description": "Valid string should migrate to object" + }, + { + "refId": "C", + "datasource": "non-existing-ds", + "description": "Non-existing datasource should be preserved as-is (migration returns nil)" + }, + { + "refId": "D", + "description": "Target without datasource field should remain unchanged" + } + ] + }, + { + "type": "timeseries", + "title": "Panel: null datasource with mixed target types", + "description": "Tests v33 migration when panel datasource is null but targets have mixed reference types (object, string). Panel should stay null, targets should migrate appropriately.", + "id": 6, + "datasource": null, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "existing-ref", + "type": "prometheus" + }, + "description": "Existing object target should remain unchanged" + }, + { + "refId": "B", + "datasource": "Non Default Test Datasource Name", + "description": "String target should migrate to object" + }, + { + "refId": "C", + "datasource": "Default Test Datasource Name", + "description": "Default datasource string should migrate to object" + } + ] + }, + { + "type": "stat", + "title": "Empty string datasource → should return empty object {}", + "description": "Tests v33 migration behavior with empty string datasource. Should migrate to empty object {} based on MigrateDatasourceNameToRef logic.", + "id": 7, + "datasource": "", + "targets": [ + { + "refId": "A", + "datasource": "", + "description": "Empty string target should also migrate to empty object {}" + } + ] + }, + { + "type": "table", + "title": "Non-existing datasources → should be preserved as-is", + "description": "Tests v33 migration with completely unknown datasource names. Since migration returns nil for unknown datasources, they should be preserved unchanged.", + "id": 8, + "datasource": "completely-missing-ds", + "targets": [ + { + "refId": "A", + "datasource": "also-missing-ds", + "description": "Unknown target datasource should remain unchanged (migration returns nil)" + }, + { + "refId": "B", + "datasource": "", + "description": "Empty string target should migrate to {}" + } + ] + }, + { + "type": "row", + "title": "Row Panel: nested panels should also migrate", + "description": "Tests v33 migration handles nested panels within collapsed rows. Nested panel datasources should migrate same as top-level panels.", + "id": 9, + "collapsed": true, + "panels": [ + { + "type": "timeseries", + "title": "Nested Panel: string datasource → should migrate to object", + "description": "Nested panel with string datasource should migrate to proper object reference, proving row panel recursion works.", + "id": 10, + "datasource": "Non Default Test Datasource Name", + "targets": [ + { + "refId": "A", + "datasource": "Default Test Datasource Name", + "description": "Nested target should also migrate from string to object" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/v34.multiple_stats_cloudwatch.json b/apps/dashboard/pkg/migration/testdata/input/v34.multiple_stats_cloudwatch.json new file mode 100644 index 00000000000..d5b5e6228f0 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/input/v34.multiple_stats_cloudwatch.json @@ -0,0 +1,366 @@ +{ + "title": "CloudWatch Multiple Statistics Test Dashboard", + "schemaVersion": 33, + "annotations": { + "list": [ + { + "name": "CloudWatch Annotation Single Statistic", + "enable": true, + "iconColor": "red", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "dimensions": { + "InstanceId": "i-123456" + }, + "namespace": "AWS/EC2", + "region": "us-east-1", + "prefixMatching": false, + "statistics": ["Average"] + }, + { + "name": "CloudWatch Annotation Multiple Statistics", + "enable": true, + "iconColor": "blue", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "dimensions": { + "InstanceId": "i-789012" + }, + "namespace": "AWS/RDS", + "region": "us-west-2", + "prefixMatching": false, + "statistics": ["Maximum", "Minimum", "Sum"] + }, + { + "name": "CloudWatch Annotation Empty Statistics", + "enable": true, + "iconColor": "green", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "dimensions": { + "LoadBalancer": "my-lb" + }, + "namespace": "AWS/ApplicationELB", + "region": "us-west-1", + "prefixMatching": false, + "statistics": [] + }, + { + "name": "CloudWatch Annotation Invalid Statistics", + "enable": true, + "iconColor": "yellow", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "dimensions": { + "TableName": "my-table" + }, + "namespace": "AWS/DynamoDB", + "region": "us-east-1", + "prefixMatching": false, + "statistics": ["InvalidStat", "Sum", null, "Average"] + }, + { + "name": "Non-CloudWatch Annotation", + "enable": true, + "iconColor": "purple", + "datasource": { + "uid": "prometheus" + } + } + ] + }, + "panels": [ + { + "id": 1, + "type": "timeseries", + "title": "CloudWatch Single Query Multiple Statistics", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "dimensions": { + "InstanceId": "i-123456" + }, + "namespace": "AWS/EC2", + "region": "us-east-1", + "metricName": "CPUUtilization", + "statistics": ["Average", "Maximum", "Minimum"], + "period": "300" + } + ] + }, + { + "id": 2, + "type": "timeseries", + "title": "CloudWatch Single Query Single Statistic", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "dimensions": { + "LoadBalancer": "my-load-balancer" + }, + "namespace": "AWS/ApplicationELB", + "region": "us-west-2", + "metricName": "RequestCount", + "statistics": ["Sum"] + } + ] + }, + { + "id": 3, + "type": "timeseries", + "title": "CloudWatch Query No Statistics Array", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "dimensions": { + "DBInstanceIdentifier": "my-db" + }, + "namespace": "AWS/RDS", + "region": "us-east-1", + "metricName": "DatabaseConnections", + "statistic": "Maximum" + } + ] + }, + { + "id": 4, + "type": "timeseries", + "title": "Mixed CloudWatch and Non-CloudWatch Queries", + "datasource": { + "uid": "prometheus" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "dimensions": { + "QueueName": "my-queue" + }, + "namespace": "AWS/SQS", + "region": "us-east-1", + "metricName": "ApproximateNumberOfMessages", + "statistics": ["Average", "Maximum"] + }, + { + "refId": "B", + "expr": "up", + "datasource": { + "uid": "prometheus" + } + }, + { + "refId": "C", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "dimensions": { + "TopicName": "my-topic" + }, + "namespace": "AWS/SNS", + "region": "us-west-1", + "metricName": "NumberOfMessagesPublished", + "statistics": ["Sum"] + } + ] + }, + { + "id": 5, + "type": "timeseries", + "title": "CloudWatch Query Empty Statistics", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "dimensions": { + "BucketName": "my-bucket" + }, + "namespace": "AWS/S3", + "region": "us-east-1", + "metricName": "BucketSizeBytes", + "statistics": [] + } + ] + }, + { + "id": 6, + "type": "timeseries", + "title": "CloudWatch Query Invalid Statistics", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "dimensions": { + "FunctionName": "my-function" + }, + "namespace": "AWS/Lambda", + "region": "us-west-2", + "metricName": "Duration", + "statistics": ["InvalidStat", "Average", null, "Maximum", ""] + } + ] + }, + { + "id": 7, + "type": "row", + "collapsed": true, + "title": "Collapsed Row with CloudWatch", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + } + } + ], + "panels": [ + { + "id": 8, + "type": "timeseries", + "title": "Nested CloudWatch Query Multiple Statistics", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "dimensions": { + "StreamName": "my-stream" + }, + "namespace": "AWS/Kinesis", + "region": "us-east-1", + "metricName": "IncomingRecords", + "statistics": ["Sum", "Average", "Maximum"] + } + ] + } + ] + }, + { + "id": 9, + "type": "timeseries", + "title": "CloudWatch Query with Existing Editor Mode", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + }, + "dimensions": { + "ClusterName": "my-cluster" + }, + "namespace": "AWS/ECS", + "region": "us-east-1", + "metricName": "CPUUtilization", + "statistics": ["Average", "Maximum"], + "metricEditorMode": 1, + "metricQueryType": 1, + "period": "300" + } + ] + }, + { + "id": 10, + "type": "timeseries", + "title": "Non-CloudWatch Panel", + "datasource": { + "uid": "prometheus" + }, + "targets": [ + { + "refId": "A", + "expr": "cpu_usage", + "datasource": { + "uid": "prometheus" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/v35.ensure_x_axis_visibility.json b/apps/dashboard/pkg/migration/testdata/input/v35.ensure_x_axis_visibility.json new file mode 100644 index 00000000000..3ea52437822 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/input/v35.ensure_x_axis_visibility.json @@ -0,0 +1,100 @@ +{ + "title": "X-Axis Visibility Test Dashboard", + "schemaVersion": 34, + "panels": [ + { + "title": "Timeseries with Hidden Axis", + "type": "timeseries", + "fieldConfig": { + "defaults": { + "custom": { + "axisPlacement": "hidden" + } + }, + "overrides": [] + } + }, + { + "title": "Timeseries with Hidden Axis and Existing Overrides", + "type": "timeseries", + "fieldConfig": { + "defaults": { + "custom": { + "axisPlacement": "hidden" + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Series A" + }, + "properties": [ + { + "id": "color.mode", + "value": "palette-classic" + } + ] + } + ] + } + }, + { + "title": "Timeseries with Auto Axis (No Change Expected)", + "type": "timeseries", + "fieldConfig": { + "defaults": { + "custom": { + "axisPlacement": "auto" + } + }, + "overrides": [] + } + }, + { + "title": "Stat Panel with Hidden Axis (No Change Expected)", + "type": "stat", + "fieldConfig": { + "defaults": { + "custom": { + "axisPlacement": "hidden" + } + }, + "overrides": [] + } + }, + { + "title": "Timeseries with Missing FieldConfig", + "type": "timeseries", + "id": 5 + }, + { + "title": "Timeseries with Missing Defaults", + "type": "timeseries", + "fieldConfig": { + "overrides": [] + } + }, + { + "title": "Timeseries with Missing Custom Config", + "type": "timeseries", + "fieldConfig": { + "defaults": { + "unit": "bytes" + }, + "overrides": [] + } + }, + { + "title": "Timeseries with Missing Overrides Array", + "type": "timeseries", + "fieldConfig": { + "defaults": { + "custom": { + "axisPlacement": "hidden" + } + } + } + } + ] +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/v36.ds_name_to_ref.json b/apps/dashboard/pkg/migration/testdata/input/v36.ds_name_to_ref.json new file mode 100644 index 00000000000..0bfb9401d7a --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/input/v36.ds_name_to_ref.json @@ -0,0 +1,286 @@ +{ + "title": "Datasource Reference Migration Test Dashboard", + "schemaVersion": 35, + "annotations": { + "list": [ + { + "name": "Default Annotation - Tests default datasource migration", + "datasource": { + "uid": "default-ds-uid", + "type": "prometheus", + "apiVersion": "v1" + } + }, + { + "name": "Named Datasource Annotation - Tests migration by datasource name", + "datasource": { + "uid": "existing-target-uid", + "type": "elasticsearch", + "apiVersion": "v2" + } + }, + { + "name": "UID Datasource Annotation - Tests migration by datasource UID", + "datasource": { + "uid": "existing-target-uid", + "type": "elasticsearch", + "apiVersion": "v2" + } + }, + { + "name": "Null Datasource Annotation - Tests null datasource fallback to default", + "datasource": null + }, + { + "name": "Unknown Datasource Annotation - Tests unknown datasource preserved as UID", + "datasource": { + "uid": "unknown-datasource-name" + } + } + ] + }, + "templating": { + "list": [ + { + "name": "query_var_null", + "type": "query", + "datasource": null + }, + { + "name": "query_var_named", + "type": "query", + "datasource": { + "uid": "existing-target-uid", + "type": "elasticsearch", + "apiVersion": "v2" + } + }, + { + "name": "query_var_uid", + "type": "query", + "datasource": { + "uid": "existing-target-uid", + "type": "elasticsearch", + "apiVersion": "v2" + } + }, + { + "name": "query_var_unknown", + "type": "query", + "datasource": { + "uid": "unknown-datasource" + } + }, + { + "name": "non_query_var", + "type": "constant", + "datasource": null + } + ] + }, + "panels": [ + { + "id": 1, + "title": "Panel with Null Datasource and Targets", + "description": "Tests null panel datasource migration with targets - should fallback to default", + "datasource": null, + "targets": [ + { + "refId": "A", + "datasource": null + } + ] + }, + { + "id": 2, + "title": "Panel with Null Datasource and Empty Targets", + "description": "Tests null panel datasource with empty targets array - should create default target", + "datasource": null, + "targets": [] + }, + { + "id": 3, + "title": "Panel with No Targets Array", + "description": "Tests null panel datasource with missing targets - should create default target array", + "datasource": null + }, + { + "id": 4, + "title": "Panel with Mixed Datasources", + "description": "Tests mixed datasource panel - targets should migrate independently", + "datasource": { + "uid": "-- Mixed --" + }, + "targets": [ + { + "refId": "A", + "datasource": null + }, + { + "refId": "B", + "datasource": { + "uid": "existing-target-uid" + } + } + ] + }, + { + "id": 5, + "title": "Panel with Existing Object Datasource", + "description": "Tests panel with already migrated datasource object - should preserve existing refs", + "datasource": { + "uid": "existing-ref-uid", + "type": "prometheus" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "existing-target-uid", + "type": "elasticsearch" + } + } + ] + }, + { + "id": 6, + "title": "Panel with Unknown Datasource Name", + "description": "Tests panel with unknown datasource - should preserve as UID-only reference", + "datasource": { + "uid": "unknown-panel-datasource" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "unknown-target-datasource" + } + } + ] + }, + { + "id": 7, + "title": "Panel with Expression Query", + "description": "Tests panel with expression query - should not inherit expression as panel datasource", + "datasource": null, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "existing-target-uid" + } + }, + { + "refId": "B", + "datasource": { + "uid": "__expr__", + "type": "__expr__" + } + } + ] + }, + { + "id": 8, + "title": "Panel Inheriting from Target", + "description": "Tests panel inheriting datasource from target when panel datasource was default", + "datasource": null, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "existing-target-uid" + } + } + ] + }, + { + "id": 9, + "title": "Panel with Named Datasource", + "description": "Tests panel with datasource referenced by name - should migrate to full object", + "datasource": { + "uid": "existing-target-uid", + "type": "elasticsearch", + "apiVersion": "v2" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "existing-target-uid", + "type": "elasticsearch", + "apiVersion": "v2" + } + } + ] + }, + { + "id": 10, + "title": "Panel with UID Datasource", + "description": "Tests panel with datasource referenced by UID - should migrate to full object", + "datasource": { + "uid": "existing-target-uid", + "type": "elasticsearch", + "apiVersion": "v2" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "existing-target-uid", + "type": "elasticsearch", + "apiVersion": "v2" + } + } + ] + }, + { + "id": 11, + "type": "row", + "title": "Simple Row Panel", + "description": "Tests row panel - it gets datasource or targets fields added even it is not needed, but this is how it works in frontend", + "collapsed": false, + "panels": [] + }, + { + "id": 12, + "type": "row", + "title": "Collapsed Row with Nested Panels", + "description": "Tests collapsed row with nested panels - nested panels should migrate", + "collapsed": true, + "panels": [ + { + "id": 13, + "title": "Nested Panel with Default Datasource", + "description": "Nested panel in collapsed row with default datasource", + "datasource": null, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "existing-target-uid" + } + } + ] + }, + { + "id": 14, + "title": "Nested Panel with Unknown Datasource", + "description": "Nested panel in collapsed row with unknown datasource", + "datasource": { + "uid": "unknown-nested-datasource" + }, + "targets": [ + { + "refId": "A", + "datasource": { + "uid": "existing-target-uid", + "type": "elasticsearch", + "apiVersion": "v2" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/v37.legend_normalization.json b/apps/dashboard/pkg/migration/testdata/input/v37.legend_normalization.json new file mode 100644 index 00000000000..ceccf0fb9b9 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/input/v37.legend_normalization.json @@ -0,0 +1,126 @@ +{ + "title": "V37 Legend Normalization Test Dashboard", + "schemaVersion": 36, + "panels": [ + { + "type": "timeseries", + "title": "Panel with Boolean Legend True", + "id": 1, + "options": { + "legend": true + } + }, + { + "type": "timeseries", + "title": "Panel with Boolean Legend False", + "id": 2, + "options": { + "legend": false + } + }, + { + "type": "graph", + "title": "Panel with Hidden DisplayMode", + "id": 3, + "options": { + "legend": { + "displayMode": "hidden", + "showLegend": true + } + } + }, + { + "type": "stat", + "title": "Panel with ShowLegend False", + "id": 4, + "options": { + "legend": { + "displayMode": "table", + "showLegend": false + } + } + }, + { + "type": "barchart", + "title": "Panel with Table Legend", + "id": 5, + "options": { + "legend": { + "displayMode": "table", + "placement": "bottom" + } + } + }, + { + "type": "histogram", + "title": "Panel with List Legend", + "id": 6, + "options": { + "legend": { + "displayMode": "list", + "placement": "right" + } + } + }, + { + "type": "text", + "title": "Panel with No Options", + "id": 7 + }, + { + "type": "gauge", + "title": "Panel with No Legend Config", + "id": 8, + "options": { + "reduceOptions": { + "fields": "/.*temperature.*/" + } + } + }, + { + "type": "piechart", + "title": "Panel with Null Legend", + "id": 9, + "options": { + "legend": null + } + }, + { + "type": "row", + "title": "Row with Nested Panels Having Various Legend Configs", + "id": 10, + "collapsed": false, + "panels": [ + { + "type": "timeseries", + "title": "Nested Panel with Boolean Legend", + "id": 11, + "options": { + "legend": true + } + }, + { + "type": "graph", + "title": "Nested Panel with Hidden DisplayMode", + "id": 12, + "options": { + "legend": { + "displayMode": "hidden" + } + } + }, + { + "type": "stat", + "title": "Nested Panel with Conflicting Properties", + "id": 13, + "options": { + "legend": { + "displayMode": "table", + "showLegend": false + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/v38.table_displaymode_comprehensive.json b/apps/dashboard/pkg/migration/testdata/input/v38.table_displaymode_comprehensive.json new file mode 100644 index 00000000000..326e5b8534b --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/input/v38.table_displaymode_comprehensive.json @@ -0,0 +1,187 @@ +{ + "title": "V38 Table Migration Comprehensive Test Dashboard", + "schemaVersion": 37, + "panels": [ + { + "type": "table", + "title": "Table with Basic Gauge", + "id": 1, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "basic" + } + }, + "overrides": [] + } + }, + { + "type": "table", + "title": "Table with Gradient Gauge", + "id": 2, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "gradient-gauge" + } + }, + "overrides": [] + } + }, + { + "type": "table", + "title": "Table with LCD Gauge", + "id": 3, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "lcd-gauge" + } + }, + "overrides": [] + } + }, + { + "type": "table", + "title": "Table with Color Background", + "id": 4, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "color-background" + } + }, + "overrides": [] + } + }, + { + "type": "table", + "title": "Table with Color Background Solid", + "id": 5, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "color-background-solid" + } + }, + "overrides": [] + } + }, + { + "type": "table", + "title": "Table with Unknown Mode", + "id": 6, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "some-other-mode" + } + }, + "overrides": [] + } + }, + { + "type": "table", + "title": "Table with No Display Mode", + "id": 7, + "fieldConfig": { + "defaults": { + "custom": { + "width": 100 + } + }, + "overrides": [] + } + }, + { + "type": "table", + "title": "Table with Overrides", + "id": 8, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "basic" + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Field1" + }, + "properties": [ + { + "id": "custom.displayMode", + "value": "gradient-gauge" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Field2" + }, + "properties": [ + { + "id": "custom.displayMode", + "value": "color-background" + } + ] + } + ] + } + }, + { + "type": "graph", + "title": "Non-table Panel (Should Remain Unchanged)", + "id": 9 + }, + { + "type": "row", + "title": "Row with Nested Table Panels", + "id": 10, + "collapsed": false, + "panels": [ + { + "type": "table", + "title": "Nested Table with Basic Mode", + "id": 11, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "basic" + } + }, + "overrides": [] + } + }, + { + "type": "table", + "title": "Nested Table with Gradient Gauge", + "id": 12, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "gradient-gauge" + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "NestedField" + }, + "properties": [ + { + "id": "custom.displayMode", + "value": "lcd-gauge" + } + ] + } + ] + } + } + ] + } + ] +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/v38.timeseries_table_display_mode.json b/apps/dashboard/pkg/migration/testdata/input/v38.timeseries_table_display_mode.json new file mode 100644 index 00000000000..e634a71ba5e --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/input/v38.timeseries_table_display_mode.json @@ -0,0 +1,187 @@ +{ + "title": "V38 Table Migration Test Dashboard", + "schemaVersion": 37, + "panels": [ + { + "type": "table", + "title": "Table with Basic Gauge", + "id": 1, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "basic" + } + }, + "overrides": [] + } + }, + { + "type": "table", + "title": "Table with Gradient Gauge", + "id": 2, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "gradient-gauge" + } + }, + "overrides": [] + } + }, + { + "type": "table", + "title": "Table with LCD Gauge", + "id": 3, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "lcd-gauge" + } + }, + "overrides": [] + } + }, + { + "type": "table", + "title": "Table with Color Background", + "id": 4, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "color-background" + } + }, + "overrides": [] + } + }, + { + "type": "table", + "title": "Table with Color Background Solid", + "id": 5, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "color-background-solid" + } + }, + "overrides": [] + } + }, + { + "type": "table", + "title": "Table with Unknown Mode", + "id": 6, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "some-other-mode" + } + }, + "overrides": [] + } + }, + { + "type": "table", + "title": "Table with No Display Mode", + "id": 7, + "fieldConfig": { + "defaults": { + "custom": { + "width": 100 + } + }, + "overrides": [] + } + }, + { + "type": "table", + "title": "Table with Overrides", + "id": 8, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "basic" + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Field1" + }, + "properties": [ + { + "id": "custom.displayMode", + "value": "gradient-gauge" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Field2" + }, + "properties": [ + { + "id": "custom.displayMode", + "value": "color-background" + } + ] + } + ] + } + }, + { + "type": "graph", + "title": "Non-table Panel (Should Remain Unchanged)", + "id": 9 + }, + { + "type": "row", + "title": "Row with Nested Table Panels", + "id": 10, + "collapsed": false, + "panels": [ + { + "type": "table", + "title": "Nested Table with Basic Mode", + "id": 11, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "basic" + } + }, + "overrides": [] + } + }, + { + "type": "table", + "title": "Nested Table with Gradient Gauge", + "id": 12, + "fieldConfig": { + "defaults": { + "custom": { + "displayMode": "gradient-gauge" + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "NestedField" + }, + "properties": [ + { + "id": "custom.displayMode", + "value": "lcd-gauge" + } + ] + } + ] + } + } + ] + } + ] +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/v39.transform_timeseries_table.json b/apps/dashboard/pkg/migration/testdata/input/v39.transform_timeseries_table.json new file mode 100644 index 00000000000..36f46e4eefe --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/input/v39.transform_timeseries_table.json @@ -0,0 +1,145 @@ +{ + "title": "V39 TimeSeriesTable Transformation Migration Test Dashboard", + "schemaVersion": 38, + "panels": [ + { + "type": "table", + "title": "Panel with TimeSeriesTable Transformation - Single Stat", + "id": 1, + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "refIdToStat": { + "A": "mean" + } + } + } + ] + }, + { + "type": "table", + "title": "Panel with TimeSeriesTable Transformation - Multiple Stats", + "id": 2, + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "refIdToStat": { + "A": "mean", + "B": "max", + "C": "min", + "D": "sum" + } + } + } + ] + }, + { + "type": "graph", + "title": "Panel with TimeSeriesTable Transformation - Mixed with Other Transforms", + "id": 3, + "transformations": [ + { + "id": "reduce", + "options": { + "reducers": ["mean"] + } + }, + { + "id": "timeSeriesTable", + "options": { + "refIdToStat": { + "A": "last", + "B": "first" + } + } + }, + { + "id": "organize", + "options": { + "excludeByName": {} + } + } + ] + }, + { + "type": "stat", + "title": "Panel with Non-TimeSeriesTable Transformation (Should Remain Unchanged)", + "id": 4, + "transformations": [ + { + "id": "reduce", + "options": { + "reducers": ["mean", "max"] + } + } + ] + }, + { + "type": "table", + "title": "Panel with TimeSeriesTable - Empty RefIdToStat", + "id": 5, + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "refIdToStat": {} + } + } + ] + }, + { + "type": "table", + "title": "Panel with TimeSeriesTable - No Options (Should Skip)", + "id": 6, + "transformations": [ + { + "id": "timeSeriesTable" + } + ] + }, + { + "type": "table", + "title": "Panel with TimeSeriesTable - Invalid Options (Should Skip)", + "id": 7, + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "someOtherOption": "value" + } + } + ] + }, + { + "type": "graph", + "title": "Panel with No Transformations (Should Remain Unchanged)", + "id": 8 + }, + { + "type": "row", + "title": "Row with Nested Panels Having TimeSeriesTable Transformations", + "id": 9, + "collapsed": false, + "panels": [ + { + "type": "table", + "title": "Nested Panel with TimeSeriesTable", + "id": 10, + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "refIdToStat": { + "NestedA": "median", + "NestedB": "stdDev" + } + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/v40.refresh_empty_string.json b/apps/dashboard/pkg/migration/testdata/input/v40.refresh_empty_string.json new file mode 100644 index 00000000000..20273e2127b --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/input/v40.refresh_empty_string.json @@ -0,0 +1,10 @@ +{ + "title": "Empty String Refresh Test Dashboard", + "schemaVersion": 39, + "panels": [], + "time": { + "from": "now-6h", + "to": "now" + }, + "refresh": "" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/v40.refresh_false.json b/apps/dashboard/pkg/migration/testdata/input/v40.refresh_false.json new file mode 100644 index 00000000000..8dbc2615860 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/input/v40.refresh_false.json @@ -0,0 +1,10 @@ +{ + "title": "Boolean False Refresh Test Dashboard", + "schemaVersion": 39, + "panels": [], + "time": { + "from": "now-6h", + "to": "now" + }, + "refresh": false +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/v40.refresh_not_set.json b/apps/dashboard/pkg/migration/testdata/input/v40.refresh_not_set.json new file mode 100644 index 00000000000..0c1a5f26bf0 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/input/v40.refresh_not_set.json @@ -0,0 +1,9 @@ +{ + "title": "Refresh Not Set Test Dashboard", + "schemaVersion": 39, + "panels": [], + "time": { + "from": "now-6h", + "to": "now" + } +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/v40.refresh_numeric.json b/apps/dashboard/pkg/migration/testdata/input/v40.refresh_numeric.json new file mode 100644 index 00000000000..b8128115a5d --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/input/v40.refresh_numeric.json @@ -0,0 +1,10 @@ +{ + "title": "Numeric Refresh Test Dashboard", + "schemaVersion": 39, + "panels": [], + "time": { + "from": "now-6h", + "to": "now" + }, + "refresh": 60 +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/v40.refresh_string.json b/apps/dashboard/pkg/migration/testdata/input/v40.refresh_string.json new file mode 100644 index 00000000000..c62f3f24bff --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/input/v40.refresh_string.json @@ -0,0 +1,10 @@ +{ + "title": "String Refresh Test Dashboard", + "schemaVersion": 39, + "panels": [], + "time": { + "from": "now-6h", + "to": "now" + }, + "refresh": "1m" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/v40.refresh_true.json b/apps/dashboard/pkg/migration/testdata/input/v40.refresh_true.json new file mode 100644 index 00000000000..82d4554f70c --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/input/v40.refresh_true.json @@ -0,0 +1,10 @@ +{ + "title": "Boolean Refresh Test Dashboard", + "schemaVersion": 39, + "panels": [], + "time": { + "from": "now-6h", + "to": "now" + }, + "refresh": true +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/v41.no_time_picker.json b/apps/dashboard/pkg/migration/testdata/input/v41.no_time_picker.json new file mode 100644 index 00000000000..02baffa3300 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/input/v41.no_time_picker.json @@ -0,0 +1,10 @@ +{ + "title": "No Time Picker Test Dashboard", + "schemaVersion": 40, + "panels": [], + "time": { + "from": "now-6h", + "to": "now" + }, + "refresh": "" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/v41.time_picker_no_time_options.json b/apps/dashboard/pkg/migration/testdata/input/v41.time_picker_no_time_options.json new file mode 100644 index 00000000000..20a82a34dd5 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/input/v41.time_picker_no_time_options.json @@ -0,0 +1,7 @@ +{ + "title": "Time Picker No Time Options Test Dashboard", + "schemaVersion": 40, + "timepicker": { + "refresh_intervals": ["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"] + } +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/input/v41.time_picker_time_options.json b/apps/dashboard/pkg/migration/testdata/input/v41.time_picker_time_options.json new file mode 100644 index 00000000000..18321ce06f7 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/input/v41.time_picker_time_options.json @@ -0,0 +1,14 @@ +{ + "title": "Time Picker Time Options Test Dashboard", + "schemaVersion": 40, + "panels": [], + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": ["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"], + "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] + }, + "refresh": "" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.33.json b/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.33.json deleted file mode 100644 index 198434264a5..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.33.json +++ /dev/null @@ -1,660 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": "Non Default Test Datasource", - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": "non-default-test-ds-uid", - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": "default", - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": "non-existing-ds", - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-123456" - }, - "enable": true, - "iconColor": "red", - "name": "CloudWatch Annotation Single Stat", - "namespace": "AWS/EC2", - "prefixMatching": false, - "region": "us-east-1", - "statistics": [ - "Average" - ] - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistics": [ - "Maximum", - "Minimum", - "Sum" - ] - }, - { - "datasource": "", - "enable": true, - "name": "Test Empty String Annotation", - "type": "dashboard" - }, - { - "datasource": "another-missing-ds", - "enable": true, - "name": "Test Another Non-existing Annotation", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": true - }, - "title": "Boolean Legend True" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": false - }, - "title": "Boolean Legend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "hidden" - } - }, - "title": "Hidden DisplayMode" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table" - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 11, - "targets": [ - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "A", - "region": "us-east-1", - "statistics": [ - "Average", - "Maximum", - "Minimum" - ] - } - ], - "title": "CloudWatch Single Query Multiple Stats", - "type": "timeseries" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 12, - "targets": [ - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "A", - "region": "us-west-2", - "statistics": [ - "Sum", - "Average" - ] - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "expr": "up", - "refId": "B" - }, - { - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "metricName": "DatabaseConnections", - "namespace": "AWS/RDS", - "refId": "C", - "region": "us-east-1", - "statistics": [ - "Maximum" - ] - } - ], - "title": "Mixed CloudWatch and Prometheus Queries", - "type": "timeseries" - }, - { - "collapsed": true, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 13, - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 14, - "targets": [ - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "A", - "region": "us-east-1", - "statistics": [ - "Average", - "Maximum", - "Sum" - ] - } - ], - "title": "Nested CloudWatch Panel", - "type": "timeseries" - } - ], - "title": "Collapsed Row with CloudWatch", - "type": "row" - }, - { - "datasource": null, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 64 - }, - "id": 15, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Null Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 64 - }, - "id": 16, - "targets": [ - { - "datasource": { - "type": "elasticsearch", - "uid": "existing-target-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Existing Datasource Reference", - "type": "stat" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 64 - }, - "id": 17, - "title": "V33: Panel without Targets", - "type": "table" - }, - { - "datasource": null, - "gridPos": { - "h": 4, - "w": 6, - "x": 18, - "y": 64 - }, - "id": 18, - "targets": [], - "title": "V33: Panel with Empty Targets Array", - "type": "table" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 68 - }, - "id": 19, - "targets": [ - { - "datasource": null, - "refId": "A" - }, - { - "datasource": "default", - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "C" - }, - { - "refId": "D" - } - ], - "title": "V33: Target Datasource Edge Cases", - "type": "graph" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 68 - }, - "id": 20, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref" - }, - "refId": "A" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "B" - }, - { - "datasource": "default", - "refId": "C" - } - ], - "title": "V33: Mixed Target References", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 76 - }, - "id": 21, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Empty String Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 76 - }, - "id": 22, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "B" - } - ], - "title": "V33: Panel with Another Non-existing Datasource", - "type": "table" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 33, - "tags": [], - "templating": { - "list": [ - { - "datasource": "default", - "name": "default_var", - "type": "query" - }, - { - "datasource": "Non Default Test Datasource", - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": "non-default-test-ds-uid", - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": null, - "name": "null_var", - "type": "query" - }, - { - "datasource": "non-existing-ds", - "name": "non_existing_var", - "type": "query" - }, - { - "datasource": "", - "name": "empty_string_var", - "type": "query" - }, - { - "datasource": "another-non-existing-ds", - "name": "another_non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.34.json b/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.34.json deleted file mode 100644 index de467c74aa3..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.34.json +++ /dev/null @@ -1,719 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": "Non Default Test Datasource", - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": "non-default-test-ds-uid", - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": "default", - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": "non-existing-ds", - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-123456" - }, - "enable": true, - "iconColor": "red", - "name": "CloudWatch Annotation Single Stat", - "namespace": "AWS/EC2", - "prefixMatching": false, - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Maximum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Maximum" - }, - { - "datasource": "", - "enable": true, - "name": "Test Empty String Annotation", - "type": "dashboard" - }, - { - "datasource": "another-missing-ds", - "enable": true, - "name": "Test Another Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Minimum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Minimum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Sum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Sum" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": true - }, - "title": "Boolean Legend True" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": false - }, - "title": "Boolean Legend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "hidden" - } - }, - "title": "Hidden DisplayMode" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table" - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 11, - "targets": [ - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "C", - "region": "us-east-1", - "statistic": "Minimum" - } - ], - "title": "CloudWatch Single Query Multiple Stats", - "type": "timeseries" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 12, - "targets": [ - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "A", - "region": "us-west-2", - "statistic": "Sum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "expr": "up", - "refId": "B" - }, - { - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "metricName": "DatabaseConnections", - "namespace": "AWS/RDS", - "refId": "C", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "D", - "region": "us-west-2", - "statistic": "Average" - } - ], - "title": "Mixed CloudWatch and Prometheus Queries", - "type": "timeseries" - }, - { - "collapsed": true, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 13, - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 14, - "targets": [ - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "C", - "region": "us-east-1", - "statistic": "Sum" - } - ], - "title": "Nested CloudWatch Panel", - "type": "timeseries" - } - ], - "title": "Collapsed Row with CloudWatch", - "type": "row" - }, - { - "datasource": null, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 64 - }, - "id": 15, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Null Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 64 - }, - "id": 16, - "targets": [ - { - "datasource": { - "type": "elasticsearch", - "uid": "existing-target-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Existing Datasource Reference", - "type": "stat" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 64 - }, - "id": 17, - "title": "V33: Panel without Targets", - "type": "table" - }, - { - "datasource": null, - "gridPos": { - "h": 4, - "w": 6, - "x": 18, - "y": 64 - }, - "id": 18, - "targets": null, - "title": "V33: Panel with Empty Targets Array", - "type": "table" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 68 - }, - "id": 19, - "targets": [ - { - "datasource": null, - "refId": "A" - }, - { - "datasource": "default", - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "C" - }, - { - "refId": "D" - } - ], - "title": "V33: Target Datasource Edge Cases", - "type": "graph" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 68 - }, - "id": 20, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref" - }, - "refId": "A" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "B" - }, - { - "datasource": "default", - "refId": "C" - } - ], - "title": "V33: Mixed Target References", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 76 - }, - "id": 21, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Empty String Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 76 - }, - "id": 22, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "B" - } - ], - "title": "V33: Panel with Another Non-existing Datasource", - "type": "table" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 34, - "tags": [], - "templating": { - "list": [ - { - "datasource": "default", - "name": "default_var", - "type": "query" - }, - { - "datasource": "Non Default Test Datasource", - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": "non-default-test-ds-uid", - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": null, - "name": "null_var", - "type": "query" - }, - { - "datasource": "non-existing-ds", - "name": "non_existing_var", - "type": "query" - }, - { - "datasource": "", - "name": "empty_string_var", - "type": "query" - }, - { - "datasource": "another-non-existing-ds", - "name": "another_non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.35.json b/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.35.json deleted file mode 100644 index 512e5986c06..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.35.json +++ /dev/null @@ -1,732 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": "Non Default Test Datasource", - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": "non-default-test-ds-uid", - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": "default", - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": "non-existing-ds", - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-123456" - }, - "enable": true, - "iconColor": "red", - "name": "CloudWatch Annotation Single Stat", - "namespace": "AWS/EC2", - "prefixMatching": false, - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Maximum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Maximum" - }, - { - "datasource": "", - "enable": true, - "name": "Test Empty String Annotation", - "type": "dashboard" - }, - { - "datasource": "another-missing-ds", - "enable": true, - "name": "Test Another Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Minimum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Minimum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Sum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Sum" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": true - }, - "title": "Boolean Legend True" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": false - }, - "title": "Boolean Legend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "hidden" - } - }, - "title": "Hidden DisplayMode" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table" - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 11, - "targets": [ - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "C", - "region": "us-east-1", - "statistic": "Minimum" - } - ], - "title": "CloudWatch Single Query Multiple Stats", - "type": "timeseries" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 12, - "targets": [ - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "A", - "region": "us-west-2", - "statistic": "Sum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "expr": "up", - "refId": "B" - }, - { - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "metricName": "DatabaseConnections", - "namespace": "AWS/RDS", - "refId": "C", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "D", - "region": "us-west-2", - "statistic": "Average" - } - ], - "title": "Mixed CloudWatch and Prometheus Queries", - "type": "timeseries" - }, - { - "collapsed": true, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 13, - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 14, - "targets": [ - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "C", - "region": "us-east-1", - "statistic": "Sum" - } - ], - "title": "Nested CloudWatch Panel", - "type": "timeseries" - } - ], - "title": "Collapsed Row with CloudWatch", - "type": "row" - }, - { - "datasource": null, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 64 - }, - "id": 15, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Null Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 64 - }, - "id": 16, - "targets": [ - { - "datasource": { - "type": "elasticsearch", - "uid": "existing-target-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Existing Datasource Reference", - "type": "stat" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 64 - }, - "id": 17, - "title": "V33: Panel without Targets", - "type": "table" - }, - { - "datasource": null, - "gridPos": { - "h": 4, - "w": 6, - "x": 18, - "y": 64 - }, - "id": 18, - "targets": null, - "title": "V33: Panel with Empty Targets Array", - "type": "table" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 68 - }, - "id": 19, - "targets": [ - { - "datasource": null, - "refId": "A" - }, - { - "datasource": "default", - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "C" - }, - { - "refId": "D" - } - ], - "title": "V33: Target Datasource Edge Cases", - "type": "graph" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 68 - }, - "id": 20, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref" - }, - "refId": "A" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "B" - }, - { - "datasource": "default", - "refId": "C" - } - ], - "title": "V33: Mixed Target References", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 76 - }, - "id": 21, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Empty String Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 76 - }, - "id": 22, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "B" - } - ], - "title": "V33: Panel with Another Non-existing Datasource", - "type": "table" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 35, - "tags": [], - "templating": { - "list": [ - { - "datasource": "default", - "name": "default_var", - "type": "query" - }, - { - "datasource": "Non Default Test Datasource", - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": "non-default-test-ds-uid", - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": null, - "name": "null_var", - "type": "query" - }, - { - "datasource": "non-existing-ds", - "name": "non_existing_var", - "type": "query" - }, - { - "datasource": "", - "name": "empty_string_var", - "type": "query" - }, - { - "datasource": "another-non-existing-ds", - "name": "another_non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.36.json b/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.36.json deleted file mode 100644 index 1512dcca659..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.36.json +++ /dev/null @@ -1,831 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-123456" - }, - "enable": true, - "iconColor": "red", - "name": "CloudWatch Annotation Single Stat", - "namespace": "AWS/EC2", - "prefixMatching": false, - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Maximum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Maximum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Empty String Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Another Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Minimum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Minimum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Sum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Sum" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": true - }, - "title": "Boolean Legend True" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": false - }, - "title": "Boolean Legend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "hidden" - } - }, - "title": "Hidden DisplayMode" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table" - } - }, - "title": "Visible Legend" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 11, - "targets": [ - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "C", - "region": "us-east-1", - "statistic": "Minimum" - } - ], - "title": "CloudWatch Single Query Multiple Stats", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "A", - "region": "us-west-2", - "statistic": "Sum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "expr": "up", - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "metricName": "DatabaseConnections", - "namespace": "AWS/RDS", - "refId": "C", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "D", - "region": "us-west-2", - "statistic": "Average" - } - ], - "title": "Mixed CloudWatch and Prometheus Queries", - "type": "timeseries" - }, - { - "collapsed": true, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 13, - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 14, - "targets": [ - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "C", - "region": "us-east-1", - "statistic": "Sum" - } - ], - "title": "Nested CloudWatch Panel", - "type": "timeseries" - } - ], - "title": "Collapsed Row with CloudWatch", - "type": "row" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 64 - }, - "id": 15, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Null Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 64 - }, - "id": 16, - "targets": [ - { - "datasource": { - "type": "elasticsearch", - "uid": "existing-target-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Existing Datasource Reference", - "type": "stat" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 64 - }, - "id": 17, - "title": "V33: Panel without Targets", - "type": "table" - }, - { - "datasource": null, - "gridPos": { - "h": 4, - "w": 6, - "x": 18, - "y": 64 - }, - "id": 18, - "targets": null, - "title": "V33: Panel with Empty Targets Array", - "type": "table" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 68 - }, - "id": 19, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "C" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "D" - } - ], - "title": "V33: Target Datasource Edge Cases", - "type": "graph" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 68 - }, - "id": 20, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref" - }, - "refId": "A" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "C" - } - ], - "title": "V33: Mixed Target References", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 76 - }, - "id": 21, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Empty String Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 76 - }, - "id": 22, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "B" - } - ], - "title": "V33: Panel with Another Non-existing Datasource", - "type": "table" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 36, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "empty_string_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "another_non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.37.json b/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.37.json deleted file mode 100644 index 509348e42bd..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.37.json +++ /dev/null @@ -1,840 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-123456" - }, - "enable": true, - "iconColor": "red", - "name": "CloudWatch Annotation Single Stat", - "namespace": "AWS/EC2", - "prefixMatching": false, - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Maximum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Maximum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Empty String Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Another Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Minimum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Minimum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Sum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Sum" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 11, - "targets": [ - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "C", - "region": "us-east-1", - "statistic": "Minimum" - } - ], - "title": "CloudWatch Single Query Multiple Stats", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "A", - "region": "us-west-2", - "statistic": "Sum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "expr": "up", - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "metricName": "DatabaseConnections", - "namespace": "AWS/RDS", - "refId": "C", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "D", - "region": "us-west-2", - "statistic": "Average" - } - ], - "title": "Mixed CloudWatch and Prometheus Queries", - "type": "timeseries" - }, - { - "collapsed": true, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 13, - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 14, - "targets": [ - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "C", - "region": "us-east-1", - "statistic": "Sum" - } - ], - "title": "Nested CloudWatch Panel", - "type": "timeseries" - } - ], - "title": "Collapsed Row with CloudWatch", - "type": "row" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 64 - }, - "id": 15, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Null Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 64 - }, - "id": 16, - "targets": [ - { - "datasource": { - "type": "elasticsearch", - "uid": "existing-target-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Existing Datasource Reference", - "type": "stat" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 64 - }, - "id": 17, - "title": "V33: Panel without Targets", - "type": "table" - }, - { - "datasource": null, - "gridPos": { - "h": 4, - "w": 6, - "x": 18, - "y": 64 - }, - "id": 18, - "targets": null, - "title": "V33: Panel with Empty Targets Array", - "type": "table" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 68 - }, - "id": 19, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "C" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "D" - } - ], - "title": "V33: Target Datasource Edge Cases", - "type": "graph" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 68 - }, - "id": 20, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref" - }, - "refId": "A" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "C" - } - ], - "title": "V33: Mixed Target References", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 76 - }, - "id": 21, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Empty String Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 76 - }, - "id": 22, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "B" - } - ], - "title": "V33: Panel with Another Non-existing Datasource", - "type": "table" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 37, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "empty_string_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "another_non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.38.json b/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.38.json deleted file mode 100644 index 3fb07f1e651..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.38.json +++ /dev/null @@ -1,840 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-123456" - }, - "enable": true, - "iconColor": "red", - "name": "CloudWatch Annotation Single Stat", - "namespace": "AWS/EC2", - "prefixMatching": false, - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Maximum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Maximum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Empty String Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Another Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Minimum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Minimum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Sum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Sum" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 11, - "targets": [ - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "C", - "region": "us-east-1", - "statistic": "Minimum" - } - ], - "title": "CloudWatch Single Query Multiple Stats", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "A", - "region": "us-west-2", - "statistic": "Sum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "expr": "up", - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "metricName": "DatabaseConnections", - "namespace": "AWS/RDS", - "refId": "C", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "D", - "region": "us-west-2", - "statistic": "Average" - } - ], - "title": "Mixed CloudWatch and Prometheus Queries", - "type": "timeseries" - }, - { - "collapsed": true, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 13, - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 14, - "targets": [ - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "C", - "region": "us-east-1", - "statistic": "Sum" - } - ], - "title": "Nested CloudWatch Panel", - "type": "timeseries" - } - ], - "title": "Collapsed Row with CloudWatch", - "type": "row" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 64 - }, - "id": 15, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Null Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 64 - }, - "id": 16, - "targets": [ - { - "datasource": { - "type": "elasticsearch", - "uid": "existing-target-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Existing Datasource Reference", - "type": "stat" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 64 - }, - "id": 17, - "title": "V33: Panel without Targets", - "type": "table" - }, - { - "datasource": null, - "gridPos": { - "h": 4, - "w": 6, - "x": 18, - "y": 64 - }, - "id": 18, - "targets": null, - "title": "V33: Panel with Empty Targets Array", - "type": "table" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 68 - }, - "id": 19, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "C" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "D" - } - ], - "title": "V33: Target Datasource Edge Cases", - "type": "graph" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 68 - }, - "id": 20, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref" - }, - "refId": "A" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "C" - } - ], - "title": "V33: Mixed Target References", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 76 - }, - "id": 21, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Empty String Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 76 - }, - "id": 22, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "B" - } - ], - "title": "V33: Panel with Another Non-existing Datasource", - "type": "table" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 38, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "empty_string_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "another_non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.39.json b/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.39.json deleted file mode 100644 index f432b3fe855..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.39.json +++ /dev/null @@ -1,840 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-123456" - }, - "enable": true, - "iconColor": "red", - "name": "CloudWatch Annotation Single Stat", - "namespace": "AWS/EC2", - "prefixMatching": false, - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Maximum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Maximum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Empty String Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Another Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Minimum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Minimum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Sum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Sum" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 11, - "targets": [ - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "C", - "region": "us-east-1", - "statistic": "Minimum" - } - ], - "title": "CloudWatch Single Query Multiple Stats", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "A", - "region": "us-west-2", - "statistic": "Sum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "expr": "up", - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "metricName": "DatabaseConnections", - "namespace": "AWS/RDS", - "refId": "C", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "D", - "region": "us-west-2", - "statistic": "Average" - } - ], - "title": "Mixed CloudWatch and Prometheus Queries", - "type": "timeseries" - }, - { - "collapsed": true, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 13, - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 14, - "targets": [ - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "C", - "region": "us-east-1", - "statistic": "Sum" - } - ], - "title": "Nested CloudWatch Panel", - "type": "timeseries" - } - ], - "title": "Collapsed Row with CloudWatch", - "type": "row" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 64 - }, - "id": 15, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Null Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 64 - }, - "id": 16, - "targets": [ - { - "datasource": { - "type": "elasticsearch", - "uid": "existing-target-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Existing Datasource Reference", - "type": "stat" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 64 - }, - "id": 17, - "title": "V33: Panel without Targets", - "type": "table" - }, - { - "datasource": null, - "gridPos": { - "h": 4, - "w": 6, - "x": 18, - "y": 64 - }, - "id": 18, - "targets": null, - "title": "V33: Panel with Empty Targets Array", - "type": "table" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 68 - }, - "id": 19, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "C" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "D" - } - ], - "title": "V33: Target Datasource Edge Cases", - "type": "graph" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 68 - }, - "id": 20, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref" - }, - "refId": "A" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "C" - } - ], - "title": "V33: Mixed Target References", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 76 - }, - "id": 21, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Empty String Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 76 - }, - "id": 22, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "B" - } - ], - "title": "V33: Panel with Another Non-existing Datasource", - "type": "table" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 39, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "empty_string_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "another_non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.40.json b/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.40.json deleted file mode 100644 index 06cc0c83dd1..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.40.json +++ /dev/null @@ -1,840 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-123456" - }, - "enable": true, - "iconColor": "red", - "name": "CloudWatch Annotation Single Stat", - "namespace": "AWS/EC2", - "prefixMatching": false, - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Maximum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Maximum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Empty String Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Another Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Minimum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Minimum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Sum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Sum" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 11, - "targets": [ - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "C", - "region": "us-east-1", - "statistic": "Minimum" - } - ], - "title": "CloudWatch Single Query Multiple Stats", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "A", - "region": "us-west-2", - "statistic": "Sum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "expr": "up", - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "metricName": "DatabaseConnections", - "namespace": "AWS/RDS", - "refId": "C", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "D", - "region": "us-west-2", - "statistic": "Average" - } - ], - "title": "Mixed CloudWatch and Prometheus Queries", - "type": "timeseries" - }, - { - "collapsed": true, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 13, - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 14, - "targets": [ - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "C", - "region": "us-east-1", - "statistic": "Sum" - } - ], - "title": "Nested CloudWatch Panel", - "type": "timeseries" - } - ], - "title": "Collapsed Row with CloudWatch", - "type": "row" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 64 - }, - "id": 15, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Null Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 64 - }, - "id": 16, - "targets": [ - { - "datasource": { - "type": "elasticsearch", - "uid": "existing-target-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Existing Datasource Reference", - "type": "stat" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 64 - }, - "id": 17, - "title": "V33: Panel without Targets", - "type": "table" - }, - { - "datasource": null, - "gridPos": { - "h": 4, - "w": 6, - "x": 18, - "y": 64 - }, - "id": 18, - "targets": null, - "title": "V33: Panel with Empty Targets Array", - "type": "table" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 68 - }, - "id": 19, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "C" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "D" - } - ], - "title": "V33: Target Datasource Edge Cases", - "type": "graph" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 68 - }, - "id": 20, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref" - }, - "refId": "A" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "C" - } - ], - "title": "V33: Mixed Target References", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 76 - }, - "id": 21, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Empty String Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 76 - }, - "id": 22, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "B" - } - ], - "title": "V33: Panel with Another Non-existing Datasource", - "type": "table" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 40, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "empty_string_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "another_non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.41.json b/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.41.json deleted file mode 100644 index f6272a50c1b..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/32.panel_ds_name_to_ref.41.json +++ /dev/null @@ -1,828 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-123456" - }, - "enable": true, - "iconColor": "red", - "name": "CloudWatch Annotation Single Stat", - "namespace": "AWS/EC2", - "prefixMatching": false, - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Maximum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Maximum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Empty String Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Another Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Minimum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Minimum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Sum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Sum" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 11, - "targets": [ - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "alias": "CPU Usage", - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "C", - "region": "us-east-1", - "statistic": "Minimum" - } - ], - "title": "CloudWatch Single Query Multiple Stats", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 12, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "A", - "region": "us-west-2", - "statistic": "Sum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "expr": "up", - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "metricName": "DatabaseConnections", - "namespace": "AWS/RDS", - "refId": "C", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "D", - "region": "us-west-2", - "statistic": "Average" - } - ], - "title": "Mixed CloudWatch and Prometheus Queries", - "type": "timeseries" - }, - { - "collapsed": true, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 13, - "panels": [ - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 14, - "targets": [ - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "C", - "region": "us-east-1", - "statistic": "Sum" - } - ], - "title": "Nested CloudWatch Panel", - "type": "timeseries" - } - ], - "title": "Collapsed Row with CloudWatch", - "type": "row" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 64 - }, - "id": 15, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Null Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 64 - }, - "id": 16, - "targets": [ - { - "datasource": { - "type": "elasticsearch", - "uid": "existing-target-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Existing Datasource Reference", - "type": "stat" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 64 - }, - "id": 17, - "title": "V33: Panel without Targets", - "type": "table" - }, - { - "datasource": null, - "gridPos": { - "h": 4, - "w": 6, - "x": 18, - "y": 64 - }, - "id": 18, - "targets": null, - "title": "V33: Panel with Empty Targets Array", - "type": "table" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 68 - }, - "id": 19, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "C" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "D" - } - ], - "title": "V33: Target Datasource Edge Cases", - "type": "graph" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 68 - }, - "id": 20, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "existing-ref" - }, - "refId": "A" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "C" - } - ], - "title": "V33: Mixed Target References", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 0, - "y": 76 - }, - "id": 21, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - } - ], - "title": "V33: Panel with Empty String Datasource", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 6, - "y": 76 - }, - "id": 22, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "refId": "B" - } - ], - "title": "V33: Panel with Another Non-existing Datasource", - "type": "table" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 41, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "empty_string_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "another_non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": {}, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.34.json b/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.34.json deleted file mode 100644 index 0773cc1fe31..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.34.json +++ /dev/null @@ -1,462 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": "Non Default Test Datasource", - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": "non-default-test-ds-uid", - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": "default", - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": "non-existing-ds", - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-123456" - }, - "enable": true, - "iconColor": "red", - "name": "CloudWatch Annotation Single Stat", - "namespace": "AWS/EC2", - "prefixMatching": false, - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Maximum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Maximum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Minimum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Minimum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Sum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Sum" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": true - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": false - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "hidden" - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table" - } - }, - "title": "Visible Legend" - }, - { - "datasource": "default", - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": "non-default-test-ds-uid" - }, - { - "datasource": "Non Default Test Datasource" - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": "non-default-test-ds-uid" - }, - { - "datasource": "Non Default Test Datasource" - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": "non-existing-ds", - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": "non-existing-ds" - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 11, - "targets": [ - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "C", - "region": "us-east-1", - "statistic": "Minimum" - } - ], - "title": "CloudWatch Single Query Multiple Stats", - "type": "timeseries" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 12, - "targets": [ - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "A", - "region": "us-west-2", - "statistic": "Sum" - }, - { - "datasource": "prometheus", - "expr": "up", - "refId": "B" - }, - { - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "metricName": "DatabaseConnections", - "namespace": "AWS/RDS", - "refId": "C", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "D", - "region": "us-west-2", - "statistic": "Average" - } - ], - "title": "Mixed CloudWatch and Prometheus Queries", - "type": "timeseries" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 13, - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 14, - "targets": [ - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "C", - "region": "us-east-1", - "statistic": "Sum" - } - ], - "title": "Nested CloudWatch Panel", - "type": "timeseries" - } - ], - "title": "Collapsed Row with CloudWatch", - "type": "row" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 34, - "tags": [], - "templating": { - "list": [ - { - "datasource": "default", - "name": "default_var", - "type": "query" - }, - { - "datasource": "Non Default Test Datasource", - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": "non-default-test-ds-uid", - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": null, - "name": "null_var", - "type": "query" - }, - { - "datasource": "non-existing-ds", - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.35.json b/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.35.json deleted file mode 100644 index 39d9240295e..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.35.json +++ /dev/null @@ -1,475 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": "Non Default Test Datasource", - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": "non-default-test-ds-uid", - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": "default", - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": "non-existing-ds", - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-123456" - }, - "enable": true, - "iconColor": "red", - "name": "CloudWatch Annotation Single Stat", - "namespace": "AWS/EC2", - "prefixMatching": false, - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Maximum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Maximum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Minimum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Minimum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Sum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Sum" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": true - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": false - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "hidden" - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table" - } - }, - "title": "Visible Legend" - }, - { - "datasource": "default", - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": "non-default-test-ds-uid" - }, - { - "datasource": "Non Default Test Datasource" - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": "non-default-test-ds-uid" - }, - { - "datasource": "Non Default Test Datasource" - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": "non-existing-ds", - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": "non-existing-ds" - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 11, - "targets": [ - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "C", - "region": "us-east-1", - "statistic": "Minimum" - } - ], - "title": "CloudWatch Single Query Multiple Stats", - "type": "timeseries" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 12, - "targets": [ - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "A", - "region": "us-west-2", - "statistic": "Sum" - }, - { - "datasource": "prometheus", - "expr": "up", - "refId": "B" - }, - { - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "metricName": "DatabaseConnections", - "namespace": "AWS/RDS", - "refId": "C", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "D", - "region": "us-west-2", - "statistic": "Average" - } - ], - "title": "Mixed CloudWatch and Prometheus Queries", - "type": "timeseries" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 13, - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 14, - "targets": [ - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "C", - "region": "us-east-1", - "statistic": "Sum" - } - ], - "title": "Nested CloudWatch Panel", - "type": "timeseries" - } - ], - "title": "Collapsed Row with CloudWatch", - "type": "row" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 35, - "tags": [], - "templating": { - "list": [ - { - "datasource": "default", - "name": "default_var", - "type": "query" - }, - { - "datasource": "Non Default Test Datasource", - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": "non-default-test-ds-uid", - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": null, - "name": "null_var", - "type": "query" - }, - { - "datasource": "non-existing-ds", - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.36.json b/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.36.json deleted file mode 100644 index 4cb55ff8a29..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.36.json +++ /dev/null @@ -1,531 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-123456" - }, - "enable": true, - "iconColor": "red", - "name": "CloudWatch Annotation Single Stat", - "namespace": "AWS/EC2", - "prefixMatching": false, - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Maximum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Maximum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Minimum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Minimum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Sum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Sum" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": true - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": false - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "hidden" - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table" - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 11, - "targets": [ - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "C", - "region": "us-east-1", - "statistic": "Minimum" - } - ], - "title": "CloudWatch Single Query Multiple Stats", - "type": "timeseries" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 12, - "targets": [ - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "A", - "region": "us-west-2", - "statistic": "Sum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "expr": "up", - "refId": "B" - }, - { - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "metricName": "DatabaseConnections", - "namespace": "AWS/RDS", - "refId": "C", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "D", - "region": "us-west-2", - "statistic": "Average" - } - ], - "title": "Mixed CloudWatch and Prometheus Queries", - "type": "timeseries" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 13, - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 14, - "targets": [ - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "C", - "region": "us-east-1", - "statistic": "Sum" - } - ], - "title": "Nested CloudWatch Panel", - "type": "timeseries" - } - ], - "title": "Collapsed Row with CloudWatch", - "type": "row" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 36, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.37.json b/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.37.json deleted file mode 100644 index ff0b34ce5c7..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.37.json +++ /dev/null @@ -1,540 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-123456" - }, - "enable": true, - "iconColor": "red", - "name": "CloudWatch Annotation Single Stat", - "namespace": "AWS/EC2", - "prefixMatching": false, - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Maximum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Maximum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Minimum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Minimum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Sum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Sum" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 11, - "targets": [ - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "C", - "region": "us-east-1", - "statistic": "Minimum" - } - ], - "title": "CloudWatch Single Query Multiple Stats", - "type": "timeseries" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 12, - "targets": [ - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "A", - "region": "us-west-2", - "statistic": "Sum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "expr": "up", - "refId": "B" - }, - { - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "metricName": "DatabaseConnections", - "namespace": "AWS/RDS", - "refId": "C", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "D", - "region": "us-west-2", - "statistic": "Average" - } - ], - "title": "Mixed CloudWatch and Prometheus Queries", - "type": "timeseries" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 13, - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 14, - "targets": [ - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "C", - "region": "us-east-1", - "statistic": "Sum" - } - ], - "title": "Nested CloudWatch Panel", - "type": "timeseries" - } - ], - "title": "Collapsed Row with CloudWatch", - "type": "row" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 37, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.38.json b/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.38.json deleted file mode 100644 index 0055a310934..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.38.json +++ /dev/null @@ -1,540 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-123456" - }, - "enable": true, - "iconColor": "red", - "name": "CloudWatch Annotation Single Stat", - "namespace": "AWS/EC2", - "prefixMatching": false, - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Maximum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Maximum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Minimum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Minimum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Sum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Sum" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 11, - "targets": [ - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "C", - "region": "us-east-1", - "statistic": "Minimum" - } - ], - "title": "CloudWatch Single Query Multiple Stats", - "type": "timeseries" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 12, - "targets": [ - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "A", - "region": "us-west-2", - "statistic": "Sum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "expr": "up", - "refId": "B" - }, - { - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "metricName": "DatabaseConnections", - "namespace": "AWS/RDS", - "refId": "C", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "D", - "region": "us-west-2", - "statistic": "Average" - } - ], - "title": "Mixed CloudWatch and Prometheus Queries", - "type": "timeseries" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 13, - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 14, - "targets": [ - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "C", - "region": "us-east-1", - "statistic": "Sum" - } - ], - "title": "Nested CloudWatch Panel", - "type": "timeseries" - } - ], - "title": "Collapsed Row with CloudWatch", - "type": "row" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 38, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.39.json b/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.39.json deleted file mode 100644 index b0a81e47b83..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.39.json +++ /dev/null @@ -1,540 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-123456" - }, - "enable": true, - "iconColor": "red", - "name": "CloudWatch Annotation Single Stat", - "namespace": "AWS/EC2", - "prefixMatching": false, - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Maximum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Maximum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Minimum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Minimum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Sum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Sum" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 11, - "targets": [ - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "C", - "region": "us-east-1", - "statistic": "Minimum" - } - ], - "title": "CloudWatch Single Query Multiple Stats", - "type": "timeseries" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 12, - "targets": [ - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "A", - "region": "us-west-2", - "statistic": "Sum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "expr": "up", - "refId": "B" - }, - { - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "metricName": "DatabaseConnections", - "namespace": "AWS/RDS", - "refId": "C", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "D", - "region": "us-west-2", - "statistic": "Average" - } - ], - "title": "Mixed CloudWatch and Prometheus Queries", - "type": "timeseries" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 13, - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 14, - "targets": [ - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "C", - "region": "us-east-1", - "statistic": "Sum" - } - ], - "title": "Nested CloudWatch Panel", - "type": "timeseries" - } - ], - "title": "Collapsed Row with CloudWatch", - "type": "row" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 39, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.40.json b/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.40.json deleted file mode 100644 index caef7c79ed9..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.40.json +++ /dev/null @@ -1,540 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-123456" - }, - "enable": true, - "iconColor": "red", - "name": "CloudWatch Annotation Single Stat", - "namespace": "AWS/EC2", - "prefixMatching": false, - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Maximum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Maximum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Minimum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Minimum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Sum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Sum" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 11, - "targets": [ - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "C", - "region": "us-east-1", - "statistic": "Minimum" - } - ], - "title": "CloudWatch Single Query Multiple Stats", - "type": "timeseries" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 12, - "targets": [ - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "A", - "region": "us-west-2", - "statistic": "Sum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "expr": "up", - "refId": "B" - }, - { - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "metricName": "DatabaseConnections", - "namespace": "AWS/RDS", - "refId": "C", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "D", - "region": "us-west-2", - "statistic": "Average" - } - ], - "title": "Mixed CloudWatch and Prometheus Queries", - "type": "timeseries" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 13, - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 14, - "targets": [ - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "C", - "region": "us-east-1", - "statistic": "Sum" - } - ], - "title": "Nested CloudWatch Panel", - "type": "timeseries" - } - ], - "title": "Collapsed Row with CloudWatch", - "type": "row" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 40, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.41.json b/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.41.json deleted file mode 100644 index 4446f01438c..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/33.multiple_stats_cloudwatch.41.json +++ /dev/null @@ -1,528 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - }, - { - "dimensions": { - "InstanceId": "i-123456" - }, - "enable": true, - "iconColor": "red", - "name": "CloudWatch Annotation Single Stat", - "namespace": "AWS/EC2", - "prefixMatching": false, - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Maximum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Maximum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Minimum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Minimum" - }, - { - "dimensions": { - "InstanceId": "i-789012" - }, - "enable": true, - "iconColor": "blue", - "name": "CloudWatch Annotation Multiple Stats - Sum", - "namespace": "AWS/RDS", - "prefixMatching": false, - "region": "us-west-2", - "statistic": "Sum" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 11, - "targets": [ - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "alias": "CPU Usage", - "dimensions": { - "InstanceId": "i-123456" - }, - "metricName": "CPUUtilization", - "namespace": "AWS/EC2", - "period": "300", - "refId": "C", - "region": "us-east-1", - "statistic": "Minimum" - } - ], - "title": "CloudWatch Single Query Multiple Stats", - "type": "timeseries" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 12, - "targets": [ - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "A", - "region": "us-west-2", - "statistic": "Sum" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "expr": "up", - "refId": "B" - }, - { - "dimensions": { - "DBInstanceIdentifier": "my-db" - }, - "metricName": "DatabaseConnections", - "namespace": "AWS/RDS", - "refId": "C", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "LoadBalancer": "my-load-balancer" - }, - "metricName": "RequestCount", - "namespace": "AWS/ApplicationELB", - "refId": "D", - "region": "us-west-2", - "statistic": "Average" - } - ], - "title": "Mixed CloudWatch and Prometheus Queries", - "type": "timeseries" - }, - { - "collapsed": true, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 56 - }, - "id": 13, - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 14, - "targets": [ - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "A", - "region": "us-east-1", - "statistic": "Average" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "B", - "region": "us-east-1", - "statistic": "Maximum" - }, - { - "dimensions": { - "QueueName": "my-queue" - }, - "metricName": "ApproximateNumberOfMessages", - "namespace": "AWS/SQS", - "refId": "C", - "region": "us-east-1", - "statistic": "Sum" - } - ], - "title": "Nested CloudWatch Panel", - "type": "timeseries" - } - ], - "title": "Collapsed Row with CloudWatch", - "type": "row" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 41, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": {}, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.35.json b/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.35.json deleted file mode 100644 index def2752a794..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.35.json +++ /dev/null @@ -1,273 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": "Non Default Test Datasource", - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": "non-default-test-ds-uid", - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": "default", - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": "non-existing-ds", - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": true - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": false - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "hidden" - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table" - } - }, - "title": "Visible Legend" - }, - { - "datasource": "default", - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": "non-default-test-ds-uid" - }, - { - "datasource": "Non Default Test Datasource" - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": "non-default-test-ds-uid" - }, - { - "datasource": "Non Default Test Datasource" - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": "non-existing-ds", - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": "non-existing-ds" - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 35, - "tags": [], - "templating": { - "list": [ - { - "datasource": "default", - "name": "default_var", - "type": "query" - }, - { - "datasource": "Non Default Test Datasource", - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": "non-default-test-ds-uid", - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": null, - "name": "null_var", - "type": "query" - }, - { - "datasource": "non-existing-ds", - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.36.json b/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.36.json deleted file mode 100644 index bf09726e8f4..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.36.json +++ /dev/null @@ -1,326 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": true - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": false - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "hidden" - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table" - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 36, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.37.json b/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.37.json deleted file mode 100644 index 4414e3fda41..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.37.json +++ /dev/null @@ -1,335 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 37, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.38.json b/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.38.json deleted file mode 100644 index de81e538c6f..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.38.json +++ /dev/null @@ -1,335 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 38, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.39.json b/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.39.json deleted file mode 100644 index b87acbfba7f..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.39.json +++ /dev/null @@ -1,335 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 39, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.40.json b/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.40.json deleted file mode 100644 index 9b7947d3d91..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.40.json +++ /dev/null @@ -1,335 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 40, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.41.json b/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.41.json deleted file mode 100644 index 817bc8cd71d..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/34.ensure_x_axis_visibility.41.json +++ /dev/null @@ -1,323 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - }, - { - "fieldConfig": { - "defaults": { - "custom": { - "axisPlacement": "hidden" - } - }, - "overrides": [ - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "auto" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 10, - "title": "Timeseries Panel with Hidden Axes", - "type": "timeseries" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 41, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": {}, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.36.json b/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.36.json deleted file mode 100644 index 15914372e3c..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.36.json +++ /dev/null @@ -1,294 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": true - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": false - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "hidden" - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table" - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 36, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.37.json b/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.37.json deleted file mode 100644 index 40d0e174518..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.37.json +++ /dev/null @@ -1,303 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 37, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.38.json b/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.38.json deleted file mode 100644 index 17b349fd896..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.38.json +++ /dev/null @@ -1,303 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 38, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.39.json b/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.39.json deleted file mode 100644 index d47e34d6785..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.39.json +++ /dev/null @@ -1,303 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 39, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.40.json b/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.40.json deleted file mode 100644 index af7a2eb948e..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.40.json +++ /dev/null @@ -1,303 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 40, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.41.json b/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.41.json deleted file mode 100644 index 5074235a154..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/35.ds_name_to_ref.41.json +++ /dev/null @@ -1,291 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by Name", - "type": "dashboard" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "enable": true, - "name": "Test Annotation by UID", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Default Annotation", - "type": "dashboard" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "enable": true, - "name": "Test Non-existing Annotation", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - }, - { - "datasource": null, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 7, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Datasources Panel" - }, - { - "datasource": { - "uid": "-- Mixed --" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 8, - "targets": [ - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - } - } - ], - "title": "Mixed Panel with Mixed Targets" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 9, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - } - } - ], - "title": "Non-existing Datasource Panel" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 41, - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "default_var", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_name", - "type": "query" - }, - { - "datasource": { - "apiVersion": "1", - "type": "loki", - "uid": "non-default-test-ds-uid" - }, - "name": "es_var_by_uid", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "null_var", - "type": "query" - }, - { - "datasource": { - "type": "prometheus", - "uid": "default-ds-uid" - }, - "name": "non_existing_var", - "type": "query" - } - ] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": {}, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.37.json b/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.37.json deleted file mode 100644 index 27e61667230..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.37.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 37, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.38.json b/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.38.json deleted file mode 100644 index de4220f3b61..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.38.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 38, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.39.json b/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.39.json deleted file mode 100644 index 472dbdd70a7..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.39.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 39, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.40.json b/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.40.json deleted file mode 100644 index e097b1e8402..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.40.json +++ /dev/null @@ -1,144 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 40, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.41.json b/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.41.json deleted file mode 100644 index fda6883a462..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/36.legend_normalization.41.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": {}, - "title": "No Legend Config", - "type": "graph" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "displayMode": "list", - "showLegend": true - } - }, - "title": "Boolean Legend True" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Boolean Legend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "Hidden DisplayMode" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "legend": { - "displayMode": "list", - "showLegend": false - } - }, - "title": "ShowLegend False" - }, - { - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "legend": { - "displayMode": "table", - "showLegend": true - } - }, - "title": "Visible Legend" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 41, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": {}, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.38.json b/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.38.json deleted file mode 100644 index 5a17d602e82..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.38.json +++ /dev/null @@ -1,387 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "basic", - "type": "gauge" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Basic Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "gradient", - "type": "gauge" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Gradient Gauge Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "lcd", - "type": "gauge" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "LCD Gauge Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "gradient", - "type": "color-background" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Color Background Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "basic", - "type": "color-background" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Color Background Solid Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "type": "some-other-mode" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Other Display Mode", - "type": "table" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 38, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.39.json b/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.39.json deleted file mode 100644 index dee3d62af57..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.39.json +++ /dev/null @@ -1,387 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "basic", - "type": "gauge" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Basic Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "gradient", - "type": "gauge" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Gradient Gauge Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "lcd", - "type": "gauge" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "LCD Gauge Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "gradient", - "type": "color-background" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Color Background Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "basic", - "type": "color-background" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Color Background Solid Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "type": "some-other-mode" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Other Display Mode", - "type": "table" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 39, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.40.json b/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.40.json deleted file mode 100644 index d5ddc2a55a8..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.40.json +++ /dev/null @@ -1,387 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "basic", - "type": "gauge" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Basic Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "gradient", - "type": "gauge" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Gradient Gauge Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "lcd", - "type": "gauge" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "LCD Gauge Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "gradient", - "type": "color-background" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Color Background Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "basic", - "type": "color-background" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Color Background Solid Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "type": "some-other-mode" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Other Display Mode", - "type": "table" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 40, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.41.json b/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.41.json deleted file mode 100644 index 2d1d083a874..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/37.timeseries_table_display_mode.41.json +++ /dev/null @@ -1,375 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "basic", - "type": "gauge" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Basic Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "gradient", - "type": "gauge" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Gradient Gauge Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "lcd", - "type": "gauge" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 3, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "LCD Gauge Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "gradient", - "type": "color-background" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 4, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Color Background Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "mode": "basic", - "type": "color-background" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 5, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Color Background Solid Display Mode", - "type": "table" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "cellOptions": { - "type": "some-other-mode" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 6, - "options": { - "showHeader": true - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "refId": "A" - } - ], - "title": "Other Display Mode", - "type": "table" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 41, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": {}, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.39.json b/apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.39.json deleted file mode 100644 index 19b3b5d79f8..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.39.json +++ /dev/null @@ -1,167 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "queryType": "randomWalk", - "refId": "A" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "queryType": "randomWalk", - "refId": "B" - } - ], - "title": "Panel Title", - "transformations": [ - { - "id": "timeSeriesTable", - "options": { - "A": { - "stat": "mean" - }, - "B": { - "stat": "max" - } - } - } - ], - "type": "timeseries" - } - ], - "preload": false, - "refresh": true, - "schemaVersion": 39, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.40.json b/apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.40.json deleted file mode 100644 index 63b0959daa1..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.40.json +++ /dev/null @@ -1,167 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "queryType": "randomWalk", - "refId": "A" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "queryType": "randomWalk", - "refId": "B" - } - ], - "title": "Panel Title", - "transformations": [ - { - "id": "timeSeriesTable", - "options": { - "A": { - "stat": "mean" - }, - "B": { - "stat": "max" - } - } - } - ], - "type": "timeseries" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 40, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.41.json b/apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.41.json deleted file mode 100644 index be300a117c6..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/38.transform_timeseries_table.41.json +++ /dev/null @@ -1,155 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "queryType": "randomWalk", - "refId": "A" - }, - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "queryType": "randomWalk", - "refId": "B" - } - ], - "title": "Panel Title", - "transformations": [ - { - "id": "timeSeriesTable", - "options": { - "A": { - "stat": "mean" - }, - "B": { - "stat": "max" - } - } - } - ], - "type": "timeseries" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 41, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": {}, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/39.refresh_true.40.json b/apps/dashboard/pkg/migration/testdata/output/39.refresh_true.40.json deleted file mode 100644 index 5c4ad99f35c..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/39.refresh_true.40.json +++ /dev/null @@ -1,146 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "queryType": "randomWalk", - "refId": "A" - } - ], - "title": "Panel Title", - "type": "timeseries" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 40, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/39.refresh_true.41.json b/apps/dashboard/pkg/migration/testdata/output/39.refresh_true.41.json deleted file mode 100644 index 8c6dfe8ba06..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/39.refresh_true.41.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "queryType": "randomWalk", - "refId": "A" - } - ], - "title": "Panel Title", - "type": "timeseries" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 41, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": {}, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/40.time_picker_time_options.41.json b/apps/dashboard/pkg/migration/testdata/output/40.time_picker_time_options.41.json deleted file mode 100644 index 8c6dfe8ba06..00000000000 --- a/apps/dashboard/pkg/migration/testdata/output/40.time_picker_time_options.41.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations \u0026 Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "panels": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 1, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.5.0-81438", - "targets": [ - { - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "queryType": "randomWalk", - "refId": "A" - } - ], - "title": "Panel Title", - "type": "timeseries" - } - ], - "preload": false, - "refresh": "", - "schemaVersion": 41, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": {}, - "timezone": "utc", - "title": "New dashboard", - "version": 0, - "weekStart": "" -} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/v33.panel_ds_name_to_ref.json b/apps/dashboard/pkg/migration/testdata/output/v33.panel_ds_name_to_ref.json new file mode 100644 index 00000000000..726ace48d39 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/output/v33.panel_ds_name_to_ref.json @@ -0,0 +1,270 @@ +{ + "panels": [ + { + "datasource": { + "apiVersion": "1", + "type": "loki", + "uid": "non-default-test-ds-uid" + }, + "description": "Tests v33 migration behavior when panel datasource is explicitly null. Should remain null after migration (returnDefaultAsNull: true).", + "id": 1, + "targets": [ + { + "datasource": { + "apiVersion": "1", + "type": "loki", + "uid": "non-default-test-ds-uid" + }, + "description": "Target with UID reference should migrate to full object", + "refId": "A" + } + ], + "title": "Panel Datasource: null → should stay null", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "existing-ref-uid" + }, + "description": "Tests v33 migration behavior when panel datasource is already a proper object reference. Should remain unchanged.", + "id": 2, + "targets": [ + { + "datasource": { + "type": "elasticsearch", + "uid": "existing-target-uid" + }, + "description": "Target with existing object should remain unchanged", + "refId": "A" + } + ], + "title": "Panel Datasource: existing object → should stay unchanged", + "type": "stat" + }, + { + "datasource": { + "apiVersion": "1", + "type": "loki", + "uid": "non-default-test-ds-uid" + }, + "description": "Tests v33 migration when panel datasource is a string name. Should convert to proper object with uid, type, apiVersion.", + "id": 3, + "targets": [ + { + "datasource": { + "apiVersion": "1", + "type": "loki", + "uid": "non-default-test-ds-uid" + }, + "refId": "A" + } + ], + "title": "Panel Datasource: string name → should migrate to object", + "type": "table" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "description": "Tests v33 migration when panel has datasource string but empty targets array. Panel datasource should still migrate.", + "id": 4, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "refId": "A" + } + ], + "title": "Panel Datasource: string name with empty targets → should migrate", + "type": "table" + }, + { + "datasource": { + "apiVersion": "1", + "type": "loki", + "uid": "non-default-test-ds-uid" + }, + "description": "Tests v33 target migration with various edge cases: null target (unchanged), valid string (migrated), non-existing string (preserved), missing datasource field (unchanged).", + "id": 5, + "targets": [ + { + "datasource": { + "apiVersion": "1", + "type": "loki", + "uid": "non-default-test-ds-uid" + }, + "description": "Null target datasource should remain null", + "refId": "A" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "description": "Valid string should migrate to object", + "refId": "B" + }, + { + "datasource": { + "uid": "non-existing-ds" + }, + "description": "Non-existing datasource should be preserved as-is (migration returns nil)", + "refId": "C" + }, + { + "datasource": { + "apiVersion": "1", + "type": "loki", + "uid": "non-default-test-ds-uid" + }, + "description": "Target without datasource field should remain unchanged", + "refId": "D" + } + ], + "title": "Target Datasources: mixed null/string/non-existing scenarios", + "type": "graph" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "description": "Tests v33 migration when panel datasource is null but targets have mixed reference types (object, string). Panel should stay null, targets should migrate appropriately.", + "id": 6, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "existing-ref" + }, + "description": "Existing object target should remain unchanged", + "refId": "A" + }, + { + "datasource": { + "apiVersion": "1", + "type": "loki", + "uid": "non-default-test-ds-uid" + }, + "description": "String target should migrate to object", + "refId": "B" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "description": "Default datasource string should migrate to object", + "refId": "C" + } + ], + "title": "Panel: null datasource with mixed target types", + "type": "timeseries" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "description": "Tests v33 migration behavior with empty string datasource. Should migrate to empty object {} based on MigrateDatasourceNameToRef logic.", + "id": 7, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "description": "Empty string target should also migrate to empty object {}", + "refId": "A" + } + ], + "title": "Empty string datasource → should return empty object {}", + "type": "stat" + }, + { + "datasource": { + "uid": "completely-missing-ds" + }, + "description": "Tests v33 migration with completely unknown datasource names. Since migration returns nil for unknown datasources, they should be preserved unchanged.", + "id": 8, + "targets": [ + { + "datasource": { + "uid": "also-missing-ds" + }, + "description": "Unknown target datasource should remain unchanged (migration returns nil)", + "refId": "A" + }, + { + "datasource": { + "uid": "completely-missing-ds" + }, + "description": "Empty string target should migrate to {}", + "refId": "B" + } + ], + "title": "Non-existing datasources → should be preserved as-is", + "type": "table" + }, + { + "collapsed": true, + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "description": "Tests v33 migration handles nested panels within collapsed rows. Nested panel datasources should migrate same as top-level panels.", + "id": 9, + "panels": [ + { + "datasource": { + "apiVersion": "1", + "type": "loki", + "uid": "non-default-test-ds-uid" + }, + "description": "Nested panel with string datasource should migrate to proper object reference, proving row panel recursion works.", + "id": 10, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "description": "Nested target should also migrate from string to object", + "refId": "A" + } + ], + "title": "Nested Panel: string datasource → should migrate to object", + "type": "timeseries" + } + ], + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "refId": "A" + } + ], + "title": "Row Panel: nested panels should also migrate", + "type": "row" + } + ], + "refresh": "", + "schemaVersion": 41, + "title": "V33 Panel Datasource Name to Ref Test" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/v34.multiple_stats_cloudwatch.json b/apps/dashboard/pkg/migration/testdata/output/v34.multiple_stats_cloudwatch.json new file mode 100644 index 00000000000..f6b772e84b9 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/output/v34.multiple_stats_cloudwatch.json @@ -0,0 +1,639 @@ +{ + "annotations": { + "list": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "InstanceId": "i-123456" + }, + "enable": true, + "iconColor": "red", + "name": "CloudWatch Annotation Single Statistic", + "namespace": "AWS/EC2", + "prefixMatching": false, + "region": "us-east-1", + "statistic": "Average" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "InstanceId": "i-789012" + }, + "enable": true, + "iconColor": "blue", + "name": "CloudWatch Annotation Multiple Statistics - Maximum", + "namespace": "AWS/RDS", + "prefixMatching": false, + "region": "us-west-2", + "statistic": "Maximum" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "LoadBalancer": "my-lb" + }, + "enable": true, + "iconColor": "green", + "name": "CloudWatch Annotation Empty Statistics", + "namespace": "AWS/ApplicationELB", + "prefixMatching": false, + "region": "us-west-1", + "statistics": [] + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "TableName": "my-table" + }, + "enable": true, + "iconColor": "yellow", + "name": "CloudWatch Annotation Invalid Statistics - InvalidStat", + "namespace": "AWS/DynamoDB", + "prefixMatching": false, + "region": "us-east-1", + "statistic": "InvalidStat" + }, + { + "datasource": { + "uid": "prometheus" + }, + "enable": true, + "iconColor": "purple", + "name": "Non-CloudWatch Annotation" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "InstanceId": "i-789012" + }, + "enable": true, + "iconColor": "blue", + "name": "CloudWatch Annotation Multiple Statistics - Minimum", + "namespace": "AWS/RDS", + "prefixMatching": false, + "region": "us-west-2", + "statistic": "Minimum" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "InstanceId": "i-789012" + }, + "enable": true, + "iconColor": "blue", + "name": "CloudWatch Annotation Multiple Statistics - Sum", + "namespace": "AWS/RDS", + "prefixMatching": false, + "region": "us-west-2", + "statistic": "Sum" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "TableName": "my-table" + }, + "enable": true, + "iconColor": "yellow", + "name": "CloudWatch Annotation Invalid Statistics - Sum", + "namespace": "AWS/DynamoDB", + "prefixMatching": false, + "region": "us-east-1", + "statistic": "Sum" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "TableName": "my-table" + }, + "enable": true, + "iconColor": "yellow", + "name": "CloudWatch Annotation Invalid Statistics - null", + "namespace": "AWS/DynamoDB", + "prefixMatching": false, + "region": "us-east-1" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "TableName": "my-table" + }, + "enable": true, + "iconColor": "yellow", + "name": "CloudWatch Annotation Invalid Statistics - Average", + "namespace": "AWS/DynamoDB", + "prefixMatching": false, + "region": "us-east-1", + "statistic": "Average" + } + ] + }, + "panels": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "id": 1, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "InstanceId": "i-123456" + }, + "metricEditorMode": 0, + "metricName": "CPUUtilization", + "metricQueryType": 0, + "namespace": "AWS/EC2", + "period": "300", + "refId": "A", + "region": "us-east-1", + "statistic": "Average" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "InstanceId": "i-123456" + }, + "metricEditorMode": 0, + "metricName": "CPUUtilization", + "metricQueryType": 0, + "namespace": "AWS/EC2", + "period": "300", + "refId": "B", + "region": "us-east-1", + "statistic": "Maximum" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "InstanceId": "i-123456" + }, + "metricEditorMode": 0, + "metricName": "CPUUtilization", + "metricQueryType": 0, + "namespace": "AWS/EC2", + "period": "300", + "refId": "C", + "region": "us-east-1", + "statistic": "Minimum" + } + ], + "title": "CloudWatch Single Query Multiple Statistics", + "type": "timeseries" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "id": 2, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "LoadBalancer": "my-load-balancer" + }, + "metricEditorMode": 0, + "metricName": "RequestCount", + "metricQueryType": 0, + "namespace": "AWS/ApplicationELB", + "refId": "A", + "region": "us-west-2", + "statistic": "Sum" + } + ], + "title": "CloudWatch Single Query Single Statistic", + "type": "timeseries" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "id": 3, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "DBInstanceIdentifier": "my-db" + }, + "metricEditorMode": 0, + "metricName": "DatabaseConnections", + "metricQueryType": 0, + "namespace": "AWS/RDS", + "refId": "A", + "region": "us-east-1", + "statistic": "Maximum" + } + ], + "title": "CloudWatch Query No Statistics Array", + "type": "timeseries" + }, + { + "datasource": { + "uid": "prometheus" + }, + "id": 4, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "QueueName": "my-queue" + }, + "metricEditorMode": 0, + "metricName": "ApproximateNumberOfMessages", + "metricQueryType": 0, + "namespace": "AWS/SQS", + "refId": "A", + "region": "us-east-1", + "statistic": "Average" + }, + { + "datasource": { + "uid": "prometheus" + }, + "expr": "up", + "refId": "B" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "TopicName": "my-topic" + }, + "metricEditorMode": 0, + "metricName": "NumberOfMessagesPublished", + "metricQueryType": 0, + "namespace": "AWS/SNS", + "refId": "C", + "region": "us-west-1", + "statistic": "Sum" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "QueueName": "my-queue" + }, + "metricEditorMode": 0, + "metricName": "ApproximateNumberOfMessages", + "metricQueryType": 0, + "namespace": "AWS/SQS", + "refId": "D", + "region": "us-east-1", + "statistic": "Maximum" + } + ], + "title": "Mixed CloudWatch and Non-CloudWatch Queries", + "type": "timeseries" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "id": 5, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "BucketName": "my-bucket" + }, + "metricEditorMode": 0, + "metricName": "BucketSizeBytes", + "metricQueryType": 0, + "namespace": "AWS/S3", + "refId": "A", + "region": "us-east-1", + "statistics": [] + } + ], + "title": "CloudWatch Query Empty Statistics", + "type": "timeseries" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "id": 6, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "FunctionName": "my-function" + }, + "metricEditorMode": 0, + "metricName": "Duration", + "metricQueryType": 0, + "namespace": "AWS/Lambda", + "refId": "A", + "region": "us-west-2", + "statistic": "InvalidStat" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "FunctionName": "my-function" + }, + "metricEditorMode": 0, + "metricName": "Duration", + "metricQueryType": 0, + "namespace": "AWS/Lambda", + "refId": "B", + "region": "us-west-2", + "statistic": "Average" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "FunctionName": "my-function" + }, + "metricEditorMode": 0, + "metricName": "Duration", + "metricQueryType": 0, + "namespace": "AWS/Lambda", + "refId": "C", + "region": "us-west-2" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "FunctionName": "my-function" + }, + "metricEditorMode": 0, + "metricName": "Duration", + "metricQueryType": 0, + "namespace": "AWS/Lambda", + "refId": "D", + "region": "us-west-2", + "statistic": "Maximum" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "FunctionName": "my-function" + }, + "metricEditorMode": 0, + "metricName": "Duration", + "metricQueryType": 0, + "namespace": "AWS/Lambda", + "refId": "E", + "region": "us-west-2", + "statistic": "" + } + ], + "title": "CloudWatch Query Invalid Statistics", + "type": "timeseries" + }, + { + "collapsed": true, + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "id": 7, + "panels": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "id": 8, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "StreamName": "my-stream" + }, + "metricEditorMode": 0, + "metricName": "IncomingRecords", + "metricQueryType": 0, + "namespace": "AWS/Kinesis", + "refId": "A", + "region": "us-east-1", + "statistic": "Sum" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "StreamName": "my-stream" + }, + "metricEditorMode": 0, + "metricName": "IncomingRecords", + "metricQueryType": 0, + "namespace": "AWS/Kinesis", + "refId": "B", + "region": "us-east-1", + "statistic": "Average" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "StreamName": "my-stream" + }, + "metricEditorMode": 0, + "metricName": "IncomingRecords", + "metricQueryType": 0, + "namespace": "AWS/Kinesis", + "refId": "C", + "region": "us-east-1", + "statistic": "Maximum" + } + ], + "title": "Nested CloudWatch Query Multiple Statistics", + "type": "timeseries" + } + ], + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "refId": "A" + } + ], + "title": "Collapsed Row with CloudWatch", + "type": "row" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "id": 9, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "ClusterName": "my-cluster" + }, + "metricEditorMode": 1, + "metricName": "CPUUtilization", + "metricQueryType": 1, + "namespace": "AWS/ECS", + "period": "300", + "refId": "A", + "region": "us-east-1", + "statistic": "Average" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "dimensions": { + "ClusterName": "my-cluster" + }, + "metricEditorMode": 1, + "metricName": "CPUUtilization", + "metricQueryType": 1, + "namespace": "AWS/ECS", + "period": "300", + "refId": "B", + "region": "us-east-1", + "statistic": "Maximum" + } + ], + "title": "CloudWatch Query with Existing Editor Mode", + "type": "timeseries" + }, + { + "datasource": { + "uid": "prometheus" + }, + "id": 10, + "targets": [ + { + "datasource": { + "uid": "prometheus" + }, + "expr": "cpu_usage", + "refId": "A" + } + ], + "title": "Non-CloudWatch Panel", + "type": "timeseries" + } + ], + "refresh": "", + "schemaVersion": 41, + "title": "CloudWatch Multiple Statistics Test Dashboard" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/v35.ensure_x_axis_visibility.json b/apps/dashboard/pkg/migration/testdata/output/v35.ensure_x_axis_visibility.json new file mode 100644 index 00000000000..44a51b53827 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/output/v35.ensure_x_axis_visibility.json @@ -0,0 +1,260 @@ +{ + "panels": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "fieldConfig": { + "defaults": { + "custom": { + "axisPlacement": "hidden" + } + }, + "overrides": [ + { + "matcher": { + "id": "byType", + "options": "time" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "auto" + } + ] + } + ] + }, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "refId": "A" + } + ], + "title": "Timeseries with Hidden Axis", + "type": "timeseries" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "fieldConfig": { + "defaults": { + "custom": { + "axisPlacement": "hidden" + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Series A" + }, + "properties": [ + { + "id": "color.mode", + "value": "palette-classic" + } + ] + }, + { + "matcher": { + "id": "byType", + "options": "time" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "auto" + } + ] + } + ] + }, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "refId": "A" + } + ], + "title": "Timeseries with Hidden Axis and Existing Overrides", + "type": "timeseries" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "fieldConfig": { + "defaults": { + "custom": { + "axisPlacement": "auto" + } + }, + "overrides": [] + }, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "refId": "A" + } + ], + "title": "Timeseries with Auto Axis (No Change Expected)", + "type": "timeseries" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "fieldConfig": { + "defaults": { + "custom": { + "axisPlacement": "hidden" + } + }, + "overrides": [] + }, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "refId": "A" + } + ], + "title": "Stat Panel with Hidden Axis (No Change Expected)", + "type": "stat" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "id": 5, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "refId": "A" + } + ], + "title": "Timeseries with Missing FieldConfig", + "type": "timeseries" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "fieldConfig": { + "overrides": [] + }, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "refId": "A" + } + ], + "title": "Timeseries with Missing Defaults", + "type": "timeseries" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "fieldConfig": { + "defaults": { + "unit": "bytes" + }, + "overrides": [] + }, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "refId": "A" + } + ], + "title": "Timeseries with Missing Custom Config", + "type": "timeseries" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "fieldConfig": { + "defaults": { + "custom": { + "axisPlacement": "hidden" + } + }, + "overrides": [ + { + "matcher": { + "id": "byType", + "options": "time" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "auto" + } + ] + } + ] + }, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "refId": "A" + } + ], + "title": "Timeseries with Missing Overrides Array", + "type": "timeseries" + } + ], + "refresh": "", + "schemaVersion": 41, + "title": "X-Axis Visibility Test Dashboard" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/v36.ds_name_to_ref.json b/apps/dashboard/pkg/migration/testdata/output/v36.ds_name_to_ref.json new file mode 100644 index 00000000000..0a16e2e5edf --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/output/v36.ds_name_to_ref.json @@ -0,0 +1,370 @@ +{ + "annotations": { + "list": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "name": "Default Annotation - Tests default datasource migration" + }, + { + "datasource": { + "apiVersion": "v2", + "type": "elasticsearch", + "uid": "existing-target-uid" + }, + "name": "Named Datasource Annotation - Tests migration by datasource name" + }, + { + "datasource": { + "apiVersion": "v2", + "type": "elasticsearch", + "uid": "existing-target-uid" + }, + "name": "UID Datasource Annotation - Tests migration by datasource UID" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "name": "Null Datasource Annotation - Tests null datasource fallback to default" + }, + { + "datasource": { + "uid": "unknown-datasource-name" + }, + "name": "Unknown Datasource Annotation - Tests unknown datasource preserved as UID" + } + ] + }, + "panels": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "description": "Tests null panel datasource migration with targets - should fallback to default", + "id": 1, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "refId": "A" + } + ], + "title": "Panel with Null Datasource and Targets" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "description": "Tests null panel datasource with empty targets array - should create default target", + "id": 2, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "refId": "A" + } + ], + "title": "Panel with Null Datasource and Empty Targets" + }, + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "description": "Tests null panel datasource with missing targets - should create default target array", + "id": 3, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "refId": "A" + } + ], + "title": "Panel with No Targets Array" + }, + { + "datasource": { + "uid": "-- Mixed --" + }, + "description": "Tests mixed datasource panel - targets should migrate independently", + "id": 4, + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "refId": "A" + }, + { + "datasource": { + "uid": "existing-target-uid" + }, + "refId": "B" + } + ], + "title": "Panel with Mixed Datasources" + }, + { + "datasource": { + "type": "prometheus", + "uid": "existing-ref-uid" + }, + "description": "Tests panel with already migrated datasource object - should preserve existing refs", + "id": 5, + "targets": [ + { + "datasource": { + "type": "elasticsearch", + "uid": "existing-target-uid" + }, + "refId": "A" + } + ], + "title": "Panel with Existing Object Datasource" + }, + { + "datasource": { + "uid": "unknown-panel-datasource" + }, + "description": "Tests panel with unknown datasource - should preserve as UID-only reference", + "id": 6, + "targets": [ + { + "datasource": { + "uid": "unknown-target-datasource" + }, + "refId": "A" + } + ], + "title": "Panel with Unknown Datasource Name" + }, + { + "datasource": { + "uid": "existing-target-uid" + }, + "description": "Tests panel with expression query - should not inherit expression as panel datasource", + "id": 7, + "targets": [ + { + "datasource": { + "uid": "existing-target-uid" + }, + "refId": "A" + }, + { + "datasource": { + "type": "__expr__", + "uid": "__expr__" + }, + "refId": "B" + } + ], + "title": "Panel with Expression Query" + }, + { + "datasource": { + "uid": "existing-target-uid" + }, + "description": "Tests panel inheriting datasource from target when panel datasource was default", + "id": 8, + "targets": [ + { + "datasource": { + "uid": "existing-target-uid" + }, + "refId": "A" + } + ], + "title": "Panel Inheriting from Target" + }, + { + "datasource": { + "apiVersion": "v2", + "type": "elasticsearch", + "uid": "existing-target-uid" + }, + "description": "Tests panel with datasource referenced by name - should migrate to full object", + "id": 9, + "targets": [ + { + "datasource": { + "apiVersion": "v2", + "type": "elasticsearch", + "uid": "existing-target-uid" + }, + "refId": "A" + } + ], + "title": "Panel with Named Datasource" + }, + { + "datasource": { + "apiVersion": "v2", + "type": "elasticsearch", + "uid": "existing-target-uid" + }, + "description": "Tests panel with datasource referenced by UID - should migrate to full object", + "id": 10, + "targets": [ + { + "datasource": { + "apiVersion": "v2", + "type": "elasticsearch", + "uid": "existing-target-uid" + }, + "refId": "A" + } + ], + "title": "Panel with UID Datasource" + }, + { + "collapsed": false, + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "description": "Tests row panel - it gets datasource or targets fields added even it is not needed, but this is how it works in frontend", + "id": 11, + "panels": [], + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "refId": "A" + } + ], + "title": "Simple Row Panel", + "type": "row" + }, + { + "collapsed": true, + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "description": "Tests collapsed row with nested panels - nested panels should migrate", + "id": 12, + "panels": [ + { + "datasource": { + "uid": "existing-target-uid" + }, + "description": "Nested panel in collapsed row with default datasource", + "id": 13, + "targets": [ + { + "datasource": { + "uid": "existing-target-uid" + }, + "refId": "A" + } + ], + "title": "Nested Panel with Default Datasource" + }, + { + "datasource": { + "uid": "unknown-nested-datasource" + }, + "description": "Nested panel in collapsed row with unknown datasource", + "id": 14, + "targets": [ + { + "datasource": { + "apiVersion": "v2", + "type": "elasticsearch", + "uid": "existing-target-uid" + }, + "refId": "A" + } + ], + "title": "Nested Panel with Unknown Datasource" + } + ], + "targets": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "refId": "A" + } + ], + "title": "Collapsed Row with Nested Panels", + "type": "row" + } + ], + "refresh": "", + "schemaVersion": 41, + "templating": { + "list": [ + { + "datasource": { + "apiVersion": "v1", + "type": "prometheus", + "uid": "default-ds-uid" + }, + "name": "query_var_null", + "type": "query" + }, + { + "datasource": { + "apiVersion": "v2", + "type": "elasticsearch", + "uid": "existing-target-uid" + }, + "name": "query_var_named", + "type": "query" + }, + { + "datasource": { + "apiVersion": "v2", + "type": "elasticsearch", + "uid": "existing-target-uid" + }, + "name": "query_var_uid", + "type": "query" + }, + { + "datasource": { + "uid": "unknown-datasource" + }, + "name": "query_var_unknown", + "type": "query" + }, + { + "datasource": null, + "name": "non_query_var", + "type": "constant" + } + ] + }, + "title": "Datasource Reference Migration Test Dashboard" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/v37.legend_normalization.json b/apps/dashboard/pkg/migration/testdata/output/v37.legend_normalization.json new file mode 100644 index 00000000000..45efd160102 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/output/v37.legend_normalization.json @@ -0,0 +1,130 @@ +{ + "panels": [ + { + "id": 1, + "options": { + "legend": true + }, + "title": "Panel with Boolean Legend True", + "type": "timeseries" + }, + { + "id": 2, + "options": { + "legend": false + }, + "title": "Panel with Boolean Legend False", + "type": "timeseries" + }, + { + "id": 3, + "options": { + "legend": { + "displayMode": "list", + "showLegend": false + } + }, + "title": "Panel with Hidden DisplayMode", + "type": "graph" + }, + { + "id": 4, + "options": { + "legend": { + "displayMode": "list", + "showLegend": false + } + }, + "title": "Panel with ShowLegend False", + "type": "stat" + }, + { + "id": 5, + "options": { + "legend": { + "displayMode": "table", + "placement": "bottom", + "showLegend": true + } + }, + "title": "Panel with Table Legend", + "type": "barchart" + }, + { + "id": 6, + "options": { + "legend": { + "displayMode": "list", + "placement": "right", + "showLegend": true + } + }, + "title": "Panel with List Legend", + "type": "histogram" + }, + { + "id": 7, + "title": "Panel with No Options", + "type": "text" + }, + { + "id": 8, + "options": { + "reduceOptions": { + "fields": "/.*temperature.*/" + } + }, + "title": "Panel with No Legend Config", + "type": "gauge" + }, + { + "id": 9, + "options": { + "legend": null + }, + "title": "Panel with Null Legend", + "type": "piechart" + }, + { + "collapsed": false, + "id": 10, + "panels": [ + { + "id": 11, + "options": { + "legend": true + }, + "title": "Nested Panel with Boolean Legend", + "type": "timeseries" + }, + { + "id": 12, + "options": { + "legend": { + "displayMode": "list", + "showLegend": false + } + }, + "title": "Nested Panel with Hidden DisplayMode", + "type": "graph" + }, + { + "id": 13, + "options": { + "legend": { + "displayMode": "list", + "showLegend": false + } + }, + "title": "Nested Panel with Conflicting Properties", + "type": "stat" + } + ], + "title": "Row with Nested Panels Having Various Legend Configs", + "type": "row" + } + ], + "refresh": "", + "schemaVersion": 41, + "title": "V37 Legend Normalization Test Dashboard" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/v38.table_displaymode_comprehensive.json b/apps/dashboard/pkg/migration/testdata/output/v38.table_displaymode_comprehensive.json new file mode 100644 index 00000000000..f8dd6259852 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/output/v38.table_displaymode_comprehensive.json @@ -0,0 +1,223 @@ +{ + "panels": [ + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "mode": "basic", + "type": "gauge" + } + } + }, + "overrides": [] + }, + "id": 1, + "title": "Table with Basic Gauge", + "type": "table" + }, + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "mode": "gradient", + "type": "gauge" + } + } + }, + "overrides": [] + }, + "id": 2, + "title": "Table with Gradient Gauge", + "type": "table" + }, + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "mode": "lcd", + "type": "gauge" + } + } + }, + "overrides": [] + }, + "id": 3, + "title": "Table with LCD Gauge", + "type": "table" + }, + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "mode": "gradient", + "type": "color-background" + } + } + }, + "overrides": [] + }, + "id": 4, + "title": "Table with Color Background", + "type": "table" + }, + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "mode": "basic", + "type": "color-background" + } + } + }, + "overrides": [] + }, + "id": 5, + "title": "Table with Color Background Solid", + "type": "table" + }, + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "type": "some-other-mode" + } + } + }, + "overrides": [] + }, + "id": 6, + "title": "Table with Unknown Mode", + "type": "table" + }, + { + "fieldConfig": { + "defaults": { + "custom": { + "width": 100 + } + }, + "overrides": [] + }, + "id": 7, + "title": "Table with No Display Mode", + "type": "table" + }, + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "mode": "basic", + "type": "gauge" + } + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Field1" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "gradient", + "type": "gauge" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Field2" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "gradient", + "type": "color-background" + } + } + ] + } + ] + }, + "id": 8, + "title": "Table with Overrides", + "type": "table" + }, + { + "id": 9, + "title": "Non-table Panel (Should Remain Unchanged)", + "type": "graph" + }, + { + "collapsed": false, + "id": 10, + "panels": [ + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "mode": "basic", + "type": "gauge" + } + } + }, + "overrides": [] + }, + "id": 11, + "title": "Nested Table with Basic Mode", + "type": "table" + }, + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "mode": "gradient", + "type": "gauge" + } + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "NestedField" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "lcd", + "type": "gauge" + } + } + ] + } + ] + }, + "id": 12, + "title": "Nested Table with Gradient Gauge", + "type": "table" + } + ], + "title": "Row with Nested Table Panels", + "type": "row" + } + ], + "refresh": "", + "schemaVersion": 41, + "title": "V38 Table Migration Comprehensive Test Dashboard" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/v38.timeseries_table_display_mode.json b/apps/dashboard/pkg/migration/testdata/output/v38.timeseries_table_display_mode.json new file mode 100644 index 00000000000..30429f23791 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/output/v38.timeseries_table_display_mode.json @@ -0,0 +1,223 @@ +{ + "panels": [ + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "mode": "basic", + "type": "gauge" + } + } + }, + "overrides": [] + }, + "id": 1, + "title": "Table with Basic Gauge", + "type": "table" + }, + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "mode": "gradient", + "type": "gauge" + } + } + }, + "overrides": [] + }, + "id": 2, + "title": "Table with Gradient Gauge", + "type": "table" + }, + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "mode": "lcd", + "type": "gauge" + } + } + }, + "overrides": [] + }, + "id": 3, + "title": "Table with LCD Gauge", + "type": "table" + }, + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "mode": "gradient", + "type": "color-background" + } + } + }, + "overrides": [] + }, + "id": 4, + "title": "Table with Color Background", + "type": "table" + }, + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "mode": "basic", + "type": "color-background" + } + } + }, + "overrides": [] + }, + "id": 5, + "title": "Table with Color Background Solid", + "type": "table" + }, + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "type": "some-other-mode" + } + } + }, + "overrides": [] + }, + "id": 6, + "title": "Table with Unknown Mode", + "type": "table" + }, + { + "fieldConfig": { + "defaults": { + "custom": { + "width": 100 + } + }, + "overrides": [] + }, + "id": 7, + "title": "Table with No Display Mode", + "type": "table" + }, + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "mode": "basic", + "type": "gauge" + } + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Field1" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "gradient", + "type": "gauge" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Field2" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "gradient", + "type": "color-background" + } + } + ] + } + ] + }, + "id": 8, + "title": "Table with Overrides", + "type": "table" + }, + { + "id": 9, + "title": "Non-table Panel (Should Remain Unchanged)", + "type": "graph" + }, + { + "collapsed": false, + "id": 10, + "panels": [ + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "mode": "basic", + "type": "gauge" + } + } + }, + "overrides": [] + }, + "id": 11, + "title": "Nested Table with Basic Mode", + "type": "table" + }, + { + "fieldConfig": { + "defaults": { + "custom": { + "cellOptions": { + "mode": "gradient", + "type": "gauge" + } + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "NestedField" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "lcd", + "type": "gauge" + } + } + ] + } + ] + }, + "id": 12, + "title": "Nested Table with Gradient Gauge", + "type": "table" + } + ], + "title": "Row with Nested Table Panels", + "type": "row" + } + ], + "refresh": "", + "schemaVersion": 41, + "title": "V38 Table Migration Test Dashboard" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/v39.transform_timeseries_table.json b/apps/dashboard/pkg/migration/testdata/output/v39.transform_timeseries_table.json new file mode 100644 index 00000000000..b77c90a25fe --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/output/v39.transform_timeseries_table.json @@ -0,0 +1,159 @@ +{ + "panels": [ + { + "id": 1, + "title": "Panel with TimeSeriesTable Transformation - Single Stat", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "A": { + "stat": "mean" + } + } + } + ], + "type": "table" + }, + { + "id": 2, + "title": "Panel with TimeSeriesTable Transformation - Multiple Stats", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "A": { + "stat": "mean" + }, + "B": { + "stat": "max" + }, + "C": { + "stat": "min" + }, + "D": { + "stat": "sum" + } + } + } + ], + "type": "table" + }, + { + "id": 3, + "title": "Panel with TimeSeriesTable Transformation - Mixed with Other Transforms", + "transformations": [ + { + "id": "reduce", + "options": { + "reducers": [ + "mean" + ] + } + }, + { + "id": "timeSeriesTable", + "options": { + "A": { + "stat": "last" + }, + "B": { + "stat": "first" + } + } + }, + { + "id": "organize", + "options": { + "excludeByName": {} + } + } + ], + "type": "graph" + }, + { + "id": 4, + "title": "Panel with Non-TimeSeriesTable Transformation (Should Remain Unchanged)", + "transformations": [ + { + "id": "reduce", + "options": { + "reducers": [ + "mean", + "max" + ] + } + } + ], + "type": "stat" + }, + { + "id": 5, + "title": "Panel with TimeSeriesTable - Empty RefIdToStat", + "transformations": [ + { + "id": "timeSeriesTable", + "options": {} + } + ], + "type": "table" + }, + { + "id": 6, + "title": "Panel with TimeSeriesTable - No Options (Should Skip)", + "transformations": [ + { + "id": "timeSeriesTable" + } + ], + "type": "table" + }, + { + "id": 7, + "title": "Panel with TimeSeriesTable - Invalid Options (Should Skip)", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "someOtherOption": "value" + } + } + ], + "type": "table" + }, + { + "id": 8, + "title": "Panel with No Transformations (Should Remain Unchanged)", + "type": "graph" + }, + { + "collapsed": false, + "id": 9, + "panels": [ + { + "id": 10, + "title": "Nested Panel with TimeSeriesTable", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "NestedA": { + "stat": "median" + }, + "NestedB": { + "stat": "stdDev" + } + } + } + ], + "type": "table" + } + ], + "title": "Row with Nested Panels Having TimeSeriesTable Transformations", + "type": "row" + } + ], + "refresh": "", + "schemaVersion": 41, + "title": "V39 TimeSeriesTable Transformation Migration Test Dashboard" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/v40.refresh_empty_string.json b/apps/dashboard/pkg/migration/testdata/output/v40.refresh_empty_string.json new file mode 100644 index 00000000000..06fbc55b639 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/output/v40.refresh_empty_string.json @@ -0,0 +1,10 @@ +{ + "panels": [], + "refresh": "", + "schemaVersion": 41, + "time": { + "from": "now-6h", + "to": "now" + }, + "title": "Empty String Refresh Test Dashboard" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/v40.refresh_false.json b/apps/dashboard/pkg/migration/testdata/output/v40.refresh_false.json new file mode 100644 index 00000000000..5473630eec9 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/output/v40.refresh_false.json @@ -0,0 +1,10 @@ +{ + "panels": [], + "refresh": "", + "schemaVersion": 41, + "time": { + "from": "now-6h", + "to": "now" + }, + "title": "Boolean False Refresh Test Dashboard" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/v40.refresh_not_set.json b/apps/dashboard/pkg/migration/testdata/output/v40.refresh_not_set.json new file mode 100644 index 00000000000..8e72e88780c --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/output/v40.refresh_not_set.json @@ -0,0 +1,10 @@ +{ + "panels": [], + "refresh": "", + "schemaVersion": 41, + "time": { + "from": "now-6h", + "to": "now" + }, + "title": "Refresh Not Set Test Dashboard" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/v40.refresh_numeric.json b/apps/dashboard/pkg/migration/testdata/output/v40.refresh_numeric.json new file mode 100644 index 00000000000..39fd89b22e4 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/output/v40.refresh_numeric.json @@ -0,0 +1,10 @@ +{ + "panels": [], + "refresh": "", + "schemaVersion": 41, + "time": { + "from": "now-6h", + "to": "now" + }, + "title": "Numeric Refresh Test Dashboard" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/v40.refresh_string.json b/apps/dashboard/pkg/migration/testdata/output/v40.refresh_string.json new file mode 100644 index 00000000000..936c5a1b6d9 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/output/v40.refresh_string.json @@ -0,0 +1,10 @@ +{ + "panels": [], + "refresh": "1m", + "schemaVersion": 41, + "time": { + "from": "now-6h", + "to": "now" + }, + "title": "String Refresh Test Dashboard" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/v40.refresh_true.json b/apps/dashboard/pkg/migration/testdata/output/v40.refresh_true.json new file mode 100644 index 00000000000..42ef73051d5 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/output/v40.refresh_true.json @@ -0,0 +1,10 @@ +{ + "panels": [], + "refresh": "", + "schemaVersion": 41, + "time": { + "from": "now-6h", + "to": "now" + }, + "title": "Boolean Refresh Test Dashboard" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/v41.no_time_picker.json b/apps/dashboard/pkg/migration/testdata/output/v41.no_time_picker.json new file mode 100644 index 00000000000..e9a821fa3d1 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/output/v41.no_time_picker.json @@ -0,0 +1,10 @@ +{ + "panels": [], + "refresh": "", + "schemaVersion": 41, + "time": { + "from": "now-6h", + "to": "now" + }, + "title": "No Time Picker Test Dashboard" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/v41.time_picker_no_time_options.json b/apps/dashboard/pkg/migration/testdata/output/v41.time_picker_no_time_options.json new file mode 100644 index 00000000000..0d9dbbdfa03 --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/output/v41.time_picker_no_time_options.json @@ -0,0 +1,18 @@ +{ + "schemaVersion": 41, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "title": "Time Picker No Time Options Test Dashboard" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testdata/output/v41.time_picker_time_options.json b/apps/dashboard/pkg/migration/testdata/output/v41.time_picker_time_options.json new file mode 100644 index 00000000000..20a1d5bb9ca --- /dev/null +++ b/apps/dashboard/pkg/migration/testdata/output/v41.time_picker_time_options.json @@ -0,0 +1,24 @@ +{ + "panels": [], + "refresh": "", + "schemaVersion": 41, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "title": "Time Picker Time Options Test Dashboard" +} \ No newline at end of file diff --git a/apps/dashboard/pkg/migration/testutil/mocks.go b/apps/dashboard/pkg/migration/testutil/mocks.go index 8a18d2cc92b..7b7321b8ca1 100644 --- a/apps/dashboard/pkg/migration/testutil/mocks.go +++ b/apps/dashboard/pkg/migration/testutil/mocks.go @@ -8,19 +8,51 @@ func (m *TestDataSourceProvider) GetDataSourceInfo() []schemaversion.DataSourceI return []schemaversion.DataSourceInfo{ { Default: true, - UID: "default-ds", + UID: "default-ds-uid", Type: "prometheus", APIVersion: "v1", - Name: "Default", + Name: "Default Test Datasource Name", ID: 1, }, { Default: false, - UID: "other-ds", + UID: "non-default-test-ds-uid", + Type: "loki", + APIVersion: "1", + Name: "Non Default Test Datasource Name", + ID: 2, + }, + { + Default: false, + UID: "existing-ref-uid", + Type: "prometheus", + APIVersion: "v1", + Name: "Existing Ref Name", + ID: 3, + }, + { + Default: false, + UID: "existing-target-uid", Type: "elasticsearch", APIVersion: "v2", - Name: "Elasticsearch", - ID: 2, + Name: "Existing Target Name", + ID: 4, + }, + { + Default: false, + UID: "existing-ref", + Type: "prometheus", + APIVersion: "v1", + Name: "Existing Ref Name", + ID: 5, + }, + { + Default: false, + UID: "-- Mixed --", + Type: "mixed", + APIVersion: "v1", + Name: "-- Mixed --", + ID: 6, }, } } diff --git a/public/app/features/dashboard/state/DashboardMigrator.ts b/public/app/features/dashboard/state/DashboardMigrator.ts index bd3dc6b812f..da9a51195f1 100644 --- a/public/app/features/dashboard/state/DashboardMigrator.ts +++ b/public/app/features/dashboard/state/DashboardMigrator.ts @@ -830,16 +830,16 @@ export class DashboardMigrator { if (oldVersion < 37) { panelUpgrades.push((panel: PanelModel) => { - if ( - panel.options?.legend && + if (panel.options?.legend && typeof panel.options.legend === 'object') { // There were two ways to hide the legend, this normalizes to `legend.showLegend` - (panel.options.legend.displayMode === 'hidden' || panel.options.legend.showLegend === false) - ) { - panel.options.legend.displayMode = 'list'; - panel.options.legend.showLegend = false; - } else if (panel.options?.legend) { - panel.options.legend = { ...panel.options?.legend, showLegend: true }; + if (panel.options.legend.displayMode === 'hidden' || panel.options.legend.showLegend === false) { + panel.options.legend.displayMode = 'list'; + panel.options.legend.showLegend = false; + } else { + panel.options.legend = { ...panel.options.legend, showLegend: true }; + } } + return panel; }); } diff --git a/public/app/features/dashboard/state/DashboardMigratorToBackend.test.ts b/public/app/features/dashboard/state/DashboardMigratorToBackend.test.ts new file mode 100644 index 00000000000..31319ea1c70 --- /dev/null +++ b/public/app/features/dashboard/state/DashboardMigratorToBackend.test.ts @@ -0,0 +1,125 @@ +import { readdirSync, readFileSync } from 'fs'; +import path from 'path'; + +import { mockDataSource } from 'app/features/alerting/unified/mocks'; +import { setupDataSources } from 'app/features/alerting/unified/testSetup/datasources'; +import { MIXED_DATASOURCE_NAME } from 'app/plugins/datasource/mixed/MixedDataSource'; + +import { DASHBOARD_SCHEMA_VERSION } from './DashboardMigrator'; +import { DashboardModel } from './DashboardModel'; + +/* + * Backend / Frontend Migration Comparison Test Design Explanation: + * + * This test compares backend and frontend migration results by running both through DashboardModel. + * This approach is correct and not flaky for the following reasons: + * + * 1. Frontend Migration Path: + * jsonInput (e.g. v39) → DashboardModel → DashboardMigrator runs → migrates to v41 → getSaveModelClone() + * + * 2. Backend Migration Path: + * jsonInput (e.g. v39) → Backend Migration → backendOutput (v41) → DashboardModel → DashboardMigrator sees v41 → early return (no migration) → getSaveModelClone() + * + * 3. Why DashboardMigrator doesn't run on backendOutput: + * - DashboardMigrator.updateSchema() has an early return: `if (oldVersion === this.dashboard.schemaVersion) return;` + * - Since backendOutput.schemaVersion is already 41 (latest), no migration occurs + * - This ensures we compare the final migrated state from both paths + * + * 4. Benefits of this approach: + * - Tests the complete integration (backend migration + DashboardModel) + * - Accounts for DashboardModel's default value handling and normalization + * - Ensures both paths produce identical final dashboard states + * - Avoids test brittleness from comparing raw JSON with different default value representations + */ + +// Set up the same datasources as backend test provider to ensure consistency +const dataSources = { + default: mockDataSource({ + name: 'Default Test Datasource Name', + uid: 'default-ds-uid', + type: 'prometheus', + isDefault: true, + }), + nonDefault: mockDataSource({ + name: 'Non Default Test Datasource Name', + uid: 'non-default-test-ds-uid', + type: 'loki', + isDefault: false, + }), + existingRef: mockDataSource({ + name: 'Existing Ref Name', + uid: 'existing-ref-uid', + type: 'prometheus', + isDefault: false, + }), + existingTarget: mockDataSource({ + name: 'Existing Target Name', + uid: 'existing-target-uid', + type: 'elasticsearch', + isDefault: false, + }), + existingRefAlt: mockDataSource({ + name: 'Existing Ref Name', + uid: 'existing-ref', + type: 'prometheus', + isDefault: false, + }), + mixed: mockDataSource({ + name: MIXED_DATASOURCE_NAME, + type: 'mixed', + uid: MIXED_DATASOURCE_NAME, + isDefault: false, + }), +}; + +setupDataSources(...Object.values(dataSources)); + +describe('Backend / Frontend result comparison', () => { + const inputDir = path.join( + __dirname, + '..', + '..', + '..', + '..', + '..', + 'apps', + 'dashboard', + 'pkg', + 'migration', + 'testdata', + 'input' + ); + const outputDir = path.join( + __dirname, + '..', + '..', + '..', + '..', + '..', + 'apps', + 'dashboard', + 'pkg', + 'migration', + 'testdata', + 'output' + ); + + const jsonInputs = readdirSync(inputDir); + + jsonInputs.forEach((inputFile) => { + it(`should migrate ${inputFile} correctly`, async () => { + const jsonInput = JSON.parse(readFileSync(path.join(inputDir, inputFile), 'utf8')); + + const backendOutput = JSON.parse(readFileSync(path.join(outputDir, inputFile), 'utf8')); + + // Make sure the backend output always migrates to the latest version + expect(backendOutput.schemaVersion).toEqual(DASHBOARD_SCHEMA_VERSION); + + // Compare both migrations, when mounted in dashboard model, after serializing to JSON are the same. + // This avoid issues with the default values in the frontend, wheter they were set in the input JSON or not. + const frontendMigrationResult = new DashboardModel(jsonInput).getSaveModelClone(); + const backendMigrationResult = new DashboardModel(backendOutput).getSaveModelClone(); + expect(backendMigrationResult).toMatchObject(frontendMigrationResult); + }); + }); +}); From 4d8678c7f2ccb7e8969a16cca2c3d3d123e9e99c Mon Sep 17 00:00:00 2001 From: Dana Axinte <53751979+dana-axinte@users.noreply.github.com> Date: Thu, 3 Jul 2025 11:29:14 +0100 Subject: [PATCH 09/19] SecretsManager: Add base encryption manager (#107562) Co-authored-by: Michael Mandrus Co-authored-by: Matheus Macabu --- conf/defaults.ini | 9 + conf/sample.ini | 9 + .../apis/secret/contracts/encryption.go | 3 - .../apis/secret/encryption/cipher/cipher.go | 10 - .../cipher/provider/cipher_aesgcm.go | 7 +- .../cipher/provider/cipher_aesgcm_test.go | 16 +- .../cipher/provider/decipher_aescfb.go | 52 -- .../cipher/provider/decipher_aescfb_test.go | 70 --- .../encryption/cipher/provider/provider.go | 18 - .../cipher/provider/provider_test.go | 17 - .../aescfb_encrypt_correct_output.rb | 35 -- .../encryption/cipher/service/service.go | 80 +--- .../encryption/cipher/service/service_test.go | 22 - pkg/registry/apis/secret/encryption/doc.go | 5 + .../defaultprovider/grafana_provider.go | 28 ++ .../encryption/kmsproviders/kmsproviders.go | 19 + .../apis/secret/encryption/manager/manager.go | 403 ++++++++++++++++ .../secret/encryption/manager/manager_test.go | 448 ++++++++++++++++++ .../apis/secret/encryption/manager/metrics.go | 51 ++ .../secret/encryption/manager/test_helpers.go | 49 ++ .../apis/secret/encryption/secrets.go | 19 + .../secret/secretkeeper/secretkeeper_test.go | 31 +- .../secretkeeper/sqlkeeper/keeper_test.go | 177 +++---- pkg/server/wire.go | 4 + pkg/server/wire_gen.go | 4 +- pkg/server/wireexts_oss.go | 4 + pkg/setting/setting_secrets_manager.go | 8 - .../encryption/encrypted_value_store.go | 6 +- 28 files changed, 1173 insertions(+), 431 deletions(-) delete mode 100644 pkg/registry/apis/secret/encryption/cipher/provider/decipher_aescfb.go delete mode 100644 pkg/registry/apis/secret/encryption/cipher/provider/decipher_aescfb_test.go delete mode 100644 pkg/registry/apis/secret/encryption/cipher/provider/provider.go delete mode 100644 pkg/registry/apis/secret/encryption/cipher/provider/provider_test.go delete mode 100644 pkg/registry/apis/secret/encryption/cipher/provider/test_fixtures/aescfb_encrypt_correct_output.rb create mode 100644 pkg/registry/apis/secret/encryption/doc.go create mode 100644 pkg/registry/apis/secret/encryption/kmsproviders/defaultprovider/grafana_provider.go create mode 100644 pkg/registry/apis/secret/encryption/kmsproviders/kmsproviders.go create mode 100644 pkg/registry/apis/secret/encryption/manager/manager.go create mode 100644 pkg/registry/apis/secret/encryption/manager/manager_test.go create mode 100644 pkg/registry/apis/secret/encryption/manager/metrics.go create mode 100644 pkg/registry/apis/secret/encryption/manager/test_helpers.go diff --git a/conf/defaults.ini b/conf/defaults.ini index dd3b6cd1d3c..39d79f1509e 100644 --- a/conf/defaults.ini +++ b/conf/defaults.ini @@ -2146,6 +2146,15 @@ frontend_poll_interval = 2s # With "unchanged", all Alert Rules will be created with the pause state unchanged coming from the source instance. alert_rules_state = "paused" +###################################### Secrets Manager ###################################### +[secrets_manager] +# Used for signing +secret_key = SW2YcwTIb9zpOOhoPsMm +# Current key provider used for envelope encryption, default to static value specified by secret_key +encryption_provider = secretKey.v1 +# List of configured key providers, space separated (Enterprise only): e.g., awskms.v1 azurekv.v1 +available_encryption_providers = + ################################## Frontend development configuration ################################### # Warning! Any settings placed in this section will be available on `process.env.frontend_dev_{foo}` within frontend code # Any values placed here may be accessible to the UI. Do not place sensitive information here. diff --git a/conf/sample.ini b/conf/sample.ini index 892e294492d..d4f71ccdb51 100644 --- a/conf/sample.ini +++ b/conf/sample.ini @@ -2047,6 +2047,15 @@ default_datasource_uid = # With "unchanged", all Alert Rules will be created with the pause state unchanged coming from the source instance. ;alert_rules_state = "paused" +###################################### Secrets Manager ###################################### +[secrets_manager] +# Used for signing +;secret_key = SW2YcwTIb9zpOOhoPsMm +# Current key provider used for envelope encryption, default to static value specified by secret_key +;encryption_provider = secretKey.v1 +# List of configured key providers, space separated (Enterprise only): e.g., awskms.v1 azurekv.v1 +;available_encryption_providers = + ################################## Frontend development configuration ################################### # Warning! Any settings placed in this section will be available on `process.env.frontend_dev_{foo}` within frontend code # Any values placed here may be accessible to the UI. Do not place sensitive information here. diff --git a/pkg/registry/apis/secret/contracts/encryption.go b/pkg/registry/apis/secret/contracts/encryption.go index 915674179c0..176fb8ace24 100644 --- a/pkg/registry/apis/secret/contracts/encryption.go +++ b/pkg/registry/apis/secret/contracts/encryption.go @@ -10,9 +10,6 @@ type EncryptionManager interface { // implementation present at manager.EncryptionService. Encrypt(ctx context.Context, namespace string, payload []byte) ([]byte, error) Decrypt(ctx context.Context, namespace string, payload []byte) ([]byte, error) - - RotateDataKeys(ctx context.Context, namespace string) error - ReEncryptDataKeys(ctx context.Context, namespace string) error } type EncryptedValue struct { diff --git a/pkg/registry/apis/secret/encryption/cipher/cipher.go b/pkg/registry/apis/secret/encryption/cipher/cipher.go index 73a8b245d54..15f724f5557 100644 --- a/pkg/registry/apis/secret/encryption/cipher/cipher.go +++ b/pkg/registry/apis/secret/encryption/cipher/cipher.go @@ -4,11 +4,6 @@ import ( "context" ) -const ( - AesCfb = "aes-cfb" - AesGcm = "aes-gcm" -) - type Cipher interface { Encrypter Decrypter @@ -21,8 +16,3 @@ type Encrypter interface { type Decrypter interface { Decrypt(ctx context.Context, payload []byte, secret string) ([]byte, error) } - -type Provider interface { - ProvideCiphers() map[string]Encrypter - ProvideDeciphers() map[string]Decrypter -} diff --git a/pkg/registry/apis/secret/encryption/cipher/provider/cipher_aesgcm.go b/pkg/registry/apis/secret/encryption/cipher/provider/cipher_aesgcm.go index c5072b60092..39b28aabdb6 100644 --- a/pkg/registry/apis/secret/encryption/cipher/provider/cipher_aesgcm.go +++ b/pkg/registry/apis/secret/encryption/cipher/provider/cipher_aesgcm.go @@ -10,7 +10,10 @@ import ( "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/cipher" ) -const gcmSaltLength = 8 +const ( + gcmSaltLength = 8 + AesGcm = "aes-gcm" +) var ( _ cipher.Encrypter = (*aesGcmCipher)(nil) @@ -23,7 +26,7 @@ type aesGcmCipher struct { randReader io.Reader } -func newAesGcmCipher() aesGcmCipher { +func NewAesGcmCipher() aesGcmCipher { return aesGcmCipher{ randReader: rand.Reader, } diff --git a/pkg/registry/apis/secret/encryption/cipher/provider/cipher_aesgcm_test.go b/pkg/registry/apis/secret/encryption/cipher/provider/cipher_aesgcm_test.go index c09c66d9b9e..09b485c2482 100644 --- a/pkg/registry/apis/secret/encryption/cipher/provider/cipher_aesgcm_test.go +++ b/pkg/registry/apis/secret/encryption/cipher/provider/cipher_aesgcm_test.go @@ -20,7 +20,7 @@ func TestGcmEncryption(t *testing.T) { salt := []byte("abcdefgh") nonce := []byte("123456789012") - cipher := newAesGcmCipher() + cipher := NewAesGcmCipher() cipher.randReader = bytes.NewReader(append(salt, nonce...)) payload := []byte("grafana unit test") @@ -40,7 +40,7 @@ func TestGcmEncryption(t *testing.T) { t.Run("fails if random source is empty", func(t *testing.T) { t.Parallel() - cipher := newAesGcmCipher() + cipher := NewAesGcmCipher() cipher.randReader = bytes.NewReader([]byte{}) payload := []byte("grafana unit test") @@ -56,7 +56,7 @@ func TestGcmEncryption(t *testing.T) { // Scenario: the random source has enough entropy for the salt, but not for the nonce. // In this case, we should fail with an error. - cipher := newAesGcmCipher() + cipher := NewAesGcmCipher() cipher.randReader = bytes.NewReader([]byte("abcdefgh")) // 8 bytes for salt, but not enough for nonce payload := []byte("grafana unit test") @@ -75,7 +75,7 @@ func TestGcmDecryption(t *testing.T) { // The expected values are generated by test_fixtures/aesgcm_encrypt_correct_output.rb - cipher := newAesGcmCipher() + cipher := NewAesGcmCipher() cipher.randReader = bytes.NewReader([]byte{}) // should not be used payload, err := hex.DecodeString("61626364656667683132333435363738393031328123655291d1f5eebe34c54ba55900f68a2700818a8fda9e2921190b67271d97ce") @@ -90,7 +90,7 @@ func TestGcmDecryption(t *testing.T) { t.Run("fails if payload is shorter than salt", func(t *testing.T) { t.Parallel() - cipher := newAesGcmCipher() + cipher := NewAesGcmCipher() cipher.randReader = bytes.NewReader([]byte{}) // should not be used payload := []byte{1, 2, 3, 4} @@ -103,7 +103,7 @@ func TestGcmDecryption(t *testing.T) { t.Run("fails if payload has length of salt but no nonce", func(t *testing.T) { t.Parallel() - cipher := newAesGcmCipher() + cipher := NewAesGcmCipher() cipher.randReader = bytes.NewReader([]byte{}) // should not be used payload := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} // salt and a little more @@ -116,7 +116,7 @@ func TestGcmDecryption(t *testing.T) { t.Run("fails when authentication tag is wrong", func(t *testing.T) { t.Parallel() - cipher := newAesGcmCipher() + cipher := NewAesGcmCipher() cipher.randReader = bytes.NewReader([]byte{}) // should not be used // Removed 2 bytes from the end of the payload to simulate a wrong authentication tag. @@ -131,7 +131,7 @@ func TestGcmDecryption(t *testing.T) { t.Run("fails if secret does not match", func(t *testing.T) { t.Parallel() - cipher := newAesGcmCipher() + cipher := NewAesGcmCipher() cipher.randReader = bytes.NewReader([]byte{}) // should not be used payload, err := hex.DecodeString("61626364656667683132333435363738393031328123655291d1f5eebe34c54ba55900f68a2700818a8fda9e2921190b67271d97ce") diff --git a/pkg/registry/apis/secret/encryption/cipher/provider/decipher_aescfb.go b/pkg/registry/apis/secret/encryption/cipher/provider/decipher_aescfb.go deleted file mode 100644 index 8d1c77a2c82..00000000000 --- a/pkg/registry/apis/secret/encryption/cipher/provider/decipher_aescfb.go +++ /dev/null @@ -1,52 +0,0 @@ -package provider - -import ( - "context" - "crypto/aes" - cpr "crypto/cipher" - - "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/cipher" -) - -const cfbSaltLength = 8 - -var _ cipher.Decrypter = aesCfbDecipher{} - -type aesCfbDecipher struct{} - -func (aesCfbDecipher) Decrypt(_ context.Context, payload []byte, secret string) ([]byte, error) { - // payload is formatted: - // Salt Nonce Encrypted - // | | Payload - // | | | - // | +---------v-------------+ | - // +-->SSSSSSSNNNNNNNEEEEEEEEE<--+ - // +-----------------------+ - - if len(payload) < cfbSaltLength+aes.BlockSize { - // If we don't return here, we'd panic. - return nil, ErrPayloadTooShort - } - - salt := payload[:cfbSaltLength] - - key, err := aes256CipherKey(secret, salt) - if err != nil { - return nil, err - } - - block, err := aes.NewCipher(key) - if err != nil { - return nil, err - } - - iv, payload := payload[cfbSaltLength:][:aes.BlockSize], payload[cfbSaltLength+aes.BlockSize:] - payloadDst := make([]byte, len(payload)) - - //nolint:staticcheck // We need to support CFB _decryption_, though we don't support it for future encryption. - stream := cpr.NewCFBDecrypter(block, iv) - - // XORKeyStream can work in-place if the two arguments are the same. - stream.XORKeyStream(payloadDst, payload) - return payloadDst, nil -} diff --git a/pkg/registry/apis/secret/encryption/cipher/provider/decipher_aescfb_test.go b/pkg/registry/apis/secret/encryption/cipher/provider/decipher_aescfb_test.go deleted file mode 100644 index c6e8f0f58df..00000000000 --- a/pkg/registry/apis/secret/encryption/cipher/provider/decipher_aescfb_test.go +++ /dev/null @@ -1,70 +0,0 @@ -package provider - -import ( - "encoding/hex" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestCfbDecryption(t *testing.T) { - t.Parallel() - - t.Run("decrypts correctly", func(t *testing.T) { - t.Parallel() - - // The expected values are generated by test_fixtures/aescfb_encrypt_correct_output.rb - - cipher := aesCfbDecipher{} - - payload, err := hex.DecodeString("616263646566676831323334353637383930313234353637f1114227cb6af678cad6ee35f67f25f40b") - require.NoError(t, err, "failed to decode hex string") - secret := "secret here" - - decrypted, err := cipher.Decrypt(t.Context(), payload, secret) - require.NoError(t, err, "failed to decrypt with CFB") - require.Equal(t, "grafana unit test", string(decrypted), "decrypted payload should match expected value") - }) - - t.Run("fails if payload is too short", func(t *testing.T) { - t.Parallel() - - cipher := aesCfbDecipher{} - - payload := []byte{1, 2, 3, 4} - secret := "secret here" - - _, err := cipher.Decrypt(t.Context(), payload, secret) - require.Error(t, err, "expected error when payload is shorter than salt") - }) - - t.Run("fails if payload is not an AES-encrypted value", func(t *testing.T) { - t.Parallel() - - cipher := aesCfbDecipher{} - - payload, err := hex.DecodeString("616263646566676831323334353637383930313234353637f1114227cb") - require.NoError(t, err, "failed to decode hex string") - secret := "secret here" - - // We don't have any authentication tag, so we can't return an error in this case. - decrypted, err := cipher.Decrypt(t.Context(), payload, secret) - require.NoError(t, err, "expected no error") - require.NotEqual(t, "grafana unit test", string(decrypted), "decrypted payload should not match real exposed secret") - }) - - t.Run("fails if secret is wrong", func(t *testing.T) { - t.Parallel() - - cipher := aesCfbDecipher{} - - payload, err := hex.DecodeString("616263646566676831323334353637383930313234353637f1114227cb6af678cad6ee35f67f25f40b") - require.NoError(t, err, "failed to decode hex string") - secret := "should've been 'secret here'" - - // We don't have any authentication tag, so we can't return an error in this case. - decrypted, err := cipher.Decrypt(t.Context(), payload, secret) - require.NoError(t, err, "expected no error") - require.NotEqual(t, "grafana unit test", string(decrypted), "decrypted payload should not match real exposed secret") - }) -} diff --git a/pkg/registry/apis/secret/encryption/cipher/provider/provider.go b/pkg/registry/apis/secret/encryption/cipher/provider/provider.go deleted file mode 100644 index a299b5d20e1..00000000000 --- a/pkg/registry/apis/secret/encryption/cipher/provider/provider.go +++ /dev/null @@ -1,18 +0,0 @@ -package provider - -import ( - "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/cipher" -) - -func ProvideCiphers() map[string]cipher.Encrypter { - return map[string]cipher.Encrypter{ - cipher.AesGcm: newAesGcmCipher(), - } -} - -func ProvideDeciphers() map[string]cipher.Decrypter { - return map[string]cipher.Decrypter{ - cipher.AesGcm: newAesGcmCipher(), - cipher.AesCfb: aesCfbDecipher{}, - } -} diff --git a/pkg/registry/apis/secret/encryption/cipher/provider/provider_test.go b/pkg/registry/apis/secret/encryption/cipher/provider/provider_test.go deleted file mode 100644 index b3977b74dc6..00000000000 --- a/pkg/registry/apis/secret/encryption/cipher/provider/provider_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package provider_test - -import ( - "testing" - - "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/cipher" - "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/cipher/provider" - "github.com/stretchr/testify/require" -) - -func TestNoCfbEncryptionCipher(t *testing.T) { - // CFB encryption is insecure, and as such we should not permit any cipher for encryption to be added. - // Changing/removing this test MUST be accompanied with an approval from the app security team. - - ciphers := provider.ProvideCiphers() - require.NotContains(t, ciphers, cipher.AesCfb, "CFB cipher should not be used for encryption") -} diff --git a/pkg/registry/apis/secret/encryption/cipher/provider/test_fixtures/aescfb_encrypt_correct_output.rb b/pkg/registry/apis/secret/encryption/cipher/provider/test_fixtures/aescfb_encrypt_correct_output.rb deleted file mode 100644 index 002a1d3d1f1..00000000000 --- a/pkg/registry/apis/secret/encryption/cipher/provider/test_fixtures/aescfb_encrypt_correct_output.rb +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env ruby -# Used by ../decipher_aescfb_test.go -# Why Ruby? It has a mostly available OpenSSL library that can be easily fetched (and most who have Ruby already have it!). And it is easy to read for this purpose. - -require 'openssl' - -salt = "abcdefgh" -nonce = "1234567890124567" - -secret = "secret here" -plaintext = "grafana unit test" - -# reimpl of aes256CipherKey -# the key is always the same value given the inputs -iterations = 10_000 -len = 32 -hash = OpenSSL::Digest::SHA256.new -key = OpenSSL::KDF.pbkdf2_hmac(secret, salt: salt, iterations: iterations, length: len, hash: hash) - -cipher = OpenSSL::Cipher::AES256.new(:CFB).encrypt -cipher.iv = nonce -cipher.key = key -encrypted = cipher.update(plaintext) - -def to_hex(s) - s.unpack('H*').first -end - -# Salt Nonce Encrypted -# | | Payload -# | | | -# | +---------v-------------+ | -# +-->SSSSSSSNNNNNNNEEEEEEEEE<--+ -# +-----------------------+ -printf("%s%s%s%s\n", to_hex(salt), to_hex(nonce), cipher.final, to_hex(encrypted)) diff --git a/pkg/registry/apis/secret/encryption/cipher/service/service.go b/pkg/registry/apis/secret/encryption/cipher/service/service.go index 9bdf0cc714f..83d140da1a9 100644 --- a/pkg/registry/apis/secret/encryption/cipher/service/service.go +++ b/pkg/registry/apis/secret/encryption/cipher/service/service.go @@ -13,7 +13,7 @@ import ( "github.com/grafana/grafana/pkg/infra/usagestats" "github.com/grafana/grafana/pkg/registry/apis/secret/encryption" "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/cipher" - encryptionprovider "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/cipher/provider" + "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/cipher/provider" "github.com/grafana/grafana/pkg/setting" ) @@ -30,8 +30,9 @@ type Service struct { cfg *setting.Cfg usageMetrics usagestats.Service - ciphers map[string]cipher.Encrypter - deciphers map[string]cipher.Decrypter + cipher cipher.Encrypter + decipher cipher.Decrypter + algorithm string } func NewEncryptionService( @@ -43,59 +44,29 @@ func NewEncryptionService( return nil, fmt.Errorf("`[secrets_manager]secret_key` is not set") } - if cfg.SecretsManagement.Encryption.Algorithm == "" { - return nil, fmt.Errorf("`[secrets_manager.encryption]algorithm` is not set") - } - s := &Service{ tracer: tracer, log: log.New("encryption"), - ciphers: encryptionprovider.ProvideCiphers(), - deciphers: encryptionprovider.ProvideDeciphers(), + // Use the AES-GCM cipher for encryption and decryption. + // This is the only cipher supported by the secrets management system. + cipher: provider.NewAesGcmCipher(), + decipher: provider.NewAesGcmCipher(), + algorithm: provider.AesGcm, usageMetrics: usageMetrics, cfg: cfg, } - algorithm := s.cfg.SecretsManagement.Encryption.Algorithm - - if err := s.checkEncryptionAlgorithm(algorithm); err != nil { - return nil, err - } - s.registerUsageMetrics() return s, nil } -func (s *Service) checkEncryptionAlgorithm(algorithm string) error { - var err error - defer func() { - if err != nil { - s.log.Error("Wrong security encryption configuration", "algorithm", algorithm, "error", err) - } - }() - - if _, ok := s.ciphers[algorithm]; !ok { - err = fmt.Errorf("no cipher registered for encryption algorithm '%s'", algorithm) - return err - } - - if _, ok := s.deciphers[algorithm]; !ok { - err = fmt.Errorf("no decipher registered for encryption algorithm '%s'", algorithm) - return err - } - - return nil -} - func (s *Service) registerUsageMetrics() { s.usageMetrics.RegisterMetricsFunc(func(context.Context) (map[string]any, error) { - algorithm := s.cfg.SecretsManagement.Encryption.Algorithm - return map[string]any{ - fmt.Sprintf("stats.%s.encryption.cipher.%s.count", encryption.UsageInsightsPrefix, algorithm): 1, + fmt.Sprintf("stats.%s.encryption.cipher.%s.count", encryption.UsageInsightsPrefix, s.algorithm): 1, }, nil }) } @@ -120,16 +91,10 @@ func (s *Service) Decrypt(ctx context.Context, payload []byte, secret string) ([ return nil, err } - decipher, ok := s.deciphers[algorithm] - if !ok { - err = fmt.Errorf("no decipher available for algorithm '%s'", algorithm) - return nil, err - } - span.SetAttributes(attribute.String("cipher.algorithm", algorithm)) var decrypted []byte - decrypted, err = decipher.Decrypt(ctx, toDecrypt, secret) + decrypted, err = s.decipher.Decrypt(ctx, toDecrypt, secret) return decrypted, err } @@ -139,15 +104,8 @@ func (s *Service) deriveEncryptionAlgorithm(payload []byte) (string, []byte, err return "", nil, fmt.Errorf("unable to derive encryption algorithm") } - if payload[0] != encryptionAlgorithmDelimiter { - return cipher.AesCfb, payload, nil // backwards compatibility - } - payload = payload[1:] algorithmDelimiterIdx := bytes.Index(payload, []byte{encryptionAlgorithmDelimiter}) - if algorithmDelimiterIdx == -1 { - return cipher.AesCfb, payload, nil // backwards compatibility - } algorithmB64 := payload[:algorithmDelimiterIdx] payload = payload[algorithmDelimiterIdx+1:] @@ -173,21 +131,13 @@ func (s *Service) Encrypt(ctx context.Context, payload []byte, secret string) ([ } }() - algorithm := s.cfg.SecretsManagement.Encryption.Algorithm - - cipher, ok := s.ciphers[algorithm] - if !ok { - err = fmt.Errorf("no cipher available for algorithm '%s'", algorithm) - return nil, err - } - - span.SetAttributes(attribute.String("cipher.algorithm", algorithm)) + span.SetAttributes(attribute.String("cipher.algorithm", s.algorithm)) var encrypted []byte - encrypted, err = cipher.Encrypt(ctx, payload, secret) + encrypted, err = s.cipher.Encrypt(ctx, payload, secret) - prefix := make([]byte, base64.RawStdEncoding.EncodedLen(len([]byte(algorithm)))+2) - base64.RawStdEncoding.Encode(prefix[1:], []byte(algorithm)) + prefix := make([]byte, base64.RawStdEncoding.EncodedLen(len([]byte(s.algorithm)))+2) + base64.RawStdEncoding.Encode(prefix[1:], []byte(s.algorithm)) prefix[0] = encryptionAlgorithmDelimiter prefix[len(prefix)-1] = encryptionAlgorithmDelimiter diff --git a/pkg/registry/apis/secret/encryption/cipher/service/service_test.go b/pkg/registry/apis/secret/encryption/cipher/service/service_test.go index 7a207797ce8..62a65ea0dbc 100644 --- a/pkg/registry/apis/secret/encryption/cipher/service/service_test.go +++ b/pkg/registry/apis/secret/encryption/cipher/service/service_test.go @@ -2,14 +2,12 @@ package service import ( "testing" - "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/otel/trace/noop" "github.com/grafana/grafana/pkg/infra/usagestats" - "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/cipher" "github.com/grafana/grafana/pkg/setting" ) @@ -21,11 +19,6 @@ func newGcmService(t *testing.T) *Service { SecretsManagement: setting.SecretsManagerSettings{ SecretKey: "SdlklWklckeLS", EncryptionProvider: "secretKey.v1", - Encryption: setting.EncryptionSettings{ - DataKeysCacheTTL: 5 * time.Minute, - DataKeysCleanupInterval: 1 * time.Nanosecond, - Algorithm: cipher.AesGcm, - }, }, } @@ -60,19 +53,4 @@ func TestService(t *testing.T) { assert.Equal(t, []byte("grafana"), decrypted) // We'll let the provider deal with testing details. }) - - t.Run("decrypting legacy ciphertext should work", func(t *testing.T) { - t.Parallel() - - // Raw slice of bytes that corresponds to the following ciphertext: - // - 'grafana' as payload - // - '1234' as secret - // - no encryption algorithm metadata - ciphertext := []byte{73, 71, 50, 57, 121, 110, 90, 109, 115, 23, 237, 13, 130, 188, 151, 118, 98, 103, 80, 209, 79, 143, 22, 122, 44, 40, 102, 41, 136, 16, 27} - - svc := newGcmService(t) - decrypted, err := svc.Decrypt(t.Context(), ciphertext, "1234") - require.NoError(t, err) - assert.Equal(t, []byte("grafana"), decrypted) - }) } diff --git a/pkg/registry/apis/secret/encryption/doc.go b/pkg/registry/apis/secret/encryption/doc.go new file mode 100644 index 00000000000..a4ca2a0fd2c --- /dev/null +++ b/pkg/registry/apis/secret/encryption/doc.go @@ -0,0 +1,5 @@ +// Package encryption provides envelope encryption for secrets manager + +// It is heavily copied from the legacy envelope encryption implementation at github.com/grafana/grafana/pkg/services/encryption. + +package encryption diff --git a/pkg/registry/apis/secret/encryption/kmsproviders/defaultprovider/grafana_provider.go b/pkg/registry/apis/secret/encryption/kmsproviders/defaultprovider/grafana_provider.go new file mode 100644 index 00000000000..067d455bfb6 --- /dev/null +++ b/pkg/registry/apis/secret/encryption/kmsproviders/defaultprovider/grafana_provider.go @@ -0,0 +1,28 @@ +package defaultprovider + +import ( + "context" + + "github.com/grafana/grafana/pkg/registry/apis/secret/encryption" + "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/cipher" +) + +type grafanaProvider struct { + sk string + encryption cipher.Cipher +} + +func New(sk string, encryption cipher.Cipher) encryption.Provider { + return grafanaProvider{ + sk: sk, + encryption: encryption, + } +} + +func (p grafanaProvider) Encrypt(ctx context.Context, blob []byte) ([]byte, error) { + return p.encryption.Encrypt(ctx, blob, p.sk) +} + +func (p grafanaProvider) Decrypt(ctx context.Context, blob []byte) ([]byte, error) { + return p.encryption.Decrypt(ctx, blob, p.sk) +} diff --git a/pkg/registry/apis/secret/encryption/kmsproviders/kmsproviders.go b/pkg/registry/apis/secret/encryption/kmsproviders/kmsproviders.go new file mode 100644 index 00000000000..0797d784c8e --- /dev/null +++ b/pkg/registry/apis/secret/encryption/kmsproviders/kmsproviders.go @@ -0,0 +1,19 @@ +package kmsproviders + +import ( + "github.com/grafana/grafana/pkg/registry/apis/secret/encryption" + "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/cipher" + "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/kmsproviders/defaultprovider" + "github.com/grafana/grafana/pkg/setting" +) + +const ( + // Default is the identifier of the default kms provider which fallbacks to the configured secret_key + Default = "secretKey.v1" +) + +func GetOSSKMSProviders(cfg *setting.Cfg, enc cipher.Cipher) encryption.ProviderMap { + return encryption.ProviderMap{ + Default: defaultprovider.New(cfg.SecretsManagement.SecretKey, enc), + } +} diff --git a/pkg/registry/apis/secret/encryption/manager/manager.go b/pkg/registry/apis/secret/encryption/manager/manager.go new file mode 100644 index 00000000000..1c596a3c70f --- /dev/null +++ b/pkg/registry/apis/secret/encryption/manager/manager.go @@ -0,0 +1,403 @@ +package manager + +import ( + "bytes" + "context" + "crypto/rand" + "encoding/base64" + "errors" + "fmt" + "strconv" + "sync" + + "github.com/prometheus/client_golang/prometheus" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/trace" + + "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/infra/usagestats" + "github.com/grafana/grafana/pkg/registry/apis/secret/contracts" + "github.com/grafana/grafana/pkg/registry/apis/secret/encryption" + "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/cipher" + "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/cipher/service" + "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/kmsproviders" + "github.com/grafana/grafana/pkg/setting" + "github.com/grafana/grafana/pkg/util" +) + +const ( + keyIdDelimiter = '#' +) + +type EncryptionManager struct { + tracer trace.Tracer + store contracts.DataKeyStorage + enc cipher.Cipher + cfg *setting.Cfg + usageStats usagestats.Service + + mtx sync.Mutex + + pOnce sync.Once + providers encryption.ProviderMap + + currentProviderID encryption.ProviderID + + log log.Logger +} + +// ProvideEncryptionManager returns an EncryptionManager that uses the OSS KMS providers, along with any additional third-party (e.g. Enterprise) KMS providers +func ProvideEncryptionManager( + tracer trace.Tracer, + store contracts.DataKeyStorage, + cfg *setting.Cfg, + usageStats usagestats.Service, + thirdPartyKMS encryption.ProviderMap, +) (contracts.EncryptionManager, error) { + currentProviderID := encryption.ProviderID(cfg.SecretsManagement.EncryptionProvider) + + enc, err := service.NewEncryptionService(tracer, usageStats, cfg) + if err != nil { + return nil, fmt.Errorf("failed to create encryption service: %w", err) + } + + s := &EncryptionManager{ + tracer: tracer, + store: store, + cfg: cfg, + usageStats: usageStats, + enc: enc, + currentProviderID: currentProviderID, + log: log.New("encryption"), + } + + if err := s.InitProviders(thirdPartyKMS); err != nil { + return nil, err + } + + if _, ok := s.providers[currentProviderID]; !ok { + return nil, fmt.Errorf("missing configuration for current encryption provider %s", currentProviderID) + } + + s.registerUsageMetrics() + + return s, nil +} + +func (s *EncryptionManager) InitProviders(extraProviders encryption.ProviderMap) (err error) { + done := false + s.pOnce.Do(func() { + providers := kmsproviders.GetOSSKMSProviders(s.cfg, s.enc) + + for id, p := range extraProviders { + if _, exists := s.providers[id]; exists { + err = fmt.Errorf("provider %s already registered", id) + return + } + providers[id] = p + } + + s.providers = providers + done = true + }) + + if !done && err == nil { + err = fmt.Errorf("providers were already initialized, no action taken") + } + + return +} + +func (s *EncryptionManager) registerUsageMetrics() { + s.usageStats.RegisterMetricsFunc(func(ctx context.Context) (map[string]any, error) { + usageMetrics := make(map[string]any) + + // Current provider + kind, err := s.currentProviderID.Kind() + if err != nil { + return nil, fmt.Errorf("encryptionManager.registerUsageMetrics: %w", err) + } + usageMetrics[fmt.Sprintf("stats.%s.encryption.current_provider.%s.count", encryption.UsageInsightsPrefix, kind)] = 1 + + // Count by kind + countByKind := make(map[string]int, len(s.providers)) + for id := range s.providers { + kind, err := id.Kind() + if err != nil { + return nil, fmt.Errorf("encryptionManager.registerUsageMetrics: %w", err) + } + + countByKind[kind]++ + } + + for kind, count := range countByKind { + usageMetrics[fmt.Sprintf("stats.%s.encryption.providers.%s.count", encryption.UsageInsightsPrefix, kind)] = count + } + + return usageMetrics, nil + }) +} + +// TODO: Why do we need to use a global variable for this? +var b64 = base64.RawStdEncoding + +func (s *EncryptionManager) Encrypt(ctx context.Context, namespace string, payload []byte) ([]byte, error) { + ctx, span := s.tracer.Start(ctx, "EnvelopeEncryptionManager.Encrypt", trace.WithAttributes( + attribute.String("namespace", namespace), + )) + defer span.End() + + var err error + defer func() { + opsCounter.With(prometheus.Labels{ + "success": strconv.FormatBool(err == nil), + "operation": OpEncrypt, + }).Inc() + + if err != nil { + span.SetStatus(codes.Error, err.Error()) + span.RecordError(err) + } + }() + + label := encryption.KeyLabel(s.currentProviderID) + + var id string + var dataKey []byte + id, dataKey, err = s.currentDataKey(ctx, namespace, label) + if err != nil { + s.log.Error("Failed to get current data key", "error", err, "label", label) + return nil, err + } + + var encrypted []byte + encrypted, err = s.enc.Encrypt(ctx, payload, string(dataKey)) + if err != nil { + s.log.Error("Failed to encrypt secret", "error", err) + return nil, err + } + + prefix := make([]byte, b64.EncodedLen(len(id))+2) + b64.Encode(prefix[1:], []byte(id)) + prefix[0] = keyIdDelimiter + prefix[len(prefix)-1] = keyIdDelimiter + + blob := make([]byte, len(prefix)+len(encrypted)) + copy(blob, prefix) + copy(blob[len(prefix):], encrypted) + + return blob, nil +} + +// currentDataKey looks up for current data key in cache or database by name, and decrypts it. +// If there's no current data key in cache nor in database it generates a new random data key, +// and stores it into both the in-memory cache and database (encrypted by the encryption provider). +func (s *EncryptionManager) currentDataKey(ctx context.Context, namespace string, label string) (string, []byte, error) { + ctx, span := s.tracer.Start(ctx, "EnvelopeEncryptionManager.CurrentDataKey", trace.WithAttributes( + attribute.String("namespace", namespace), + attribute.String("label", label), + )) + defer span.End() + + // We want only one request fetching current data key at time to + // avoid the creation of multiple ones in case there's no one existing. + s.mtx.Lock() + defer s.mtx.Unlock() + + // We try to fetch the data key, either from cache or database + id, dataKey, err := s.dataKeyByLabel(ctx, namespace, label) + if err != nil { + return "", nil, err + } + + // If no existing data key was found, create a new one + if dataKey == nil { + id, dataKey, err = s.newDataKey(ctx, namespace, label) + if err != nil { + return "", nil, err + } + } + + return id, dataKey, nil +} + +// dataKeyByLabel looks up for data key in cache by label. +// Otherwise, it fetches it from database, decrypts it and caches it decrypted. +func (s *EncryptionManager) dataKeyByLabel(ctx context.Context, namespace, label string) (string, []byte, error) { + // 1. Get data key from database. + dataKey, err := s.store.GetCurrentDataKey(ctx, namespace, label) + if err != nil { + if errors.Is(err, contracts.ErrDataKeyNotFound) { + return "", nil, nil + } + return "", nil, err + } + + // 2.1 Find the encryption provider. + provider, exists := s.providers[dataKey.Provider] + if !exists { + return "", nil, fmt.Errorf("could not find encryption provider '%s'", dataKey.Provider) + } + + // 2.2 Decrypt the data key fetched from the database. + decrypted, err := provider.Decrypt(ctx, dataKey.EncryptedData) + if err != nil { + return "", nil, err + } + + return dataKey.UID, decrypted, nil +} + +// newDataKey creates a new random data key, encrypts it and stores it into the database. +func (s *EncryptionManager) newDataKey(ctx context.Context, namespace string, label string) (string, []byte, error) { + ctx, span := s.tracer.Start(ctx, "EnvelopeEncryptionManager.NewDataKey", trace.WithAttributes( + attribute.String("namespace", namespace), + attribute.String("label", label), + )) + defer span.End() + + // 1. Create new data key. + dataKey, err := newRandomDataKey() + if err != nil { + return "", nil, err + } + + // 2.1 Find the encryption provider. + provider, exists := s.providers[s.currentProviderID] + if !exists { + return "", nil, fmt.Errorf("could not find encryption provider '%s'", s.currentProviderID) + } + + // 2.2 Encrypt the data key. + encrypted, err := provider.Encrypt(ctx, dataKey) + if err != nil { + return "", nil, err + } + + // 3. Store its encrypted value into the DB. + id := util.GenerateShortUID() + + dbDataKey := contracts.SecretDataKey{ + Active: true, + UID: id, + Namespace: namespace, + Provider: s.currentProviderID, + EncryptedData: encrypted, + Label: label, + } + + err = s.store.CreateDataKey(ctx, &dbDataKey) + if err != nil { + return "", nil, err + } + + return id, dataKey, nil +} + +func newRandomDataKey() ([]byte, error) { + rawDataKey := make([]byte, 16) + _, err := rand.Read(rawDataKey) + if err != nil { + return nil, err + } + return rawDataKey, nil +} + +func (s *EncryptionManager) Decrypt(ctx context.Context, namespace string, payload []byte) ([]byte, error) { + ctx, span := s.tracer.Start(ctx, "EnvelopeEncryptionManager.Decrypt", trace.WithAttributes( + attribute.String("namespace", namespace), + )) + defer span.End() + + var err error + defer func() { + opsCounter.With(prometheus.Labels{ + "success": strconv.FormatBool(err == nil), + "operation": OpDecrypt, + }).Inc() + + if err != nil { + span.SetStatus(codes.Error, err.Error()) + span.RecordError(err) + + s.log.FromContext(ctx).Error("Failed to decrypt secret", "error", err) + } + }() + + if len(payload) == 0 { + err = fmt.Errorf("unable to decrypt empty payload") + return nil, err + } + + payload = payload[1:] + endOfKey := bytes.Index(payload, []byte{keyIdDelimiter}) + if endOfKey == -1 { + err = fmt.Errorf("could not find valid key id in encrypted payload") + return nil, err + } + b64Key := payload[:endOfKey] + payload = payload[endOfKey+1:] + keyId := make([]byte, b64.DecodedLen(len(b64Key))) + _, err = b64.Decode(keyId, b64Key) + if err != nil { + return nil, err + } + + dataKey, err := s.dataKeyById(ctx, namespace, string(keyId)) + if err != nil { + s.log.FromContext(ctx).Error("Failed to lookup data key by id", "id", string(keyId), "error", err) + return nil, err + } + + var decrypted []byte + decrypted, err = s.enc.Decrypt(ctx, payload, string(dataKey)) + + return decrypted, err +} + +func (s *EncryptionManager) GetDecryptedValue(ctx context.Context, namespace string, sjd map[string][]byte, key, fallback string) string { + if value, ok := sjd[key]; ok { + decryptedData, err := s.Decrypt(ctx, namespace, value) + if err != nil { + return fallback + } + + return string(decryptedData) + } + + return fallback +} + +// dataKeyById looks up for data key in the database and returns it decrypted. +func (s *EncryptionManager) dataKeyById(ctx context.Context, namespace, id string) ([]byte, error) { + ctx, span := s.tracer.Start(ctx, "EnvelopeEncryptionManager.GetDataKey", trace.WithAttributes( + attribute.String("namespace", namespace), + attribute.String("id", id), + )) + defer span.End() + + // 1. Get encrypted data key from database. + dataKey, err := s.store.GetDataKey(ctx, namespace, id) + if err != nil { + return nil, err + } + + // 2.1. Find the encryption provider. + provider, exists := s.providers[dataKey.Provider] + if !exists { + return nil, fmt.Errorf("could not find encryption provider '%s'", dataKey.Provider) + } + + // 2.2. Decrypt the data key. + decrypted, err := provider.Decrypt(ctx, dataKey.EncryptedData) + if err != nil { + return nil, err + } + + return decrypted, nil +} + +func (s *EncryptionManager) GetProviders() encryption.ProviderMap { + return s.providers +} diff --git a/pkg/registry/apis/secret/encryption/manager/manager_test.go b/pkg/registry/apis/secret/encryption/manager/manager_test.go new file mode 100644 index 00000000000..15cbaa600c5 --- /dev/null +++ b/pkg/registry/apis/secret/encryption/manager/manager_test.go @@ -0,0 +1,448 @@ +package manager + +import ( + "context" + "errors" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/trace/noop" + "gopkg.in/ini.v1" + + "github.com/grafana/grafana/pkg/infra/db" + "github.com/grafana/grafana/pkg/infra/usagestats" + "github.com/grafana/grafana/pkg/registry/apis/secret/contracts" + "github.com/grafana/grafana/pkg/registry/apis/secret/encryption" + "github.com/grafana/grafana/pkg/services/featuremgmt" + "github.com/grafana/grafana/pkg/services/sqlstore" + "github.com/grafana/grafana/pkg/setting" + "github.com/grafana/grafana/pkg/storage/secret/database" + encryptionstorage "github.com/grafana/grafana/pkg/storage/secret/encryption" + "github.com/grafana/grafana/pkg/storage/secret/migrator" + "github.com/grafana/grafana/pkg/tests/testsuite" + "github.com/grafana/grafana/pkg/util" +) + +func TestMain(m *testing.M) { + testsuite.Run(m) +} + +func TestEncryptionService_EnvelopeEncryption(t *testing.T) { + svc := setupTestService(t) + ctx := context.Background() + namespace := "test-namespace" + + t.Run("encrypting should create DEK", func(t *testing.T) { + plaintext := []byte("very secret string") + + encrypted, err := svc.Encrypt(context.Background(), namespace, plaintext) + require.NoError(t, err) + + decrypted, err := svc.Decrypt(context.Background(), namespace, encrypted) + require.NoError(t, err) + assert.Equal(t, plaintext, decrypted) + + keys, err := svc.store.GetAllDataKeys(ctx, namespace) + require.NoError(t, err) + assert.Equal(t, len(keys), 1) + }) + + t.Run("encrypting another secret should use the same DEK", func(t *testing.T) { + plaintext := []byte("another very secret string") + + encrypted, err := svc.Encrypt(context.Background(), namespace, plaintext) + require.NoError(t, err) + + decrypted, err := svc.Decrypt(context.Background(), namespace, encrypted) + require.NoError(t, err) + assert.Equal(t, plaintext, decrypted) + + keys, err := svc.store.GetAllDataKeys(ctx, namespace) + require.NoError(t, err) + assert.Equal(t, len(keys), 1) + }) + + t.Run("usage stats should be registered", func(t *testing.T) { + reports, err := svc.usageStats.GetUsageReport(context.Background()) + require.NoError(t, err) + + assert.Equal(t, 1, reports.Metrics["stats.secrets_manager.encryption.current_provider.secretKey.count"]) + assert.Equal(t, 1, reports.Metrics["stats.secrets_manager.encryption.providers.secretKey.count"]) + }) +} + +func TestEncryptionService_DataKeys(t *testing.T) { + // Initialize data key storage with a fake db + testDB := sqlstore.NewTestStore(t, sqlstore.WithMigrator(migrator.New())) + features := featuremgmt.WithFeatures(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, featuremgmt.FlagSecretsManagementAppPlatform) + tracer := noop.NewTracerProvider().Tracer("test") + store, err := encryptionstorage.ProvideDataKeyStorage(database.ProvideDatabase(testDB, tracer), tracer, features) + require.NoError(t, err) + + ctx := context.Background() + namespace := "test-namespace" + + dataKey := &contracts.SecretDataKey{ + UID: util.GenerateShortUID(), + Label: "test1", + Active: true, + Provider: "test", + EncryptedData: []byte{0x62, 0xAF, 0xA1, 0x1A}, + Namespace: namespace, + } + + t.Run("querying for a DEK that does not exist", func(t *testing.T) { + res, err := store.GetDataKey(ctx, namespace, dataKey.UID) + assert.ErrorIs(t, contracts.ErrDataKeyNotFound, err) + assert.Nil(t, res) + }) + + t.Run("creating an active DEK", func(t *testing.T) { + err := store.CreateDataKey(ctx, dataKey) + require.NoError(t, err) + + res, err := store.GetDataKey(ctx, namespace, dataKey.UID) + require.NoError(t, err) + assert.Equal(t, dataKey.EncryptedData, res.EncryptedData) + assert.Equal(t, dataKey.Provider, res.Provider) + assert.Equal(t, dataKey.Label, res.Label) + assert.Equal(t, dataKey.UID, res.UID) + assert.True(t, dataKey.Active) + + current, err := store.GetCurrentDataKey(ctx, namespace, dataKey.Label) + require.NoError(t, err) + assert.Equal(t, dataKey.EncryptedData, current.EncryptedData) + assert.Equal(t, dataKey.Provider, current.Provider) + assert.Equal(t, dataKey.Label, current.Label) + assert.Equal(t, dataKey.UID, current.UID) + assert.True(t, current.Active) + }) + + t.Run("creating an inactive DEK", func(t *testing.T) { + k := &contracts.SecretDataKey{ + UID: util.GenerateShortUID(), + Namespace: namespace, + Active: false, + Label: "test2", + Provider: "test", + EncryptedData: []byte{0x62, 0xAF, 0xA1, 0x1A}, + } + + err := store.CreateDataKey(ctx, k) + require.Error(t, err) + + res, err := store.GetDataKey(ctx, namespace, k.UID) + assert.Equal(t, contracts.ErrDataKeyNotFound, err) + assert.Nil(t, res) + }) + + t.Run("deleting DEK when no id provided must fail", func(t *testing.T) { + beforeDelete, err := store.GetAllDataKeys(ctx, namespace) + require.NoError(t, err) + err = store.DeleteDataKey(ctx, namespace, "") + require.Error(t, err) + + afterDelete, err := store.GetAllDataKeys(ctx, namespace) + require.NoError(t, err) + assert.Equal(t, beforeDelete, afterDelete) + }) + + t.Run("deleting a DEK", func(t *testing.T) { + err := store.DeleteDataKey(ctx, namespace, dataKey.UID) + require.NoError(t, err) + + res, err := store.GetDataKey(ctx, namespace, dataKey.UID) + assert.Equal(t, contracts.ErrDataKeyNotFound, err) + assert.Nil(t, res) + }) +} + +func TestEncryptionService_UseCurrentProvider(t *testing.T) { + t.Run("When encryption_provider is not specified explicitly, should use 'secretKey' as a current provider", func(t *testing.T) { + svc := setupTestService(t) + assert.Equal(t, encryption.ProviderID("secretKey.v1"), svc.currentProviderID) + }) + + t.Run("Should use encrypt/decrypt methods of the current encryption provider", func(t *testing.T) { + rawCfg := ` + [secrets_manager.encryption.fakeProvider.v1] + ` + + raw, err := ini.Load([]byte(rawCfg)) + require.NoError(t, err) + + cfg := &setting.Cfg{ + Raw: raw, + SecretsManagement: setting.SecretsManagerSettings{ + SecretKey: "sdDkslslld", + EncryptionProvider: "secretKey.v1", + }, + } + + features := featuremgmt.WithFeatures(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, featuremgmt.FlagSecretsManagementAppPlatform) + testDB := sqlstore.NewTestStore(t, sqlstore.WithMigrator(migrator.New())) + tracer := noop.NewTracerProvider().Tracer("test") + encryptionStore, err := encryptionstorage.ProvideDataKeyStorage(database.ProvideDatabase(testDB, tracer), tracer, features) + require.NoError(t, err) + + encMgr, err := ProvideEncryptionManager( + tracer, + encryptionStore, + cfg, + &usagestats.UsageStatsMock{T: t}, + encryption.ProvideThirdPartyProviderMap(), + ) + require.NoError(t, err) + + encryptionManager := encMgr.(*EncryptionManager) + + //override default provider with fake, and register the fake separately + fake := &fakeProvider{} + encryptionManager.providers[encryption.ProviderID("fakeProvider.v1")] = fake + encryptionManager.currentProviderID = "fakeProvider.v1" + + namespace := "test-namespace" + encrypted, _ := encryptionManager.Encrypt(context.Background(), namespace, []byte{}) + assert.True(t, fake.encryptCalled) + assert.False(t, fake.decryptCalled) + + // encryption manager tries to find a DEK in a cache first before calling provider's decrypt + // to bypass the cache, we set up one more secrets service to test decrypting + svcDecryptMgr, err := ProvideEncryptionManager( + tracer, + encryptionStore, + cfg, + &usagestats.UsageStatsMock{T: t}, + encryption.ProvideThirdPartyProviderMap(), + ) + require.NoError(t, err) + + svcDecrypt := svcDecryptMgr.(*EncryptionManager) + svcDecrypt.providers[encryption.ProviderID("fakeProvider.v1")] = fake + svcDecrypt.currentProviderID = "fakeProvider.v1" + + _, _ = svcDecrypt.Decrypt(context.Background(), namespace, encrypted) + assert.True(t, fake.decryptCalled, "fake provider's decrypt should be called") + }) +} + +type fakeProvider struct { + encryptCalled bool + decryptCalled bool +} + +func (p *fakeProvider) Encrypt(_ context.Context, _ []byte) ([]byte, error) { + p.encryptCalled = true + return []byte{}, nil +} + +func (p *fakeProvider) Decrypt(_ context.Context, _ []byte) ([]byte, error) { + p.decryptCalled = true + return []byte{}, nil +} + +func TestEncryptionService_Decrypt(t *testing.T) { + ctx := context.Background() + namespace := "test-namespace" + + t.Run("empty payload should fail", func(t *testing.T) { + svc := setupTestService(t) + _, err := svc.Decrypt(context.Background(), namespace, []byte("")) + require.Error(t, err) + + assert.Equal(t, "unable to decrypt empty payload", err.Error()) + }) + + t.Run("ee encrypted payload with ee enabled should work", func(t *testing.T) { + svc := setupTestService(t) + ciphertext, err := svc.Encrypt(ctx, namespace, []byte("grafana")) + require.NoError(t, err) + + plaintext, err := svc.Decrypt(ctx, namespace, ciphertext) + assert.NoError(t, err) + assert.Equal(t, []byte("grafana"), plaintext) + }) +} + +func TestIntegration_SecretsService(t *testing.T) { + if testing.Short() { + t.Skip("skipping integration test") + } + + ctx := context.Background() + someData := []byte(`some-data`) + namespace := "test-namespace" + + tcs := map[string]func(*testing.T, db.DB, contracts.EncryptionManager){ + "regular": func(t *testing.T, _ db.DB, svc contracts.EncryptionManager) { + // We encrypt some data normally, no transactions implied. + _, err := svc.Encrypt(ctx, namespace, someData) + require.NoError(t, err) + }, + "within successful InTransaction": func(t *testing.T, store db.DB, svc contracts.EncryptionManager) { + require.NoError(t, store.InTransaction(ctx, func(ctx context.Context) error { + // We encrypt some data within a transaction that shares the db session. + _, err := svc.Encrypt(ctx, namespace, someData) + require.NoError(t, err) + + // And the transition succeeds. + return nil + })) + }, + "within unsuccessful InTransaction": func(t *testing.T, store db.DB, svc contracts.EncryptionManager) { + require.NotNil(t, store.InTransaction(ctx, func(ctx context.Context) error { + // We encrypt some data within a transaction that shares the db session. + _, err := svc.Encrypt(ctx, namespace, someData) + require.NoError(t, err) + + // But the transaction fails. + return errors.New("error") + })) + }, + "within unsuccessful InTransaction (plus forced db fetch)": func(t *testing.T, store db.DB, svc contracts.EncryptionManager) { + require.NotNil(t, store.InTransaction(ctx, func(ctx context.Context) error { + // We encrypt some data within a transaction that shares the db session. + encrypted, err := svc.Encrypt(ctx, namespace, someData) + require.NoError(t, err) + + // At this point the data key is not cached yet because + // the transaction haven't been committed yet, + // and won't, so we do a decrypt operation within the + // transaction to force the data key to be + // (potentially) cached (it shouldn't to prevent issues). + decrypted, err := svc.Decrypt(ctx, namespace, encrypted) + require.NoError(t, err) + assert.Equal(t, someData, decrypted) + + // But the transaction fails. + return errors.New("error") + })) + }, + "within successful WithTransactionalDbSession": func(t *testing.T, store db.DB, svc contracts.EncryptionManager) { + require.NoError(t, store.WithTransactionalDbSession(ctx, func(sess *sqlstore.DBSession) error { + // We encrypt some data within a transaction that does not share the db session. + _, err := svc.Encrypt(ctx, namespace, someData) + require.NoError(t, err) + + // And the transition succeeds. + return nil + })) + }, + "within unsuccessful WithTransactionalDbSession": func(t *testing.T, store db.DB, svc contracts.EncryptionManager) { + require.NotNil(t, store.WithTransactionalDbSession(ctx, func(sess *sqlstore.DBSession) error { + // We encrypt some data within a transaction that does not share the db session. + _, err := svc.Encrypt(ctx, namespace, someData) + require.NoError(t, err) + + // But the transaction fails. + return errors.New("error") + })) + }, + "within unsuccessful WithTransactionalDbSession (plus forced db fetch)": func(t *testing.T, store db.DB, svc contracts.EncryptionManager) { + require.NotNil(t, store.WithTransactionalDbSession(ctx, func(sess *sqlstore.DBSession) error { + // We encrypt some data within a transaction that does not share the db session. + encrypted, err := svc.Encrypt(ctx, namespace, someData) + require.NoError(t, err) + + // At this point the data key is not cached yet because + // the transaction haven't been committed yet, + // and won't, so we do a decrypt operation within the + // transaction to force the data key to be + // (potentially) cached (it shouldn't to prevent issues). + decrypted, err := svc.Decrypt(ctx, namespace, encrypted) + require.NoError(t, err) + assert.Equal(t, someData, decrypted) + + // But the transaction fails. + return errors.New("error") + })) + }, + } + + for name, tc := range tcs { + t.Run(name, func(t *testing.T) { + testDB := sqlstore.NewTestStore(t, sqlstore.WithMigrator(migrator.New())) + tracer := noop.NewTracerProvider().Tracer("test") + + features := featuremgmt.WithFeatures(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, featuremgmt.FlagSecretsManagementAppPlatform) + defaultKey := "SdlklWklckeLS" + + cfg := &setting.Cfg{ + SecretsManagement: setting.SecretsManagerSettings{ + SecretKey: defaultKey, + EncryptionProvider: "secretKey.v1", + }, + } + store, err := encryptionstorage.ProvideDataKeyStorage(database.ProvideDatabase(testDB, tracer), tracer, features) + require.NoError(t, err) + + usageStats := &usagestats.UsageStatsMock{T: t} + + svc, err := ProvideEncryptionManager( + tracer, + store, + cfg, + usageStats, + encryption.ProvideThirdPartyProviderMap(), + ) + require.NoError(t, err) + + ctx := context.Background() + namespace := "test-namespace" + + // Here's what actually matters and varies on each test: look at the test case name. + // + // For historical reasons, and in an old implementation, when a successful encryption + // operation happened within an unsuccessful transaction, the data key was used to be + // cached in memory for the next encryption operations, which caused some data to be + // encrypted with a data key that haven't actually been persisted into the database. + tc(t, testDB, svc) + // Therefore, the data encrypted after this point, become unrecoverable after a restart. + // So, the different test cases here are there to prevent that from happening again + // in the future, whatever it is what happens. + + // So, we proceed with an encryption operation: + toEncrypt := []byte(`data-to-encrypt`) + encrypted, err := svc.Encrypt(ctx, namespace, toEncrypt) + require.NoError(t, err) + + // And then, we MUST still be able to decrypt the previously encrypted data: + decrypted, err := svc.Decrypt(ctx, namespace, encrypted) + require.NoError(t, err) + assert.Equal(t, toEncrypt, decrypted) + }) + } +} + +func TestEncryptionService_ReInitReturnsError(t *testing.T) { + svc := setupTestService(t) + err := svc.InitProviders(encryption.ProviderMap{ + "fakeProvider.v1": &fakeProvider{}, + }) + require.Error(t, err) +} + +func TestEncryptionService_ThirdPartyProviders(t *testing.T) { + cfg := &setting.Cfg{ + SecretsManagement: setting.SecretsManagerSettings{ + SecretKey: "SdlklWklckeLS", + EncryptionProvider: "secretKey.v1", + }, + } + + svc, err := ProvideEncryptionManager( + nil, + nil, + cfg, + &usagestats.UsageStatsMock{}, + encryption.ProviderMap{ + "fakeProvider.v1": &fakeProvider{}, + }, + ) + require.NoError(t, err) + + encMgr := svc.(*EncryptionManager) + require.Len(t, encMgr.providers, 2) + require.Contains(t, encMgr.providers, encryption.ProviderID("fakeProvider.v1")) +} diff --git a/pkg/registry/apis/secret/encryption/manager/metrics.go b/pkg/registry/apis/secret/encryption/manager/metrics.go new file mode 100644 index 00000000000..5ff49c7e509 --- /dev/null +++ b/pkg/registry/apis/secret/encryption/manager/metrics.go @@ -0,0 +1,51 @@ +package manager + +import ( + "github.com/prometheus/client_golang/prometheus" + + "github.com/grafana/grafana/pkg/infra/metrics" + "github.com/grafana/grafana/pkg/infra/metrics/metricutil" +) + +const ( + OpEncrypt = "encrypt" + OpDecrypt = "decrypt" + subsystem = "encryption_manager" +) + +// TODO: Add timing metrics after the encryption module cleanup +var ( + opsCounter = metricutil.NewCounterVecStartingAtZero( + prometheus.CounterOpts{ + Namespace: metrics.ExporterName, + Subsystem: subsystem, + Name: "encryption_ops_total", + Help: "A counter for encryption operations", + }, + []string{"success", "operation"}, + map[string][]string{ + "success": {"true", "false"}, + "operation": {OpEncrypt, OpDecrypt}, + }, + ) + cacheReadsCounter = metricutil.NewCounterVecStartingAtZero( + prometheus.CounterOpts{ + Namespace: metrics.ExporterName, + Subsystem: subsystem, + Name: "encryption_cache_reads_total", + Help: "A counter for encryption cache reads", + }, + []string{"hit", "method"}, + map[string][]string{ + "hit": {"true", "false"}, + "method": {"byId", "byName"}, + }, + ) +) + +func init() { + prometheus.MustRegister( + opsCounter, + cacheReadsCounter, + ) +} diff --git a/pkg/registry/apis/secret/encryption/manager/test_helpers.go b/pkg/registry/apis/secret/encryption/manager/test_helpers.go new file mode 100644 index 00000000000..bfdd4cc7bea --- /dev/null +++ b/pkg/registry/apis/secret/encryption/manager/test_helpers.go @@ -0,0 +1,49 @@ +package manager + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/trace/noop" + + "github.com/grafana/grafana/pkg/infra/usagestats" + "github.com/grafana/grafana/pkg/registry/apis/secret/encryption" + "github.com/grafana/grafana/pkg/services/featuremgmt" + "github.com/grafana/grafana/pkg/services/sqlstore" + "github.com/grafana/grafana/pkg/setting" + "github.com/grafana/grafana/pkg/storage/secret/database" + encryptionstorage "github.com/grafana/grafana/pkg/storage/secret/encryption" + "github.com/grafana/grafana/pkg/storage/secret/migrator" +) + +func setupTestService(tb testing.TB) *EncryptionManager { + tb.Helper() + + testDB := sqlstore.NewTestStore(tb, sqlstore.WithMigrator(migrator.New())) + tracer := noop.NewTracerProvider().Tracer("test") + database := database.ProvideDatabase(testDB, tracer) + + features := featuremgmt.WithFeatures(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, featuremgmt.FlagSecretsManagementAppPlatform) + defaultKey := "SdlklWklckeLS" + cfg := &setting.Cfg{ + SecretsManagement: setting.SecretsManagerSettings{ + SecretKey: defaultKey, + EncryptionProvider: "secretKey.v1", + }, + } + store, err := encryptionstorage.ProvideDataKeyStorage(database, tracer, features) + require.NoError(tb, err) + + usageStats := &usagestats.UsageStatsMock{T: tb} + + encMgr, err := ProvideEncryptionManager( + tracer, + store, + cfg, + usageStats, + encryption.ProvideThirdPartyProviderMap(), + ) + require.NoError(tb, err) + + return encMgr.(*EncryptionManager) +} diff --git a/pkg/registry/apis/secret/encryption/secrets.go b/pkg/registry/apis/secret/encryption/secrets.go index d1cfd87286a..55a6d36c6cd 100644 --- a/pkg/registry/apis/secret/encryption/secrets.go +++ b/pkg/registry/apis/secret/encryption/secrets.go @@ -1,6 +1,7 @@ package encryption import ( + "context" "fmt" "strings" "time" @@ -8,6 +9,12 @@ import ( const UsageInsightsPrefix = "secrets_manager" +// Provider is a key encryption key provider for envelope encryption +type Provider interface { + Encrypt(ctx context.Context, blob []byte) ([]byte, error) + Decrypt(ctx context.Context, blob []byte) ([]byte, error) +} + type ProviderID string func (id ProviderID) Kind() (string, error) { @@ -24,3 +31,15 @@ func (id ProviderID) Kind() (string, error) { func KeyLabel(providerID ProviderID) string { return fmt.Sprintf("%s@%s", time.Now().Format("2006-01-02"), providerID) } + +type ProviderMap map[ProviderID]Provider + +// ProvideThirdPartyProviderMap fulfills the wire dependency needed by the encryption manager in OSS +func ProvideThirdPartyProviderMap() ProviderMap { + return ProviderMap{} +} + +// BackgroundProvider should be implemented for a provider that has a task that needs to be run in the background. +type BackgroundProvider interface { + Run(ctx context.Context) error +} diff --git a/pkg/registry/apis/secret/secretkeeper/secretkeeper_test.go b/pkg/registry/apis/secret/secretkeeper/secretkeeper_test.go index e48f8b95a93..d2c5aea98d4 100644 --- a/pkg/registry/apis/secret/secretkeeper/secretkeeper_test.go +++ b/pkg/registry/apis/secret/secretkeeper/secretkeeper_test.go @@ -7,8 +7,15 @@ import ( "github.com/stretchr/testify/require" "go.opentelemetry.io/otel/trace/noop" + "github.com/grafana/grafana/pkg/infra/usagestats" + "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/manager" "github.com/grafana/grafana/pkg/registry/apis/secret/secretkeeper/sqlkeeper" + "github.com/grafana/grafana/pkg/services/featuremgmt" + "github.com/grafana/grafana/pkg/services/sqlstore" "github.com/grafana/grafana/pkg/setting" + "github.com/grafana/grafana/pkg/storage/secret/database" + encryptionstorage "github.com/grafana/grafana/pkg/storage/secret/encryption" + "github.com/grafana/grafana/pkg/storage/secret/migrator" "github.com/grafana/grafana/pkg/tests/testsuite" ) @@ -16,8 +23,13 @@ func TestMain(m *testing.M) { testsuite.Run(m) } -func Test_OSSKeeperService_GetKeepers(t *testing.T) { - cfg := setting.NewCfg() +func Test_OSSKeeperService(t *testing.T) { + cfg := &setting.Cfg{ + SecretsManagement: setting.SecretsManagerSettings{ + SecretKey: "sdDkslslld", + EncryptionProvider: "secretKey.v1", + }, + } keeperService, err := setupTestService(t, cfg) require.NoError(t, err) @@ -31,10 +43,23 @@ func Test_OSSKeeperService_GetKeepers(t *testing.T) { } func setupTestService(t *testing.T, cfg *setting.Cfg) (*OSSKeeperService, error) { + // Initialize data key storage and encrypted value storage with a fake db + testDB := sqlstore.NewTestStore(t, sqlstore.WithMigrator(migrator.New())) tracer := noop.NewTracerProvider().Tracer("test") + database := database.ProvideDatabase(testDB, tracer) + features := featuremgmt.WithFeatures(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, featuremgmt.FlagSecretsManagementAppPlatform) + + dataKeyStore, err := encryptionstorage.ProvideDataKeyStorage(database, tracer, features) + require.NoError(t, err) + + encValueStore, err := encryptionstorage.ProvideEncryptedValueStorage(database, tracer, features) + require.NoError(t, err) + + encryptionManager, err := manager.ProvideEncryptionManager(tracer, dataKeyStore, cfg, &usagestats.UsageStatsMock{T: t}, nil) + require.NoError(t, err) // Initialize the keeper service - keeperService, err := ProvideService(tracer, nil, nil) + keeperService, err := ProvideService(tracer, encValueStore, encryptionManager) return keeperService, err } diff --git a/pkg/registry/apis/secret/secretkeeper/sqlkeeper/keeper_test.go b/pkg/registry/apis/secret/secretkeeper/sqlkeeper/keeper_test.go index 585b124941f..500d04bdf0e 100644 --- a/pkg/registry/apis/secret/secretkeeper/sqlkeeper/keeper_test.go +++ b/pkg/registry/apis/secret/secretkeeper/sqlkeeper/keeper_test.go @@ -2,20 +2,29 @@ package sqlkeeper import ( "context" - "encoding/base64" - "fmt" - "sync" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/otel/trace/noop" + secretv0alpha1 "github.com/grafana/grafana/pkg/apis/secret/v0alpha1" + "github.com/grafana/grafana/pkg/infra/usagestats" "github.com/grafana/grafana/pkg/registry/apis/secret/contracts" + encryptionmanager "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/manager" + "github.com/grafana/grafana/pkg/services/featuremgmt" + "github.com/grafana/grafana/pkg/services/sqlstore" "github.com/grafana/grafana/pkg/setting" + "github.com/grafana/grafana/pkg/storage/secret/database" + encryptionstorage "github.com/grafana/grafana/pkg/storage/secret/encryption" + "github.com/grafana/grafana/pkg/storage/secret/migrator" + "github.com/grafana/grafana/pkg/tests/testsuite" ) -// Make this a `TestIntegration` once we have the real storage implementation +func TestMain(m *testing.M) { + testsuite.Run(m) +} + func Test_SQLKeeperSetup(t *testing.T) { ctx := context.Background() namespace1 := "namespace1" @@ -24,50 +33,57 @@ func Test_SQLKeeperSetup(t *testing.T) { plaintext2 := "very secret string in namespace 2" nonExistentID := contracts.ExternalID("non existent") - cfg := setting.NewCfg() + cfg := &setting.Cfg{ + SecretsManagement: setting.SecretsManagerSettings{ + SecretKey: "sdDkslslld", + EncryptionProvider: "secretKey.v1", + }, + } sqlKeeper, err := setupTestService(t, cfg) require.NoError(t, err) require.NotNil(t, sqlKeeper) + keeperCfg := &secretv0alpha1.SystemKeeperConfig{} + t.Run("storing an encrypted value returns no error", func(t *testing.T) { - externalId1, err := sqlKeeper.Store(ctx, nil, namespace1, plaintext1) + externalId1, err := sqlKeeper.Store(ctx, keeperCfg, namespace1, plaintext1) require.NoError(t, err) require.NotEmpty(t, externalId1) - externalId2, err := sqlKeeper.Store(ctx, nil, namespace2, plaintext2) + externalId2, err := sqlKeeper.Store(ctx, keeperCfg, namespace2, plaintext2) require.NoError(t, err) require.NotEmpty(t, externalId2) t.Run("expose the encrypted value from existing namespace", func(t *testing.T) { - exposedVal1, err := sqlKeeper.Expose(ctx, nil, namespace1, externalId1) + exposedVal1, err := sqlKeeper.Expose(ctx, keeperCfg, namespace1, externalId1) require.NoError(t, err) require.NotNil(t, exposedVal1) assert.Equal(t, plaintext1, exposedVal1.DangerouslyExposeAndConsumeValue()) - exposedVal2, err := sqlKeeper.Expose(ctx, nil, namespace2, externalId2) + exposedVal2, err := sqlKeeper.Expose(ctx, keeperCfg, namespace2, externalId2) require.NoError(t, err) require.NotNil(t, exposedVal2) assert.Equal(t, plaintext2, exposedVal2.DangerouslyExposeAndConsumeValue()) }) t.Run("expose encrypted value from different namespace returns error", func(t *testing.T) { - exposedVal, err := sqlKeeper.Expose(ctx, nil, namespace2, externalId1) + exposedVal, err := sqlKeeper.Expose(ctx, keeperCfg, namespace2, externalId1) require.Error(t, err) assert.Empty(t, exposedVal) - exposedVal, err = sqlKeeper.Expose(ctx, nil, namespace1, externalId2) + exposedVal, err = sqlKeeper.Expose(ctx, keeperCfg, namespace1, externalId2) require.Error(t, err) assert.Empty(t, exposedVal) }) }) t.Run("storing same value in same namespace returns no error", func(t *testing.T) { - externalId1, err := sqlKeeper.Store(ctx, nil, namespace1, plaintext1) + externalId1, err := sqlKeeper.Store(ctx, keeperCfg, namespace1, plaintext1) require.NoError(t, err) require.NotEmpty(t, externalId1) - externalId2, err := sqlKeeper.Store(ctx, nil, namespace1, plaintext1) + externalId2, err := sqlKeeper.Store(ctx, keeperCfg, namespace1, plaintext1) require.NoError(t, err) require.NotEmpty(t, externalId2) @@ -75,11 +91,11 @@ func Test_SQLKeeperSetup(t *testing.T) { }) t.Run("storing same value in different namespace returns no error", func(t *testing.T) { - externalId1, err := sqlKeeper.Store(ctx, nil, namespace1, plaintext1) + externalId1, err := sqlKeeper.Store(ctx, keeperCfg, namespace1, plaintext1) require.NoError(t, err) require.NotEmpty(t, externalId1) - externalId2, err := sqlKeeper.Store(ctx, nil, namespace2, plaintext1) + externalId2, err := sqlKeeper.Store(ctx, keeperCfg, namespace2, plaintext1) require.NoError(t, err) require.NotEmpty(t, externalId2) @@ -87,46 +103,46 @@ func Test_SQLKeeperSetup(t *testing.T) { }) t.Run("exposing non existing values returns error", func(t *testing.T) { - exposedVal, err := sqlKeeper.Expose(ctx, nil, namespace1, nonExistentID) + exposedVal, err := sqlKeeper.Expose(ctx, keeperCfg, namespace1, nonExistentID) require.Error(t, err) assert.Empty(t, exposedVal) }) t.Run("deleting an existing encrypted value does not return error", func(t *testing.T) { - externalID, err := sqlKeeper.Store(ctx, nil, namespace1, plaintext1) + externalID, err := sqlKeeper.Store(ctx, keeperCfg, namespace1, plaintext1) require.NoError(t, err) require.NotEmpty(t, externalID) - exposedVal, err := sqlKeeper.Expose(ctx, nil, namespace1, externalID) + exposedVal, err := sqlKeeper.Expose(ctx, keeperCfg, namespace1, externalID) require.NoError(t, err) assert.NotNil(t, exposedVal) assert.Equal(t, plaintext1, exposedVal.DangerouslyExposeAndConsumeValue()) - err = sqlKeeper.Delete(ctx, nil, namespace1, externalID) + err = sqlKeeper.Delete(ctx, keeperCfg, namespace1, externalID) require.NoError(t, err) }) t.Run("deleting an non existing encrypted value does not return error", func(t *testing.T) { - err = sqlKeeper.Delete(ctx, nil, namespace1, nonExistentID) + err = sqlKeeper.Delete(ctx, keeperCfg, namespace1, nonExistentID) require.NoError(t, err) }) t.Run("updating an existent encrypted value returns no error", func(t *testing.T) { - externalId1, err := sqlKeeper.Store(ctx, nil, namespace1, plaintext1) + externalId1, err := sqlKeeper.Store(ctx, keeperCfg, namespace1, plaintext1) require.NoError(t, err) require.NotEmpty(t, externalId1) - err = sqlKeeper.Update(ctx, nil, namespace1, externalId1, plaintext2) + err = sqlKeeper.Update(ctx, keeperCfg, namespace1, externalId1, plaintext2) require.NoError(t, err) - exposedVal, err := sqlKeeper.Expose(ctx, nil, namespace1, externalId1) + exposedVal, err := sqlKeeper.Expose(ctx, keeperCfg, namespace1, externalId1) require.NoError(t, err) assert.NotNil(t, exposedVal) assert.Equal(t, plaintext2, exposedVal.DangerouslyExposeAndConsumeValue()) }) t.Run("updating a non existent encrypted value returns error", func(t *testing.T) { - externalId1, err := sqlKeeper.Store(ctx, nil, namespace1, plaintext1) + externalId1, err := sqlKeeper.Store(ctx, keeperCfg, namespace1, plaintext1) require.NoError(t, err) require.NotEmpty(t, externalId1) @@ -136,104 +152,33 @@ func Test_SQLKeeperSetup(t *testing.T) { } func setupTestService(t *testing.T, cfg *setting.Cfg) (*SQLKeeper, error) { + testDB := sqlstore.NewTestStore(t, sqlstore.WithMigrator(migrator.New())) tracer := noop.NewTracerProvider().Tracer("test") + database := database.ProvideDatabase(testDB, tracer) - // Initialize the encryption manager with in-memory implementation - encMgr := &inMemoryEncryptionManager{} + features := featuremgmt.WithFeatures(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, featuremgmt.FlagSecretsManagementAppPlatform) - // Initialize encrypted value storage with in-memory implementation - encValueStore := newInMemoryEncryptedValueStorage() + // Initialize the encryption manager + dataKeyStore, err := encryptionstorage.ProvideDataKeyStorage(database, tracer, features) + require.NoError(t, err) + + usageStats := &usagestats.UsageStatsMock{T: t} + + encMgr, err := encryptionmanager.ProvideEncryptionManager( + tracer, + dataKeyStore, + cfg, + usageStats, + nil, + ) + require.NoError(t, err) + + // Initialize encrypted value storage with a fake db + encValueStore, err := encryptionstorage.ProvideEncryptedValueStorage(database, tracer, features) + require.NoError(t, err) // Initialize the SQLKeeper sqlKeeper := NewSQLKeeper(tracer, encMgr, encValueStore) return sqlKeeper, nil } - -// While we don't have the real implementation, use an in-memory one -type inMemoryEncryptionManager struct{} - -func (m *inMemoryEncryptionManager) Encrypt(_ context.Context, _ string, value []byte) ([]byte, error) { - return []byte(base64.StdEncoding.EncodeToString(value)), nil -} - -func (m *inMemoryEncryptionManager) Decrypt(_ context.Context, _ string, value []byte) ([]byte, error) { - return base64.StdEncoding.DecodeString(string(value)) -} - -func (m *inMemoryEncryptionManager) ReEncryptDataKeys(_ context.Context, _ string) error { - return nil -} - -func (m *inMemoryEncryptionManager) RotateDataKeys(_ context.Context, _ string) error { - return nil -} - -// While we don't have the real implementation, use an in-memory one -type inMemoryEncryptedValueStorage struct { - mu sync.RWMutex - store map[string]*contracts.EncryptedValue -} - -func newInMemoryEncryptedValueStorage() *inMemoryEncryptedValueStorage { - return &inMemoryEncryptedValueStorage{ - store: make(map[string]*contracts.EncryptedValue), - } -} - -func (m *inMemoryEncryptedValueStorage) Create(_ context.Context, namespace string, encryptedData []byte) (*contracts.EncryptedValue, error) { - m.mu.Lock() - defer m.mu.Unlock() - - uid := fmt.Sprintf("%d", len(m.store)+1) // Generate simple incremental IDs - encValue := &contracts.EncryptedValue{ - UID: uid, - Namespace: namespace, - EncryptedData: encryptedData, - Created: 1, // Dummy timestamp - Updated: 1, // Dummy timestamp - } - - compositeKey := namespace + ":" + uid - m.store[compositeKey] = encValue - - return encValue, nil -} - -func (m *inMemoryEncryptedValueStorage) Get(_ context.Context, namespace string, uid string) (*contracts.EncryptedValue, error) { - m.mu.RLock() - defer m.mu.RUnlock() - - compositeKey := namespace + ":" + uid - encValue, exists := m.store[compositeKey] - if !exists { - return nil, fmt.Errorf("value not found for namespace %s and uid %s", namespace, uid) - } - - return encValue, nil -} - -func (m *inMemoryEncryptedValueStorage) Delete(_ context.Context, namespace string, uid string) error { - m.mu.Lock() - defer m.mu.Unlock() - - compositeKey := namespace + ":" + uid - delete(m.store, compositeKey) - - return nil -} - -func (m *inMemoryEncryptedValueStorage) Update(_ context.Context, namespace string, uid string, encryptedData []byte) error { - m.mu.Lock() - defer m.mu.Unlock() - - compositeKey := namespace + ":" + uid - encValue, exists := m.store[compositeKey] - if !exists { - return fmt.Errorf("value not found for namespace %s and uid %s", namespace, uid) - } - - encValue.EncryptedData = encryptedData - encValue.Updated = 2 // Update timestamp - return nil -} diff --git a/pkg/server/wire.go b/pkg/server/wire.go index 2b8f7352f7e..406497bcf9f 100644 --- a/pkg/server/wire.go +++ b/pkg/server/wire.go @@ -43,6 +43,8 @@ import ( "github.com/grafana/grafana/pkg/registry/apis/provisioning/repository/github" secretcontracts "github.com/grafana/grafana/pkg/registry/apis/secret/contracts" secretdecrypt "github.com/grafana/grafana/pkg/registry/apis/secret/decrypt" + gsmEncryption "github.com/grafana/grafana/pkg/registry/apis/secret/encryption" + encryptionManager "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/manager" appregistry "github.com/grafana/grafana/pkg/registry/apps" "github.com/grafana/grafana/pkg/services/accesscontrol" "github.com/grafana/grafana/pkg/services/accesscontrol/acimpl" @@ -428,6 +430,8 @@ var wireBasicSet = wire.NewSet( secretmigrator.NewWithEngine, secretdatabase.ProvideDatabase, wire.Bind(new(secretcontracts.Database), new(*secretdatabase.Database)), + encryptionManager.ProvideEncryptionManager, + gsmEncryption.ProvideThirdPartyProviderMap, secretdecrypt.ProvideDecryptAuthorizer, secretdecrypt.ProvideDecryptAllowList, // Unified storage diff --git a/pkg/server/wire_gen.go b/pkg/server/wire_gen.go index 5657b0e4c14..9fba20aa8c6 100644 --- a/pkg/server/wire_gen.go +++ b/pkg/server/wire_gen.go @@ -61,6 +61,8 @@ import ( "github.com/grafana/grafana/pkg/registry/apis/secret" "github.com/grafana/grafana/pkg/registry/apis/secret/contracts" "github.com/grafana/grafana/pkg/registry/apis/secret/decrypt" + encryption3 "github.com/grafana/grafana/pkg/registry/apis/secret/encryption" + manager4 "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/manager" "github.com/grafana/grafana/pkg/registry/apis/userstorage" "github.com/grafana/grafana/pkg/registry/apps" advisor2 "github.com/grafana/grafana/pkg/registry/apps/advisor" @@ -1426,7 +1428,7 @@ var withOTelSet = wire.NewSet( otelTracer, grpcserver.ProvideService, interceptors.ProvideAuthenticator, ) -var wireBasicSet = wire.NewSet(annotationsimpl.ProvideService, wire.Bind(new(annotations.Repository), new(*annotationsimpl.RepositoryImpl)), New, api.ProvideHTTPServer, query.ProvideService, wire.Bind(new(query.Service), new(*query.ServiceImpl)), bus.ProvideBus, wire.Bind(new(bus.Bus), new(*bus.InProcBus)), rendering.ProvideService, wire.Bind(new(rendering.Service), new(*rendering.RenderingService)), routing.ProvideRegister, wire.Bind(new(routing.RouteRegister), new(*routing.RouteRegisterImpl)), hooks.ProvideService, kvstore.ProvideService, localcache.ProvideService, bundleregistry.ProvideService, wire.Bind(new(supportbundles.Service), new(*bundleregistry.Service)), updatemanager.ProvideGrafanaService, updatemanager.ProvidePluginsService, service.ProvideService, wire.Bind(new(usagestats.Service), new(*service.UsageStats)), validator2.ProvideService, legacy.ProvideLegacyMigrator, pluginsintegration.WireSet, dashboards.ProvideFileStoreManager, wire.Bind(new(dashboards.FileStore), new(*dashboards.FileStoreManager)), cloudwatch.ProvideService, cloudmonitoring.ProvideService, azuremonitor.ProvideService, postgres.ProvideService, mysql.ProvideService, mssql.ProvideService, store.ProvideEntityEventsService, dualwrite.ProvideService, httpclientprovider.New, wire.Bind(new(httpclient.Provider), new(*httpclient2.Provider)), serverlock.ProvideService, annotationsimpl.ProvideCleanupService, wire.Bind(new(annotations.Cleaner), new(*annotationsimpl.CleanupServiceImpl)), cleanup.ProvideService, shorturlimpl.ProvideService, wire.Bind(new(shorturls.Service), new(*shorturlimpl.ShortURLService)), queryhistory.ProvideService, wire.Bind(new(queryhistory.Service), new(*queryhistory.QueryHistoryService)), correlations.ProvideService, wire.Bind(new(correlations.Service), new(*correlations.CorrelationsService)), quotaimpl.ProvideService, remotecache.ProvideService, wire.Bind(new(remotecache.CacheStorage), new(*remotecache.RemoteCache)), authinfoimpl.ProvideService, wire.Bind(new(login.AuthInfoService), new(*authinfoimpl.Service)), authinfoimpl.ProvideStore, datasourceproxy.ProvideService, sort.ProvideService, search2.ProvideService, searchV2.ProvideService, searchV2.ProvideSearchHTTPService, store.ProvideService, store.ProvideSystemUsersService, live.ProvideService, pushhttp.ProvideService, contexthandler.ProvideService, service10.ProvideService, wire.Bind(new(service10.LDAP), new(*service10.LDAPImpl)), jwt.ProvideService, wire.Bind(new(jwt.JWTService), new(*jwt.AuthService)), store2.ProvideDBStore, image.ProvideDeleteExpiredService, ngalert.ProvideService, librarypanels.ProvideService, wire.Bind(new(librarypanels.Service), new(*librarypanels.LibraryPanelService)), libraryelements.ProvideService, wire.Bind(new(libraryelements.Service), new(*libraryelements.LibraryElementService)), notifications.ProvideService, notifications.ProvideSmtpService, github.ProvideFactory, tracing.ProvideService, tracing.ProvideTracingConfig, wire.Bind(new(tracing.Tracer), new(*tracing.TracingService)), withOTelSet, testdatasource.ProvideService, api4.ProvideService, opentsdb.ProvideService, socialimpl.ProvideService, influxdb.ProvideService, wire.Bind(new(social.Service), new(*socialimpl.SocialService)), tempo.ProvideService, loki.ProvideService, graphite.ProvideService, prometheus.ProvideService, elasticsearch.ProvideService, pyroscope.ProvideService, parca.ProvideService, zipkin.ProvideService, jaeger.ProvideService, service7.ProvideCacheService, wire.Bind(new(datasources.CacheService), new(*service7.CacheServiceImpl)), service2.ProvideEncryptionService, wire.Bind(new(encryption.Internal), new(*service2.Service)), manager.ProvideSecretsService, wire.Bind(new(secrets.Service), new(*manager.SecretsService)), database.ProvideSecretsStore, wire.Bind(new(secrets.Store), new(*database.SecretsStoreImpl)), grafanads.ProvideService, wire.Bind(new(dashboardsnapshots.Store), new(*database4.DashboardSnapshotStore)), database4.ProvideStore, wire.Bind(new(dashboardsnapshots.Service), new(*service8.ServiceImpl)), service8.ProvideService, service7.ProvideService, wire.Bind(new(datasources.DataSourceService), new(*service7.Service)), service7.ProvideLegacyDataSourceLookup, retriever.ProvideService, wire.Bind(new(serviceaccounts.ServiceAccountRetriever), new(*retriever.Service)), ossaccesscontrol.ProvideServiceAccountPermissions, wire.Bind(new(accesscontrol.ServiceAccountPermissionsService), new(*ossaccesscontrol.ServiceAccountPermissionsService)), manager2.ProvideServiceAccountsService, proxy.ProvideServiceAccountsProxy, wire.Bind(new(serviceaccounts.Service), new(*proxy.ServiceAccountsProxy)), expr.ProvideService, featuremgmt.ProvideManagerService, featuremgmt.ProvideToggles, featuremgmt.ProvideOpenFeatureService, featuremgmt.ProvideStaticEvaluator, service5.ProvideDashboardServiceImpl, wire.Bind(new(dashboards2.PermissionsRegistrationService), new(*service5.DashboardServiceImpl)), service5.ProvideDashboardService, service5.ProvideDashboardProvisioningService, service5.ProvideDashboardPluginService, database2.ProvideDashboardStore, folderimpl.ProvideService, wire.Bind(new(folder.Service), new(*folderimpl.Service)), folderimpl.ProvideStore, wire.Bind(new(folder.Store), new(*folderimpl.FolderStoreImpl)), folderimpl.ProvideDashboardFolderStore, wire.Bind(new(folder.FolderStore), new(*folderimpl.DashboardFolderStoreImpl)), service9.ProvideService, wire.Bind(new(dashboardimport.Service), new(*service9.ImportDashboardService)), service6.ProvideService, wire.Bind(new(plugindashboards.Service), new(*service6.Service)), service6.ProvideDashboardUpdater, sanitizer.ProvideService, kvstore2.ProvideService, avatar.ProvideAvatarCacheServer, statscollector.ProvideService, csrf.ProvideCSRFFilter, wire.Bind(new(csrf.Service), new(*csrf.CSRF)), ossaccesscontrol.ProvideTeamPermissions, wire.Bind(new(accesscontrol.TeamPermissionsService), new(*ossaccesscontrol.TeamPermissionsService)), ossaccesscontrol.ProvideFolderPermissions, wire.Bind(new(accesscontrol.FolderPermissionsService), new(*ossaccesscontrol.FolderPermissionsService)), ossaccesscontrol.ProvideDashboardPermissions, wire.Bind(new(accesscontrol.DashboardPermissionsService), new(*ossaccesscontrol.DashboardPermissionsService)), ossaccesscontrol.ProvideReceiverPermissionsService, wire.Bind(new(accesscontrol.ReceiverPermissionsService), new(*ossaccesscontrol.ReceiverPermissionsService)), starimpl.ProvideService, playlistimpl.ProvideService, apikeyimpl.ProvideService, dashverimpl.ProvideService, service3.ProvideService, wire.Bind(new(publicdashboards.Service), new(*service3.PublicDashboardServiceImpl)), database3.ProvideStore, wire.Bind(new(publicdashboards.Store), new(*database3.PublicDashboardStoreImpl)), metric.ProvideService, api2.ProvideApi, api3.ProvideApi, userimpl.ProvideService, orgimpl.ProvideService, orgimpl.ProvideDeletionService, statsimpl.ProvideService, grpccontext.ProvideContextHandler, grpcserver.ProvideHealthService, grpcserver.ProvideReflectionService, resolver.ProvideEntityReferenceResolver, teamimpl.ProvideService, teamapi.ProvideTeamAPI, tempuserimpl.ProvideService, loginattemptimpl.ProvideService, wire.Bind(new(loginattempt.Service), new(*loginattemptimpl.Service)), migrations2.ProvideDataSourceMigrationService, migrations2.ProvideSecretMigrationProvider, wire.Bind(new(migrations2.SecretMigrationProvider), new(*migrations2.SecretMigrationProviderImpl)), resourcepermissions.NewActionSetService, wire.Bind(new(accesscontrol.ActionResolver), new(resourcepermissions.ActionSetService)), wire.Bind(new(pluginaccesscontrol.ActionSetRegistry), new(resourcepermissions.ActionSetService)), permreg.ProvidePermissionRegistry, acimpl.ProvideAccessControl, dualwrite2.ProvideZanzanaReconciler, navtreeimpl.ProvideService, wire.Bind(new(accesscontrol.AccessControl), new(*acimpl.AccessControl)), wire.Bind(new(notifications.TempUserStore), new(tempuser.Service)), tagimpl.ProvideService, wire.Bind(new(tag.Service), new(*tagimpl.Service)), authnimpl.ProvideService, authnimpl.ProvideIdentitySynchronizer, authnimpl.ProvideAuthnService, authnimpl.ProvideAuthnServiceAuthenticateOnly, authnimpl.ProvideRegistration, supportbundlesimpl.ProvideService, extsvcaccounts.ProvideExtSvcAccountsService, wire.Bind(new(serviceaccounts.ExtSvcAccountsService), new(*extsvcaccounts.ExtSvcAccountsService)), registry2.ProvideExtSvcRegistry, wire.Bind(new(extsvcauth.ExternalServiceRegistry), new(*registry2.Registry)), anonstore.ProvideAnonDBStore, wire.Bind(new(anonstore.AnonStore), new(*anonstore.AnonDBStore)), loggermw.Provide, slogadapter.Provide, signingkeysimpl.ProvideEmbeddedSigningKeysService, wire.Bind(new(signingkeys.Service), new(*signingkeysimpl.Service)), ssosettingsimpl.ProvideService, wire.Bind(new(ssosettings.Service), new(*ssosettingsimpl.Service)), idimpl.ProvideService, wire.Bind(new(auth.IDService), new(*idimpl.Service)), cloudmigrationimpl.ProvideService, userimpl.ProvideVerifier, connectors.ProvideOrgRoleMapper, wire.Bind(new(user.Verifier), new(*userimpl.Verifier)), authz.WireSet, metadata.ProvideSecureValueMetadataStorage, metadata.ProvideKeeperMetadataStorage, metadata.ProvideOutboxQueue, encryption2.ProvideDataKeyStorage, encryption2.ProvideEncryptedValueStorage, migrator2.NewWithEngine, database5.ProvideDatabase, wire.Bind(new(contracts.Database), new(*database5.Database)), decrypt.ProvideDecryptAuthorizer, decrypt.ProvideDecryptAllowList, resource.ProvideStorageMetrics, resource.ProvideIndexMetrics, apiserver.WireSet, apiregistry.WireSet, appregistry.WireSet) +var wireBasicSet = wire.NewSet(annotationsimpl.ProvideService, wire.Bind(new(annotations.Repository), new(*annotationsimpl.RepositoryImpl)), New, api.ProvideHTTPServer, query.ProvideService, wire.Bind(new(query.Service), new(*query.ServiceImpl)), bus.ProvideBus, wire.Bind(new(bus.Bus), new(*bus.InProcBus)), rendering.ProvideService, wire.Bind(new(rendering.Service), new(*rendering.RenderingService)), routing.ProvideRegister, wire.Bind(new(routing.RouteRegister), new(*routing.RouteRegisterImpl)), hooks.ProvideService, kvstore.ProvideService, localcache.ProvideService, bundleregistry.ProvideService, wire.Bind(new(supportbundles.Service), new(*bundleregistry.Service)), updatemanager.ProvideGrafanaService, updatemanager.ProvidePluginsService, service.ProvideService, wire.Bind(new(usagestats.Service), new(*service.UsageStats)), validator2.ProvideService, legacy.ProvideLegacyMigrator, pluginsintegration.WireSet, dashboards.ProvideFileStoreManager, wire.Bind(new(dashboards.FileStore), new(*dashboards.FileStoreManager)), cloudwatch.ProvideService, cloudmonitoring.ProvideService, azuremonitor.ProvideService, postgres.ProvideService, mysql.ProvideService, mssql.ProvideService, store.ProvideEntityEventsService, dualwrite.ProvideService, httpclientprovider.New, wire.Bind(new(httpclient.Provider), new(*httpclient2.Provider)), serverlock.ProvideService, annotationsimpl.ProvideCleanupService, wire.Bind(new(annotations.Cleaner), new(*annotationsimpl.CleanupServiceImpl)), cleanup.ProvideService, shorturlimpl.ProvideService, wire.Bind(new(shorturls.Service), new(*shorturlimpl.ShortURLService)), queryhistory.ProvideService, wire.Bind(new(queryhistory.Service), new(*queryhistory.QueryHistoryService)), correlations.ProvideService, wire.Bind(new(correlations.Service), new(*correlations.CorrelationsService)), quotaimpl.ProvideService, remotecache.ProvideService, wire.Bind(new(remotecache.CacheStorage), new(*remotecache.RemoteCache)), authinfoimpl.ProvideService, wire.Bind(new(login.AuthInfoService), new(*authinfoimpl.Service)), authinfoimpl.ProvideStore, datasourceproxy.ProvideService, sort.ProvideService, search2.ProvideService, searchV2.ProvideService, searchV2.ProvideSearchHTTPService, store.ProvideService, store.ProvideSystemUsersService, live.ProvideService, pushhttp.ProvideService, contexthandler.ProvideService, service10.ProvideService, wire.Bind(new(service10.LDAP), new(*service10.LDAPImpl)), jwt.ProvideService, wire.Bind(new(jwt.JWTService), new(*jwt.AuthService)), store2.ProvideDBStore, image.ProvideDeleteExpiredService, ngalert.ProvideService, librarypanels.ProvideService, wire.Bind(new(librarypanels.Service), new(*librarypanels.LibraryPanelService)), libraryelements.ProvideService, wire.Bind(new(libraryelements.Service), new(*libraryelements.LibraryElementService)), notifications.ProvideService, notifications.ProvideSmtpService, github.ProvideFactory, tracing.ProvideService, tracing.ProvideTracingConfig, wire.Bind(new(tracing.Tracer), new(*tracing.TracingService)), withOTelSet, testdatasource.ProvideService, api4.ProvideService, opentsdb.ProvideService, socialimpl.ProvideService, influxdb.ProvideService, wire.Bind(new(social.Service), new(*socialimpl.SocialService)), tempo.ProvideService, loki.ProvideService, graphite.ProvideService, prometheus.ProvideService, elasticsearch.ProvideService, pyroscope.ProvideService, parca.ProvideService, zipkin.ProvideService, jaeger.ProvideService, service7.ProvideCacheService, wire.Bind(new(datasources.CacheService), new(*service7.CacheServiceImpl)), service2.ProvideEncryptionService, wire.Bind(new(encryption.Internal), new(*service2.Service)), manager.ProvideSecretsService, wire.Bind(new(secrets.Service), new(*manager.SecretsService)), database.ProvideSecretsStore, wire.Bind(new(secrets.Store), new(*database.SecretsStoreImpl)), grafanads.ProvideService, wire.Bind(new(dashboardsnapshots.Store), new(*database4.DashboardSnapshotStore)), database4.ProvideStore, wire.Bind(new(dashboardsnapshots.Service), new(*service8.ServiceImpl)), service8.ProvideService, service7.ProvideService, wire.Bind(new(datasources.DataSourceService), new(*service7.Service)), service7.ProvideLegacyDataSourceLookup, retriever.ProvideService, wire.Bind(new(serviceaccounts.ServiceAccountRetriever), new(*retriever.Service)), ossaccesscontrol.ProvideServiceAccountPermissions, wire.Bind(new(accesscontrol.ServiceAccountPermissionsService), new(*ossaccesscontrol.ServiceAccountPermissionsService)), manager2.ProvideServiceAccountsService, proxy.ProvideServiceAccountsProxy, wire.Bind(new(serviceaccounts.Service), new(*proxy.ServiceAccountsProxy)), expr.ProvideService, featuremgmt.ProvideManagerService, featuremgmt.ProvideToggles, featuremgmt.ProvideOpenFeatureService, featuremgmt.ProvideStaticEvaluator, service5.ProvideDashboardServiceImpl, wire.Bind(new(dashboards2.PermissionsRegistrationService), new(*service5.DashboardServiceImpl)), service5.ProvideDashboardService, service5.ProvideDashboardProvisioningService, service5.ProvideDashboardPluginService, database2.ProvideDashboardStore, folderimpl.ProvideService, wire.Bind(new(folder.Service), new(*folderimpl.Service)), folderimpl.ProvideStore, wire.Bind(new(folder.Store), new(*folderimpl.FolderStoreImpl)), folderimpl.ProvideDashboardFolderStore, wire.Bind(new(folder.FolderStore), new(*folderimpl.DashboardFolderStoreImpl)), service9.ProvideService, wire.Bind(new(dashboardimport.Service), new(*service9.ImportDashboardService)), service6.ProvideService, wire.Bind(new(plugindashboards.Service), new(*service6.Service)), service6.ProvideDashboardUpdater, sanitizer.ProvideService, kvstore2.ProvideService, avatar.ProvideAvatarCacheServer, statscollector.ProvideService, csrf.ProvideCSRFFilter, wire.Bind(new(csrf.Service), new(*csrf.CSRF)), ossaccesscontrol.ProvideTeamPermissions, wire.Bind(new(accesscontrol.TeamPermissionsService), new(*ossaccesscontrol.TeamPermissionsService)), ossaccesscontrol.ProvideFolderPermissions, wire.Bind(new(accesscontrol.FolderPermissionsService), new(*ossaccesscontrol.FolderPermissionsService)), ossaccesscontrol.ProvideDashboardPermissions, wire.Bind(new(accesscontrol.DashboardPermissionsService), new(*ossaccesscontrol.DashboardPermissionsService)), ossaccesscontrol.ProvideReceiverPermissionsService, wire.Bind(new(accesscontrol.ReceiverPermissionsService), new(*ossaccesscontrol.ReceiverPermissionsService)), starimpl.ProvideService, playlistimpl.ProvideService, apikeyimpl.ProvideService, dashverimpl.ProvideService, service3.ProvideService, wire.Bind(new(publicdashboards.Service), new(*service3.PublicDashboardServiceImpl)), database3.ProvideStore, wire.Bind(new(publicdashboards.Store), new(*database3.PublicDashboardStoreImpl)), metric.ProvideService, api2.ProvideApi, api3.ProvideApi, userimpl.ProvideService, orgimpl.ProvideService, orgimpl.ProvideDeletionService, statsimpl.ProvideService, grpccontext.ProvideContextHandler, grpcserver.ProvideHealthService, grpcserver.ProvideReflectionService, resolver.ProvideEntityReferenceResolver, teamimpl.ProvideService, teamapi.ProvideTeamAPI, tempuserimpl.ProvideService, loginattemptimpl.ProvideService, wire.Bind(new(loginattempt.Service), new(*loginattemptimpl.Service)), migrations2.ProvideDataSourceMigrationService, migrations2.ProvideSecretMigrationProvider, wire.Bind(new(migrations2.SecretMigrationProvider), new(*migrations2.SecretMigrationProviderImpl)), resourcepermissions.NewActionSetService, wire.Bind(new(accesscontrol.ActionResolver), new(resourcepermissions.ActionSetService)), wire.Bind(new(pluginaccesscontrol.ActionSetRegistry), new(resourcepermissions.ActionSetService)), permreg.ProvidePermissionRegistry, acimpl.ProvideAccessControl, dualwrite2.ProvideZanzanaReconciler, navtreeimpl.ProvideService, wire.Bind(new(accesscontrol.AccessControl), new(*acimpl.AccessControl)), wire.Bind(new(notifications.TempUserStore), new(tempuser.Service)), tagimpl.ProvideService, wire.Bind(new(tag.Service), new(*tagimpl.Service)), authnimpl.ProvideService, authnimpl.ProvideIdentitySynchronizer, authnimpl.ProvideAuthnService, authnimpl.ProvideAuthnServiceAuthenticateOnly, authnimpl.ProvideRegistration, supportbundlesimpl.ProvideService, extsvcaccounts.ProvideExtSvcAccountsService, wire.Bind(new(serviceaccounts.ExtSvcAccountsService), new(*extsvcaccounts.ExtSvcAccountsService)), registry2.ProvideExtSvcRegistry, wire.Bind(new(extsvcauth.ExternalServiceRegistry), new(*registry2.Registry)), anonstore.ProvideAnonDBStore, wire.Bind(new(anonstore.AnonStore), new(*anonstore.AnonDBStore)), loggermw.Provide, slogadapter.Provide, signingkeysimpl.ProvideEmbeddedSigningKeysService, wire.Bind(new(signingkeys.Service), new(*signingkeysimpl.Service)), ssosettingsimpl.ProvideService, wire.Bind(new(ssosettings.Service), new(*ssosettingsimpl.Service)), idimpl.ProvideService, wire.Bind(new(auth.IDService), new(*idimpl.Service)), cloudmigrationimpl.ProvideService, userimpl.ProvideVerifier, connectors.ProvideOrgRoleMapper, wire.Bind(new(user.Verifier), new(*userimpl.Verifier)), authz.WireSet, metadata.ProvideSecureValueMetadataStorage, metadata.ProvideKeeperMetadataStorage, metadata.ProvideOutboxQueue, encryption2.ProvideDataKeyStorage, encryption2.ProvideEncryptedValueStorage, migrator2.NewWithEngine, database5.ProvideDatabase, wire.Bind(new(contracts.Database), new(*database5.Database)), manager4.ProvideEncryptionManager, encryption3.ProvideThirdPartyProviderMap, decrypt.ProvideDecryptAuthorizer, decrypt.ProvideDecryptAllowList, resource.ProvideStorageMetrics, resource.ProvideIndexMetrics, apiserver.WireSet, apiregistry.WireSet, appregistry.WireSet) var wireSet = wire.NewSet( wireBasicSet, metrics.WireSet, sqlstore.ProvideService, metrics2.ProvideService, wire.Bind(new(notifications.Service), new(*notifications.NotificationService)), wire.Bind(new(notifications.WebhookSender), new(*notifications.NotificationService)), wire.Bind(new(notifications.EmailSender), new(*notifications.NotificationService)), wire.Bind(new(db.DB), new(*sqlstore.SQLStore)), prefimpl.ProvideService, oauthtoken.ProvideService, wire.Bind(new(oauthtoken.OAuthTokenService), new(*oauthtoken.Service)), wire.Bind(new(cleanup.AlertRuleService), new(*store2.DBstore)), diff --git a/pkg/server/wireexts_oss.go b/pkg/server/wireexts_oss.go index 28f116c2f9c..4c2e5f8b14d 100644 --- a/pkg/server/wireexts_oss.go +++ b/pkg/server/wireexts_oss.go @@ -11,6 +11,8 @@ import ( "github.com/grafana/grafana/pkg/plugins" "github.com/grafana/grafana/pkg/plugins/manager" "github.com/grafana/grafana/pkg/registry" + "github.com/grafana/grafana/pkg/registry/apis/secret/contracts" + "github.com/grafana/grafana/pkg/registry/apis/secret/secretkeeper" "github.com/grafana/grafana/pkg/registry/backgroundsvcs" "github.com/grafana/grafana/pkg/registry/usagestatssvcs" "github.com/grafana/grafana/pkg/services/accesscontrol" @@ -93,6 +95,8 @@ var wireExtsBasicSet = wire.NewSet( wire.Bind(new(searchusers.Service), new(*searchusers.OSSService)), osskmsproviders.ProvideService, wire.Bind(new(kmsproviders.Service), new(osskmsproviders.Service)), + secretkeeper.ProvideService, + wire.Bind(new(contracts.KeeperService), new(*secretkeeper.OSSKeeperService)), ldap.ProvideGroupsService, wire.Bind(new(ldap.Groups), new(*ldap.OSSGroups)), guardian.ProvideGuardian, diff --git a/pkg/setting/setting_secrets_manager.go b/pkg/setting/setting_secrets_manager.go index 646acd77546..f52021a9ebf 100644 --- a/pkg/setting/setting_secrets_manager.go +++ b/pkg/setting/setting_secrets_manager.go @@ -4,7 +4,6 @@ import ( "regexp" "time" - "github.com/grafana/grafana/pkg/registry/apis/secret/encryption/cipher" "github.com/grafana/grafana/pkg/services/kmsproviders" ) @@ -18,8 +17,6 @@ type SecretsManagerSettings struct { SecretKey string EncryptionProvider string AvailableProviders []string - - Encryption EncryptionSettings } func (cfg *Cfg) readSecretsManagerSettings() { @@ -29,9 +26,4 @@ func (cfg *Cfg) readSecretsManagerSettings() { // TODO: These are not used yet by the secrets manager because we need to distentagle the dependencies with OSS. cfg.SecretsManagement.SecretKey = secretsMgmt.Key("secret_key").MustString("") cfg.SecretsManagement.AvailableProviders = regexp.MustCompile(`\s*,\s*`).Split(secretsMgmt.Key("available_encryption_providers").MustString(""), -1) // parse comma separated list - - encryption := cfg.Raw.Section("secrets_manager.encryption") - cfg.SecretsManagement.Encryption.DataKeysCacheTTL = encryption.Key("data_keys_cache_ttl").MustDuration(15 * time.Minute) - cfg.SecretsManagement.Encryption.DataKeysCleanupInterval = encryption.Key("data_keys_cache_cleanup_interval").MustDuration(1 * time.Minute) - cfg.SecretsManagement.Encryption.Algorithm = encryption.Key("algorithm").MustString(cipher.AesGcm) } diff --git a/pkg/storage/secret/encryption/encrypted_value_store.go b/pkg/storage/secret/encryption/encrypted_value_store.go index 58bdd4054a2..a369a7a74f5 100644 --- a/pkg/storage/secret/encryption/encrypted_value_store.go +++ b/pkg/storage/secret/encryption/encrypted_value_store.go @@ -19,7 +19,11 @@ var ( ErrEncryptedValueNotFound = errors.New("encrypted value not found") ) -func ProvideEncryptedValueStorage(db contracts.Database, tracer trace.Tracer, features featuremgmt.FeatureToggles) (contracts.EncryptedValueStorage, error) { +func ProvideEncryptedValueStorage( + db contracts.Database, + tracer trace.Tracer, + features featuremgmt.FeatureToggles, +) (contracts.EncryptedValueStorage, error) { if !features.IsEnabledGlobally(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs) || !features.IsEnabledGlobally(featuremgmt.FlagSecretsManagementAppPlatform) { return &encryptedValStorage{}, nil From 8d8b824f7305863033b37c884c740333a8d01f69 Mon Sep 17 00:00:00 2001 From: Georges Chaudy Date: Thu, 3 Jul 2025 14:31:07 +0200 Subject: [PATCH 10/19] unistore: skipping badger test failing atm (#107572) skipping badger test failing atm --- pkg/storage/unified/testing/storage_backend_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/storage/unified/testing/storage_backend_test.go b/pkg/storage/unified/testing/storage_backend_test.go index a1da3b82e72..c0be0065c2f 100644 --- a/pkg/storage/unified/testing/storage_backend_test.go +++ b/pkg/storage/unified/testing/storage_backend_test.go @@ -11,6 +11,7 @@ import ( ) func TestBadgerKVStorageBackend(t *testing.T) { + t.Skip("failing with 'panic: DB Closed'") RunStorageBackendTest(t, func(ctx context.Context) resource.StorageBackend { opts := badger.DefaultOptions("").WithInMemory(true).WithLogger(nil) db, err := badger.Open(opts) From 4f66c4a2a1bb72f2289ddb1b68d0ce3c58aa8d50 Mon Sep 17 00:00:00 2001 From: Victor Cinaglia Date: Thu, 3 Jul 2025 10:16:24 -0300 Subject: [PATCH 11/19] iam: Refresh live connection when ID tokens expire (#107209) * iam: refresh live connection when ID tokens expire * add coverage for the handler functions * reinstate inadvertently broken unit test --- go.work.sum | 1 + pkg/apimachinery/go.mod | 2 +- pkg/apimachinery/identity/requester.go | 30 ++++ pkg/apimachinery/identity/requester_test.go | 98 ++++++++++ pkg/services/live/live.go | 30 ++++ pkg/services/live/live_test.go | 190 ++++++++++++++++++-- 6 files changed, 337 insertions(+), 14 deletions(-) create mode 100644 pkg/apimachinery/identity/requester_test.go diff --git a/go.work.sum b/go.work.sum index cf90c70f3b1..d684e218820 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1363,6 +1363,7 @@ github.com/grafana/grafana/pkg/build v0.0.0-20250220114259-be81314e2118/go.mod h github.com/grafana/grafana/pkg/build v0.0.0-20250227105625-8f465f124924/go.mod h1:Vw0LdoMma64VgIMVpRY3i0D156jddgUGjTQBOcyeF3k= github.com/grafana/grafana/pkg/build v0.0.0-20250227163402-d78c646f93bb/go.mod h1:Vw0LdoMma64VgIMVpRY3i0D156jddgUGjTQBOcyeF3k= github.com/grafana/grafana/pkg/build v0.0.0-20250403075254-4918d8720c61/go.mod h1:LGVnSwdrS0ZnJ2WXEl5acgDoYPm74EUSFavca1NKHI8= +github.com/grafana/grafana/pkg/build v0.0.0-20250625151647-35f89a456cc6/go.mod h1:dIu5dZy00k2TBdpVBXkvSbxHNj5H7lW/sOTpJTtKIXg= github.com/grafana/grafana/pkg/semconv v0.0.0-20250121113133-e747350fee2d/go.mod h1:tfLnBpPYgwrBMRz4EXqPCZJyCjEG4Ev37FSlXnocJ2c= github.com/grafana/grafana/pkg/semconv v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:mu3yl0GxB0eQZV1q7Kka0pkF3Th9x7W04WrjR9wqBlc= github.com/grafana/grafana/pkg/storage/unified/apistore v0.0.0-20250121113133-e747350fee2d/go.mod h1:CXpwZ3Mkw6xVlGKc0SqUxqXCP3Uv182q6qAQnLaLxRg= diff --git a/pkg/apimachinery/go.mod b/pkg/apimachinery/go.mod index b9a01c87fe0..2155cda748e 100644 --- a/pkg/apimachinery/go.mod +++ b/pkg/apimachinery/go.mod @@ -3,6 +3,7 @@ module github.com/grafana/grafana/pkg/apimachinery go 1.24.4 require ( + github.com/go-jose/go-jose/v3 v3.0.4 // @grafana/identity-access-team github.com/grafana/authlib v0.0.0-20250618124654-54543efcfeed // @grafana/identity-access-team github.com/grafana/authlib/types v0.0.0-20250325095148-d6da9c164a7d // @grafana/identity-access-team github.com/stretchr/testify v1.10.0 @@ -15,7 +16,6 @@ require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/go-jose/go-jose/v3 v3.0.4 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect diff --git a/pkg/apimachinery/identity/requester.go b/pkg/apimachinery/identity/requester.go index 3bdbd30bf17..bd2ca2559ce 100644 --- a/pkg/apimachinery/identity/requester.go +++ b/pkg/apimachinery/identity/requester.go @@ -3,7 +3,9 @@ package identity import ( "fmt" "strconv" + "time" + "github.com/go-jose/go-jose/v3/jwt" "k8s.io/apiserver/pkg/authentication/user" claims "github.com/grafana/authlib/types" @@ -125,3 +127,31 @@ func intIdentifier(typ claims.IdentityType, id string, expected ...claims.Identi return 0, ErrNotIntIdentifier } + +// IsIDTokenExpired returns true if the ID token is expired. +// If no ID token exists, returns false. +func IsIDTokenExpired(requester Requester) bool { + idToken := requester.GetIDToken() + if idToken == "" { + return false + } + + parsed, err := jwt.ParseSigned(idToken) + if err != nil { + return false + } + + var claims struct { + Expiry *jwt.NumericDate `json:"exp"` + } + if err := parsed.UnsafeClaimsWithoutVerification(&claims); err != nil { + return false + } + + if claims.Expiry != nil { + expiryTime := claims.Expiry.Time() + return time.Now().After(expiryTime) + } + + return false +} diff --git a/pkg/apimachinery/identity/requester_test.go b/pkg/apimachinery/identity/requester_test.go new file mode 100644 index 00000000000..9dbb027ad3d --- /dev/null +++ b/pkg/apimachinery/identity/requester_test.go @@ -0,0 +1,98 @@ +package identity_test + +import ( + "testing" + "time" + + "github.com/go-jose/go-jose/v3" + "github.com/go-jose/go-jose/v3/jwt" + "github.com/stretchr/testify/require" + + "github.com/grafana/grafana/pkg/apimachinery/identity" +) + +func TestIsIDTokenExpired(t *testing.T) { + tests := []struct { + name string + token func(t *testing.T) string + expected bool + }{ + { + name: "should return false when ID token is not set", + token: func(t *testing.T) string { + return "" + }, + expected: false, + }, + { + name: "should return false when ID token is not expired", + token: func(t *testing.T) string { + expiration := time.Now().Add(time.Hour) + return createToken(t, &expiration) + }, + expected: false, + }, + { + name: "should return true when ID token is expired", + token: func(t *testing.T) string { + expiration := time.Now().Add(-time.Hour) + return createToken(t, &expiration) + }, + expected: true, + }, + { + name: "should return false when ID token has no expiry claim", + token: func(t *testing.T) string { + return createToken(t, nil) + }, + expected: false, + }, + { + name: "should return false when ID token is malformed", + token: func(t *testing.T) string { + return "invalid.jwt.token" + }, + expected: false, + }, + { + name: "should handle token that expires exactly now", + token: func(t *testing.T) string { + expiration := time.Now().Add(-time.Millisecond) + return createToken(t, &expiration) + }, + expected: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + token := tt.token(t) + requester := &identity.StaticRequester{IDToken: token} + + result := identity.IsIDTokenExpired(requester) + require.Equal(t, tt.expected, result) + }) + } +} + +func createToken(t *testing.T, exp *time.Time) string { + key := []byte("test-secret-key") + signer, err := jose.NewSigner(jose.SigningKey{Algorithm: jose.HS256, Key: key}, nil) + require.NoError(t, err) + + claims := struct { + jwt.Claims + }{ + Claims: jwt.Claims{ + Subject: "test-user", + }, + } + + if exp != nil { + claims.Expiry = jwt.NewNumericDate(*exp) + } + + token, err := jwt.Signed(signer).Claims(claims).CompactSerialize() + require.NoError(t, err) + return token +} diff --git a/pkg/services/live/live.go b/pkg/services/live/live.go index 116726a9e86..0394e06fdc0 100644 --- a/pkg/services/live/live.go +++ b/pkg/services/live/live.go @@ -641,6 +641,20 @@ func runConcurrentlyIfNeeded(ctx context.Context, semaphore chan struct{}, fn fu return nil } +func (g *GrafanaLive) checkIDTokenExpirationAndRefresh(user identity.Requester, client *centrifuge.Client) bool { + if !identity.IsIDTokenExpired(user) { + return false + } + + logger.Debug("ID token expired, triggering refresh", "user", client.UserID(), "client", client.ID()) + err := g.node.Refresh(client.UserID(), centrifuge.WithRefreshExpired(true)) + if err != nil { + logger.Error("Failed to refresh expired ID token", "user", client.UserID(), "client", client.ID(), "error", err) + } + + return true +} + func (g *GrafanaLive) HandleDatasourceDelete(orgID int64, dsUID string) { if g.runStreamManager == nil { return @@ -676,6 +690,12 @@ func (g *GrafanaLive) handleOnRPC(clientContextWithSpan context.Context, client logger.Error("No user found in context", "user", client.UserID(), "client", client.ID(), "method", e.Method) return centrifuge.RPCReply{}, centrifuge.ErrorInternal } + + // Check if ID token is expired and trigger refresh if needed + if expired := g.checkIDTokenExpirationAndRefresh(user, client); expired { + return centrifuge.RPCReply{}, centrifuge.ErrorExpired + } + var req dtos.MetricRequest err := json.Unmarshal(e.Data, &req) if err != nil { @@ -712,6 +732,11 @@ func (g *GrafanaLive) handleOnSubscribe(clientContextWithSpan context.Context, c return centrifuge.SubscribeReply{}, centrifuge.ErrorInternal } + // Check if ID token is expired and trigger refresh if needed + if expired := g.checkIDTokenExpirationAndRefresh(user, client); expired { + return centrifuge.SubscribeReply{}, centrifuge.ErrorExpired + } + // See a detailed comment for StripOrgID about orgID management in Live. orgID, channel, err := orgchannel.StripOrgID(e.Channel) if err != nil { @@ -813,6 +838,11 @@ func (g *GrafanaLive) handleOnPublish(clientCtxWithSpan context.Context, client return centrifuge.PublishReply{}, centrifuge.ErrorInternal } + // Check if ID token is expired and trigger refresh if needed + if expired := g.checkIDTokenExpirationAndRefresh(user, client); expired { + return centrifuge.PublishReply{}, centrifuge.ErrorExpired + } + // See a detailed comment for StripOrgID about orgID management in Live. orgID, channel, err := orgchannel.StripOrgID(e.Channel) if err != nil { diff --git a/pkg/services/live/live_test.go b/pkg/services/live/live_test.go index 7ae91b968f5..eb685d6a4d2 100644 --- a/pkg/services/live/live_test.go +++ b/pkg/services/live/live_test.go @@ -7,15 +7,20 @@ import ( "testing" "time" + "github.com/go-jose/go-jose/v3" + "github.com/go-jose/go-jose/v3/jwt" "github.com/stretchr/testify/require" + "github.com/centrifugal/centrifuge" "github.com/grafana/grafana/pkg/api/routing" + "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/usagestats" "github.com/grafana/grafana/pkg/services/accesscontrol/acimpl" "github.com/grafana/grafana/pkg/services/annotations/annotationstest" "github.com/grafana/grafana/pkg/services/dashboards" "github.com/grafana/grafana/pkg/services/featuremgmt" + "github.com/grafana/grafana/pkg/services/live/livecontext" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/tests/testsuite" ) @@ -29,20 +34,9 @@ func TestIntegration_provideLiveService_RedisUnavailable(t *testing.T) { cfg.LiveHAEngine = "testredisunavailable" - _, err := ProvideService(nil, cfg, - routing.NewRouteRegister(), - nil, nil, nil, nil, - db.InitTestDB(t), - nil, - &usagestats.UsageStatsMock{T: t}, - nil, - featuremgmt.WithFeatures(), - acimpl.ProvideAccessControl(featuremgmt.WithFeatures()), - &dashboards.FakeDashboardService{}, - annotationstest.NewFakeAnnotationsRepo(), - nil, nil) + _, err := setupLiveService(cfg, t) - // Proceeds without live HA if redis is unavaialble + // Proceeds without live HA if redis is unavailable require.NoError(t, err) } @@ -233,3 +227,173 @@ func Test_getHistogramMetric(t *testing.T) { }) } } + +func Test_handleOnPublish_IDTokenExpiration(t *testing.T) { + g, err := setupLiveService(nil, t) + require.NoError(t, err) + + client, _, err := centrifuge.NewClient(context.Background(), g.node, newDummyTransport("test")) + require.NoError(t, err) + + t.Run("expired token", func(t *testing.T) { + expiration := time.Now().Add(-time.Hour) + token := createToken(t, &expiration) + ctx := livecontext.SetContextSignedUser(context.Background(), &identity.StaticRequester{IDToken: token}) + reply, err := g.handleOnPublish(ctx, client, centrifuge.PublishEvent{ + Channel: "test", + Data: []byte("test"), + }) + require.ErrorIs(t, err, centrifuge.ErrorExpired) + require.Empty(t, reply) + }) + + t.Run("unexpired token", func(t *testing.T) { + expiration := time.Now().Add(time.Hour) + token := createToken(t, &expiration) + ctx := livecontext.SetContextSignedUser(context.Background(), &identity.StaticRequester{IDToken: token}) + reply, err := g.handleOnPublish(ctx, client, centrifuge.PublishEvent{ + Channel: "test", + Data: []byte("test"), + }) + + // Another error is returned if the token is not expired but the refresh fails. + // That happens because we're providing an invalid orgID as the channel. + require.NotErrorIs(t, err, centrifuge.ErrorExpired) + require.Empty(t, reply) + }) +} + +func Test_handleOnRPC_IDTokenExpiration(t *testing.T) { + g, err := setupLiveService(nil, t) + require.NoError(t, err) + + client, _, err := centrifuge.NewClient(context.Background(), g.node, newDummyTransport("test")) + require.NoError(t, err) + + t.Run("expired token", func(t *testing.T) { + expiration := time.Now().Add(-time.Hour) + token := createToken(t, &expiration) + ctx := livecontext.SetContextSignedUser(context.Background(), &identity.StaticRequester{IDToken: token}) + reply, err := g.handleOnRPC(ctx, client, centrifuge.RPCEvent{ + Method: "grafana.query", + Data: []byte("test"), + }) + require.ErrorIs(t, err, centrifuge.ErrorExpired) + require.Empty(t, reply) + }) + + t.Run("unexpired token", func(t *testing.T) { + expiration := time.Now().Add(time.Hour) + token := createToken(t, &expiration) + ctx := livecontext.SetContextSignedUser(context.Background(), &identity.StaticRequester{IDToken: token}) + reply, err := g.handleOnRPC(ctx, client, centrifuge.RPCEvent{ + Method: "grafana.query", + Data: []byte("test"), + }) + + // Another error is returned if the token is not expired but the refresh fails. + // That happens because we're providing an invalid orgID as the channel. + require.NotErrorIs(t, err, centrifuge.ErrorExpired) + require.Empty(t, reply) + }) +} + +func Test_handleOnSubscribe_IDTokenExpiration(t *testing.T) { + g, err := setupLiveService(nil, t) + require.NoError(t, err) + + client, _, err := centrifuge.NewClient(context.Background(), g.node, newDummyTransport("test")) + require.NoError(t, err) + + t.Run("expired token", func(t *testing.T) { + expiration := time.Now().Add(-time.Hour) + token := createToken(t, &expiration) + ctx := livecontext.SetContextSignedUser(context.Background(), &identity.StaticRequester{IDToken: token}) + reply, err := g.handleOnSubscribe(ctx, client, centrifuge.SubscribeEvent{ + Channel: "test", + }) + require.ErrorIs(t, err, centrifuge.ErrorExpired) + require.Empty(t, reply) + }) + + t.Run("unexpired token", func(t *testing.T) { + expiration := time.Now().Add(time.Hour) + token := createToken(t, &expiration) + ctx := livecontext.SetContextSignedUser(context.Background(), &identity.StaticRequester{IDToken: token}) + reply, err := g.handleOnSubscribe(ctx, client, centrifuge.SubscribeEvent{ + Channel: "test", + }) + + // Another error is returned if the token is not expired but the refresh fails. + // That happens because we're providing an invalid orgID as the channel. + require.NotErrorIs(t, err, centrifuge.ErrorExpired) + require.Empty(t, reply) + }) +} + +func setupLiveService(cfg *setting.Cfg, t *testing.T) (*GrafanaLive, error) { + if cfg == nil { + cfg = setting.NewCfg() + } + + return ProvideService(nil, + cfg, + routing.NewRouteRegister(), + nil, nil, nil, nil, + db.InitTestDB(t), + nil, + &usagestats.UsageStatsMock{T: t}, + nil, + featuremgmt.WithFeatures(), + acimpl.ProvideAccessControl(featuremgmt.WithFeatures()), + &dashboards.FakeDashboardService{}, + annotationstest.NewFakeAnnotationsRepo(), + nil, nil) +} + +type dummyTransport struct { + name string +} + +func (t *dummyTransport) Name() string { return t.name } +func (t *dummyTransport) Protocol() centrifuge.ProtocolType { return centrifuge.ProtocolTypeJSON } +func (t *dummyTransport) ProtocolVersion() centrifuge.ProtocolVersion { + return centrifuge.ProtocolVersion2 +} +func (t *dummyTransport) Emulation() bool { return false } +func (t *dummyTransport) Unidirectional() bool { return false } +func (t *dummyTransport) DisabledPushFlags() uint64 { return 0 } +func (t *dummyTransport) PingPongConfig() centrifuge.PingPongConfig { + return centrifuge.PingPongConfig{} +} +func (t *dummyTransport) Write(data []byte) error { return nil } +func (t *dummyTransport) WriteMany(d ...[]byte) error { return nil } +func (t *dummyTransport) Close(disconnect centrifuge.Disconnect) error { + return nil +} + +func newDummyTransport(name string) *dummyTransport { + return &dummyTransport{name: name} +} + +func createToken(t *testing.T, exp *time.Time) string { + key := []byte("test-secret-key") + signer, err := jose.NewSigner(jose.SigningKey{Algorithm: jose.HS256, Key: key}, nil) + require.NoError(t, err) + + claims := struct { + jwt.Claims + }{ + Claims: jwt.Claims{ + Subject: "test-user", + }, + } + + if exp != nil { + claims.Expiry = jwt.NewNumericDate(*exp) + } + + token, err := jwt.Signed(signer).Claims(claims).CompactSerialize() + require.NoError(t, err) + return token +} From 185ce90a4b202ff36ee7a71aa6a9d06da4466819 Mon Sep 17 00:00:00 2001 From: Gareth Date: Thu, 3 Jul 2025 14:45:22 +0100 Subject: [PATCH 12/19] Jaeger: Enable jaegerBackendMigration feature toggle by default (#107526) * Jaeger: Enable jaegerBackendMigration feature toggle by default * fix test * update old-arch test --- .../feature-toggles/index.md | 1 + .../fixtures/long-trace-response-backend.json | 697 ++ e2e/cypress/fixtures/long-trace-response.json | 7592 ----------------- .../trace-view-scrolling.spec.ts | 8 +- .../trace-view-scrolling.spec.ts | 8 +- .../src/types/featureToggles.gen.ts | 1 + pkg/services/featuremgmt/registry.go | 3 +- pkg/services/featuremgmt/toggles_gen.csv | 2 +- pkg/services/featuremgmt/toggles_gen.json | 12 +- 9 files changed, 722 insertions(+), 7602 deletions(-) create mode 100644 e2e/cypress/fixtures/long-trace-response-backend.json delete mode 100644 e2e/cypress/fixtures/long-trace-response.json diff --git a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md index a3e2776142e..c20e71dab3d 100644 --- a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md +++ b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md @@ -72,6 +72,7 @@ Most [generally available](https://grafana.com/docs/release-life-cycle/#general- | `pluginsSriChecks` | Enables SRI checks for plugin assets | | | `azureMonitorDisableLogLimit` | Disables the log limit restriction for Azure Monitor when true. The limit is enabled by default. | | | `preinstallAutoUpdate` | Enables automatic updates for pre-installed plugins | Yes | +| `jaegerBackendMigration` | Enables querying the Jaeger data source without the proxy | Yes | | `alertingUIOptimizeReducer` | Enables removing the reducer from the alerting UI when creating a new alert rule and using instant query | Yes | | `azureMonitorEnableUserAuth` | Enables user auth for Azure Monitor datasource only | Yes | | `alertingNotificationsStepMode` | Enables simplified step mode in the notifications section | Yes | diff --git a/e2e/cypress/fixtures/long-trace-response-backend.json b/e2e/cypress/fixtures/long-trace-response-backend.json new file mode 100644 index 00000000000..5605ab1dd7c --- /dev/null +++ b/e2e/cypress/fixtures/long-trace-response-backend.json @@ -0,0 +1,697 @@ +{ + "results": { + "A": { + "status": 200, + "frames": [ + { + "schema": { + "name": "A", + "refId": "A", + "meta": { + "typeVersion": [0, 0], + "custom": { + "traceFormat": "jaeger" + }, + "preferredVisualisationType": "trace" + }, + "fields": [ + { + "name": "traceID", + "type": "string" + }, + { + "name": "spanID", + "type": "string" + }, + { + "name": "parentSpanID", + "type": "string" + }, + { + "name": "operationName", + "type": "string" + }, + { + "name": "serviceName", + "type": "string" + }, + { + "name": "startTime", + "type": "number" + }, + { + "name": "duration", + "type": "number" + } + ] + }, + "data": { + "values": [ + [ + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcf6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90", + "3fa414edcef6ad90" + ], + [ + "0000000000000000", + "0000000000000001", + "0000000000000002", + "0000000000000003", + "0000000000000004", + "0000000000000005", + "0000000000000006", + "0000000000000007", + "0000000000000008", + "0000000000000009", + "000000000000000a", + "000000000000000b", + "000000000000000c", + "000000000000000d", + "000000000000000e", + "000000000000000f", + "0000000000000010", + "0000000000000011", + "0000000000000012", + "0000000000000013", + "0000000000000014", + "0000000000000015", + "0000000000000016", + "0000000000000017", + "0000000000000018", + "0000000000000019", + "000000000000001a", + "000000000000001b", + "000000000000001c", + "000000000000001d", + "000000000000001e", + "000000000000001f", + "0000000000000020", + "0000000000000021", + "0000000000000022", + "0000000000000023", + "0000000000000024", + "0000000000000025", + "0000000000000026", + "0000000000000027", + "0000000000000028", + "0000000000000029", + "000000000000002a", + "000000000000002b", + "000000000000002c", + "000000000000002d", + "000000000000002e", + "000000000000002f", + "0000000000000030", + "0000000000000031", + "0000000000000032", + "0000000000000033", + "0000000000000034", + "0000000000000035", + "0000000000000036", + "0000000000000037", + "0000000000000038", + "0000000000000039", + "000000000000003a", + "000000000000003b", + "000000000000003c", + "000000000000003d", + "000000000000003e", + "000000000000003f", + "0000000000000040", + "0000000000000041", + "0000000000000042", + "0000000000000043", + "0000000000000044", + "0000000000000045", + "0000000000000046", + "0000000000000047", + "0000000000000048", + "0000000000000049", + "000000000000004a", + "000000000000004b", + "000000000000004c", + "000000000000004d", + "000000000000004e", + "000000000000004f", + "0000000000000050", + "0000000000000051", + "0000000000000052", + "0000000000000053", + "0000000000000054", + "0000000000000055", + "0000000000000056", + "0000000000000057", + "0000000000000058", + "0000000000000059", + "000000000000005a", + "000000000000005b", + "000000000000005c", + "000000000000005d", + "000000000000005e", + "000000000000005f", + "0000000000000060", + "0000000000000061", + "0000000000000062", + "0000000000000063", + "0000000000000064", + "0000000000000065", + "0000000000000066", + "0000000000000067", + "0000000000000068", + "0000000000000069", + "000000000000006a", + "000000000000006b", + "000000000000006c", + "000000000000006d", + "000000000000006e", + "000000000000006f", + "0000000000000070", + "0000000000000071", + "0000000000000072", + "0000000000000073", + "0000000000000074", + "0000000000000075", + "0000000000000076", + "0000000000000077" + ], + [ + "", + "0000000000000000", + "0000000000000000", + "0000000000000001", + "0000000000000001", + "0000000000000002", + "0000000000000002", + "0000000000000003", + "0000000000000003", + "0000000000000004", + "0000000000000004", + "0000000000000005", + "0000000000000005", + "0000000000000006", + "0000000000000006", + "0000000000000007", + "0000000000000007", + "0000000000000008", + "0000000000000008", + "0000000000000009", + "0000000000000009", + "000000000000000a", + "000000000000000a", + "000000000000000b", + "000000000000000b", + "000000000000000c", + "000000000000000c", + "000000000000000d", + "000000000000000d", + "000000000000000e", + "000000000000000e", + "000000000000000f", + "000000000000000f", + "0000000000000010", + "0000000000000010", + "0000000000000011", + "0000000000000011", + "0000000000000012", + "0000000000000012", + "0000000000000013", + "0000000000000013", + "0000000000000014", + "0000000000000014", + "0000000000000015", + "0000000000000015", + "0000000000000016", + "0000000000000016", + "0000000000000017", + "0000000000000017", + "0000000000000018", + "0000000000000018", + "0000000000000019", + "0000000000000019", + "000000000000001a", + "000000000000001a", + "000000000000001b", + "000000000000001b", + "000000000000001c", + "000000000000001c", + "000000000000001d", + "000000000000001d", + "000000000000001e", + "000000000000001e", + "000000000000001f", + "000000000000001f", + "0000000000000020", + "0000000000000020", + "0000000000000021", + "0000000000000021", + "0000000000000022", + "0000000000000022", + "0000000000000023", + "0000000000000023", + "0000000000000024", + "0000000000000024", + "0000000000000025", + "0000000000000025", + "0000000000000026", + "0000000000000026", + "0000000000000027", + "0000000000000027", + "0000000000000028", + "0000000000000028", + "0000000000000029", + "0000000000000029", + "000000000000002a", + "000000000000002a", + "000000000000002b", + "000000000000002b", + "000000000000002c", + "000000000000002c", + "000000000000002d", + "000000000000002d", + "000000000000002e", + "000000000000002e", + "000000000000002f", + "000000000000002f", + "0000000000000030", + "0000000000000030", + "0000000000000031", + "0000000000000031", + "0000000000000032", + "0000000000000032", + "0000000000000033", + "0000000000000033", + "0000000000000034", + "0000000000000034", + "0000000000000035", + "0000000000000035", + "0000000000000036", + "0000000000000036", + "0000000000000037", + "0000000000000037", + "0000000000000038", + "0000000000000038", + "0000000000000039", + "0000000000000039", + "000000000000003a", + "000000000000003a", + "000000000000003b" + ], + [ + "GET /api/health", + "POST /api/login", + "GET /api/user", + "POST /api/datasources/proxy", + "GET /api/annotations", + "POST /api/search", + "GET /api/dashboards/home", + "POST /api/datasources/1/query", + "GET /api/alerts", + "POST /api/user/preferences", + "GET /api/org", + "POST /api/teams", + "GET /api/folders", + "POST /api/playlists", + "GET /api/admin/stats", + "POST /api/snapshots", + "GET /api/plugins", + "POST /api/library-elements", + "GET /api/notifications", + "POST /api/correlations", + "GET /api/access-control", + "POST /api/recording-rules", + "GET /api/provisioning", + "POST /api/short-urls", + "GET /api/live/ws", + "POST /api/alertmanager", + "GET /api/ruler", + "POST /api/prometheus", + "GET /api/datasources", + "POST /api/query-history", + "GET /api/frontend-metrics", + "POST /api/licensing", + "GET /api/service-accounts", + "POST /api/reports", + "GET /api/usage", + "POST /api/migrations", + "GET /api/connections", + "POST /api/insights", + "GET /api/expressions", + "POST /api/cloudmigration", + "GET /api/featuremgmt", + "POST /api/publicdashboards", + "GET /api/saml", + "POST /api/sso-settings", + "GET /api/keycloak", + "POST /api/oauth", + "GET /api/ldap", + "POST /api/auth", + "GET /api/licensing", + "POST /api/plugins", + "GET /database/query", + "POST /cache/set", + "GET /cache/get", + "POST /queue/enqueue", + "GET /queue/dequeue", + "POST /storage/write", + "GET /storage/read", + "POST /network/send", + "GET /network/receive", + "POST /auth/validate", + "GET /config/load", + "POST /config/save", + "GET /metrics/collect", + "POST /logs/write", + "GET /logs/read", + "POST /events/publish", + "GET /events/subscribe", + "POST /scheduler/add", + "GET /scheduler/run", + "POST /backup/create", + "GET /backup/restore", + "POST /encryption/encrypt", + "GET /encryption/decrypt", + "POST /compression/compress", + "GET /compression/decompress", + "POST /validation/validate", + "GET /template/render", + "POST /notification/send", + "GET /health/check", + "POST /deployment/deploy", + "GET /monitoring/status", + "POST /security/scan", + "GET /performance/profile", + "POST /integration/sync", + "GET /webhook/trigger", + "POST /transform/process", + "GET /audit/trail", + "POST /cleanup/execute", + "GET /discovery/scan", + "POST /migration/run", + "GET /feature/toggle", + "POST /experiment/start", + "GET /analytics/track", + "POST /feedback/submit", + "GET /support/ticket", + "POST /billing/charge", + "GET /subscription/status", + "POST /upgrade/perform", + "GET /downgrade/check", + "POST /maintenance/start", + "GET /status/overview", + "POST /workflow/execute", + "GET /pipeline/status", + "POST /container/deploy", + "GET /service/health", + "POST /load/balance", + "GET /traffic/route", + "POST /scale/adjust", + "GET /resource/allocate", + "POST /optimize/performance", + "GET /debug/trace", + "POST /troubleshoot/analyze", + "GET /repair/fix", + "POST /update/apply", + "GET /version/check", + "POST /patch/install", + "GET /rollback/prepare", + "POST /commit/save", + "GET /branch/merge", + "POST /tag/create" + ], + [ + "api-gateway", + "auth-service", + "user-service", + "data-proxy", + "annotation-service", + "search-service", + "dashboard-service", + "query-service", + "alert-service", + "preference-service", + "org-service", + "team-service", + "folder-service", + "playlist-service", + "admin-service", + "snapshot-service", + "plugin-service", + "library-service", + "notification-service", + "correlation-service", + "access-control", + "recording-rules", + "provisioning", + "url-shortener", + "live-service", + "alertmanager", + "ruler-service", + "prometheus", + "datasource-service", + "query-history", + "metrics-service", + "licensing", + "service-accounts", + "reports", + "usage-stats", + "migrations", + "connections", + "insights", + "expressions", + "cloud-migration", + "feature-mgmt", + "public-dashboards", + "saml-service", + "sso-settings", + "keycloak", + "oauth-service", + "ldap-service", + "auth-proxy", + "license-check", + "plugin-loader", + "database-pool", + "cache-service", + "cache-client", + "queue-manager", + "queue-worker", + "storage-engine", + "storage-client", + "network-layer", + "network-client", + "auth-validator", + "config-loader", + "config-writer", + "metrics-collector", + "log-writer", + "log-reader", + "event-publisher", + "event-subscriber", + "task-scheduler", + "job-runner", + "backup-manager", + "restore-service", + "crypto-engine", + "decrypt-service", + "compressor", + "decompressor", + "validator", + "template-engine", + "notifier", + "health-checker", + "deployer", + "monitor", + "scanner", + "profiler", + "integrator", + "webhook-handler", + "transformer", + "auditor", + "cleaner", + "discoverer", + "migrator", + "feature-flags", + "experimenter", + "tracker", + "feedback-api", + "support-api", + "billing-api", + "subscription-api", + "upgrader", + "downgrade-check", + "maintenance-mode", + "status-api", + "workflow-engine", + "pipeline-api", + "container-mgr", + "service-mesh", + "load-balancer", + "traffic-router", + "auto-scaler", + "resource-mgr", + "optimizer", + "debugger", + "troubleshooter", + "repair-tool", + "updater", + "version-api", + "patch-mgr", + "rollback-mgr", + "git-api", + "merge-api", + "tag-api" + ], + [ + 1579270400000, 1579270401000, 1579270402000, 1579270403000, 1579270404000, 1579270405000, 1579270406000, + 1579270407000, 1579270408000, 1579270409000, 1579270410000, 1579270411000, 1579270412000, 1579270413000, + 1579270414000, 1579270415000, 1579270416000, 1579270417000, 1579270418000, 1579270419000, 1579270420000, + 1579270421000, 1579270422000, 1579270423000, 1579270424000, 1579270425000, 1579270426000, 1579270427000, + 1579270428000, 1579270429000, 1579270430000, 1579270431000, 1579270432000, 1579270433000, 1579270434000, + 1579270435000, 1579270436000, 1579270437000, 1579270438000, 1579270439000, 1579270440000, 1579270441000, + 1579270442000, 1579270443000, 1579270444000, 1579270445000, 1579270446000, 1579270447000, 1579270448000, + 1579270449000, 1579270450000, 1579270451000, 1579270452000, 1579270453000, 1579270454000, 1579270455000, + 1579270456000, 1579270457000, 1579270458000, 1579270459000, 1579270460000, 1579270461000, 1579270462000, + 1579270463000, 1579270464000, 1579270465000, 1579270466000, 1579270467000, 1579270468000, 1579270469000, + 1579270470000, 1579270471000, 1579270472000, 1579270473000, 1579270474000, 1579270475000, 1579270476000, + 1579270477000, 1579270478000, 1579270479000, 1579270480000, 1579270481000, 1579270482000, 1579270483000, + 1579270484000, 1579270485000, 1579270486000, 1579270487000, 1579270488000, 1579270489000, 1579270490000, + 1579270491000, 1579270492000, 1579270493000, 1579270494000, 1579270495000, 1579270496000, 1579270497000, + 1579270498000, 1579270499000, 1579270500000, 1579270501000, 1579270502000, 1579270503000, 1579270504000, + 1579270505000, 1579270506000, 1579270507000, 1579270508000, 1579270509000, 1579270510000, 1579270511000, + 1579270512000, 1579270513000, 1579270514000, 1579270515000, 1579270516000, 1579270517000, 1579270518000, + 1579270519000 + ], + [ + 100000, 50000, 75000, 200000, 25000, 150000, 80000, 300000, 45000, 120000, 60000, 180000, 35000, 250000, + 90000, 40000, 160000, 70000, 220000, 55000, 130000, 85000, 190000, 65000, 170000, 95000, 210000, 50000, + 140000, 75000, 185000, 42000, 165000, 88000, 205000, 58000, 145000, 72000, 195000, 48000, 155000, 82000, + 225000, 38000, 175000, 92000, 215000, 62000, 135000, 78000, 200000, 52000, 160000, 85000, 230000, 45000, + 165000, 75000, 185000, 55000, 150000, 88000, 210000, 42000, 170000, 95000, 240000, 68000, 155000, 82000, + 190000, 58000, 145000, 92000, 220000, 48000, 175000, 85000, 205000, 65000, 180000, 72000, 195000, 55000, + 160000, 98000, 225000, 62000, 140000, 78000, 200000, 48000, 165000, 85000, 215000, 58000, 150000, 88000, + 230000, 45000, 175000, 72000, 185000, 62000, 155000, 95000, 210000, 52000, 170000, 82000, 195000, 68000, + 145000, 92000, 235000, 58000, 160000, 75000, 180000, 65000 + ] + ] + } + } + ] + } + } +} diff --git a/e2e/cypress/fixtures/long-trace-response.json b/e2e/cypress/fixtures/long-trace-response.json deleted file mode 100644 index 80955535638..00000000000 --- a/e2e/cypress/fixtures/long-trace-response.json +++ /dev/null @@ -1,7592 +0,0 @@ -{ - "data": [ - { - "traceID": "3fa414edcef6ad90", - "spans": [ - { - "traceID": "3fa414edcef6ad90", - "spanID": "1b26effbab24e95a", - "operationName": "FindTraceByID", - "references": [], - "startTime": 1605873894680581, - "duration": 1820, - "tags": [ - { "key": "component", "type": "string", "value": "gRPC" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0f5c1808567e4403", - "operationName": "FindTraceByID", - "references": [], - "startTime": 1605873894680587, - "duration": 1847, - "tags": [ - { "key": "component", "type": "string", "value": "gRPC" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "59f093577238d61e", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683862, - "duration": 10204, - "tags": [], - "logs": [ - { "timestamp": 1605873894683872, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894694063, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1cc731490b1da4c5", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683858, - "duration": 10257, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "602204dc8b8fbc6d", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683201, - "duration": 11185, - "tags": [], - "logs": [ - { "timestamp": 1605873894683207, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894694385, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "586e5e4c0400de11", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683196, - "duration": 11200, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "779ac3811ce65e40", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683844, - "duration": 10983, - "tags": [ - { "key": "blockID", "type": "string", "value": "20a16df1-a312-4b1a-a2e2-33b55e9f3c8b" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894694822, - "fields": [ - { "key": "bytes", "type": "int64", "value": 315664 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "24203526fe09b1e2", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682997, - "duration": 12453, - "tags": [], - "logs": [ - { "timestamp": 1605873894683002, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894695448, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0afe9ad5f5b01be7", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682993, - "duration": 12466, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "51413d67348a4624", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682986, - "duration": 13059, - "tags": [ - { "key": "blockID", "type": "string", "value": "08b90b09-c56e-4b4a-b95f-3f0409dc9ce9" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894695963, - "fields": [ - { "key": "bytes", "type": "int64", "value": 239824 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "60007a76ffde4644", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682866, - "duration": 13279, - "tags": [], - "logs": [ - { "timestamp": 1605873894682872, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894696144, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "09d7a8c1faef5a84", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682861, - "duration": 13291, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2755efbbfb1b537b", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682846, - "duration": 14054, - "tags": [ - { "key": "blockID", "type": "string", "value": "f78b0397-d3ad-4514-9bf4-87b6ea7e920e" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894696898, - "fields": [ - { "key": "bytes", "type": "int64", "value": 218440 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "25223420e121413a", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683188, - "duration": 14278, - "tags": [ - { "key": "blockID", "type": "string", "value": "3ae22086-9266-481a-9725-c921471e4a94" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894697462, - "fields": [ - { "key": "bytes", "type": "int64", "value": 397880 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "17a3baf85848a727", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683030, - "duration": 14724, - "tags": [], - "logs": [ - { "timestamp": 1605873894683033, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894697752, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "46ebfa6c443776c4", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683027, - "duration": 14734, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "19b1afe02cf639cf", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683883, - "duration": 14279, - "tags": [], - "logs": [ - { "timestamp": 1605873894683889, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894698160, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6e5a7dd55283f907", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683879, - "duration": 14289, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5085badf0c1dc842", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683657, - "duration": 14886, - "tags": [], - "logs": [ - { "timestamp": 1605873894683663, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894698542, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "71a0e94722b662ed", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683653, - "duration": 14897, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "57e69d8f17b39563", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683388, - "duration": 15548, - "tags": [], - "logs": [ - { "timestamp": 1605873894683394, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894698936, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6fe636103f47e1fc", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683384, - "duration": 15558, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "52146a5c1b2c0030", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683284, - "duration": 15701, - "tags": [], - "logs": [ - { "timestamp": 1605873894683290, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894698984, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "160fb4c8329a2ea0", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683280, - "duration": 15712, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1e283fe0dd8cc773", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683024, - "duration": 16029, - "tags": [ - { "key": "blockID", "type": "string", "value": "9e102b4e-115a-4bda-abd6-aa6221f9e4b7" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894699050, - "fields": [ - { "key": "bytes", "type": "int64", "value": 395808 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1bae5c35dd7187ba", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683644, - "duration": 15612, - "tags": [ - { "key": "blockID", "type": "string", "value": "b2f5a951-19a0-473d-8830-e1120ab7bf25" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894699255, - "fields": [ - { "key": "bytes", "type": "int64", "value": 345992 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5af2c497b60703d9", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683842, - "duration": 15628, - "tags": [], - "logs": [ - { "timestamp": 1605873894683848, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894699469, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6a64d382dd0239a7", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683837, - "duration": 15639, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "04652166eaec115c", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683378, - "duration": 16179, - "tags": [ - { "key": "blockID", "type": "string", "value": "30903640-5e8c-4cf6-9dc8-f84e0e2541c8" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894699555, - "fields": [ - { "key": "bytes", "type": "int64", "value": 291056 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "650c7f5ec8cc53a5", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683871, - "duration": 15807, - "tags": [ - { "key": "blockID", "type": "string", "value": "19b49abb-e17a-4632-a4b9-3ce95208e3cf" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894699675, - "fields": [ - { "key": "bytes", "type": "int64", "value": 424248 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1b30323ce39314b9", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684553, - "duration": 15144, - "tags": [], - "logs": [ - { "timestamp": 1605873894684559, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894699696, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "288816ad36c9020c", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684549, - "duration": 15154, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "26e83a54365218ad", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683881, - "duration": 16602, - "tags": [], - "logs": [ - { "timestamp": 1605873894683888, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894700482, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5e6a2e62081720fd", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683878, - "duration": 16613, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "63332243ceed106c", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683893, - "duration": 16666, - "tags": [], - "logs": [ - { "timestamp": 1605873894683900, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894700557, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7dbbbda52a6d32ce", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683888, - "duration": 16678, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "195ed27075e44238", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683828, - "duration": 16766, - "tags": [ - { "key": "blockID", "type": "string", "value": "6c5d1290-2b4b-4f33-9798-63b6654e16b4" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894700591, - "fields": [ - { "key": "bytes", "type": "int64", "value": 367848 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "35e5a12a53c6088a", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682748, - "duration": 17901, - "tags": [], - "logs": [ - { "timestamp": 1605873894682751, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894700647, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "690fcd8c8dc87ae8", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683273, - "duration": 17376, - "tags": [ - { "key": "blockID", "type": "string", "value": "f1db0c64-befe-4790-af19-7b48e57a9558" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894700646, - "fields": [ - { "key": "bytes", "type": "int64", "value": 386448 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "113befce4abfecb2", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682745, - "duration": 17911, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "277870fa55872b13", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683865, - "duration": 17440, - "tags": [ - { "key": "blockID", "type": "string", "value": "f05f1d13-0250-492a-abc8-bca24ccf3a15" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894701291, - "fields": [ - { "key": "bytes", "type": "int64", "value": 211672 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "022b6c95374f166d", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683879, - "duration": 17471, - "tags": [ - { "key": "blockID", "type": "string", "value": "0cba7eaf-2546-41ac-99d7-673ef23d6e98" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894701347, - "fields": [ - { "key": "bytes", "type": "int64", "value": 406456 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6cee3530fc730d34", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684631, - "duration": 16733, - "tags": [], - "logs": [ - { "timestamp": 1605873894684639, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894701363, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "674b435291a256c4", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684627, - "duration": 16745, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1de85b574e5d906c", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683373, - "duration": 18328, - "tags": [], - "logs": [ - { "timestamp": 1605873894683380, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894701701, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4c5ac8757f9888b7", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683369, - "duration": 18338, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3e5ab83b57207c74", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683042, - "duration": 18823, - "tags": [], - "logs": [ - { "timestamp": 1605873894683045, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894701863, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7d9927e5c258d511", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682730, - "duration": 19136, - "tags": [ - { "key": "blockID", "type": "string", "value": "794e2adc-701e-4c2d-907a-66221b4455d3" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894701864, - "fields": [ - { "key": "bytes", "type": "int64", "value": 289928 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6c9178ed1e68f858", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683039, - "duration": 18834, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "445d4f3f2dc4d0ad", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684214, - "duration": 17919, - "tags": [], - "logs": [ - { "timestamp": 1605873894684221, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894702132, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "30dd998b2082f2b9", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684210, - "duration": 17958, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2ff9bbb6c991a0ea", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683877, - "duration": 18301, - "tags": [], - "logs": [ - { "timestamp": 1605873894683883, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894702177, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "310a2399bb07e8bd", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683873, - "duration": 18311, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "19021bbbe6310785", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683360, - "duration": 18978, - "tags": [ - { "key": "blockID", "type": "string", "value": "d2212e62-5b1a-41e2-ae43-c0a596125f1b" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894702335, - "fields": [ - { "key": "bytes", "type": "int64", "value": 199208 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "021f72c9979124b5", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684621, - "duration": 17816, - "tags": [ - { "key": "blockID", "type": "string", "value": "06ebaf3b-4501-4cda-91fb-c48a9d33a99c" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894702434, - "fields": [ - { "key": "bytes", "type": "int64", "value": 384696 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "68a1e78424019eb9", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683657, - "duration": 18900, - "tags": [], - "logs": [ - { "timestamp": 1605873894683663, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894702556, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "244e73561d0c691d", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683653, - "duration": 18910, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5c1d1b2d38dddcfb", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683518, - "duration": 19222, - "tags": [], - "logs": [ - { "timestamp": 1605873894683526, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894702739, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "364583eecf36b543", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683513, - "duration": 19232, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "22e42286de359dc4", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683843, - "duration": 18969, - "tags": [], - "logs": [ - { "timestamp": 1605873894683849, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894702812, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7b936283fac4d0ac", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683838, - "duration": 18981, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "660886869edd36cf", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684202, - "duration": 18627, - "tags": [ - { "key": "blockID", "type": "string", "value": "f07137b8-7a0b-4199-b1a7-6b7d5b230723" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894702824, - "fields": [ - { "key": "bytes", "type": "int64", "value": 293936 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "57ed8902af3a60b5", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683549, - "duration": 19426, - "tags": [], - "logs": [ - { "timestamp": 1605873894683554, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894702972, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "64cadcdb4f18b2f7", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683544, - "duration": 19437, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "25f434fb5960aaef", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683933, - "duration": 19303, - "tags": [], - "logs": [ - { "timestamp": 1605873894683939, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894703235, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "62afac560d435620", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683929, - "duration": 19314, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "58435ec74d79cc93", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683865, - "duration": 19469, - "tags": [ - { "key": "blockID", "type": "string", "value": "f2a53e6e-e261-4ec2-92bd-97c5a4c4b760" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894703331, - "fields": [ - { "key": "bytes", "type": "int64", "value": 390648 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "578849d0d44400b5", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684004, - "duration": 19335, - "tags": [], - "logs": [ - { "timestamp": 1605873894684012, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894703337, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1f5faebfb90378ad", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683999, - "duration": 19346, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "41f1eb48b61ef185", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683035, - "duration": 20463, - "tags": [ - { "key": "blockID", "type": "string", "value": "941a63d4-2739-4ba2-9a15-08256b5c9eae" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894703490, - "fields": [ - { "key": "bytes", "type": "int64", "value": 438128 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "71ee8c7b83046da0", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683645, - "duration": 19895, - "tags": [ - { "key": "blockID", "type": "string", "value": "151c489c-a86a-49b7-9fa9-31d1714d59ee" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894703538, - "fields": [ - { "key": "bytes", "type": "int64", "value": 325344 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1bf030a07aaceb80", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683218, - "duration": 20692, - "tags": [], - "logs": [ - { "timestamp": 1605873894683225, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894703909, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "54b34afd73af12d1", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683215, - "duration": 21011, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6a7ba0261825c53c", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683505, - "duration": 20615, - "tags": [ - { "key": "blockID", "type": "string", "value": "db0fa030-4607-40e5-998b-47029aa3430e" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894704118, - "fields": [ - { "key": "bytes", "type": "int64", "value": 411272 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2a597269b23b1bcb", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683426, - "duration": 20720, - "tags": [], - "logs": [ - { "timestamp": 1605873894683431, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894704146, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "66d886579510b6fd", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683422, - "duration": 20841, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1ef8e63340342174", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683990, - "duration": 20334, - "tags": [ - { "key": "blockID", "type": "string", "value": "a10ec85d-9fd2-403e-abcd-6f4ec49b0396" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894704322, - "fields": [ - { "key": "bytes", "type": "int64", "value": 442360 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "46c6de90778460b1", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683830, - "duration": 20675, - "tags": [ - { "key": "blockID", "type": "string", "value": "7e9e0142-15ff-461e-8e05-6c62d920603a" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894704502, - "fields": [ - { "key": "bytes", "type": "int64", "value": 465744 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "686f3e58fe28940f", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894696113, - "duration": 8480, - "tags": [], - "logs": [ - { "timestamp": 1605873894696126, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894704591, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5960c1f5750b1cde", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894696104, - "duration": 8495, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6aa5ddd42d96f825", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683921, - "duration": 20886, - "tags": [ - { "key": "blockID", "type": "string", "value": "43e5ad4f-11d6-4f25-9925-652cb801fd58" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894704804, - "fields": [ - { "key": "bytes", "type": "int64", "value": 405344 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "166377800e8e82a7", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683214, - "duration": 21686, - "tags": [], - "logs": [ - { "timestamp": 1605873894683221, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894704899, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5e84f8676ef1efad", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683209, - "duration": 21696, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "713c834576a0d9b0", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683037, - "duration": 22197, - "tags": [], - "logs": [ - { "timestamp": 1605873894683045, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894705234, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "209c0e336c71e932", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683033, - "duration": 22209, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1bd34d50efadb568", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683414, - "duration": 21894, - "tags": [ - { "key": "blockID", "type": "string", "value": "b432160f-347c-41ad-882e-f1786e4b42b1" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894705305, - "fields": [ - { "key": "bytes", "type": "int64", "value": 409104 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "58cee6c544e69e4f", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683206, - "duration": 22173, - "tags": [ - { "key": "blockID", "type": "string", "value": "b12afd19-298a-443f-97ce-b5b2e5bc9d79" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894705375, - "fields": [ - { "key": "bytes", "type": "int64", "value": 376872 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4e48e93f70e06522", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894696061, - "duration": 9466, - "tags": [ - { "key": "blockID", "type": "string", "value": "45701f45-c93a-4c35-9fed-9cce2c316a19" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894705524, - "fields": [ - { "key": "bytes", "type": "int64", "value": 453296 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2422bf6c2ed108c2", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683536, - "duration": 20571, - "tags": [ - { "key": "blockID", "type": "string", "value": "51945006-c165-40af-baea-769b3199bf46" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894704104, - "fields": [ - { "key": "bytes", "type": "int64", "value": 342200 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "42fac7c66e0ca970", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683200, - "duration": 22685, - "tags": [ - { "key": "blockID", "type": "string", "value": "8772aa40-3489-4b12-b685-9f708ae4de75" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894705882, - "fields": [ - { "key": "bytes", "type": "int64", "value": 407152 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2a86d93e70a1720c", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684627, - "duration": 21313, - "tags": [], - "logs": [ - { "timestamp": 1605873894684633, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894705939, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "72991150a8c3cf08", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684622, - "duration": 21322, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3ceac51ce73f994e", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683627, - "duration": 22375, - "tags": [], - "logs": [ - { "timestamp": 1605873894683633, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894706001, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "704707012227a4f1", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683623, - "duration": 22386, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "26cf501f6dcbb968", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683959, - "duration": 22090, - "tags": [], - "logs": [ - { "timestamp": 1605873894683965, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894706048, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7ebb1c9d8a55ac56", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683952, - "duration": 22104, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1bd01ea1e13ac6fd", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683733, - "duration": 22571, - "tags": [], - "logs": [ - { "timestamp": 1605873894683739, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894706303, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4f94f7e28081e1af", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683728, - "duration": 22582, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "60fd2b3931676856", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684310, - "duration": 22119, - "tags": [], - "logs": [ - { "timestamp": 1605873894684317, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894706428, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "432bc11447588912", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684305, - "duration": 22131, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1e1aa88072a7cefc", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683026, - "duration": 23483, - "tags": [ - { "key": "blockID", "type": "string", "value": "9064347a-7c49-48d8-b348-8d734f7fd542" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894706506, - "fields": [ - { "key": "bytes", "type": "int64", "value": 365672 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1fb49823a6f803bf", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682930, - "duration": 23695, - "tags": [], - "logs": [ - { "timestamp": 1605873894682935, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894706622, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7db786f0da6d756d", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682926, - "duration": 23705, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "01cb21bacc3933da", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894697497, - "duration": 9150, - "tags": [], - "logs": [ - { "timestamp": 1605873894697507, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894706646, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "260399c49430577a", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894697488, - "duration": 9166, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5ba9d86263fc6da1", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684614, - "duration": 22250, - "tags": [ - { "key": "blockID", "type": "string", "value": "ca346cf4-8162-49e5-a0d0-0619d3813794" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894706862, - "fields": [ - { "key": "bytes", "type": "int64", "value": 416472 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "77f27a840cd8b75b", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894685061, - "duration": 21838, - "tags": [], - "logs": [ - { "timestamp": 1605873894685068, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894706897, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4a48a86f95e117f9", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894685057, - "duration": 21850, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7d1f782957acfe32", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682777, - "duration": 24168, - "tags": [], - "logs": [ - { "timestamp": 1605873894682783, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894706944, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "77f8165c15176536", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682773, - "duration": 24206, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7f20dbc684de78c8", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683615, - "duration": 23703, - "tags": [ - { "key": "blockID", "type": "string", "value": "f518974f-2e1e-41c8-b70c-cd2088f5a081" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894707316, - "fields": [ - { "key": "bytes", "type": "int64", "value": 278728 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "70a453eeff8ec687", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684828, - "duration": 22510, - "tags": [], - "logs": [ - { "timestamp": 1605873894684835, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894707337, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0c7d975a67c6d7bc", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684823, - "duration": 22520, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7ccb153793c6afd9", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683720, - "duration": 23911, - "tags": [ - { "key": "blockID", "type": "string", "value": "6f72b73b-c5fe-4761-b91f-b92f447441fa" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894707629, - "fields": [ - { "key": "bytes", "type": "int64", "value": 451984 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5bf10b9afef405a9", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894697476, - "duration": 10175, - "tags": [ - { "key": "blockID", "type": "string", "value": "61e0a11e-5e88-49c4-ad1d-81636670e642" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894707648, - "fields": [ - { "key": "bytes", "type": "int64", "value": 296328 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1aae38562e2b6a1f", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683945, - "duration": 23883, - "tags": [ - { "key": "blockID", "type": "string", "value": "7dda9580-666b-42f9-b8a1-1680a0de352f" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894707823, - "fields": [ - { "key": "bytes", "type": "int64", "value": 402936 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1dc5a0697b5d6161", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682764, - "duration": 25091, - "tags": [ - { "key": "blockID", "type": "string", "value": "bf101e70-4a86-4d88-890c-e976330ba857" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894707853, - "fields": [ - { "key": "bytes", "type": "int64", "value": 385288 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3df0c4e2de834172", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684425, - "duration": 23557, - "tags": [], - "logs": [ - { "timestamp": 1605873894684432, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894707980, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "50f5d53109a047da", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684421, - "duration": 23568, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "64e62db2206bdda3", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682595, - "duration": 25553, - "tags": [], - "logs": [ - { "timestamp": 1605873894682603, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894708147, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "40f0742ab8be92ab", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682589, - "duration": 25564, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6b89efb6b9fb16fc", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684815, - "duration": 23341, - "tags": [ - { "key": "blockID", "type": "string", "value": "84b0a7ea-895d-49f9-892c-11f689f0c13f" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894708154, - "fields": [ - { "key": "bytes", "type": "int64", "value": 424816 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "33c05fda4c7d3921", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684414, - "duration": 23815, - "tags": [], - "logs": [ - { "timestamp": 1605873894684420, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894708228, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "742995638b3636e6", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684409, - "duration": 23825, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1cf9294062a5780b", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682920, - "duration": 25427, - "tags": [ - { "key": "blockID", "type": "string", "value": "e43ee3db-63c9-4d2b-a791-99a5a9203e4e" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894708341, - "fields": [ - { "key": "bytes", "type": "int64", "value": 396312 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6852631d2c6d1586", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683843, - "duration": 24695, - "tags": [], - "logs": [ - { "timestamp": 1605873894683850, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894708538, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1691ee4e1f907b39", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683839, - "duration": 24706, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1bcd55e85df0601a", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684400, - "duration": 24493, - "tags": [ - { "key": "blockID", "type": "string", "value": "211313f2-7284-43eb-b9dc-134b5b344524" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894708891, - "fields": [ - { "key": "bytes", "type": "int64", "value": 249032 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7757c670662153b5", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682578, - "duration": 26605, - "tags": [ - { "key": "blockID", "type": "string", "value": "99a8b127-bef6-4718-997b-18e5cb6bee81" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894709180, - "fields": [ - { "key": "bytes", "type": "int64", "value": 443904 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "033e809d9deb02fb", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683129, - "duration": 26149, - "tags": [], - "logs": [ - { "timestamp": 1605873894683139, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894709277, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0701e7633d141024", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683124, - "duration": 26160, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5a1fcbfa2c2e077e", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682990, - "duration": 26296, - "tags": [], - "logs": [ - { "timestamp": 1605873894682993, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894709285, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2639318a16168a94", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682987, - "duration": 26304, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "573267e2aab9eb37", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683831, - "duration": 25627, - "tags": [ - { "key": "blockID", "type": "string", "value": "9a5df823-d980-4671-b33f-ef92e485232f" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894709455, - "fields": [ - { "key": "bytes", "type": "int64", "value": 357872 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3705123c90491605", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683886, - "duration": 25575, - "tags": [], - "logs": [ - { "timestamp": 1605873894683890, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894709460, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "46138581a74be710", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683883, - "duration": 25585, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "369cd4694f877602", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684325, - "duration": 25173, - "tags": [], - "logs": [ - { "timestamp": 1605873894684385, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894709498, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7aab906468c79c5b", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894703359, - "duration": 6145, - "tags": [], - "logs": [ - { "timestamp": 1605873894703375, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894709503, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "57f0ffddbcc40049", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684321, - "duration": 25185, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0c27a77ad2f6bbb3", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894703354, - "duration": 6155, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "27f360a42e423410", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894696933, - "duration": 12666, - "tags": [], - "logs": [ - { "timestamp": 1605873894696942, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894709598, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7e5086a8bb3eb3b3", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894696926, - "duration": 12678, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "42f4a2e45bc6b552", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683602, - "duration": 26169, - "tags": [], - "logs": [ - { "timestamp": 1605873894683608, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894709771, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "693c3e7a4e085ce6", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683598, - "duration": 26180, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7645427b1d8ca012", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894694874, - "duration": 15023, - "tags": [], - "logs": [ - { "timestamp": 1605873894694896, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894709897, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2e6e130f1e7bf5ca", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894694866, - "duration": 15038, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2155087a44565c8a", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894700685, - "duration": 9446, - "tags": [], - "logs": [ - { "timestamp": 1605873894700698, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894710131, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "66ed873b2793ee77", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894700678, - "duration": 9459, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "69654d80ac69ec92", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894702020, - "duration": 8202, - "tags": [], - "logs": [ - { "timestamp": 1605873894702031, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894710221, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3a0447242878ba00", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894701338, - "duration": 8890, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2e73b563bfa4df76", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683106, - "duration": 27358, - "tags": [ - { "key": "blockID", "type": "string", "value": "b89a056f-d8cd-41e9-84ad-445e68d0a0d5" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894710462, - "fields": [ - { "key": "bytes", "type": "int64", "value": 337664 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2e958ff5d95860cf", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683591, - "duration": 27357, - "tags": [ - { "key": "blockID", "type": "string", "value": "4767ecb2-01d3-450b-b005-6b9219fdfd71" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894710945, - "fields": [ - { "key": "bytes", "type": "int64", "value": 421576 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4854f2803a2439d0", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684313, - "duration": 26669, - "tags": [ - { "key": "blockID", "type": "string", "value": "ec9c982f-485f-47b2-be74-a7f203368ede" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894710972, - "fields": [ - { "key": "bytes", "type": "int64", "value": 409016 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "62aa1124fbaafe29", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684107, - "duration": 26934, - "tags": [], - "logs": [ - { "timestamp": 1605873894684113, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894711040, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "67ee705c301e7e2a", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684102, - "duration": 26945, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "417798c3fbab4244", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894696911, - "duration": 14252, - "tags": [ - { "key": "blockID", "type": "string", "value": "6a346739-04b1-4e86-8f87-e182b01cf5cd" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894711160, - "fields": [ - { "key": "bytes", "type": "int64", "value": 407144 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "17faaf92fbea2ed9", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683730, - "duration": 27707, - "tags": [], - "logs": [ - { "timestamp": 1605873894683736, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894711435, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "29d4e2aa59eae59e", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683726, - "duration": 27719, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3b9a85f6cd6075b8", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894701327, - "duration": 10230, - "tags": [ - { "key": "blockID", "type": "string", "value": "ece056d3-aa27-464b-81a8-643b3ae208e4" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894711554, - "fields": [ - { "key": "bytes", "type": "int64", "value": 359960 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0da2897c85659567", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683377, - "duration": 28594, - "tags": [], - "logs": [ - { "timestamp": 1605873894683384, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894711971, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4407d391acba81fc", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683373, - "duration": 28605, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1987773829521f8f", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894699105, - "duration": 12885, - "tags": [], - "logs": [ - { "timestamp": 1605873894699119, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894711989, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1c9553a6471269c6", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894699099, - "duration": 12896, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3dedf220c1f51d38", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894704853, - "duration": 7356, - "tags": [], - "logs": [ - { "timestamp": 1605873894704879, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894712209, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "25820f0eebf05ab3", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894704846, - "duration": 7370, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7027388faf7e1bf1", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684937, - "duration": 27418, - "tags": [], - "logs": [ - { "timestamp": 1605873894684943, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894712354, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "44c6d6c7e1afb67d", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684933, - "duration": 27429, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3f654e75b41629f5", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683718, - "duration": 28677, - "tags": [ - { "key": "blockID", "type": "string", "value": "0e5b1fbb-ab10-44b7-89a0-f8932ee26dcf" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894712392, - "fields": [ - { "key": "bytes", "type": "int64", "value": 369000 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4fa1d1a031112ab0", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682996, - "duration": 29565, - "tags": [], - "logs": [ - { "timestamp": 1605873894683006, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894712560, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2e0985a0b4168ff2", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682988, - "duration": 29577, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7a7bf32e81f4317e", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682984, - "duration": 29753, - "tags": [ - { "key": "blockID", "type": "string", "value": "c56f4809-bc48-4f81-9656-a3bbb96ba87e" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894712734, - "fields": [ - { "key": "bytes", "type": "int64", "value": 406296 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "66d4f363dfa46bdb", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684041, - "duration": 28730, - "tags": [], - "logs": [ - { "timestamp": 1605873894684111, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894712771, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "616b800031f78e5f", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684037, - "duration": 28741, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5b0d3da4dac0a4ab", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683364, - "duration": 29595, - "tags": [ - { "key": "blockID", "type": "string", "value": "10e42379-1c35-419e-a26c-2630b9d2cdd2" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894712956, - "fields": [ - { "key": "bytes", "type": "int64", "value": 354744 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1571e420dca57b9f", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683878, - "duration": 29122, - "tags": [ - { "key": "blockID", "type": "string", "value": "adb287c7-69e4-4ed8-8604-c3302c766db2" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894712996, - "fields": [ - { "key": "bytes", "type": "int64", "value": 300104 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3120fb610c52c9a6", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684415, - "duration": 28590, - "tags": [ - { "key": "blockID", "type": "string", "value": "faebcb3d-444a-4675-8e55-2f46dbcaa1d7" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894713002, - "fields": [ - { "key": "bytes", "type": "int64", "value": 410672 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "46feff0edeabb674", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683135, - "duration": 29700, - "tags": [], - "logs": [ - { "timestamp": 1605873894683141, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894712834, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "32df737f09cd2bf9", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683131, - "duration": 29904, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "604de25c9811a395", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894699064, - "duration": 14141, - "tags": [ - { "key": "blockID", "type": "string", "value": "7df8ef23-0902-4b4b-92aa-b6c1aeb3c9c2" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894713203, - "fields": [ - { "key": "bytes", "type": "int64", "value": 436328 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7867c14538ff0c61", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684923, - "duration": 28333, - "tags": [ - { "key": "blockID", "type": "string", "value": "a94e5162-7e01-4bd6-b5c8-1bc3b50c67c6" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894713253, - "fields": [ - { "key": "bytes", "type": "int64", "value": 433064 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "04e793f4b075b20f", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684557, - "duration": 28822, - "tags": [], - "logs": [ - { "timestamp": 1605873894684565, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894713378, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3084a10a11a62355", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684553, - "duration": 28832, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0a0b86e5738d630b", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894685048, - "duration": 28355, - "tags": [ - { "key": "blockID", "type": "string", "value": "36ce4c95-0cb6-4803-bdfd-b316b3c0cc4c" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894713400, - "fields": [ - { "key": "bytes", "type": "int64", "value": 293136 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "62ea00c2c871a91e", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894704821, - "duration": 8702, - "tags": [ - { "key": "blockID", "type": "string", "value": "b9c0dc2b-ee12-4876-a517-2902c6fe655e" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894713521, - "fields": [ - { "key": "bytes", "type": "int64", "value": 415912 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0f54c2d4ac7df141", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683769, - "duration": 29774, - "tags": [], - "logs": [ - { "timestamp": 1605873894683775, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894713542, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5e650633f1c4cb45", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683764, - "duration": 29784, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4cff4ebd296d36f0", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684028, - "duration": 29524, - "tags": [ - { "key": "blockID", "type": "string", "value": "e6200492-f24a-40ef-946a-e89170d1ac54" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894713549, - "fields": [ - { "key": "bytes", "type": "int64", "value": 447592 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0da82a874696fec5", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684230, - "duration": 29351, - "tags": [], - "logs": [ - { "timestamp": 1605873894684236, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894713581, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "20334815e0eb1b97", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684226, - "duration": 29362, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "20de4a897b30c066", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683315, - "duration": 30412, - "tags": [], - "logs": [ - { "timestamp": 1605873894683323, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894713726, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6edcc31aa4c96617", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683309, - "duration": 30424, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3594272577366bc9", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684491, - "duration": 29257, - "tags": [], - "logs": [ - { "timestamp": 1605873894684498, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894713747, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "01e9f897c4145c38", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684485, - "duration": 29270, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "53e0bef2bbb77bea", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684901, - "duration": 28911, - "tags": [], - "logs": [ - { "timestamp": 1605873894684908, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894713812, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3df7804d8e682193", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684897, - "duration": 28919, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5664530667612f1f", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682860, - "duration": 31015, - "tags": [], - "logs": [ - { "timestamp": 1605873894682871, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894713875, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4b6340b15001f8c8", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682855, - "duration": 31026, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6b3d3f0643735e5f", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894694842, - "duration": 19190, - "tags": [ - { "key": "blockID", "type": "string", "value": "f0b87e56-00a6-4270-8ce0-b47affb9113e" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894714027, - "fields": [ - { "key": "bytes", "type": "int64", "value": 310320 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4a4b3e0d2f115bcf", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683987, - "duration": 30363, - "tags": [], - "logs": [ - { "timestamp": 1605873894683994, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894714350, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1e0da3179b38449d", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683983, - "duration": 30374, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "318fcd8e3bfc42c7", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684209, - "duration": 30152, - "tags": [], - "logs": [ - { "timestamp": 1605873894684215, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894714360, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "37e82ddc44e6bf60", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684205, - "duration": 30162, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0271272ae09aac5f", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684542, - "duration": 29977, - "tags": [ - { "key": "blockID", "type": "string", "value": "bfbb9652-84f8-4145-8091-8197ea922ad3" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894714514, - "fields": [ - { "key": "bytes", "type": "int64", "value": 432848 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2d80feb23cbbb7cd", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684508, - "duration": 30161, - "tags": [], - "logs": [ - { "timestamp": 1605873894684515, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894714668, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "01ad9e5d3837c5b6", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684503, - "duration": 30172, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "42698e68a26de8cf", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683756, - "duration": 30942, - "tags": [ - { "key": "blockID", "type": "string", "value": "55f71d63-05b0-4c3a-b79f-a2563307bf40" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894714695, - "fields": [ - { "key": "bytes", "type": "int64", "value": 402624 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6ea302c343fec88f", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683645, - "duration": 31247, - "tags": [], - "logs": [ - { "timestamp": 1605873894683652, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894714891, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "279e17d93d4978da", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683641, - "duration": 31258, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "59b29ac1ab225873", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683001, - "duration": 31930, - "tags": [], - "logs": [ - { "timestamp": 1605873894683006, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894714930, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4196b1f250632b3e", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682998, - "duration": 31938, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "224b550ee6ad2bf2", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684889, - "duration": 30088, - "tags": [ - { "key": "blockID", "type": "string", "value": "07baec6a-187a-493b-b160-772936b5a3f0" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894714974, - "fields": [ - { "key": "bytes", "type": "int64", "value": 429360 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "368bcd97b5e9dde0", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684678, - "duration": 30934, - "tags": [], - "logs": [ - { "timestamp": 1605873894684685, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894715611, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3d88bddf112b8ae2", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684672, - "duration": 30946, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "718a103bd19501b2", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684196, - "duration": 31424, - "tags": [ - { "key": "blockID", "type": "string", "value": "a85669d8-148b-4d61-a359-8f97c036b880" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894715617, - "fields": [ - { "key": "bytes", "type": "int64", "value": 401280 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2b56997697dd91c0", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684472, - "duration": 31151, - "tags": [ - { "key": "blockID", "type": "string", "value": "75911f2c-fc5e-4ef1-bcff-9abad2120f23" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894715621, - "fields": [ - { "key": "bytes", "type": "int64", "value": 397808 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1c049cad7edf280e", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683630, - "duration": 32119, - "tags": [ - { "key": "blockID", "type": "string", "value": "fdcc5380-c15f-41c2-9a34-623d6cdd2d5a" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894715733, - "fields": [ - { "key": "bytes", "type": "int64", "value": 397464 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6e3d16e8ed14d90c", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894702877, - "duration": 12975, - "tags": [], - "logs": [ - { "timestamp": 1605873894702894, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894715852, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7bd595782cdb70c3", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894699700, - "duration": 16154, - "tags": [], - "logs": [ - { "timestamp": 1605873894699708, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894715853, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "08a9d074d520a512", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894702864, - "duration": 12993, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "083316368540b811", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894699695, - "duration": 16164, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7f067cadc2b4569d", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684535, - "duration": 31520, - "tags": [], - "logs": [ - { "timestamp": 1605873894684540, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894716053, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5061bd596bc8a7e7", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684531, - "duration": 31530, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4b9772650994e725", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682990, - "duration": 33209, - "tags": [ - { "key": "blockID", "type": "string", "value": "61022db6-4401-40b6-a3a2-1f4cd5ccb430" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894716196, - "fields": [ - { "key": "bytes", "type": "int64", "value": 380504 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0e9c6b89215308ba", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683975, - "duration": 32340, - "tags": [ - { "key": "blockID", "type": "string", "value": "f17c848f-2f99-4215-a5e9-1f55d8e15c1e" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894716311, - "fields": [ - { "key": "bytes", "type": "int64", "value": 447736 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "030573bc0520e3c2", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683061, - "duration": 33348, - "tags": [], - "logs": [ - { "timestamp": 1605873894683067, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894716409, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0d2e16a8cf201e5a", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683057, - "duration": 33357, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0361f359be22f9c8", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894702474, - "duration": 14135, - "tags": [], - "logs": [ - { "timestamp": 1605873894702483, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894716607, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5310c5c355550cad", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894702463, - "duration": 14156, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "16870d24920c25b8", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894699686, - "duration": 17072, - "tags": [ - { "key": "blockID", "type": "string", "value": "320a9ecd-a9fd-4c88-8aeb-e8a312dcce0c" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894716753, - "fields": [ - { "key": "bytes", "type": "int64", "value": 424544 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "62090e9e1c22bb56", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894707676, - "duration": 9095, - "tags": [], - "logs": [ - { "timestamp": 1605873894707691, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894716771, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "02d91deb1ff0ea76", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894707670, - "duration": 9107, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0cc47cc1eb5deb29", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894702844, - "duration": 13991, - "tags": [ - { "key": "blockID", "type": "string", "value": "04e21143-53ef-4083-948e-3bbe502c2d44" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894716832, - "fields": [ - { "key": "bytes", "type": "int64", "value": 401728 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1b27a749f4d1b557", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684297, - "duration": 32550, - "tags": [ - { "key": "blockID", "type": "string", "value": "d1ffbf86-0e11-4b6e-b9ae-8466e7c42a90" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894716844, - "fields": [ - { "key": "bytes", "type": "int64", "value": 193992 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3c5f2282a3e7c658", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683345, - "duration": 33584, - "tags": [], - "logs": [ - { "timestamp": 1605873894683352, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894716927, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6fc62f7a1ae1a6e9", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683340, - "duration": 33596, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "524a9c941765266a", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684584, - "duration": 32449, - "tags": [], - "logs": [ - { "timestamp": 1605873894684592, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894717030, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5bcaa6a4a1c06160", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684579, - "duration": 32460, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2d4e045a72c17ff2", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684465, - "duration": 32666, - "tags": [ - { "key": "blockID", "type": "string", "value": "4c9f58b7-b944-4692-9d5b-14270bd1b8d6" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894717127, - "fields": [ - { "key": "bytes", "type": "int64", "value": 436224 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "25548a46750dfecb", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684652, - "duration": 32684, - "tags": [ - { "key": "blockID", "type": "string", "value": "ffd8fb66-db97-4451-9a97-bfb6631b82a5" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894717332, - "fields": [ - { "key": "bytes", "type": "int64", "value": 434536 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5f4913a50dcd37c8", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683050, - "duration": 34487, - "tags": [ - { "key": "blockID", "type": "string", "value": "0255db6b-061e-4ceb-9ae9-598588995be8" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894717533, - "fields": [ - { "key": "bytes", "type": "int64", "value": 392520 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6750f7ac4a5b50e8", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684648, - "duration": 32974, - "tags": [], - "logs": [ - { "timestamp": 1605873894684654, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894717621, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "41f4b72bd0a14291", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684644, - "duration": 32984, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "03fac2f4c91b31b6", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894702448, - "duration": 15285, - "tags": [ - { "key": "blockID", "type": "string", "value": "f7da9248-f02e-44df-b243-c1f5f69e0f67" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894717730, - "fields": [ - { "key": "bytes", "type": "int64", "value": 366872 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4934a16eeec96b0d", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684005, - "duration": 33827, - "tags": [], - "logs": [ - { "timestamp": 1605873894684010, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894717831, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0ebf8034f9944320", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684001, - "duration": 33836, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0cc1f6dfcc153616", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683672, - "duration": 34388, - "tags": [], - "logs": [ - { "timestamp": 1605873894683679, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894718059, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "501e4211325ef503", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683667, - "duration": 34399, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7bcf0390730028ef", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683332, - "duration": 34943, - "tags": [ - { "key": "blockID", "type": "string", "value": "cbeb7cd1-c8b1-4290-be74-4caf7b3f2d69" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894718272, - "fields": [ - { "key": "bytes", "type": "int64", "value": 432424 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1b30f12cd1728ebf", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683995, - "duration": 34418, - "tags": [ - { "key": "blockID", "type": "string", "value": "2dd90b29-ffb5-4a27-bcd7-0950ca151c14" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894718411, - "fields": [ - { "key": "bytes", "type": "int64", "value": 210280 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "22a3f914c23d3456", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684570, - "duration": 34106, - "tags": [ - { "key": "blockID", "type": "string", "value": "4fca87b1-ceb1-4290-a3cb-c0a970a7c5a6" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894718671, - "fields": [ - { "key": "bytes", "type": "int64", "value": 422528 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "169359b95c501fae", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683035, - "duration": 35830, - "tags": [], - "logs": [ - { "timestamp": 1605873894683041, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894718864, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "71541fab4a38308f", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683031, - "duration": 35841, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3a7fc15a2fb60753", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894707659, - "duration": 11315, - "tags": [ - { "key": "blockID", "type": "string", "value": "57b3be9d-2234-4b8b-a380-424f30717e5b" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894718970, - "fields": [ - { "key": "bytes", "type": "int64", "value": 437088 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "10e57e001b6c6127", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683210, - "duration": 35772, - "tags": [], - "logs": [ - { "timestamp": 1605873894683220, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894718980, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2c3fb8ad983d67fc", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683206, - "duration": 35784, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3fca8d21c0827061", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684366, - "duration": 34674, - "tags": [], - "logs": [ - { "timestamp": 1605873894684372, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894719039, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "25a226515c2f9150", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684362, - "duration": 34687, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5fb9111ac6a5d18d", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683274, - "duration": 35965, - "tags": [], - "logs": [ - { "timestamp": 1605873894683286, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894719238, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6945097dfeae216a", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683268, - "duration": 35979, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6dd256468dea419f", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684628, - "duration": 34986, - "tags": [ - { "key": "blockID", "type": "string", "value": "0a5b8e26-05d5-4df2-97c1-a57ccb631b5e" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894719610, - "fields": [ - { "key": "bytes", "type": "int64", "value": 368392 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "22c3bb99916b1cf9", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684954, - "duration": 34724, - "tags": [], - "logs": [ - { "timestamp": 1605873894684961, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894719678, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7786d37aacb34302", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684949, - "duration": 34735, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0b4489a19011e658", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894702395, - "duration": 17621, - "tags": [], - "logs": [ - { "timestamp": 1605873894702404, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894720015, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5fe309dbb10a8aa0", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894702385, - "duration": 17639, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "28a88c33b44009c0", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684502, - "duration": 35545, - "tags": [], - "logs": [ - { "timestamp": 1605873894684508, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894720047, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6d20c9fb0d7d023a", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683045, - "duration": 37003, - "tags": [], - "logs": [ - { "timestamp": 1605873894683057, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894720047, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7aed634e79451eff", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684353, - "duration": 35695, - "tags": [ - { "key": "blockID", "type": "string", "value": "c4b4a484-2704-49e8-926b-e7bb7a13c520" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894720046, - "fields": [ - { "key": "bytes", "type": "int64", "value": 394640 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2361a627270177b2", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684498, - "duration": 35556, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6365c636dea9cf69", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683040, - "duration": 37014, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7fd1af0b8e4b13e5", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894704467, - "duration": 15587, - "tags": [], - "logs": [ - { "timestamp": 1605873894704477, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894720054, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4d0b05c2fe988374", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894704458, - "duration": 15600, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "45d91fa92cb81841", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683191, - "duration": 36908, - "tags": [ - { "key": "blockID", "type": "string", "value": "abec5c1e-02b5-4165-8b3d-2940d3adb991" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894720066, - "fields": [ - { "key": "bytes", "type": "int64", "value": 352392 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4287af315802d4cd", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894704355, - "duration": 15863, - "tags": [], - "logs": [ - { "timestamp": 1605873894704369, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894720218, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "62b352c305041dcc", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894704348, - "duration": 15876, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6ec165f264482f57", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683346, - "duration": 37139, - "tags": [], - "logs": [ - { "timestamp": 1605873894683351, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894720484, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7400527184eeef19", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683342, - "duration": 37152, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": ["invalid parent span IDs=4ff7c150586c7e6f; skipping clock skew adjustment"] - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1561e391ecd756d5", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684939, - "duration": 35696, - "tags": [ - { "key": "blockID", "type": "string", "value": "7dbea947-c624-454c-a99a-b2aa0c96c19f" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894720631, - "fields": [ - { "key": "bytes", "type": "int64", "value": 328592 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "57f916fcf19f117f", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682643, - "duration": 38011, - "tags": [], - "logs": [ - { "timestamp": 1605873894682653, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894720650, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1d4458304925bc0f", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682638, - "duration": 38028, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": ["invalid parent span IDs=3ff0fd3a1cdb9b5e; skipping clock skew adjustment"] - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6f251bfe2c45ae12", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894709481, - "duration": 11241, - "tags": [], - "logs": [ - { "timestamp": 1605873894709489, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894720722, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5365877f5f1070a3", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894709476, - "duration": 11253, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": ["invalid parent span IDs=5d1a0e533881c649; skipping clock skew adjustment"] - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5472390246aac5c4", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683265, - "duration": 37540, - "tags": [ - { "key": "blockID", "type": "string", "value": "31cd1597-b435-467c-8726-9fd43cb8f75a" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894720802, - "fields": [ - { "key": "bytes", "type": "int64", "value": 263520 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "38b14977915ca22c", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683471, - "duration": 37385, - "tags": [], - "logs": [ - { "timestamp": 1605873894683477, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894720855, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "08ecb88049158355", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683466, - "duration": 37394, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": ["invalid parent span IDs=241c721a4337e64b; skipping clock skew adjustment"] - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4cb042697154defa", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684490, - "duration": 36497, - "tags": [ - { "key": "blockID", "type": "string", "value": "37430ec1-eb84-4ad4-9bea-64b05bc05f0b" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894720984, - "fields": [ - { "key": "bytes", "type": "int64", "value": 329440 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "01afdbfe975f8d6d", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894704258, - "duration": 16738, - "tags": [ - { "key": "blockID", "type": "string", "value": "52136585-3c3c-418c-85bb-079c46f30ee8" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894720994, - "fields": [ - { "key": "bytes", "type": "int64", "value": 271408 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1c881037e38b18ad", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894704334, - "duration": 16710, - "tags": [ - { "key": "blockID", "type": "string", "value": "293f4ca9-60cf-4dce-84f9-90d7a8903467" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894721042, - "fields": [ - { "key": "bytes", "type": "int64", "value": 448208 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "727cf2a7b14f8891", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683209, - "duration": 37913, - "tags": [], - "logs": [ - { "timestamp": 1605873894683217, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894721121, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "72a3d0dd535ed714", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683196, - "duration": 37928, - "tags": [], - "logs": [ - { "timestamp": 1605873894683202, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894721124, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6e28aae41ed950a0", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683204, - "duration": 37923, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1034cca4b87566b9", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683192, - "duration": 37937, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5477c4334a555c1a", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894702369, - "duration": 18817, - "tags": [ - { "key": "blockID", "type": "string", "value": "65c35f00-7bf4-4d7c-884e-57e1f4f386f1" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894721184, - "fields": [ - { "key": "bytes", "type": "int64", "value": 343160 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "156254fce90fef6d", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683261, - "duration": 38071, - "tags": [ - { "key": "blockID", "type": "string", "value": "5f6da848-1f43-4327-b791-c8607c834469" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894721329, - "fields": [ - { "key": "bytes", "type": "int64", "value": 425008 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "18174ee576735b69", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683380, - "duration": 38087, - "tags": [], - "logs": [ - { "timestamp": 1605873894683386, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894721466, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3c984a418432da06", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683376, - "duration": 38097, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2cb4a90ec9e7ed56", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684207, - "duration": 37304, - "tags": [ - { "key": "blockID", "type": "string", "value": "da15aeab-47f3-4150-a3a0-0b899f5728e0" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894721505, - "fields": [ - { "key": "bytes", "type": "int64", "value": 435448 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "31a678641a0daa14", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683185, - "duration": 38722, - "tags": [ - { "key": "blockID", "type": "string", "value": "7f859498-9292-4be9-9902-9cc0cc94db7f" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894721902, - "fields": [ - { "key": "bytes", "type": "int64", "value": 382184 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "27ca437dde2b9612", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683192, - "duration": 38914, - "tags": [ - { "key": "blockID", "type": "string", "value": "723cdf42-e4bc-48dc-bda5-6173eb15dee4" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894722104, - "fields": [ - { "key": "bytes", "type": "int64", "value": 374272 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "777ba94dbf7e2679", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894703342, - "duration": 18950, - "tags": [ - { "key": "blockID", "type": "string", "value": "9ffb7568-b253-46bf-ae30-275a5370abdd" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894722288, - "fields": [ - { "key": "bytes", "type": "int64", "value": 296800 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "447a1de4607678e0", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894716862, - "duration": 5567, - "tags": [], - "logs": [ - { "timestamp": 1605873894716881, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894722428, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4a1cb35fb165238f", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894716854, - "duration": 5582, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "263d88ba7760646a", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894707662, - "duration": 14938, - "tags": [], - "logs": [ - { "timestamp": 1605873894707677, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894722599, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7cb0a9332c646221", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894707654, - "duration": 14951, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "178dbf7349f30deb", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682835, - "duration": 39846, - "tags": [ - { "key": "blockID", "type": "string", "value": "ae4b5b30-d87d-459f-8bfe-d05f4f169ced" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894722679, - "fields": [ - { "key": "bytes", "type": "int64", "value": 384344 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "150994409f1cb25a", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894700618, - "duration": 22118, - "tags": [], - "logs": [ - { "timestamp": 1605873894700633, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894722736, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "585e5d65d550b215", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894700613, - "duration": 22129, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "27511615066e34db", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684102, - "duration": 38879, - "tags": [], - "logs": [ - { "timestamp": 1605873894684108, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894722980, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "79b947d9ed7866a6", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684097, - "duration": 38891, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6f2e6507fe12975c", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894717161, - "duration": 5887, - "tags": [], - "logs": [ - { "timestamp": 1605873894717174, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894723047, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "00cdeb6a7479c53f", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894717155, - "duration": 5899, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "24bddd4ea3487e35", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683371, - "duration": 39804, - "tags": [ - { "key": "blockID", "type": "string", "value": "d7601ebc-c33c-492c-a1da-4aa053533084" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894723171, - "fields": [ - { "key": "bytes", "type": "int64", "value": 365144 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "53d7bccf2fc103c5", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894716842, - "duration": 6390, - "tags": [ - { "key": "blockID", "type": "string", "value": "ca64f28a-77dc-4745-abdc-44054c1e5e40" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894723228, - "fields": [ - { "key": "bytes", "type": "int64", "value": 289352 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "552db884462abcc8", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683762, - "duration": 39518, - "tags": [], - "logs": [ - { "timestamp": 1605873894683768, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894723279, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "66bfd77009ceabee", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683756, - "duration": 39531, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "39ecc86ead7ef908", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684607, - "duration": 38759, - "tags": [], - "logs": [ - { "timestamp": 1605873894684613, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894723365, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "23e63f9ee6638cc5", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684602, - "duration": 38769, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3995f8a937161d18", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894685603, - "duration": 37861, - "tags": [], - "logs": [ - { "timestamp": 1605873894685611, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894723463, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7d8cbf547f13bab8", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894685598, - "duration": 37871, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "50ea9bcb501f096f", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894707639, - "duration": 15983, - "tags": [ - { "key": "blockID", "type": "string", "value": "7ba16a23-7c29-4c4e-a0a6-f5a35697f61e" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894723607, - "fields": [ - { "key": "bytes", "type": "int64", "value": 283976 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "36174ad72177e7e0", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683065, - "duration": 40713, - "tags": [], - "logs": [ - { "timestamp": 1605873894683103, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894723777, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6eb33f7265438984", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683062, - "duration": 40722, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0d173415b42b54df", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684351, - "duration": 39618, - "tags": [], - "logs": [ - { "timestamp": 1605873894684357, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894723968, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0353b10977450cf7", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684346, - "duration": 39628, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7b094f4ebdce31c3", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894717141, - "duration": 6985, - "tags": [ - { "key": "blockID", "type": "string", "value": "f1a4a13f-5e5d-484e-8b53-1f4f8e1bad37" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894724124, - "fields": [ - { "key": "bytes", "type": "int64", "value": 448472 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4bf98f62683b0e8e", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894700602, - "duration": 23557, - "tags": [ - { "key": "blockID", "type": "string", "value": "2c8d9e08-28c9-43e0-a38e-48e205e70c0a" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894724156, - "fields": [ - { "key": "bytes", "type": "int64", "value": 454976 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3d32ea43a7ace6a3", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894685122, - "duration": 39094, - "tags": [], - "logs": [ - { "timestamp": 1605873894685153, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894724214, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "42780d9e0c2beb80", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894685114, - "duration": 39108, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6d4dfd6622f9d4e5", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684594, - "duration": 39780, - "tags": [ - { "key": "blockID", "type": "string", "value": "6926ecb7-efff-41c5-ae95-85e0b8e75bed" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894724372, - "fields": [ - { "key": "bytes", "type": "int64", "value": 364000 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "462c7cc77e9bde26", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684089, - "duration": 40384, - "tags": [ - { "key": "blockID", "type": "string", "value": "eacc5319-5c66-4ef0-bdc7-61ebcd665770" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894724469, - "fields": [ - { "key": "bytes", "type": "int64", "value": 375312 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "64c5e8cb8a8c9c87", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684553, - "duration": 40087, - "tags": [], - "logs": [ - { "timestamp": 1605873894684559, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894724639, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6a2abf3fa1e44a02", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684548, - "duration": 40098, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5185d47ca37c94b2", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684289, - "duration": 40372, - "tags": [], - "logs": [ - { "timestamp": 1605873894684296, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894724661, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "63f3f66dc1b96cb5", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684283, - "duration": 40383, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "09dfedf04619fd00", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683527, - "duration": 41169, - "tags": [], - "logs": [ - { "timestamp": 1605873894683532, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894724695, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4fcf6b895ba07eb1", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683524, - "duration": 41178, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1d3e7eff78cb43af", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684135, - "duration": 40664, - "tags": [], - "logs": [ - { "timestamp": 1605873894684142, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894724800, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "43860f9f193430f0", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684131, - "duration": 40675, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7ea1f5a8b4dab8a7", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684338, - "duration": 40775, - "tags": [ - { "key": "blockID", "type": "string", "value": "2906f33b-d748-4827-8eb7-de90927a65dd" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894725108, - "fields": [ - { "key": "bytes", "type": "int64", "value": 431856 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "512c60978bd2eac4", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894721019, - "duration": 4095, - "tags": [], - "logs": [ - { "timestamp": 1605873894721028, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894725112, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7e897df0e96d32b5", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894721010, - "duration": 4112, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "787b23c8fa301dd7", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894706900, - "duration": 18234, - "tags": [], - "logs": [ - { "timestamp": 1605873894706927, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894725133, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3ffd9ecc1161334a", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683055, - "duration": 42085, - "tags": [ - { "key": "blockID", "type": "string", "value": "26f1bad8-cd58-4801-8785-d52b8d833a90" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894725137, - "fields": [ - { "key": "bytes", "type": "int64", "value": 414056 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2f86e3ff470976d3", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894706887, - "duration": 18254, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1a42c28bcd21acc8", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894685104, - "duration": 40144, - "tags": [ - { "key": "blockID", "type": "string", "value": "777d1eb8-cd33-44d5-8e34-2d253bd948a6" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894725246, - "fields": [ - { "key": "bytes", "type": "int64", "value": 407792 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "445f67ce7c86e918", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684540, - "duration": 40905, - "tags": [ - { "key": "blockID", "type": "string", "value": "d4b28adc-eb54-4e54-8639-40acbe82196a" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894725443, - "fields": [ - { "key": "bytes", "type": "int64", "value": 312232 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4dc9df94476d41ef", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894713432, - "duration": 12062, - "tags": [], - "logs": [ - { "timestamp": 1605873894713448, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894725366, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1f47248f05173a34", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894713423, - "duration": 12078, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6ab47177b7f5e532", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684151, - "duration": 41357, - "tags": [], - "logs": [ - { "timestamp": 1605873894684157, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894725507, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "62088478a235ead5", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684146, - "duration": 41368, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "021658e91c35b26e", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683518, - "duration": 42121, - "tags": [ - { "key": "blockID", "type": "string", "value": "6deff928-b65a-437a-8d56-64d2397d9d1f" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894725636, - "fields": [ - { "key": "bytes", "type": "int64", "value": 238936 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "48401abd95ffa153", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894712421, - "duration": 13359, - "tags": [], - "logs": [ - { "timestamp": 1605873894712431, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894725779, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6a6bcedc4fc18a61", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894712416, - "duration": 13371, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "551f266c080ab0c6", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684122, - "duration": 41711, - "tags": [ - { "key": "blockID", "type": "string", "value": "5180765b-50b6-4de3-abab-ceea6086afb8" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894725830, - "fields": [ - { "key": "bytes", "type": "int64", "value": 393392 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "72970316c65770af", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894706872, - "duration": 18990, - "tags": [ - { "key": "blockID", "type": "string", "value": "541a6a31-d25a-4275-9688-228355c81085" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894725860, - "fields": [ - { "key": "bytes", "type": "int64", "value": 280296 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "635a7471f4256c0b", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684275, - "duration": 41695, - "tags": [ - { "key": "blockID", "type": "string", "value": "6bf57585-a03d-44e1-bd18-081b679d3e4a" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894725967, - "fields": [ - { "key": "bytes", "type": "int64", "value": 434432 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7607fc837fc26251", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683802, - "duration": 42223, - "tags": [], - "logs": [ - { "timestamp": 1605873894683808, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894726025, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "01269c3f9d50434a", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683798, - "duration": 42233, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "70114fe92b16120e", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894721062, - "duration": 5033, - "tags": [], - "logs": [ - { "timestamp": 1605873894721068, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894726093, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "37a69429cff69860", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894721058, - "duration": 5043, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5262951e45efa67d", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894720997, - "duration": 5110, - "tags": [ - { "key": "blockID", "type": "string", "value": "5c09e7bd-2f9c-42d3-8d2f-863e93eaa939" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894726103, - "fields": [ - { "key": "bytes", "type": "int64", "value": 246840 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1d6a76dd2ca6c3e6", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894711590, - "duration": 14746, - "tags": [], - "logs": [ - { "timestamp": 1605873894711600, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894726335, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7c75cd286737359f", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894711582, - "duration": 14759, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "78415d3812916d77", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894707879, - "duration": 18497, - "tags": [], - "logs": [ - { "timestamp": 1605873894707887, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894726375, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5f7ac8c4fd5c680a", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894707874, - "duration": 18513, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6b4bc2ee6a63726e", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894713413, - "duration": 13261, - "tags": [ - { "key": "blockID", "type": "string", "value": "b654e510-386a-470a-98c4-fb9833d21728" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894726671, - "fields": [ - { "key": "bytes", "type": "int64", "value": 384056 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5f55f469fc2d6d29", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894712403, - "duration": 14367, - "tags": [ - { "key": "blockID", "type": "string", "value": "3fca3f89-a174-460d-9a87-92ed03555497" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894726767, - "fields": [ - { "key": "bytes", "type": "int64", "value": 334896 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "19235cb1f2dccb32", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894711567, - "duration": 15276, - "tags": [ - { "key": "blockID", "type": "string", "value": "de228107-4ff6-449e-9f1f-6ab34765ab68" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894726841, - "fields": [ - { "key": "bytes", "type": "int64", "value": 225832 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "29b186beff361524", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894699284, - "duration": 27562, - "tags": [], - "logs": [ - { "timestamp": 1605873894699298, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894726845, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0acce3e2af327bae", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894699278, - "duration": 27578, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6b343c544d82bb3b", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894721050, - "duration": 5994, - "tags": [ - { "key": "blockID", "type": "string", "value": "459be32f-b91d-491b-aa61-5389b239eed8" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894727041, - "fields": [ - { "key": "bytes", "type": "int64", "value": 429792 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "62e3ccbe325de3d1", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683746, - "duration": 43412, - "tags": [ - { "key": "blockID", "type": "string", "value": "a1b8740a-6430-4113-93f4-ad9c52e42d62" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894727155, - "fields": [ - { "key": "bytes", "type": "int64", "value": 366096 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "310178852fbf88e0", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682731, - "duration": 44481, - "tags": [], - "logs": [ - { "timestamp": 1605873894682741, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894727211, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "42bb5e9919ea40f4", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682726, - "duration": 44493, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "150c8cfeedab6a38", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894708915, - "duration": 18374, - "tags": [], - "logs": [ - { "timestamp": 1605873894708922, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894727288, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1dda89d441503741", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894708910, - "duration": 18384, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6c1c11a742626433", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894707863, - "duration": 19558, - "tags": [ - { "key": "blockID", "type": "string", "value": "ef68962f-224d-4b6c-9dcd-ef9be8607c72" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894727419, - "fields": [ - { "key": "bytes", "type": "int64", "value": 423912 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4393a9fa65c8ceae", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894707853, - "duration": 19639, - "tags": [], - "logs": [ - { "timestamp": 1605873894707866, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894727491, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1392dcdbb07bc781", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894707848, - "duration": 19650, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0804f1e82c8828e2", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894713028, - "duration": 14650, - "tags": [], - "logs": [ - { "timestamp": 1605873894713040, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894727677, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4e9e2ce15a6e596c", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894713023, - "duration": 14661, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0c763a5ef614a2f4", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894685588, - "duration": 42409, - "tags": [ - { "key": "blockID", "type": "string", "value": "65fbe578-d535-4032-a12f-f249e7405363" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894727993, - "fields": [ - { "key": "bytes", "type": "int64", "value": 441088 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "31c1f2fd1bde2d49", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682863, - "duration": 45441, - "tags": [], - "logs": [ - { "timestamp": 1605873894682870, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894728303, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2a694924a7a45244", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682710, - "duration": 45639, - "tags": [ - { "key": "blockID", "type": "string", "value": "06a1301e-5b48-425e-a506-a4350afe3d0d" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894728346, - "fields": [ - { "key": "bytes", "type": "int64", "value": 418168 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "73f7696fdccac589", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682859, - "duration": 45516, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4b52acf382a86008", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684137, - "duration": 44241, - "tags": [ - { "key": "blockID", "type": "string", "value": "57df43b4-8552-49e3-a1cd-f442609deaf2" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894728373, - "fields": [ - { "key": "bytes", "type": "int64", "value": 425104 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "18688fac379c4a9e", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894707836, - "duration": 20550, - "tags": [ - { "key": "blockID", "type": "string", "value": "c53e7db4-34cd-43d0-9383-de5e40936182" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894728383, - "fields": [ - { "key": "bytes", "type": "int64", "value": 389928 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5fccf30d8fc010b8", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894726139, - "duration": 2327, - "tags": [], - "logs": [ - { "timestamp": 1605873894726153, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894728465, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1c2bf57fc386ac18", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894726130, - "duration": 2343, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7cfea87d3c8d06ca", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894685457, - "duration": 43096, - "tags": [], - "logs": [ - { "timestamp": 1605873894685465, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894728552, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "12a80c97c2a42f05", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894685452, - "duration": 43107, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "08122694d5e37cb7", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894723200, - "duration": 5455, - "tags": [], - "logs": [ - { "timestamp": 1605873894723209, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894728654, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "313e6147867246d6", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894723194, - "duration": 5466, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2e4f73b3315eb612", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894715649, - "duration": 13049, - "tags": [], - "logs": [ - { "timestamp": 1605873894715658, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894728698, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7e0457958022516b", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894715644, - "duration": 13060, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "04db9d1320bc1720", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683309, - "duration": 45454, - "tags": [], - "logs": [ - { "timestamp": 1605873894683316, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894728762, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4702ca2057b120a0", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894726116, - "duration": 2652, - "tags": [ - { "key": "blockID", "type": "string", "value": "ec5b73d8-61f8-4210-8838-e6cfd253294b" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894728766, - "fields": [ - { "key": "bytes", "type": "int64", "value": 173264 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5e2c536cf48b42a8", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683305, - "duration": 45464, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "69bd1c5d5184626b", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894708900, - "duration": 19981, - "tags": [ - { "key": "blockID", "type": "string", "value": "de324468-b889-4f4c-af77-907353a719cd" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894728878, - "fields": [ - { "key": "bytes", "type": "int64", "value": 307032 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6849c669006c2759", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894714727, - "duration": 14480, - "tags": [], - "logs": [ - { "timestamp": 1605873894714736, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894729206, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6836249c56ca87ae", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894714722, - "duration": 14490, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4614a3c3374430a7", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894682850, - "duration": 46413, - "tags": [ - { "key": "blockID", "type": "string", "value": "ea416fc3-eedc-413e-9cc1-d8fd3548cfe6" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894729260, - "fields": [ - { "key": "bytes", "type": "int64", "value": 392160 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "33a5b0766e98269c", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894685441, - "duration": 44269, - "tags": [ - { "key": "blockID", "type": "string", "value": "b50c3305-8d80-42fc-88a4-97a8604c7066" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894729705, - "fields": [ - { "key": "bytes", "type": "int64", "value": 346072 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "38da2ce44e352b40", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894722577, - "duration": 7233, - "tags": [], - "logs": [ - { "timestamp": 1605873894722588, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894729809, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2a0fc54146d07c21", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894722569, - "duration": 7247, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "398ed8e3573cf781", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894715632, - "duration": 14249, - "tags": [ - { "key": "blockID", "type": "string", "value": "2d9f964a-aac5-42e1-b410-866ad1706d7a" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894729879, - "fields": [ - { "key": "bytes", "type": "int64", "value": 441600 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "47c93569ac9ecd04", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894713013, - "duration": 16911, - "tags": [ - { "key": "blockID", "type": "string", "value": "96c1b791-af15-4554-a1bb-b0f200625856" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894729919, - "fields": [ - { "key": "bytes", "type": "int64", "value": 446504 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3d61171be03f3db4", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894714709, - "duration": 15261, - "tags": [ - { "key": "blockID", "type": "string", "value": "ae957436-40cc-4d15-a3c3-26d10613aaf6" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894729967, - "fields": [ - { "key": "bytes", "type": "int64", "value": 287976 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3de17f2475734d79", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894723182, - "duration": 6796, - "tags": [ - { "key": "blockID", "type": "string", "value": "eb218dd8-99fa-4de7-87cd-8998b89e0778" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894729976, - "fields": [ - { "key": "bytes", "type": "int64", "value": 403400 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "712c995480f17232", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894713402, - "duration": 16771, - "tags": [], - "logs": [ - { "timestamp": 1605873894713412, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894730172, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "26950bc4bf84c34b", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894713392, - "duration": 16787, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "1bd3c2e5acbea9c4", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894701374, - "duration": 29019, - "tags": [], - "logs": [ - { "timestamp": 1605873894701383, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894730393, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "2106e0853647ac08", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894701369, - "duration": 29030, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6e59a327558a7329", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894699265, - "duration": 31183, - "tags": [ - { "key": "blockID", "type": "string", "value": "d8b5fee2-e2b3-445c-8ea9-243519a5c104" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894730443, - "fields": [ - { "key": "bytes", "type": "int64", "value": 400224 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "037acce8385b1858", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894721017, - "duration": 9605, - "tags": [], - "logs": [ - { "timestamp": 1605873894721028, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894730621, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3547a2504168d8c7", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894721012, - "duration": 9617, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "0dc60016513590c8", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894722299, - "duration": 8583, - "tags": [ - { "key": "blockID", "type": "string", "value": "69120461-fbd8-4ca0-a5fb-957d745a22a8" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894730879, - "fields": [ - { "key": "bytes", "type": "int64", "value": 370472 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5d18bf1b78bd4e75", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684396, - "duration": 46590, - "tags": [], - "logs": [ - { "timestamp": 1605873894684402, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894730985, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3bdc5547104db28c", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894684392, - "duration": 46600, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "682e6d017ce71dad", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894713268, - "duration": 17796, - "tags": [ - { "key": "blockID", "type": "string", "value": "84644a06-da08-4c3a-936f-70a634d8052d" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894731057, - "fields": [ - { "key": "bytes", "type": "int64", "value": 353808 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3bbbdf937ccb2ccb", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894721935, - "duration": 9258, - "tags": [], - "logs": [ - { "timestamp": 1605873894721944, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894731193, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7c40bff5b749a532", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894721928, - "duration": 9272, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "31f86900e7598e55", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894701358, - "duration": 29885, - "tags": [ - { "key": "blockID", "type": "string", "value": "186f31e1-409b-4c9c-95b5-abc662389d3b" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894731240, - "fields": [ - { "key": "bytes", "type": "int64", "value": 434496 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "7471b3c5a188e8da", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894729995, - "duration": 1327, - "tags": [], - "logs": [ - { "timestamp": 1605873894730003, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894731321, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "33cb5e55876f584c", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894729989, - "duration": 1338, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "58b7d0b41550e88f", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894729978, - "duration": 1396, - "tags": [ - { "key": "blockID", "type": "string", "value": "e0d8f1ac-a48f-4dea-868f-183e1a124fb5" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894731373, - "fields": [ - { "key": "bytes", "type": "int64", "value": 16488 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "70405f4198f01d16", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894721544, - "duration": 9893, - "tags": [], - "logs": [ - { "timestamp": 1605873894721555, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894731436, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "56f0f0d7120ea5a5", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894721540, - "duration": 9903, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "69bb9bf8c37d9faf", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894683022, - "duration": 48646, - "tags": [ - { "key": "blockID", "type": "string", "value": "cf7747f5-68f9-490b-840d-9975c057c7e6" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894731663, - "fields": [ - { "key": "bytes", "type": "int64", "value": 425640 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "4ef61721dfd7f61b", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894720840, - "duration": 10841, - "tags": [], - "logs": [ - { "timestamp": 1605873894720869, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894731680, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "70e8aa6d13e56007", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894720827, - "duration": 10860, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "297ff96c736c18f4", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894705333, - "duration": 26573, - "tags": [], - "logs": [ - { "timestamp": 1605873894705342, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894731904, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6a80209f067be4f5", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894705328, - "duration": 26585, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "5b3db530e83db855", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894731272, - "duration": 796, - "tags": [], - "logs": [ - { "timestamp": 1605873894731284, "fields": [{ "key": "keys requested", "type": "int64", "value": 1 }] }, - { "timestamp": 1605873894732067, "fields": [{ "key": "keys found", "type": "int64", "value": 1 }] } - ], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "6b2458a9486a4298", - "operationName": "Memcache.GetMulti", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894731265, - "duration": 886, - "tags": [ - { "key": "organization", "type": "string", "value": "1" }, - { "key": "span.kind", "type": "string", "value": "client" } - ], - "logs": [], - "processID": "p1", - "warnings": null - }, - { - "traceID": "3fa414edcef6ad90", - "spanID": "3139145bb422702e", - "operationName": "block.Find", - "references": [{ "refType": "CHILD_OF", "traceID": "3fa414edcef6ad90", "spanID": "1b26effbab24e95a" }], - "startTime": 1605873894731251, - "duration": 941, - "tags": [ - { "key": "blockID", "type": "string", "value": "f9fd03ba-91a8-476b-b809-d2b11bfa790d" }, - { "key": "shardKey", "type": "int64", "value": 5 } - ], - "logs": [ - { - "timestamp": 1605873894732190, - "fields": [ - { "key": "bytes", "type": "int64", "value": 8680 }, - { "key": "msg", "type": "string", "value": "bloom" } - ] - } - ], - "processID": "p1", - "warnings": null - } - ], - "processes": { - "p1": { - "serviceName": "s1" - } - }, - "warnings": null - } - ], - "total": 0, - "limit": 0, - "offset": 0, - "errors": null -} diff --git a/e2e/old-arch/various-suite/trace-view-scrolling.spec.ts b/e2e/old-arch/various-suite/trace-view-scrolling.spec.ts index a713ddd2230..f73c3c6f2c1 100644 --- a/e2e/old-arch/various-suite/trace-view-scrolling.spec.ts +++ b/e2e/old-arch/various-suite/trace-view-scrolling.spec.ts @@ -6,8 +6,12 @@ describe('Trace view', () => { }); it('Can lazy load big traces', () => { - cy.intercept('GET', '**/api/traces/trace', { - fixture: 'long-trace-response.json', + cy.intercept('POST', '**/api/ds/query*', (req) => { + if (!req.url.includes('ds_type=jaeger')) { + return; + } + + req.reply({ fixture: 'long-trace-response-backend.json' }); }).as('longTrace'); e2e.pages.Explore.visit(); diff --git a/e2e/various-suite/trace-view-scrolling.spec.ts b/e2e/various-suite/trace-view-scrolling.spec.ts index a713ddd2230..f73c3c6f2c1 100644 --- a/e2e/various-suite/trace-view-scrolling.spec.ts +++ b/e2e/various-suite/trace-view-scrolling.spec.ts @@ -6,8 +6,12 @@ describe('Trace view', () => { }); it('Can lazy load big traces', () => { - cy.intercept('GET', '**/api/traces/trace', { - fixture: 'long-trace-response.json', + cy.intercept('POST', '**/api/ds/query*', (req) => { + if (!req.url.includes('ds_type=jaeger')) { + return; + } + + req.reply({ fixture: 'long-trace-response-backend.json' }); }).as('longTrace'); e2e.pages.Explore.visit(); diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts index 46aa38792a9..052d8771af5 100644 --- a/packages/grafana-data/src/types/featureToggles.gen.ts +++ b/packages/grafana-data/src/types/featureToggles.gen.ts @@ -739,6 +739,7 @@ export interface FeatureToggles { crashDetection?: boolean; /** * Enables querying the Jaeger data source without the proxy + * @default true */ jaegerBackendMigration?: boolean; /** diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index cfa967694a8..e07768c2012 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -1264,8 +1264,9 @@ var ( { Name: "jaegerBackendMigration", Description: "Enables querying the Jaeger data source without the proxy", - Stage: FeatureStageExperimental, + Stage: FeatureStageGeneralAvailability, Owner: grafanaOSSBigTent, + Expression: "true", }, { Name: "alertingUIOptimizeReducer", diff --git a/pkg/services/featuremgmt/toggles_gen.csv b/pkg/services/featuremgmt/toggles_gen.csv index 6739f18dd88..607749df8a6 100644 --- a/pkg/services/featuremgmt/toggles_gen.csv +++ b/pkg/services/featuremgmt/toggles_gen.csv @@ -165,7 +165,7 @@ prometheusSpecialCharsInLabelValues,experimental,@grafana/oss-big-tent,false,fal enableExtensionsAdminPage,experimental,@grafana/plugins-platform-backend,false,true,false enableSCIM,preview,@grafana/identity-access-team,false,false,false crashDetection,experimental,@grafana/observability-traces-and-profiling,false,false,true -jaegerBackendMigration,experimental,@grafana/oss-big-tent,false,false,false +jaegerBackendMigration,GA,@grafana/oss-big-tent,false,false,false alertingUIOptimizeReducer,GA,@grafana/alerting-squad,false,false,true azureMonitorEnableUserAuth,GA,@grafana/partner-datasources,false,false,false alertingNotificationsStepMode,GA,@grafana/alerting-squad,false,false,true diff --git a/pkg/services/featuremgmt/toggles_gen.json b/pkg/services/featuremgmt/toggles_gen.json index 9b00950e11f..7eaf0b54d90 100644 --- a/pkg/services/featuremgmt/toggles_gen.json +++ b/pkg/services/featuremgmt/toggles_gen.json @@ -1524,13 +1524,17 @@ { "metadata": { "name": "jaegerBackendMigration", - "resourceVersion": "1750434297879", - "creationTimestamp": "2024-11-15T14:40:20Z" + "resourceVersion": "1751465665226", + "creationTimestamp": "2024-11-15T14:40:20Z", + "annotations": { + "grafana.app/updatedTimestamp": "2025-07-02 14:14:25.226989 +0000 UTC" + } }, "spec": { "description": "Enables querying the Jaeger data source without the proxy", - "stage": "experimental", - "codeowner": "@grafana/oss-big-tent" + "stage": "GA", + "codeowner": "@grafana/oss-big-tent", + "expression": "true" } }, { From e76f470b444499f70825e9e5eb6b1775ff086c3c Mon Sep 17 00:00:00 2001 From: Andrej Ocenas Date: Thu, 3 Jul 2025 16:15:23 +0200 Subject: [PATCH 13/19] NestedFolderPicker: Migrate to app platform API (#106926) * Add /children endpoint * Update folder client * Add comment * Add feature toggle * Add new version of useFoldersQuery * Error handling * Format * Rename feature toggle * Remove options and move root folder constant * Fix feature toggle merge * Add feature toggle again * Rename useFoldersQuery files * Update API spec * Fix test * Add test * Better typings --------- Co-authored-by: Clarity-89 --- .../src/types/featureToggles.gen.ts | 5 + pkg/registry/apis/folders/register.go | 5 + pkg/registry/apis/folders/sub_children.go | 73 +++ pkg/services/featuremgmt/registry.go | 10 + pkg/services/featuremgmt/toggles_gen.csv | 1 + pkg/services/featuremgmt/toggles_gen.go | 4 + pkg/services/featuremgmt/toggles_gen.json | 16 + pkg/tests/apis/folder/folders_test.go | 9 + .../folder.grafana.app-v1beta1.json | 49 ++ .../clients/folder/v1beta1/endpoints.gen.ts | 439 +++++++++++++++++- .../app/api/clients/folder/v1beta1/index.ts | 2 +- .../NestedFolderPicker/NestedFolderPicker.tsx | 3 +- .../useFoldersQuery.test.tsx | 116 +++++ .../NestedFolderPicker/useFoldersQuery.ts | 198 +------- .../useFoldersQueryAppPlatform.ts | 164 +++++++ .../useFoldersQueryLegacy.ts | 191 ++++++++ .../components/NestedFolderPicker/utils.ts | 9 + scripts/generate-rtk-apis.ts | 1 - 18 files changed, 1102 insertions(+), 193 deletions(-) create mode 100644 pkg/registry/apis/folders/sub_children.go create mode 100644 public/app/core/components/NestedFolderPicker/useFoldersQuery.test.tsx create mode 100644 public/app/core/components/NestedFolderPicker/useFoldersQueryAppPlatform.ts create mode 100644 public/app/core/components/NestedFolderPicker/useFoldersQueryLegacy.ts create mode 100644 public/app/core/components/NestedFolderPicker/utils.ts diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts index 052d8771af5..ca54c10faa2 100644 --- a/packages/grafana-data/src/types/featureToggles.gen.ts +++ b/packages/grafana-data/src/types/featureToggles.gen.ts @@ -1012,4 +1012,9 @@ export interface FeatureToggles { * @default false */ enableAppChromeExtensions?: boolean; + /** + * Enables use of app platform API for folders + * @default false + */ + foldersAppPlatformAPI?: boolean; } diff --git a/pkg/registry/apis/folders/register.go b/pkg/registry/apis/folders/register.go index 0746d99ec11..d3b21177afc 100644 --- a/pkg/registry/apis/folders/register.go +++ b/pkg/registry/apis/folders/register.go @@ -192,6 +192,11 @@ func (b *FolderAPIBuilder) UpdateAPIGroupInfo(apiGroupInfo *genericapiserver.API storage[resourceInfo.StoragePath("counts")] = &subCountREST{searcher: b.searcher} storage[resourceInfo.StoragePath("access")] = &subAccessREST{b.folderSvc, b.ac} + // Adds a path to return children of a given folder + storage[resourceInfo.StoragePath("children")] = &subChildrenREST{ + lister: storage[resourceInfo.StoragePath()].(rest.Lister), + } + apiGroupInfo.VersionedResourcesStorageMap[folders.VERSION] = storage b.storage = storage[resourceInfo.StoragePath()].(grafanarest.Storage) return nil diff --git a/pkg/registry/apis/folders/sub_children.go b/pkg/registry/apis/folders/sub_children.go new file mode 100644 index 00000000000..92f84093ffd --- /dev/null +++ b/pkg/registry/apis/folders/sub_children.go @@ -0,0 +1,73 @@ +package folders + +import ( + "context" + "fmt" + "net/http" + + "k8s.io/apimachinery/pkg/apis/meta/internalversion" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apiserver/pkg/registry/rest" + + folders "github.com/grafana/grafana/apps/folder/pkg/apis/folder/v1beta1" +) + +type subChildrenREST struct { + lister rest.Lister +} + +var _ = rest.Connecter(&subChildrenREST{}) +var _ = rest.StorageMetadata(&subChildrenREST{}) + +// RootFolderName Hardcoded magic const to get root folders without parent. +var RootFolderName = "general" + +func (r *subChildrenREST) New() runtime.Object { + return &folders.FolderList{} +} + +func (r *subChildrenREST) Destroy() { +} + +func (r *subChildrenREST) ProducesMIMETypes(verb string) []string { + return nil +} + +func (r *subChildrenREST) ProducesObject(verb string) interface{} { + return &folders.FolderList{} +} + +func (r *subChildrenREST) ConnectMethods() []string { + return []string{"GET"} +} + +func (r *subChildrenREST) NewConnectOptions() (runtime.Object, bool, string) { + return nil, false, "" // true means you can use the trailing path as a variable +} + +func (r *subChildrenREST) Connect(ctx context.Context, name string, opts runtime.Object, responder rest.Responder) (http.Handler, error) { + obj, err := r.lister.List(ctx, &internalversion.ListOptions{}) + if err != nil { + return nil, err + } + allFolders, ok := obj.(*folders.FolderList) + if !ok { + return nil, fmt.Errorf("could not list folders") + } + + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + children := &folders.FolderList{} + parentName := "" + + if name != RootFolderName { + parentName = name + } + for _, folder := range allFolders.Items { + if parentName == getParent(&folder) { + children.Items = append(children.Items, folder) + } + } + + responder.Object(http.StatusOK, children) + }), nil +} diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index e07768c2012..5ee6c7d0e5f 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -1734,6 +1734,16 @@ var ( FrontendOnly: true, Expression: "false", // extensions will be disabled by default }, + { + Name: "foldersAppPlatformAPI", + Description: "Enables use of app platform API for folders", + Stage: FeatureStageExperimental, + Owner: grafanaFrontendSearchNavOrganise, + HideFromAdminPage: true, + HideFromDocs: true, + FrontendOnly: true, + Expression: "false", + }, } ) diff --git a/pkg/services/featuremgmt/toggles_gen.csv b/pkg/services/featuremgmt/toggles_gen.csv index 607749df8a6..3583570d940 100644 --- a/pkg/services/featuremgmt/toggles_gen.csv +++ b/pkg/services/featuremgmt/toggles_gen.csv @@ -226,3 +226,4 @@ preferLibraryPanelTitle,privatePreview,@grafana/dashboards-squad,false,false,fal tabularNumbers,GA,@grafana/grafana-frontend-platform,false,false,false newInfluxDSConfigPageDesign,privatePreview,@grafana/partner-datasources,false,false,false enableAppChromeExtensions,experimental,@grafana/plugins-platform-backend,false,false,true +foldersAppPlatformAPI,experimental,@grafana/grafana-search-navigate-organise,false,false,true diff --git a/pkg/services/featuremgmt/toggles_gen.go b/pkg/services/featuremgmt/toggles_gen.go index 67685845005..e105464df6a 100644 --- a/pkg/services/featuremgmt/toggles_gen.go +++ b/pkg/services/featuremgmt/toggles_gen.go @@ -914,4 +914,8 @@ const ( // FlagEnableAppChromeExtensions // Set this to true to enable all app chrome extensions registered by plugins. FlagEnableAppChromeExtensions = "enableAppChromeExtensions" + + // FlagFoldersAppPlatformAPI + // Enables use of app platform API for folders + FlagFoldersAppPlatformAPI = "foldersAppPlatformAPI" ) diff --git a/pkg/services/featuremgmt/toggles_gen.json b/pkg/services/featuremgmt/toggles_gen.json index 7eaf0b54d90..92bf71778ba 100644 --- a/pkg/services/featuremgmt/toggles_gen.json +++ b/pkg/services/featuremgmt/toggles_gen.json @@ -1257,6 +1257,22 @@ "hideFromDocs": true } }, + { + "metadata": { + "name": "foldersAppPlatformAPI", + "resourceVersion": "1751377081192", + "creationTimestamp": "2025-07-01T13:38:01Z" + }, + "spec": { + "description": "Enables use of app platform API for folders", + "stage": "experimental", + "codeowner": "@grafana/grafana-search-navigate-organise", + "frontend": true, + "hideFromAdminPage": true, + "hideFromDocs": true, + "expression": "false" + } + }, { "metadata": { "name": "formatString", diff --git a/pkg/tests/apis/folder/folders_test.go b/pkg/tests/apis/folder/folders_test.go index 81d2d00a182..35722cbc964 100644 --- a/pkg/tests/apis/folder/folders_test.go +++ b/pkg/tests/apis/folder/folders_test.go @@ -88,6 +88,15 @@ func TestIntegrationFoldersApp(t *testing.T) { "get" ] }, + { + "name": "folders/children", + "singularName": "", + "namespaced": true, + "kind": "FolderList", + "verbs": [ + "get" + ] + }, { "name": "folders/counts", "singularName": "", diff --git a/pkg/tests/apis/openapi_snapshots/folder.grafana.app-v1beta1.json b/pkg/tests/apis/openapi_snapshots/folder.grafana.app-v1beta1.json index 653549d0bdb..f366842cb4d 100644 --- a/pkg/tests/apis/openapi_snapshots/folder.grafana.app-v1beta1.json +++ b/pkg/tests/apis/openapi_snapshots/folder.grafana.app-v1beta1.json @@ -915,6 +915,55 @@ } ] }, + "/apis/folder.grafana.app/v1beta1/namespaces/{namespace}/folders/{name}/children": { + "get": { + "tags": [ + "Folder" + ], + "description": "connect GET requests to children of Folder", + "operationId": "getFolderChildren", + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/com.github.grafana.grafana.apps.folder.pkg.apis.folder.v1beta1.FolderList" + } + } + } + } + }, + "x-kubernetes-action": "connect", + "x-kubernetes-group-version-kind": { + "group": "folder.grafana.app", + "version": "v1beta1", + "kind": "FolderList" + } + }, + "parameters": [ + { + "name": "name", + "in": "path", + "description": "name of the FolderList", + "required": true, + "schema": { + "type": "string", + "uniqueItems": true + } + }, + { + "name": "namespace", + "in": "path", + "description": "object name and auth scope, such as for teams and projects", + "required": true, + "schema": { + "type": "string", + "uniqueItems": true + } + } + ] + }, "/apis/folder.grafana.app/v1beta1/namespaces/{namespace}/folders/{name}/counts": { "get": { "tags": [ diff --git a/public/app/api/clients/folder/v1beta1/endpoints.gen.ts b/public/app/api/clients/folder/v1beta1/endpoints.gen.ts index 4c17702bf57..ae8bba67c4b 100644 --- a/public/app/api/clients/folder/v1beta1/endpoints.gen.ts +++ b/public/app/api/clients/folder/v1beta1/endpoints.gen.ts @@ -1,11 +1,71 @@ import { api } from './baseAPI'; -export const addTagTypes = ['Folder'] as const; +export const addTagTypes = ['API Discovery', 'Folder'] as const; const injectedRtkApi = api .enhanceEndpoints({ addTagTypes, }) .injectEndpoints({ endpoints: (build) => ({ + getApiResources: build.query({ + query: () => ({ url: `/apis/folder.grafana.app/v1beta1/` }), + providesTags: ['API Discovery'], + }), + listFolder: build.query({ + query: (queryArg) => ({ + url: `/folders`, + params: { + pretty: queryArg.pretty, + allowWatchBookmarks: queryArg.allowWatchBookmarks, + continue: queryArg['continue'], + fieldSelector: queryArg.fieldSelector, + labelSelector: queryArg.labelSelector, + limit: queryArg.limit, + resourceVersion: queryArg.resourceVersion, + resourceVersionMatch: queryArg.resourceVersionMatch, + sendInitialEvents: queryArg.sendInitialEvents, + timeoutSeconds: queryArg.timeoutSeconds, + watch: queryArg.watch, + }, + }), + providesTags: ['Folder'], + }), + createFolder: build.mutation({ + query: (queryArg) => ({ + url: `/folders`, + method: 'POST', + body: queryArg.folder, + params: { + pretty: queryArg.pretty, + dryRun: queryArg.dryRun, + fieldManager: queryArg.fieldManager, + fieldValidation: queryArg.fieldValidation, + }, + }), + invalidatesTags: ['Folder'], + }), + deletecollectionFolder: build.mutation({ + query: (queryArg) => ({ + url: `/folders`, + method: 'DELETE', + params: { + pretty: queryArg.pretty, + continue: queryArg['continue'], + dryRun: queryArg.dryRun, + fieldSelector: queryArg.fieldSelector, + gracePeriodSeconds: queryArg.gracePeriodSeconds, + ignoreStoreReadErrorWithClusterBreakingPotential: queryArg.ignoreStoreReadErrorWithClusterBreakingPotential, + labelSelector: queryArg.labelSelector, + limit: queryArg.limit, + orphanDependents: queryArg.orphanDependents, + propagationPolicy: queryArg.propagationPolicy, + resourceVersion: queryArg.resourceVersion, + resourceVersionMatch: queryArg.resourceVersionMatch, + sendInitialEvents: queryArg.sendInitialEvents, + timeoutSeconds: queryArg.timeoutSeconds, + }, + }), + invalidatesTags: ['Folder'], + }), getFolder: build.query({ query: (queryArg) => ({ url: `/folders/${queryArg.name}`, @@ -15,10 +75,183 @@ const injectedRtkApi = api }), providesTags: ['Folder'], }), + replaceFolder: build.mutation({ + query: (queryArg) => ({ + url: `/folders/${queryArg.name}`, + method: 'PUT', + body: queryArg.folder, + params: { + pretty: queryArg.pretty, + dryRun: queryArg.dryRun, + fieldManager: queryArg.fieldManager, + fieldValidation: queryArg.fieldValidation, + }, + }), + invalidatesTags: ['Folder'], + }), + deleteFolder: build.mutation({ + query: (queryArg) => ({ + url: `/folders/${queryArg.name}`, + method: 'DELETE', + params: { + pretty: queryArg.pretty, + dryRun: queryArg.dryRun, + gracePeriodSeconds: queryArg.gracePeriodSeconds, + ignoreStoreReadErrorWithClusterBreakingPotential: queryArg.ignoreStoreReadErrorWithClusterBreakingPotential, + orphanDependents: queryArg.orphanDependents, + propagationPolicy: queryArg.propagationPolicy, + }, + }), + invalidatesTags: ['Folder'], + }), + updateFolder: build.mutation({ + query: (queryArg) => ({ + url: `/folders/${queryArg.name}`, + method: 'PATCH', + body: queryArg.patch, + params: { + pretty: queryArg.pretty, + dryRun: queryArg.dryRun, + fieldManager: queryArg.fieldManager, + fieldValidation: queryArg.fieldValidation, + force: queryArg.force, + }, + }), + invalidatesTags: ['Folder'], + }), + getFolderAccess: build.query({ + query: (queryArg) => ({ url: `/folders/${queryArg.name}/access` }), + providesTags: ['Folder'], + }), + getFolderChildren: build.query({ + query: (queryArg) => ({ url: `/folders/${queryArg.name}/children` }), + providesTags: ['Folder'], + }), + getFolderCounts: build.query({ + query: (queryArg) => ({ url: `/folders/${queryArg.name}/counts` }), + providesTags: ['Folder'], + }), + getFolderParents: build.query({ + query: (queryArg) => ({ url: `/folders/${queryArg.name}/parents` }), + providesTags: ['Folder'], + }), }), overrideExisting: false, }); export { injectedRtkApi as generatedAPI }; +export type GetApiResourcesApiResponse = /** status 200 OK */ ApiResourceList; +export type GetApiResourcesApiArg = void; +export type ListFolderApiResponse = /** status 200 OK */ FolderList; +export type ListFolderApiArg = { + /** If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget). */ + pretty?: string; + /** allowWatchBookmarks requests watch events with type "BOOKMARK". Servers that do not implement bookmarks may ignore this flag and bookmarks are sent at the server's discretion. Clients should not assume bookmarks are returned at any specific interval, nor may they assume the server will send any BOOKMARK event during a session. If this is not a watch, this field is ignored. */ + allowWatchBookmarks?: boolean; + /** The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + + This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications. */ + continue?: string; + /** A selector to restrict the list of returned objects by their fields. Defaults to everything. */ + fieldSelector?: string; + /** A selector to restrict the list of returned objects by their labels. Defaults to everything. */ + labelSelector?: string; + /** limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + + The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned. */ + limit?: number; + /** resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + + Defaults to unset */ + resourceVersion?: string; + /** resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + + Defaults to unset */ + resourceVersionMatch?: string; + /** `sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic "Bookmark" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `"k8s.io/initial-events-end": "true"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched. + + When `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan + is interpreted as "data at least as new as the provided `resourceVersion`" + and the bookmark event is send when the state is synced + to a `resourceVersion` at least as fresh as the one provided by the ListOptions. + If `resourceVersion` is unset, this is interpreted as "consistent read" and the + bookmark event is send when the state is synced at least to the moment + when request started being processed. + - `resourceVersionMatch` set to any other value or unset + Invalid error is returned. + + Defaults to true if `resourceVersion=""` or `resourceVersion="0"` (for backward compatibility reasons) and to false otherwise. */ + sendInitialEvents?: boolean; + /** Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity. */ + timeoutSeconds?: number; + /** Watch for changes to the described resources and return them as a stream of add, update, and remove notifications. Specify resourceVersion. */ + watch?: boolean; +}; +export type CreateFolderApiResponse = /** status 200 OK */ + | Folder + | /** status 201 Created */ Folder + | /** status 202 Accepted */ Folder; +export type CreateFolderApiArg = { + /** If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget). */ + pretty?: string; + /** When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed */ + dryRun?: string; + /** fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. */ + fieldManager?: string; + /** fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered. */ + fieldValidation?: string; + folder: Folder; +}; +export type DeletecollectionFolderApiResponse = /** status 200 OK */ Status; +export type DeletecollectionFolderApiArg = { + /** If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget). */ + pretty?: string; + /** The continue option should be set when retrieving more results from the server. Since this value is server defined, clients may only use the continue value from a previous query result with identical query parameters (except for the value of continue) and the server may reject a continue value it does not recognize. If the specified continue value is no longer valid whether due to expiration (generally five to fifteen minutes) or a configuration change on the server, the server will respond with a 410 ResourceExpired error together with a continue token. If the client needs a consistent list, it must restart their list without the continue field. Otherwise, the client may send another list request with the token received with the 410 error, the server will respond with a list starting from the next key, but from the latest snapshot, which is inconsistent from the previous list results - objects that are created, modified, or deleted after the first list request will be included in the response, as long as their keys are after the "next key". + + This field is not supported when watch is true. Clients may start a watch from the last resourceVersion value returned by the server and not miss any modifications. */ + continue?: string; + /** When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed */ + dryRun?: string; + /** A selector to restrict the list of returned objects by their fields. Defaults to everything. */ + fieldSelector?: string; + /** The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately. */ + gracePeriodSeconds?: number; + /** if set to true, it will trigger an unsafe deletion of the resource in case the normal deletion flow fails with a corrupt object error. A resource is considered corrupt if it can not be retrieved from the underlying storage successfully because of a) its data can not be transformed e.g. decryption failure, or b) it fails to decode into an object. NOTE: unsafe deletion ignores finalizer constraints, skips precondition checks, and removes the object from the storage. WARNING: This may potentially break the cluster if the workload associated with the resource being unsafe-deleted relies on normal deletion flow. Use only if you REALLY know what you are doing. The default value is false, and the user must opt in to enable it */ + ignoreStoreReadErrorWithClusterBreakingPotential?: boolean; + /** A selector to restrict the list of returned objects by their labels. Defaults to everything. */ + labelSelector?: string; + /** limit is a maximum number of responses to return for a list call. If more items exist, the server will set the `continue` field on the list metadata to a value that can be used with the same initial query to retrieve the next set of results. Setting a limit may return fewer than the requested amount of items (up to zero items) in the event all requested objects are filtered out and clients should only use the presence of the continue field to determine whether more results are available. Servers may choose not to support the limit argument and will return all of the available results. If limit is specified and the continue field is empty, clients may assume that no more results are available. This field is not supported if watch is true. + + The server guarantees that the objects returned when using continue will be identical to issuing a single list call without a limit - that is, no objects created, modified, or deleted after the first request is issued will be included in any subsequent continued requests. This is sometimes referred to as a consistent snapshot, and ensures that a client that is using limit to receive smaller chunks of a very large result can ensure they see all possible objects. If objects are updated during a chunked list the version of the object that was present at the time the first list result was calculated is returned. */ + limit?: number; + /** Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both. */ + orphanDependents?: boolean; + /** Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground. */ + propagationPolicy?: string; + /** resourceVersion sets a constraint on what resource versions a request may be served from. See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + + Defaults to unset */ + resourceVersion?: string; + /** resourceVersionMatch determines how resourceVersion is applied to list calls. It is highly recommended that resourceVersionMatch be set for list calls where resourceVersion is set See https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions for details. + + Defaults to unset */ + resourceVersionMatch?: string; + /** `sendInitialEvents=true` may be set together with `watch=true`. In that case, the watch stream will begin with synthetic events to produce the current state of objects in the collection. Once all such events have been sent, a synthetic "Bookmark" event will be sent. The bookmark will report the ResourceVersion (RV) corresponding to the set of objects, and be marked with `"k8s.io/initial-events-end": "true"` annotation. Afterwards, the watch stream will proceed as usual, sending watch events corresponding to changes (subsequent to the RV) to objects watched. + + When `sendInitialEvents` option is set, we require `resourceVersionMatch` option to also be set. The semantic of the watch request is as following: - `resourceVersionMatch` = NotOlderThan + is interpreted as "data at least as new as the provided `resourceVersion`" + and the bookmark event is send when the state is synced + to a `resourceVersion` at least as fresh as the one provided by the ListOptions. + If `resourceVersion` is unset, this is interpreted as "consistent read" and the + bookmark event is send when the state is synced at least to the moment + when request started being processed. + - `resourceVersionMatch` set to any other value or unset + Invalid error is returned. + + Defaults to true if `resourceVersion=""` or `resourceVersion="0"` (for backward compatibility reasons) and to false otherwise. */ + sendInitialEvents?: boolean; + /** Timeout for the list/watch call. This limits the duration of the call, regardless of any activity or inactivity. */ + timeoutSeconds?: number; +}; export type GetFolderApiResponse = /** status 200 OK */ Folder; export type GetFolderApiArg = { /** name of the Folder */ @@ -26,6 +259,105 @@ export type GetFolderApiArg = { /** If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget). */ pretty?: string; }; +export type ReplaceFolderApiResponse = /** status 200 OK */ Folder | /** status 201 Created */ Folder; +export type ReplaceFolderApiArg = { + /** name of the Folder */ + name: string; + /** If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget). */ + pretty?: string; + /** When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed */ + dryRun?: string; + /** fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. */ + fieldManager?: string; + /** fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered. */ + fieldValidation?: string; + folder: Folder; +}; +export type DeleteFolderApiResponse = /** status 200 OK */ Status | /** status 202 Accepted */ Status; +export type DeleteFolderApiArg = { + /** name of the Folder */ + name: string; + /** If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget). */ + pretty?: string; + /** When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed */ + dryRun?: string; + /** The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately. */ + gracePeriodSeconds?: number; + /** if set to true, it will trigger an unsafe deletion of the resource in case the normal deletion flow fails with a corrupt object error. A resource is considered corrupt if it can not be retrieved from the underlying storage successfully because of a) its data can not be transformed e.g. decryption failure, or b) it fails to decode into an object. NOTE: unsafe deletion ignores finalizer constraints, skips precondition checks, and removes the object from the storage. WARNING: This may potentially break the cluster if the workload associated with the resource being unsafe-deleted relies on normal deletion flow. Use only if you REALLY know what you are doing. The default value is false, and the user must opt in to enable it */ + ignoreStoreReadErrorWithClusterBreakingPotential?: boolean; + /** Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both. */ + orphanDependents?: boolean; + /** Whether and how garbage collection will be performed. Either this field or OrphanDependents may be set, but not both. The default policy is decided by the existing finalizer set in the metadata.finalizers and the resource-specific default policy. Acceptable values are: 'Orphan' - orphan the dependents; 'Background' - allow the garbage collector to delete the dependents in the background; 'Foreground' - a cascading policy that deletes all dependents in the foreground. */ + propagationPolicy?: string; +}; +export type UpdateFolderApiResponse = /** status 200 OK */ Folder | /** status 201 Created */ Folder; +export type UpdateFolderApiArg = { + /** name of the Folder */ + name: string; + /** If 'true', then the output is pretty printed. Defaults to 'false' unless the user-agent indicates a browser or command-line HTTP tool (curl and wget). */ + pretty?: string; + /** When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed */ + dryRun?: string; + /** fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. This field is required for apply requests (application/apply-patch) but optional for non-apply patch types (JsonPatch, MergePatch, StrategicMergePatch). */ + fieldManager?: string; + /** fieldValidation instructs the server on how to handle objects in the request (POST/PUT/PATCH) containing unknown or duplicate fields. Valid values are: - Ignore: This will ignore any unknown fields that are silently dropped from the object, and will ignore all but the last duplicate field that the decoder encounters. This is the default behavior prior to v1.23. - Warn: This will send a warning via the standard warning response header for each unknown field that is dropped from the object, and for each duplicate field that is encountered. The request will still succeed if there are no other errors, and will only persist the last of any duplicate fields. This is the default in v1.23+ - Strict: This will fail the request with a BadRequest error if any unknown fields would be dropped from the object, or if any duplicate fields are present. The error returned from the server will contain all unknown and duplicate fields encountered. */ + fieldValidation?: string; + /** Force is going to "force" Apply requests. It means user will re-acquire conflicting fields owned by other people. Force flag must be unset for non-apply patch requests. */ + force?: boolean; + patch: Patch; +}; +export type GetFolderAccessApiResponse = /** status 200 OK */ FolderAccessInfo; +export type GetFolderAccessApiArg = { + /** name of the FolderAccessInfo */ + name: string; +}; +export type GetFolderChildrenApiResponse = /** status 200 OK */ FolderList; +export type GetFolderChildrenApiArg = { + /** name of the FolderList */ + name: string; +}; +export type GetFolderCountsApiResponse = /** status 200 OK */ DescendantCounts; +export type GetFolderCountsApiArg = { + /** name of the DescendantCounts */ + name: string; +}; +export type GetFolderParentsApiResponse = /** status 200 OK */ FolderInfoList; +export type GetFolderParentsApiArg = { + /** name of the FolderInfoList */ + name: string; +}; +export type ApiResource = { + /** categories is a list of the grouped resources this resource belongs to (e.g. 'all') */ + categories?: string[]; + /** group is the preferred group of the resource. Empty implies the group of the containing resource list. For subresources, this may have a different value, for example: Scale". */ + group?: string; + /** kind is the kind for the resource (e.g. 'Foo' is the kind for a resource 'foo') */ + kind: string; + /** name is the plural name of the resource. */ + name: string; + /** namespaced indicates if a resource is namespaced or not. */ + namespaced: boolean; + /** shortNames is a list of suggested short names of the resource. */ + shortNames?: string[]; + /** singularName is the singular name of the resource. This allows clients to handle plural and singular opaquely. The singularName is more correct for reporting status on a single item and both singular and plural are allowed from the kubectl CLI interface. */ + singularName: string; + /** The hash value of the storage version, the version this resource is converted to when written to the data store. Value must be treated as opaque by clients. Only equality comparison on the value is valid. This is an alpha feature and may change or be removed in the future. The field is populated by the apiserver only if the StorageVersionHash feature gate is enabled. This field will remain optional even if it graduates. */ + storageVersionHash?: string; + /** verbs is a list of supported kube verbs (this includes get, list, watch, create, update, patch, delete, deletecollection, and proxy) */ + verbs: string[]; + /** version is the preferred version of the resource. Empty implies the version of the containing resource list For subresources, this may have a different value, for example: v1 (while inside a v1beta1 version of the core resource's group)". */ + version?: string; +}; +export type ApiResourceList = { + /** APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources */ + apiVersion?: string; + /** groupVersion is the group and version this APIResourceList is for. */ + groupVersion: string; + /** Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds */ + kind?: string; + /** resources contains the name of the resources and if they are namespaced. */ + resources: ApiResource[]; +}; export type Time = string; export type FieldsV1 = object; export type ManagedFieldsEntry = { @@ -123,3 +455,108 @@ export type Folder = { spec: FolderSpec; status: FolderStatus; }; +export type ListMeta = { + /** continue may be set if the user set a limit on the number of items returned, and indicates that the server has more data available. The value is opaque and may be used to issue another request to the endpoint that served this list to retrieve the next set of available objects. Continuing a consistent list may not be possible if the server configuration has changed or more than a few minutes have passed. The resourceVersion field returned when using this continue value will be identical to the value in the first response, unless you have received this token from an error message. */ + continue?: string; + /** remainingItemCount is the number of subsequent items in the list which are not included in this list response. If the list request contained label or field selectors, then the number of remaining items is unknown and the field will be left unset and omitted during serialization. If the list is complete (either because it is not chunking or because this is the last chunk), then there are no more remaining items and this field will be left unset and omitted during serialization. Servers older than v1.15 do not set this field. The intended use of the remainingItemCount is *estimating* the size of a collection. Clients should not rely on the remainingItemCount to be set or to be exact. */ + remainingItemCount?: number; + /** String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency */ + resourceVersion?: string; + /** Deprecated: selfLink is a legacy read-only field that is no longer populated by the system. */ + selfLink?: string; +}; +export type FolderList = { + /** APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources */ + apiVersion?: string; + items: Folder[]; + /** Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds */ + kind?: string; + metadata: ListMeta; +}; +export type StatusCause = { + /** The field of the resource that has caused this error, as named by its JSON serialization. May include dot and postfix notation for nested attributes. Arrays are zero-indexed. Fields may appear more than once in an array of causes due to fields having multiple errors. Optional. + + Examples: + "name" - the field "name" on the current resource + "items[0].name" - the field "name" on the first array entry in "items" */ + field?: string; + /** A human-readable description of the cause of the error. This field may be presented as-is to a reader. */ + message?: string; + /** A machine-readable description of the cause of the error. If this value is empty there is no information available. */ + reason?: string; +}; +export type StatusDetails = { + /** The Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes. */ + causes?: StatusCause[]; + /** The group attribute of the resource associated with the status StatusReason. */ + group?: string; + /** The kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds */ + kind?: string; + /** The name attribute of the resource associated with the status StatusReason (when there is a single name which can be described). */ + name?: string; + /** If specified, the time in seconds before the operation should be retried. Some errors may indicate the client must take an alternate action - for those errors this field may indicate how long to wait before taking the alternate action. */ + retryAfterSeconds?: number; + /** UID of the resource. (when there is a single resource which can be described). More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#uids */ + uid?: string; +}; +export type Status = { + /** APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources */ + apiVersion?: string; + /** Suggested HTTP return code for this status, 0 if not set. */ + code?: number; + /** Extended data associated with the reason. Each reason may define its own extended details. This field is optional and the data returned is not guaranteed to conform to any schema except that defined by the reason type. */ + details?: StatusDetails; + /** Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds */ + kind?: string; + /** A human-readable description of the status of this operation. */ + message?: string; + /** Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds */ + metadata?: ListMeta; + /** A machine-readable description of why this operation is in the "Failure" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it. */ + reason?: string; + /** Status of the operation. One of: "Success" or "Failure". More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status */ + status?: string; +}; +export type Patch = object; +export type FolderAccessInfo = { + /** APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources */ + apiVersion?: string; + canAdmin: boolean; + canDelete: boolean; + canEdit: boolean; + canSave: boolean; + /** Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds */ + kind?: string; +}; +export type ResourceStats = { + count: number; + group: string; + resource: string; +}; +export type DescendantCounts = { + /** APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources */ + apiVersion?: string; + counts: ResourceStats[]; + /** Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds */ + kind?: string; +}; +export type FolderInfo = { + /** The folder description */ + description?: string; + /** This folder does not resolve */ + detached?: boolean; + /** Name is the k8s name (eg, the unique identifier) for a folder */ + name: string; + /** The parent folder UID */ + parent?: string; + /** Title is the display value */ + title: string; +}; +export type FolderInfoList = { + /** APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources */ + apiVersion?: string; + items: FolderInfo[]; + /** Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds */ + kind?: string; + metadata?: ListMeta; +}; diff --git a/public/app/api/clients/folder/v1beta1/index.ts b/public/app/api/clients/folder/v1beta1/index.ts index 9c23e74f2b6..eed6f857ce7 100644 --- a/public/app/api/clients/folder/v1beta1/index.ts +++ b/public/app/api/clients/folder/v1beta1/index.ts @@ -5,4 +5,4 @@ export const folderAPIv1beta1 = generatedAPI.enhanceEndpoints({}); export const { useGetFolderQuery } = folderAPIv1beta1; // eslint-disable-next-line no-barrel-files/no-barrel-files -export { type Folder } from './endpoints.gen'; +export { type Folder, type FolderList } from './endpoints.gen'; diff --git a/public/app/core/components/NestedFolderPicker/NestedFolderPicker.tsx b/public/app/core/components/NestedFolderPicker/NestedFolderPicker.tsx index 46ab779d97f..28305640a2a 100644 --- a/public/app/core/components/NestedFolderPicker/NestedFolderPicker.tsx +++ b/public/app/core/components/NestedFolderPicker/NestedFolderPicker.tsx @@ -20,8 +20,9 @@ import { PermissionLevelString } from 'app/types'; import { FolderRepo } from './FolderRepo'; import { getDOMId, NestedFolderList } from './NestedFolderList'; import Trigger from './Trigger'; -import { ROOT_FOLDER_ITEM, useFoldersQuery } from './useFoldersQuery'; +import { useFoldersQuery } from './useFoldersQuery'; import { useTreeInteractions } from './useTreeInteractions'; +import { ROOT_FOLDER_ITEM } from './utils'; export interface NestedFolderPickerProps { /* Folder UID to show as selected */ diff --git a/public/app/core/components/NestedFolderPicker/useFoldersQuery.test.tsx b/public/app/core/components/NestedFolderPicker/useFoldersQuery.test.tsx new file mode 100644 index 00000000000..d715d57c81d --- /dev/null +++ b/public/app/core/components/NestedFolderPicker/useFoldersQuery.test.tsx @@ -0,0 +1,116 @@ +import { act, renderHook } from '@testing-library/react'; + +import { GrafanaConfig } from '@grafana/data'; +import * as runtime from '@grafana/runtime'; +import { DashboardsTreeItem } from 'app/features/browse-dashboards/types'; + +import { DashboardViewItem } from '../../../features/search/types'; + +import { useFoldersQuery } from './useFoldersQuery'; +import { ROOT_FOLDER_ITEM } from './utils'; + +const PAGE_SIZE = 10; + +const legacyResponse = { + status: 'fulfilled', + originalArgs: { parentUid: undefined, page: 1, limit: PAGE_SIZE, permission: 'Edit' }, + data: [{ title: 'Legacy Folder', uid: 'legacy1', managedBy: undefined }], +}; +// Mock the legacy API client +jest.mock('app/features/browse-dashboards/api/browseDashboardsAPI', () => { + const PAGE_SIZE = 10; + return { + PAGE_SIZE, + browseDashboardsAPI: { + endpoints: { + listFolders: { + select: jest.fn(() => () => legacyResponse), + initiate: jest.fn(() => ({ + arg: { parentUid: undefined, page: 1, limit: PAGE_SIZE, permission: 'Edit' }, + unsubscribe: jest.fn(), + })), + }, + }, + }, + }; +}); + +const appPlatfromResponse = { + status: 'fulfilled', + originalArgs: { name: 'general' }, + data: { + items: [ + { + metadata: { name: 'app1', annotations: {} }, + spec: { title: 'AppPlatform Folder' }, + }, + ], + }, +}; + +// Mock the appPlatform API client +jest.mock('app/api/clients/folder/v1beta1', () => ({ + folderAPIv1beta1: { + endpoints: { + getFolderChildren: { + select: jest.fn(() => () => appPlatfromResponse), + initiate: jest.fn((arg: unknown) => ({ + arg, + unsubscribe: jest.fn(), + })), + }, + }, + }, +})); + +// Mock getPaginationPlaceholders to return empty array for simplicity +jest.mock('app/features/browse-dashboards/state/utils', () => ({ + getPaginationPlaceholders: jest.fn((): DashboardsTreeItem[] => []), +})); + +// Mock useDispatch and useSelector to just pass through +jest.mock('app/types/store', () => { + const mod = jest.requireActual('app/types/store'); + return { + ...mod, + useDispatch: () => (val: unknown) => val, + useSelector: (selector: Function) => selector(), + }; +}); + +describe('useFoldersQuery', () => { + let configBackup: GrafanaConfig; + + beforeAll(() => { + configBackup = { ...runtime.config }; + }); + + afterAll(() => { + runtime.config.featureToggles = configBackup.featureToggles; + }); + + it('returns data using legacy api', () => { + runtime.config.featureToggles.foldersAppPlatformAPI = false; + const items = testFn(); + expect((items[1].item as DashboardViewItem).title).toBe('Legacy Folder'); + }); + + it('returns appPlatform hook result when foldersAppPlatformAPI is on', () => { + runtime.config.featureToggles.foldersAppPlatformAPI = true; + const items = testFn(); + expect((items[1].item as DashboardViewItem).title).toBe('AppPlatform Folder'); + }); +}); + +function testFn() { + const { result } = renderHook(() => useFoldersQuery(true, {})); + + expect(result.current.items).toEqual([ROOT_FOLDER_ITEM]); + expect(result.current.isLoading).toBe(false); + act(() => { + result.current.requestNextPage(undefined); + }); + + expect(result.current.items.length).toBe(2); + return result.current.items; +} diff --git a/public/app/core/components/NestedFolderPicker/useFoldersQuery.ts b/public/app/core/components/NestedFolderPicker/useFoldersQuery.ts index ce95c660ee1..bd3b6ba9098 100644 --- a/public/app/core/components/NestedFolderPicker/useFoldersQuery.ts +++ b/public/app/core/components/NestedFolderPicker/useFoldersQuery.ts @@ -1,199 +1,19 @@ -import { createSelector } from '@reduxjs/toolkit'; -import { QueryDefinition, BaseQueryFn, QueryActionCreatorResult } from '@reduxjs/toolkit/query'; -import { RequestOptions } from 'http'; -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { config } from '@grafana/runtime'; -import { ListFolderQueryArgs, browseDashboardsAPI } from 'app/features/browse-dashboards/api/browseDashboardsAPI'; -import { PAGE_SIZE } from 'app/features/browse-dashboards/api/services'; -import { getPaginationPlaceholders } from 'app/features/browse-dashboards/state/utils'; -import { DashboardViewItemWithUIItems, DashboardsTreeItem } from 'app/features/browse-dashboards/types'; -import { FolderListItemDTO, PermissionLevelString } from 'app/types'; -import { useDispatch, useSelector } from 'app/types/store'; +import { PermissionLevelString } from '../../../types'; -type ListFoldersQuery = ReturnType>; -type ListFoldersRequest = QueryActionCreatorResult< - QueryDefinition< - ListFolderQueryArgs, - BaseQueryFn, - 'getFolder', - FolderListItemDTO[], - 'browseDashboardsAPI' - > ->; +import { useFoldersQueryAppPlatform } from './useFoldersQueryAppPlatform'; +import { useFoldersQueryLegacy } from './useFoldersQueryLegacy'; -const PENDING_STATUS = 'pending'; - -/** - * Returns whether the set of pages are 'fully loaded', the last page number, and if the last page is currently loading - */ -function getPagesLoadStatus(pages: ListFoldersQuery[]): [boolean, number | undefined, boolean] { - const lastPage = pages.at(-1); - const lastPageNumber = lastPage?.originalArgs?.page; - const lastPageLoading = lastPage?.status === PENDING_STATUS; - - if (!lastPage?.data) { - // If there's no pages yet, or the last page is still loading - return [false, lastPageNumber, lastPageLoading]; - } else { - return [lastPage.data.length < lastPage.originalArgs.limit, lastPageNumber, lastPageLoading]; - } -} - -/** - * Returns a loaded folder hierarchy as a flat list and a function to load more pages. - */ export function useFoldersQuery( isBrowsing: boolean, openFolders: Record, permission?: PermissionLevelString ) { - const dispatch = useDispatch(); + const resultLegacy = useFoldersQueryLegacy(isBrowsing, openFolders, permission); + const resultAppPlatform = useFoldersQueryAppPlatform(isBrowsing, openFolders); - // Keep a list of all request subscriptions so we can unsubscribe from them when the component is unmounted - const requestsRef = useRef([]); - - // Keep a list of selectors for dynamic state selection - const [selectors, setSelectors] = useState< - Array> - >([]); - - const listAllFoldersSelector = useMemo(() => { - return createSelector(selectors, (...pages) => { - let isLoading = false; - const rootPages: ListFoldersQuery[] = []; - const pagesByParent: Record = {}; - - for (const page of pages) { - if (page.status === PENDING_STATUS) { - isLoading = true; - } - - const parentUid = page.originalArgs?.parentUid; - if (parentUid) { - if (!pagesByParent[parentUid]) { - pagesByParent[parentUid] = []; - } - - pagesByParent[parentUid].push(page); - } else { - rootPages.push(page); - } - } - - return { - isLoading, - rootPages, - pagesByParent, - }; - }); - }, [selectors]); - - const state = useSelector(listAllFoldersSelector); - - // Loads the next page of folders for the given parent UID by inspecting the - // state to determine what the next page is - const requestNextPage = useCallback( - (parentUid: string | undefined) => { - const pages = parentUid ? state.pagesByParent[parentUid] : state.rootPages; - const [fullyLoaded, pageNumber, lastPageLoading] = getPagesLoadStatus(pages ?? []); - - // If fully loaded or the last page is still loading, don't request a new page - if (fullyLoaded || lastPageLoading) { - return; - } - - const args = { parentUid, page: (pageNumber ?? 0) + 1, limit: PAGE_SIZE, permission }; - const subscription = dispatch(browseDashboardsAPI.endpoints.listFolders.initiate(args)); - - const selector = browseDashboardsAPI.endpoints.listFolders.select({ - parentUid: subscription.arg.parentUid, - page: subscription.arg.page, - limit: subscription.arg.limit, - permission: subscription.arg.permission, - }); - - setSelectors((pages) => pages.concat(selector)); - - // the subscriptions are saved in a ref so they can be unsubscribed on unmount - requestsRef.current = requestsRef.current.concat([subscription]); - }, - [state, dispatch, permission] - ); - - // Unsubscribe from all requests when the component is unmounted - useEffect(() => { - return () => { - for (const req of requestsRef.current) { - req.unsubscribe(); - } - }; - }, []); - - // Convert the individual responses into a flat list of folders, with level indicating - // the depth in the hierarchy. - const treeList = useMemo(() => { - if (!isBrowsing) { - return []; - } - - function createFlatList( - parentUid: string | undefined, - pages: ListFoldersQuery[], - level: number - ): Array> { - const flatList = pages.flatMap((page) => { - const pageItems = page.data ?? []; - - return pageItems.flatMap((item) => { - const folderIsOpen = openFolders[item.uid]; - const flatItem: DashboardsTreeItem = { - isOpen: Boolean(folderIsOpen), - level: level, - item: { - kind: 'folder' as const, - title: item.title, - uid: item.uid, - managedBy: item.managedBy, - }, - }; - - const childPages = folderIsOpen && state.pagesByParent[item.uid]; - if (childPages) { - const childFlatItems = createFlatList(item.uid, childPages, level + 1); - return [flatItem, ...childFlatItems]; - } - - return flatItem; - }); - }); - - const [fullyLoaded] = getPagesLoadStatus(pages); - if (!fullyLoaded) { - flatList.push(...getPaginationPlaceholders(PAGE_SIZE, parentUid, level)); - } - - return flatList; - } - - const rootFlatTree = createFlatList(undefined, state.rootPages, 1); - rootFlatTree.unshift(ROOT_FOLDER_ITEM); - - return rootFlatTree; - }, [state, isBrowsing, openFolders]); - - return { - items: treeList, - isLoading: state.isLoading, - requestNextPage, - }; + // Running the hooks themselves don't have any side effects, so we can just conditionally use one or the other + // requestNextPage function from the result + return config.featureToggles.foldersAppPlatformAPI ? resultAppPlatform : resultLegacy; } - -export const ROOT_FOLDER_ITEM = { - isOpen: true, - level: 0, - item: { - kind: 'folder' as const, - title: 'Dashboards', - uid: '', - }, -}; diff --git a/public/app/core/components/NestedFolderPicker/useFoldersQueryAppPlatform.ts b/public/app/core/components/NestedFolderPicker/useFoldersQueryAppPlatform.ts new file mode 100644 index 00000000000..93817d6a9c8 --- /dev/null +++ b/public/app/core/components/NestedFolderPicker/useFoldersQueryAppPlatform.ts @@ -0,0 +1,164 @@ +import { createSelector } from '@reduxjs/toolkit'; +import { QueryStatus } from '@reduxjs/toolkit/query'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; + +import { folderAPIv1beta1 } from 'app/api/clients/folder/v1beta1'; +import { DashboardViewItemWithUIItems, DashboardsTreeItem } from 'app/features/browse-dashboards/types'; +import { useDispatch, useSelector } from 'app/types/store'; + +import { AnnoKeyManagerKind, ManagerKind } from '../../../features/apiserver/types'; +import { PAGE_SIZE } from '../../../features/browse-dashboards/api/services'; +import { getPaginationPlaceholders } from '../../../features/browse-dashboards/state/utils'; + +import { ROOT_FOLDER_ITEM } from './utils'; + +type GetFolderChildrenQuery = ReturnType>; +type GetFolderChildrenRequest = { + unsubscribe: () => void; +}; + +const rootFolderToken = 'general'; +const collator = new Intl.Collator(); + +/** + * Returns a loaded folder hierarchy as a flat list and a function to load folders. + * This version uses the getFolderChildren API from the folder v1beta1 API. Compared to legacy API, the v1beta1 API + * does not have pagination at the moment. + */ +export function useFoldersQueryAppPlatform(isBrowsing: boolean, openFolders: Record) { + const dispatch = useDispatch(); + + // Keep a list of all request subscriptions so we can unsubscribe from them when the component is unmounted + const requestsRef = useRef([]); + + // Keep a list of selectors for dynamic state selection + const [selectors, setSelectors] = useState< + Array> + >([]); + + // This is an aggregated dynamic selector of all the selectors for all the request issued while loading the folder + // tree and returns the whole tree that was loaded so far. + const listAllFoldersSelector = useMemo(() => { + return createSelector(selectors, (...responses) => { + // Returns loading true if any of the responses is still loading + let isLoading = false; + + const responseByParent: Record = {}; + + for (const response of responses) { + if (response.status === QueryStatus.pending) { + isLoading = true; + } + + const parentName = response.originalArgs?.name; + if (parentName) { + responseByParent[parentName] = response; + } + } + + return { + isLoading, + responseByParent, + }; + }); + }, [selectors]); + + const state = useSelector(listAllFoldersSelector); + + // Loads folders for the given parent UID + const requestNextPage = useCallback( + (parentUid: string | undefined) => { + const finalParentUid = parentUid ?? rootFolderToken; + const response = state.responseByParent[finalParentUid]; + const isLoading = response?.status === QueryStatus.pending; + + // If already loading, don't request again + if (isLoading) { + return; + } + + const args = { name: finalParentUid }; + + // Make a request + const subscription = dispatch(folderAPIv1beta1.endpoints.getFolderChildren.initiate(args)); + + // Add selector for the response to the list so we can then have an aggregated selector for all the folders + const selector = folderAPIv1beta1.endpoints.getFolderChildren.select(args); + setSelectors((selectors) => selectors.concat(selector)); + + // the subscriptions are saved in a ref so they can be unsubscribed on unmount + requestsRef.current = requestsRef.current.concat([subscription]); + }, + [state, dispatch] + ); + + // Unsubscribe from all requests when the component is unmounted + useEffect(() => { + return () => { + for (const req of requestsRef.current) { + req.unsubscribe(); + } + }; + }, []); + + // Convert the individual responses into a flat list of folders, with level indicating + // the depth in the hierarchy. + const treeList = useMemo(() => { + if (!isBrowsing) { + return []; + } + + function createFlatList( + parentUid: string | undefined, + response: GetFolderChildrenQuery | undefined, + level: number + ): Array> { + let folders = response?.data?.items ? [...response.data.items] : []; + folders.sort((a, b) => collator.compare(a.spec.title, b.spec.title)); + + const list = folders.flatMap((item) => { + const name = item.metadata.name!; + const folderIsOpen = openFolders[name]; + const flatItem: DashboardsTreeItem = { + isOpen: Boolean(folderIsOpen), + level: level, + item: { + kind: 'folder' as const, + title: item.spec.title, + // We use resource name as UID because well, not sure what metadata.uid would be used for now as you cannot + // query by it. + uid: name, + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + managedBy: item.metadata?.annotations?.[AnnoKeyManagerKind] as ManagerKind | undefined, + }, + }; + + const childResponse = folderIsOpen && state.responseByParent[name]; + if (childResponse) { + const childFlatItems = createFlatList(name, childResponse, level + 1); + return [flatItem, ...childFlatItems]; + } + + return flatItem; + }); + + if (!response) { + // The pagination placeholders are what actually triggers the call to the next page. So if there is no response, + // meaning to request for some children, we add these placeholders, and they will trigger the load. + list.push(...getPaginationPlaceholders(PAGE_SIZE, parentUid, level)); + } + return list; + } + + const rootFlatTree = createFlatList(rootFolderToken, state.responseByParent[rootFolderToken], 1); + rootFlatTree.unshift(ROOT_FOLDER_ITEM); + + return rootFlatTree; + }, [state, isBrowsing, openFolders]); + + return { + items: treeList, + isLoading: state.isLoading, + requestNextPage, + }; +} diff --git a/public/app/core/components/NestedFolderPicker/useFoldersQueryLegacy.ts b/public/app/core/components/NestedFolderPicker/useFoldersQueryLegacy.ts new file mode 100644 index 00000000000..6b1286895bd --- /dev/null +++ b/public/app/core/components/NestedFolderPicker/useFoldersQueryLegacy.ts @@ -0,0 +1,191 @@ +import { createSelector } from '@reduxjs/toolkit'; +import { QueryDefinition, BaseQueryFn, QueryActionCreatorResult } from '@reduxjs/toolkit/query'; +import { RequestOptions } from 'http'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; + +import { ListFolderQueryArgs, browseDashboardsAPI } from 'app/features/browse-dashboards/api/browseDashboardsAPI'; +import { PAGE_SIZE } from 'app/features/browse-dashboards/api/services'; +import { getPaginationPlaceholders } from 'app/features/browse-dashboards/state/utils'; +import { DashboardViewItemWithUIItems, DashboardsTreeItem } from 'app/features/browse-dashboards/types'; +import { FolderListItemDTO, PermissionLevelString } from 'app/types'; +import { useDispatch, useSelector } from 'app/types/store'; + +import { ROOT_FOLDER_ITEM } from './utils'; + +type ListFoldersQuery = ReturnType>; +type ListFoldersRequest = QueryActionCreatorResult< + QueryDefinition< + ListFolderQueryArgs, + BaseQueryFn, + 'getFolder', + FolderListItemDTO[], + 'browseDashboardsAPI' + > +>; + +const PENDING_STATUS = 'pending'; + +/** + * Returns whether the set of pages are 'fully loaded', the last page number, and if the last page is currently loading + */ +function getPagesLoadStatus(pages: ListFoldersQuery[]): [boolean, number | undefined, boolean] { + const lastPage = pages.at(-1); + const lastPageNumber = lastPage?.originalArgs?.page; + const lastPageLoading = lastPage?.status === PENDING_STATUS; + + if (!lastPage?.data) { + // If there's no pages yet, or the last page is still loading + return [false, lastPageNumber, lastPageLoading]; + } else { + return [lastPage.data.length < lastPage.originalArgs.limit, lastPageNumber, lastPageLoading]; + } +} + +/** + * Returns a loaded folder hierarchy as a flat list and a function to load more pages. + */ +export function useFoldersQueryLegacy( + isBrowsing: boolean, + openFolders: Record, + permission?: PermissionLevelString +) { + const dispatch = useDispatch(); + + // Keep a list of all request subscriptions so we can unsubscribe from them when the component is unmounted + const requestsRef = useRef([]); + + // Keep a list of selectors for dynamic state selection + const [selectors, setSelectors] = useState< + Array> + >([]); + + const listAllFoldersSelector = useMemo(() => { + return createSelector(selectors, (...pages) => { + let isLoading = false; + const rootPages: ListFoldersQuery[] = []; + const pagesByParent: Record = {}; + + for (const page of pages) { + if (page.status === PENDING_STATUS) { + isLoading = true; + } + + const parentUid = page.originalArgs?.parentUid; + if (parentUid) { + if (!pagesByParent[parentUid]) { + pagesByParent[parentUid] = []; + } + + pagesByParent[parentUid].push(page); + } else { + rootPages.push(page); + } + } + + return { + isLoading, + rootPages, + pagesByParent, + }; + }); + }, [selectors]); + + const state = useSelector(listAllFoldersSelector); + + // Loads the next page of folders for the given parent UID by inspecting the + // state to determine what the next page is + const requestNextPage = useCallback( + (parentUid: string | undefined) => { + const pages = parentUid ? state.pagesByParent[parentUid] : state.rootPages; + const [fullyLoaded, pageNumber, lastPageLoading] = getPagesLoadStatus(pages ?? []); + + // If fully loaded or the last page is still loading, don't request a new page + if (fullyLoaded || lastPageLoading) { + return; + } + + const args = { parentUid, page: (pageNumber ?? 0) + 1, limit: PAGE_SIZE, permission }; + const subscription = dispatch(browseDashboardsAPI.endpoints.listFolders.initiate(args)); + + const selector = browseDashboardsAPI.endpoints.listFolders.select({ + parentUid: subscription.arg.parentUid, + page: subscription.arg.page, + limit: subscription.arg.limit, + permission: subscription.arg.permission, + }); + + setSelectors((pages) => pages.concat(selector)); + + // the subscriptions are saved in a ref so they can be unsubscribed on unmount + requestsRef.current = requestsRef.current.concat([subscription]); + }, + [state, dispatch, permission] + ); + + // Unsubscribe from all requests when the component is unmounted + useEffect(() => { + return () => { + for (const req of requestsRef.current) { + req.unsubscribe(); + } + }; + }, []); + + // Convert the individual responses into a flat list of folders, with level indicating + // the depth in the hierarchy. + const treeList = useMemo(() => { + if (!isBrowsing) { + return []; + } + + function createFlatList( + parentUid: string | undefined, + pages: ListFoldersQuery[], + level: number + ): Array> { + const flatList = pages.flatMap((page) => { + const pageItems = page.data ?? []; + + return pageItems.flatMap((item) => { + const folderIsOpen = openFolders[item.uid]; + const flatItem: DashboardsTreeItem = { + isOpen: Boolean(folderIsOpen), + level: level, + item: { + kind: 'folder' as const, + title: item.title, + uid: item.uid, + managedBy: item.managedBy, + }, + }; + + const childPages = folderIsOpen && state.pagesByParent[item.uid]; + if (childPages) { + const childFlatItems = createFlatList(item.uid, childPages, level + 1); + return [flatItem, ...childFlatItems]; + } + + return flatItem; + }); + }); + + const [fullyLoaded] = getPagesLoadStatus(pages); + if (!fullyLoaded) { + flatList.push(...getPaginationPlaceholders(PAGE_SIZE, parentUid, level)); + } + + return flatList; + } + + const rootFlatTree = createFlatList(undefined, state.rootPages, 1); + rootFlatTree.unshift(ROOT_FOLDER_ITEM); + + return rootFlatTree; + }, [state, isBrowsing, openFolders]); + + return { + items: treeList, + isLoading: state.isLoading, + requestNextPage, + }; +} diff --git a/public/app/core/components/NestedFolderPicker/utils.ts b/public/app/core/components/NestedFolderPicker/utils.ts new file mode 100644 index 00000000000..9438485ce1d --- /dev/null +++ b/public/app/core/components/NestedFolderPicker/utils.ts @@ -0,0 +1,9 @@ +export const ROOT_FOLDER_ITEM = { + isOpen: true, + level: 0, + item: { + kind: 'folder' as const, + title: 'Dashboards', + uid: '', + }, +}; diff --git a/scripts/generate-rtk-apis.ts b/scripts/generate-rtk-apis.ts index 01f292be360..792594a91e1 100644 --- a/scripts/generate-rtk-apis.ts +++ b/scripts/generate-rtk-apis.ts @@ -57,7 +57,6 @@ const config: ConfigFile = { '../public/app/api/clients/folder/v1beta1/endpoints.gen.ts': { apiFile: '../public/app/api/clients/folder/v1beta1/baseAPI.ts', schemaFile: '../data/openapi/folder.grafana.app-v1beta1.json', - filterEndpoints: ['getFolder'], tag: true, }, '../public/app/api/clients/advisor/v0alpha1/endpoints.gen.ts': { From aa22cf9e1f4df4ab83ba9f54824b1d7392812d61 Mon Sep 17 00:00:00 2001 From: ismail simsek Date: Thu, 3 Jul 2025 16:16:23 +0200 Subject: [PATCH 14/19] Prometheus: Don't use empty matcher if there is no match parameter (#107569) * don't use empty matcher * nit updates --- packages/grafana-prometheus/src/constants.ts | 5 +++-- .../grafana-prometheus/src/datasource.test.ts | 6 +++--- packages/grafana-prometheus/src/datasource.ts | 12 +++++++++-- .../src/language_provider.test.ts | 12 +++++------ .../src/language_provider.ts | 10 +++++----- .../src/resource_clients.ts | 20 +++++++++---------- 6 files changed, 37 insertions(+), 28 deletions(-) diff --git a/packages/grafana-prometheus/src/constants.ts b/packages/grafana-prometheus/src/constants.ts index f54ed124c20..2c8dffa179d 100644 --- a/packages/grafana-prometheus/src/constants.ts +++ b/packages/grafana-prometheus/src/constants.ts @@ -19,8 +19,9 @@ export const EMPTY_SELECTOR = '{}'; export const DEFAULT_SERIES_LIMIT = 40000; -export const MATCH_ALL_LABELS_STR = '__name__!=""'; - +/** + * Only for /series endpoint. Don't use this anywhere else as it cause an expensive query + */ export const MATCH_ALL_LABELS = '{__name__!=""}'; export const METRIC_LABEL = '__name__'; diff --git a/packages/grafana-prometheus/src/datasource.test.ts b/packages/grafana-prometheus/src/datasource.test.ts index 5b18f5e2e97..c5fc15d6a8f 100644 --- a/packages/grafana-prometheus/src/datasource.test.ts +++ b/packages/grafana-prometheus/src/datasource.test.ts @@ -1016,7 +1016,7 @@ describe('PrometheusDatasource', () => { ]; const result = extractResourceMatcher(queries, filters); - expect(result).toBe('{__name__!="",instance="localhost"}'); + expect(result).toBe('{instance="localhost"}'); }); it('should extract matcher from given filters only', () => { @@ -1035,7 +1035,7 @@ describe('PrometheusDatasource', () => { ]; const result = extractResourceMatcher(queries, filters); - expect(result).toBe('{__name__!="",instance="localhost",job!="testjob"}'); + expect(result).toBe('{instance="localhost",job!="testjob"}'); }); it('should extract matcher as match-all from no query and filter', () => { @@ -1043,7 +1043,7 @@ describe('PrometheusDatasource', () => { const filters: AdHocVariableFilter[] = []; const result = extractResourceMatcher(queries, filters); - expect(result).toBe('{__name__!=""}'); + expect(result).toBeUndefined(); }); it('should extract the correct matcher for queries with `... or vector(0)`', () => { diff --git a/packages/grafana-prometheus/src/datasource.ts b/packages/grafana-prometheus/src/datasource.ts index 204b452efd6..1cc48500a80 100644 --- a/packages/grafana-prometheus/src/datasource.ts +++ b/packages/grafana-prometheus/src/datasource.ts @@ -913,7 +913,10 @@ export function extractRuleMappingFromGroups(groups: RawRecordingRules[]): RuleQ * adhocFilters={key:"instance", operator:"=", value:"localhost"} * returns {__name__=~"metricName", instance="localhost"} */ -export const extractResourceMatcher = (queries: PromQuery[], adhocFilters: AdHocVariableFilter[]): string => { +export const extractResourceMatcher = ( + queries: PromQuery[], + adhocFilters: AdHocVariableFilter[] +): string | undefined => { // Extract metric names from queries we have already const metricMatch = populateMatchParamsFromQueries(queries); const labelFilters: QueryBuilderLabelFilter[] = adhocFilters.map((f) => ({ @@ -923,6 +926,11 @@ export const extractResourceMatcher = (queries: PromQuery[], adhocFilters: AdHoc })); // Extract label filters from the filters we have already const labelsMatch = renderLabelsWithoutBrackets(labelFilters); + + if (metricMatch.length === 0 && labelsMatch.length === 0) { + return undefined; + } + // Create a matcher using metric names and label filters - return `{${[metricMatch, ...labelsMatch].join(',')}}`; + return `{${[...metricMatch, ...labelsMatch].join(',')}}`; }; diff --git a/packages/grafana-prometheus/src/language_provider.test.ts b/packages/grafana-prometheus/src/language_provider.test.ts index 5d7396cda95..874c07bc151 100644 --- a/packages/grafana-prometheus/src/language_provider.test.ts +++ b/packages/grafana-prometheus/src/language_provider.test.ts @@ -1042,18 +1042,18 @@ describe('PrometheusLanguageProvider with feature toggle', () => { { expr: 'metric2', refId: '2' }, ]; const result = populateMatchParamsFromQueries(queries); - expect(result).toBe(`__name__=~"metric1|metric2"`); + expect(result).toEqual([`__name__=~"metric1|metric2"`]); }); it('should handle binary queries', () => { const queries: PromQuery[] = [{ expr: 'binary{label="val"} + second{}', refId: '1' }]; const result = populateMatchParamsFromQueries(queries); - expect(result).toBe(`__name__=~"binary|second"`); + expect(result).toEqual([`__name__=~"binary|second"`]); }); it('should handle undefined queries', () => { const result = populateMatchParamsFromQueries(undefined); - expect(result).toBe('__name__!=""'); + expect(result).toEqual([]); }); it('should handle UTF8 metrics', () => { @@ -1071,13 +1071,13 @@ describe('PrometheusLanguageProvider with feature toggle', () => { it('should return match-all matcher if there is no expr in queries', () => { const queries: PromQuery[] = [{ expr: '', refId: '1' }]; const result = populateMatchParamsFromQueries(queries); - expect(result).toBe('__name__!=""'); + expect(result).toEqual([]); }); it('should return match-all matcher if there is no query', () => { const queries: PromQuery[] = []; const result = populateMatchParamsFromQueries(queries); - expect(result).toBe('__name__!=""'); + expect(result).toEqual([]); }); it('should extract the correct matcher for queries with `... or vector(0)`', () => { @@ -1088,7 +1088,7 @@ describe('PrometheusLanguageProvider with feature toggle', () => { }, ]; const result = populateMatchParamsFromQueries(queries); - expect(result).toBe('__name__=~"go_cpu_classes_idle_cpu_seconds_total"'); + expect(result).toEqual(['__name__=~"go_cpu_classes_idle_cpu_seconds_total"']); }); }); }); diff --git a/packages/grafana-prometheus/src/language_provider.ts b/packages/grafana-prometheus/src/language_provider.ts index a61be690cb8..0b1495aa288 100644 --- a/packages/grafana-prometheus/src/language_provider.ts +++ b/packages/grafana-prometheus/src/language_provider.ts @@ -18,7 +18,7 @@ import { BackendSrvRequest } from '@grafana/runtime'; import { buildCacheHeaders, getDaysToCacheMetadata, getDefaultCacheHeaders } from './caching'; import { Label } from './components/monaco-query-field/monaco-completion-provider/situation'; -import { DEFAULT_SERIES_LIMIT, MATCH_ALL_LABELS_STR, EMPTY_SELECTOR, REMOVE_SERIES_LIMIT } from './constants'; +import { DEFAULT_SERIES_LIMIT, EMPTY_SELECTOR, REMOVE_SERIES_LIMIT } from './constants'; import { PrometheusDatasource } from './datasource'; import { extractLabelMatchers, @@ -796,11 +796,11 @@ function getNameLabelValue(promQuery: string, tokens: Array { +export const populateMatchParamsFromQueries = (queries?: PromQuery[]): string[] => { if (!queries) { - return MATCH_ALL_LABELS_STR; + return []; } const metrics = (queries ?? []).reduce((params, query) => { @@ -818,5 +818,5 @@ export const populateMatchParamsFromQueries = (queries?: PromQuery[]): string => return params; }, []); - return metrics.length === 0 ? MATCH_ALL_LABELS_STR : `__name__=~"${metrics.join('|')}"`; + return metrics.length === 0 ? [] : [`__name__=~"${metrics.join('|')}"`]; }; diff --git a/packages/grafana-prometheus/src/resource_clients.ts b/packages/grafana-prometheus/src/resource_clients.ts index b5f01e93aa4..04ab0559274 100644 --- a/packages/grafana-prometheus/src/resource_clients.ts +++ b/packages/grafana-prometheus/src/resource_clients.ts @@ -73,7 +73,7 @@ export abstract class BaseResourceClient { * @param {string} match - Label matcher to filter time series * @param {string} limit - Maximum number of series to return */ - public querySeries = async (timeRange: TimeRange, match: string, limit: number) => { + public querySeries = async (timeRange: TimeRange, match: string | undefined, limit: number) => { const effectiveMatch = !match || match === EMPTY_SELECTOR ? MATCH_ALL_LABELS : match; const timeParams = this.datasource.getTimeRangeParams(timeRange); const searchParams = { ...timeParams, 'match[]': effectiveMatch, limit }; @@ -97,7 +97,7 @@ export class LabelsApiClient extends BaseResourceClient implements ResourceApiCl public queryMetrics = async (timeRange: TimeRange): Promise<{ metrics: string[]; histogramMetrics: string[] }> => { this.metrics = await this.queryLabelValues(timeRange, METRIC_LABEL); this.histogramMetrics = processHistogramMetrics(this.metrics); - this._cache.setLabelValues(timeRange, MATCH_ALL_LABELS, DEFAULT_SERIES_LIMIT, this.metrics); + this._cache.setLabelValues(timeRange, undefined, DEFAULT_SERIES_LIMIT, this.metrics); return { metrics: this.metrics, histogramMetrics: this.histogramMetrics }; }; @@ -177,19 +177,19 @@ export class SeriesApiClient extends BaseResourceClient implements ResourceApiCl }; public queryMetrics = async (timeRange: TimeRange): Promise<{ metrics: string[]; histogramMetrics: string[] }> => { - const series = await this.querySeries(timeRange, MATCH_ALL_LABELS, DEFAULT_SERIES_LIMIT); + const series = await this.querySeries(timeRange, undefined, DEFAULT_SERIES_LIMIT); const { metrics, labelKeys } = processSeries(series, METRIC_LABEL); this.metrics = metrics; this.histogramMetrics = processHistogramMetrics(this.metrics); this.labelKeys = labelKeys; - this._cache.setLabelValues(timeRange, MATCH_ALL_LABELS, DEFAULT_SERIES_LIMIT, metrics); - this._cache.setLabelKeys(timeRange, MATCH_ALL_LABELS, DEFAULT_SERIES_LIMIT, labelKeys); + this._cache.setLabelValues(timeRange, undefined, DEFAULT_SERIES_LIMIT, metrics); + this._cache.setLabelKeys(timeRange, undefined, DEFAULT_SERIES_LIMIT, labelKeys); return { metrics: this.metrics, histogramMetrics: this.histogramMetrics }; }; public queryLabelKeys = async (timeRange: TimeRange, match?: string, limit?: number): Promise => { const effectiveLimit = this.getEffectiveLimit(limit); - const effectiveMatch = !match || match === EMPTY_SELECTOR ? MATCH_ALL_LABELS : match; + const effectiveMatch = !match || match === EMPTY_SELECTOR ? undefined : match; const maybeCachedKeys = this._cache.getLabelKeys(timeRange, effectiveMatch, effectiveLimit); if (maybeCachedKeys) { return maybeCachedKeys; @@ -247,7 +247,7 @@ class ResourceClientsCache { constructor(private cacheLevel: PrometheusCacheLevel = PrometheusCacheLevel.High) {} - public setLabelKeys(timeRange: TimeRange, match: string, limit: number, keys: string[]) { + public setLabelKeys(timeRange: TimeRange, match: string | undefined, limit: number, keys: string[]) { if (keys.length === 0) { return; } @@ -258,7 +258,7 @@ class ResourceClientsCache { this._accessTimestamps[cacheKey] = Date.now(); } - public getLabelKeys(timeRange: TimeRange, match: string, limit: number): string[] | undefined { + public getLabelKeys(timeRange: TimeRange, match: string | undefined, limit: number): string[] | undefined { const cacheKey = this.getCacheKey(timeRange, match, limit, 'key'); const result = this._cache[cacheKey]; if (result) { @@ -268,7 +268,7 @@ class ResourceClientsCache { return result; } - public setLabelValues(timeRange: TimeRange, match: string, limit: number, values: string[]) { + public setLabelValues(timeRange: TimeRange, match: string | undefined, limit: number, values: string[]) { if (values.length === 0) { return; } @@ -289,7 +289,7 @@ class ResourceClientsCache { return result; } - private getCacheKey(timeRange: TimeRange, match: string, limit: number, type: 'key' | 'value') { + private getCacheKey(timeRange: TimeRange, match: string | undefined, limit: number, type: 'key' | 'value') { const snappedTimeRange = getRangeSnapInterval(this.cacheLevel, timeRange); return [snappedTimeRange.start, snappedTimeRange.end, limit, match, type].join('|'); } From cfd3b9f58211f686ce59c6a0567c2a440bab48ac Mon Sep 17 00:00:00 2001 From: Dana Axinte <53751979+dana-axinte@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:21:47 +0100 Subject: [PATCH 15/19] SecretsManager: outbox use message id (#107472) * SecretsManager: outbox use message id Co-authored-by: PoorlyDefinedBehaviour * Remove query timestamp * Add missing query --------- Co-authored-by: PoorlyDefinedBehaviour Co-authored-by: Matheus Macabu Co-authored-by: Matheus Macabu --- .../apis/secret/contracts/outbox_queue.go | 9 +- .../data/secure_value_outbox_append.sql | 2 - .../data/secure_value_outbox_delete.sql | 2 +- .../secure_value_outbox_fetch_message_ids.sql | 6 + .../secure_value_outbox_query_timestamp.sql | 8 + .../data/secure_value_outbox_receiveN.sql | 8 +- ...cure_value_outbox_update_receive_count.sql | 2 +- pkg/storage/secret/metadata/outbox_store.go | 141 ++++++++++++++---- .../secret/metadata/outbox_store_test.go | 22 +-- pkg/storage/secret/metadata/query.go | 46 ++++-- pkg/storage/secret/metadata/query_test.go | 27 ++-- ...value_outbox_append-all-fields-present.sql | 2 - ...alue_outbox_append-no-encrypted-secret.sql | 2 - ...ure_value_outbox_append-no-external-id.sql | 2 - ...ure_value_outbox_append-no-keeper-name.sql | 2 - ...ysql--secure_value_outbox_delete-basic.sql | 2 +- ...e_value_outbox_fetch_message_ids-basic.sql | 6 + ...ql--secure_value_outbox_receiveN-basic.sql | 8 +- ...ate_receive_count-update-receive-count.sql | 2 +- ...value_outbox_append-all-fields-present.sql | 2 - ...alue_outbox_append-no-encrypted-secret.sql | 2 - ...ure_value_outbox_append-no-external-id.sql | 2 - ...ure_value_outbox_append-no-keeper-name.sql | 2 - ...gres--secure_value_outbox_delete-basic.sql | 2 +- ...e_value_outbox_fetch_message_ids-basic.sql | 6 + ...es--secure_value_outbox_receiveN-basic.sql | 8 +- ...ate_receive_count-update-receive-count.sql | 2 +- ...value_outbox_append-all-fields-present.sql | 2 - ...alue_outbox_append-no-encrypted-secret.sql | 2 - ...ure_value_outbox_append-no-external-id.sql | 2 - ...ure_value_outbox_append-no-keeper-name.sql | 2 - ...lite--secure_value_outbox_delete-basic.sql | 2 +- ...e_value_outbox_fetch_message_ids-basic.sql | 6 + ...te--secure_value_outbox_receiveN-basic.sql | 8 +- ...ate_receive_count-update-receive-count.sql | 2 +- pkg/storage/secret/migrator/migrator.go | 4 +- 36 files changed, 236 insertions(+), 119 deletions(-) create mode 100644 pkg/storage/secret/metadata/data/secure_value_outbox_fetch_message_ids.sql create mode 100644 pkg/storage/secret/metadata/data/secure_value_outbox_query_timestamp.sql create mode 100755 pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_fetch_message_ids-basic.sql create mode 100755 pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_fetch_message_ids-basic.sql create mode 100755 pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_fetch_message_ids-basic.sql diff --git a/pkg/registry/apis/secret/contracts/outbox_queue.go b/pkg/registry/apis/secret/contracts/outbox_queue.go index ae5c88ed492..767273b1254 100644 --- a/pkg/registry/apis/secret/contracts/outbox_queue.go +++ b/pkg/registry/apis/secret/contracts/outbox_queue.go @@ -41,7 +41,7 @@ type AppendOutboxMessage struct { type OutboxMessage struct { RequestID string Type OutboxMessageType - MessageID string + MessageID int64 Name string Namespace string EncryptedSecret string @@ -49,15 +49,16 @@ type OutboxMessage struct { ExternalID *string // How many times this message has been received ReceiveCount int + Created int64 } type OutboxQueue interface { // Appends a message to the outbox queue - Append(ctx context.Context, message AppendOutboxMessage) (string, error) + Append(ctx context.Context, message AppendOutboxMessage) (int64, error) // Receives at most n messages from the outbox queue ReceiveN(ctx context.Context, n uint) ([]OutboxMessage, error) // Deletes a message from the outbox queue - Delete(ctx context.Context, messageID string) error + Delete(ctx context.Context, messageID int64) error // Increments the number of times each message has been received by 1. Must be atomic. - IncrementReceiveCount(ctx context.Context, messageIDs []string) error + IncrementReceiveCount(ctx context.Context, messageIDs []int64) error } diff --git a/pkg/storage/secret/metadata/data/secure_value_outbox_append.sql b/pkg/storage/secret/metadata/data/secure_value_outbox_append.sql index 9d6fe5d582a..e541cec3140 100644 --- a/pkg/storage/secret/metadata/data/secure_value_outbox_append.sql +++ b/pkg/storage/secret/metadata/data/secure_value_outbox_append.sql @@ -1,6 +1,5 @@ INSERT INTO {{ .Ident "secret_secure_value_outbox" }} ( {{ .Ident "request_id" }}, - {{ .Ident "uid" }}, {{ .Ident "message_type" }}, {{ .Ident "name" }}, {{ .Ident "namespace" }}, @@ -17,7 +16,6 @@ INSERT INTO {{ .Ident "secret_secure_value_outbox" }} ( {{ .Ident "created" }} ) VALUES ( {{ .Arg .Row.RequestID }}, - {{ .Arg .Row.MessageID }}, {{ .Arg .Row.MessageType }}, {{ .Arg .Row.Name }}, {{ .Arg .Row.Namespace }}, diff --git a/pkg/storage/secret/metadata/data/secure_value_outbox_delete.sql b/pkg/storage/secret/metadata/data/secure_value_outbox_delete.sql index fa3a0c2580a..d23f3808f9c 100644 --- a/pkg/storage/secret/metadata/data/secure_value_outbox_delete.sql +++ b/pkg/storage/secret/metadata/data/secure_value_outbox_delete.sql @@ -1,5 +1,5 @@ DELETE FROM {{ .Ident "secret_secure_value_outbox" }} WHERE - {{ .Ident "uid" }} = {{ .Arg .MessageID }} + {{ .Ident "id" }} = {{ .Arg .MessageID }} ; diff --git a/pkg/storage/secret/metadata/data/secure_value_outbox_fetch_message_ids.sql b/pkg/storage/secret/metadata/data/secure_value_outbox_fetch_message_ids.sql new file mode 100644 index 00000000000..2c53c2223fd --- /dev/null +++ b/pkg/storage/secret/metadata/data/secure_value_outbox_fetch_message_ids.sql @@ -0,0 +1,6 @@ +SELECT + {{ .Ident "id" }} +FROM {{ .Ident "secret_secure_value_outbox" }} +ORDER BY id ASC +LIMIT {{ .Arg .ReceiveLimit }} +; diff --git a/pkg/storage/secret/metadata/data/secure_value_outbox_query_timestamp.sql b/pkg/storage/secret/metadata/data/secure_value_outbox_query_timestamp.sql new file mode 100644 index 00000000000..8e525ca9009 --- /dev/null +++ b/pkg/storage/secret/metadata/data/secure_value_outbox_query_timestamp.sql @@ -0,0 +1,8 @@ +SELECT + {{ .Ident "created" }}, + {{ .Ident "message_type" }} +FROM + {{ .Ident "secret_secure_value_outbox" }} +WHERE + {{ .Ident "id" }} = {{ .Arg .MessageID }} +; diff --git a/pkg/storage/secret/metadata/data/secure_value_outbox_receiveN.sql b/pkg/storage/secret/metadata/data/secure_value_outbox_receiveN.sql index bf5031fdd74..254cb3d3f3d 100644 --- a/pkg/storage/secret/metadata/data/secure_value_outbox_receiveN.sql +++ b/pkg/storage/secret/metadata/data/secure_value_outbox_receiveN.sql @@ -1,6 +1,6 @@ SELECT {{ .Ident "request_id" }}, - {{ .Ident "uid" }}, + {{ .Ident "id" }}, {{ .Ident "message_type" }}, {{ .Ident "name" }}, {{ .Ident "namespace" }}, @@ -11,9 +11,9 @@ SELECT {{ .Ident "created" }} FROM {{ .Ident "secret_secure_value_outbox" }} +WHERE + {{ .Ident "id" }} IN ({{ .ArgList .MessageIDs }}) ORDER BY - {{ .Ident "created" }} ASC -LIMIT - {{ .Arg .ReceiveLimit }} + {{ .Ident "id" }} ASC {{ .SelectFor "UPDATE SKIP LOCKED" }} ; diff --git a/pkg/storage/secret/metadata/data/secure_value_outbox_update_receive_count.sql b/pkg/storage/secret/metadata/data/secure_value_outbox_update_receive_count.sql index 951fed4bdba..610f29695a8 100644 --- a/pkg/storage/secret/metadata/data/secure_value_outbox_update_receive_count.sql +++ b/pkg/storage/secret/metadata/data/secure_value_outbox_update_receive_count.sql @@ -3,5 +3,5 @@ UPDATE SET {{ .Ident "receive_count" }} = {{ .Ident "receive_count" }} + 1 WHERE - {{ .Ident "uid" }} IN ({{ .ArgList .MessageIDs }}) + {{ .Ident "id" }} IN ({{ .ArgList .MessageIDs }}) ; diff --git a/pkg/storage/secret/metadata/outbox_store.go b/pkg/storage/secret/metadata/outbox_store.go index f7a67e74c68..bfc01bb1444 100644 --- a/pkg/storage/secret/metadata/outbox_store.go +++ b/pkg/storage/secret/metadata/outbox_store.go @@ -11,7 +11,6 @@ import ( "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" - "github.com/google/uuid" "github.com/grafana/grafana/pkg/registry/apis/secret/assert" "github.com/grafana/grafana/pkg/registry/apis/secret/contracts" "github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate" @@ -23,7 +22,10 @@ type outboxStore struct { tracer trace.Tracer } -func ProvideOutboxQueue(db contracts.Database, tracer trace.Tracer) contracts.OutboxQueue { +func ProvideOutboxQueue( + db contracts.Database, + tracer trace.Tracer, +) contracts.OutboxQueue { return &outboxStore{ db: db, dialect: sqltemplate.DialectForDriver(db.DriverName()), @@ -33,7 +35,7 @@ func ProvideOutboxQueue(db contracts.Database, tracer trace.Tracer) contracts.Ou type outboxMessageDB struct { RequestID string - MessageID string + MessageID int64 MessageType contracts.OutboxMessageType Name string Namespace string @@ -44,7 +46,7 @@ type outboxMessageDB struct { Created int64 } -func (s *outboxStore) Append(ctx context.Context, input contracts.AppendOutboxMessage) (messageID string, err error) { +func (s *outboxStore) Append(ctx context.Context, input contracts.AppendOutboxMessage) (messageID int64, err error) { ctx, span := s.tracer.Start(ctx, "outboxStore.Append", trace.WithAttributes( attribute.String("name", input.Name), attribute.String("namespace", input.Namespace), @@ -59,8 +61,8 @@ func (s *outboxStore) Append(ctx context.Context, input contracts.AppendOutboxMe span.RecordError(err) } - if messageID != "" { - span.SetAttributes(attribute.String("messageID", messageID)) + if messageID != 0 { + span.SetAttributes(attribute.Int64("messageID", messageID)) } }() @@ -74,7 +76,7 @@ func (s *outboxStore) Append(ctx context.Context, input contracts.AppendOutboxMe return messageID, nil } -func (s *outboxStore) insertMessage(ctx context.Context, input contracts.AppendOutboxMessage) (string, error) { +func (s *outboxStore) insertMessage(ctx context.Context, input contracts.AppendOutboxMessage) (int64, error) { keeperName := sql.NullString{} if input.KeeperName != nil { keeperName = sql.NullString{ @@ -99,13 +101,10 @@ func (s *outboxStore) insertMessage(ctx context.Context, input contracts.AppendO } } - messageID := uuid.New().String() - req := appendSecureValueOutbox{ SQLTemplate: sqltemplate.New(s.dialect), Row: &outboxMessageDB{ RequestID: input.RequestID, - MessageID: messageID, MessageType: input.Type, Name: input.Name, Namespace: input.Namespace, @@ -119,33 +118,46 @@ func (s *outboxStore) insertMessage(ctx context.Context, input contracts.AppendO query, err := sqltemplate.Execute(sqlSecureValueOutboxAppend, req) if err != nil { - return messageID, fmt.Errorf("execute template %q: %w", sqlSecureValueOutboxAppend.Name(), err) + return 0, fmt.Errorf("execute template %q: %w", sqlSecureValueOutboxAppend.Name(), err) } result, err := s.db.ExecContext(ctx, query, req.GetArgs()...) if err != nil { if unifiedsql.IsRowAlreadyExistsError(err) { - return messageID, contracts.ErrSecureValueOperationInProgress + return 0, contracts.ErrSecureValueOperationInProgress } - return messageID, fmt.Errorf("inserting message into secure value outbox table: %w", err) + return 0, fmt.Errorf("inserting message into secure value outbox table: %w", err) } rowsAffected, err := result.RowsAffected() if err != nil { - return messageID, fmt.Errorf("get rows affected: %w", err) + return 0, fmt.Errorf("get rows affected: %w", err) } if rowsAffected != 1 { - return messageID, fmt.Errorf("expected to affect 1 row, but affected %d", rowsAffected) + return 0, fmt.Errorf("expected to affect 1 row, but affected %d", rowsAffected) } - return messageID, nil + id, err := result.LastInsertId() + if err != nil { + return id, fmt.Errorf("fetching last inserted id: %w", err) + } + + return id, nil } -func (s *outboxStore) ReceiveN(ctx context.Context, n uint) ([]contracts.OutboxMessage, error) { +func (s *outboxStore) ReceiveN(ctx context.Context, limit uint) ([]contracts.OutboxMessage, error) { + messageIDs, err := s.fetchMessageIdsInQueue(ctx, limit) + if err != nil { + return nil, fmt.Errorf("fetching message ids from queue: %w", err) + } + // If queue is empty + if len(messageIDs) == 0 { + return nil, nil + } req := receiveNSecureValueOutbox{ - SQLTemplate: sqltemplate.New(s.dialect), - ReceiveLimit: n, + SQLTemplate: sqltemplate.New(s.dialect), + MessageIDs: messageIDs, } query, err := sqltemplate.Execute(sqlSecureValueOutboxReceiveN, req) @@ -197,6 +209,7 @@ func (s *outboxStore) ReceiveN(ctx context.Context, n uint) ([]contracts.OutboxM KeeperName: keeperName, ExternalID: externalID, ReceiveCount: row.ReceiveCount, + Created: row.Created, } if row.MessageType != contracts.DeleteSecretOutboxMessage && row.EncryptedSecret.Valid { @@ -213,9 +226,43 @@ func (s *outboxStore) ReceiveN(ctx context.Context, n uint) ([]contracts.OutboxM return messages, nil } -func (s *outboxStore) Delete(ctx context.Context, messageID string) (err error) { +func (s *outboxStore) fetchMessageIdsInQueue(ctx context.Context, limit uint) ([]int64, error) { + req := fetchMessageIDsOutbox{ + SQLTemplate: sqltemplate.New(s.dialect), + ReceiveLimit: limit, + } + + query, err := sqltemplate.Execute(sqlSecureValueOutboxFetchMessageIDs, req) + if err != nil { + return nil, fmt.Errorf("execute template %q: %w", sqlSecureValueOutboxFetchMessageIDs.Name(), err) + } + + rows, err := s.db.QueryContext(ctx, query, req.GetArgs()...) + if err != nil { + return nil, fmt.Errorf("fetching rows from secure value outbox table: %w", err) + } + defer func() { _ = rows.Close() }() + + messageIDs := make([]int64, 0, limit) + + for rows.Next() { + var id int64 + if err := rows.Scan(&id); err != nil { + return nil, fmt.Errorf("scanning row; %w", err) + } + messageIDs = append(messageIDs, id) + } + + if err := rows.Err(); err != nil { + return nil, fmt.Errorf("reading rows: %w", err) + } + + return messageIDs, nil +} + +func (s *outboxStore) Delete(ctx context.Context, messageID int64) (err error) { ctx, span := s.tracer.Start(ctx, "outboxStore.Append", trace.WithAttributes( - attribute.String("messageID", messageID), + attribute.Int64("messageID", messageID), )) defer span.End() @@ -226,7 +273,7 @@ func (s *outboxStore) Delete(ctx context.Context, messageID string) (err error) } }() - assert.True(messageID != "", "outboxStore.Delete: messageID is required") + assert.True(messageID != 0, "outboxStore.Delete: messageID is required") if err := s.deleteMessage(ctx, messageID); err != nil { return fmt.Errorf("deleting message from outbox table %+w", err) @@ -235,18 +282,56 @@ func (s *outboxStore) Delete(ctx context.Context, messageID string) (err error) return nil } -func (s *outboxStore) deleteMessage(ctx context.Context, messageID string) error { - req := deleteSecureValueOutbox{ +func (s *outboxStore) deleteMessage(ctx context.Context, messageID int64) error { + tsReq := getOutboxMessageTimestamp{ SQLTemplate: sqltemplate.New(s.dialect), MessageID: messageID, } - query, err := sqltemplate.Execute(sqlSecureValueOutboxDelete, req) + // First query the object so we can get the timestamp and calculate the total lifetime + timestampQuery, err := sqltemplate.Execute(sqlSecureValueOutboxQueryTimestamp, tsReq) + if err != nil { + return fmt.Errorf("execute template %q: %w", sqlSecureValueOutboxQueryTimestamp.Name(), err) + } + + rows, err := s.db.QueryContext(ctx, timestampQuery, tsReq.GetArgs()...) + if err != nil { + return fmt.Errorf("querying timestamp from secure value outbox table: %w", err) + } + + if !rows.Next() { + _ = rows.Close() + return fmt.Errorf("no row found for message id=%v", messageID) + } + + var timestamp int64 + var messageType string + if err := rows.Scan(×tamp, &messageType); err != nil { + _ = rows.Close() + return fmt.Errorf("scanning timestamp: %w", err) + } + + // Explicitly close rows and check for errors before proceeding + if err := rows.Close(); err != nil { + return fmt.Errorf("closing rows: %w", err) + } + + if err := rows.Err(); err != nil { + return fmt.Errorf("rows error: %w", err) + } + + // Then delete the object + delReq := deleteSecureValueOutbox{ + SQLTemplate: sqltemplate.New(s.dialect), + MessageID: messageID, + } + + query, err := sqltemplate.Execute(sqlSecureValueOutboxDelete, delReq) if err != nil { return fmt.Errorf("execute template %q: %w", sqlSecureValueOutboxDelete.Name(), err) } - result, err := s.db.ExecContext(ctx, query, req.GetArgs()...) + result, err := s.db.ExecContext(ctx, query, delReq.GetArgs()...) if err != nil { return fmt.Errorf("deleting message id=%v from secure value outbox table: %w", messageID, err) } @@ -256,6 +341,7 @@ func (s *outboxStore) deleteMessage(ctx context.Context, messageID string) error return fmt.Errorf("get rows affected: %w", err) } + // TODO: Presumably it's a bug if we delete 0 rows? if rowsAffected > 1 { return fmt.Errorf("bug: deleted more than one row from the outbox table, should delete only one at a time: deleted=%v", rowsAffected) } @@ -263,7 +349,7 @@ func (s *outboxStore) deleteMessage(ctx context.Context, messageID string) error return nil } -func (s *outboxStore) IncrementReceiveCount(ctx context.Context, messageIDs []string) error { +func (s *outboxStore) IncrementReceiveCount(ctx context.Context, messageIDs []int64) error { if len(messageIDs) == 0 { return nil } @@ -272,6 +358,7 @@ func (s *outboxStore) IncrementReceiveCount(ctx context.Context, messageIDs []st SQLTemplate: sqltemplate.New(s.dialect), MessageIDs: messageIDs, } + query, err := sqltemplate.Execute(sqlSecureValueOutboxUpdateReceiveCount, req) if err != nil { return fmt.Errorf("execute template %q: %w", sqlSecureValueOutboxUpdateReceiveCount.Name(), err) diff --git a/pkg/storage/secret/metadata/outbox_store_test.go b/pkg/storage/secret/metadata/outbox_store_test.go index 0dd6c024d98..518618833cf 100644 --- a/pkg/storage/secret/metadata/outbox_store_test.go +++ b/pkg/storage/secret/metadata/outbox_store_test.go @@ -24,7 +24,7 @@ func newOutboxStoreModel() *outboxStoreModel { return &outboxStoreModel{} } -func (model *outboxStoreModel) Append(messageID string, message contracts.AppendOutboxMessage) { +func (model *outboxStoreModel) Append(messageID int64, message contracts.AppendOutboxMessage) { model.rows = append(model.rows, contracts.OutboxMessage{ Type: message.Type, MessageID: messageID, @@ -44,7 +44,7 @@ func (model *outboxStoreModel) ReceiveN(n uint) []contracts.OutboxMessage { return model.rows[:maxMessages] } -func (model *outboxStoreModel) Delete(messageID string) { +func (model *outboxStoreModel) Delete(messageID int64) { oldLen := len(model.rows) model.rows = slices.DeleteFunc(model.rows, func(m contracts.OutboxMessage) bool { return m.MessageID == messageID @@ -70,7 +70,7 @@ func TestOutboxStoreModel(t *testing.T) { } outboxMessage1 := contracts.OutboxMessage{ - MessageID: "message_id_1", + MessageID: 1, Type: contracts.CreateSecretOutboxMessage, Name: "s-1", Namespace: "n-1", @@ -79,7 +79,7 @@ func TestOutboxStoreModel(t *testing.T) { } outboxMessage2 := contracts.OutboxMessage{ - MessageID: "message_id_2", + MessageID: 2, Type: contracts.CreateSecretOutboxMessage, Name: "s-1", Namespace: "n-1", @@ -87,11 +87,11 @@ func TestOutboxStoreModel(t *testing.T) { ExternalID: nil, } - model.Append("message_id_1", appendOutboxMessage) + model.Append(1, appendOutboxMessage) require.Equal(t, []contracts.OutboxMessage{outboxMessage1}, model.ReceiveN(10)) - model.Append("message_id_2", appendOutboxMessage) + model.Append(2, appendOutboxMessage) require.Equal(t, []contracts.OutboxMessage{outboxMessage1, outboxMessage2}, model.ReceiveN(10)) @@ -206,9 +206,8 @@ func TestOutboxStoreProperty(t *testing.T) { rng := rand.New(rand.NewSource(seed)) defer func() { - if err := recover(); err != nil || t.Failed() { - fmt.Printf("TestOutboxStoreProperty: err=%+v\n\nSEED=%+v", err, seed) - t.FailNow() + if t.Failed() { + fmt.Printf("TestOutboxStoreProperty: SEED=%+v\n\n", seed) } }() @@ -227,6 +226,7 @@ func TestOutboxStoreProperty(t *testing.T) { n := rng.Intn(3) switch n { case 0: + time.Sleep(1 * time.Microsecond) message := contracts.AppendOutboxMessage{ Type: contracts.CreateSecretOutboxMessage, Name: fmt.Sprintf("s-%d", i), @@ -247,7 +247,9 @@ func TestOutboxStoreProperty(t *testing.T) { modelMessages := model.ReceiveN(n) require.Equal(t, len(modelMessages), len(messages)) - require.Equal(t, modelMessages, messages) + for i := range len(modelMessages) { + require.Equal(t, modelMessages[i].MessageID, messages[i].MessageID) + } case 2: if len(model.rows) == 0 { diff --git a/pkg/storage/secret/metadata/query.go b/pkg/storage/secret/metadata/query.go index a47c0ffdae6..907a4d6cbea 100644 --- a/pkg/storage/secret/metadata/query.go +++ b/pkg/storage/secret/metadata/query.go @@ -34,9 +34,11 @@ var ( sqlSecureValueReadForDecrypt = mustTemplate("secure_value_read_for_decrypt.sql") sqlSecureValueOutboxAppend = mustTemplate("secure_value_outbox_append.sql") + sqlSecureValueOutboxFetchMessageIDs = mustTemplate("secure_value_outbox_fetch_message_ids.sql") sqlSecureValueOutboxReceiveN = mustTemplate("secure_value_outbox_receiveN.sql") sqlSecureValueOutboxDelete = mustTemplate("secure_value_outbox_delete.sql") sqlSecureValueOutboxUpdateReceiveCount = mustTemplate("secure_value_outbox_update_receive_count.sql") + sqlSecureValueOutboxQueryTimestamp = mustTemplate("secure_value_outbox_query_timestamp.sql") ) func mustTemplate(filename string) *template.Template { @@ -108,18 +110,6 @@ func (r deleteKeeper) Validate() error { return nil // TODO } -// This is used at keeper store to validate create & update operations -type listByNameKeeper struct { - sqltemplate.SQLTemplate - Namespace string - KeeperNames []string -} - -// Validate is only used if we use `dbutil` from `unifiedstorage` -func (r listByNameKeeper) Validate() error { - return nil // TODO -} - // This is used at keeper store to validate create & update operations type listByNameSecureValue struct { sqltemplate.SQLTemplate @@ -132,6 +122,18 @@ func (r listByNameSecureValue) Validate() error { return nil // TODO } +// This is used at keeper store to validate create & update operations +type listByNameKeeper struct { + sqltemplate.SQLTemplate + Namespace string + KeeperNames []string +} + +// Validate is only used if we use `dbutil` from `unifiedstorage` +func (r listByNameKeeper) Validate() error { + return nil // TODO +} + /******************************/ /**-- Secure Value Queries --**/ /******************************/ @@ -240,21 +242,35 @@ func (appendSecureValueOutbox) Validate() error { return nil } type receiveNSecureValueOutbox struct { sqltemplate.SQLTemplate - ReceiveLimit uint + MessageIDs []int64 } func (receiveNSecureValueOutbox) Validate() error { return nil } +type fetchMessageIDsOutbox struct { + sqltemplate.SQLTemplate + ReceiveLimit uint +} + +func (fetchMessageIDsOutbox) Validate() error { return nil } + type deleteSecureValueOutbox struct { sqltemplate.SQLTemplate - MessageID string + MessageID int64 } func (deleteSecureValueOutbox) Validate() error { return nil } +type getOutboxMessageTimestamp struct { + sqltemplate.SQLTemplate + MessageID int64 +} + +func (getOutboxMessageTimestamp) Validate() error { return nil } + type incrementReceiveCountOutbox struct { sqltemplate.SQLTemplate - MessageIDs []string + MessageIDs []int64 } func (incrementReceiveCountOutbox) Validate() error { return nil } diff --git a/pkg/storage/secret/metadata/query_test.go b/pkg/storage/secret/metadata/query_test.go index e07a8844844..8a5ff0e6a9a 100644 --- a/pkg/storage/secret/metadata/query_test.go +++ b/pkg/storage/secret/metadata/query_test.go @@ -312,7 +312,7 @@ func TestSecureValueOutboxQueries(t *testing.T) { Name: "update-receive-count", Data: &incrementReceiveCountOutbox{ SQLTemplate: mocks.NewTestingSQLTemplate(), - MessageIDs: []string{"id1", "id2", "id3"}, + MessageIDs: []int64{1, 2, 3}, }, }, }, @@ -322,7 +322,7 @@ func TestSecureValueOutboxQueries(t *testing.T) { Data: &appendSecureValueOutbox{ SQLTemplate: mocks.NewTestingSQLTemplate(), Row: &outboxMessageDB{ - MessageID: "my-uuid", + MessageID: 1, MessageType: "some-type", Name: "name", Namespace: "namespace", @@ -337,7 +337,7 @@ func TestSecureValueOutboxQueries(t *testing.T) { Data: &appendSecureValueOutbox{ SQLTemplate: mocks.NewTestingSQLTemplate(), Row: &outboxMessageDB{ - MessageID: "my-uuid", + MessageID: 1, MessageType: "some-type", Name: "name", Namespace: "namespace", @@ -352,7 +352,7 @@ func TestSecureValueOutboxQueries(t *testing.T) { Data: &appendSecureValueOutbox{ SQLTemplate: mocks.NewTestingSQLTemplate(), Row: &outboxMessageDB{ - MessageID: "my-uuid", + MessageID: 1, MessageType: "some-type", Name: "name", Namespace: "namespace", @@ -367,7 +367,7 @@ func TestSecureValueOutboxQueries(t *testing.T) { Data: &appendSecureValueOutbox{ SQLTemplate: mocks.NewTestingSQLTemplate(), Row: &outboxMessageDB{ - MessageID: "my-uuid", + MessageID: 1, MessageType: "some-type", Name: "name", Namespace: "namespace", @@ -379,23 +379,30 @@ func TestSecureValueOutboxQueries(t *testing.T) { }, }, }, - - sqlSecureValueOutboxReceiveN: { + sqlSecureValueOutboxFetchMessageIDs: { { Name: "basic", - Data: &receiveNSecureValueOutbox{ + Data: &fetchMessageIDsOutbox{ SQLTemplate: mocks.NewTestingSQLTemplate(), ReceiveLimit: 10, }, }, }, - + sqlSecureValueOutboxReceiveN: { + { + Name: "basic", + Data: &receiveNSecureValueOutbox{ + SQLTemplate: mocks.NewTestingSQLTemplate(), + MessageIDs: []int64{1, 2, 3}, + }, + }, + }, sqlSecureValueOutboxDelete: { { Name: "basic", Data: &deleteSecureValueOutbox{ SQLTemplate: mocks.NewTestingSQLTemplate(), - MessageID: "my-uuid", + MessageID: 1, }, }, }, diff --git a/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_append-all-fields-present.sql b/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_append-all-fields-present.sql index ea0d5e2eac3..a1cff11dd5d 100755 --- a/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_append-all-fields-present.sql +++ b/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_append-all-fields-present.sql @@ -1,6 +1,5 @@ INSERT INTO `secret_secure_value_outbox` ( `request_id`, - `uid`, `message_type`, `name`, `namespace`, @@ -11,7 +10,6 @@ INSERT INTO `secret_secure_value_outbox` ( `created` ) VALUES ( '', - 'my-uuid', 'some-type', 'name', 'namespace', diff --git a/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_append-no-encrypted-secret.sql b/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_append-no-encrypted-secret.sql index ddccfe82a7b..139d262d49a 100755 --- a/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_append-no-encrypted-secret.sql +++ b/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_append-no-encrypted-secret.sql @@ -1,6 +1,5 @@ INSERT INTO `secret_secure_value_outbox` ( `request_id`, - `uid`, `message_type`, `name`, `namespace`, @@ -10,7 +9,6 @@ INSERT INTO `secret_secure_value_outbox` ( `created` ) VALUES ( '', - 'my-uuid', 'some-type', 'name', 'namespace', diff --git a/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_append-no-external-id.sql b/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_append-no-external-id.sql index 4c0e6fe6486..62af967a284 100755 --- a/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_append-no-external-id.sql +++ b/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_append-no-external-id.sql @@ -1,6 +1,5 @@ INSERT INTO `secret_secure_value_outbox` ( `request_id`, - `uid`, `message_type`, `name`, `namespace`, @@ -10,7 +9,6 @@ INSERT INTO `secret_secure_value_outbox` ( `created` ) VALUES ( '', - 'my-uuid', 'some-type', 'name', 'namespace', diff --git a/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_append-no-keeper-name.sql b/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_append-no-keeper-name.sql index 78590350bf5..924b7d6277f 100755 --- a/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_append-no-keeper-name.sql +++ b/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_append-no-keeper-name.sql @@ -1,6 +1,5 @@ INSERT INTO `secret_secure_value_outbox` ( `request_id`, - `uid`, `message_type`, `name`, `namespace`, @@ -10,7 +9,6 @@ INSERT INTO `secret_secure_value_outbox` ( `created` ) VALUES ( '', - 'my-uuid', 'some-type', 'name', 'namespace', diff --git a/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_delete-basic.sql b/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_delete-basic.sql index f4f1acaa6f7..2a6fc52ea18 100755 --- a/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_delete-basic.sql +++ b/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_delete-basic.sql @@ -1,5 +1,5 @@ DELETE FROM `secret_secure_value_outbox` WHERE - `uid` = 'my-uuid' + `id` = 1 ; diff --git a/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_fetch_message_ids-basic.sql b/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_fetch_message_ids-basic.sql new file mode 100755 index 00000000000..47b006df9e3 --- /dev/null +++ b/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_fetch_message_ids-basic.sql @@ -0,0 +1,6 @@ +SELECT + `id` +FROM `secret_secure_value_outbox` +ORDER BY id ASC +LIMIT 10 +; diff --git a/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_receiveN-basic.sql b/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_receiveN-basic.sql index 594d70f5b6b..710f96bf187 100755 --- a/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_receiveN-basic.sql +++ b/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_receiveN-basic.sql @@ -1,6 +1,6 @@ SELECT `request_id`, - `uid`, + `id`, `message_type`, `name`, `namespace`, @@ -11,9 +11,9 @@ SELECT `created` FROM `secret_secure_value_outbox` +WHERE + `id` IN (1, 2, 3) ORDER BY - `created` ASC -LIMIT - 10 + `id` ASC FOR UPDATE SKIP LOCKED ; diff --git a/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_update_receive_count-update-receive-count.sql b/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_update_receive_count-update-receive-count.sql index 76a26be8f15..e9df2c03014 100755 --- a/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_update_receive_count-update-receive-count.sql +++ b/pkg/storage/secret/metadata/testdata/mysql--secure_value_outbox_update_receive_count-update-receive-count.sql @@ -3,5 +3,5 @@ UPDATE SET `receive_count` = `receive_count` + 1 WHERE - `uid` IN ('id1', 'id2', 'id3') + `id` IN (1, 2, 3) ; diff --git a/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_append-all-fields-present.sql b/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_append-all-fields-present.sql index 807e0979c97..3c2b2588c08 100755 --- a/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_append-all-fields-present.sql +++ b/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_append-all-fields-present.sql @@ -1,6 +1,5 @@ INSERT INTO "secret_secure_value_outbox" ( "request_id", - "uid", "message_type", "name", "namespace", @@ -11,7 +10,6 @@ INSERT INTO "secret_secure_value_outbox" ( "created" ) VALUES ( '', - 'my-uuid', 'some-type', 'name', 'namespace', diff --git a/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_append-no-encrypted-secret.sql b/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_append-no-encrypted-secret.sql index 8ef26454842..bcecf30a749 100755 --- a/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_append-no-encrypted-secret.sql +++ b/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_append-no-encrypted-secret.sql @@ -1,6 +1,5 @@ INSERT INTO "secret_secure_value_outbox" ( "request_id", - "uid", "message_type", "name", "namespace", @@ -10,7 +9,6 @@ INSERT INTO "secret_secure_value_outbox" ( "created" ) VALUES ( '', - 'my-uuid', 'some-type', 'name', 'namespace', diff --git a/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_append-no-external-id.sql b/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_append-no-external-id.sql index 463f5be93ec..81eb522e3a8 100755 --- a/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_append-no-external-id.sql +++ b/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_append-no-external-id.sql @@ -1,6 +1,5 @@ INSERT INTO "secret_secure_value_outbox" ( "request_id", - "uid", "message_type", "name", "namespace", @@ -10,7 +9,6 @@ INSERT INTO "secret_secure_value_outbox" ( "created" ) VALUES ( '', - 'my-uuid', 'some-type', 'name', 'namespace', diff --git a/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_append-no-keeper-name.sql b/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_append-no-keeper-name.sql index c576949f2f9..3c0e3abf5e8 100755 --- a/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_append-no-keeper-name.sql +++ b/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_append-no-keeper-name.sql @@ -1,6 +1,5 @@ INSERT INTO "secret_secure_value_outbox" ( "request_id", - "uid", "message_type", "name", "namespace", @@ -10,7 +9,6 @@ INSERT INTO "secret_secure_value_outbox" ( "created" ) VALUES ( '', - 'my-uuid', 'some-type', 'name', 'namespace', diff --git a/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_delete-basic.sql b/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_delete-basic.sql index 8b9b9f3cc52..f0c8984c8a0 100755 --- a/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_delete-basic.sql +++ b/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_delete-basic.sql @@ -1,5 +1,5 @@ DELETE FROM "secret_secure_value_outbox" WHERE - "uid" = 'my-uuid' + "id" = 1 ; diff --git a/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_fetch_message_ids-basic.sql b/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_fetch_message_ids-basic.sql new file mode 100755 index 00000000000..4c590706948 --- /dev/null +++ b/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_fetch_message_ids-basic.sql @@ -0,0 +1,6 @@ +SELECT + "id" +FROM "secret_secure_value_outbox" +ORDER BY id ASC +LIMIT 10 +; diff --git a/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_receiveN-basic.sql b/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_receiveN-basic.sql index d29cc467f90..f4602caba07 100755 --- a/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_receiveN-basic.sql +++ b/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_receiveN-basic.sql @@ -1,6 +1,6 @@ SELECT "request_id", - "uid", + "id", "message_type", "name", "namespace", @@ -11,9 +11,9 @@ SELECT "created" FROM "secret_secure_value_outbox" +WHERE + "id" IN (1, 2, 3) ORDER BY - "created" ASC -LIMIT - 10 + "id" ASC FOR UPDATE SKIP LOCKED ; diff --git a/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_update_receive_count-update-receive-count.sql b/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_update_receive_count-update-receive-count.sql index 4c313de0ab9..d9404fd8212 100755 --- a/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_update_receive_count-update-receive-count.sql +++ b/pkg/storage/secret/metadata/testdata/postgres--secure_value_outbox_update_receive_count-update-receive-count.sql @@ -3,5 +3,5 @@ UPDATE SET "receive_count" = "receive_count" + 1 WHERE - "uid" IN ('id1', 'id2', 'id3') + "id" IN (1, 2, 3) ; diff --git a/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_append-all-fields-present.sql b/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_append-all-fields-present.sql index 807e0979c97..3c2b2588c08 100755 --- a/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_append-all-fields-present.sql +++ b/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_append-all-fields-present.sql @@ -1,6 +1,5 @@ INSERT INTO "secret_secure_value_outbox" ( "request_id", - "uid", "message_type", "name", "namespace", @@ -11,7 +10,6 @@ INSERT INTO "secret_secure_value_outbox" ( "created" ) VALUES ( '', - 'my-uuid', 'some-type', 'name', 'namespace', diff --git a/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_append-no-encrypted-secret.sql b/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_append-no-encrypted-secret.sql index 8ef26454842..bcecf30a749 100755 --- a/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_append-no-encrypted-secret.sql +++ b/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_append-no-encrypted-secret.sql @@ -1,6 +1,5 @@ INSERT INTO "secret_secure_value_outbox" ( "request_id", - "uid", "message_type", "name", "namespace", @@ -10,7 +9,6 @@ INSERT INTO "secret_secure_value_outbox" ( "created" ) VALUES ( '', - 'my-uuid', 'some-type', 'name', 'namespace', diff --git a/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_append-no-external-id.sql b/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_append-no-external-id.sql index 463f5be93ec..81eb522e3a8 100755 --- a/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_append-no-external-id.sql +++ b/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_append-no-external-id.sql @@ -1,6 +1,5 @@ INSERT INTO "secret_secure_value_outbox" ( "request_id", - "uid", "message_type", "name", "namespace", @@ -10,7 +9,6 @@ INSERT INTO "secret_secure_value_outbox" ( "created" ) VALUES ( '', - 'my-uuid', 'some-type', 'name', 'namespace', diff --git a/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_append-no-keeper-name.sql b/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_append-no-keeper-name.sql index c576949f2f9..3c0e3abf5e8 100755 --- a/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_append-no-keeper-name.sql +++ b/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_append-no-keeper-name.sql @@ -1,6 +1,5 @@ INSERT INTO "secret_secure_value_outbox" ( "request_id", - "uid", "message_type", "name", "namespace", @@ -10,7 +9,6 @@ INSERT INTO "secret_secure_value_outbox" ( "created" ) VALUES ( '', - 'my-uuid', 'some-type', 'name', 'namespace', diff --git a/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_delete-basic.sql b/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_delete-basic.sql index 8b9b9f3cc52..f0c8984c8a0 100755 --- a/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_delete-basic.sql +++ b/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_delete-basic.sql @@ -1,5 +1,5 @@ DELETE FROM "secret_secure_value_outbox" WHERE - "uid" = 'my-uuid' + "id" = 1 ; diff --git a/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_fetch_message_ids-basic.sql b/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_fetch_message_ids-basic.sql new file mode 100755 index 00000000000..4c590706948 --- /dev/null +++ b/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_fetch_message_ids-basic.sql @@ -0,0 +1,6 @@ +SELECT + "id" +FROM "secret_secure_value_outbox" +ORDER BY id ASC +LIMIT 10 +; diff --git a/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_receiveN-basic.sql b/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_receiveN-basic.sql index 327b4f45f56..62b16f507ba 100755 --- a/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_receiveN-basic.sql +++ b/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_receiveN-basic.sql @@ -1,6 +1,6 @@ SELECT "request_id", - "uid", + "id", "message_type", "name", "namespace", @@ -11,8 +11,8 @@ SELECT "created" FROM "secret_secure_value_outbox" +WHERE + "id" IN (1, 2, 3) ORDER BY - "created" ASC -LIMIT - 10 + "id" ASC ; diff --git a/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_update_receive_count-update-receive-count.sql b/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_update_receive_count-update-receive-count.sql index 4c313de0ab9..d9404fd8212 100755 --- a/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_update_receive_count-update-receive-count.sql +++ b/pkg/storage/secret/metadata/testdata/sqlite--secure_value_outbox_update_receive_count-update-receive-count.sql @@ -3,5 +3,5 @@ UPDATE SET "receive_count" = "receive_count" + 1 WHERE - "uid" IN ('id1', 'id2', 'id3') + "id" IN (1, 2, 3) ; diff --git a/pkg/storage/secret/migrator/migrator.go b/pkg/storage/secret/migrator/migrator.go index 4db66a50645..d7d0bd6560b 100644 --- a/pkg/storage/secret/migrator/migrator.go +++ b/pkg/storage/secret/migrator/migrator.go @@ -134,7 +134,7 @@ func (*SecretDB) AddMigration(mg *migrator.Migrator) { Name: TableNameSecureValueOutbox, Columns: []*migrator.Column{ {Name: "request_id", Type: migrator.DB_NVarchar, Length: 253, Nullable: false}, - {Name: "uid", Type: migrator.DB_NVarchar, Length: 36, IsPrimaryKey: true}, // Fixed size of a UUID. + {Name: "id", Type: migrator.DB_BigInt, Length: 36, IsPrimaryKey: true, IsAutoIncrement: true}, // Fixed size of a UUID. {Name: "message_type", Type: migrator.DB_NVarchar, Length: 16, Nullable: false}, {Name: "name", Type: migrator.DB_NVarchar, Length: 253, Nullable: false}, // Limit enforced by K8s. {Name: "namespace", Type: migrator.DB_NVarchar, Length: 253, Nullable: false}, // Limit enforced by K8s. @@ -148,8 +148,6 @@ func (*SecretDB) AddMigration(mg *migrator.Migrator) { // There's only one operation per secret in the queue at all times, // meaning the namespace + name combination should be unique {Cols: []string{"namespace", "name"}, Type: migrator.UniqueIndex}, - // Used for sorting - {Cols: []string{"created"}, Type: migrator.IndexType}, }, }) From 27741d9a0c104378a70776dc80d184f51563f315 Mon Sep 17 00:00:00 2001 From: Matheus Macabu Date: Thu, 3 Jul 2025 16:50:48 +0200 Subject: [PATCH 16/19] Air: Send interrupt signal for graceful server shutdown (#107507) * Air: Dont run make gen-jsonnet * Air: Send interrupt signal for graceful shutdown and wait 500ms --- .air.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.air.toml b/.air.toml index b3923357b54..78321b7a6a3 100644 --- a/.air.toml +++ b/.air.toml @@ -7,9 +7,10 @@ exclude_unchanged = true follow_symlink = true include_dir = ["apps", "conf", "devenv/dev-dashboards", "pkg", "public/views"] include_ext = ["go", "ini", "toml", "html", "json"] -pre_cmd = ["make gen-go", "make gen-jsonnet"] -rerun_delay = 1000 +pre_cmd = ["make gen-go"] stop_on_error = true +send_interrupt = true +kill_delay = 500 [log] time = true From 4414b92e93440cc9ed0f281989ee71dc16216a15 Mon Sep 17 00:00:00 2001 From: Yunwen Zheng Date: Thu, 3 Jul 2025 11:19:09 -0400 Subject: [PATCH 17/19] Git UI Sync Create Dashboard: Fix update dashboard path field when folder selection changes (#107482) Git UI sync when update folder selection, path field doesnt get update in the edit form --- .../features/provisioning/hooks/useGetResourceRepositoryView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/app/features/provisioning/hooks/useGetResourceRepositoryView.ts b/public/app/features/provisioning/hooks/useGetResourceRepositoryView.ts index 5dd7106a032..bf64a049370 100644 --- a/public/app/features/provisioning/hooks/useGetResourceRepositoryView.ts +++ b/public/app/features/provisioning/hooks/useGetResourceRepositoryView.ts @@ -19,7 +19,7 @@ interface RepositoryViewData { // This is safe to call as a viewer (you do not need full access to the Repository configs) export const useGetResourceRepositoryView = ({ name, folderName }: GetResourceRepositoryArgs): RepositoryViewData => { const { data: settingsData, isLoading: isSettingsLoading } = useGetFrontendSettingsQuery(); - const skipFolderQuery = name || !folderName; + const skipFolderQuery = !folderName; const { data: folder, isLoading: isFolderLoading } = useGetFolderQuery( skipFolderQuery ? skipToken : { name: folderName } ); From 66d9a33cc97e6514d02a96efbb7e173bdd41c0a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nathan=20V=C4=93rzemnieks?= Date: Thu, 3 Jul 2025 08:48:57 -0700 Subject: [PATCH 18/19] Datasources: Update grafana-aws-sdk for new sigv4 middleware and aws-sdk-go v1 removal (#107522) Datasources: Update grafana-aws-sdk --- go.mod | 16 +- go.sum | 32 +- go.work.sum | 1643 ----------------- .../http_client_provider.go | 20 +- .../http_client_provider_test.go | 4 +- pkg/registry/apis/datasource/middleware.go | 5 +- 6 files changed, 30 insertions(+), 1690 deletions(-) diff --git a/go.mod b/go.mod index 1e2e7fc55fa..ee0c6c45f91 100644 --- a/go.mod +++ b/go.mod @@ -99,7 +99,7 @@ require ( github.com/grafana/grafana-api-golang-client v0.27.0 // @grafana/alerting-backend github.com/grafana/grafana-app-sdk v0.39.0 // @grafana/grafana-app-platform-squad github.com/grafana/grafana-app-sdk/logging v0.38.2 // @grafana/grafana-app-platform-squad - github.com/grafana/grafana-aws-sdk v0.38.7 // @grafana/aws-datasources + github.com/grafana/grafana-aws-sdk v1.0.2 // @grafana/aws-datasources github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6 // @grafana/partner-datasources github.com/grafana/grafana-cloud-migration-snapshot v1.6.0 // @grafana/grafana-operator-experience-squad github.com/grafana/grafana-google-sdk-go v0.4.1 // @grafana/partner-datasources @@ -292,9 +292,9 @@ require ( github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/at-wat/mqtt-go v0.19.4 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 // indirect - github.com/aws/aws-sdk-go-v2/config v1.29.14 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.67 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect + github.com/aws/aws-sdk-go-v2/config v1.29.17 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.70 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32 // indirect github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.10 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 // indirect @@ -305,9 +305,9 @@ require ( github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.15 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.58.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.33.19 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.25.5 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 // indirect github.com/axiomhq/hyperloglog v0.0.0-20240507144631-af9851f82b27 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -402,7 +402,7 @@ require ( github.com/grafana/jsonparser v0.0.0-20240425183733-ea80629e1a32 // indirect github.com/grafana/loki/pkg/push v0.0.0-20231124142027-e52380921608 // indirect github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect - github.com/grafana/sqlds/v4 v4.2.2 // indirect + github.com/grafana/sqlds/v4 v4.2.3 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340 // indirect github.com/hashicorp/consul/api v1.31.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect diff --git a/go.sum b/go.sum index 1aed35f33b4..d65e81f3b04 100644 --- a/go.sum +++ b/go.sum @@ -849,12 +849,12 @@ github.com/aws/aws-sdk-go-v2 v1.36.5 h1:0OF9RiEMEdDdZEMqF9MRjevyxAQcf6gY+E7vwBIL github.com/aws/aws-sdk-go-v2 v1.36.5/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 h1:12SpdwU8Djs+YGklkinSSlcrPyj3H4VifVsKf78KbwA= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11/go.mod h1:dd+Lkp6YmMryke+qxW/VnKyhMBDTYP41Q2Bb+6gNZgY= -github.com/aws/aws-sdk-go-v2/config v1.29.14 h1:f+eEi/2cKCg9pqKBoAIwRGzVb70MRKqWX4dg1BDcSJM= -github.com/aws/aws-sdk-go-v2/config v1.29.14/go.mod h1:wVPHWcIFv3WO89w0rE10gzf17ZYy+UVS1Geq8Iei34g= -github.com/aws/aws-sdk-go-v2/credentials v1.17.67 h1:9KxtdcIA/5xPNQyZRgUSpYOE6j9Bc4+D7nZua0KGYOM= -github.com/aws/aws-sdk-go-v2/credentials v1.17.67/go.mod h1:p3C44m+cfnbv763s52gCqrjaqyPikj9Sg47kUVaNZQQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M= +github.com/aws/aws-sdk-go-v2/config v1.29.17 h1:jSuiQ5jEe4SAMH6lLRMY9OVC+TqJLP5655pBGjmnjr0= +github.com/aws/aws-sdk-go-v2/config v1.29.17/go.mod h1:9P4wwACpbeXs9Pm9w1QTh6BwWwJjwYvJ1iCt5QbCXh8= +github.com/aws/aws-sdk-go-v2/credentials v1.17.70 h1:ONnH5CM16RTXRkS8Z1qg7/s2eDOhHhaXVd72mmyv4/0= +github.com/aws/aws-sdk-go-v2/credentials v1.17.70/go.mod h1:M+lWhhmomVGgtuPOhO85u4pEa3SmssPTdcYpP/5J/xc= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32 h1:KAXP9JSHO1vKGCr5f4O6WmlVKLFFXgWYAGoJosorxzU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32/go.mod h1:h4Sg6FQdexC1yYG9RDnOvLbW1a/P986++/Y/a+GyEM8= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.10 h1:zeN9UtUlA6FTx0vFSayxSX32HDw73Yb6Hh2izDSFxXY= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.10/go.mod h1:3HKuexPDcwLWPaqpW2UR/9n8N/u/3CKcGAzSs8p8u8g= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 h1:SsytQyTMHMDPspp+spo7XwXTP44aJZZAC7fBV2C5+5s= @@ -885,12 +885,12 @@ github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi v1.26.6 h1:Pwbxovp github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi v1.26.6/go.mod h1:Z4xLt5mXspLKjBV92i165wAJ/3T6TIv4n7RtIS8pWV0= github.com/aws/aws-sdk-go-v2/service/s3 v1.58.3 h1:hT8ZAZRIfqBqHbzKTII+CIiY8G2oC9OpLedkZ51DWl8= github.com/aws/aws-sdk-go-v2/service/s3 v1.58.3/go.mod h1:Lcxzg5rojyVPU/0eFwLtcyTaek/6Mtic5B1gJo7e/zE= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 h1:1Gw+9ajCV1jogloEv1RRnvfRFia2cL6c9cuKV2Ps+G8= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.3/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 h1:hXmVKytPfTy5axZ+fYbR5d0cFmC3JvwLm5kM83luako= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.19 h1:1XuUZ8mYJw9B6lzAkXhqHlJd/XvaX32evhproijJEZY= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.19/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.5 h1:AIRJ3lfb2w/1/8wOOSqYb9fUKGwQbtysJ2H1MofRUPg= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.5/go.mod h1:b7SiVprpU+iGazDUqvRSLf5XmCdn+JtT1on7uNL6Ipc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3 h1:BpOxT3yhLwSJ77qIY3DoHAQjZsc4HEGfMCE4NGy3uFg= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3/go.mod h1:vq/GQR1gOFLquZMSrxUK/cpvKCNVYibNyJ1m7JrU88E= +github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 h1:NFOJ/NXEGV4Rq//71Hs1jC/NvPs1ezajK+yQmkwnPV0= +github.com/aws/aws-sdk-go-v2/service/sts v1.34.0/go.mod h1:7ph2tGpfQvwzgistp2+zga9f+bCjlQJPkPUmMgDSD7w= github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw= github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/axiomhq/hyperloglog v0.0.0-20191112132149-a4c4c47bc57f/go.mod h1:2stgcRjl6QmW+gU2h5E7BQXg4HU0gzxKWDuT5HviN9s= @@ -1611,8 +1611,8 @@ github.com/grafana/grafana-app-sdk v0.39.0 h1:WC2E9BKXWDX/e2bajdAFjQEyyWf9BFp7Yz github.com/grafana/grafana-app-sdk v0.39.0/go.mod h1:xRyBQOttgWTc3tGe9pI0upnpEPVhzALf7Mh/61O4zyY= github.com/grafana/grafana-app-sdk/logging v0.38.2 h1:EdQTRxbbH72zdqJ09Z76zcSjfALJXkpPLgvKEPPnloc= github.com/grafana/grafana-app-sdk/logging v0.38.2/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk= -github.com/grafana/grafana-aws-sdk v0.38.7 h1:9P3DASeWqIG2cBtnmpj0sY3TsK+773wbdIR55WKS3V4= -github.com/grafana/grafana-aws-sdk v0.38.7/go.mod h1:LflvMuuX0BNSd1Oe6KcH5CGV/zxm4VrfN/0wLNPKvVc= +github.com/grafana/grafana-aws-sdk v1.0.2 h1:98eBuHYFmgvH0xO9kKf4RBsEsgQRp8EOA/9yhDIpkss= +github.com/grafana/grafana-aws-sdk v1.0.2/go.mod h1:hO7q7yWV+t6dmiyJjMa3IbuYnYkBua+G/IAlOPVIYKE= github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6 h1:OfCkitCuomzZKW1WYHrG8MxKwtMhALb7jqoj+487eTg= github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6/go.mod h1:V7y2BmsWxS3A9Ohebwn4OiSfJJqi//4JQydQ8fHTduo= github.com/grafana/grafana-cloud-migration-snapshot v1.6.0 h1:S4kHwr//AqhtL9xHBtz1gqVgZQeCRGTxjgsRBAkpjKY= @@ -1669,8 +1669,8 @@ github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrR github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/grafana/saml v0.4.15-0.20240917091248-ae3bbdad8a56 h1:SDGrP81Vcd102L3UJEryRd1eestRw73wt+b8vnVEFe0= github.com/grafana/saml v0.4.15-0.20240917091248-ae3bbdad8a56/go.mod h1:S4+611dxnKt8z/ulbvaJzcgSHsuhjVc1QHNTcr1R7Fw= -github.com/grafana/sqlds/v4 v4.2.2 h1:bqF9Ex5bb72AvT6h3v6jRFr6Mb1Bk4y7t14YGbHnenI= -github.com/grafana/sqlds/v4 v4.2.2/go.mod h1:yRjfMDJ4DhI++VbrnvgVy6Nn4j9tPIR6UfWKbQ3qP6Y= +github.com/grafana/sqlds/v4 v4.2.3 h1:9ibD1c5O5u9fifEkBSig+jAc41TUEz+M+bWQqDsofP4= +github.com/grafana/sqlds/v4 v4.2.3/go.mod h1:bv+XHabfUF4xkgg4y+nYFCK8rpMHZsMaQk56qNaJcAM= github.com/grafana/tempo v1.5.1-0.20250529124718-87c2dc380cec h1:wnzJov9RhSHGaTYGzTygL4qq986fLen8xSqnQgaMd28= github.com/grafana/tempo v1.5.1-0.20250529124718-87c2dc380cec/go.mod h1:j1IY7J2rUz7TcTjFVVx6HCpyTlYOJPtXuGRZ7sI+vSo= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= diff --git a/go.work.sum b/go.work.sum index d684e218820..a106af447b4 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,573 +1,241 @@ -atomicgo.dev/assert v0.0.2 h1:FiKeMiZSgRrZsPo9qn/7vmr7mCsh5SZyXY4YGYiYwrg= -atomicgo.dev/assert v0.0.2/go.mod h1:ut4NcI3QDdJtlmAxQULOmA13Gz6e2DWbSAS8RUOmNYQ= atomicgo.dev/cursor v0.2.0 h1:H6XN5alUJ52FZZUkI7AlJbUc1aW38GWZalpYRPpoPOw= atomicgo.dev/cursor v0.2.0/go.mod h1:Lr4ZJB3U7DfPPOkbH7/6TOtJ4vFGHlgj1nc+n900IpU= atomicgo.dev/keyboard v0.2.9 h1:tOsIid3nlPLZ3lwgG8KZMp/SFmr7P0ssEN5JUsm78K8= atomicgo.dev/keyboard v0.2.9/go.mod h1:BC4w9g00XkxH/f1HXhW2sXmJFOCWbKn9xrOunSFtExQ= atomicgo.dev/schedule v0.1.0 h1:nTthAbhZS5YZmgYbb2+DH8uQIZcTlIrd4eYr3UQxEjs= atomicgo.dev/schedule v0.1.0/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU= -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898 h1:SC+c6A1qTFstO9qmB86mPV2IpYme/2ZoEQ0hrP+wo+Q= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230802163732-1c33ebd9ecfa.1 h1:tdpHgTbmbvEIARu+bixzmleMi14+3imnpoFXz+Qzjp4= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230802163732-1c33ebd9ecfa.1/go.mod h1:xafc+XIsTxTy76GJQ1TKgvJWsSugFBqMaN27WhUblew= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.4-20250130201111-63bb56e20495.1 h1:4erM3WLgEG/HIBrpBDmRbs1puhd7p0z7kNXDuhHthwM= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.4-20250130201111-63bb56e20495.1/go.mod h1:novQBstnxcGpfKf8qGRATqn1anQKwMJIbH5Q581jibU= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250425153114-8976f5be98c1.1 h1:YhMSc48s25kr7kv31Z8vf7sPUIq5YJva9z1mn/hAt0M= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250425153114-8976f5be98c1.1/go.mod h1:avRlCjnFzl98VPaeCtJ24RrV/wwHFzB8sWXhj26+n/U= buf.build/go/protovalidate v0.12.0 h1:4GKJotbspQjRCcqZMGVSuC8SjwZ/FmgtSuKDpKUTZew= buf.build/go/protovalidate v0.12.0/go.mod h1:q3PFfbzI05LeqxSwq+begW2syjy2Z6hLxZSkP1OH/D0= -cel.dev/expr v0.15.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= -cel.dev/expr v0.16.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= -cel.dev/expr v0.16.1/go.mod h1:AsGA5zb3WruAEQeQng1RZdGEXmBj0jvMWh6l5SnNuC8= -cel.dev/expr v0.18.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= -cel.dev/expr v0.19.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= -cel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= -cel.dev/expr v0.19.2/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= -cel.dev/expr v0.20.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cel.dev/expr v0.23.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= -cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= -cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= -cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbDms= -cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= -cloud.google.com/go v0.117.0/go.mod h1:ZbwhVTb1DBGt2Iwb3tNO6SEK4q+cplHZmLWH+DelYYc= -cloud.google.com/go v0.118.0/go.mod h1:zIt2pkedt/mo+DQjcT4/L3NDxzHPR29j5HcclNH+9PM= -cloud.google.com/go v0.118.1/go.mod h1:CFO4UPEPi8oV21xoezZCrd3d81K4fFkDTEJu4R8K+9M= -cloud.google.com/go v0.118.3/go.mod h1:Lhs3YLnBlwJ4KA6nuObNMZ/fCbOQBPuWKPoE0Wa/9Vc= -cloud.google.com/go/accessapproval v1.8.1 h1:WC6pA5Gyqkrvdc18AHvriShwk8wgMe9EWvBAQSLxTc8= -cloud.google.com/go/accessapproval v1.8.1/go.mod h1:3HAtm2ertsWdwgjSGObyas6fj3ZC/3zwV2WVZXO53sU= cloud.google.com/go/accessapproval v1.8.3 h1:axlU03FRiXDNupsmPG7LKzuS4Enk1gf598M62lWVB74= cloud.google.com/go/accessapproval v1.8.3/go.mod h1:3speETyAv63TDrDmo5lIkpVueFkQcQchkiw/TAMbBo4= -cloud.google.com/go/accesscontextmanager v1.9.1 h1:+C7HM05/h80znK+8VNu25wAimueda6/NGNdus+jxaHI= -cloud.google.com/go/accesscontextmanager v1.9.1/go.mod h1:wUVSoz8HmG7m9miQTh6smbyYuNOJrvZukK5g6WxSOp0= cloud.google.com/go/accesscontextmanager v1.9.3 h1:8zVoeiBa4erMCLEXltOcqVEsZhS26JZ5/Vrgs59eQiI= cloud.google.com/go/accesscontextmanager v1.9.3/go.mod h1:S1MEQV5YjkAKBoMekpGrkXKfrBdsi4x6Dybfq6gZ8BU= -cloud.google.com/go/ai v0.8.0 h1:rXUEz8Wp2OlrM8r1bfmpF2+VKqc1VJpafE3HgzRnD/w= -cloud.google.com/go/ai v0.8.0/go.mod h1:t3Dfk4cM61sytiggo2UyGsDVW3RF1qGZaUKDrZFyqkE= -cloud.google.com/go/aiplatform v1.68.0 h1:EPPqgHDJpBZKRvv+OsB3cr0jYz3EL2pZ+802rBPcG8U= -cloud.google.com/go/aiplatform v1.68.0/go.mod h1:105MFA3svHjC3Oazl7yjXAmIR89LKhRAeNdnDKJczME= -cloud.google.com/go/aiplatform v1.70.0 h1:vnqsPkgcwlDEpWl9t6C3/HLfHeweuGXs2gcYTzH6dMs= -cloud.google.com/go/aiplatform v1.70.0/go.mod h1:1cewyC4h+yvRs0qVvlCuU3V6j1pJ41doIcroYX3uv8o= cloud.google.com/go/aiplatform v1.74.0 h1:rE2P5H7FOAFISAZilmdkapbk4CVgwfVs6FDWlhGfuy0= cloud.google.com/go/aiplatform v1.74.0/go.mod h1:hVEw30CetNut5FrblYd1AJUWRVSIjoyIvp0EVUh51HA= -cloud.google.com/go/analytics v0.25.1 h1:tMlK9KGTwHYASagAHXXbIPUVCRknA0Yv4jquim5HdRE= -cloud.google.com/go/analytics v0.25.1/go.mod h1:hrAWcN/7tqyYwF/f60Nph1yz5UE3/PxOPzzFsJgtU+Y= -cloud.google.com/go/analytics v0.25.3 h1:hX6JAsNbXd2uVjqjIuMcKpmhIybKrEunBiGxK4SwEFI= -cloud.google.com/go/analytics v0.25.3/go.mod h1:pWoYg4yEr0iYg83LZRAicjDDdv54+Z//RyhzWwKbavI= cloud.google.com/go/analytics v0.26.0 h1:O2kWr2Sd4ep3I+YJ4aiY0G4+zWz6sp4eTce+JVns9TM= cloud.google.com/go/analytics v0.26.0/go.mod h1:KZWJfs8uX/+lTjdIjvT58SFa86V9KM6aPXwZKK6uNVI= -cloud.google.com/go/apigateway v1.7.1 h1:BeR+5NtpGxsUoK8wa/IPkanORjqZdlyNmXZ8ke3tOhc= -cloud.google.com/go/apigateway v1.7.1/go.mod h1:5JBcLrl7GHSGRzuDaISd5u0RKV05DNFiq4dRdfrhCP0= cloud.google.com/go/apigateway v1.7.3 h1:Mn7cC5iWJz+cSMS/Hb+N2410CpZ6c8XpJKaexBl0Gxs= cloud.google.com/go/apigateway v1.7.3/go.mod h1:uK0iRHdl2rdTe79bHW/bTsKhhXPcFihjUdb7RzhTPf4= -cloud.google.com/go/apigeeconnect v1.7.1 h1:yMWIb/lv69K7Qz6Brv63u6gIACefIPKQSiI2aFXnJxo= -cloud.google.com/go/apigeeconnect v1.7.1/go.mod h1:olkn1lOhIA/aorreenFzfEcEXmFN2pyAwkaUFbug9ZY= cloud.google.com/go/apigeeconnect v1.7.3 h1:Wlr+30Tha0SMCvQYZKdrh+HkpOyl0CQFSlzeY/Gg1gs= cloud.google.com/go/apigeeconnect v1.7.3/go.mod h1:2ZkT5VCAqhYrDqf4dz7lGp4N/+LeNBSfou8Qs5bIuSg= -cloud.google.com/go/apigeeregistry v0.9.1 h1:AfMllcPbJ+qMgbYK2bC5QDPd8SmE8wQ5msiDILuxVm4= -cloud.google.com/go/apigeeregistry v0.9.1/go.mod h1:XCwK9CS65ehi26z7E8/Vl4PEX5c/JJxpfxlB1QEyrZw= cloud.google.com/go/apigeeregistry v0.9.3 h1:j9CJg/oC884OX5cDpiwNt1ZlDXNV6Zb9Mp1YmRrOG0k= cloud.google.com/go/apigeeregistry v0.9.3/go.mod h1:oNCP2VjOeI6U8yuOuTmU4pkffdcXzR5KxeUD71gF+Dg= cloud.google.com/go/apikeys v0.6.0 h1:B9CdHFZTFjVti89tmyXXrO+7vSNo2jvZuHG8zD5trdQ= -cloud.google.com/go/appengine v1.9.1 h1:mQMmn1Dv0DDLsDjYxfS+cVwQa8+ue++ymVeD1jkXze0= -cloud.google.com/go/appengine v1.9.1/go.mod h1:jtguveqRWFfjrk3k/7SlJz1FpDBZhu5CWSRu+HBgClk= cloud.google.com/go/appengine v1.9.3 h1:jrcanSzj9J1erevZuxldvsDwY+0k/DeFFzlnSfPGfL8= cloud.google.com/go/appengine v1.9.3/go.mod h1:DtLsE/z3JufM/pCEIyVYebJ0h9UNPpN64GZQrYgOSyM= -cloud.google.com/go/area120 v0.9.1 h1:YfDWbKHRHmhpd8ejTmAeK6eYi3n0qJKvPNEj1ON19PY= -cloud.google.com/go/area120 v0.9.1/go.mod h1:foV1BSrnjVL/KydBnAlUQFSy85kWrMwGSmRfIraC+JU= cloud.google.com/go/area120 v0.9.3 h1:dPQ07rW4eku8OgNWDOaQaVGcE4+XfhH8BSbVwdVQ+wU= cloud.google.com/go/area120 v0.9.3/go.mod h1:F3vxS/+hqzrjJo55Xvda3Jznjjbd+4Foo43SN5eMd8M= -cloud.google.com/go/artifactregistry v1.15.1 h1:ANE2nBEqP2vGGA/5plRRUpatT3E/3ydSK8Z+lXiV69s= -cloud.google.com/go/artifactregistry v1.15.1/go.mod h1:ExJb4VN+IMTQWO5iY+mjcY19Rz9jUxCVGZ1YuyAgPBw= cloud.google.com/go/artifactregistry v1.16.1 h1:ZNXGB6+T7VmWdf6//VqxLdZ/sk0no8W0ujanHeJwDRw= cloud.google.com/go/artifactregistry v1.16.1/go.mod h1:sPvFPZhfMavpiongKwfg93EOwJ18Tnj9DIwTU9xWUgs= -cloud.google.com/go/asset v1.20.2 h1:wAGSAzAmMC/KEFGZ6Z0zv3jOlz1fjBxuO7SiRX9FMuQ= -cloud.google.com/go/asset v1.20.2/go.mod h1:IM1Kpzzo3wq7R/GEiktitzZyXx2zVpWqs9/5EGYs0GY= cloud.google.com/go/asset v1.20.4 h1:6oNgjcs5KCPGBD71G0IccK6TfeFsEtBTyQ3Q+Dn09bs= cloud.google.com/go/asset v1.20.4/go.mod h1:DP09pZ+SoFWUZyPZx26xVroHk+6+9umnQv+01yfJxbM= -cloud.google.com/go/assuredworkloads v1.12.1 h1:B+hWc62fYL8NdntPjx0rzJJ67qx99w6dCeIVDpHf7QE= -cloud.google.com/go/assuredworkloads v1.12.1/go.mod h1:nBnkK2GZNSdtjU3ER75oC5fikub5/+QchbolKgnMI/I= cloud.google.com/go/assuredworkloads v1.12.3 h1:RU1WhF1zMggdXAZ+ezYTn4Eh/FdiX7sz8lLXGERn4Po= cloud.google.com/go/assuredworkloads v1.12.3/go.mod h1:iGBkyMGdtlsxhCi4Ys5SeuvIrPTeI6HeuEJt7qJgJT8= -cloud.google.com/go/auth v0.3.0/go.mod h1:lBv6NKTWp8E3LPzmO1TbiiRKc4drLOfHsgmlH9ogv5w= -cloud.google.com/go/auth v0.9.9/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI= -cloud.google.com/go/auth v0.12.1/go.mod h1:BFMu+TNpF3DmvfBO9ClqTR/SiqVIm7LukKF9mbendF4= -cloud.google.com/go/auth v0.13.0/go.mod h1:COOjD9gwfKNKz+IIduatIhYJQIc0mG3H102r/EMxX6Q= -cloud.google.com/go/auth v0.14.0/go.mod h1:CYsoRL1PdiDuqeQpZE0bP2pnPrGqFcOkI0nldEQis+A= -cloud.google.com/go/auth v0.15.0/go.mod h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8= -cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= -cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= -cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= -cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc= -cloud.google.com/go/automl v1.14.1 h1:IrNnM7oClTzfFcf5XgaZCGwicETU2aCmrGzE8U2DlVs= -cloud.google.com/go/automl v1.14.1/go.mod h1:BocG5mhT32cjmf5CXxVsdSM04VXzJW7chVT7CpSL2kk= cloud.google.com/go/automl v1.14.4 h1:vkD+hQ75SMINMgJBT/KDpFYvfQLzJbtIQZdw0AWq8Rs= cloud.google.com/go/automl v1.14.4/go.mod h1:sVfsJ+g46y7QiQXpVs9nZ/h8ntdujHm5xhjHW32b3n4= -cloud.google.com/go/baremetalsolution v1.3.1 h1:Zbsrhw8vm4Byki+ynVuACZ6jxYiKzi1f8Hac5zXGD8Y= -cloud.google.com/go/baremetalsolution v1.3.1/go.mod h1:D1djGGmBl4M6VlyjOMc1SEzDYlO4EeEG1TCUv5mCPi0= cloud.google.com/go/baremetalsolution v1.3.3 h1:OL+KT+wCumdDhG44aeqGAdkwdT8Wa4Lh+o4INM+CQjw= cloud.google.com/go/baremetalsolution v1.3.3/go.mod h1:uF9g08RfmXTF6ZKbXxixy5cGMGFcG6137Z99XjxLOUI= -cloud.google.com/go/batch v1.11.1 h1:50TRhaaZv7QDCb60KcZUPkGx1oO46srDp5076wZkgI8= -cloud.google.com/go/batch v1.11.1/go.mod h1:4GbJXfdxU8GH6uuo8G47y5tEFOgTLCL9pMKCUcn7VxE= -cloud.google.com/go/batch v1.11.5 h1:TLfFZJXu+89CGbDK2mMql8f6HHFXarr8uUsaQ6wKatU= -cloud.google.com/go/batch v1.11.5/go.mod h1:HUxnmZqnkG7zIZuF3NYCfUIrOMU3+SPArR5XA6NGu5s= cloud.google.com/go/batch v1.12.0 h1:lXuTaELvU0P0ARbTFxxdpOC/dFnZZeGglSw06BtO//8= cloud.google.com/go/batch v1.12.0/go.mod h1:CATSBh/JglNv+tEU/x21Z47zNatLQ/gpGnpyKOzbbcM= -cloud.google.com/go/beyondcorp v1.1.1 h1:owviaab14M9ySEvCj3EZdfzkRLnE+5j4JIkqVaQtEUU= -cloud.google.com/go/beyondcorp v1.1.1/go.mod h1:L09o0gLkgXMxCZs4qojrgpI2/dhWtasMc71zPPiHMn4= cloud.google.com/go/beyondcorp v1.1.3 h1:ezavJc0Gzh4N8zBskO/DnUVMWPa8lqH/tmQSyaknmCA= cloud.google.com/go/beyondcorp v1.1.3/go.mod h1:3SlVKnlczNTSQFuH5SSyLuRd4KaBSc8FH/911TuF/Cc= -cloud.google.com/go/bigquery v1.63.1 h1:/6syiWrSpardKNxdvldS5CUTRJX1iIkSPXCjLjiGL+g= -cloud.google.com/go/bigquery v1.63.1/go.mod h1:ufaITfroCk17WTqBhMpi8CRjsfHjMX07pDrQaRKKX2o= -cloud.google.com/go/bigquery v1.66.0 h1:cDM3xEUUTf6RDepFEvNZokCysGFYoivHHTIZOWXbV2E= -cloud.google.com/go/bigquery v1.66.0/go.mod h1:Cm1hMRzZ8teV4Nn8KikgP8bT9jd54ivP8fvXWZREmG4= cloud.google.com/go/bigquery v1.66.2 h1:EKOSqjtO7jPpJoEzDmRctGea3c2EOGoexy8VyY9dNro= cloud.google.com/go/bigquery v1.66.2/go.mod h1:+Yd6dRyW8D/FYEjUGodIbu0QaoEmgav7Lwhotup6njo= -cloud.google.com/go/bigtable v1.33.0 h1:2BDaWLRAwXO14DJL/u8crbV2oUbMZkIa2eGq8Yao1bk= -cloud.google.com/go/bigtable v1.33.0/go.mod h1:HtpnH4g25VT1pejHRtInlFPnN5sjTxbQlsYBjh9t5l0= -cloud.google.com/go/bigtable v1.34.0 h1:eIgi3QLcN4aq8p6n9U/zPgmHeBP34sm9FiKq4ik/ZoY= -cloud.google.com/go/bigtable v1.34.0/go.mod h1:p94uLf6cy6D73POkudMagaFF3x9c7ktZjRnOUVGjZAw= cloud.google.com/go/bigtable v1.35.0 h1:UEacPwaejN2mNbz67i1Iy3G812rxtgcs6ePj1TAg7dw= cloud.google.com/go/bigtable v1.35.0/go.mod h1:EabtwwmTcOJFXp+oMZAT/jZkyDIjNwrv53TrS4DGrrM= -cloud.google.com/go/billing v1.19.1 h1:BtbMCM9QDWiszfNXEAcq0MB6vgCuc0/yzP3vye2Kz3U= -cloud.google.com/go/billing v1.19.1/go.mod h1:c5l7ORJjOLH/aASJqUqNsEmwrhfjWZYHX+z0fIhuVpo= cloud.google.com/go/billing v1.20.1 h1:xMlO3hc5BI0s23tRB40bL40xSpxUR1x3E07Y5/VWcjU= cloud.google.com/go/billing v1.20.1/go.mod h1:DhT80hUZ9gz5UqaxtK/LNoDELfxH73704VTce+JZqrY= -cloud.google.com/go/binaryauthorization v1.9.1 h1:fVtOG5rVU0eaVh2G2ORdT7nigsnK1R1JpqfGzW861OM= -cloud.google.com/go/binaryauthorization v1.9.1/go.mod h1:jqBzP68bfzjoiMFT6Q1EdZtKJG39zW9ywwzHuv7V8ms= cloud.google.com/go/binaryauthorization v1.9.3 h1:X8JRfmk0/vyRqLusEyAPr0nZCK6RKae9omB4lrit0XI= cloud.google.com/go/binaryauthorization v1.9.3/go.mod h1:f3xcb/7vWklDoF+q2EaAIS+/A/e1278IgiYxonRX+Jk= -cloud.google.com/go/certificatemanager v1.9.1 h1:fULhIdwsz3SoZfiXw8XaxSJBpRTR0xwsJleO+wEbbKA= -cloud.google.com/go/certificatemanager v1.9.1/go.mod h1:a6bXZULtd6iQTRuSVs1fopcHLMJ/T3zSpIB7aJaq/js= cloud.google.com/go/certificatemanager v1.9.3 h1:2UP31fg7b+y3F0OmNbPHOKPEJ+6LOMfxAXX4p8xGCy4= cloud.google.com/go/certificatemanager v1.9.3/go.mod h1:O5T4Lg/dHbDHLFFooV2Mh/VsT3Mj2CzPEWRo4qw5prc= -cloud.google.com/go/channel v1.19.0 h1:YdCa/Y6lhGVeR058gQGhTunEuR9zVuheukKL+pcldgI= -cloud.google.com/go/channel v1.19.0/go.mod h1:8BEvuN5hWL4tT0rmJR4N8xsZHdfGof+KwemjQH6oXsw= cloud.google.com/go/channel v1.19.2 h1:oHyO3QAZ6kdf6SwqnUTBz50ND6Nk2rxZtboUiF4dgLE= cloud.google.com/go/channel v1.19.2/go.mod h1:syX5opXGXFt17DHCyCdbdlM464Tx0gHMi46UlEWY9Gg= -cloud.google.com/go/cloudbuild v1.18.0 h1:82f6g0AzacK1bbO0E5ZqixWc4nRzWu4ichIQ0QKNtAQ= -cloud.google.com/go/cloudbuild v1.18.0/go.mod h1:KCHWGIoS/5fj+By9YmgIQnUiDq8P6YURWOjX3hoc6As= -cloud.google.com/go/cloudbuild v1.20.0 h1:0BRKyrCnWMHlnkwtNKdEwcvpgPm3OA3NqQhzDS5c7ek= -cloud.google.com/go/cloudbuild v1.20.0/go.mod h1:TgSGCsKojPj2JZuYNw5Ur6Pw7oCJ9iK60PuMnaUps7s= cloud.google.com/go/cloudbuild v1.22.0 h1:zmDznviZpvkCla0adbp7jJsMYZ9bABCbcPK2cBUHwg8= cloud.google.com/go/cloudbuild v1.22.0/go.mod h1:p99MbQrzcENHb/MqU3R6rpqFRk/X+lNG3PdZEIhM95Y= -cloud.google.com/go/clouddms v1.8.1 h1:vf5R4/FoLHxEP2BBKEafLHfYFWa6Zd9gwrXe/FjrwUg= -cloud.google.com/go/clouddms v1.8.1/go.mod h1:bmW2eDFH1LjuwkHcKKeeppcmuBGS0r6Qz6TXanehKP0= -cloud.google.com/go/clouddms v1.8.3 h1:T/rkkKE0KhQFMcO3+QWL82xakA9kRumLXY1lq5adIts= -cloud.google.com/go/clouddms v1.8.3/go.mod h1:wn8O2KhhJWcOlQk0pMC7F/4TaJRS5sN6KdNWM8A7o6c= cloud.google.com/go/clouddms v1.8.4 h1:CDOd1nwmP4uek+nZhl4bhRIpzj8jMqoMRqKAfKlgLhw= cloud.google.com/go/clouddms v1.8.4/go.mod h1:RadeJ3KozRwy4K/gAs7W74ZU3GmGgVq5K8sRqNs3HfA= -cloud.google.com/go/cloudtasks v1.13.1 h1:s1JTLBD+WbzQwxYPAwa2WIxPT3kOiv7MSKyvSEgNQtg= -cloud.google.com/go/cloudtasks v1.13.1/go.mod h1:dyRD7tEEkLMbHLagb7UugkDa77UVJp9d/6O9lm3ModI= cloud.google.com/go/cloudtasks v1.13.3 h1:rXdznKjCa7WpzmvR2plrn2KJ+RZC1oYxPiRWNQjjf3k= cloud.google.com/go/cloudtasks v1.13.3/go.mod h1:f9XRvmuFTm3VhIKzkzLCPyINSU3rjjvFUsFVGR5wi24= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= -cloud.google.com/go/compute v1.23.4/go.mod h1:/EJMj55asU6kAFnuZET8zqgwgJ9FvXWXOkkfQZa4ioI= -cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= -cloud.google.com/go/compute v1.28.1 h1:XwPcZjgMCnU2tkwY10VleUjSAfpTj9RDn+kGrbYsi8o= -cloud.google.com/go/compute v1.28.1/go.mod h1:b72iXMY4FucVry3NR3Li4kVyyTvbMDE7x5WsqvxjsYk= -cloud.google.com/go/compute v1.31.1 h1:SObuy8Fs6woazArpXp1fsHCw+ZH4iJ/8dGGTxUhHZQA= -cloud.google.com/go/compute v1.31.1/go.mod h1:hyOponWhXviDptJCJSoEh89XO1cfv616wbwbkde1/+8= cloud.google.com/go/compute v1.34.0 h1:+k/kmViu4TEi97NGaxAATYtpYBviOWJySPZ+ekA95kk= cloud.google.com/go/compute v1.34.0/go.mod h1:zWZwtLwZQyonEvIQBuIa0WvraMYK69J5eDCOw9VZU4g= -cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= -cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= -cloud.google.com/go/contactcenterinsights v1.15.0 h1:jHwyL2TQTaLauRRz5Uv7/sL7PNAK1VAMy/UIT9vsFzk= -cloud.google.com/go/contactcenterinsights v1.15.0/go.mod h1:6bJGBQrJsnATv2s6Dh/c6HCRanq2kCZ0kIIjRV1G0mI= cloud.google.com/go/contactcenterinsights v1.17.1 h1:xJoZbX0HM1zht8KxAB38hs2v4Hcl+vXGLo454LrdwxA= cloud.google.com/go/contactcenterinsights v1.17.1/go.mod h1:n8OiNv7buLA2AkGVkfuvtW3HU13AdTmEwAlAu46bfxY= -cloud.google.com/go/container v1.40.0 h1:JVoEg/4RvoGW37r2Eja/cTBc3X9c2loGWYq7QDsRDuI= -cloud.google.com/go/container v1.40.0/go.mod h1:wNI1mOUivm+ZkpHMbouutgbD4sQxyphMwK31X5cThY4= -cloud.google.com/go/container v1.42.1 h1:eaMrgOl6NCk+Blhh29GgUVe3QGo7IiJQlP0w/EwLoV0= -cloud.google.com/go/container v1.42.1/go.mod h1:5huIxYuOD8Ocuj0KbcyRq9MzB3J1mQObS0KSWHTYceY= cloud.google.com/go/container v1.42.2 h1:8ncSEBjkng6ucCICauaUGzBomoM2VyYzleAum1OFcow= cloud.google.com/go/container v1.42.2/go.mod h1:y71YW7uR5Ck+9Vsbst0AF2F3UMgqmsN4SP8JR9xEsR8= -cloud.google.com/go/containeranalysis v0.13.1 h1:opZRo0HEVLm4ylTbbXw/H68M3vQjdkYOSMfUY63+D+0= -cloud.google.com/go/containeranalysis v0.13.1/go.mod h1:bmd9H880BNR4Hc8JspEg8ge9WccSQfO+/N+CYvU3sEA= cloud.google.com/go/containeranalysis v0.13.3 h1:1D8U75BeotZxrG4jR6NYBtOt+uAeBsWhpBZmSYLakQw= cloud.google.com/go/containeranalysis v0.13.3/go.mod h1:0SYnagA1Ivb7qPqKNYPkCtphhkJn3IzgaSp3mj+9XAY= -cloud.google.com/go/datacatalog v1.22.1 h1:i0DyKb/o7j+0vgaFtimcRFjYsD6wFw1jpnODYUyiYRs= -cloud.google.com/go/datacatalog v1.22.1/go.mod h1:MscnJl9B2lpYlFoxRjicw19kFTwEke8ReKL5Y/6TWg8= cloud.google.com/go/datacatalog v1.24.3 h1:3bAfstDB6rlHyK0TvqxEwaeOvoN9UgCs2bn03+VXmss= cloud.google.com/go/datacatalog v1.24.3/go.mod h1:Z4g33XblDxWGHngDzcpfeOU0b1ERlDPTuQoYG6NkF1s= -cloud.google.com/go/dataflow v0.10.1 h1:RoVpCZ1BjJBH/5mzaXCgNg+l9FgTIYQ7C9xBRGvhkzo= -cloud.google.com/go/dataflow v0.10.1/go.mod h1:zP4/tNjONFRcS4NcI9R94YDQEkPalimdbPkijVNJt/g= cloud.google.com/go/dataflow v0.10.3 h1:+7IfIXzYWSybIIDGK9FN2uqBsP/5b/Y0pBYzNhcmKSU= cloud.google.com/go/dataflow v0.10.3/go.mod h1:5EuVGDh5Tg4mDePWXMMGAG6QYAQhLNyzxdNQ0A1FfW4= -cloud.google.com/go/dataform v0.10.1 h1:FkOPrxf8sN9J2TMc4CIBhVivhMiO8D0eYN33s5A5Uo4= -cloud.google.com/go/dataform v0.10.1/go.mod h1:c5y0hIOBCfszmBcLJyxnELF30gC1qC/NeHdmkzA7TNQ= cloud.google.com/go/dataform v0.10.3 h1:ZpGkZV8OyhUhvN/tfLffU2ki5ERTtqOunkIaiVAhmw0= cloud.google.com/go/dataform v0.10.3/go.mod h1:8SruzxHYCxtvG53gXqDZvZCx12BlsUchuV/JQFtyTCw= -cloud.google.com/go/datafusion v1.8.1 h1:QqiQs3mSXl4gfeHGOTbK0v1y+tUOnxWJgXm6YWvoqY0= -cloud.google.com/go/datafusion v1.8.1/go.mod h1:I5+nRt6Lob4g1eCbcxP4ayRNx8hyOZ8kA3PB/vGd9Lo= cloud.google.com/go/datafusion v1.8.3 h1:FTMtsf2nfGGlDCuE84/RvVaCcTIYE7WQSB0noeO0cwI= cloud.google.com/go/datafusion v1.8.3/go.mod h1:hyglMzE57KRf0Rf/N2VRPcHCwKfZAAucx+LATY6Jc6Q= -cloud.google.com/go/datalabeling v0.9.1 h1:FrnZKagECxQy1bL+GQ1bjgwK9+szi1l7gqw7zp+Raqs= -cloud.google.com/go/datalabeling v0.9.1/go.mod h1:umplHuZX+x5DItNPV5BFBXau5TDsljLNzEj5AB5uRUM= cloud.google.com/go/datalabeling v0.9.3 h1:PqoA3gnOWaLcHCnqoZe4jh3jmiv6+Z7W2xUUkw/j4jE= cloud.google.com/go/datalabeling v0.9.3/go.mod h1:3LDFUgOx+EuNUzDyjU7VElO8L+b5LeaZEFA/ZU1O1XU= -cloud.google.com/go/dataplex v1.19.1 h1:0pgI0DwijXZq8vyLuGnQXSi9JB6eUaVqzpzhN2veUeE= -cloud.google.com/go/dataplex v1.19.1/go.mod h1:WzoQ+vcxrAyM0cjJWmluEDVsg7W88IXXCfuy01BslKE= -cloud.google.com/go/dataplex v1.21.0 h1:oswf105Cr2EwHrW2n7wk3nRZQf7hCe3apE/GqJ8yjvY= -cloud.google.com/go/dataplex v1.21.0/go.mod h1:KXALVHwHdMBhz90IJAUSKh2gK0fEKB6CRjs4f6MrbMU= cloud.google.com/go/dataplex v1.22.0 h1:j4hD6opb+gq9CJNPFIlIggoW8Kjymg8Wmy2mdHmQoiw= cloud.google.com/go/dataplex v1.22.0/go.mod h1:g166QMCGHvwc3qlTG4p34n+lHwu7JFfaNpMfI2uO7b8= cloud.google.com/go/dataproc v1.12.0 h1:W47qHL3W4BPkAIbk4SWmIERwsWBaNnWm0P2sdx3YgGU= -cloud.google.com/go/dataproc/v2 v2.9.0 h1:9fSMjWgFKQfmfKu7V10C5foxU/2iDa8bVkiBB8uh1EU= -cloud.google.com/go/dataproc/v2 v2.9.0/go.mod h1:i4365hSwNP6Bx0SAUnzCC6VloeNxChDjJWH6BfVPcbs= -cloud.google.com/go/dataproc/v2 v2.10.1 h1:2vOv471LrcSn91VNzijcH+OkDRLa3kdyymOfKqbwZ4c= -cloud.google.com/go/dataproc/v2 v2.10.1/go.mod h1:fq+LSN/HYUaaV2EnUPFVPxfe1XpzGVqFnL0TTXs8juk= cloud.google.com/go/dataproc/v2 v2.11.0 h1:6aRpyoRfNOP+r2+pGb7HeHtF+SYQID8kzztfHuK0plk= cloud.google.com/go/dataproc/v2 v2.11.0/go.mod h1:9vgGrn57ra7KBqz+B2KD+ltzEXvnHAUClFgq/ryU99g= -cloud.google.com/go/dataqna v0.9.1 h1:ptKKT+CNwp9Q+9Zxr+npUO7qUwKfyq/oF7/nS7CC6sc= -cloud.google.com/go/dataqna v0.9.1/go.mod h1:86DNLE33yEfNDp5F2nrITsmTYubMbsF7zQRzC3CcZrY= cloud.google.com/go/dataqna v0.9.3 h1:lGUj2FYs650EUPDMV6plWBAoh8qH9Bu1KCz1PUYF2VY= cloud.google.com/go/dataqna v0.9.3/go.mod h1:PiAfkXxa2LZYxMnOWVYWz3KgY7txdFg9HEMQPb4u1JA= -cloud.google.com/go/datastore v1.19.0 h1:p5H3bUQltOa26GcMRAxPoNwoqGkq5v8ftx9/ZBB35MI= -cloud.google.com/go/datastore v1.19.0/go.mod h1:KGzkszuj87VT8tJe67GuB+qLolfsOt6bZq/KFuWaahc= cloud.google.com/go/datastore v1.20.0 h1:NNpXoyEqIJmZFc0ACcwBEaXnmscUpcG4NkKnbCePmiM= cloud.google.com/go/datastore v1.20.0/go.mod h1:uFo3e+aEpRfHgtp5pp0+6M0o147KoPaYNaPAKpfh8Ew= -cloud.google.com/go/datastream v1.11.1 h1:YKY2qGKoxPpAvsDMtmJlIwL59SzhEm1DHM2uM4ib0TY= -cloud.google.com/go/datastream v1.11.1/go.mod h1:a4j5tnptIxdZ132XboR6uQM/ZHcuv/hLqA6hH3NJWgk= -cloud.google.com/go/datastream v1.12.1 h1:j5cIRYJHjx/058aHa4Slip7fl62UTGHCJc4GL9bxQLQ= -cloud.google.com/go/datastream v1.12.1/go.mod h1:GxPeRBsokZ8ylxVJBp9Q39QG+z4Iri5QIBRJrKuzJVQ= cloud.google.com/go/datastream v1.13.0 h1:C5AeEdze55feJVb17a40QmlnyH/aMhn/uf3Go3hIqPA= cloud.google.com/go/datastream v1.13.0/go.mod h1:GrL2+KC8mV4GjbVG43Syo5yyDXp3EH+t6N2HnZb1GOQ= -cloud.google.com/go/deploy v1.23.0 h1:Bmh5UYEeakXtjggRkjVIawXfSBbQsTgDlm96pCw9D3k= -cloud.google.com/go/deploy v1.23.0/go.mod h1:O7qoXcg44Ebfv9YIoFEgYjPmrlPsXD4boYSVEiTqdHY= -cloud.google.com/go/deploy v1.26.1 h1:Hm3pXBzMFJFPOdwtDkg5e/LP53bXqIpwQpjwsVasjhU= -cloud.google.com/go/deploy v1.26.1/go.mod h1:PwF9RP0Jh30Qd+I71wb52oM42LgfRKXRMSg87wKpK3I= cloud.google.com/go/deploy v1.26.2 h1:1c2Cd3jdb0mrKHHfyzSQ5DRmxgYd07tIZZzuMNrwDxU= cloud.google.com/go/deploy v1.26.2/go.mod h1:XpS3sG/ivkXCfzbzJXY9DXTeCJ5r68gIyeOgVGxGNEs= -cloud.google.com/go/dialogflow v1.58.0 h1:RTpoVCJHkgNLK8Co/f7F8ipyg3h8fJIaQzdaAbyg788= -cloud.google.com/go/dialogflow v1.58.0/go.mod h1:sWcyFLdUrg+TWBJVq/OtwDyjcyDOfirTF0Gx12uKy7o= -cloud.google.com/go/dialogflow v1.64.1 h1:6fU4IKLpvgpXqiUCE8gUp8eV5u629SCtiyXMudXtZSg= -cloud.google.com/go/dialogflow v1.64.1/go.mod h1:jkv4vTiGhEUPBzmk1sJ+S1Duu2epCOBNHoWUImHkO5U= cloud.google.com/go/dialogflow v1.66.0 h1:/kfpZw20/3v4sC8czEIuvn3Bu3qOne5aHDYlRYHbu18= cloud.google.com/go/dialogflow v1.66.0/go.mod h1:BPiRTnnXP/tHLot5h/U62Xcp+i6ekRj/bq6uq88p+Lw= -cloud.google.com/go/dlp v1.19.0 h1:AJB26PpDG0gOkf6wxQqbBXs9G+jOVnCjCagOlNiroKM= -cloud.google.com/go/dlp v1.19.0/go.mod h1:cr8dKBq8un5LALiyGkz4ozcwzt3FyTlOwA4/fFzJ64c= -cloud.google.com/go/dlp v1.20.1 h1:qAEGTTtC97zuDm6YPBozNvy4BLBszVCJah3efNytl3g= -cloud.google.com/go/dlp v1.20.1/go.mod h1:NO0PLy43RQV0QI6vZcPiNTR9eiKu9pFzawaueBlDwz8= cloud.google.com/go/dlp v1.21.0 h1:9kz7+gaB/0gBZsDUnNT1asDihNZSrRFSeUTBcBdUAkk= cloud.google.com/go/dlp v1.21.0/go.mod h1:Y9HOVtPoArpL9sI1O33aN/vK9QRwDERU9PEJJfM8DvE= -cloud.google.com/go/documentai v1.34.0 h1:gmBmrTLzbpZkllu2xExISZg2Hh/ai0y605SWdheWHvI= -cloud.google.com/go/documentai v1.34.0/go.mod h1:onJlbHi4ZjQTsANSZJvW7fi2M8LZJrrupXkWDcy4gLY= -cloud.google.com/go/documentai v1.35.1 h1:52RfiUsoblXcE57CfKJGnITWLxRM30BcqNk/BKZl2LI= -cloud.google.com/go/documentai v1.35.1/go.mod h1:WJjwUAQfwQPJORW8fjz7RODprMULDzEGLA2E6WxenFw= cloud.google.com/go/documentai v1.35.2 h1:hswVobCWUTXtmn+4QqUIVkai7sDOe0QS2KB3IpqLkik= cloud.google.com/go/documentai v1.35.2/go.mod h1:oh/0YXosgEq3hVhyH4ZQ7VNXPaveRO4eLVM3tBSZOsI= -cloud.google.com/go/domains v0.10.1 h1:HvZOm7Bx1fQY/MHQAbE5f8YwfJlc0NJVOGh0A0eWckc= -cloud.google.com/go/domains v0.10.1/go.mod h1:RjDl3K8iq/ZZHMVqfZzRuBUr5t85gqA6LEXQBeBL5F4= cloud.google.com/go/domains v0.10.3 h1:wnqN5YwMrtLSjn+HB2sChgmZ6iocOta4Q41giQsiRjY= cloud.google.com/go/domains v0.10.3/go.mod h1:m7sLe18p0PQab56bVH3JATYOJqyRHhmbye6gz7isC7o= -cloud.google.com/go/edgecontainer v1.3.1 h1:loDGWu/sdqnCP3Xlvj4OWHL7i0wocbcLg8ApQ9BE66E= -cloud.google.com/go/edgecontainer v1.3.1/go.mod h1:qyz5+Nk/UAs6kXp6wiux9I2U4A2R624K15QhHYovKKM= cloud.google.com/go/edgecontainer v1.4.1 h1:SwQuHQiheVfL7b5ar/AXDberiaqr/yiue8X55AdWnZU= cloud.google.com/go/edgecontainer v1.4.1/go.mod h1:ubMQvXSxsvtEjJLyqcPFrdWrHfvjQxdoyt+SUrAi5ek= -cloud.google.com/go/errorreporting v0.3.1 h1:E/gLk+rL7u5JZB9oq72iL1bnhVlLrnfslrgcptjJEUE= -cloud.google.com/go/errorreporting v0.3.1/go.mod h1:6xVQXU1UuntfAf+bVkFk6nld41+CPyF2NSPCyXE3Ztk= cloud.google.com/go/errorreporting v0.3.2 h1:isaoPwWX8kbAOea4qahcmttoS79+gQhvKsfg5L5AgH8= cloud.google.com/go/errorreporting v0.3.2/go.mod h1:s5kjs5r3l6A8UUyIsgvAhGq6tkqyBCUss0FRpsoVTww= -cloud.google.com/go/essentialcontacts v1.7.1 h1:qeZAOxqWFfD7sDd1vKYaNhjGh1eckkCkSJyx/OC5egE= -cloud.google.com/go/essentialcontacts v1.7.1/go.mod h1:F/MMWNLRW7b42WwWklOsnx4zrMOWDYWqWykBf1jXKPY= cloud.google.com/go/essentialcontacts v1.7.3 h1:Paw495vxVyKuAgcQ2NQk09iRZBhPYRytknydEnvzcv4= cloud.google.com/go/essentialcontacts v1.7.3/go.mod h1:uimfZgDbhWNCmBpwUUPHe4vcMY2azsq/axC9f7vZFKI= -cloud.google.com/go/eventarc v1.14.1 h1:Tw1DsE1OO9NZ3LZlAtxsi4otVl5qjQ3Y3QD9dCxtAyo= -cloud.google.com/go/eventarc v1.14.1/go.mod h1:NG0YicE+z9MDcmh2u4tlzLDVLRjq5UHZlibyQlPhcxY= cloud.google.com/go/eventarc v1.15.1 h1:RMymT7R87LaxKugOKwooOoheWXUm1NMeOfh3CVU9g54= cloud.google.com/go/eventarc v1.15.1/go.mod h1:K2luolBpwaVOujZQyx6wdG4n2Xum4t0q1cMBmY1xVyI= -cloud.google.com/go/filestore v1.9.1 h1:s8DPPSV80FzIB7rduoMJAgknktms9hZGE3+X9KFUlK8= -cloud.google.com/go/filestore v1.9.1/go.mod h1:g/FNHBABpxjL1M9nNo0nW6vLYIMVlyOKhBKtYGgcKUI= cloud.google.com/go/filestore v1.9.3 h1:vTXQI5qYKZ8dmCyHN+zVfaMyXCYbyZNM0CkPzpPUn7Q= cloud.google.com/go/filestore v1.9.3/go.mod h1:Me0ZRT5JngT/aZPIKpIK6N4JGMzrFHRtGHd9ayUS4R4= -cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/BtmeVTMmjrm4yhk= -cloud.google.com/go/firestore v1.17.0 h1:iEd1LBbkDZTFsLw3sTH50eyg4qe8eoG6CjocmEXO9aQ= -cloud.google.com/go/firestore v1.17.0/go.mod h1:69uPx1papBsY8ZETooc71fOhoKkD70Q1DwMrtKuOT/Y= cloud.google.com/go/firestore v1.18.0 h1:cuydCaLS7Vl2SatAeivXyhbhDEIR8BDmtn4egDhIn2s= cloud.google.com/go/firestore v1.18.0/go.mod h1:5ye0v48PhseZBdcl0qbl3uttu7FIEwEYVaWm0UIEOEU= -cloud.google.com/go/functions v1.19.1 h1:eWjTZohtJX/9rckZYXaYVViGi06JkNJRKvm0aO+ce+g= -cloud.google.com/go/functions v1.19.1/go.mod h1:18RszySpwRg6aH5UTTVsRfdCwDooSf/5mvSnU7NAk4A= cloud.google.com/go/functions v1.19.3 h1:V0vCHSgFTUqKn57+PUXp1UfQY0/aMkveAw7wXeM3Lq0= cloud.google.com/go/functions v1.19.3/go.mod h1:nOZ34tGWMmwfiSJjoH/16+Ko5106x+1Iji29wzrBeOo= cloud.google.com/go/gaming v1.9.0 h1:7vEhFnZmd931Mo7sZ6pJy7uQPDxF7m7v8xtBheG08tc= -cloud.google.com/go/gkebackup v1.6.1 h1:bV1go067LF5XaobFXXvgW2rsuvR974ajirDjD9oXFWg= -cloud.google.com/go/gkebackup v1.6.1/go.mod h1:CEnHQCsNBn+cyxcxci0qbAPYe8CkivNEitG/VAZ08ms= cloud.google.com/go/gkebackup v1.6.3 h1:djdExe/QgoKdp1gnIO1G5BoO1o/yGQOQJJEZ4QKTEXQ= cloud.google.com/go/gkebackup v1.6.3/go.mod h1:JJzGsA8/suXpTDtqI7n9RZW97PXa2CIp+n8aRC/y57k= -cloud.google.com/go/gkeconnect v0.11.1 h1:X7UpDP2Qg8JfaQ6vsJeFsTo4NcrGprk9Tg4Pf7MK8Qg= -cloud.google.com/go/gkeconnect v0.11.1/go.mod h1:Vu3UoOI2c0amGyv4dT/EmltzscPH41pzS4AXPqQLej0= cloud.google.com/go/gkeconnect v0.12.1 h1:YVpR0vlHSP/wD74PXEbKua4Aamud+wiYm4TiewNjD3M= cloud.google.com/go/gkeconnect v0.12.1/go.mod h1:L1dhGY8LjINmWfR30vneozonQKRSIi5DWGIHjOqo58A= -cloud.google.com/go/gkehub v0.15.1 h1:VMXUz3q9Vfhe+dtSjb/yqmiDmGbcEUTuXDyk0pj2GyU= -cloud.google.com/go/gkehub v0.15.1/go.mod h1:cyUwa9iFQYd/pI7IQYl6A+OF6M8uIbhmJr090v9Z4UU= cloud.google.com/go/gkehub v0.15.3 h1:yZ6lNJ9rNIoQmWrG14dB3+BFjS/EIRBf7Bo6jc5QWlE= cloud.google.com/go/gkehub v0.15.3/go.mod h1:nzFT/Q+4HdQES/F+FP1QACEEWR9Hd+Sh00qgiH636cU= -cloud.google.com/go/gkemulticloud v1.4.0 h1:t2HXXYrICui+rZXScietjU1YdrQDLXpfqqrTo7zWSYQ= -cloud.google.com/go/gkemulticloud v1.4.0/go.mod h1:rg8YOQdRKEtMimsiNCzZUP74bOwImhLRv9wQ0FwBUP4= cloud.google.com/go/gkemulticloud v1.5.1 h1:JWe6PDNpNU88ZYvQkTd7w28fgeIs/gg6i0hcjUkgZ3M= cloud.google.com/go/gkemulticloud v1.5.1/go.mod h1:OdmhfSPXuJ0Kn9dQ2I3Ou7XZ3QK8caV4XVOJZwrIa3s= cloud.google.com/go/grafeas v0.2.0 h1:CYjC+xzdPvbV65gi6Dr4YowKcmLo045pm18L0DhdELM= -cloud.google.com/go/grafeas v0.3.10 h1:D9uP/DjVHq9ZzCekVd+aNvQEHb3Hkwp8ki9FDnhRRJ0= -cloud.google.com/go/grafeas v0.3.10/go.mod h1:Mz/AoXmxNhj74VW0fz5Idc3kMN2VZMi4UT5+UPx5Pq0= -cloud.google.com/go/grafeas v0.3.11 h1:CobnwnyeY1j1Defi5vbEircI+jfrk3ci5m004ZjiFP4= -cloud.google.com/go/grafeas v0.3.11/go.mod h1:dcQyG2+T4tBgG0MvJAh7g2wl/xHV2w+RZIqivwuLjNg= -cloud.google.com/go/gsuiteaddons v1.7.1 h1:YLh58kzaK+1Q/CHe8Cjp3hf9ZjNdJkQMavjrJUDgi9o= -cloud.google.com/go/gsuiteaddons v1.7.1/go.mod h1:SxM63xEPFf0p/plgh4dP82mBSKtp2RWskz5DpVo9jh8= -cloud.google.com/go/gsuiteaddons v1.7.3 h1:QafYhVhyFGpidBUUlVhy6lUHFogFOycVYm9DV7MinhA= -cloud.google.com/go/gsuiteaddons v1.7.3/go.mod h1:0rR+LC21v1Sx1Yb6uohHI/F8DF3h2arSJSHvfi3GmyQ= cloud.google.com/go/gsuiteaddons v1.7.4 h1:f3eMYsCDdg2AeldIPdKmBRxN1WoiTpE3RvX5orcm/I8= cloud.google.com/go/gsuiteaddons v1.7.4/go.mod h1:gpE2RUok+HUhuK7RPE/fCOEgnTffS0lCHRaAZLxAMeE= -cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= -cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= -cloud.google.com/go/iam v1.4.0/go.mod h1:gMBgqPaERlriaOV0CUl//XUzDhSfXevn4OEUbg6VRs4= -cloud.google.com/go/iap v1.10.1 h1:YF4jmMwEWXYrbfZZz024ozBXnWxUxJHzmkM6ccIzM0A= -cloud.google.com/go/iap v1.10.1/go.mod h1:UKetCEzOZ4Zj7l9TSN/wzRNwbgIYzm4VM4bStaQ/tFc= cloud.google.com/go/iap v1.10.3 h1:OWNYFHPyIBNHEAEFdVKOltYWe0g3izSrpFJW6Iidovk= cloud.google.com/go/iap v1.10.3/go.mod h1:xKgn7bocMuCFYhzRizRWP635E2LNPnIXT7DW0TlyPJ8= -cloud.google.com/go/ids v1.5.1 h1:UkHpZnlW46WulDVNtzKN+SEntZoOoHoG/Ob1GtuVCGQ= -cloud.google.com/go/ids v1.5.1/go.mod h1:d/9jTtY506mTxw/nHH3UN4TFo80jhAX+tESwzj42yFo= cloud.google.com/go/ids v1.5.3 h1:wbFF7twu0XScFr+dtsVxTTttbFIRYt/SJjZiHFidtYE= cloud.google.com/go/ids v1.5.3/go.mod h1:a2MX8g18Eqs7yxD/pnEdid42SyBUm9LIzSWf8Jux9OY= -cloud.google.com/go/iot v1.8.1 h1:PySjOJ2Nni1IDk0LqcNhUCKOGe0yPP4rM/Nc5yA/cjI= -cloud.google.com/go/iot v1.8.1/go.mod h1:FNceQ9/EGvbE2az7RGoGPY0aqrsyJO3/LqAL0h83fZw= cloud.google.com/go/iot v1.8.3 h1:aPWYQ+A1NX6ou/5U0nFAiXWdVT8OBxZYVZt2fBl2gWA= cloud.google.com/go/iot v1.8.3/go.mod h1:dYhrZh+vUxIQ9m3uajyKRSW7moF/n0rYmA2PhYAkMFE= -cloud.google.com/go/language v1.14.1 h1:lyBks2W2k7bVPvfEECH08eMOP3Vd7zkHCATt/Vy0sLM= -cloud.google.com/go/language v1.14.1/go.mod h1:WaAL5ZdLLBjiorXl/8vqgb6/Fyt2qijl96c1ZP/vdc8= cloud.google.com/go/language v1.14.3 h1:8hmFMiS3wjjj3TX/U1zZYTgzwZoUjDbo9PaqcYEmuB4= cloud.google.com/go/language v1.14.3/go.mod h1:hjamj+KH//QzF561ZuU2J+82DdMlFUjmiGVWpovGGSA= -cloud.google.com/go/lifesciences v0.10.1 h1:sGTR+IW9I85VhP789GMHNYOyCo7dkmvWRYh0uOfmWdo= -cloud.google.com/go/lifesciences v0.10.1/go.mod h1:5D6va5/Gq3gtJPKSsE6vXayAigfOXK2eWLTdFUOTCDs= cloud.google.com/go/lifesciences v0.10.3 h1:Z05C+Ui953f0EQx9hJ1la6+QQl8ADrIs3iNwP5Elkpg= cloud.google.com/go/lifesciences v0.10.3/go.mod h1:hnUUFht+KcZcliixAg+iOh88FUwAzDQQt5tWd7iIpNg= -cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk= -cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM= -cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= -cloud.google.com/go/longrunning v0.5.6/go.mod h1:vUaDrWYOMKRuhiv6JBnn49YxCPz2Ayn9GqyjaBT8/mA= -cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= -cloud.google.com/go/longrunning v0.6.4/go.mod h1:ttZpLCe6e7EXvn9OxpBRx7kZEB0efv8yBO6YnVMfhJs= -cloud.google.com/go/managedidentities v1.7.1 h1:9hC4E7JnWn/jSUls022Sj9ri+vriGnLzvDXo0cs1zcA= -cloud.google.com/go/managedidentities v1.7.1/go.mod h1:iK4qqIBOOfePt5cJR/Uo3+uol6oAVIbbG7MGy917cYM= cloud.google.com/go/managedidentities v1.7.3 h1:b9xGs24BIjfyvLgCtJoClOZpPi8d8owPgWe5JEINgaY= cloud.google.com/go/managedidentities v1.7.3/go.mod h1:H9hO2aMkjlpY+CNnKWRh+WoQiUIDO8457wWzUGsdtLA= -cloud.google.com/go/maps v1.14.0 h1:bLT2nvuOm4ye6YRgIJQ0L9zbKcbBj+TCg8k2g3c2Qlk= -cloud.google.com/go/maps v1.14.0/go.mod h1:UepOes9un0UP7i8JBiaqgh8jqUaZAHVRXCYjrVlhSC8= -cloud.google.com/go/maps v1.17.1 h1:u7U/DieTxYYMDyvHQ00la5ayXLjDImTfnhdAsyPZXyY= -cloud.google.com/go/maps v1.17.1/go.mod h1:lGZCm2ILmN06GQyrRQwA1rScqQZuApQsCTX+0v+bdm8= cloud.google.com/go/maps v1.19.0 h1:deVm1ZFyCrUwxG11CdvtBz350VG5JUQ/LHTLnQrBgrM= cloud.google.com/go/maps v1.19.0/go.mod h1:goHUXrmzoZvQjUVd0KGhH8t3AYRm17P8b+fsyR1UAmQ= -cloud.google.com/go/mediatranslation v0.9.1 h1:7X1cA4TWO0+r1RT0JTT0RE+SyO41eoFUmBDw17Oi9T8= -cloud.google.com/go/mediatranslation v0.9.1/go.mod h1:vQH1amULNhSGryBjbjLb37g54rxrOwVxywS8WvUCsIU= cloud.google.com/go/mediatranslation v0.9.3 h1:nRBjeaMLipw05Br+qDAlSCcCQAAlat4mvpafztbEVgc= cloud.google.com/go/mediatranslation v0.9.3/go.mod h1:KTrFV0dh7duYKDjmuzjM++2Wn6yw/I5sjZQVV5k3BAA= -cloud.google.com/go/memcache v1.11.1 h1:2FGuyd3WY7buNDAkMBdmeIOheNWA3gwaXrttLrEdabI= -cloud.google.com/go/memcache v1.11.1/go.mod h1:3zF+dEqmEmElHuO4NtHiShekQY5okQtssjPBv7jpmZ8= cloud.google.com/go/memcache v1.11.3 h1:XH/qT3GbbSH//R0JTqR77lRpBxaa0N9sHgAzfwbTrv0= cloud.google.com/go/memcache v1.11.3/go.mod h1:UeWI9cmY7hvjU1EU6dwJcQb6EFG4GaM3KNXOO2OFsbI= -cloud.google.com/go/metastore v1.14.1 h1:kGx+IUSSYCVn8LisCT4fpxCC9rauEVonzi7RlygdqWY= -cloud.google.com/go/metastore v1.14.1/go.mod h1:WDvsAcbQLl9M4xL+eIpbKogH7aEaPWMhO9aRBcFOnJE= cloud.google.com/go/metastore v1.14.3 h1:jDqeCw6NGDRAPT9+2Y/EjnWAB0BfCcUfmPLOyhB0eHs= cloud.google.com/go/metastore v1.14.3/go.mod h1:HlbGVOvg0ubBLVFRk3Otj3gtuzInuzO/TImOBwsKlG4= -cloud.google.com/go/monitoring v1.21.1/go.mod h1:Rj++LKrlht9uBi8+Eb530dIrzG/cU/lB8mt+lbeFK1c= -cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= -cloud.google.com/go/monitoring v1.22.1/go.mod h1:AuZZXAoN0WWWfsSvET1Cpc4/1D8LXq8KRDU87fMS6XY= -cloud.google.com/go/networkconnectivity v1.15.1 h1:EizN+cFGHzRAyiFTK8jT1PqTo+cSnbc2IGh6OmllS7Y= -cloud.google.com/go/networkconnectivity v1.15.1/go.mod h1:tYAcT4Ahvq+BiePXL/slYipf/8FF0oNJw3MqFhBnSPI= cloud.google.com/go/networkconnectivity v1.16.1 h1:YsVhG71ZC4FkqCP2oCI55x/JeGFyd7738Lt8iNTrzJw= cloud.google.com/go/networkconnectivity v1.16.1/go.mod h1:GBC1iOLkblcnhcnfRV92j4KzqGBrEI6tT7LP52nZCTk= -cloud.google.com/go/networkmanagement v1.14.1 h1:0x3hVI6xbp3N/choffKPHMSxbzaPdHSD92cBElebXEk= -cloud.google.com/go/networkmanagement v1.14.1/go.mod h1:3Ds8FZ3ZHjTVEedsBoZi9ef9haTE14iS6swTSqM39SI= cloud.google.com/go/networkmanagement v1.18.0 h1:oEoFGPYxTBsY47h0zdoE2ojV5aU/541D83UmxfjHWaE= cloud.google.com/go/networkmanagement v1.18.0/go.mod h1:yTxpAFuvQOOKgL3W7+k2Rp1bSKTxyRcZ5xNHGdHUM6w= -cloud.google.com/go/networksecurity v0.10.1 h1:dHN1la6xnta3E4QtWGqtc8ZAPKIZH5m8UQceIIuXZIs= -cloud.google.com/go/networksecurity v0.10.1/go.mod h1:tatO1hYJ9nNChLHOFdsjex5FeqZBlPQgKdKOex7REpU= cloud.google.com/go/networksecurity v0.10.3 h1:JLJBFbxc8D7/OS81MyRoKhc2OvnVJxy5VMoQqqAhA7k= cloud.google.com/go/networksecurity v0.10.3/go.mod h1:G85ABVcPscEgpw+gcu+HUxNZJWjn3yhTqEU7+SsltFM= -cloud.google.com/go/notebooks v1.12.1 h1:0g61C2qdWcq2p8OFH3NiLzyneS1LFfsveC5+MnpM4p8= -cloud.google.com/go/notebooks v1.12.1/go.mod h1:RJCyRkLjj8UnvLEKaDl9S6//xUCa+r+d/AsxZnYBl50= cloud.google.com/go/notebooks v1.12.3 h1:+9DrGJcZhCu6B2t0JJorekjIUBvg/KvBmXJYGmfvVvA= cloud.google.com/go/notebooks v1.12.3/go.mod h1:I0pMxZct+8Rega2LYrXL8jGAGZgLchSmh8Ksc+0xNyA= -cloud.google.com/go/optimization v1.7.1 h1:E3/1qRZvGxqQpapaac/EKuzusxUauXLnpirWWXXzP5k= -cloud.google.com/go/optimization v1.7.1/go.mod h1:s2AjwwQEv6uExFmgS4Bf1gidI07w7jCzvvs8exqR1yk= cloud.google.com/go/optimization v1.7.3 h1:JwQjjoBZJpsoMQe/3mhVBMVZuSdagHg2pGOnwh2Jk+E= cloud.google.com/go/optimization v1.7.3/go.mod h1:GlYFp4Mju0ybK5FlOUtV6zvWC00TIScdbsPyF6Iv144= -cloud.google.com/go/orchestration v1.11.0 h1:yyi0kM47UZaJ3EEFYsBwfrkvqyPmvHwsoc3asxDmLuo= -cloud.google.com/go/orchestration v1.11.0/go.mod h1:s3L89jinQaUHclqgWYw8JhBbzGSidVt5rVBxGrXeheI= cloud.google.com/go/orchestration v1.11.4 h1:SFAsKyqvtS8VFcsq+JgXAeRkrksB9UH+AH7iFamkmlc= cloud.google.com/go/orchestration v1.11.4/go.mod h1:UKR2JwogaZmDGnAcBgAQgCPn89QMqhXFUCYVhHd31vs= -cloud.google.com/go/orgpolicy v1.14.0 h1:UuLmi1+94lIS3tCoeuinuwx4oxdx58nECiAvfwCW0SM= -cloud.google.com/go/orgpolicy v1.14.0/go.mod h1:S6Pveh1JOxpSbs6+2ToJG7h3HwqC6Uf1YQ6JYG7wdM8= cloud.google.com/go/orgpolicy v1.14.2 h1:WFvgmjq/FO5GiXlhebltA9N14KdbLMcgG88ME+SWeBo= cloud.google.com/go/orgpolicy v1.14.2/go.mod h1:2fTDMT3X048iFKxc6DEgkG+a/gN+68qEgtPrHItKMzo= -cloud.google.com/go/osconfig v1.14.1 h1:67ISL0vZVfq0se+1cPRMYgwTjsES2k9vmSmn8ZS0O5g= -cloud.google.com/go/osconfig v1.14.1/go.mod h1:Rk62nyQscgy8x4bICaTn0iWiip5EpwEfG2UCBa2TP/s= cloud.google.com/go/osconfig v1.14.3 h1:cyf1PMK5c2/WOIr5r2lxjH/XBJMA9P4zC8Tm10i0z3M= cloud.google.com/go/osconfig v1.14.3/go.mod h1:9D2MS1Etne18r/mAeW5jtto3toc9H1qu9wLNDG3NvQg= -cloud.google.com/go/oslogin v1.14.1 h1:HPPg7FWPwt7pKrbl+8VFI9UuJTbVrG2rSMHl4HkDAG4= -cloud.google.com/go/oslogin v1.14.1/go.mod h1:mM/isJYnohyD3EfM12Fhy8uye46gxA1WjHRCwbkmlVw= cloud.google.com/go/oslogin v1.14.3 h1:yomxnFPk+ye0zd0mJ15nn9fH4Ns7ex4xA3ll+u2q59A= cloud.google.com/go/oslogin v1.14.3/go.mod h1:fDEGODTG/W9ZGUTHTlMh8euXWC1fTcgjJ9Kcxxy14a8= -cloud.google.com/go/phishingprotection v0.9.1 h1:oUEGd4dttG5gIUmICdCh8A1U9iVQiw0TGwvYIGQ2I7U= -cloud.google.com/go/phishingprotection v0.9.1/go.mod h1:LRiflQnCpYKCMhsmhNB3hDbW+AzQIojXYr6q5+5eRQk= cloud.google.com/go/phishingprotection v0.9.3 h1:T5mGFV0ggBKg3qt9myFRiGJu+nIUucuHLAtVpAuQ08I= cloud.google.com/go/phishingprotection v0.9.3/go.mod h1:ylzN9HruB/X7dD50I4sk+FfYzuPx9fm5JWsYI0t7ncc= -cloud.google.com/go/policytroubleshooter v1.11.1 h1:/b3wruB/KvmCpy9Jfducc8TQmM3bsoPaeCs5z7TRodA= -cloud.google.com/go/policytroubleshooter v1.11.1/go.mod h1:9nJIpgQ2vloJbB8y1JkPL5vxtaSdJnJYPCUvt6PpfRs= cloud.google.com/go/policytroubleshooter v1.11.3 h1:ekIWI8JbKkpOfrgH/THGamQE/D16tcVBYJyrkseVcYI= cloud.google.com/go/policytroubleshooter v1.11.3/go.mod h1:AFHlORqh4AnMC0twc2yPKfzlozp3DO0yo9OfOd9aNOs= -cloud.google.com/go/privatecatalog v0.10.1 h1:Ew51FHLLQsUYUDJY57eMB/mVUOoWLIji957MRw4kumw= -cloud.google.com/go/privatecatalog v0.10.1/go.mod h1:mFmn5bjE9J8MEjQuu1fOc4AxOP2MoEwDLMJk04xqQCQ= cloud.google.com/go/privatecatalog v0.10.4 h1:fu2LABMi7CgZORQ2oNGbc0hoZ0FTqLkjGqIgAV/Kc7U= cloud.google.com/go/privatecatalog v0.10.4/go.mod h1:n/vXBT+Wq8B4nSRUJNDsmqla5BYjbVxOlHzS6PjiF+w= -cloud.google.com/go/pubsub v1.44.0 h1:pLaMJVDTlnUDIKT5L0k53YyLszfBbGoUBo/IqDK/fEI= -cloud.google.com/go/pubsub v1.44.0/go.mod h1:BD4a/kmE8OePyHoa1qAHEw1rMzXX+Pc8Se54T/8mc3I= -cloud.google.com/go/pubsub v1.45.3 h1:prYj8EEAAAwkp6WNoGTE4ahe0DgHoyJd5Pbop931zow= -cloud.google.com/go/pubsub v1.45.3/go.mod h1:cGyloK/hXC4at7smAtxFnXprKEFTqmMXNNd9w+bd94Q= cloud.google.com/go/pubsub v1.47.0 h1:Ou2Qu4INnf7ykrFjGv2ntFOjVo8Nloh/+OffF4mUu9w= cloud.google.com/go/pubsub v1.47.0/go.mod h1:LaENesmga+2u0nDtLkIOILskxsfvn/BXX9Ak1NFxOs8= cloud.google.com/go/pubsublite v1.8.2 h1:jLQozsEVr+c6tOU13vDugtnaBSUy/PD5zK6mhm+uF1Y= cloud.google.com/go/pubsublite v1.8.2/go.mod h1:4r8GSa9NznExjuLPEJlF1VjOPOpgf3IT6k8x/YgaOPI= cloud.google.com/go/recaptchaenterprise v1.3.1 h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQlyjGE9a4exk6iNQ= -cloud.google.com/go/recaptchaenterprise/v2 v2.17.2 h1:tHFLYu+8w0jjjGf63D4qgVEKS9R3lw4XP4Q1P4df2g8= -cloud.google.com/go/recaptchaenterprise/v2 v2.17.2/go.mod h1:iigNZOnUpf++xlm8RdMZJTX/PihYVMrHidRLjHuekec= cloud.google.com/go/recaptchaenterprise/v2 v2.19.4 h1:T5YGzaXwTesHaPDNTAuU3neDwZEnfjce70zufPFUwno= cloud.google.com/go/recaptchaenterprise/v2 v2.19.4/go.mod h1:WaglfocMJGkqZVdXY/FVB7OhoVRONPS4uXqtNn6HfX0= -cloud.google.com/go/recommendationengine v0.9.1 h1:TQne3UMow6joFVRtTpd9kDYyYr3Jkpq+o0vJkpQgZYI= -cloud.google.com/go/recommendationengine v0.9.1/go.mod h1:FfWa3OnsnDab4unvTZM2VJmvoeGn1tnntF3n+vmfyzU= cloud.google.com/go/recommendationengine v0.9.3 h1:kBpcYPx4ys4lrDGKp4OhP2uy8h7UjlmLW/qoO5Xb2bY= cloud.google.com/go/recommendationengine v0.9.3/go.mod h1:QRnX5aM7DCvtqtSs7I0zay5Zfq3fzxqnsPbZF7pa1G8= -cloud.google.com/go/recommender v1.13.1 h1:aQIUpMynK1pU1Q+EiuL7VJssLLjLwnfhL7px0vgM6xA= -cloud.google.com/go/recommender v1.13.1/go.mod h1:l+n8rNMC6jZacckzLvVG/2LzKawlwAJYNO8Vl2pBlxc= cloud.google.com/go/recommender v1.13.3 h1:dVlOjxsbjuhlwu4MIcyPWe09qVcDqc419iOjdPl5RHk= cloud.google.com/go/recommender v1.13.3/go.mod h1:6yAmcfqJRKglZrVuTHsieTFEm4ai9JtY3nQzmX4TC0Q= -cloud.google.com/go/redis v1.17.1 h1:E7TeGsvyoFB+m59bqFKrQ5GSH7+uW8cUDk6Y7iqGjJ0= -cloud.google.com/go/redis v1.17.1/go.mod h1:YJHeYfSoW/agIMeCvM5rszxu75mVh5DOhbu3AEZEIQM= -cloud.google.com/go/redis v1.17.3 h1:ROQXi5dCDSJCVezt/2nD1g+Ym0T6sio3DIzZ56NgMZI= -cloud.google.com/go/redis v1.17.3/go.mod h1:23OoThXAU5bvhg4/oKsEcdVfq3wmyTEPNA9FP/t9xGo= cloud.google.com/go/redis v1.18.0 h1:xcu35SCyHSp+nKV6QNIklgkBKTH1qb0aLUXjl0mSR8I= cloud.google.com/go/redis v1.18.0/go.mod h1:fJ8dEQJQ7DY+mJRMkSafxQCuc8nOyPUwo9tXJqjvNEY= -cloud.google.com/go/resourcemanager v1.10.1 h1:fO/QoSJ1lepmTM9dCbSXYWgTIhecmQkpY0mM1X9OGN0= -cloud.google.com/go/resourcemanager v1.10.1/go.mod h1:A/ANV/Sv7y7fcjd4LSH7PJGTZcWRkO/69yN5UhYUmvE= cloud.google.com/go/resourcemanager v1.10.3 h1:SHOMw0kX0xWratC5Vb5VULBeWiGlPYAs82kiZqNtWpM= cloud.google.com/go/resourcemanager v1.10.3/go.mod h1:JSQDy1JA3K7wtaFH23FBGld4dMtzqCoOpwY55XYR8gs= -cloud.google.com/go/resourcesettings v1.8.1 h1:whJgmR9I5V9TSZiaoCPVDgbYD1jghYoauHVfBG8TvHI= -cloud.google.com/go/resourcesettings v1.8.1/go.mod h1:6V87tIXUpvJMskim6YUa+TRDTm7v6OH8FxLOIRYosl4= cloud.google.com/go/resourcesettings v1.8.3 h1:13HOFU7v4cEvIHXSAQbinF4wp2Baybbq7q9FMctg1Ek= cloud.google.com/go/resourcesettings v1.8.3/go.mod h1:BzgfXFHIWOOmHe6ZV9+r3OWfpHJgnqXy8jqwx4zTMLw= -cloud.google.com/go/retail v1.19.0 h1:OrXxtP/asKi7vFReWmQH5kXrMRPZ2R9Zw92x8O93PMA= -cloud.google.com/go/retail v1.19.0/go.mod h1:QMhO+nkvN6Mns1lu6VXmteY0I3mhwPj9bOskn6PK5aY= cloud.google.com/go/retail v1.19.2 h1:PT6CUlazIFIOLLJnV+bPBtiSH8iusKZ+FZRzZYFt2vk= cloud.google.com/go/retail v1.19.2/go.mod h1:71tRFYAcR4MhrZ1YZzaJxr030LvaZiIcupH7bXfFBcY= -cloud.google.com/go/run v1.6.0 h1:LRJvntufFKJ0Jcwt7BbIHwf/0Ipq4twzyJcH1qSEs84= -cloud.google.com/go/run v1.6.0/go.mod h1:DXkPPa8bZ0jfRGLT+EKIlPbHvosBYBMdxTgo9EBbXZE= -cloud.google.com/go/run v1.8.1 h1:aeVLygw0BGLH+Zbj8v3K3nEHvKlgoq+j8fcRJaYZtxY= -cloud.google.com/go/run v1.8.1/go.mod h1:wR5IG8Nujk9pyyNai187K4p8jzSLeqCKCAFBrZ2Sd4c= cloud.google.com/go/run v1.9.0 h1:9WeTqeEcriXqRViXMNwczjFJjixOSBlSlk/fW3lfKPg= cloud.google.com/go/run v1.9.0/go.mod h1:Dh0+mizUbtBOpPEzeXMM22t8qYQpyWpfmUiWQ0+94DU= -cloud.google.com/go/scheduler v1.11.1 h1:uGaM4mRrGkJ0LLBMyxD8qbvIko4y+UlSOwJQqRd/lW8= -cloud.google.com/go/scheduler v1.11.1/go.mod h1:ptS76q0oOS8hCHOH4Fb/y8YunPEN8emaDdtw0D7W1VE= -cloud.google.com/go/scheduler v1.11.3 h1:p6+h8BoYJC+TvUijGBfORN6nuhOvJ3EwZ2H84CZ1ZEU= -cloud.google.com/go/scheduler v1.11.3/go.mod h1:Io2+gcvUjLX1GdymwaSPJ6ZYxHN9/NNGL5kIV3Ax5+Q= cloud.google.com/go/scheduler v1.11.4 h1:ewVvigBnEnrr9Ih8CKnLVoB5IiULaWfYU5nEnnfVAto= cloud.google.com/go/scheduler v1.11.4/go.mod h1:0ylvH3syJnRi8EDVo9ETHW/vzpITR/b+XNnoF+GPSz4= -cloud.google.com/go/secretmanager v1.14.1 h1:xlWSIg8rtBn5qCr2f3XtQP19+5COyf/ll49SEvi/0vM= -cloud.google.com/go/secretmanager v1.14.1/go.mod h1:L+gO+u2JA9CCyXpSR8gDH0o8EV7i/f0jdBOrUXcIV0U= -cloud.google.com/go/secretmanager v1.14.3 h1:XVGHbcXEsbrgi4XHzgK5np81l1eO7O72WOXHhXUemrM= -cloud.google.com/go/secretmanager v1.14.3/go.mod h1:Pwzcfn69Ni9Lrk1/XBzo1H9+MCJwJ6CDCoeoQUsMN+c= cloud.google.com/go/secretmanager v1.14.5 h1:W++V0EL9iL6T2+ec24Dm++bIti0tI6Gx6sCosDBters= cloud.google.com/go/secretmanager v1.14.5/go.mod h1:GXznZF3qqPZDGZQqETZwZqHw4R6KCaYVvcGiRBA+aqY= -cloud.google.com/go/security v1.18.1 h1:w7XbMR90Ir0y8NUxKJ3uyRHuHYWPUxVI5Z/sGqbrdAQ= -cloud.google.com/go/security v1.18.1/go.mod h1:5P1q9rqwt0HuVeL9p61pTqQ6Lgio1c64jL2ZMWZV21Y= cloud.google.com/go/security v1.18.3 h1:ya9gfY1ign6Yy25VMMMgZ9xy7D/TczDB0ElXcyWmEVE= cloud.google.com/go/security v1.18.3/go.mod h1:NmlSnEe7vzenMRoTLehUwa/ZTZHDQE59IPRevHcpCe4= -cloud.google.com/go/securitycenter v1.35.1 h1:unUyFDeSHv89W7FPBMk10mf3R7+taAJ+1ow+0zpCzGw= -cloud.google.com/go/securitycenter v1.35.1/go.mod h1:UDeknPuHWi15TaxrJCIv3aN1VDTz9nqWVUmW2vGayTo= -cloud.google.com/go/securitycenter v1.35.3 h1:H8UvBpcvs1OjI4jZuXX8xsN1IZo88a9PezHXkU2sGps= -cloud.google.com/go/securitycenter v1.35.3/go.mod h1:kjsA8Eg4jlMHW1JwxbMC8148I+gcjgkWPdbDycatoRQ= cloud.google.com/go/securitycenter v1.36.0 h1:IdDiAa7gYtL7Gdx+wEaNHimudk3ZkEGNhdz9FuEuxWM= cloud.google.com/go/securitycenter v1.36.0/go.mod h1:AErAQqIvrSrk8cpiItJG1+ATl7SD7vQ6lgTFy/Tcs4Q= cloud.google.com/go/servicecontrol v1.11.1 h1:d0uV7Qegtfaa7Z2ClDzr9HJmnbJW7jn0WhZ7wOX6hLE= -cloud.google.com/go/servicedirectory v1.12.1 h1:LjbIXEZiyqsIADrj6Y81FnbSlaHPQHJ8UDQQnUegowc= -cloud.google.com/go/servicedirectory v1.12.1/go.mod h1:d2H6joDMjnTQ4cUUCZn6k9NgZFbXjLVJbHETjoJR9k0= cloud.google.com/go/servicedirectory v1.12.3 h1:oFkCp6ti7fc7hzeROmOPQuPBHFqwyhcsv3Yrma28+uc= cloud.google.com/go/servicedirectory v1.12.3/go.mod h1:dwTKSCYRD6IZMrqoBCIvZek+aOYK/6+jBzOGw8ks5aY= cloud.google.com/go/servicemanagement v1.8.0 h1:fopAQI/IAzlxnVeiKn/8WiV6zKndjFkvi+gzu+NjywY= cloud.google.com/go/serviceusage v1.6.0 h1:rXyq+0+RSIm3HFypctp7WoXxIA563rn206CfMWdqXX4= -cloud.google.com/go/shell v1.8.1 h1:etoJal+LB7Pn8+5vE2aAh6QcFbBmerIOh5MxNDoXykw= -cloud.google.com/go/shell v1.8.1/go.mod h1:jaU7OHeldDhTwgs3+clM0KYEDYnBAPevUI6wNLf7ycE= cloud.google.com/go/shell v1.8.3 h1:mjYgUsOtV3jl9xvDmcvlRRmA64deEPf52zOfuc68b/g= cloud.google.com/go/shell v1.8.3/go.mod h1:OYcrgWF6JSp/uk76sNTtYFlMD0ho2+Cdzc7U3P/bF54= -cloud.google.com/go/spanner v1.70.0/go.mod h1:X5T0XftydYp0K1adeJQDJtdWpbrOeJ7wHecM4tK6FiE= -cloud.google.com/go/spanner v1.73.0 h1:0bab8QDn6MNj9lNK6XyGAVFhMlhMU2waePPa6GZNoi8= -cloud.google.com/go/spanner v1.73.0/go.mod h1:mw98ua5ggQXVWwp83yjwggqEmW9t8rjs9Po1ohcUGW4= cloud.google.com/go/spanner v1.76.1 h1:vYbVZuXfnFwvNcvH3lhI2PeUA+kHyqKmLC7mJWaC4Ok= cloud.google.com/go/spanner v1.76.1/go.mod h1:YtwoE+zObKY7+ZeDCBtZ2ukM+1/iPaMfUM+KnTh/sx0= -cloud.google.com/go/speech v1.25.1 h1:iGZJS3wrdkje/Vqiacx1+r+zVwUZoXVMdklYIVsvfNw= -cloud.google.com/go/speech v1.25.1/go.mod h1:WgQghvghkZ1htG6BhYn98mP7Tg0mti8dBFDLMVXH/vM= cloud.google.com/go/speech v1.26.0 h1:qvURtJs7BQzQhbxWxwai0pT79S8KLVKJ/4W8igVkt1Y= cloud.google.com/go/speech v1.26.0/go.mod h1:78bqDV2SgwFlP/M4n3i3PwLthFq6ta7qmyG6lUV7UCA= -cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= -cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0= -cloud.google.com/go/storage v1.49.0/go.mod h1:k1eHhhpLvrPjVGfo0mOUPEJ4Y2+a/Hv5PiwehZI9qGU= -cloud.google.com/go/storage v1.50.0/go.mod h1:l7XeiD//vx5lfqE3RavfmU9yvk5Pp0Zhcv482poyafY= -cloud.google.com/go/storagetransfer v1.11.1 h1:Hd7H1zXGQGEWyWXxWVXDMuNCGasNQim1y9CIaMZIBX8= -cloud.google.com/go/storagetransfer v1.11.1/go.mod h1:xnJo9pWysRIha8MgZxhrBEwLYbEdvdmEedhNsP5NINM= cloud.google.com/go/storagetransfer v1.12.1 h1:W3v9A7MGBN7H9sAFstyciwP/1XEQhUhZfrjclmDnpMs= cloud.google.com/go/storagetransfer v1.12.1/go.mod h1:hQqbfs8/LTmObJyCC0KrlBw8yBJ2bSFlaGila0qBMk4= -cloud.google.com/go/talent v1.7.1 h1:J3iZU+HPfoD18Lx8JsgIpwe8llQ9Fu/evcQudQCB+pk= -cloud.google.com/go/talent v1.7.1/go.mod h1:X8UKtTgcP+h51MtDO/b+y3X1GxTTc7gPJ2y0aX3X1hM= cloud.google.com/go/talent v1.8.0 h1:olv+s2g+LGXeJi+MYF1wI44/TwHaVnO0N7PiucVf5ZQ= cloud.google.com/go/talent v1.8.0/go.mod h1:/gvOzSrtMcfTL/9xWhdYaZATaxUNhQ+L+3ZaGOGs7bA= -cloud.google.com/go/texttospeech v1.8.1 h1:LpX9xKoGObltmT6+RGxqUeSJIq0uqPzo+fcbbOmujbY= -cloud.google.com/go/texttospeech v1.8.1/go.mod h1:WoTykB+4mfSDDYPuk7smrdXNRGoJJS6dXRR6l4XqD9g= cloud.google.com/go/texttospeech v1.11.0 h1:YF/RdNb+jUEp22cIZCvqiFjfA5OxGE+Dxss3mhXU7oQ= cloud.google.com/go/texttospeech v1.11.0/go.mod h1:7M2ro3I2QfIEvArFk1TJ+pqXJqhszDtxUpnIv/150As= -cloud.google.com/go/tpu v1.7.1 h1:MP2GYTVEPkg1KlhY3A4CF9Do8eklQOOfgbIYNINcVaE= -cloud.google.com/go/tpu v1.7.1/go.mod h1:kgvyq1Z1yuBJSk5ihUaYxX58YMioCYg1UPuIHSxBX3M= cloud.google.com/go/tpu v1.8.0 h1:BvMNijOb6Vd46Rr/SR5jWv1MPosOhVsi0UaeAGNjeds= cloud.google.com/go/tpu v1.8.0/go.mod h1:XyNzyK1xc55WvL5rZEML0Z9/TUHDfnq0uICkQw6rWMo= -cloud.google.com/go/trace v1.11.1 h1:UNqdP+HYYtnm6lb91aNA5JQ0X14GnxkABGlfz2PzPew= -cloud.google.com/go/trace v1.11.1/go.mod h1:IQKNQuBzH72EGaXEodKlNJrWykGZxet2zgjtS60OtjA= -cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io= -cloud.google.com/go/translate v1.10.3/go.mod h1:GW0vC1qvPtd3pgtypCv4k4U8B7EdgK9/QEF2aJEUovs= -cloud.google.com/go/translate v1.12.1 h1:Vws9BGpVcaOeI6HodyWdvysUzHUBFvk7ymHu1tzFvuM= -cloud.google.com/go/translate v1.12.1/go.mod h1:5f4RvC7/hh76qSl6LYuqOJaKbIzEpR1Sj+CMA6gSgIk= cloud.google.com/go/translate v1.12.3 h1:XJ7LipYJi80BCgVk2lx1fwc7DIYM6oV2qx1G4IAGQ5w= cloud.google.com/go/translate v1.12.3/go.mod h1:qINOVpgmgBnY4YTFHdfVO4nLrSBlpvlIyosqpGEgyEg= -cloud.google.com/go/video v1.23.1 h1:U+fu5Jwi3q8WDDOh1hr8kcdXVUJGmP3vWsZ13jwkWFA= -cloud.google.com/go/video v1.23.1/go.mod h1:ncFS3D2plMLhXkWkob/bH4bxQkubrpAlln5x7RWluXA= cloud.google.com/go/video v1.23.3 h1:C2FH+6yr6LCZC4fP0gm9FwJB/SRh5Ul88O5Sc/bL83I= cloud.google.com/go/video v1.23.3/go.mod h1:Kvh/BheubZxGZDXSb0iO6YX7ZNcaYHbLjnnaC8Qyy3g= -cloud.google.com/go/videointelligence v1.12.1 h1:4XScHLWL/1Q1FVczlxiZT+kSynUQPUktIUTqpIkOMeU= -cloud.google.com/go/videointelligence v1.12.1/go.mod h1:C9bQom4KOeBl7IFPj+NiOS6WKEm1P6OOkF/ahFfE1Eg= cloud.google.com/go/videointelligence v1.12.3 h1:zNTOUQyatGQtnCJ2dR3faRtpWQOlC8wszJqwG5CtwVM= cloud.google.com/go/videointelligence v1.12.3/go.mod h1:dUA6V+NH7CVgX6TePq0IelVeBMGzvehxKPR4FGf1dtw= cloud.google.com/go/vision v1.2.0 h1:/CsSTkbmO9HC8iQpxbK8ATms3OQaX3YQUeTMGCxlaK4= -cloud.google.com/go/vision/v2 v2.9.1 h1:jpK/E7/SJXpbnQVgfr2nGsIIzSQ9GkOsBf2iak1O8nc= -cloud.google.com/go/vision/v2 v2.9.1/go.mod h1:keORalKMowhEZB5hEWi1XSVnGALMjLlRwZbDiCPFuQY= cloud.google.com/go/vision/v2 v2.9.3 h1:dPvfDuPqPH+Yscf0f2f1RprvKkoo+N/j0a+IbLYX7Cs= cloud.google.com/go/vision/v2 v2.9.3/go.mod h1:weAcT8aNYSgrWWVTC2PuJTc7fcXKvUeAyDq8B6HkLSg= -cloud.google.com/go/vmmigration v1.8.1 h1:dyK3bFJVx28FInAkzeLVANpChwWgAmiaUM4GNtEQS/Q= -cloud.google.com/go/vmmigration v1.8.1/go.mod h1:MB7vpxl6Oz2w+CecyITUTDFkhWSMQmRTgREwkBZFyZk= cloud.google.com/go/vmmigration v1.8.3 h1:dpCQq3pj2HnKdbvGTftdWymm3r4ovF7JW5z8xBcO2x4= cloud.google.com/go/vmmigration v1.8.3/go.mod h1:8CzUpK9eBzohgpL4RvBVtW4sY/sDliVyQonTFQfWcJ4= -cloud.google.com/go/vmwareengine v1.3.1 h1:CCdTFQnOatMPbtbMnCja//K4slk5Tjt0u3XEb1T9Qlw= -cloud.google.com/go/vmwareengine v1.3.1/go.mod h1:mSYu3wnGKJqvvhIhs7VA47/A/kLoMiJz3gfQAh7cfaI= cloud.google.com/go/vmwareengine v1.3.3 h1:TfuQr5j7qriINulUMotaC/+27SQaW2thIkF3Gb6VJ38= cloud.google.com/go/vmwareengine v1.3.3/go.mod h1:G7vz05KGijha0c0dj1INRKyDAaQW8TRMZt/FrfOZVXc= -cloud.google.com/go/vpcaccess v1.8.1 h1:e1wJ1wQGMqOf44Gw44PU9G6NYITKm0f2We4eKzMwyEs= -cloud.google.com/go/vpcaccess v1.8.1/go.mod h1:cWlLCpLOuMH8oaNmobaymgmLesasLd9w1isrKpiGwIc= cloud.google.com/go/vpcaccess v1.8.3 h1:vxVaoFM64M/ht619c4wZNF0iq0QPaMWElOh7Ns4r41A= cloud.google.com/go/vpcaccess v1.8.3/go.mod h1:bqOhyeSh/nEmLIsIUoCiQCBHeNPNjaK9M3bIvKxFdsY= -cloud.google.com/go/webrisk v1.10.1 h1:mYYjXXMILCwIEqtChUDNGamMBgJKnoJXa9Os2e76uzk= -cloud.google.com/go/webrisk v1.10.1/go.mod h1:VzmUIag5P6V71nVAuzc7Hu0VkIDKjDa543K7HOulH/k= cloud.google.com/go/webrisk v1.10.3 h1:yh0v/5n49VO4/i9pYfDm1gLJUj1Ph3Xzegn8WvK9YRA= cloud.google.com/go/webrisk v1.10.3/go.mod h1:rRAqCA5/EQOX8ZEEF4HMIrLHGTK/Y1hEQgWMnih+jAw= -cloud.google.com/go/websecurityscanner v1.7.1 h1:VyJObL4Pzd4ypF2814rKlesrVibrf1WpZ2yp4jJvKyw= -cloud.google.com/go/websecurityscanner v1.7.1/go.mod h1:vAZ6hyqECDhgF+gyVRGzfXMrURQN5NH75Y9yW/7sSHU= cloud.google.com/go/websecurityscanner v1.7.3 h1:/uxhVCWKXzPw5pVfnBOVjaSiQ6Bm0tDExDOCLV40thw= cloud.google.com/go/websecurityscanner v1.7.3/go.mod h1:gy0Kmct4GNLoCePWs9xkQym1D7D59ld5AjhXrjipxSs= -cloud.google.com/go/workflows v1.13.1 h1:DkxrZ4HyXvjQLZWsYAUOV1w7d2a43XscM9dmkIGmrDc= -cloud.google.com/go/workflows v1.13.1/go.mod h1:xNdYtD6Sjoug+khNCAtBMK/rdh8qkjyL6aBas2XlkNc= cloud.google.com/go/workflows v1.13.3 h1:lNFDMranJymDEB7cTI7DI9czbc1WU0RWY9KCEv9zuDY= cloud.google.com/go/workflows v1.13.3/go.mod h1:Xi7wggEt/ljoEcyk+CB/Oa1AHBCk0T1f5UH/exBB5CE= codeberg.org/go-fonts/liberation v0.5.0 h1:SsKoMO1v1OZmzkG2DY+7ZkCL9U+rrWI09niOLfQ5Bo0= @@ -584,54 +252,34 @@ contrib.go.opencensus.io/exporter/stackdriver v0.13.14/go.mod h1:5pSSGY0Bhuk7waT contrib.go.opencensus.io/integrations/ocsql v0.1.7 h1:G3k7C0/W44zcqkpRSFyjU9f6HZkbwIrL//qqnlqWZ60= contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= -docker.io/go-docker v1.0.0 h1:VdXS/aNYQxyA9wdLD5z8Q8Ro688/hG8HzKxYVEVbE6s= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= gioui.org v0.0.0-20210308172011-57750fc8a0a6 h1:K72hopUosKG3ntOPNG4OzzbuhxGuVf06fa2la1/H/Ho= -git.sr.ht/~sbinet/gg v0.5.0 h1:6V43j30HM623V329xA9Ntq+WJrMjDxRjuAB1LFWF5m8= -git.sr.ht/~sbinet/gg v0.5.0/go.mod h1:G2C0eRESqlKhS7ErsNey6HHrqU1PwsnCQlekFi9Q2Oo= git.sr.ht/~sbinet/gg v0.6.0 h1:RIzgkizAk+9r7uPzf/VfbJHBMKUr0F5hRFxTUGMnt38= git.sr.ht/~sbinet/gg v0.6.0/go.mod h1:uucygbfC9wVPQIfrmwM2et0imr8L7KQWywX0xpFMm94= github.com/99designs/basicauth-go v0.0.0-20160802081356-2a93ba0f464d h1:j6oB/WPCigdOkxtuPl1VSIiLpy7Mdsu6phQffbF19Ng= github.com/99designs/httpsignatures-go v0.0.0-20170731043157-88528bf4ca7e h1:rl2Aq4ZODqTDkeSqQBy+fzpZPamacO1Srp8zq7jf2Sc= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/azure-amqp-common-go/v3 v3.2.3 h1:uDF62mbd9bypXWi19V1bN5NZEO84JqgmI5G73ibAmrk= github.com/Azure/azure-amqp-common-go/v3 v3.2.3/go.mod h1:7rPmbSfszeovxGfc5fSAXE4ehlXQZHpMja2OtxC2Tas= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1/go.mod h1:zGqV2R4Cr/k8Uye5w+dgQ06WJtEcbQG/8J7BB6hnCr4= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2/go.mod h1:SqINnQ9lVVdRlyC8cd1lCI0SdX4n2paeABd2K8ggfnE= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.0/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA= github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.7.1 h1:o/Ws6bEqMeKZUfj1RRm3mQ51O8JGU5w+Qdg2AhHib6A= github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.7.1/go.mod h1:6QAMYBAbQeeKX+REFJMZ1nFWu9XLw/PPcjYpuc9RDFs= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1/go.mod h1:c/wcGeGx5FUPbM/JltUYHZcKmigwyVLJlDq+4HdtXaw= github.com/Azure/go-amqp v1.0.5 h1:po5+ljlcNSU8xtapHTe8gIc8yHxCzC03E8afH2g1ftU= github.com/Azure/go-amqp v1.0.5/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest/autorest/azure/auth v0.5.13 h1:Ov8avRZi2vmrE2JcXw+tu5K/yB41r7xK9GZDiBF7NdM= github.com/Azure/go-autorest/autorest/azure/auth v0.5.13/go.mod h1:5BAVfWLWXihP47vYrPuBKKf4cS0bXI+KM9Qx6ETDJYo= github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 h1:w77/uPk80ZET2F+AfQExZyEWtn+0Rk/uw17m9fv5Ajc= github.com/Azure/go-autorest/autorest/azure/cli v0.4.6/go.mod h1:piCfgPho7BiIDdEQ1+g4VmKyD5y+p/XtSNqE6Hc4QD0= -github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= -github.com/ClickHouse/ch-go v0.61.5 h1:zwR8QbYI0tsMiEcze/uIMK+Tz1D3XZXLdNrlaOpeEI4= -github.com/ClickHouse/ch-go v0.61.5/go.mod h1:s1LJW/F/LcFs5HJnuogFMta50kKDO0lf9zzfrbl0RQg= github.com/ClickHouse/ch-go v0.65.1 h1:SLuxmLl5Mjj44/XbINsK2HFvzqup0s6rwKLFH347ZhU= github.com/ClickHouse/ch-go v0.65.1/go.mod h1:bsodgURwmrkvkBe5jw1qnGDgyITsYErfONKAHn05nv4= -github.com/ClickHouse/clickhouse-go/v2 v2.30.0 h1:AG4D/hW39qa58+JHQIFOSnxyL46H6h2lrmGGk17dhFo= -github.com/ClickHouse/clickhouse-go/v2 v2.30.0/go.mod h1:i9ZQAojcayW3RsdCb3YR+n+wC2h65eJsZCscZ1Z1wyo= -github.com/ClickHouse/clickhouse-go/v2 v2.33.1 h1:Z5nO/AnmUywcw0AvhAD0M1C2EaMspnXRK9vEOLxgmI0= -github.com/ClickHouse/clickhouse-go/v2 v2.33.1/go.mod h1:cb1Ss8Sz8PZNdfvEBwkMAdRhoyB6/HiB6o3We5ZIcE4= github.com/ClickHouse/clickhouse-go/v2 v2.34.0 h1:Y4rqkdrRHgExvC4o/NTbLdY5LFQ3LHS77/RNFxFX3Co= github.com/ClickHouse/clickhouse-go/v2 v2.34.0/go.mod h1:yioSINoRLVZkLyDzdMXPLRIqhDvel8iLBlwh6Iefso8= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME= github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= -github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= github.com/DataDog/sketches-go v1.4.6 h1:acd5fb+QdUzGrosfNLwrIhqyrbMORpvBy7mE+vHlT3I= github.com/DataDog/sketches-go v1.4.6/go.mod h1:7Y8GN8Jf66DLyDhc94zuWA3uHEt/7ttt8jHOBWWrSOg= @@ -641,55 +289,20 @@ github.com/DmitriyVTitov/size v1.5.0 h1:/PzqxYrOyOUX1BXj6J9OuVRVGe+66VL4D9FlUaW5 github.com/DmitriyVTitov/size v1.5.0/go.mod h1:le6rNI4CoLQV1b9gzp1+3d7hMAD/uu2QcJ+aYbNgiU0= github.com/GoogleCloudPlatform/cloudsql-proxy v1.36.0 h1:kAtNAWwvTt5+iew6baV0kbOrtjYTXPtWNSyOFlcxkBU= github.com/GoogleCloudPlatform/cloudsql-proxy v1.36.0/go.mod h1:VRKXU8C7Y/aUKjRBTGfw0Ndv4YqNxlB8zAPJJDxbASE= -github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= -github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.2 h1:DBjmt6/otSdULyJdVg2BlG0qGZO5tKL4VzOs0jpvw5Q= -github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.2/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0/go.mod h1:2bIszWvQRlJVmJLiuLhukLImRjKPcYdzzsx6darK02A= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0/go.mod h1:ZV4VOm0/eHR06JLrXWe09068dHpr3TRpY9Uo7T+anuA= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= -github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/IBM/go-sdk-core/v5 v5.17.4 h1:VGb9+mRrnS2HpHZFM5hy4J6ppIWnwNrw0G+tLSgcJLc= github.com/IBM/go-sdk-core/v5 v5.17.4/go.mod h1:KsAAI7eStAWwQa4F96MLy+whYSh39JzNjklZRbN/8ns= github.com/IBM/ibm-cos-sdk-go v1.11.0 h1:Jp55NLN3OvBwucMGpP5wNybyjncsmTZ9+GPHai/1cE8= github.com/IBM/ibm-cos-sdk-go v1.11.0/go.mod h1:FnWOym0CvrPM0nHoXvceClOEvGVXecPpmVIO5RFjlFk= -github.com/IBM/sarama v1.43.1/go.mod h1:GG5q1RURtDNPz8xxJs3mgX6Ytak8Z9eLhAkJPObe2xE= -github.com/IBM/sarama v1.43.2 h1:HABeEqRUh32z8yzY2hGB/j8mHSzC/HA9zlEjqFNCzSw= -github.com/IBM/sarama v1.43.2/go.mod h1:Kyo4WkF24Z+1nz7xeVUFWIuKVV8RS3wM8mkvPKMdXFQ= github.com/IBM/sarama v1.45.1 h1:nY30XqYpqyXOXSNoe2XCgjj9jklGM1Ye94ierUb1jQ0= github.com/IBM/sarama v1.45.1/go.mod h1:qifDhA3VWSrQ1TjSMyxDl3nYL3oX2C83u+G6L79sq4w= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= -github.com/KimMachineGun/automemlimit v0.6.1 h1:ILa9j1onAAMadBsyyUJv5cack8Y1WT26yLj/V+ulKp8= -github.com/KimMachineGun/automemlimit v0.6.1/go.mod h1:T7xYht7B8r6AG/AqFcUdc7fzd2bIdBKmepfP2S1svPY= github.com/KimMachineGun/automemlimit v0.7.1 h1:QcG/0iCOLChjfUweIMC3YL5Xy9C3VBeNmCZHrZfJMBw= github.com/KimMachineGun/automemlimit v0.7.1/go.mod h1:QZxpHaGOQoYvFhv/r4u3U0JTC2ZcOwbSr11UZF46UBM= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/MarvinJWendt/testza v0.1.0/go.mod h1:7AxNvlfeHP7Z/hDQ5JtE3OKYT3XFUeLCDE2DQninSqs= -github.com/MarvinJWendt/testza v0.2.1/go.mod h1:God7bhG8n6uQxwdScay+gjm9/LnO4D3kkcZX4hv9Rp8= -github.com/MarvinJWendt/testza v0.2.8/go.mod h1:nwIcjmr0Zz+Rcwfh3/4UhBp7ePKVhuBExvZqnKYWlII= -github.com/MarvinJWendt/testza v0.2.10/go.mod h1:pd+VWsoGUiFtq+hRKSU1Bktnn+DMCSrDrXDpX2bG66k= -github.com/MarvinJWendt/testza v0.2.12/go.mod h1:JOIegYyV7rX+7VZ9r77L/eH6CfJHHzXjB69adAhzZkI= -github.com/MarvinJWendt/testza v0.3.0/go.mod h1:eFcL4I0idjtIx8P9C6KkAuLgATNKpX4/2oUqKc6bF2c= -github.com/MarvinJWendt/testza v0.4.2/go.mod h1:mSdhXiKH8sg/gQehJ63bINcCKp7RtYewEjXsvsVUPbE= -github.com/MarvinJWendt/testza v0.5.2 h1:53KDo64C1z/h/d/stCYCPY69bt/OSwjq5KpFNwi+zB4= -github.com/MarvinJWendt/testza v0.5.2/go.mod h1:xu53QFE5sCdjtMCKk8YMQ2MnymimEctc4n3EjyIYvEY= -github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/MicahParks/keyfunc/v2 v2.1.0 h1:6ZXKb9Rp6qp1bDbJefnG7cTH8yMN1IC/4nf+GVjO99k= github.com/MicahParks/keyfunc/v2 v2.1.0/go.mod h1:rW42fi+xgLJ2FRRXAfNx9ZA8WpD4OeE/yHVMteCkw9k= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.9.6 h1:VwnDOgLeoi2du6dAznfmspNqTiwczvjv4K7NxuY9jsY= -github.com/Microsoft/hcsshim v0.9.6/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3 h1:4FA+QBaydEHlwxg0lMN3rhwoDaQy6LKhVWR4qvq4BuA= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= -github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= -github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= -github.com/PuerkitoBio/goquery v1.10.2 h1:7fh2BdHcG6VFZsK7toXBT/Bh1z5Wmy8Q9MV9HqT2AM8= -github.com/PuerkitoBio/goquery v1.10.2/go.mod h1:0guWGjcLu9AYC7C1GHnpysHy056u9aEkUHwhdnePMCU= github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiUkhzPo= github.com/PuerkitoBio/goquery v1.10.3/go.mod h1:tMUX0zDMHXYlAQk6p35XxQMqMweEKB7iK7iLNd4RH4Y= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= @@ -701,15 +314,9 @@ github.com/Sereal/Sereal/Go/sereal v0.0.0-20231009093132-b9187f1a92c6 h1:5kUcJJA github.com/Sereal/Sereal/Go/sereal v0.0.0-20231009093132-b9187f1a92c6/go.mod h1:JwrycNnC8+sZPDyzM3MQ86LvaGzSpfxg885KOOwFRW4= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/Shopify/sarama v1.38.1 h1:lqqPUPQZ7zPqYlWpTh+LQ9bhYNu2xJL6k1SJN4WVe2A= github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSdZ4X2o5g= github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= -github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/agnivade/levenshtein v1.2.0 h1:U9L4IOT0Y3i0TIlUIDJ7rVUziKi/zPbrJGaFrtYH3SY= -github.com/agnivade/levenshtein v1.2.0/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU= github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM= github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU= github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9 h1:7kQgkwGRoLzC9K0oyXdJo7nve/bynv/KwUsxbiTlzAM= @@ -718,31 +325,19 @@ github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyR github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek= github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY= -github.com/alecthomas/kong v0.8.0 h1:ryDCzutfIqJPnNn0omnrgHLbAggDQM2VWHikE1xqK7s= -github.com/alecthomas/kong v0.8.0/go.mod h1:n1iCIO2xS46oE8ZfYCNDqdR0b0wZNrXAIAqro/2132U= github.com/alecthomas/kong v1.10.0 h1:8K4rGDpT7Iu+jEXCIJUeKqvpwZHbsFRoebLbnzlmrpw= github.com/alecthomas/kong v1.10.0/go.mod h1:p2vqieVMeTAnaC83txKtXe8FLke2X07aruPWXyMPQrU= -github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= -github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= github.com/alecthomas/participle/v2 v2.1.4 h1:W/H79S8Sat/krZ3el6sQMvMaahJ+XcM9WSI2naI7w2U= github.com/alecthomas/participle/v2 v2.1.4/go.mod h1:8tqVbpTX20Ru4NfYQgZf4mP18eXPTBViyMWiArNEgGI= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= -github.com/alexflint/go-arg v1.4.2 h1:lDWZAXxpAnZUq4qwb86p/3rIJJ2Li81EoMbTMujhVa0= -github.com/alexflint/go-arg v1.4.2/go.mod h1:9iRbDxne7LcR/GSvEr7ma++GLpdIU1zrghf2y2768kM= github.com/alexflint/go-arg v1.5.1 h1:nBuWUCpuRy0snAG+uIJ6N0UvYxpxA0/ghA/AaHxlT8Y= github.com/alexflint/go-arg v1.5.1/go.mod h1:A7vTJzvjoaSTypg4biM5uYNTkJ27SkNTArtYXnlqVO8= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae h1:AMzIhMUqU3jMrZiTuW0zkYeKlKDAFD+DG20IoO421/Y= -github.com/alexflint/go-scalar v1.0.0 h1:NGupf1XV/Xb04wXskDFzS0KWOLH632W/EO4fAFi+A70= -github.com/alexflint/go-scalar v1.0.0/go.mod h1:GpHzbCOZXEKMEcygYQ5n/aa4Aq84zbxjy3MxYW0gjYw= github.com/alexflint/go-scalar v1.2.0 h1:WR7JPKkeNpnYIOfHRa7ivM21aWAdHD0gEWHCx+WQBRw= github.com/alexflint/go-scalar v1.2.0/go.mod h1:LoFvNMqS1CPrMVltza4LvnGKhaSpc3oyLEBUZVhhS2o= -github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= github.com/alicebob/miniredis v2.5.0+incompatible h1:yBHoLpsyjupjz3NL3MhKMVkR41j82Yjf3KFv7ApYzUI= github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk= github.com/aliyun/aliyun-oss-go-sdk v2.2.10+incompatible h1:ROMcuN61gI8SfQ+AEMh4d7GZ3gwTZLIhPjtd05TQCG4= github.com/aliyun/aliyun-oss-go-sdk v2.2.10+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= -github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= -github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM= github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= github.com/antchfx/xmlquery v1.4.4 h1:mxMEkdYP3pjKSftxss4nUHfjBhnMk4imGoR96FRY2dg= @@ -750,53 +345,16 @@ github.com/antchfx/xmlquery v1.4.4/go.mod h1:AEPEEPYE9GnA2mj5Ur2L5Q5/2PycJ0N9Fus github.com/antchfx/xpath v1.3.4 h1:1ixrW1VnXd4HurCj7qnqnR0jo14g8JMe20Fshg1Vgz4= github.com/antchfx/xpath v1.3.4/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= -github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 h1:goHVqTbFX3AIo0tzGr14pgfAW2ZfPChKO21Z9MGf/gk= -github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= -github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= -github.com/apache/arrow-go/v18 v18.0.1-0.20241212180703-82be143d7c30/go.mod h1:RNuWDIiGjq5nndL2PyQrndUy9nMLwheA3uWaAV7fe4U= -github.com/apache/arrow-go/v18 v18.2.0/go.mod h1:Ic/01WSwGJWRrdAZcxjBZ5hbApNJ28K96jGYaxzzGUc= github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40 h1:q4dksr6ICHXqG5hm0ZW5IHyeEJXoIJSOZeBLmWPNeIQ= github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40/go.mod h1:Q7yQnSMnLvcXlZ8RV+jwz/6y1rQTqbX6C82SndT52Zs= github.com/apache/arrow/go/v10 v10.0.1 h1:n9dERvixoC/1JjDmBcs9FPaEryoANa2sCgVFo6ez9cI= github.com/apache/arrow/go/v11 v11.0.0 h1:hqauxvFQxww+0mEU/2XHG6LT7eZternCZq+A5Yly2uM= -github.com/apache/arrow/go/v15 v15.0.2 h1:60IliRbiyTWCWjERBCkO1W4Qun9svcYoZrSLcyOsMLE= -github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3 h1:ZSTrOEhiM5J5RFxEaFvMZVEAM1KvT1YzbEOwB2EAGjA= github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= -github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/atomicgo/cursor v0.0.1 h1:xdogsqa6YYlLfM+GyClC/Lchf7aiMerFiZQn7soTOoU= -github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-msk-iam-sasl-signer-go v1.0.1 h1:nMp7diZObd4XEVUR0pEvn7/E13JIgManMX79Q6quV6E= github.com/aws/aws-msk-iam-sasl-signer-go v1.0.1/go.mod h1:MVYeeOhILFFemC/XlYTClvBjYZrg/EPd3ts885KrNTI= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= -github.com/aws/aws-sdk-go-v2 v1.36.0/go.mod h1:5PMILGVKiW32oDzjj6RU52yrNrDPUHcbZQYr1sM7qmM= -github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM= -github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 h1:tW1/Rkad38LA15X4UQtjXZXNKsCgkshC3EbmcUmghTg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3/go.mod h1:UbnqO+zjqk3uIt9yCACHJ9IVNhyhOCnYk8yA19SAWrM= -github.com/aws/aws-sdk-go-v2/config v1.29.4 h1:ObNqKsDYFGr2WxnoXKOhCvTlf3HhwtoGgc+KmZ4H5yg= -github.com/aws/aws-sdk-go-v2/config v1.29.4/go.mod h1:j2/AF7j/qxVmsNIChw1tWfsVKOayJoGRDjg1Tgq7NPk= -github.com/aws/aws-sdk-go-v2/credentials v1.17.66 h1:aKpEKaTy6n4CEJeYI1MNj97oSDLi4xro3UzQfwf5RWE= -github.com/aws/aws-sdk-go-v2/credentials v1.17.66/go.mod h1:xQ5SusDmHb/fy55wU0QqTy0yNfLqxzec59YcsRZB+rI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 h1:Pg9URiobXy85kgFev3og2CuOZ8JZUBENF+dcgWBaYNk= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY= github.com/aws/aws-sdk-go-v2/service/kms v1.35.3 h1:UPTdlTOwWUX49fVi7cymEN6hDqCwe3LNv1vi7TXUutk= github.com/aws/aws-sdk-go-v2/service/kms v1.35.3/go.mod h1:gjDP16zn+WWalyaUqwCCioQ8gU8lzttCCc9jYsiQI/8= github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.32.4 h1:NgRFYyFpiMD62y4VPXh4DosPFbZd4vdMVBWKk0VmWXc= @@ -807,174 +365,74 @@ github.com/aws/aws-sdk-go-v2/service/sqs v1.34.3 h1:Vjqy5BZCOIsn4Pj8xzyqgGmsSqzz github.com/aws/aws-sdk-go-v2/service/sqs v1.34.3/go.mod h1:L0enV3GCRd5iG9B64W35C4/hwsCB00Ib+DKVGTadKHI= github.com/aws/aws-sdk-go-v2/service/ssm v1.52.4 h1:hgSBvRT7JEWx2+vEGI9/Ld5rZtl7M5lu8PqdvOmbRHw= github.com/aws/aws-sdk-go-v2/service/ssm v1.52.4/go.mod h1:v7NIzEFIHBiicOMaMTuEmbnzGnqW0d+6ulNALul6fYE= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.18 h1:xz7WvTMfSStb9Y8NpCT82FXLNC3QasqBfuAFHY4Pk5g= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.18/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= -github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= -github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ= -github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= -github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= -github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/baidubce/bce-sdk-go v0.9.188 h1:8MA7ewe4VpX01uYl7Kic6ZvfIReUFdSKbY46ZqlQM7U= github.com/baidubce/bce-sdk-go v0.9.188/go.mod h1:zbYJMQwE4IZuyrJiFO8tO8NbtYiKTFTbwh4eIsqjVdg= -github.com/bazelbuild/rules_go v0.49.0 h1:5vCbuvy8Q11g41lseGJDc5vxhDjJtfxr6nM/IC4VmqM= -github.com/bazelbuild/rules_go v0.49.0/go.mod h1:Dhcz716Kqg1RHNWos+N6MlXNkjNP2EwZQ0LukRKJfMs= github.com/benbjohnson/immutable v0.4.0 h1:CTqXbEerYso8YzVPxmWxh2gnoRQbbB9X1quUC8+vGZA= github.com/benbjohnson/immutable v0.4.0/go.mod h1:iAr8OjJGLnLmVUr9MZ/rz4PWUy6Ouc2JLYuMArmvAJM= github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= -github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blevesearch/bleve/v2 v2.4.4-0.20250319135056-b82baf10b205 h1:u6DQJ1k4FKwRNtsrVhIRQenNdtz31way7/LgWCluFzA= -github.com/blevesearch/bleve/v2 v2.4.4-0.20250319135056-b82baf10b205/go.mod h1:nSmFOQ7M264rKoM3jf63Gl2G+ylCgZGovPgL6ZEQYzU= -github.com/blevesearch/bleve_index_api v1.1.12/go.mod h1:PbcwjIcRmjhGbkS/lJCpfgVSMROV6TRubGGAODaK1W8= -github.com/blevesearch/bleve_index_api v1.2.1/go.mod h1:rKQDl4u51uwafZxFrPD1R7xFOwKnzZW7s/LSeK4lgo0= -github.com/blevesearch/go-faiss v1.0.23/go.mod h1:OMGQwOaRRYxrmeNdMrXJPvVx8gBnvE5RYrr0BahNnkk= github.com/blevesearch/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:kDy+zgJFJJoJYBvdfBSiZYBbdsUL0XcjHYWezpQBGPA= github.com/blevesearch/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:9eJDeqxJ3E7WnLebQUlPD7ZjSce7AnDb9vjGmMCbD0A= github.com/blevesearch/goleveldb v1.0.1 h1:iAtV2Cu5s0GD1lwUiekkFHe2gTMCCNVj2foPclDLIFI= github.com/blevesearch/goleveldb v1.0.1/go.mod h1:WrU8ltZbIp0wAoig/MHbrPCXSOLpe79nz5lv5nqfYrQ= -github.com/blevesearch/scorch_segment_api/v2 v2.2.16/go.mod h1:VF5oHVbIFTu+znY1v30GjSpT5+9YFs9dV2hjvuh34F0= -github.com/blevesearch/scorch_segment_api/v2 v2.3.3/go.mod h1:LXidEjeenMdbcLKP/UdZi1HJOny61FbhslAh5SgN5Ik= github.com/blevesearch/snowball v0.6.1 h1:cDYjn/NCH+wwt2UdehaLpr2e4BwLIjN4V/TdLsL+B5A= github.com/blevesearch/snowball v0.6.1/go.mod h1:ZF0IBg5vgpeoUhnMza2v0A/z8m1cWPlwhke08LpNusg= github.com/blevesearch/stempel v0.2.0 h1:CYzVPaScODMvgE9o+kf6D4RJ/VRomyi9uHF+PtB+Afc= github.com/blevesearch/stempel v0.2.0/go.mod h1:wjeTHqQv+nQdbPuJ/YcvOjTInA2EIc6Ks1FoSUzSLvc= -github.com/blevesearch/vellum v1.0.10/go.mod h1:ul1oT0FhSMDIExNjIxHqJoGpVrBpKCdgDQNxfqgJt7k= -github.com/blevesearch/zapx/v11 v11.3.10/go.mod h1:0+gW+FaE48fNxoVtMY5ugtNHHof/PxCqh7CnhYdnMzQ= -github.com/blevesearch/zapx/v12 v12.3.10/go.mod h1:0yeZg6JhaGxITlsS5co73aqPtM04+ycnI6D1v0mhbCs= -github.com/blevesearch/zapx/v13 v13.3.10/go.mod h1:w2wjSDQ/WBVeEIvP0fvMJZAzDwqwIEzVPnCPrz93yAk= -github.com/blevesearch/zapx/v14 v14.3.10/go.mod h1:qqyuR0u230jN1yMmE4FIAuCxmahRQEOehF78m6oTgns= -github.com/blevesearch/zapx/v15 v15.3.16/go.mod h1:Turk/TNRKj9es7ZpKK95PS7f6D44Y7fAFy8F4LXQtGg= -github.com/blevesearch/zapx/v16 v16.1.8/go.mod h1:JqQlOqlRVaYDkpLIl3JnKql8u4zKTNlVEa3nLsi0Gn8= github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= github.com/bradleyjkemp/cupaloy/v2 v2.6.0 h1:knToPYa2xtfg42U3I6punFEjaGFKWQRXJwj0JTv4mTs= github.com/bradleyjkemp/cupaloy/v2 v2.6.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= -github.com/brianvoe/gofakeit/v6 v6.25.0 h1:ZpFjktOpLZUeF8q223o0rUuXtA+m5qW5srjvVi+JkXk= -github.com/brianvoe/gofakeit/v6 v6.25.0/go.mod h1:Xj58BMSnFqcn/fAQeSK+/PLtC5kSb7FJIq4JyGa8vEs= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1 h1:pgAtgj+A31JBVtEHu2uHuEx0n+2ukqUJnS2vVe5pQNA= -github.com/bufbuild/protovalidate-go v0.2.1 h1:pJr07sYhliyfj/STAM7hU4J3FKpVeLVKvOBmOTN8j+s= -github.com/bufbuild/protovalidate-go v0.2.1/go.mod h1:e7XXDtlxj5vlEyAgsrxpzayp4cEMKCSSb8ZCkin+MVA= -github.com/bufbuild/protovalidate-go v0.9.1 h1:cdrIA33994yCcJyEIZRL36ZGTe9UDM/WHs5MBHEimiE= -github.com/bufbuild/protovalidate-go v0.9.1/go.mod h1:5jptBxfvlY51RhX32zR6875JfPBRXUsQjyZjm/NqkLQ= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= github.com/bwesterb/go-ristretto v1.2.3 h1:1w53tCkGhCQ5djbat3+MH0BAQ5Kfgbt56UZQ/JMzngw= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bytedance/sonic v1.10.0-rc3 h1:uNSnscRapXTwUgTyOF0GVljYD08p9X/Lbr9MweSV3V0= github.com/bytedance/sonic v1.10.0-rc3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= github.com/campoy/embedmd v1.0.0 h1:V4kI2qTJJLf4J29RzI/MAt2c3Bl4dQSYPuflzwFH2hY= github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= -github.com/centrifugal/centrifuge v0.36.0 h1:FLjOysPb0o8I6VT0FiR73CMXRY7lmZLlLJBt12hisFs= -github.com/centrifugal/centrifuge v0.36.0/go.mod h1:X+rNLSNG81u4kZBPbkMMz3mxXTcc7bUSYpR3bbzwkkA= -github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a h1:G99klV19u0QnhiizODirwVksQB91TJKV/UaTnACcG30= -github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= -github.com/checkpoint-restore/go-criu/v5 v5.0.0 h1:TW8f/UvntYoVDMN1K2HlT82qH1rb0sOjpGw3m6Ym+i4= github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= -github.com/chromedp/cdproto v0.0.0-20220208224320-6efb837e6bc2/go.mod h1:At5TxYYdxkbQL0TSefRjhLE3Q0lgvqKKMSFUglJ7i1U= -github.com/chromedp/cdproto v0.0.0-20240810084448-b931b754e476/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= -github.com/chromedp/chromedp v0.9.2 h1:dKtNz4kApb06KuSXoTQIyUC2TrA0fhGDwNZf3bcgfKw= -github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= -github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= -github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= github.com/chromedp/sysutil v1.1.0 h1:PUFNv5EcprjqXZD9nJb9b/c9ibAbxiYo4exNWZyipwM= github.com/chromedp/sysutil v1.1.0/go.mod h1:WiThHUdltqCNKGc4gaU50XgYjwjYIhKWoHGPTUfWTJ8= -github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= -github.com/cilium/ebpf v0.11.0 h1:V8gS/bTCCjX9uUnkUFUpPsksM8n1lXBAvHcpiFk1X2Y= -github.com/cilium/ebpf v0.11.0/go.mod h1:WE7CZAnqOL2RouJ4f1uyNhqr2P4CCvXFIqdRDUgWsVs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA= -github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= -github.com/cloudflare/circl v1.6.0 h1:cr5JKic4HI+LkINy2lg3W2jF8sHCVTBncJr5gIIq7qk= -github.com/cloudflare/circl v1.6.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= -github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= -github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= -github.com/cncf/xds/go v0.0.0-20241223141626-cff3c89139a3/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= -github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c h1:2zRrJWIt/f9c9HhNHAgrRgq0San5gRRUJTBXLkchal0= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coder/quartz v0.1.0 h1:cLL+0g5l7xTf6ordRnUMMiZtRE8Sq5LxpghS63vEXrQ= github.com/coder/quartz v0.1.0/go.mod h1:vsiCc+AHViMKH2CQpGIpFgdHIEQsxwm8yCscqKmzbRA= -github.com/coder/websocket v1.8.12 h1:5bUXkEPPIbewrnkU8LTCLVaxi4N4J8ahufH2vlo4NAo= -github.com/coder/websocket v1.8.12/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs= github.com/coder/websocket v1.8.13 h1:f3QZdXy7uGVz+4uCJy2nTZyM0yTBj8yANEHhqlXZ9FE= github.com/coder/websocket v1.8.13/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs= -github.com/containerd/aufs v1.0.0 h1:2oeJiwX5HstO7shSrPZjrohJZLzK36wvpdmzDRkL/LY= -github.com/containerd/btrfs v1.0.0 h1:osn1exbzdub9L5SouXO5swW4ea/xVdJZ3wokxN5GrnA= -github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA= -github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA= -github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0= -github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0= github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns= github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= -github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY= github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= -github.com/containerd/go-cni v1.1.6 h1:el5WPymG5nRRLQF1EfB97FWob4Tdc8INg8RZMaXWZlo= -github.com/containerd/go-cni v1.1.6/go.mod h1:BWtoWl5ghVymxu6MBjg79W9NZrCRyHIdUtk4cauMe34= -github.com/containerd/go-runc v1.0.0 h1:oU+lLv1ULm5taqgV/CJivypVODI4SUz1znWjv3nNYS0= -github.com/containerd/imgcrypt v1.1.4 h1:iKTstFebwy3Ak5UF0RHSeuCTahC5OIrPJa6vjMAM81s= -github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= -github.com/containerd/nri v0.1.0 h1:6QioHRlThlKh2RkRTR4kIT3PKAcrLo3gIWnjkM4dQmQ= github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= -github.com/containerd/ttrpc v1.1.0 h1:GbtyLRxb0gOLR0TYQWt3O6B0NvT8tMdorEHqIQo/lWI= -github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= -github.com/containerd/zfs v1.0.0 h1:cXLJbx+4Jj7rNsTiqVfm6i+RNLx6FFA2fMmDlEf+Wm8= -github.com/containernetworking/cni v1.1.1 h1:ky20T7c0MvKvbMOwS/FrlbNwjEoqJEUUYfsL4b0mc4k= -github.com/containernetworking/cni v1.1.1/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= -github.com/containernetworking/plugins v1.1.1 h1:+AGfFigZ5TiQH00vhR8qPeSatj53eNGz0C1d3wVYlHE= -github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= -github.com/containers/ocicrypt v1.1.3 h1:uMxn2wTb4nDR7GqG3rnZSfpJXqWURfzZ7nKydzIeKpA= -github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= -github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= github.com/coreos/etcd v3.3.27+incompatible h1:QIudLb9KeBsE5zyYxd1mjzRSkzLg9Wf9QlRwFgd6oTA= github.com/coreos/etcd v3.3.27+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= -github.com/coreos/go-iptables v0.5.0 h1:mw6SAibtHKZcNzAsOxjoHIG0gy5YFHhypWSSNc6EjbQ= -github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk= -github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-oidc v2.3.0+incompatible h1:+5vEsrgprdLjjQ9FzIKAzQz1wwPD+83hQRfUIPh7rO0= github.com/coreos/go-oidc v2.3.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-oidc/v3 v3.9.0 h1:0J/ogVOd4y8P0f0xUh8l9t07xRP/d8tccvjHl2dcsSo= -github.com/coreos/go-oidc/v3 v3.9.0/go.mod h1:rTKz2PYwftcrtoCzV5g5kvfJoWcm0Mk8AF8y1iAQro4= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20220810130054-c7d1c02cb6cf h1:GOPo6vn/vTN+3IwZBvXX0y5doJfSC7My0cdzelyOCsQ= github.com/coreos/pkg v0.0.0-20220810130054-c7d1c02cb6cf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/couchbase/ghistogram v0.1.0 h1:b95QcQTCzjTUocDXp/uMgSNQi8oj1tGwnJ4bODWZnps= @@ -984,19 +442,12 @@ github.com/couchbase/moss v0.2.0/go.mod h1:9MaHIaRuy9pvLPUJxB8sh8OrLfyDczECVL37g github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creasty/defaults v1.8.0 h1:z27FJxCAa0JKt3utc0sCImAEb+spPucmKoOdLHvHYKk= github.com/creasty/defaults v1.8.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM= github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo= github.com/crewjam/httperr v0.2.0/go.mod h1:Jlz+Sg/XqBQhyMjdDiC+GNNRzZTD7x39Gu3pglZ5oH4= -github.com/cristalhq/acmd v0.12.0 h1:RdlKnxjN+txbQosg8p/TRNZ+J1Rdne43MVQZ1zDhGWk= -github.com/cristalhq/acmd v0.12.0/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/cristalhq/hedgedhttp v0.9.1 h1:g68L9cf8uUyQKQJwciD0A1Vgbsz+QgCjuB1I8FAsCDs= github.com/cristalhq/hedgedhttp v0.9.1/go.mod h1:XkqWU6qVMutbhW68NnzjWrGtH8NUx1UfYqGYtHVKIsI= github.com/cucumber/gherkin/go/v26 v26.2.0 h1:EgIjePLWiPeslwIWmNQ3XHcypPsWAHoMCz/YEBKP4GI= @@ -1005,8 +456,6 @@ github.com/cucumber/godog v0.15.0 h1:51AL8lBXF3f0cyA5CV4TnJFCTHpgiy+1x1Hb3TtZUmo github.com/cucumber/godog v0.15.0/go.mod h1:FX3rzIDybWABU4kuIXLZ/qtqEe1Ac5RdXmqvACJOces= github.com/cucumber/messages/go/v21 v21.0.1 h1:wzA0LxwjlWQYZd32VTlAVDTkW6inOFmSM+RuOwHZiMI= github.com/cucumber/messages/go/v21 v21.0.1/go.mod h1:zheH/2HS9JLVFukdrsPWoPdmUtmYQAQPLk7w5vWsk5s= -github.com/cucumber/messages/go/v22 v22.0.0/go.mod h1:aZipXTKc0JnjCsXrJnuZpWhtay93k7Rn3Dee7iyPJjs= -github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg= github.com/cznic/b v0.0.0-20180115125044-35e9bbe41f07 h1:UHFGPvSxX4C4YBApSPvmUfL8tTvWLj2ryqvT9K4Jcuk= github.com/cznic/fileutil v0.0.0-20180108211300-6a051e75936f h1:7uSNgsgcarNk4oiN/nNkO0J7KAjlsF5Yv5Gf/tFdHas= github.com/cznic/golex v0.0.0-20170803123110-4ab7c5e190e4 h1:CVAqftqbj+exlab+8KJQrE+kNIVlQfJt58j4GxCMF1s= @@ -1017,78 +466,38 @@ github.com/cznic/ql v1.2.0 h1:lcKp95ZtdF0XkWhGnVIXGF8dVD2X+ClS08tglKtf+ak= github.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65 h1:hxuZop6tSoOi0sxFzoGGYdRqNrPubyaIf9KoBG9tPiE= github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186 h1:0rkFMAbn5KBKNpJyHQ6Prb95vIKanmAe62KxsrN+sqA= github.com/cznic/zappy v0.0.0-20160723133515-2533cb5b45cc h1:YKKpTb2BrXN2GYyGaygIdis1vXbE7SSAG9axGWIMClg= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c h1:Xo2rK1pzOm0jO6abTPIQwbAmqBIOj132otexc1mmzFc= -github.com/d2g/dhcp4client v1.0.0 h1:suYBsYZIkSlUMEz4TAYCczKf62IA2UWC+O8+KtdOhCo= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5 h1:+CpLbZIeUn94m02LdEKPcgErLJ347NUwxPKs5u8ieiY= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4 h1:itqmmf1PFpC4n5JW+j4BU7X4MTfVurhYRTjODoPb2Y8= github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt9U= github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo= -github.com/dave/astrid v0.0.0-20170323122508-8c2895878b14 h1:YI1gOOdmMk3xodBao7fehcvoZsEeOyy/cfhlpCSPgM4= -github.com/dave/astrid v0.0.0-20170323122508-8c2895878b14/go.mod h1:Sth2QfxfATb/nW4EsrSi2KyJmbcniZ8TgTaji17D6ms= -github.com/dave/brenda v1.1.0 h1:Sl1LlwXnbw7xMhq3y2x11McFu43AjDcwkllxxgZ3EZw= -github.com/dave/brenda v1.1.0/go.mod h1:4wCUr6gSlu5/1Tk7akE5X7UorwiQ8Rij0SKH3/BGMOM= -github.com/dave/courtney v0.3.0 h1:8aR1os2ImdIQf3Zj4oro+lD/L4Srb5VwGefqZ/jzz7U= -github.com/dave/courtney v0.3.0/go.mod h1:BAv3hA06AYfNUjfjQr+5gc6vxeBVOupLqrColj+QSD8= -github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e h1:l99YKCdrK4Lvb/zTupt0GMPfNbncAGf8Cv/t1sYLOg0= -github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e/go.mod h1:i00+b/gKdIDIxuLDFob7ustLAVqhsZRk2qVZrArELGQ= -github.com/dave/kerr v0.0.0-20170318121727-bc25dd6abe8e h1:xURkGi4RydhyaYR6PzcyHTueQudxY4LgxN1oYEPJHa0= -github.com/dave/kerr v0.0.0-20170318121727-bc25dd6abe8e/go.mod h1:qZqlPyPvfsDJt+3wHJ1EvSXDuVjFTK0j2p/ca+gtsb8= -github.com/dave/patsy v0.0.0-20210517141501-957256f50cba h1:1o36L4EKbZzazMk8iGC4kXpVnZ6TPxR2mZ9qVKjNNAs= -github.com/dave/patsy v0.0.0-20210517141501-957256f50cba/go.mod h1:qfR88CgEGLoiqDaE+xxDCi5QA5v4vUoW0UCX2Nd5Tlc= -github.com/dave/rebecca v0.9.1 h1:jxVfdOxRirbXL28vXMvUvJ1in3djwkVKXCq339qhBL0= -github.com/dave/rebecca v0.9.1/go.mod h1:N6XYdMD/OKw3lkF3ywh8Z6wPGuwNFDNtWYEMFWEmXBA= github.com/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892 h1:qg9VbHo1TlL0KDM0vYvBG9EY0X0Yku5WYIPoFWt8f6o= github.com/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892/go.mod h1:CTDl0pzVzE5DEzZhPfvhY/9sPFMQIxaJ9VAMs9AagrE= -github.com/dchest/siphash v1.2.3 h1:QXwFc8cFOR2dSa/gE6o/HokBMWtLUaNDVd+22aKHeEA= -github.com/dchest/siphash v1.2.3/go.mod h1:0NvQU092bT0ipiFN++/rXm69QG9tVxLAlQHIXMPAkHc= github.com/dchest/uniuri v1.2.0 h1:koIcOUdrTIivZgSLhHQvKgqdWZq5d7KdMEWF1Ud6+5g= github.com/dchest/uniuri v1.2.0/go.mod h1:fSzm4SLHzNZvWLvWJew423PhAzkpNQYq+uNLq4kxhkY= github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3 h1:tkum0XDgfR0jcVVXuTsYv/erY2NnEDqwRojbxR1rBYA= -github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba h1:p6poVbjHDkKa+wtC8frBMwQtT3BmqGYBjzMwJ63tuR4= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-ddmin v0.0.0-20210904190556-96a6d69f1034 h1:BuCyszxPxUjBrYW2HNVrimC0rBUs2U27jCJGVh0IKTM= -github.com/dgryski/go-ddmin v0.0.0-20210904190556-96a6d69f1034/go.mod h1:zz4KxBkcXUWKjIcrc+uphJ1gPh/t18ymGm3PmQ+VGTk= github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b h1:Yqiad0+sloMPdd/0Fg22actpFx0dekpzt1xJmVNVkU0= github.com/dhui/dktest v0.3.0 h1:kwX5a7EkLcjo7VpsPQSYJcKGbXBXdjI9FGjuUj1jn6I= github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dnaeon/go-vcr v1.1.0 h1:ReYa/UBrRyQdant9B4fNHGoCNKw6qh6P0fsdGmZpR7c= github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-plugins-helpers v0.0.0-20240701071450-45e2431495c8 h1:IMfrF5LCzP2Vhw7j4IIH3HxPsCLuZYjDqFAM/C88ulg= github.com/docker/go-plugins-helpers v0.0.0-20240701071450-45e2431495c8/go.mod h1:LFyLie6XcDbyKGeVK6bHe+9aJTYCxWLBg5IrJZOaXKA= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= -github.com/dolthub/go-icu-regex v0.0.0-20241215010122-db690dd53c90/go.mod h1:ylU4XjUpsMcvl/BKeRRMXSH7e7WBrPXdSLvnRJYrxEA= -github.com/dolthub/go-icu-regex v0.0.0-20250319212010-451ea8d003fa/go.mod h1:ylU4XjUpsMcvl/BKeRRMXSH7e7WBrPXdSLvnRJYrxEA= -github.com/dolthub/go-mysql-server v0.19.1-0.20250206012855-c216e59c21a7/go.mod h1:jYEJ8tNkA7K3k39X8iMqaX3MSMmViRgh222JSLHDgVc= -github.com/dolthub/go-mysql-server v0.19.1-0.20250319232254-8c915e51131f/go.mod h1:9itIc5jYYDRxmchFmegPaLaqdf4XWYX6nua5HhrajgA= github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81 h1:7/v8q9XGFa6q5Ap4Z/OhNkAMBaK5YeuEzwJt+NZdhiE= github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81/go.mod h1:siLfyv2c92W1eN/R4QqG/+RjjX5W2+gCTRjZxBjI3TY= github.com/dolthub/swiss v0.2.1 h1:gs2osYs5SJkAaH5/ggVJqXQxRXtWshF6uE0lgR/Y3Gw= github.com/dolthub/swiss v0.2.1/go.mod h1:8AhKZZ1HK7g18j7v7k6c5cYIGEZJcPn0ARsai8cUrh0= -github.com/dolthub/vitess v0.0.0-20250123002143-3b45b8cacbfa/go.mod h1:1gQZs/byeHLMSul3Lvl3MzioMtOW1je79QYGyi2fd70= -github.com/dolthub/vitess v0.0.0-20250304211657-920ca9ec2b9a/go.mod h1:1gQZs/byeHLMSul3Lvl3MzioMtOW1je79QYGyi2fd70= github.com/drone/funcmap v0.0.0-20220929084810-72602997d16f h1:/jEs7lulqVO2u1+XI5rW4oFwIIusxuDOVKD9PAzlW2E= github.com/drone/funcmap v0.0.0-20220929084810-72602997d16f/go.mod h1:nDRkX7PHq+p39AD5/usv3KZMerxZTYU/9rfLS5IDspU= github.com/drone/signal v1.0.0 h1:NrnM2M/4yAuU/tXs6RP1a1ZfxnaHwYkd0kJurA1p6uI= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415 h1:q1oJaUPdmpDm/VyXosjgPgr6wS7c5iV2p0PwJD73bUI= github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= -github.com/eapache/go-resiliency v1.6.0 h1:CqGDTLtpwuWKn6Nj3uNUdflaq+/kIPsg0gfNzHton30= -github.com/eapache/go-resiliency v1.6.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/eapache/go-resiliency v1.7.0 h1:n3NRTnBn5N0Cbi/IeOHuQn9s2UwVUH7Ga0ZWcP+9JTA= github.com/eapache/go-resiliency v1.7.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= @@ -1100,62 +509,26 @@ github.com/efficientgo/tools/core v0.0.0-20220225185207-fe763185946b h1:ZHiD4/yE github.com/efficientgo/tools/core v0.0.0-20220225185207-fe763185946b/go.mod h1:OmVcnJopJL8d3X3sSXTiypGoUSgFq1aDGmlrdi9dn/M= github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= -github.com/elastic/go-sysinfo v1.8.1/go.mod h1:JfllUnzoQV/JRYymbH3dO1yggI3mV2oTKSXsDHM+uIM= -github.com/elastic/go-sysinfo v1.11.2 h1:mcm4OSYVMyws6+n2HIVMGkln5HOpo5Ie1ZmbbNn0jg4= -github.com/elastic/go-sysinfo v1.11.2/go.mod h1:GKqR8bbMK/1ITnez9NIsIfXQr25aLhRJa7AfT8HpBFQ= -github.com/elastic/go-sysinfo v1.15.2 h1:rgUFj4xRnxdAaxh4IhuGzHINWT8WrwUe5D338LLRC0s= -github.com/elastic/go-sysinfo v1.15.2/go.mod h1:jPSuTgXG+dhhh0GKIyI2Cso+w5lPJ5PvVqKlL8LV/Hk= github.com/elastic/go-sysinfo v1.15.3 h1:W+RnmhKFkqPTCRoFq2VCTmsT4p/fwpo+3gKNQsn1XU0= github.com/elastic/go-sysinfo v1.15.3/go.mod h1:K/cNrqYTDrSoMh2oDkYEMS2+a72GRxMvNP+GC+vRIlo= -github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= -github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= -github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= github.com/elastic/go-windows v1.0.2 h1:yoLLsAsV5cfg9FLhZ9EXZ2n2sQFKeDYrHenkcivY4vI= github.com/elastic/go-windows v1.0.2/go.mod h1:bGcDpBzXgYSqM0Gx3DM4+UxFj300SZLixie9u9ixLM8= github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= -github.com/elazarl/goproxy v1.3.0/go.mod h1:X/5W/t+gzDyLfHW4DrMdpjqYjpXsURlBt9lpBDxZZZQ= -github.com/elazarl/goproxy v1.7.1/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633 h1:H2pdYOb3KQ1/YsqVWoWNLQO+fusocsw354rqGTZtAgw= -github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= -github.com/emicklei/proto v1.10.0/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= -github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw= -github.com/envoyproxy/go-control-plane/envoy v1.32.3/go.mod h1:F6hWupPfh75TBXGKA++MCT/CZHFq5r9/uwt/kQYkZfE= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= -github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= -github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= -github.com/expr-lang/expr v1.17.0/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= -github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/fgprof v0.9.4 h1:ocDNwMFlnA0NU0zSB3I52xkO4sFXk80VK9lXjLClu88= github.com/felixge/fgprof v0.9.4/go.mod h1:yKl+ERSa++RYOs32d8K6WEXCB4uXdLls4ZaZPpayhMM= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/fluent/fluent-bit-go v0.0.0-20230731091245-a7a013e2473c h1:yKN46XJHYC/gvgH2UsisJ31+n4K3S7QYZSfU2uAWjuI= github.com/fluent/fluent-bit-go v0.0.0-20230731091245-a7a013e2473c/go.mod h1:L92h+dgwElEyUuShEwjbiHjseW410WIcNz+Bjutc8YQ= github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fsouza/fake-gcs-server v1.7.0 h1:Un0BXUXrRWYSmYyC1Rqm2e2WJfTPyDy/HGMz31emTi8= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa h1:RDBNVkRviHZtvDvId8XSGPu3rmpmSe+wKRcEWNgsfWU= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7 h1:LofdAjjjqCSXMwLGgOgnE+rdPuvX9DxCqaHwKy7i/ko= -github.com/getkin/kin-openapi v0.126.0 h1:c2cSgLnAsS0xYfKsgt5oBV6MYRM/giU8/RtwUY4wyfY= -github.com/getkin/kin-openapi v0.126.0/go.mod h1:7mONz8IwmSRg6RttPu6v8U/OJ+gr+J99qSFNjPGSQqw= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= @@ -1168,36 +541,18 @@ github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7F github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= github.com/go-fonts/latin-modern v0.2.0 h1:5/Tv1Ek/QCr20C6ZOz15vw3g7GELYL98KWr8Hgo+3vk= github.com/go-fonts/liberation v0.2.0 h1:jAkAWJP4S+OsrPLZM4/eC9iW7CtHy+HBXrEwZXWo5VM= -github.com/go-fonts/liberation v0.3.2 h1:XuwG0vGHFBPRRI8Qwbi5tIvR3cku9LUfZGq/Ar16wlQ= -github.com/go-fonts/liberation v0.3.2/go.mod h1:N0QsDLVUQPy3UYg9XAc3Uh3UDMp2Z7M1o4+X98dXkmI= github.com/go-fonts/stix v0.1.0 h1:UlZlgrvvmT/58o573ot7NFw0vZasZ5I6bcIft/oMdgg= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= -github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= -github.com/go-jose/go-jose/v4 v4.0.4/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc= github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= github.com/go-json-experiment/json v0.0.0-20250211171154-1ae217ad3535 h1:yE7argOs92u+sSCRgqqe6eF+cDaVhSPlioy1UkA0p/w= github.com/go-json-experiment/json v0.0.0-20250211171154-1ae217ad3535/go.mod h1:BWmvoE1Xia34f3l/ibJweyhrT+aROb/FQ6d+37F0e2s= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= -github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= -github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81 h1:6zl3BbBhdnMkpSj2YY30qV3gDcVBGtFgVsV3+/i+mKQ= -github.com/go-latex/latex v0.0.0-20231108140139-5c1ce85aa4ea h1:DfZQkvEbdmOe+JK2TMtBM+0I9GSdzE2y/L1/AmD8xKc= -github.com/go-latex/latex v0.0.0-20231108140139-5c1ce85aa4ea/go.mod h1:Y7Vld91/HRbTBm7JwoI7HejdDB0u+e9AUBO9MB7yuZk= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-pdf/fpdf v0.6.0 h1:MlgtGIfsdMEEQJr2le6b/HNr1ZlQwxyWr77r2aj2U/8= -github.com/go-pdf/fpdf v0.9.0 h1:PPvSaUuo1iMi9KkaAn90NuKi+P4gwMedWPHhj8YlJQw= -github.com/go-pdf/fpdf v0.9.0/go.mod h1:oO8N111TkmKb9D7VvWGLvLJlaZUQVPM+6V42pp3iV4Y= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= @@ -1205,247 +560,77 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4= github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= -github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013 h1:l9rI6sNaZgNC0LnF3MiE+qTmyBA/tZAg1rtyrGbUMK0= -github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013/go.mod h1:b65mBPzqzZWxOZGxSWrqs4GInLIn+u99Q9q7p+GKni0= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= -github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= -github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= -github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= -github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= -github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccmack/gocc v0.0.0-20230228185258-2292f9e40198 h1:FSii2UQeSLngl3jFoR4tUKZLprO7qUlh/TKKticc0BM= github.com/goccmack/gocc v0.0.0-20230228185258-2292f9e40198/go.mod h1:DTh/Y2+NbnOVVoypCCQrovMPDKUGp4yZpSbWg5D0XIM= -github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-yaml v1.11.0 h1:n7Z+zx8S9f9KgzG6KtQKf+kwqXZlLNR2F6018Dgau54= github.com/goccy/go-yaml v1.11.0/go.mod h1:H+mJrWtjPTJAHvRbV09MCK9xYwODM+wRTVFFTWckfng= github.com/gocql/gocql v0.0.0-20200526081602-cd04bd7f22a7 h1:TvUE5vjfoa7fFHMlmGOk0CsauNj1w4yJjR9+/GnWVCw= github.com/gocql/gocql v0.0.0-20200526081602-cd04bd7f22a7/go.mod h1:DL0ekTmBSTdlNF25Orwt/JMzqIq3EJ4MVa/J/uK64OY= github.com/gocraft/dbr/v2 v2.7.2 h1:ccUxMuz6RdZvD7VPhMRRMSS/ECF3gytPhPtcavjktHk= github.com/gocraft/dbr/v2 v2.7.2/go.mod h1:5bCqyIXO5fYn3jEp/L06QF4K1siFdhxChMjdNu6YJrg= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8= github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= -github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= -github.com/golang/glog v1.2.3/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= -github.com/golangci/modinfo v0.3.3 h1:YBQDZpDMJpe5mtd0klUFYL8tSVkmF3cmm0fZ48sc7+s= -github.com/golangci/modinfo v0.3.3/go.mod h1:wytF1M5xl9u0ij8YSvhkEVPP3M5Mc7XLl1pxH3B2aUM= github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12 h1:uK3X/2mt4tbSGoHvbLBHUny7CKiuwUip3MArtukol4E= github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/cel-go v0.22.0/go.mod h1:BuznPXXfQDpXKWQ9sPW3TzlAJN5zzFe+i9tIs0yC4s8= -github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/generative-ai-go v0.18.0 h1:6ybg9vOCLcI/UpBBYXOTVgvKmcUKFRNj+2Cj3GnebSo= -github.com/google/generative-ai-go v0.18.0/go.mod h1:JYolL13VG7j79kM5BtHz4qwONHkeJQzOCkKXnpqtS/E= -github.com/google/generative-ai-go v0.19.0 h1:R71szggh8wHMCUlEMsW2A/3T+5LdEIkiaHSYgSpUgdg= -github.com/google/generative-ai-go v0.19.0/go.mod h1:JYolL13VG7j79kM5BtHz4qwONHkeJQzOCkKXnpqtS/E= github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= github.com/google/go-jsonnet v0.18.0 h1:/6pTy6g+Jh1a1I2UMoAODkqELFiVIdOxbNwv0DDzoOg= github.com/google/go-jsonnet v0.18.0/go.mod h1:C3fTzyVJDslXdiTqw/bTFk7vSGyCtH3MGRbDfvEwGd0= github.com/google/go-pkcs11 v0.3.0 h1:PVRnTgtArZ3QQqTGtbtjtnIkzl2iY2kt24yqbrf7td8= github.com/google/go-pkcs11 v0.3.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= -github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= -github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= -github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= -github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/renameio/v2 v2.0.0 h1:UifI23ZTGY8Tt29JbYFiuyIU3eX+RNFtUwefq9qAhxg= github.com/google/renameio/v2 v2.0.0/go.mod h1:BtmJXm5YlszgC+TD4HOEEUFgkJP3nLxehU6hfe7jRt4= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= -github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/googleapis/cloud-bigtable-clients-test v0.0.2 h1:S+sCHWAiAc+urcEnvg5JYJUOdlQEm/SEzQ/c/IdAH5M= -github.com/googleapis/cloud-bigtable-clients-test v0.0.2/go.mod h1:mk3CrkrouRgtnhID6UZQDK3DrFFa7cYCAJcEmNsHYrY= -github.com/googleapis/cloud-bigtable-clients-test v0.0.3 h1:afMKTvA/jc6jSTMkeHBZGFDTt8Cc+kb1ATFzqMK85hw= -github.com/googleapis/cloud-bigtable-clients-test v0.0.3/go.mod h1:TWtDzrrAI70C3dNLDY+nZN3gxHtFdZIbpL9rCTFyxE0= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= -github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= -github.com/googleapis/enterprise-certificate-proxy v0.3.5/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= -github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= -github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= -github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk= github.com/googleapis/gnostic v0.3.0 h1:CcQijm0XKekKjP/YCz28LXVSpgguuB+nCxaSjCe09y0= -github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720 h1:zC34cGQu69FG7qzJ3WiKW244WfhDC3xxYMeNOX2gtUQ= -github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= -github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= github.com/gophercloud/gophercloud v1.13.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grafana/alerting v0.0.0-20250129195454-3e5b80036b7a/go.mod h1:QsnoKX/iYZxA4Cv+H+wC7uxutBD8qi8ZW5UJvD2TYmU= -github.com/grafana/alerting v0.0.0-20250310104713-16b885f1c79e/go.mod h1:HfvjmU3UqCIpoy9Z2wgKGrZ4A5vz+yQlP9ZXvCfEkiA= -github.com/grafana/alerting v0.0.0-20250403153742-418bc7118d05 h1:hMzOzI/S0nkZt0nUqpfAa4Rdb+YL8z8oG3pl4Jb31h8= -github.com/grafana/alerting v0.0.0-20250403153742-418bc7118d05/go.mod h1:K3YAJumchx5EEZItGv4D3pCv/Ux796hmoOibP/p/eYk= -github.com/grafana/alerting v0.0.0-20250429131604-de176b4a0309 h1:H2p3XKDHnTBGkMXLCgXiqb2dFnHbQ4zPDXOwKK4Ne3Y= -github.com/grafana/alerting v0.0.0-20250429131604-de176b4a0309/go.mod h1:pMfhRxL2LZ3Pm8iy7VcVsb9CLYuBtjFYbf1oxgx7yFA= -github.com/grafana/authlib v0.0.0-20250123104008-e99947858901/go.mod h1:/gYfphsNu9v1qYWXxpv1NSvMEMSwvdf8qb8YlgwIRl8= -github.com/grafana/authlib/types v0.0.0-20250120144156-d6737a7dc8f5/go.mod h1:qYjSd1tmJiuVoSICp7Py9/zD54O9uQQA3wuM6Gg4DFM= -github.com/grafana/authlib/types v0.0.0-20250120145936-5f0e28e7a87c/go.mod h1:qYjSd1tmJiuVoSICp7Py9/zD54O9uQQA3wuM6Gg4DFM= github.com/grafana/authlib/types v0.0.0-20250314102521-a77865c746c0/go.mod h1:qeWYbnWzaYGl88JlL9+DsP1GT2Cudm58rLtx13fKZdw= github.com/grafana/cloudflare-go v0.0.0-20230110200409-c627cf6792f2 h1:qhugDMdQ4Vp68H0tp/0iN17DM2ehRo1rLEdOFe/gB8I= github.com/grafana/cloudflare-go v0.0.0-20230110200409-c627cf6792f2/go.mod h1:w/aiO1POVIeXUQyl0VQSZjl5OAGDTL5aX+4v0RA1tcw= -github.com/grafana/cog v0.0.23 h1:/0CCJ24Z8XXM2DnboSd2FzoIswUroqIZzVr8oJWmMQs= -github.com/grafana/cog v0.0.23/go.mod h1:jrS9indvWuDs60RHEZpLaAkmZdgyoLKMOEUT0jiB1t0= -github.com/grafana/dskit v0.0.0-20250317084829-9cdd36a91f10/go.mod h1:GYazi+gM2La64jui4nDKrD6b8Drb8QDsUqyzBuiy1Ag= github.com/grafana/go-gelf/v2 v2.0.1 h1:BOChP0h/jLeD+7F9mL7tq10xVkDG15he3T1zHuQaWak= github.com/grafana/go-gelf/v2 v2.0.1/go.mod h1:lexHie0xzYGwCgiRGcvZ723bSNyNI8ZRD4s0CLobh90= -github.com/grafana/gomemcache v0.0.0-20250228145437-da7b95fd2ac1/go.mod h1:j/s0jkda4UXTemDs7Pgw/vMT06alWc42CHisvYac0qw= -github.com/grafana/grafana-app-sdk/logging v0.38.0/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk= -github.com/grafana/grafana-app-sdk/logging v0.39.0 h1:3GgN5+dUZYqq74Q+GT9/ET+yo+V54zWQk/Q2/JsJQB4= -github.com/grafana/grafana-app-sdk/logging v0.39.0/go.mod h1:WhDENSnaGHtyVVwZGVnAR7YLvh2xlLDYR3D7E6h7XVk= -github.com/grafana/grafana-aws-sdk v0.38.2 h1:TzQD0OpWsNjtldi5G5TLDlBRk8OyDf+B5ujcoAu4Dp0= -github.com/grafana/grafana-aws-sdk v0.38.2/go.mod h1:j3vi+cXYHEFqjhBGrI6/lw1TNM+dl0Y3f0cSnDOPy+s= -github.com/grafana/grafana-plugin-sdk-go v0.263.0/go.mod h1:U43Cnrj/9DNYyvFcNdeUWNjMXTKNB0jcTcQGpWKd2gw= -github.com/grafana/grafana-plugin-sdk-go v0.267.0/go.mod h1:OuwS4c/JYgn0rr/w5zhJBpLo4gKm/vw15RsfpYAvK9Q= -github.com/grafana/grafana-plugin-sdk-go v0.269.1/go.mod h1:yv2KbO4mlr9WuDK2f+2gHAMTwwLmLuqaEnrPXTRU+OI= -github.com/grafana/grafana-plugin-sdk-go v0.275.0/go.mod h1:mO9LJqdXDh5JpO/xIdPAeg5LdThgQ06Y/SLpXDWKw2c= -github.com/grafana/grafana-plugin-sdk-go v0.277.0/go.mod h1:mAUWg68w5+1f5TLDqagIr8sWr1RT9h7ufJl5NMcWJAU= -github.com/grafana/grafana/apps/advisor v0.0.0-20250123151950-b066a6313173/go.mod h1:goSDiy3jtC2cp8wjpPZdUHRENcoSUHae1/Px/MDfddA= -github.com/grafana/grafana/apps/advisor v0.0.0-20250220154326-6e5de80ef295/go.mod h1:9I1dKV3Dqr0NPR9Af0WJGxOytp5/6W3JLiNChOz8r+c= -github.com/grafana/grafana/apps/advisor v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:q+h3HbmqU/PposW6lq8cMle1v8vuyX1LCMrGzbabHxc= -github.com/grafana/grafana/apps/alerting/notifications v0.0.0-20250121113133-e747350fee2d/go.mod h1:AvleS6icyPmcBjihtx5jYEvdzLmHGBp66NuE0AMR57A= -github.com/grafana/grafana/apps/alerting/notifications v0.0.0-20250416173722-ec17e0e4ce03/go.mod h1:oemrhKvFxxc5m32xKHPxInEHAObH0/hPPyHUiBUZ1Cc= -github.com/grafana/grafana/apps/alerting/notifications v0.0.0-20250506052906-7a2fc797fb4a/go.mod h1:VkX53kBiqIMHBoGgeEDJnzm5Nwcmv/726tuZuT5SvJY= -github.com/grafana/grafana/apps/alerting/notifications v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:WpI7TCck4P2wKTO2WJLBRcfOWvUGvTdxYu3QqS3z7jM= -github.com/grafana/grafana/apps/dashboard v0.0.0-20250616135341-59c2f154336b/go.mod h1:OIlvNnUufYDhBXa4xK4CyzPI2C69ZJkHy5+aFDyPtXw= -github.com/grafana/grafana/apps/dashboard v0.0.0-20250616145019-8d27f12428cb/go.mod h1:OIlvNnUufYDhBXa4xK4CyzPI2C69ZJkHy5+aFDyPtXw= -github.com/grafana/grafana/apps/dashboard v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:eR8wca74ADgxBrvX0uNpdB1qnPaGx/KhCm4Xj8oqHfQ= -github.com/grafana/grafana/apps/folder v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:dLtYBp1pza5HYalezNvzlP8JDeKrZ5BKTonDgEOE0NY= -github.com/grafana/grafana/apps/iam v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:tDBCTbGRvjHTFgMc06hRRmceGSmoub7cReUMbHHS56Q= -github.com/grafana/grafana/apps/investigation v0.0.0-20250121113133-e747350fee2d/go.mod h1:HQprw3MmiYj5OUV9CZnkwA1FKDZBmYACuAB3oDvUOmI= -github.com/grafana/grafana/apps/investigations v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:8RlQ4U9lccPEBD/QxV4zyIMh9+lzjS/7xGpiqn3cHLY= -github.com/grafana/grafana/apps/playlist v0.0.0-20250121113133-e747350fee2d/go.mod h1:DjJe5osrW/BKrzN9hAAOSElNWutj1bcriExa7iDP7kA= -github.com/grafana/grafana/apps/playlist v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:fPtx6dwGm0PweQRVbgtthMapJMvXobBcORbndb7Dgd4= -github.com/grafana/grafana/pkg/aggregator v0.0.0-20250121113133-e747350fee2d/go.mod h1:1sq0guad+G4SUTlBgx7SXfhnzy7D86K/LcVOtiQCiMA= -github.com/grafana/grafana/pkg/aggregator v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:+H4Va9jDJlGQJjAN+OFD/hLx2I/yEzDRMQLaKecvgAc= -github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:u0+k7KLCvGi6zHWsc2B7r+tmGcYjN/qR+gn51pl104E= -github.com/grafana/grafana/pkg/apis/secret v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:9YjiHZzii2DZfocRDJbqSeC8M3GWenU5yexeHHxsZ4Y= -github.com/grafana/grafana/pkg/apiserver v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:6OKkPWDB8PetDXqMVMOWL35iTCEUdpATwwpuew0k8+o= -github.com/grafana/grafana/pkg/build v0.0.0-20250220114259-be81314e2118/go.mod h1:STVpVboMYeBAfyn6Zw6XHhTHqUxzMy7pzRiVgk1l0W0= -github.com/grafana/grafana/pkg/build v0.0.0-20250227105625-8f465f124924/go.mod h1:Vw0LdoMma64VgIMVpRY3i0D156jddgUGjTQBOcyeF3k= -github.com/grafana/grafana/pkg/build v0.0.0-20250227163402-d78c646f93bb/go.mod h1:Vw0LdoMma64VgIMVpRY3i0D156jddgUGjTQBOcyeF3k= -github.com/grafana/grafana/pkg/build v0.0.0-20250403075254-4918d8720c61/go.mod h1:LGVnSwdrS0ZnJ2WXEl5acgDoYPm74EUSFavca1NKHI8= -github.com/grafana/grafana/pkg/build v0.0.0-20250625151647-35f89a456cc6/go.mod h1:dIu5dZy00k2TBdpVBXkvSbxHNj5H7lW/sOTpJTtKIXg= -github.com/grafana/grafana/pkg/semconv v0.0.0-20250121113133-e747350fee2d/go.mod h1:tfLnBpPYgwrBMRz4EXqPCZJyCjEG4Ev37FSlXnocJ2c= -github.com/grafana/grafana/pkg/semconv v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:mu3yl0GxB0eQZV1q7Kka0pkF3Th9x7W04WrjR9wqBlc= -github.com/grafana/grafana/pkg/storage/unified/apistore v0.0.0-20250121113133-e747350fee2d/go.mod h1:CXpwZ3Mkw6xVlGKc0SqUxqXCP3Uv182q6qAQnLaLxRg= -github.com/grafana/grafana/pkg/storage/unified/apistore v0.0.0-20250514132646-acbc7b54ed9e/go.mod h1:xrKQcxQxz+IUF90ybtfENFeEXtlj9nAsX/3Fw0KEIeQ= -github.com/grafana/nanogit v0.0.0-20250616082354-5e94194d02ed h1:59JF1WhHLT+lNX89Tm1OzOEySMVMASAhaPbsRjtp8Kc= -github.com/grafana/nanogit v0.0.0-20250616082354-5e94194d02ed/go.mod h1:OIAAKNgG5fpuJQRNO1lUSj9nc18Xl3O7M8fjIlBO1cI= -github.com/grafana/nanogit v0.0.0-20250619160700-ebf70d342aa5 h1:MAQ2B0cu0V1S91ZjVa7NomNZFjaR2SmdtvdwhqBtyhU= -github.com/grafana/nanogit v0.0.0-20250619160700-ebf70d342aa5/go.mod h1:tN93IZUaAmnSWgL0IgnKdLv6DNeIhTJGvl1wvQMrWco= -github.com/grafana/prometheus-alertmanager v0.25.1-0.20240930132144-b5e64e81e8d3 h1:6D2gGAwyQBElSrp3E+9lSr7k8gLuP3Aiy20rweLWeBw= -github.com/grafana/prometheus-alertmanager v0.25.1-0.20240930132144-b5e64e81e8d3/go.mod h1:YeND+6FDA7OuFgDzYODN8kfPhXLCehcpxe4T9mdnpCY= -github.com/grafana/prometheus-alertmanager v0.25.1-0.20250331083058-4563aec7a975 h1:4/BZkGObFWZf4cLbE2Vqg/1VTz67Q0AJ7LHspWLKJoQ= -github.com/grafana/prometheus-alertmanager v0.25.1-0.20250331083058-4563aec7a975/go.mod h1:FGdGvhI40Dq+CTQaSzK9evuve774cgOUdGfVO04OXkw= github.com/grafana/prometheus-alertmanager v0.25.1-0.20250604130045-92c8f6389b36 h1:AjZ58JRw1ZieFH/SdsddF5BXtsDKt5kSrKNPWrzYz3Y= github.com/grafana/prometheus-alertmanager v0.25.1-0.20250604130045-92c8f6389b36/go.mod h1:O/QP1BCm0HHIzbKvgMzqb5sSyH88rzkFk84F4TfJjBU= -github.com/grafana/sqlds/v4 v4.2.0 h1:7qZmuTzLMZFtszX14NyefU3R6WVtx27i7WduRDLKKOE= -github.com/grafana/sqlds/v4 v4.2.0/go.mod h1:OyEREvYCd2U/qXiIK/iprQ/4VUF2TTemIixFdUeGsOc= github.com/grafana/tail v0.0.0-20230510142333-77b18831edf0 h1:bjh0PVYSVVFxzINqPFYJmAmJNrWPgnVjuSdYJGHmtFU= github.com/grafana/tail v0.0.0-20230510142333-77b18831edf0/go.mod h1:7t5XR+2IA8P2qggOAHTj/GCZfoLBle3OvNSYh1VkRBU= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.2.0/go.mod h1:zrT2dxOAjNFPRGjTUe2Xmb4q4YdUwVvQFV6xiCSf+z0= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0/go.mod h1:qOchhhIlmRcqk/O9uCo/puJlyo07YINaIqdZfZG3Jkc= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1/go.mod h1:qOchhhIlmRcqk/O9uCo/puJlyo07YINaIqdZfZG3Jkc= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= -github.com/hamba/avro/v2 v2.27.0 h1:IAM4lQ0VzUIKBuo4qlAiLKfqALSrFC+zi1iseTtbBKU= -github.com/hamba/avro/v2 v2.27.0/go.mod h1:jN209lopfllfrz7IGoZErlDz+AyUJ3vrBePQFZwYf5I= github.com/hamba/avro/v2 v2.28.0 h1:E8J5D27biyAulWKNiEBhV85QPc9xRMCUCGJewS0KYCE= github.com/hamba/avro/v2 v2.28.0/go.mod h1:9TVrlt1cG1kkTUtm9u2eO5Qb7rZXlYzoKqPt8TSH+TA= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/api v1.14.0/go.mod h1:bcaw5CSZ7NE9qfOfKCI1xb7ZKjzu/MyvQkCLTfqLqxQ= -github.com/hashicorp/consul/api v1.15.3/go.mod h1:/g/qgcoBcEXALCNZgRRisyTW0nY86++L0KbeAMXYCeY= -github.com/hashicorp/consul/api v1.28.2/go.mod h1:KyzqzgMEya+IZPcD65YFoOVAgPpbfERu4I/tzG6/ueE= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.10.0/go.mod h1:yPkX5Q6CsxTFMjQQDJwzeNmUUF5NUGGbrDsv9wTb8cw= -github.com/hashicorp/consul/sdk v0.11.0/go.mod h1:yPkX5Q6CsxTFMjQQDJwzeNmUUF5NUGGbrDsv9wTb8cw= -github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8IoK3c= github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= github.com/hashicorp/go-msgpack v1.1.5 h1:9byZdVjKTe5mce63pRVNP1L7UAmdHOTEMGehn6KvJWs= github.com/hashicorp/go-msgpack v1.1.5/go.mod h1:gWVc3sv/wbDmR3rQsj1CAktEZzoz1YNK9NfGLXJ69/4= -github.com/hashicorp/go-msgpack/v2 v2.1.1/go.mod h1:upybraOAblm4S7rx0+jeNy+CWWhzywQsSRV5033mMu4= -github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-sockaddr v1.0.5/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI= github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= -github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= -github.com/hashicorp/mdns v1.0.4 h1:sY0CMhFmjIPDMlTB+HfymFHCaYLhgifZ0QhjaYKD/UQ= github.com/hashicorp/mdns v1.0.5 h1:1M5hW1cunYeoXOqHwEb/GBDDHAFo0Yqb/uz/beC6LbE= github.com/hashicorp/mdns v1.0.5/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.3.1/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.4.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/memberlist v0.5.1/go.mod h1:zGDXV6AqbDTKTM6yxW0I4+JtFzZAJVoIPvss4hV8F24= github.com/hashicorp/raft v1.7.0 h1:4u24Qn6lQ6uwziM++UgsyiT64Q8GyRn43CV41qPiz1o= github.com/hashicorp/raft v1.7.0/go.mod h1:N1sKh6Vn47mrWvEArQgILTyng8GoDRNYlgKyK7PMjs0= github.com/hashicorp/raft-wal v0.4.1 h1:aU8XZ6x8R9BAIB/83Z1dTDtXvDVmv9YVYeXxd/1QBSA= github.com/hashicorp/raft-wal v0.4.1/go.mod h1:A6vP5o8hGOs1LHfC1Okh9xPwWDcmb6Vvuz/QyqUXlOE= -github.com/hashicorp/serf v0.10.0/go.mod h1:bXN03oZc5xlH46k/K1qTrpXb9ERKyY1/i/N5mxvgrZw= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/heroku/x v0.0.61 h1:yfoAAtnFWSFZj+UlS+RZL/h8QYEp1R4wHVEg0G+Hwh4= github.com/heroku/x v0.0.61/go.mod h1:C7xYbpMdond+s6L5VpniDUSVPRwm3kZum1o7XiD5ZHk= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465 h1:KwWnWVWCNtNq/ewIX7HIKnELmEx2nDP42yskD/pi7QE= @@ -1453,50 +638,28 @@ github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465/go.mod h1: github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/influxdata/influxdb v1.7.7 h1:UvNzAPfBrKMENVbQ4mr4ccA9sW+W1Ihl0Yh1s0BiVAg= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/tdigest v0.0.2-0.20210216194612-fc98d27c9e8b h1:i44CesU68ZBRvtCjBi3QSosCIKrjmMbYlQMFAwVLds4= github.com/influxdata/tdigest v0.0.2-0.20210216194612-fc98d27c9e8b/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y= github.com/influxdata/telegraf v1.16.3 h1:x0qeuSGGMg5y+YqP/5ZHwXZu3bcBrO8AAQOTNlYEb1c= github.com/influxdata/telegraf v1.16.3/go.mod h1:fX/6k7qpIqzVPWyeIamb0wN5hbwc0ANUaTS80lPYFB8= -github.com/intel/goresctrl v0.2.0 h1:JyZjdMQu9Kl/wLXe9xA6s1X+tF6BWsQPFGJMEeCfWzE= -github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= -github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56 h1:742eGXur0715JMq73aD95/FU0XpVKXqNuTnEfXsLOYQ= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc= github.com/jackc/pgx v3.2.0+incompatible h1:0Vihzu20St42/UDsvZGdNE6jak7oi/UOeMzwMPHkgFY= -github.com/jackc/pgx/v5 v5.7.1/go.mod h1:e7O26IywZZ+naJtWWos6i6fvWK+29etgITqrqHLfoZA= github.com/jackspirou/syscerts v0.0.0-20160531025014-b68f5469dff1 h1:9Xm8CKtMZIXgcopfdWk/qZ1rt0HjMgfMR9nxxSeK6vk= github.com/jackspirou/syscerts v0.0.0-20160531025014-b68f5469dff1/go.mod h1:zuHl3Hh+e9P6gmBPvcqR1HjkaWHC/csgyskg6IaFKFo= -github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= -github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= github.com/jaegertracing/jaeger v1.67.0 h1:t0BiJZVW9D3Z16y3uHqKzV9bKFTusooTH1Kgr77xF2Q= github.com/jaegertracing/jaeger v1.67.0/go.mod h1:tE/FEQfybCSdUbBgel51YaCSkc58O+Njih8oTl6j8vw= -github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= -github.com/jedib0t/go-pretty/v6 v6.2.4 h1:wdaj2KHD2W+mz8JgJ/Q6L/T5dB7kyqEFI16eLq7GEmk= -github.com/jedib0t/go-pretty/v6 v6.2.4/go.mod h1:+nE9fyyHGil+PuISTCrp7avEdo6bqoMwqZnuiK2r2a0= github.com/jedib0t/go-pretty/v6 v6.6.7 h1:m+LbHpm0aIAPLzLbMfn8dc3Ht8MW7lsSO4MPItz/Uuo= github.com/jedib0t/go-pretty/v6 v6.6.7/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= -github.com/jeremywohl/flatten v1.0.1 h1:LrsxmB3hfwJuE+ptGOijix1PIfOoKLJ3Uee/mzbgtrs= -github.com/jeremywohl/flatten v1.0.1/go.mod h1:4AmD/VxjWcI5SRB0n6szE2A6s2fsNHDLO0nAlMHgfLQ= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/gopoet v0.1.0 h1:gYjOPnzHd2nzB37xYQZxj4EIQNpBrBskRqQQ3q4ZgSg= github.com/jhump/goprotoc v0.5.0 h1:Y1UgUX+txUznfqcGdDef8ZOVlyQvnV0pKWZH08RmZuo= -github.com/jmattheis/goverter v1.7.0/go.mod h1:iVIl/4qItWjWj2g3vjouGoYensJbRqDHpzlEVMHHFeY= -github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= -github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= -github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jon-whit/go-grpc-prometheus v1.4.0 h1:/wmpGDJcLXuEjXryWhVYEGt9YBRhtLwFEN7T+Flr8sw= github.com/jon-whit/go-grpc-prometheus v1.4.0/go.mod h1:iTPm+Iuhh3IIqR0iGZ91JJEg5ax6YQEe1I0f6vtBuao= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/joncrlsn/dque v0.0.0-20211108142734-c2ef48c5192a h1:sfe532Ipn7GX0V6mHdynBk393rDmqgI0QmjLK7ct7TU= github.com/joncrlsn/dque v0.0.0-20211108142734-c2ef48c5192a/go.mod h1:dNKs71rs2VJGBAmttu7fouEsRQlRjxy0p1Sx+T5wbpY= -github.com/json-iterator/go v0.0.0-20171115153421-f7279a603ede/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jsternberg/zap-logfmt v1.2.0 h1:1v+PK4/B48cy8cfQbxL4FmmNZrjnIMr2BsnyEmXqv2o= github.com/jsternberg/zap-logfmt v1.2.0/go.mod h1:kz+1CUmCutPWABnNkOu9hOHKdT2q3TDYCcsFy9hpqb0= @@ -1520,30 +683,19 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNU github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kevinmbeaulieu/eq-go v1.0.0 h1:AQgYHURDOmnVJ62jnEk0W/7yFKEn+Lv8RHN6t7mB0Zo= github.com/kevinmbeaulieu/eq-go v1.0.0/go.mod h1:G3S8ajA56gKBZm4UB9AOyoOS37JO3roToPzKNM8dtdM= -github.com/keybase/dbus v0.0.0-20220506165403-5aa21ea2c23a/go.mod h1:YPNKjjE7Ubp9dTbnWvsP3HT+hYnY6TfXzubYTBeUxc8= github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46 h1:veS9QfglfvqAw2e+eeNT/SbGySq8ajECXJ9e4fPoLhY= -github.com/klauspost/compress v1.14.4/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= -github.com/klauspost/cpuid/v2 v2.0.10/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= -github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= -github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/knadh/koanf v1.5.0 h1:q2TSd/3Pyc/5yP9ldIrSdIz26MCcyNQzW0pEAugLPNs= github.com/knadh/koanf v1.5.0/go.mod h1:Hgyjp4y8v44hpZtPzs7JZfRAW5AhN7KfZcwv1RYggDs= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/maps v0.1.2/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= -github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= -github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= @@ -1561,125 +713,54 @@ github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b h1:11UHH39z1RhZ5dc4y4r/4koJo6IYFgTRMe/LlwRTEw0= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b/go.mod h1:WZxr2/6a/Ar9bMDc2rN/LJrE/hF6bXE4LPyDSIxwAfg= -github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linkedin/goavro/v2 v2.10.0/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4= github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4= -github.com/logrusorgru/aurora/v3 v3.0.0 h1:R6zcoZZbvVcGMvDCKo45A9U/lzYyzl5NfYIvznmDfE4= -github.com/logrusorgru/aurora/v3 v3.0.0/go.mod h1:vsR12bk5grlLvLXAYrBsb5Oc/N+LxAlxggSjiwMnCUc= github.com/logrusorgru/aurora/v4 v4.0.0 h1:sRjfPpun/63iADiSvGGjgA1cAYegEWMPCJdUpJYn9JA= github.com/logrusorgru/aurora/v4 v4.0.0/go.mod h1:lP0iIa2nrnT/qoFXcOZSrZQpJ1o6n2CUf/hyHi2Q4ZQ= -github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c h1:VtwQ41oftZwlMnOEbMWQtSEUgU64U4s+GHk7hZK+jtY= -github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 h1:7UMa6KCCMjZEMDtTVdcGu0B1GmmC7QJKiCCjyTAWQy0= github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= github.com/lyft/protoc-gen-star v0.6.1 h1:erE0rdztuaDq3bpGifD95wfoPrSZc95nGA6tbiNYh6M= github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4 h1:sIXJOMrYnQZJu7OB7ANSF4MYri2fTEGIsRLz6LwI4xE= github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= -github.com/marstr/guid v1.1.0 h1:/M4H/1G4avsieL6BbUwCOBzulmoeKVP5ux/3mQNnbyI= -github.com/matryer/moq v0.3.3 h1:pScMH9VyrdT4S93yiLpVyU8rCDqGQr24uOyBxmktG5Q= -github.com/matryer/moq v0.3.3/go.mod h1:RJ75ZZZD71hejp39j4crZLsEDszGk6iH4v4YsWFKH4s= github.com/matryer/moq v0.5.2 h1:b2bsanSaO6IdraaIvPBzHnqcrkkQmk1/310HdT2nNQs= github.com/matryer/moq v0.5.2/go.mod h1:W/k5PLfou4f+bzke9VPXTbfJljxoeR1tLHigsmbshmU= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-shellwords v1.0.3 h1:K/VxK7SZ+cvuPgFSLKi5QPI9Vr/ipOf4C1gN+ntueUk= -github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= -github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2 h1:yVCLo4+ACVroOEr4iFU1iH46Ldlzz2rTuu18Ra7M8sU= github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2/go.mod h1:VzB2VoMh1Y32/QqDfg9ZJYHj99oM4LiGtqPZydTiQSQ= github.com/mfridman/xflag v0.1.0 h1:TWZrZwG1QklFX5S4j1vxfF1sZbZeZSGofMwPMLAF29M= github.com/mfridman/xflag v0.1.0/go.mod h1:/483ywM5ZO5SuMVjrIGquYNE5CzLrj5Ux/LxWWnjRaE= -github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517 h1:zpIH83+oKzcpryru8ceC6BxnoG8TBrhgAvRg8obzup0= -github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= github.com/microcosm-cc/bluemonday v1.0.25 h1:4NEwSfiJ+Wva0VxN5B8OwMicaJvD8r9tlJWm9rtloEg= github.com/microcosm-cc/bluemonday v1.0.25/go.mod h1:ZIOjCQp1OrzBBPIJmfX4qDYFuhU02nx4bn030ixfHLE= -github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= -github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= -github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= -github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible h1:aKW/4cBs+yK6gpqU3K/oIwk9Q/XICqd3zOX/UFuvqmk= github.com/mitchellh/cli v1.1.5 h1:OxRIeJXpAMztws/XHlN2vu6imG5Dpq+j61AzAX5fLng= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= -github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0 h1:lfGJxY7ToLJQjHHwi0EX6uYBdK78egf954SQl13PQJc= github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f h1:2+myh5ml7lgEU/51gbeLHfKGNfgEQQIWrlbdaOsidbQ= github.com/mithrandie/readline-csvq v1.3.0 h1:VTJEOGouJ8j27jJCD4kBBbNTxM0OdBvE1aY1tMhlqE8= github.com/mithrandie/readline-csvq v1.3.0/go.mod h1:FKyYqDgf/G4SNov7SMFXRWO6LQLXIOeTog/NB97FZl0= -github.com/moby/go-archive v0.1.0/go.mod h1:G9B+YoujNohJmrIYFBpSd54GTUB4lt9S+xVQvsJyFuo= -github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= -github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= -github.com/moby/sys/signal v0.6.0 h1:aDpY94H8VlhTGa9sNYUFCFsMZIUh5wm0B6XkIoJj/iY= -github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= -github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc= -github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= github.com/mostynb/go-grpc-compression v1.2.3/go.mod h1:AghIxF3P57umzqM9yz795+y1Vjs47Km/Y2FE6ouQ7Lg= -github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5 h1:0KqC6/sLy7fDpBdybhVkkv4Yz+PmB7c9Dz9z3dLW804= -github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= -github.com/mrunalp/fileutils v0.5.0 h1:NKzVxiH7eSk+OQ4M+ZYW1K6h27RUV3MI6NUTsHhU6Z4= -github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= -github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8 h1:P48LjvUQpTReR3TQRbxSeSBsMXzfK0uol7eRcr7VBYQ= github.com/natessilva/dag v0.0.0-20180124060714-7194b8dcc5c4 h1:dnMxwus89s86tI8rcGVp2HwZzlz7c5o92VOy7dSckBQ= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/jwt/v2 v2.2.1-0.20220330180145-442af02fd36a/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats-server/v2 v2.8.4/go.mod h1:8zZa+Al3WsESfmgSs98Fi06dRWLH5Bnq90m5bKD/eT4= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nats.go v1.15.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= -github.com/nats-io/nats.go v1.34.0 h1:fnxnPCNiwIG5w08rlMcEKTUw4AV/nKyGCOJE8TdhSPk= -github.com/nats-io/nats.go v1.34.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= -github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= -github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncw/swift v1.0.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= github.com/ncw/swift v1.0.53/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/ncw/swift/v2 v2.0.2 h1:jx282pcAKFhmoZBSdMcCRFn9VWkoBIRsCpe+yZq7vEk= @@ -1687,300 +768,122 @@ github.com/ncw/swift/v2 v2.0.2/go.mod h1:z0A9RVdYPjNjXVo2pDOPxZ4eu3oarO1P91fTItc github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1 h1:dOYG7LS/WK00RWZc8XGgcUTlTxpp3mKhdR2Q9z9HbXM= github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1/go.mod h1:mpRZBD8SJ55OIICQ3iWH0Yz3cjzA61JdqMLoWXeB2+8= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/oasdiff/yaml v0.0.0-20241210131133-6b86fb107d80/go.mod h1:7tFDb+Y51LcDpn26GccuUgQXUk6t0CXZsivKjyimYX8= -github.com/oasdiff/yaml3 v0.0.0-20241210130736-a94c01f36349/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= -github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= -github.com/onsi/ginkgo/v2 v2.20.1/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI= -github.com/onsi/ginkgo/v2 v2.22.1/go.mod h1:S6aTpoRsSq2cZOd+pssHAlKW/Q/jZt6cPrPlnj4a1xM= -github.com/onsi/ginkgo/v2 v2.23.3/go.mod h1:zXTP6xIp3U8aVuXN8ENK9IXRaTjFnpVB9mGmaSRvxnM= -github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.24.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= -github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc= -github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= -github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/open-feature/go-sdk v1.11.0/go.mod h1:+rkJhLBtYsJ5PZNddAgFILhRAAxwrJ32aU7UEUm4zQI= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.102.0 h1:R70PpK14trQfL/Vj5oAiGRqX09s2gOWuf6t1Ae5fevQ= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.102.0/go.mod h1:xmy/yFFmB1Epy+czrYMbA+4xeOKvhFqNqYWU6qINeis= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.102.0 h1:N3vWsp3xealy4AX8TovfHG5EKi/k7z+F/8LFP4SVAgo= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.102.0/go.mod h1:/Ijok2yF1qYoHuRHvyLS04ZuW91Pue2VkqZ/nZxpkvk= github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.124.1 h1:+aiMrDR6xiaDM7xN4ByrBYI0Craqt68nZicmpYpt0co= github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.124.1/go.mod h1:H/TEWN4jgExt0McrtrBK2VFK6r9LRsWtqhEZrH690rs= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 h1:PNLVcz8kJLE9V5kGnbBh277Bvl4WwiVZ+NbFbOB80WY= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0/go.mod h1:cBbjwd8m4rBVgCQksUbAVQX1EoM5IuCyNQw2mzvibEM= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 h1:qsM5HhWpAfIMg8LdO4u+CHofu4UuCuJwg/M+ySO9uZA= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0/go.mod h1:wBJlGy9Wx6s7AxIMcSne2sGw73e5ZUy1AQ/duYwpFf8= github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.124.1 h1:NrjsoVPxI6lmV8jPImDcMeqYh+97Y71f/HB5Sfpfe3I= github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.124.1/go.mod h1:AFMryJmht7dZxcAwc2sx/r4gxbriElWw49ugxKp2mcA= github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.121.0 h1:I+F6xdXQsiXXdce7yjHN+y4LX5MrZI1kNmhBunJffdA= github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.121.0/go.mod h1:cRh3l2emFBwW96dHnlPLr1psbEYjYJmn5qFujOkbfRo= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.97.0 h1:f3HVDcjUVUbOpKWiebD9v8+9YdDdNvzPyKh3IVb0ORY= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.97.0/go.mod h1:110wLws4lB2Jpv58rK7YoaMIhIEmLlzw5/viC0XJhbM= github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.124.1 h1:2uQmRiQ7EV7s1slz7fEvAVhJIFTyExnj/4unfw0Era8= github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.124.1/go.mod h1:VqJ9CWEwk6N7YzumaV1gbxY0UeLlnzAzYmTw8ieaIYs= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.102.0 h1:xBd9EXG9qvWwa2d7qDRVv/D/2gAQqn1zGbPqdjkd+O8= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.102.0/go.mod h1:e4pc6nkNyzBi5g2RgIRjJ1slRsOY5qHIbPu0E4oM3cE= github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.124.1 h1:hbJs+dkXx3bPshr614bYk6bwvtM9YruaGqhwXWP2UuU= github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.124.1/go.mod h1:oDdNpMFQ6hT0IsGDRHkG5mQ3DLxF6kYvDuoEIcoQbCo= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.102.0 h1:/J1Q2tylp8ID+AIpCmfaArUyCPoSjY3nyZXdkpTw9J8= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.102.0/go.mod h1:lbNQBpvs40lInohZrqAbRZ+8r29GzfMfkbLV4fBPrzE= github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.124.1 h1:QUXMxZTjTER4vDa4ldkSSAd89blgS5974j5AkRLp2M0= github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.124.1/go.mod h1:jRQpw8VJDmUmyH8ONQ5FmhYEXkaxzMFX6Tei8N4GDZs= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.102.0 h1:pVJ792+Nzcv8nLlg18XOLOWEZ/dCK+Wo3Iak5TU8rz8= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.102.0/go.mod h1:DmkGhNL9nuSTg8fMhYNopMuF1Y3LFqu/FQHrvhBzME0= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/core/xidutils v0.124.1 h1:E1e96GTHmiAfIfeYfA5ZVnOxud3+vbisGp0gE1tfd4s= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/core/xidutils v0.124.1/go.mod h1:MOhFATtYSLad9nKunjh6uGf8nQUcWje2LPlhD2uu3do= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.121.0/go.mod h1:MoCMz/TtwE0yYmOL3uJ+VoOxZpt7+obfdLrKNG40deI= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.97.0 h1:bVeo7BahYY4rWdaEuzJX2Tn20MbvYcEHXbFjV2IwnPQ= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.97.0/go.mod h1:lj29zRdEZdvbQvZ6g7Pb+tSPw4dQE/jahe39fRgO+08= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.124.1 h1:oiLa2lg+Ix+wHi4bPsnQ5+DJc6u+OHZt6YhP/rjgbNc= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.124.1/go.mod h1:v8WbCvCAzp8OgxdyXSZlLUkEKJJOLhlOF57kRCVUoAQ= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.121.0/go.mod h1:9ghLP9djsDo5xzmzkADqeJjZb3l92XIRhpAz/ToX2QM= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 h1:TvJYcU/DLRFCgHr7nT98k5D+qkZ4syKVxc8OJjv+K4c= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0/go.mod h1:WzD3Ox7tywAQHknxAFpAC1oZJGItMp5mbvgUGjvzNY8= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.121.0/go.mod h1:swPiDfFHEiy9x2TwNO3uexCkwppLWfPRVoJdpJvKIQE= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.124.1 h1:mMVzpkpy6rKL1Q/xXNogZVtWebIlxTRzhsgp3b9ioCM= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.124.1/go.mod h1:jM8Gsd0fIiwRzWrzd7Gm6PZYi5AgHPRkz0625Rtqyxo= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.102.0 h1:IgLMHSuraJzxLqVeM7xU7aZPcXS5/eoVnX+HBuFGQ6E= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.102.0/go.mod h1:hG8EmxUvgXIiKTG6+UVcMhFeIN6UD/bswP7WYpQ2lCc= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.124.1 h1:kPPjaOlncaJjoaJRUzW3TbqHM4v/+TtxC2Bzpa7z9X4= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.124.1/go.mod h1:+6zqsZ1YGNsl7RUxfjzg7MKEWd5J6QAlq7zM3Nqy8UI= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0 h1:4VQidhCgkJiBvBDMOukr5ixrf5uP66iW5Hb+CFsb+4E= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0/go.mod h1:nMto9zkv0vD8YI3oGZFZS2Uu7k2oHt1d+xUHN/ofUYo= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.124.1 h1:9c6L4xlAMqhOg5y54Bc2B5t0i49yz7v2I6I8RY4Z0/o= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.124.1/go.mod h1:6f0N58o0cOHC0ApSM/qrooVmQza1eQ7L53PDE91uO1Q= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.102.0 h1:Mh5MHf0PrUQMTM2S8HwEuPt3Fyz0Xnt0IG7GUc6Fmbs= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.102.0/go.mod h1:6fc8qnIayeGwAF41LyLR+/FRbyJf4+FikbmaO0GGq/Y= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.124.1 h1:IYxc8uPVCtKlgxjbYFGZ5/wXLdwAH1WQPKRlzaXtr8E= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.124.1/go.mod h1:jFRiSEn2ss3e4CWG6GTDOJMYRI0C/N2XbMMIBzZuqZY= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.102.0 h1:5M7I78lyGsH+Xyy4NoXKM/UUCa52aZQiPcSX6so6x94= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.102.0/go.mod h1:BEQy0zEel5uIOTEFBBmvQJ4A32R6nKLtSMtC6ylLI8k= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.124.1 h1:cyvsrj/D+/XwoXSw/4FD/S1M50jco7k963f/+si907w= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.124.1/go.mod h1:xAU/ievEszZYP1DGWy+yYjAjfjRCKyBLBAnXYvKWNWc= github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.121.0 h1:+wj+Sw08WDdL/9lD4OUy1PFgQMsiyLuSmlmb3HbKPv4= github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.121.0/go.mod h1:YczZl2MmjOUdg5eXg+fAW0my/EG+77b27ue6vj7xPHU= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.97.0 h1:IfJ9EkykXHBYdwuvZd0qfFcCHAAOuTEaiIlTRw6R9g4= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.97.0/go.mod h1:uTs2ukYAG9tCkoUhW39J9bNQAqwpqHhE85eeRVm6zCM= github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.124.1 h1:qkqiqLwfg7hj+oDYvpmMD64p+poaxXwo654ZE44uPm4= github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.124.1/go.mod h1:B/GP3l4Y1qNsNtWVIzpwS8jWB1Nn/vx0sFBlVDkWt9E= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.102.0 h1:HTGSfx2HzfudY1Uczw9yTBJnGBmTVFYzpGH1z+oD0nU= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.102.0/go.mod h1:Hlz24+Ah6Ojk0FUKNb1watRmTbLEru35+feroKA7dvQ= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.124.1 h1:r20zOMMBcxzI2Sni2HyTR7TVxuNXLn1Ov6qtnlVWoJc= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.124.1/go.mod h1:1UsKa4xSNodA2i6ic5mmyd31khXyTGxsVKJoKmq/jtU= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.102.0 h1:2D3niNAKkr+NRVmAJW0bquSjzHUL6Pf1qQRLRPwA13M= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.102.0/go.mod h1:h0uqwH7b+NGDfFFWTjoGErMdYRdCqP1Az1/G+tfG024= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.124.1 h1:Pdlf5D5gB/5Khi3t5PiojQrCulcEejecsxoSpOd0ekA= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.124.1/go.mod h1:pKNXK34B2dV0nEDAFgHtYQHBlZpQlLWcKFZpblY3xQs= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.102.0 h1:dBhFe/29ODIbxg4+JRaHwYAHMFFeh6/+izVtjceXwew= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.102.0/go.mod h1:WNFjuquVqyi+WEoa6L0J3DzPLRsP24ZlbZYwKv49VwY= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.124.1 h1:npAUCN3GM93FCmSZsODhMuNn+v2xDYQTQlgRg/LqBfU= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.124.1/go.mod h1:4+9pSfniXXdRpkKf0QNdElOd7yIWD4ux8D260tSPV54= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.102.0 h1:Pemo9pZa3VMYdrM/bss3f0qqVyBzPSulOBQL8VQcgN8= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.102.0/go.mod h1:fvjAM+jOQdiXCmAENKH/eWxBBqTaImbq3lpoBI4X5Ek= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.124.1 h1:XkxqUEoukMWXF+EpEWeM9itXKt62yKi13Lzd8ZEASP4= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.124.1/go.mod h1:CuCZVPz+yn88b5vhZPAlxaMrVuhAVexUV6f8b07lpUc= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= -github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= -github.com/opencontainers/runc v1.1.2 h1:2VSZwLx5k/BfsBxMMipG/LYUnmqOD/BPkIVgQUcTlLw= -github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= -github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39 h1:H7DMc6FAjgwZZi8BRqjrAAHWoqEr5e5L6pS4V0ezet4= -github.com/opencontainers/selinux v1.10.1 h1:09LIPVRP3uuZGQvgR+SgMSNBd1Eb3vlRbGqQpoHsF8w= -github.com/opencontainers/selinux v1.10.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/openfga/api/proto v0.0.0-20240905181937-3583905f61a6/go.mod h1:gil5LBD8tSdFQbUkCQdnXsoeU9kDJdJgbGdHkgJfcd0= -github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/oschwald/geoip2-golang v1.11.0 h1:hNENhCn1Uyzhf9PTmquXENiWS6AlxAEnBII6r8krA3w= github.com/oschwald/geoip2-golang v1.11.0/go.mod h1:P9zG+54KPEFOliZ29i7SeYZ/GM6tfEL+rgSn03hYuUo= github.com/oschwald/maxminddb-golang v1.13.0 h1:R8xBorY71s84yO06NgTmQvqvTvlS/bnYZrrWX1MElnU= github.com/oschwald/maxminddb-golang v1.13.0/go.mod h1:BU0z8BfFVhi1LQaonTwwGQlsHUEu9pWNdMfmq4ztm0o= -github.com/otiai10/curr v1.0.0 h1:TJIWdbX0B+kpNagQrjgq8bCMrbhiuX73M2XwgtDMoOI= -github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/parquet-go/parquet-go v0.23.0 h1:dyEU5oiHCtbASyItMCD2tXtT2nPmoPbKpqf0+nnGrmk= -github.com/parquet-go/parquet-go v0.23.0/go.mod h1:MnwbUcFHU6uBYMymKAlPPAw9yh3kE1wWl6Gl1uLdkNk= github.com/parquet-go/parquet-go v0.25.1-0.20250428214007-401fed3de956 h1:EqOiLPZlZ3UfC9d51fuYWP13FxwSzUCTArR0wg1LlxM= github.com/parquet-go/parquet-go v0.25.1-0.20250428214007-401fed3de956/go.mod h1:OqBBRGBl7+llplCvDMql8dEKaDqjaFA/VAPw+OJiNiw= github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU= github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= -github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30 h1:BHT1/DKsYDGkUgQ2jmMaozVcdk+sVfz0+1ZJq4zkWgw= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= -github.com/petar/GoLLRB v0.0.0-20130427215148-53be0d36a84c h1:AwcgVYzW1T+QuJ2fc55ceOSCiVaOpdYUNpFj9t7+n9U= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= github.com/phpdave11/gofpdf v1.4.2 h1:KPKiIbfwbvC/wOncwhrpRdXVj2CZTCFlw4wnoyjtHfQ= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= -github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo= -github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= github.com/pkg/sftp v1.13.7 h1:uv+I3nNJvlKZIQGSr8JVQLNHFU9YhhNpvC14Y6KgmSM= github.com/pkg/sftp v1.13.7/go.mod h1:KMKI0t3T6hfA+lTR/ssZdunHo+uwq7ghoN09/FSu3DY= github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= -github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c h1:NRoLoZvkBTKvR5gQLgA3e0hqjkY9u1wm+iOL45VN/qI= -github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= -github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= -github.com/prometheus/client_golang v1.21.0-rc.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= -github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= -github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common/assets v0.2.0 h1:0P5OrzoHrYBOSM1OigWL3mY8ZvV2N4zIE/5AahrSrfM= -github.com/prometheus/exporter-toolkit v0.10.1-0.20230714054209-2f4150c63f97/go.mod h1:LoBCZeRh+5hX+fSULNyFnagYlQG/gBsyA/deNzROkq8= -github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/statsd_exporter v0.26.0 h1:SQl3M6suC6NWQYEzOvIv+EF6dAMYEqIuZy+o4H9F5Ig= -github.com/prometheus/statsd_exporter v0.26.0/go.mod h1:GXFLADOmBTVDrHc7b04nX8ooq3azG61pnECNqT7O5DM= github.com/prometheus/statsd_exporter v0.26.1 h1:ucbIAdPmwAUcA+dU+Opok8Qt81Aw8HanlO+2N/Wjv7w= github.com/prometheus/statsd_exporter v0.26.1/go.mod h1:XlDdjAmRmx3JVvPPYuFNUg+Ynyb5kR69iPPkQjxXFMk= -github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= -github.com/pterm/pterm v0.12.27/go.mod h1:PhQ89w4i95rhgE+xedAoqous6K9X+r6aSOI2eFF7DZI= -github.com/pterm/pterm v0.12.29/go.mod h1:WI3qxgvoQFFGKGjGnJR849gU0TsEOvKn5Q8LlY1U7lg= -github.com/pterm/pterm v0.12.30/go.mod h1:MOqLIyMOgmTDz9yorcYbcw+HsgoZo3BQfg2wtl3HEFE= -github.com/pterm/pterm v0.12.31/go.mod h1:32ZAWZVXD7ZfG0s8qqHXePte42kdz8ECtRyEejaWgXU= -github.com/pterm/pterm v0.12.33/go.mod h1:x+h2uL+n7CP/rel9+bImHD5lF3nM9vJj80k9ybiiTTE= -github.com/pterm/pterm v0.12.36/go.mod h1:NjiL09hFhT/vWjQHSj1athJpx6H8cjpHXNAK5bUw8T8= -github.com/pterm/pterm v0.12.40/go.mod h1:ffwPLwlbXxP+rxT0GsgDTzS3y3rmpAO1NMjUkGTYf8s= github.com/pterm/pterm v0.12.80 h1:mM55B+GnKUnLMUSqhdINe4s6tOuVQIetQ3my8JGyAIg= github.com/pterm/pterm v0.12.80/go.mod h1:c6DeF9bSnOSeFPZlfs4ZRAFcf5SCoTwvwQ5xaKGQlHo= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71 h1:CNooiryw5aisadVfzneSZPswRWvnVW8hF1bS/vo8ReI= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/rabbitmq/amqp091-go v1.2.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM= github.com/rabbitmq/amqp091-go v1.9.0 h1:qrQtyzB4H8BQgEuJwhmVQqVHB9O4+MNDJCCAcpc3Aoo= github.com/rabbitmq/amqp091-go v1.9.0/go.mod h1:+jPrT9iY2eLjRaMSRHUhc3z14E/l85kv/f+6luSD3pc= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/redis/rueidis v1.0.57 h1:eI9GDwEMjJcTMzFkiCFPZa/nJYYKgbfNBnpT7A6Wm2E= -github.com/redis/rueidis v1.0.57/go.mod h1:g660/008FMYmAF46HG4lmcpcgFNj+jCjCAZUUM+wEbs= -github.com/relvacode/iso8601 v1.4.0 h1:GsInVSEJfkYuirYFxa80nMLbH2aydgZpIf52gYZXUJs= -github.com/relvacode/iso8601 v1.4.0/go.mod h1:FlNp+jz+TXpyRqgmM7tnzHHzBnz776kmAH2h3sZCn0I= github.com/relvacode/iso8601 v1.6.0 h1:eFXUhMJN3Gz8Rcq82f9DTMW0svjtAVuIEULglM7QHTU= github.com/relvacode/iso8601 v1.6.0/go.mod h1:FlNp+jz+TXpyRqgmM7tnzHHzBnz776kmAH2h3sZCn0I= github.com/richardartoul/molecule v1.0.0 h1:+LFA9cT7fn8KF39zy4dhOnwcOwRoqKiBkPqKqya+8+U= github.com/richardartoul/molecule v1.0.0/go.mod h1:uvX/8buq8uVeiZiFht+0lqSLBHF+uGV8BrTv8W/SIwk= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245 h1:K1Xf3bKttbF+koVGaX5xngRIZ5bVjbmPnaxE/dR08uY= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.2+incompatible h1:C89EOx/XBWwIXl8wm8OPJBd7kPF25UfsK2X7Ph/zCAk= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8 h1:2c1EFnZHIPCW8qKWgHMH/fX2PkSabFc5mrVzfUNdg5U= github.com/sagikazarmark/crypt v0.6.0 h1:REOEXCs/NFY/1jOCEouMuT4zEniE5YoXbvpC5X/TLF8= -github.com/sagikazarmark/crypt v0.19.0 h1:WMyLTjHBo64UvNcWqpzY3pbZTYgnemZU8FBZigKc42E= -github.com/sagikazarmark/crypt v0.19.0/go.mod h1:c6vimRziqqERhtSe0MhIvzE1w54FrCHtrXb5NH/ja78= -github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= -github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/samuel/go-zookeeper v0.0.0-20190810000440-0ceca61e4d75 h1:cA+Ubq9qEVIQhIWvP2kNuSZ2CmnfBJFSRq+kO1pu2cc= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/schollz/progressbar/v3 v3.14.6 h1:GyjwcWBAf+GFDMLziwerKvpuS7ZF+mNTAXIB2aspiZs= github.com/schollz/progressbar/v3 v3.14.6/go.mod h1:Nrzpuw3Nl0srLY0VlTvC4V6RL50pcEymjy6qyJAaLa0= -github.com/seccomp/libseccomp-golang v0.9.1 h1:NJjM5DNFOs0s3kYE1WUOr6G8V97sdt46rlXTMfXGWBo= github.com/segmentio/fasthash v1.0.3 h1:EI9+KE1EwvMLBWwjpRDc+fEM+prwxDYbslddQGtrmhM= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= github.com/sercand/kuberesolver/v5 v5.1.1 h1:CYH+d67G0sGBj7q5wLK61yzqJJ8gLLC8aeprPTHb6yY= github.com/sercand/kuberesolver/v5 v5.1.1/go.mod h1:Fs1KbKhVRnB2aDWN12NjKCB+RgYMWZJ294T3BtmVCpQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= -github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= -github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= -github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= -github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= -github.com/shirou/gopsutil/v4 v4.24.0-alpha.1 h1:lLPAdP4TpfgJ5byoc3EFwNSKZj8kCnDFHtuWTktWl0s= -github.com/shirou/gopsutil/v4 v4.24.0-alpha.1/go.mod h1:GVpYUxBee6CTWux2/JslZ7fYPwqkQ8YDJSXmGAryYy4= -github.com/shirou/gopsutil/v4 v4.25.2 h1:NMscG3l2CqtWFS86kj3vP7soOczqrQYIEhO/pMvvQkk= -github.com/shirou/gopsutil/v4 v4.25.2/go.mod h1:34gBYJzyqCDT11b6bMHP0XCvWeU3J61XRT7a2EmCRTA= github.com/shirou/gopsutil/v4 v4.25.3 h1:SeA68lsu8gLggyMbmCn8cmp97V1TI9ld9sVzAUcKcKE= github.com/shirou/gopsutil/v4 v4.25.3/go.mod h1:xbuxyoZj+UsgnZrENu3lQivsngRR5BdjbJwf2fv4szA= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= -github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e h1:MZM7FHLqUHYI0Y/mQAt3d2aYa0SiNms/hFqC9qJYolM= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo4+G/HV/uQUqEI1HMDjCeOf2V6puPc= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad h1:fiWzISvDn0Csy5H0iwgAuJGQTUpVfEMJJd4nRFXogbc= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980 h1:lIOOHPEbXzO3vnmx2gok1Tfs31Q8GQqKLc8vVqyQq/I= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stoewer/parquet-cli v0.0.7 h1:rhdZODIbyMS3twr4OM3am8BPPT5pbfMcHLH93whDM5o= -github.com/stoewer/parquet-cli v0.0.7/go.mod h1:bskxHdj8q3H1EmfuCqjViFoeO3NEvs5lzZAQvI8Nfjk= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/substrait-io/substrait v0.57.1 h1:GW8nnYfSowMseHR8Os82/X6lNtQGIK7p4p+lr6r+auw= -github.com/substrait-io/substrait v0.57.1/go.mod h1:q9s+tjo+gK0lsA+SqYB0lhojNuxvdPdfYlGUP0hjbrA= github.com/substrait-io/substrait v0.66.1-0.20250205013839-a30b3e2d7ec6 h1:XqtxwYFCjS4L0o1QD4ipGHCuFG94U0f6BeldbilGQjU= github.com/substrait-io/substrait v0.66.1-0.20250205013839-a30b3e2d7ec6/go.mod h1:MPFNw6sToJgpD5Z2rj0rQrdP/Oq8HG7Z2t3CAEHtkHw= -github.com/substrait-io/substrait-go v1.2.0 h1:3ZNRkc8FYD7ifCagKEOZQtUcgMceMQfwo2N1NGaK4Q4= -github.com/substrait-io/substrait-go v1.2.0/go.mod h1:IPsy24rdjp/buXR+T8ENl6QCnSCS6h+uM8P+GaZez7c= -github.com/substrait-io/substrait-go/v3 v3.9.0 h1:sRJf0ID9q2TPxJ9eH+oAniepMqt9fYW0Hy32CScT2cI= -github.com/substrait-io/substrait-go/v3 v3.9.0/go.mod h1:VG7jCqtUm28bSngHwq86FywtU74knJ25LNX63SZ53+E= github.com/substrait-io/substrait-go/v3 v3.9.1 h1:2yfHDHpK6KMcvLd0bJVzUJoeXO+K98yS+ciBruxD9po= github.com/substrait-io/substrait-go/v3 v3.9.1/go.mod h1:VG7jCqtUm28bSngHwq86FywtU74knJ25LNX63SZ53+E= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= -github.com/tchap/go-patricia v2.2.6+incompatible h1:JvoDL7JSoIP2HDE8AbDH3zC8QBPxmzYe32HHy5yQ+Ck= github.com/tdewolff/minify/v2 v2.12.8 h1:Q2BqOTmlMjoutkuD/OPCnJUpIqrzT3nRPkw+q+KpXS0= github.com/tdewolff/minify/v2 v2.12.8/go.mod h1:YRgk7CC21LZnbuke2fmYnCTq+zhCgpb0yJACOTUNJ1E= github.com/tdewolff/parse/v2 v2.6.7 h1:WrFllrqmzAcrKHzoYgMupqgUBIfBVOb0yscFzDf8bBg= github.com/tdewolff/parse/v2 v2.6.7/go.mod h1:XHDhaU6IBgsryfdnpzUXBlT6leW/l25yrFBTEb4eIyM= github.com/testcontainers/testcontainers-go v0.35.0 h1:uADsZpTKFAtp8SLK+hMwSaa+X+JiERHtd4sQAFmXeMo= github.com/testcontainers/testcontainers-go v0.35.0/go.mod h1:oEVBj5zrfJTrgjwONs1SsRbnBtH9OKl+IGl3UMcr2B4= -github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -1991,61 +894,36 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/trivago/tgo v1.0.7 h1:uaWH/XIy9aWYWpjm2CU3RpcqZXmX2ysQ9/Go+d9gyrM= github.com/tursodatabase/libsql-client-go v0.0.0-20240902231107-85af5b9d094d h1:dOMI4+zEbDI37KGb0TI44GUAwxHF9cMsIoDTJ7UmgfU= github.com/tursodatabase/libsql-client-go v0.0.0-20240902231107-85af5b9d094d/go.mod h1:l8xTsYB90uaVdMHXMCxKKLSgw5wLYBwBKKefNIUnm9s= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/twmb/franz-go v1.17.1 h1:0LwPsbbJeJ9R91DPUHSEd4su82WJWcTY1Zzbgbg4CeQ= -github.com/twmb/franz-go v1.17.1/go.mod h1:NreRdJ2F7dziDY/m6VyspWd6sNxHKXdMZI42UfQ3GXM= github.com/twmb/franz-go v1.18.1 h1:D75xxCDyvTqBSiImFx2lkPduE39jz1vaD7+FNc+vMkc= github.com/twmb/franz-go v1.18.1/go.mod h1:Uzo77TarcLTUZeLuGq+9lNpSkfZI+JErv7YJhlDjs9M= github.com/twmb/franz-go/pkg/kadm v1.16.0 h1:STMs1t5lYR5mR974PSiwNzE5TvsosByTp+rKXLOhAjE= github.com/twmb/franz-go/pkg/kadm v1.16.0/go.mod h1:MUdcUtnf9ph4SFBLLA/XxE29rvLhWYLM9Ygb8dfSCvw= github.com/twmb/franz-go/pkg/kfake v0.0.0-20250320172111-35ab5e5f5327 h1:E2rCVOpwEnB6F0cUpwPNyzfRYfHee0IfHbUVSB5rH6I= github.com/twmb/franz-go/pkg/kfake v0.0.0-20250320172111-35ab5e5f5327/go.mod h1:zCgWGv7Rg9B70WV6T+tUbifRJnx60gGTFU/U4xZpyUA= -github.com/twmb/franz-go/pkg/kmsg v1.8.0 h1:lAQB9Z3aMrIP9qF9288XcFf/ccaSxEitNA1CDTEIeTA= -github.com/twmb/franz-go/pkg/kmsg v1.8.0/go.mod h1:HzYEb8G3uu5XevZbtU0dVbkphaKTHk0X68N5ka4q6mU= github.com/twmb/franz-go/pkg/kmsg v1.11.2 h1:hIw75FpwcAjgeyfIGFqivAvwC5uNIOWRGvQgZhH4mhg= github.com/twmb/franz-go/pkg/kmsg v1.11.2/go.mod h1:CFfkkLysDNmukPYhGzuUcDtf46gQSqCZHMW1T4Z+wDE= github.com/twmb/franz-go/plugin/kotel v1.6.0 h1:hmvLn/cVw/Hn56H3aJVJu/a/fh6m8J6Ajwp0IcEHbH8= github.com/twmb/franz-go/plugin/kotel v1.6.0/go.mod h1:ADmLuCa/NzHdXdWfl22FsIlGCack+YrHjivirHCBJaY= -github.com/twmb/franz-go/plugin/kprom v1.1.0 h1:grGeIJbm4llUBF8jkDjTb/b8rKllWSXjMwIqeCCcNYQ= -github.com/twmb/franz-go/plugin/kprom v1.1.0/go.mod h1:cTDrPMSkyrO99LyGx3AtiwF9W6+THHjZrkDE2+TEBIU= github.com/twmb/franz-go/plugin/kprom v1.2.1 h1:FGWdneW9htySYmvJ5tEuAIZepjFOuTFhHLy5TrVR+QI= github.com/twmb/franz-go/plugin/kprom v1.2.1/go.mod h1:+dzpKnVE6By8BDRFj240dTDJS9bP2dngmuhv7egJ3Go= github.com/twmb/murmur3 v1.1.8 h1:8Yt9taO/WN3l08xErzjeschgZU2QSrwm1kclYq+0aRg= github.com/twmb/murmur3 v1.1.8/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= github.com/uber-go/atomic v1.4.0 h1:yOuPqEq4ovnhEjpHmfFwsqBXDYbQeT6Nb0bwD6XnD5o= github.com/uber-go/atomic v1.4.0/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= -github.com/uber/jaeger-client-go v2.28.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/quicktemplate v1.8.0 h1:zU0tjbIqTRgKQzFY1L42zq0qR3eh4WoQQdIdqCysW5k= -github.com/valyala/quicktemplate v1.8.0/go.mod h1:qIqW8/igXt8fdrUln5kOSb+KWMaJ4Y8QUsfd1k6L2jM= -github.com/vburenin/ifacemaker v1.2.1/go.mod h1:5WqrzX2aD7/hi+okBjcaEQJMg4lDGrpuEX3B8L4Wgrs= -github.com/vektah/gqlparser/v2 v2.5.26 h1:REqqFkO8+SOEgZHR/eHScjjVjGS8Nk3RMO/juiTobN4= -github.com/vektah/gqlparser/v2 v2.5.26/go.mod h1:D1/VCZtV3LPnQrcPBeR/q5jkSQIPti0uYCP/RI0gIeo= github.com/vertica/vertica-sql-go v1.3.3 h1:fL+FKEAEy5ONmsvya2WH5T8bhkvY27y/Ik3ReR2T+Qw= github.com/vertica/vertica-sql-go v1.3.3/go.mod h1:jnn2GFuv+O2Jcjktb7zyc4Utlbu9YVqpHH/lx63+1M4= -github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5 h1:+UB2BJA852UkGH42H+Oee69djmxS3ANzl2b/JtT1YiA= -github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= -github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= @@ -2056,9 +934,7 @@ github.com/willf/bloom v2.0.3+incompatible h1:QDacWdqcAUI1MPOwIQZRy9kOR7yxfyEmxX github.com/willf/bloom v2.0.3+incompatible/go.mod h1:MmAltL9pDMNTrvUkxdg0k0q5I0suxmuwp3KbyrZLOZ8= github.com/xanzy/go-gitlab v0.15.0 h1:rWtwKTgEnXyNUGrOArN7yyc3THRkpYcKXIXia9abywQ= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= -github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= -github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk= github.com/xdg/stringprep v1.0.0 h1:d9X0esnoa3dFsV0FG35rAT0RIhYFlPq7MiP+DW89La0= @@ -2070,29 +946,18 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17 github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xhit/go-str2duration v1.2.0 h1:BcV5u025cITWxEQKGWr1URRzrcXtu7uk8+luz3Yuhwc= github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= -github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= github.com/ydb-platform/ydb-go-genproto v0.0.0-20241112172322-ea1f63298f77 h1:LY6cI8cP4B9rrpTleZk95+08kl2gF4rixG7+V/dwL6Q= github.com/ydb-platform/ydb-go-genproto v0.0.0-20241112172322-ea1f63298f77/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I= -github.com/ydb-platform/ydb-go-sdk/v3 v3.95.3 h1:pgsQPKSFfRFy3JSZMUReCF4CSEwgxA+a5GymvtyRJO0= -github.com/ydb-platform/ydb-go-sdk/v3 v3.95.3/go.mod h1:WiezFS4YCi2vHqbYGQkeu/2MDBYFLix6dIs/pd87Yck= -github.com/ydb-platform/ydb-go-sdk/v3 v3.104.7 h1:d05IBvxm7X+5xo6tdZ/vHdgJF6MV+cFBEtsAGo19CjE= -github.com/ydb-platform/ydb-go-sdk/v3 v3.104.7/go.mod h1:l5sSv153E18VvYcsmr51hok9Sjc16tEC8AXGbwrk+ho= github.com/ydb-platform/ydb-go-sdk/v3 v3.108.1 h1:ixAiqjj2S/dNuJqrz4AxSqgw2P5OBMXp68hB5nNriUk= github.com/ydb-platform/ydb-go-sdk/v3 v3.108.1/go.mod h1:l5sSv153E18VvYcsmr51hok9Sjc16tEC8AXGbwrk+ho= github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= -github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b h1:FosyBZYxY34Wul7O/MSKey3txpPYyCqVO5ZyceuQJEI= github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= github.com/zenazn/goji v1.0.1 h1:4lbD8Mx2h7IvloP7r2C0D6ltZP6Ufip8Hn0wmSK5LR8= @@ -2100,119 +965,46 @@ github.com/zenazn/goji v1.0.1/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxt github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b h1:7gd+rd8P3bqcn/96gOZa3F5dpJr/vEiDQYlNb/y2uNs= -go.einride.tech/aip v0.68.0 h1:4seM66oLzTpz50u4K1zlJyOXQ3tCzcJN7I22tKkjipw= -go.einride.tech/aip v0.68.0/go.mod h1:7y9FF8VtPWqpxuAxl0KQWqaULxW4zFIesD6zF5RIHHg= -go.einride.tech/aip v0.68.1 h1:16/AfSxcQISGN5z9C5lM+0mLYXihrHbQ1onvYTr93aQ= -go.einride.tech/aip v0.68.1/go.mod h1:XaFtaj4HuA3Zwk9xoBtTWgNubZ0ZZXv9BZJCkuKuWbg= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= -go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738 h1:VcrIfasaLFkyjk6KNlXQSzO+B0fZcnECiDrKJsfxka0= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 h1:1JFLBqwIgdyHN1ZtgjTBwO+blA6gVOmZurpiMEsETKo= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.12/go.mod h1:Ot+o0SWSyT6uHhA56al1oCED0JImsRiU9Dc26+C2a+4= -go.etcd.io/etcd/api/v3 v3.5.16/go.mod h1:1P4SlIP/VwkDmGo3OlOD7faPeP8KDIFhqvciH5EfN28= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.12/go.mod h1:seTzl2d9APP8R5Y2hFL3NVlD6qC/dOT+3kvrqPyTas4= -go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiDSobSoaBAM0E= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v2 v2.305.12/go.mod h1:aQ/yhsxMu+Oht1FOupSr60oBvcS9cKXHrzBpDsPTf9E= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.12/go.mod h1:tSbBCakoWmmddL+BKVAJHa9km+O/E+bumDe9mSbPiqw= -go.etcd.io/etcd/client/v3 v3.5.16/go.mod h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50= -go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= -go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= go.etcd.io/gofail v0.2.0 h1:p19drv16FKK345a09a1iubchlw/vmRuksmRzgBIGjcA= go.etcd.io/gofail v0.2.0/go.mod h1:nL3ILMGfkXTekKI3clMBNazKnjUZjYLKmBHzsVAnC1o= -go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= -go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 h1:A/5uWzF44DlIgdm/PQFwfMkW0JX+cIcQi/SwLAmZP5M= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opentelemetry.io/collector v0.102.1 h1:M/ciCcReQsSDYG9bJ2Qwqk7pQILDJ2bM/l0MdeCAvJE= -go.opentelemetry.io/collector v0.102.1/go.mod h1:yF1lDRgL/Eksb4/LUnkMjvLvHHpi6wqBVlzp+dACnPM= go.opentelemetry.io/collector v0.124.0 h1:g/dfdGFhBcQI0ggGxTmGlJnJ6Yl6T2gVxQoIj4UfXCc= go.opentelemetry.io/collector v0.124.0/go.mod h1:QzERYfmHUedawjr8Ph/CBEEkVqWS8IlxRLAZt+KHlCg= go.opentelemetry.io/collector/client v1.30.0 h1:QbvOrvwUGcnVjnIBn2zyLLubisOjgh7kMgkzDAiYpHg= go.opentelemetry.io/collector/client v1.30.0/go.mod h1:msXhZlNdAra2fZiyeT0o/xj43Kl1yvF9zYW0r+FhGUI= -go.opentelemetry.io/collector/component v0.102.1 h1:66z+LN5dVCXhvuVKD1b56/3cYLK+mtYSLIwlskYA9IQ= -go.opentelemetry.io/collector/component v0.102.1/go.mod h1:XfkiSeImKYaewT2DavA80l0VZ3JjvGndZ8ayPXfp8d0= -go.opentelemetry.io/collector/component v1.27.0/go.mod h1:fIyBHoa7vDyZL3Pcidgy45cx24tBe7iHWne097blGgo= go.opentelemetry.io/collector/component v1.30.0 h1:HXjqBHaQ47/EEuWdnkjr4Y3kRWvmyWIDvqa1Q262Fls= go.opentelemetry.io/collector/component v1.30.0/go.mod h1:vfM9kN+BM6oHBXWibquiprz8CVawxd4/aYy3nbhme3E= go.opentelemetry.io/collector/component/componentstatus v0.124.0 h1:0WHaANNktxLIk+lN+CtgPBESI1MJBrfVW/LvNCbnMQ4= go.opentelemetry.io/collector/component/componentstatus v0.124.0/go.mod h1:a/wa8nxJGWOGuLwCN8gHCzFHCaUVZ+VyUYuKz9Yaq38= go.opentelemetry.io/collector/component/componenttest v0.124.0 h1:Wsc+DmDrWTFs/aEyjDA3slNwV+h/0NOyIR5Aywvr6Zw= go.opentelemetry.io/collector/component/componenttest v0.124.0/go.mod h1:NQ4ATOzMFc7QA06B993tq8o27DR0cu/JR/zK7slGJ3E= -go.opentelemetry.io/collector/config/configauth v0.102.1 h1:LuzijaZulMu4xmAUG8WA00ZKDlampH+ERjxclb40Q9g= -go.opentelemetry.io/collector/config/configauth v0.102.1/go.mod h1:kTzfI5fnbMJpm2wycVtQeWxFAtb7ns4HksSb66NIhX8= go.opentelemetry.io/collector/config/configauth v0.124.0 h1:Qcu800axWnpX0xRfW+9Jyos9+GTR6m7gTIF1udEihEo= go.opentelemetry.io/collector/config/configauth v0.124.0/go.mod h1:Hz5PQnTvNk2yFp50rzf85H3k0MkdwEBdYUxhpRZn75E= -go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= -go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= go.opentelemetry.io/collector/config/configcompression v1.30.0 h1:NKbywIEfL2PBiKnm9F2X2tbPNO0WzOQY08yWmndI3uM= go.opentelemetry.io/collector/config/configcompression v1.30.0/go.mod h1:QwbNpaOl6Me+wd0EdFuEJg0Cc+WR42HNjJtdq4TwE6w= -go.opentelemetry.io/collector/config/configgrpc v0.102.1 h1:6Plnfx+xw/JH8k11MkljGoysPfn1u7hHbO2evteOTeE= -go.opentelemetry.io/collector/config/configgrpc v0.102.1/go.mod h1:Kk3XOSar3QTzGDS8N8M38DVlOzUD7STS2obczO9q43I= go.opentelemetry.io/collector/config/configgrpc v0.124.0 h1:aTuHYsyLMaGnd0o39Qy9KL1hZh2X8A1AlNR0YpB8vr0= go.opentelemetry.io/collector/config/configgrpc v0.124.0/go.mod h1:EEC4T+hCfXbbC+711GaVFuJNBU7hdYR4Vya4RWu7xc0= -go.opentelemetry.io/collector/config/confighttp v0.102.1 h1:tPw1Xf2PfDdrXoBKLY5Sd4Dh8FNm5i+6DKuky9XraIM= -go.opentelemetry.io/collector/config/confighttp v0.102.1/go.mod h1:k4qscfjxuaDQmcAzioxmPujui9VSgW6oal3WLxp9CzI= go.opentelemetry.io/collector/config/confighttp v0.124.0 h1:W75DaPeLUuGbJtX3cTXOK0b53S5zrUsh6g5UfB6Wzsw= go.opentelemetry.io/collector/config/confighttp v0.124.0/go.mod h1:hiTu8HFgnzSitrogLz1urQn/+FzNzarqYk4BICy/ABs= -go.opentelemetry.io/collector/config/confignet v0.102.1 h1:nSiAFQMzNCO4sDBztUxY73qFw4Vh0hVePq8+3wXUHtU= -go.opentelemetry.io/collector/config/confignet v0.102.1/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= go.opentelemetry.io/collector/config/confignet v1.30.0 h1:2axBhT7xKpCUFgU6KokrDnG9cjtw7gXlACP1uVCUK0s= go.opentelemetry.io/collector/config/confignet v1.30.0/go.mod h1:HgpLwdRLzPTwbjpUXR0Wdt6pAHuYzaIr8t4yECKrEvo= -go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= -go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= go.opentelemetry.io/collector/config/configopaque v1.30.0 h1:vR2UxmzLwmkmQwyh16w8MyLODKdpNVKh0L3JFOZKzQ8= go.opentelemetry.io/collector/config/configopaque v1.30.0/go.mod h1:GYQiC8IejBcwE8z0O4DwbBR/Hf6U7d8DTf+cszyqwFs= -go.opentelemetry.io/collector/config/configretry v0.102.1 h1:J5/tXBL8P7d7HT5dxsp2H+//SkwDXR66Z9UTgRgtAzk= -go.opentelemetry.io/collector/config/configretry v0.102.1/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= go.opentelemetry.io/collector/config/configretry v1.30.0 h1:sapni1tymwNiuI0PjqlRR5CvYxIQYT8tyjQGVJDkVPM= go.opentelemetry.io/collector/config/configretry v1.30.0/go.mod h1:QNnb+MCk7aS1k2EuGJMtlNCltzD7b8uC7Xel0Dxm1wQ= -go.opentelemetry.io/collector/config/configtelemetry v0.102.1 h1:f/CYcrOkaHd+COIJ2lWnEgBCHfhEycpbow4ZhrGwAlA= -go.opentelemetry.io/collector/config/configtelemetry v0.102.1/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= go.opentelemetry.io/collector/config/configtelemetry v0.124.0 h1:KIg5wlHKp8nI5g/hAWZug9fE5MlPZwkRP2ZHOi4I6FU= go.opentelemetry.io/collector/config/configtelemetry v0.124.0/go.mod h1:WXmlNatI0vwjv7whh/qF1Xy+UufCZDk7VLtYqML7QmA= -go.opentelemetry.io/collector/config/configtls v0.102.1 h1:7fr+PU9BRg0HRc1Pn3WmDW/4WBHRjuo7o1CdG2vQKoA= -go.opentelemetry.io/collector/config/configtls v0.102.1/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= go.opentelemetry.io/collector/config/configtls v1.30.0 h1:wLTRV5hn/FWKWNjZ/9/ckkeD2mqWzAtwzP1kQv1YZZE= go.opentelemetry.io/collector/config/configtls v1.30.0/go.mod h1:yCM4ZYkLvc1VjpT/1DQIVoGmzEBHOhZltYQ7A30BMyM= -go.opentelemetry.io/collector/config/internal v0.102.1 h1:HFsFD3xpHUuNHb8/UTz5crJw1cMHzsJQf/86sgD44hw= -go.opentelemetry.io/collector/config/internal v0.102.1/go.mod h1:Vig3dfeJJnuRe1kBNpszBzPoj5eYnR51wXbeq36Zfpg= -go.opentelemetry.io/collector/confmap v0.102.1 h1:wZuH+d/P11Suz8wbp+xQCJ0BPE9m5pybtUe74c+rU7E= -go.opentelemetry.io/collector/confmap v0.102.1/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= -go.opentelemetry.io/collector/confmap v1.27.0/go.mod h1:tmOa6iw3FJsEgfBHKALqvcdfRtf71JZGor0wSM5MoH8= go.opentelemetry.io/collector/confmap v1.30.0 h1:Y0MXhjQCdMyJN9xZMWWdNPWs6ncMVf7YVnyAEN2dAcM= go.opentelemetry.io/collector/confmap v1.30.0/go.mod h1:9DdThVDIC3VsdtTb7DgT+HwusWOocoqDkd/TErEtQgA= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.1 h1:s0RxnaABoRxtfvUeimZ0OOsF83wD/EK1tR2N5GZyst0= -go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.1/go.mod h1:ZwSMlOSIzmrrSSVNoMPDr21SQx7E52bZFMQJSOZ+EhY= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.1 h1:4KLw0pTChIqDfw0ckZ411aQDw98pu2dDOqgBHXfJm8M= -go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.1/go.mod h1:f+IJBW0Sc96T79qj3GQtE1wQ0uWEwpslD785efKBl+c= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.1 h1:nPhOtUbJHfTDqZqtvU76HmEz9iV4O/4/DSCZdnm0mpY= -go.opentelemetry.io/collector/confmap/provider/fileprovider v0.102.1/go.mod h1:eJnr6YDQiocmoRBvsKj33bIc4wysq5hy/jmOApv1dSM= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.1 h1:VsaGXqEUFost0mf2svhds6loYzPavkyY37nMQcqoTkc= -go.opentelemetry.io/collector/confmap/provider/httpprovider v0.102.1/go.mod h1:lQocxKI32Zj1F3PR9UZfzykq50/mOI1mbyZ0729dphI= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.1 h1:rEhPTqkGAezaFxJ8y/BL5m4vKTK3ZSpn+VcVLKnZo7Q= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.1/go.mod h1:GxUZM23m3u4vURw/At2zEKW+5GwcuCNsHJNT/Wq/cFI= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.1 h1:qmdaBIz0UnUKVitZzq+4HtO9zvRTwgNc/Q3b7kyf1NQ= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.1/go.mod h1:nAckG/FkzAaPuwtEN2Na2+ij+2hdTjtXUtFBnlUqpFk= -go.opentelemetry.io/collector/confmap/xconfmap v0.121.0/go.mod h1:YI1Sp8mbYro/H3rqH4csTq68VUuie5WVb7LI1o5+tVc= go.opentelemetry.io/collector/confmap/xconfmap v0.124.0 h1:PK+CaSgjLvzHaafBieJ3AjiUTAPuf40C+/Fn38LvmW8= go.opentelemetry.io/collector/confmap/xconfmap v0.124.0/go.mod h1:DZmFSgWiqXQrzld9uU+73YAVI5JRIgd8RkK5HcaXGU0= -go.opentelemetry.io/collector/connector v0.102.1 h1:7lEwXmhzqtyZwz2bBUHzwV/CZqA8bhPPVJOi0cm9+Fk= -go.opentelemetry.io/collector/connector v0.102.1/go.mod h1:DRlDYJXsFx1FKKxkdM2Ja52/xe+0bgmy0hA+wgKRUVI= go.opentelemetry.io/collector/connector v0.124.0 h1:/Wk8A4gOqjhE+WvKCMqCFhzUIvSi3sdN3RGvopjD6SY= go.opentelemetry.io/collector/connector v0.124.0/go.mod h1:dnYcXgUZp8ZmT7nbBPf38+mP2DD3T47m9jyGbdaCEXc= go.opentelemetry.io/collector/connector/connectortest v0.124.0 h1:gAD2jt7Th6DD8tDTU72Sv2xXvqJEGSjfncr9nTSVCg8= go.opentelemetry.io/collector/connector/connectortest v0.124.0/go.mod h1:0017vT2aCY1NmYXEepxvEfMA9YufKUoBM3/qtD6k9UM= go.opentelemetry.io/collector/connector/xconnector v0.124.0 h1:rdjwSfajHjJVRznw/NKGGzY0PKBTKBypZngGxOaJuEg= go.opentelemetry.io/collector/connector/xconnector v0.124.0/go.mod h1:rOhdUXPzTZbJ2L8VV43r7Rz/ZBfgWxQ+RI9mcqlzz5g= -go.opentelemetry.io/collector/consumer v0.102.1 h1:0CkgHhxwx4lI/m+hWjh607xyjooW5CObZ8hFQy5vvo0= -go.opentelemetry.io/collector/consumer v0.102.1/go.mod h1:HoXqmrRV13jLnP3/Gg3fYNdRkDPoO7UW58hKiLyFF60= -go.opentelemetry.io/collector/consumer v1.27.0/go.mod h1:1B/+kTDUI6u3mCIOAkm5ityIpv5uC0Ll78IA50SNZ24= go.opentelemetry.io/collector/consumer v1.30.0 h1:Nn6kFTH+EJbv13E0W+sNvWrTgbiFCRv8f6DaA2F1DQs= go.opentelemetry.io/collector/consumer v1.30.0/go.mod h1:edRyfk61ugdhCQ93PBLRZfYMVWjdMPpKP8z5QLyESf0= go.opentelemetry.io/collector/consumer/consumererror v0.124.0 h1:OmeJex0C8jcwyILG+eJIGDe6rGaR15fip+Rj3XyMTRY= @@ -2223,28 +1015,20 @@ go.opentelemetry.io/collector/consumer/consumertest v0.124.0 h1:2arChG4RPrHW3lfV go.opentelemetry.io/collector/consumer/consumertest v0.124.0/go.mod h1:Hlu+EXbINHxVAyIT1baKO2d0j5odR3fLlLAiaP+JqQg= go.opentelemetry.io/collector/consumer/xconsumer v0.124.0 h1:/cut96EWVNoz6lIeGI9+EzS6UClMtnZkx5YIpkD0Xe0= go.opentelemetry.io/collector/consumer/xconsumer v0.124.0/go.mod h1:fHH/MpzFCRNk/4foiYE6BoXQCAMf5sJTO35uvzVrrd4= -go.opentelemetry.io/collector/exporter v0.102.1 h1:4VURYgBNJscxfMhZWitzcwA1cig5a6pH0xZSpdECDnM= -go.opentelemetry.io/collector/exporter v0.102.1/go.mod h1:1pmNxvrvvbWDW6PiGObICdj0eOSGV4Fzwpm5QA1GU54= go.opentelemetry.io/collector/exporter v0.124.0 h1:ii+9tU/iSrPl4+YDvqFVflksA9hUYEzwMIpmvP4JZ8w= go.opentelemetry.io/collector/exporter v0.124.0/go.mod h1:Q8tOEwFu3CN8VGjE4H2yZcCRG9Q60foQIyZGKPD/jig= go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.124.0 h1:rU8CkyMIkLnjQAM6Yjd/a2gOQ/Svsjd/8jCNKEmrStw= go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.124.0/go.mod h1:2dO+z9QWGZwyxGOVLuCKAT0n+da4FMIaRjQDXdhcFyM= go.opentelemetry.io/collector/exporter/exportertest v0.124.0 h1:IOxA/4CiVWGPlmA0JofK6W4DzvwW1YJes09r6osluIE= go.opentelemetry.io/collector/exporter/exportertest v0.124.0/go.mod h1:2EmU8IwVJV79MmFBFFW1LCN0Ob2UZsEkX/mSUB06lbI= -go.opentelemetry.io/collector/exporter/otlpexporter v0.102.1 h1:bOXE7u1iy0SKwH2mnVyIMKkvFIR9bn9iIm1Cf/CJlZU= -go.opentelemetry.io/collector/exporter/otlpexporter v0.102.1/go.mod h1:4ya6xaUYvcXq9MQW0TbsR4QWkOJI02d/2Vt8plwdozA= go.opentelemetry.io/collector/exporter/otlpexporter v0.124.0 h1:wbOnCi01UT9YGkK86Jl13DEBTCdgIXSLmX8RajQ66LM= go.opentelemetry.io/collector/exporter/otlpexporter v0.124.0/go.mod h1:zzugHvRuxWsl8+T2Dj61QAfk7CSWhl26jp0y5LNPVig= go.opentelemetry.io/collector/exporter/otlphttpexporter v0.124.0 h1:047D4wLOb5ug4O99y3AjR/SNFTxlq3RAr2zr/8G1JWI= go.opentelemetry.io/collector/exporter/otlphttpexporter v0.124.0/go.mod h1:Jk/1hiZvwy4dzFEfX37h18n3U9pNIfHSApcLjZmSFmU= go.opentelemetry.io/collector/exporter/xexporter v0.124.0 h1:Itfn2+F4ki8hObOtPCecWBwGpuxakUYSsTwwkB5iUns= go.opentelemetry.io/collector/exporter/xexporter v0.124.0/go.mod h1:dNK/PPY02gA9BawIKHyVk8kIFdYvqVZ2A+LlMZucIPY= -go.opentelemetry.io/collector/extension v0.102.1 h1:gAvE3w15q+Vv0Tj100jzcDpeMTyc8dAiemHRtJbspLg= -go.opentelemetry.io/collector/extension v0.102.1/go.mod h1:XBxUOXjZpwYLZYOK5u3GWlbBTOKmzStY5eU1R/aXkIo= go.opentelemetry.io/collector/extension v1.30.0 h1:AJqntAp1p40Q1az2Vze3OHiMURq56KWnUxaLzs1ghaA= go.opentelemetry.io/collector/extension v1.30.0/go.mod h1:a21WpypFQp9x0Go7yMOknYmIKvdIoWGzjz+h1WMjzLk= -go.opentelemetry.io/collector/extension/auth v0.102.1 h1:GP6oBmpFJjxuVruPb9X40bdf6PNu9779i8anxa+wW6U= -go.opentelemetry.io/collector/extension/auth v0.102.1/go.mod h1:U2JWz8AW1QXX2Ap3ofzo5Dn2fZU/Lglld97Vbh8BZS0= go.opentelemetry.io/collector/extension/extensionauth v1.30.0 h1:HfNT4F1LDEyuItoHq01LrPiUmMpfc5LnOfE4OYVSghA= go.opentelemetry.io/collector/extension/extensionauth v1.30.0/go.mod h1:bVWkWyyd0aCYu+x6q4HdezfzL0QAqlq5PO7NwckXe4s= go.opentelemetry.io/collector/extension/extensioncapabilities v0.124.0 h1:6emRXUQriceBcrwRDf2MPQQMRu7jmP0Z0XaJ4zdjt+I= @@ -2253,8 +1037,6 @@ go.opentelemetry.io/collector/extension/extensiontest v0.124.0 h1:pWfKxEqvq5vVdQ go.opentelemetry.io/collector/extension/extensiontest v0.124.0/go.mod h1:DLVRyW7tJt8TtYq0Wr5BUsM494YqDiIjN8YCmbVKqjs= go.opentelemetry.io/collector/extension/xextension v0.124.0 h1:Yzf11HXaiMHfS50Zy/CYKfJjoi+/w/tgRZdDQ2VIdW0= go.opentelemetry.io/collector/extension/xextension v0.124.0/go.mod h1:GeM0aSgwVSba3Bvvspuy1E+1aa/Q1CDxoK+e/xcJFVg= -go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= -go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= go.opentelemetry.io/collector/featuregate v1.30.0 h1:mx7+iP/FQnY7KO8qw/xE3Qd1MQkWcU8VgcqLNrJ8EU8= go.opentelemetry.io/collector/featuregate v1.30.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc= go.opentelemetry.io/collector/internal/fanoutconsumer v0.124.0 h1:8+xc3OxriK1nZNBApFCzF7lszXyBQxyJ/Nnzy5Q4hCM= @@ -2263,23 +1045,16 @@ go.opentelemetry.io/collector/internal/sharedcomponent v0.124.0 h1:HZTic8bbD86FF go.opentelemetry.io/collector/internal/sharedcomponent v0.124.0/go.mod h1:yQs/QFRYvAS2ak2mh9CXblFGbFEPLJ7FaFc8rTpL8C0= go.opentelemetry.io/collector/internal/telemetry v0.124.0 h1:kzd1/ZYhLj4bt2pDB529mL4rIRrRacemXodFNxfhdWk= go.opentelemetry.io/collector/internal/telemetry v0.124.0/go.mod h1:ZjXjqV0dJ+6D4XGhTOxg/WHjnhdmXsmwmUSgALea66Y= -go.opentelemetry.io/collector/otelcol v0.102.1 h1:JdRG3ven+c5k703QpZG5bxJi4JJOnWaNP/EJvN+oYnI= -go.opentelemetry.io/collector/otelcol v0.102.1/go.mod h1:kHf9KBXOLZXajR1On8XJbBBGcgh2I2+/mVVroPzOLJU= go.opentelemetry.io/collector/otelcol v0.124.0 h1:q/+ebTZgEZX+yFbvO7FeqpEtvtRPJ+YzZzHsVzqA71s= go.opentelemetry.io/collector/otelcol v0.124.0/go.mod h1:mFGJZn5YuffdMVO/lPBavbW+R64Dgd3jOMgw2WAmJEM= -go.opentelemetry.io/collector/pdata v1.27.0/go.mod h1:18e8/xDZsqyj00h/5HM5GLdJgBzzG9Ei8g9SpNoiMtI= go.opentelemetry.io/collector/pdata/pprofile v0.124.0 h1:ZjL9wKqzP4BHj0/F1jfGxs1Va8B7xmYayipZeNVoWJE= go.opentelemetry.io/collector/pdata/pprofile v0.124.0/go.mod h1:1EN3Gw5LSI4fSVma/Yfv/6nqeuYgRTm1/kmG5nE5Oyo= go.opentelemetry.io/collector/pdata/testdata v0.124.0 h1:vY+pWG7CQfzzGSB5+zGYHQOltRQr59Ek9QiPe+rI+NY= go.opentelemetry.io/collector/pdata/testdata v0.124.0/go.mod h1:lNH48lGhGv4CYk27fJecpsR1zYHmZjKgNrAprwjym0o= -go.opentelemetry.io/collector/pipeline v0.121.0/go.mod h1:TO02zju/K6E+oFIOdi372Wk0MXd+Szy72zcTsFQwXl4= go.opentelemetry.io/collector/pipeline v0.124.0 h1:hKvhDyH2GPnNO8LGL34ugf36sY7EOXPjBvlrvBhsOdw= go.opentelemetry.io/collector/pipeline v0.124.0/go.mod h1:TO02zju/K6E+oFIOdi372Wk0MXd+Szy72zcTsFQwXl4= go.opentelemetry.io/collector/pipeline/xpipeline v0.124.0 h1:ADHUrozlIgSDjXMsAC5t8l4p9TVo+QH33XArFfcL9ns= go.opentelemetry.io/collector/pipeline/xpipeline v0.124.0/go.mod h1:ep7XJFdCEq04/5yUyiWWzgKvBYMwRJR5XNWmGpIGbVQ= -go.opentelemetry.io/collector/processor v0.102.1 h1:79NWs7kTgmgxOIQacuZyDf+mYWuoJZS07SHwZT7sZ4Y= -go.opentelemetry.io/collector/processor v0.102.1/go.mod h1:sNM41tEHgv3YA/Dz9/6F8oCeObrqnKCGOMs7wS6Ldus= -go.opentelemetry.io/collector/processor v0.121.0/go.mod h1:BoFEMvPn5/p53eWz+R9cibIxCXzaRZ/RtcBPtvqXNaQ= go.opentelemetry.io/collector/processor v1.30.0 h1:dxmu+sO6MzQydyrf2CON5Hm1KU7yV4ofH1stmreUtPk= go.opentelemetry.io/collector/processor v1.30.0/go.mod h1:DjXAgelT8rfIWCTJP5kiPpxPqz4JLE1mJwsE2kJMTk8= go.opentelemetry.io/collector/processor/processorhelper v0.124.0 h1:zIBpPn/88FVusy/WL+k0jKNVEX+cRnnPhKNc+B9TRds= @@ -2288,12 +1063,8 @@ go.opentelemetry.io/collector/processor/processortest v0.124.0 h1:qcyo0dSWmgpNFx go.opentelemetry.io/collector/processor/processortest v0.124.0/go.mod h1:1YDTxd4c/uVU3Ui1+AzvYW94mo5DbhNmB1xSof6zvD0= go.opentelemetry.io/collector/processor/xprocessor v0.124.0 h1:KAe8gIje8TcB8varZ4PDy0HV5xX5rNdaQ7q46BE915w= go.opentelemetry.io/collector/processor/xprocessor v0.124.0/go.mod h1:ItJBBlR6/141vg1v4iRrcsBrGjPCgmXAztxS2x2YkdI= -go.opentelemetry.io/collector/receiver v0.102.1 h1:353t4U3o0RdU007JcQ4sRRzl72GHCJZwXDr8cCOcEbI= -go.opentelemetry.io/collector/receiver v0.102.1/go.mod h1:pYjMzUkvUlxJ8xt+VbI1to8HMtVlv8AW/K/2GQQOTB0= go.opentelemetry.io/collector/receiver v1.30.0 h1:XbgU4yT3Ld+hL9+jHcD/Kctcr3gXjpiFxKO+50pSayg= go.opentelemetry.io/collector/receiver v1.30.0/go.mod h1:U3cApz9PHiRMgN0WkZaz4o8mvj1+cVQYsyj2Nl1v3FQ= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.1 h1:65/8lkVmOu6gwBw99W+QUQBeDC2qVTwlaiqy7/SpauY= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.1/go.mod h1:0hmxfFSSqKJjRGvgYjp/XvptbAgLhLguwNgJqMp7zd0= go.opentelemetry.io/collector/receiver/otlpreceiver v0.124.0 h1:DwvPyh6X0ytmD0IIjOq62ui3Bg5FwkaX6DzseGg62sY= go.opentelemetry.io/collector/receiver/otlpreceiver v0.124.0/go.mod h1:QG2c9RW/Ys1L30cGH24RBJk72H27UdB50YmpY2rclNs= go.opentelemetry.io/collector/receiver/receiverhelper v0.124.0 h1:lOCWpiZUzeXV0zDN4jzwqgD6gFdhsY9Mp1om5XzrWKk= @@ -2302,512 +1073,98 @@ go.opentelemetry.io/collector/receiver/receivertest v0.124.0 h1:mx0290aXAo+wfjm4 go.opentelemetry.io/collector/receiver/receivertest v0.124.0/go.mod h1:3RpopRmIzx5T4zTStHJC0HHfd8YFWm8e9bia1HiuDtY= go.opentelemetry.io/collector/receiver/xreceiver v0.124.0 h1:YigTUKk8p/aIfqaT0ST7teT9KbLThWD5n2km83byftw= go.opentelemetry.io/collector/receiver/xreceiver v0.124.0/go.mod h1:NkTpmpAEDT17Dko4gpHUnRztrSkdSd6B0+Y4gfuCWIA= -go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= -go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= -go.opentelemetry.io/collector/semconv v0.121.0/go.mod h1:te6VQ4zZJO5Lp8dM2XIhDxDiL45mwX0YAQQWRQ0Qr9U= go.opentelemetry.io/collector/semconv v0.124.0 h1:YTdo3UFwNyDQCh9DiSm2rbzAgBuwn/9dNZ0rv454goA= go.opentelemetry.io/collector/semconv v0.124.0/go.mod h1:te6VQ4zZJO5Lp8dM2XIhDxDiL45mwX0YAQQWRQ0Qr9U= -go.opentelemetry.io/collector/service v0.102.1 h1:Lg7qrC4Zctd/OAlkpdsaZaUY+jLEGLLnOigfBLP2GW8= -go.opentelemetry.io/collector/service v0.102.1/go.mod h1:L5Sh3461B1Zij7vpMMbi6M/SZicgrLB3UgbG0oUK0pA= go.opentelemetry.io/collector/service v0.124.0 h1:lUpizko/Y2P+XXbZ9wiKM8acLSt6ZIvC3/6/j6rcq4w= go.opentelemetry.io/collector/service v0.124.0/go.mod h1:w2eL3KKOMW4CvqCWyZ3P/Qh1ZBEPGG/uRz/0LpHbpv0= go.opentelemetry.io/collector/service/hostcapabilities v0.124.0 h1:ArxbARF7+bnzK8xLnN2G41KInbcN1aGhSBR76VeUQi8= go.opentelemetry.io/collector/service/hostcapabilities v0.124.0/go.mod h1:vifQsB+lkeCsjBCRPVHca9lJ3pLpLPZKCGrG77nkxFQ= go.opentelemetry.io/contrib/bridges/otelzap v0.10.0 h1:ojdSRDvjrnm30beHOmwsSvLpoRF40MlwNCA+Oo93kXU= go.opentelemetry.io/contrib/bridges/otelzap v0.10.0/go.mod h1:oTTm4g7NEtHSV2i/0FeVdPaPgUIZPfQkFbq0vbzqnv0= -go.opentelemetry.io/contrib/bridges/prometheus v0.53.0 h1:BdkKDtcrHThgjcEia1737OUuFdP6xzBKAMx2sNZCkvE= -go.opentelemetry.io/contrib/bridges/prometheus v0.53.0/go.mod h1:ZkhVxcJgeXlL/lVyT/vxNHVFiSG5qOaDwYaSgD8IfZo= -go.opentelemetry.io/contrib/bridges/prometheus v0.60.0 h1:x7sPooQCwSg27SjtQee8GyIIRTQcF4s7eSkac6F2+VA= -go.opentelemetry.io/contrib/bridges/prometheus v0.60.0/go.mod h1:4K5UXgiHxV484efGs42ejD7E2J/sIlepYgdGoPXe7hE= -go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= -go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= -go.opentelemetry.io/contrib/detectors/gcp v1.29.0/go.mod h1:GW2aWZNwR2ZxDLdv8OyC2G8zkRoQBuURgV7RPQgcPoU= -go.opentelemetry.io/contrib/detectors/gcp v1.32.0/go.mod h1:TVqo0Sda4Cv8gCIixd7LuLwW4EylumVWfhjZJjDD4DU= -go.opentelemetry.io/contrib/detectors/gcp v1.33.0/go.mod h1:ZHrLmr4ikK2AwRj9QL+c9s2SOlgoSRyMpNVzUj2fZqI= -go.opentelemetry.io/contrib/detectors/gcp v1.34.0/go.mod h1:cV4BMFcscUR/ckqLkbfQmF0PRsq8w/lMGzdbCSveBHo= -go.opentelemetry.io/contrib/exporters/autoexport v0.53.0 h1:13K+tY7E8GJInkrvRiPAhC0gi/7vKjzDNhtmCf+QXG8= -go.opentelemetry.io/contrib/exporters/autoexport v0.53.0/go.mod h1:lyQF6xQ4iDnMg4sccNdFs1zf62xd79YI8vZqKjOTwMs= -go.opentelemetry.io/contrib/exporters/autoexport v0.60.0 h1:GuQXpvSXNjpswpweIem84U9BNauqHHi2w1GtNAalvpM= -go.opentelemetry.io/contrib/exporters/autoexport v0.60.0/go.mod h1:CkmxekdHco4d7thFJNPQ7Mby4jMBgZUclnrxT4e+ryk= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.58.0/go.mod h1:uosvgpqTcTXtcPQORTbEkZNDQTCDOgTz1fe6aLSyqrQ= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.59.0/go.mod h1:54CaSNqYEXvpzDh8KPjiMVoWm60t5R0dZRt0leEPgAs= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0/go.mod h1:CosX/aS4eHnG9D7nESYpV753l4j9q5j3SL/PUYd2lR8= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= go.opentelemetry.io/contrib/otelconf v0.15.0 h1:BLNiIUsrNcqhSKpsa6CnhE6LdrpY1A8X0szMVsu99eo= go.opentelemetry.io/contrib/otelconf v0.15.0/go.mod h1:OPH1seO5z9dp1P26gnLtoM9ht7JDvh3Ws6XRHuXqImY= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0 h1:IjgxbomVrV9za6bRi8fWCNXENs0co37SZedQilP2hm0= -go.opentelemetry.io/contrib/propagators/b3 v1.27.0/go.mod h1:Dv9obQz25lCisDvvs4dy28UPh974CxkahRDUPsY7y9E= go.opentelemetry.io/contrib/propagators/b3 v1.35.0 h1:DpwKW04LkdFRFCIgM3sqwTJA/QREHMeMHYPWP1WeaPQ= go.opentelemetry.io/contrib/propagators/b3 v1.35.0/go.mod h1:9+SNxwqvCWo1qQwUpACBY5YKNVxFJn5mlbXg/4+uKBg= -go.opentelemetry.io/contrib/propagators/jaeger v1.35.0/go.mod h1:0ciyFyYZxE6JqRAQvIgGRabKWDUmNdW3GAQb6y/RlFU= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.28.0/go.mod h1:iWS+NvC948FyfnJbVfPN9h/8+vr8CR2FPn6XsLRkvH8= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.29.0/go.mod h1:XAJmM2MWhiIoTO4LCLBVeE8w009TmsYk6hq1UNdXs5A= go.opentelemetry.io/contrib/zpages v0.60.0 h1:wOM9ie1Hz4H88L9KE6GrGbKJhfm+8F1NfW/Y3q9Xt+8= go.opentelemetry.io/contrib/zpages v0.60.0/go.mod h1:xqfToSRGh2MYUsfyErNz8jnNDPlnpZqWM/y6Z2Cx7xw= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= -go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= -go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0 h1:ao9aGGHd+G4YfjBpGs6vbkvt5hoC67STlJA9fCnOAcs= -go.opentelemetry.io/otel/bridge/opencensus v1.27.0/go.mod h1:uRvWtAAXzyVOST0WMPX5JHGBaAvBws+2F8PcC5gMnTk= go.opentelemetry.io/otel/bridge/opencensus v1.35.0 h1:4nJfffRbozhqnuukfRkiahA94mnpryCLJLiduMIDJKI= go.opentelemetry.io/otel/bridge/opencensus v1.35.0/go.mod h1:359S30saRYNsB4A46EDx91SpXsQFNgkma7ftg2/L5/M= -go.opentelemetry.io/otel/bridge/opentracing v1.26.0 h1:Q/dHj0DOhfLMAs5u5ucAbC7gy66x9xxsZRLpHCJ4XhI= -go.opentelemetry.io/otel/bridge/opentracing v1.26.0/go.mod h1:HfypvOw/8rqu4lXDhwaxVK1ibBAi1lTMXBHV9rywOCw= go.opentelemetry.io/otel/bridge/opentracing v1.35.0 h1:qT4jl1fYl0hHuRopNcwS94QosLFhGYcS0HacPUeXmT4= go.opentelemetry.io/otel/bridge/opentracing v1.35.0/go.mod h1:p5CbIL4v7uQz7mnQD6T/AZc1pPUzwz+2wZ1zrGY9Kgs= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 h1:R/OBkMoGgfy2fLhs2QhkCI1w4HLEQX92GCcJB6SSdNk= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.28.0 h1:aLmmtjRke7LPDQ3lvpFz+kNEH43faFhzW7v8BFIEydg= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.28.0/go.mod h1:TC1pyCt6G9Sjb4bQpShH+P5R53pO6ZuGnHuuln9xMeE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0/go.mod h1:hYwym2nDEeZfG/motx0p7L7J1N1vyzIThemQsb4g2qY= -go.opentelemetry.io/otel/exporters/prometheus v0.50.0 h1:2Ewsda6hejmbhGFyUvWZjUThC98Cf8Zy6g0zkIimOng= -go.opentelemetry.io/otel/exporters/prometheus v0.50.0/go.mod h1:pMm5PkUo5YwbLiuEf7t2xg4wbP0/eSJrMxIMxKosynY= -go.opentelemetry.io/otel/exporters/prometheus v0.57.0 h1:AHh/lAP1BHrY5gBwk8ncc25FXWm/gmmY3BX258z5nuk= -go.opentelemetry.io/otel/exporters/prometheus v0.57.0/go.mod h1:QpFWz1QxqevfjwzYdbMb4Y1NnlJvqSGwyuU0B4iuc9c= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 h1:0MH3f8lZrflbUWXVxyBg/zviDFdGE062uKh5+fu8Vv0= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0/go.mod h1:Vh68vYiHY5mPdekTr0ox0sALsqjoVy0w3Os278yX5SQ= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.11.0 h1:k6KdfZk72tVW/QVZf60xlDziDvYAePj5QHwoQvrB2m8= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.11.0/go.mod h1:5Y3ZJLqzi/x/kYtrSrPSx7TFI/SGsL7q2kME027tH6I= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 h1:BJee2iLkfRfl9lc7aFmBwkWxY/RI1RDdXepSF6y8TPE= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0/go.mod h1:DIzlHs3DRscCIBU3Y9YSzPfScwnYnzfnCd4g8zA7bZc= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0/go.mod h1:U2R3XyVPzn0WX7wOIypPuptulsMcPDPs/oiSVOMVnHY= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.35.0 h1:T0Ec2E+3YZf5bgTNQVet8iTDW7oIk03tXHq+wkwIDnE= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.35.0/go.mod h1:30v2gqH+vYGJsesLWFov8u47EpYTcIQcBjKpI6pJThg= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= -go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= -go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= -go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= -go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= -go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= -go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= -go.opentelemetry.io/otel/sdk/metric v1.29.0/go.mod h1:6zZLdCl2fkauYoZIOn/soQIDSWFmNSRcICarHfuhNJQ= -go.opentelemetry.io/otel/sdk/metric v1.30.0/go.mod h1:waS6P3YqFNzeP01kuo/MBBYqaoBJl7efRQHOaydhy1Y= -go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= -go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= -go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= -go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= -go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= -go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= -go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= -go.starlark.net v0.0.0-20221020143700-22309ac47eac/go.mod h1:kIVgS18CjmEC3PqMd5kaJSGEifyV/CeB9x506ZJ1Vbk= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= -go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.11.1-0.20230711161743-2e82bdd1719d/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= -golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= -golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= -golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= -golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= -golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= -golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= -golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= -golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= -golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= -golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM= -golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e h1:qyrTQ++p1afMkO4DPEeLGq/3oTsdlvdH4vqZUBWzUKM= golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= -golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/image v0.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ= golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= -golang.org/x/mod v0.6.0-dev.0.20220818022119-ed83ed61efb9/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= -golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= -golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= -golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= -golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= -golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= -golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= -golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= -golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= -golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= -golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= -golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220823224334-20c2bfdbfe24/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= -golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20190424220101-1e8e1cfdf96b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= -golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= -golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= -golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= -golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= -golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg= golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= -golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= -golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= -golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= -gonum.org/v1/plot v0.14.0 h1:+LBDVFYwFe4LHhdP8coW6296MBEY4nQ+Y4vuUpJopcE= -gonum.org/v1/plot v0.14.0/go.mod h1:MLdR9424SJed+5VqC6MsouEpig9pZX2VZ57H9ko2bXU= gonum.org/v1/plot v0.15.2 h1:Tlfh/jBk2tqjLZ4/P8ZIwGrLEWQSPDLRm/SNWKNXiGI= gonum.org/v1/plot v0.15.2/go.mod h1:DX+x+DWso3LTha+AdkJEv5Txvi+Tql3KAGkehP0/Ubg= -google.golang.org/api v0.152.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= -google.golang.org/api v0.171.0/go.mod h1:Hnq5AHm4OTMt2BUVjael2CWZFD6vksJdWCWiUAmjC9o= -google.golang.org/api v0.177.0/go.mod h1:srbhue4MLjkjbkux5p3dw/ocYOSZTaIEvf7bCOnFQDw= -google.golang.org/api v0.203.0/go.mod h1:BuOVyCSYEPwJb3npWvDnNmFI92f3GeRnHNkETneT3SI= -google.golang.org/api v0.211.0/go.mod h1:XOloB4MXFH4UTlQSGuNUxw0UT74qdENK8d6JNsXKLi0= -google.golang.org/api v0.214.0/go.mod h1:bYPpLG8AyeMWwDU6NXoB00xC0DFkikVvd5MfwoxjLqE= -google.golang.org/api v0.215.0/go.mod h1:fta3CVtuJYOEdugLNWm6WodzOS8KdFckABwN4I40hzY= -google.golang.org/api v0.216.0/go.mod h1:K9wzQMvWi47Z9IU7OgdOofvZuw75Ge3PPITImZR/UyI= -google.golang.org/api v0.217.0/go.mod h1:qMc2E8cBAbQlRypBTBWHklNJlaZZJBwDv81B1Iu8oSI= -google.golang.org/api v0.218.0/go.mod h1:5VGHBAkxrA/8EFjLVEYmMUJ8/8+gWWQ3s4cFH0FxG2M= -google.golang.org/api v0.224.0/go.mod h1:3V39my2xAGkodXy0vEqcEtkqgw2GtrFL5WuBZlCTCOQ= -google.golang.org/api v0.227.0/go.mod h1:EIpaG6MbTgQarWF5xJvX0eOJPK9n/5D4Bynb9j2HXvQ= -google.golang.org/api v0.229.0/go.mod h1:wyDfmq5g1wYJWn29O22FDWN48P7Xcz0xz+LBpptYvB0= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8 h1:Cpp2P6TPjujNoC5M2KHY6g7wfyLYfIWRZaSdIKfDasA= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190926190326-7ee9db18f195/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20230731193218-e0aa005b6bdf/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= -google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= -google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= -google.golang.org/genproto v0.0.0-20241015192408-796eee8c2d53/go.mod h1:fheguH3Am2dGp1LfXkrvwqC/KlFq8F0nLq3LryOMrrE= -google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= -google.golang.org/genproto v0.0.0-20250106144421-5f5ef82da422/go.mod h1:1NPAxoesyw/SgLPqaUp9u1f9PWCLAk/jVmhx7gJZStg= -google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4/go.mod h1:qbZzneIOXSq+KFAFut9krLfRLZiFLzZL5u2t8SV83EE= -google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= -google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6/go.mod h1:10yRODfgim2/T8csjQsMPgZOMvtytXKTDRzH6HRGzRw= -google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= -google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117/go.mod h1:OimBR/bc1wPO9iV4NC2bpyjy3VnAwZh5EBPQdtaE5oo= -google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= -google.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= -google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:wp2WsuBYj6j8wUdo3ToZsdxxixbvQNAHqVJrTgi5E5M= -google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53/go.mod h1:riSXTwQ4+nqmPGtobMFyW5FqVAmIs0St6VPp4Ug7CE4= -google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88= -google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a/go.mod h1:jehYqy3+AhJU9ve55aNOaSml7wUXjF9x6z2LcCfpAhY= -google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576/go.mod h1:1R3kvZ1dtP3+4p4d3G8uJ8rFk/fWlScl38vanWACI08= -google.golang.org/genproto/googleapis/api v0.0.0-20241219192143-6b3ec007d9bb/go.mod h1:E5//3O5ZIG2l71Xnt+P/CYUY8Bxs8E7WMoZ9tlcMbAY= -google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422/go.mod h1:b6h1vNKhxaSoEI+5jc3PJUCustfli/mRab7295pY7rw= -google.golang.org/genproto/googleapis/api v0.0.0-20250124145028-65684f501c47/go.mod h1:AfA77qWLcidQWywD0YgqfpJzf50w2VjzBml3TybHeJU= -google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489/go.mod h1:iYONQfRdizDB8JJBybql13nArx91jcUk7zCXEsOofM4= -google.golang.org/genproto/googleapis/api v0.0.0-20250227231956-55c901821b1e/go.mod h1:Xsh8gBVxGCcbV8ZeTB9wI5XPyZ5RvC6V3CTeeplHbiA= -google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= -google.golang.org/genproto/googleapis/api v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:c8q6Z6OCqnfVIqUFJkCzKcrj8eCvUrz+K4KRzSTuANg= -google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e/go.mod h1:085qFyf2+XaZlRdCgKNCIZ3afY2p4HHZdoIRpId8F4A= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20250102185135-69823020774d h1:NZBSeFsuFS5YrgHMW/8xfTbzNXMshQPNgq2Yb7xipEs= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20250102185135-69823020774d/go.mod h1:s4mHJ3FfG8P6A3O+gZ8TVqB3ufjOl9UG3ANCMMwCHmo= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20250127172529-29210b9bc287 h1:c/HGC2hBfwgjeBtQMLjfmuS2KG28ngtUpn5XiX8o3rY= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20250127172529-29210b9bc287/go.mod h1:7VGktjvijnuhf2AobFqsoaBGnG8rImcxqoL+QPBPRq4= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20250219182151-9fdb1cabc7b2 h1:UZtupsOaDeUm4KiG4HQTSyENUuCayW8K5d5cs7zK79c= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:35wIojE/F1ptq1nfNDNjtowabHoMSA2qQs7+smpCO5s= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20250414145226-207652e42e2e h1:OK8bKvRgTGs7U871RdjtCiRcQJLice8/rZkeoaZgnlc= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20250414145226-207652e42e2e/go.mod h1:h6yxum/C2qRb4txaZRLDHK8RyS0H/o2oEDeKY4onY/Y= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250505200425-f936aa4a68b2 h1:DbpkGFGRkd4GORg+IWQW2EhxUaa/My/PM8d1CGyTDMY= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:h6yxum/C2qRb4txaZRLDHK8RyS0H/o2oEDeKY4onY/Y= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241206012308-a4fef0638583/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241219192143-6b3ec007d9bb/go.mod h1:lcTa1sDdWEIHMWlITnIczmw5w60CF9ffkb8Z+DVmmjA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241223144023-3abc09e42ca8/go.mod h1:lcTa1sDdWEIHMWlITnIczmw5w60CF9ffkb8Z+DVmmjA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250106144421-5f5ef82da422/go.mod h1:3ENsm/5D1mzDyhpzeRi1NR784I0BcofWBoSc5QqqMK4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250227231956-55c901821b1e/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250425173222-7b384671a197/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/genproto/googleapis/rpc v0.0.0-20250512202823-5a2f75b736a9/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= -google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= -google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= -google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= -google.golang.org/grpc v1.67.3/go.mod h1:YGaHCc6Oap+FzBJTZLBzkGSYt/cvGPFTPxkn7QfSU8s= -google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= -google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= -google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/examples v0.0.0-20230224211313-3775f633ce20 h1:MLBCGN1O7GzIx+cBiwfYPwtmZ41U3Mn/cotLJciaArI= google.golang.org/grpc/examples v0.0.0-20230224211313-3775f633ce20/go.mod h1:Nr5H8+MlGWr5+xX/STzdoEqJrO+YteqFbMyCsrb6mH0= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -google.golang.org/protobuf v1.36.0/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/cheggaaa/pb.v1 v1.0.25 h1:Ev7yu1/f6+d+b3pi5vPdRPc6nNtP1umSfcWiEfRqv6I= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0= gopkg.in/go-jose/go-jose.v2 v2.6.3 h1:nt80fvSDlhKWQgSWyHyy5CfmlQr+asih51R8PTWNKKs= gopkg.in/go-jose/go-jose.v2 v2.6.3/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= -gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= -gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= gopkg.in/vmihailenco/msgpack.v2 v2.9.2 h1:gjPqo9orRVlSAH/065qw3MsFCDpH7fa1KpiizXyllY4= gopkg.in/vmihailenco/msgpack.v2 v2.9.2/go.mod h1:/3Dn1Npt9+MYyLpYYXjInO/5jvMLamn+AEGwNEOatn8= -gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= honnef.co/go/tools v0.3.2 h1:ytYb4rOqyp1TSa2EPvNVwtPQJctSELKaMyLfqNP4+34= honnef.co/go/tools v0.3.2/go.mod h1:jzwdWgg7Jdq75wlfblQxO4neNaFFSvgc1tD5Wv8U0Yw= -howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= -howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= -howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= howett.net/plist v1.0.1 h1:37GdZ8tP09Q35o9ych3ehygcsL+HqKSwzctveSlarvM= howett.net/plist v1.0.1/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= -k8s.io/api v0.32.2/go.mod h1:hKlhk4x1sJyYnHENsrdCWw31FEmCijNGPJO5WzHiJ6Y= -k8s.io/apimachinery v0.32.2/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= -k8s.io/apiserver v0.32.3/go.mod h1:q1x9B8E/WzShF49wh3ADOh6muSfpmFL0I2t+TG0Zdgc= -k8s.io/client-go v0.32.2/go.mod h1:fpZ4oJXclZ3r2nDOv+Ux3XcJutfrwjKTCHz2H3sww94= -k8s.io/client-go v9.0.0+incompatible h1:2kqW3X2xQ9SbFvWZjGEHBLlWc1LG9JIJNXWkuqwdZ3A= -k8s.io/code-generator v0.32.1 h1:4lw1kFNDuFYXquTkB7Sl5EwPMUP2yyW9hh6BnFfRZFY= -k8s.io/code-generator v0.32.1/go.mod h1:zaILfm00CVyP/6/pJMJ3zxRepXkxyDfUV5SNG4CjZI4= -k8s.io/code-generator v0.32.3 h1:31p2TVzC9+hVdSkAFruAk3JY+iSfzrJ83Qij1yZutyw= -k8s.io/code-generator v0.32.3/go.mod h1:+mbiYID5NLsBuqxjQTygKM/DAdKpAjvBzrJd64NU1G8= -k8s.io/code-generator v0.33.0 h1:B212FVl6EFqNmlgdOZYWNi77yBv+ed3QgQsMR8YQCw4= -k8s.io/code-generator v0.33.0/go.mod h1:KnJRokGxjvbBQkSJkbVuBbu6z4B0rC7ynkpY5Aw6m9o= k8s.io/code-generator v0.33.1 h1:ZLzIRdMsh3Myfnx9BaooX6iQry29UJjVfVG+BuS+UMw= k8s.io/code-generator v0.33.1/go.mod h1:HUKT7Ubp6bOgIbbaPIs9lpd2Q02uqkMCMx9/GjDrWpY= -k8s.io/component-base v0.32.3/go.mod h1:LWi9cR+yPAv7cu2X9rZanTiFKB2kHA+JjmhkKjCZRpI= -k8s.io/cri-api v0.25.0 h1:INwdXsCDSA/0hGNdPxdE2dQD6ft/5K1EaKXZixvSQxg= -k8s.io/cri-api v0.25.0/go.mod h1:J1rAyQkSJ2Q6I+aBMOVgg2/cbbebso6FNa0UagiR0kc= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6 h1:4s3/R4+OYYYUKptXPhZKjQ04WJ6EhQQVFdjOFvCazDk= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac h1:sAvhNk5RRuc6FNYGqe7Ygz3PSo/2wGWbulskmzRX8Vs= -k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= -k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9 h1:si3PfKm8dDYxgfbeA6orqrtLkvvIeH8UqffFJDl0bz4= -k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 h1:2OX19X59HxDprNCVrWi6jb7LW1PoqTlYqEq5H2oetog= k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= modernc.org/cc/v3 v3.36.3 h1:uISP3F66UlixxWEcKuIWERa4TwrZENHSL8tWxZz8bHg= -modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= -modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= modernc.org/ccgo/v3 v3.16.9 h1:AXquSwg7GuMk11pIdw7fmO1Y/ybgazVkMhsZWCV0mHM= -modernc.org/ccgo/v3 v3.17.0 h1:o3OmOqx4/OFnl4Vm3G8Bgmqxnvxnh0nbxeT5p/dWChA= -modernc.org/ccgo/v3 v3.17.0/go.mod h1:Sg3fwVpmLvCUTaqEUjiBDAvshIaKDB0RXaf+zgqFu8I= modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= -modernc.org/ccorpus2 v1.5.2 h1:Ui+4tc58mf/W+2arcYCJR903y3zl3ecsI7Fpaaqozyw= -modernc.org/ccorpus2 v1.5.2/go.mod h1:Wifvo4Q/qS/h1aRoC2TffcHsnxwTikmi1AuLANuucJQ= -modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= -modernc.org/lex v1.1.1 h1:prSCNTLw1R4rn7M/RzwsuMtAuOytfyR3cnyM07P+Pas= -modernc.org/lex v1.1.1/go.mod h1:6r8o8DLJkAnOsQaGi8fMoi+Vt6LTbDaCrkUK729D8xM= -modernc.org/lexer v1.0.4 h1:hU7xVbZsqwPphyzChc7nMSGrsuaD2PDNOmzrzkS5AlE= -modernc.org/lexer v1.0.4/go.mod h1:tOajb8S4sdfOYitzCgXDFmbVJ/LE0v1fNJ7annTw36U= -modernc.org/libc v1.41.0/go.mod h1:w0eszPsiXoOnoMJgrXjglgLuDy/bt5RR4y3QzUUeodY= -modernc.org/libc v1.62.1/go.mod h1:iXhATfJQLjG3NWy56a6WVU73lWOcdYVxsvwCgoPljuo= -modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= -modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= -modernc.org/memory v1.9.1/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= -modernc.org/scannertest v1.0.2 h1:JPtfxcVdbRvzmRf2YUvsDibJsQRw8vKA/3jb31y7cy0= -modernc.org/scannertest v1.0.2/go.mod h1:RzTm5RwglF/6shsKoEivo8N91nQIoWtcWI7ns+zPyGA= -modernc.org/sqlite v1.29.6/go.mod h1:S02dvcmm7TnTRvGhv8IGYyLnIt7AS2KPaB1F/71p75U= -modernc.org/sqlite v1.34.1/go.mod h1:pXV2xHxhzXZsgT/RtTFAPY6JJDEvOTcTdwADQCCWD4k= -modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= modernc.org/tcl v1.13.1 h1:npxzTwFTZYM8ghWicVIX1cRWzj7Nd8i6AqqX2p+IYao= modernc.org/z v1.5.1 h1:RTNHdsrOpeoSeOF4FbzTo8gBYByaJ5xT7NgZ9ZqRiJM= rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/controller-runtime v0.20.2 h1:/439OZVxoEc02psi1h4QO3bHzTgu49bb347Xp4gW1pc= -sigs.k8s.io/controller-runtime v0.20.2/go.mod h1:xg2XB0K5ShQzAgsoujxuKN4LNXR2LfwwHsPj7Iaw+XY= sigs.k8s.io/controller-runtime v0.20.4 h1:X3c+Odnxz+iPTRobG4tp092+CvBU9UK0t/bRf+n0DGU= sigs.k8s.io/controller-runtime v0.20.4/go.mod h1:xg2XB0K5ShQzAgsoujxuKN4LNXR2LfwwHsPj7Iaw+XY= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb792X0kfOBBJUPFEyvVfQWrYT/l8h5EKA6JQ= -sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= -sigs.k8s.io/structured-merge-diff/v6 v6.0.0 h1:KNyvHZ4ODhitmwNvjprMRBdppZHoDJQF3xlcELX8Qd4= -sigs.k8s.io/structured-merge-diff/v6 v6.0.0/go.mod h1:GbAVeWiRqSnOZ+kOAZWugRTPF3M9ySS4W3tL++kxz3w= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/pkg/infra/httpclient/httpclientprovider/http_client_provider.go b/pkg/infra/httpclient/httpclientprovider/http_client_provider.go index 4f6c308a161..e6dccd1dfe0 100644 --- a/pkg/infra/httpclient/httpclientprovider/http_client_provider.go +++ b/pkg/infra/httpclient/httpclientprovider/http_client_provider.go @@ -4,9 +4,7 @@ import ( "net/http" "time" - "github.com/grafana/grafana-aws-sdk/pkg/awsds" - awssdk "github.com/grafana/grafana-aws-sdk/pkg/sigv4" - "github.com/grafana/grafana-plugin-sdk-go/backend/gtime" + "github.com/grafana/grafana-aws-sdk/pkg/awsauth" sdkhttpclient "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" "github.com/mwitkow/go-conntrack" @@ -46,21 +44,7 @@ func New(cfg *setting.Cfg, validator validations.DataSourceRequestURLValidator, // SigV4 signing should be performed after all headers are added if cfg.SigV4AuthEnabled { - authSettings := awsds.AuthSettings{ - AllowedAuthProviders: cfg.AWSAllowedAuthProviders, - AssumeRoleEnabled: cfg.AWSAssumeRoleEnabled, - ExternalID: cfg.AWSExternalId, - ListMetricsPageLimit: cfg.AWSListMetricsPageLimit, - SecureSocksDSProxyEnabled: cfg.SecureSocksDSProxy.Enabled, - } - if cfg.AWSSessionDuration != "" { - sessionDuration, err := gtime.ParseDuration(cfg.AWSSessionDuration) - if err == nil { - authSettings.SessionDuration = &sessionDuration - } - } - - middlewares = append(middlewares, awssdk.SigV4MiddlewareWithAuthSettings(cfg.SigV4VerboseLogging, authSettings)) + middlewares = append(middlewares, awsauth.NewSigV4Middleware()) } setDefaultTimeoutOptions(cfg) diff --git a/pkg/infra/httpclient/httpclientprovider/http_client_provider_test.go b/pkg/infra/httpclient/httpclientprovider/http_client_provider_test.go index 6960ec18e33..449959c0d68 100644 --- a/pkg/infra/httpclient/httpclientprovider/http_client_provider_test.go +++ b/pkg/infra/httpclient/httpclientprovider/http_client_provider_test.go @@ -5,7 +5,7 @@ import ( "github.com/grafana/grafana/pkg/services/validations" - awssdk "github.com/grafana/grafana-aws-sdk/pkg/sigv4" + "github.com/grafana/grafana-aws-sdk/pkg/awsauth" sdkhttpclient "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/setting" @@ -63,7 +63,7 @@ func TestHTTPClientProvider(t *testing.T) { require.Equal(t, sdkhttpclient.ResponseLimitMiddlewareName, o.Middlewares[6].(sdkhttpclient.MiddlewareName).MiddlewareName()) require.Equal(t, HostRedirectValidationMiddlewareName, o.Middlewares[7].(sdkhttpclient.MiddlewareName).MiddlewareName()) require.Equal(t, sdkhttpclient.ErrorSourceMiddlewareName, o.Middlewares[8].(sdkhttpclient.MiddlewareName).MiddlewareName()) - require.Equal(t, awssdk.SigV4MiddlewareName, o.Middlewares[9].(sdkhttpclient.MiddlewareName).MiddlewareName()) + require.Equal(t, awsauth.NewSigV4Middleware().(sdkhttpclient.MiddlewareName).MiddlewareName(), o.Middlewares[9].(sdkhttpclient.MiddlewareName).MiddlewareName()) }) t.Run("When creating new provider and http logging is enabled for one plugin, it should apply expected middleware", func(t *testing.T) { diff --git a/pkg/registry/apis/datasource/middleware.go b/pkg/registry/apis/datasource/middleware.go index b0a4bbc312a..cce53a2f334 100644 --- a/pkg/registry/apis/datasource/middleware.go +++ b/pkg/registry/apis/datasource/middleware.go @@ -3,8 +3,8 @@ package datasource import ( "context" + "github.com/grafana/grafana-aws-sdk/pkg/awsauth" "github.com/grafana/grafana-aws-sdk/pkg/awsds" - "github.com/grafana/grafana-aws-sdk/pkg/sigv4" "github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/grafana/grafana-plugin-sdk-go/backend/httpclient" ) @@ -16,8 +16,7 @@ func contextualMiddlewares(ctx context.Context) context.Context { sigv4Settings := awsds.ReadSigV4Settings(ctx) if sigv4Settings.Enabled { - authSettings, _ := awsds.ReadAuthSettingsFromContext(ctx) - ctx = httpclient.WithContextualMiddleware(ctx, sigv4.SigV4MiddlewareWithAuthSettings(sigv4Settings.VerboseLogging, *authSettings)) + ctx = httpclient.WithContextualMiddleware(ctx, awsauth.NewSigV4Middleware()) } return ctx From a59ec345c2d33cd463681f0f4560b2e7d7a2d9b5 Mon Sep 17 00:00:00 2001 From: Dana Axinte <53751979+dana-axinte@users.noreply.github.com> Date: Thu, 3 Jul 2025 17:32:18 +0100 Subject: [PATCH 19/19] SecretsManager: Introduce metrics and logs (#107582) Co-authored-by: Michael Mandrus --- .../secret/encryption/manager/manager_test.go | 6 +- .../secret/encryption/manager/test_helpers.go | 2 +- .../secret/secretkeeper/metrics/metrics.go | 71 ++++ .../apis/secret/secretkeeper/secretkeeper.go | 4 +- .../secret/secretkeeper/secretkeeper_test.go | 4 +- .../secret/secretkeeper/sqlkeeper/keeper.go | 23 +- .../secretkeeper/sqlkeeper/keeper_test.go | 4 +- pkg/setting/setting_secrets_manager.go | 7 - .../secret/encryption/data_key_store.go | 10 +- .../secret/encryption/data_key_store_test.go | 2 +- pkg/storage/secret/encryption/metrics.go | 98 +++++ pkg/storage/secret/metadata/keeper_store.go | 48 ++- .../secret/metadata/keeper_store_test.go | 4 +- .../secret/metadata/metrics/metrics.go | 356 ++++++++++++++++++ pkg/storage/secret/metadata/outbox_store.go | 24 ++ .../secret/metadata/outbox_store_test.go | 8 +- .../secret/metadata/secure_value_store.go | 41 +- .../metadata/secure_value_store_test.go | 4 +- pkg/storage/secret/migrator/migrator.go | 4 +- 19 files changed, 685 insertions(+), 35 deletions(-) create mode 100644 pkg/registry/apis/secret/secretkeeper/metrics/metrics.go create mode 100644 pkg/storage/secret/encryption/metrics.go create mode 100644 pkg/storage/secret/metadata/metrics/metrics.go diff --git a/pkg/registry/apis/secret/encryption/manager/manager_test.go b/pkg/registry/apis/secret/encryption/manager/manager_test.go index 15cbaa600c5..e6b5b05ca9b 100644 --- a/pkg/registry/apis/secret/encryption/manager/manager_test.go +++ b/pkg/registry/apis/secret/encryption/manager/manager_test.go @@ -77,7 +77,7 @@ func TestEncryptionService_DataKeys(t *testing.T) { testDB := sqlstore.NewTestStore(t, sqlstore.WithMigrator(migrator.New())) features := featuremgmt.WithFeatures(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, featuremgmt.FlagSecretsManagementAppPlatform) tracer := noop.NewTracerProvider().Tracer("test") - store, err := encryptionstorage.ProvideDataKeyStorage(database.ProvideDatabase(testDB, tracer), tracer, features) + store, err := encryptionstorage.ProvideDataKeyStorage(database.ProvideDatabase(testDB, tracer), tracer, features, nil) require.NoError(t, err) ctx := context.Background() @@ -183,7 +183,7 @@ func TestEncryptionService_UseCurrentProvider(t *testing.T) { features := featuremgmt.WithFeatures(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, featuremgmt.FlagSecretsManagementAppPlatform) testDB := sqlstore.NewTestStore(t, sqlstore.WithMigrator(migrator.New())) tracer := noop.NewTracerProvider().Tracer("test") - encryptionStore, err := encryptionstorage.ProvideDataKeyStorage(database.ProvideDatabase(testDB, tracer), tracer, features) + encryptionStore, err := encryptionstorage.ProvideDataKeyStorage(database.ProvideDatabase(testDB, tracer), tracer, features, nil) require.NoError(t, err) encMgr, err := ProvideEncryptionManager( @@ -374,7 +374,7 @@ func TestIntegration_SecretsService(t *testing.T) { EncryptionProvider: "secretKey.v1", }, } - store, err := encryptionstorage.ProvideDataKeyStorage(database.ProvideDatabase(testDB, tracer), tracer, features) + store, err := encryptionstorage.ProvideDataKeyStorage(database.ProvideDatabase(testDB, tracer), tracer, features, nil) require.NoError(t, err) usageStats := &usagestats.UsageStatsMock{T: t} diff --git a/pkg/registry/apis/secret/encryption/manager/test_helpers.go b/pkg/registry/apis/secret/encryption/manager/test_helpers.go index bfdd4cc7bea..a3958b5df7c 100644 --- a/pkg/registry/apis/secret/encryption/manager/test_helpers.go +++ b/pkg/registry/apis/secret/encryption/manager/test_helpers.go @@ -31,7 +31,7 @@ func setupTestService(tb testing.TB) *EncryptionManager { EncryptionProvider: "secretKey.v1", }, } - store, err := encryptionstorage.ProvideDataKeyStorage(database, tracer, features) + store, err := encryptionstorage.ProvideDataKeyStorage(database, tracer, features, nil) require.NoError(tb, err) usageStats := &usagestats.UsageStatsMock{T: tb} diff --git a/pkg/registry/apis/secret/secretkeeper/metrics/metrics.go b/pkg/registry/apis/secret/secretkeeper/metrics/metrics.go new file mode 100644 index 00000000000..0dc3727c721 --- /dev/null +++ b/pkg/registry/apis/secret/secretkeeper/metrics/metrics.go @@ -0,0 +1,71 @@ +package metrics + +import ( + "github.com/prometheus/client_golang/prometheus" +) + +const ( + namespace = "grafana_secrets_manager" + subsystem = "keeper" +) + +// KeeperMetrics is a struct that contains all the metrics for an implementation of all keepers. +type KeeperMetrics struct { + StoreDuration *prometheus.HistogramVec + UpdateDuration *prometheus.HistogramVec + ExposeDuration *prometheus.HistogramVec + DeleteDuration *prometheus.HistogramVec +} + +func newKeeperMetrics() *KeeperMetrics { + return &KeeperMetrics{ + StoreDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "store_duration_seconds", + Help: "Duration of keeper store operations", + Buckets: prometheus.DefBuckets, + }, []string{"keeper_type"}), + UpdateDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "update_duration_seconds", + Help: "Duration of keeper update operations", + Buckets: prometheus.DefBuckets, + }, []string{"keeper_type"}), + ExposeDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "expose_duration_seconds", + Help: "Duration of keeper expose operations", + Buckets: prometheus.DefBuckets, + }, []string{"keeper_type"}), + DeleteDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "delete_duration_seconds", + Help: "Duration of keeper delete operations", + Buckets: prometheus.DefBuckets, + }, []string{"keeper_type"}), + } +} + +// NewKeeperMetrics creates a new KeeperMetrics struct containing registered metrics +func NewKeeperMetrics(reg prometheus.Registerer) *KeeperMetrics { + m := newKeeperMetrics() + + if reg != nil { + reg.MustRegister( + m.StoreDuration, + m.UpdateDuration, + m.ExposeDuration, + m.DeleteDuration, + ) + } + + return m +} + +func NewTestMetrics() *KeeperMetrics { + return newKeeperMetrics() +} diff --git a/pkg/registry/apis/secret/secretkeeper/secretkeeper.go b/pkg/registry/apis/secret/secretkeeper/secretkeeper.go index 3a580728f50..9cb1a4ec495 100644 --- a/pkg/registry/apis/secret/secretkeeper/secretkeeper.go +++ b/pkg/registry/apis/secret/secretkeeper/secretkeeper.go @@ -6,6 +6,7 @@ import ( secretv0alpha1 "github.com/grafana/grafana/pkg/apis/secret/v0alpha1" "github.com/grafana/grafana/pkg/registry/apis/secret/contracts" "github.com/grafana/grafana/pkg/registry/apis/secret/secretkeeper/sqlkeeper" + "github.com/prometheus/client_golang/prometheus" ) // OSSKeeperService is the OSS implementation of the Service interface. @@ -19,10 +20,11 @@ func ProvideService( tracer trace.Tracer, store contracts.EncryptedValueStorage, encryptionManager contracts.EncryptionManager, + reg prometheus.Registerer, ) (*OSSKeeperService, error) { return &OSSKeeperService{ // TODO: rename to system keeper or something like that - systemKeeper: sqlkeeper.NewSQLKeeper(tracer, encryptionManager, store), + systemKeeper: sqlkeeper.NewSQLKeeper(tracer, encryptionManager, store, reg), }, nil } diff --git a/pkg/registry/apis/secret/secretkeeper/secretkeeper_test.go b/pkg/registry/apis/secret/secretkeeper/secretkeeper_test.go index d2c5aea98d4..f202babab8d 100644 --- a/pkg/registry/apis/secret/secretkeeper/secretkeeper_test.go +++ b/pkg/registry/apis/secret/secretkeeper/secretkeeper_test.go @@ -49,7 +49,7 @@ func setupTestService(t *testing.T, cfg *setting.Cfg) (*OSSKeeperService, error) database := database.ProvideDatabase(testDB, tracer) features := featuremgmt.WithFeatures(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, featuremgmt.FlagSecretsManagementAppPlatform) - dataKeyStore, err := encryptionstorage.ProvideDataKeyStorage(database, tracer, features) + dataKeyStore, err := encryptionstorage.ProvideDataKeyStorage(database, tracer, features, nil) require.NoError(t, err) encValueStore, err := encryptionstorage.ProvideEncryptedValueStorage(database, tracer, features) @@ -59,7 +59,7 @@ func setupTestService(t *testing.T, cfg *setting.Cfg) (*OSSKeeperService, error) require.NoError(t, err) // Initialize the keeper service - keeperService, err := ProvideService(tracer, encValueStore, encryptionManager) + keeperService, err := ProvideService(tracer, encValueStore, encryptionManager, nil) return keeperService, err } diff --git a/pkg/registry/apis/secret/secretkeeper/sqlkeeper/keeper.go b/pkg/registry/apis/secret/secretkeeper/sqlkeeper/keeper.go index 04caae1237a..30656bb8e65 100644 --- a/pkg/registry/apis/secret/secretkeeper/sqlkeeper/keeper.go +++ b/pkg/registry/apis/secret/secretkeeper/sqlkeeper/keeper.go @@ -3,9 +3,12 @@ package sqlkeeper import ( "context" "fmt" + "time" secretv0alpha1 "github.com/grafana/grafana/pkg/apis/secret/v0alpha1" "github.com/grafana/grafana/pkg/registry/apis/secret/contracts" + "github.com/grafana/grafana/pkg/registry/apis/secret/secretkeeper/metrics" + "github.com/prometheus/client_golang/prometheus" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" ) @@ -14,6 +17,7 @@ type SQLKeeper struct { tracer trace.Tracer encryptionManager contracts.EncryptionManager store contracts.EncryptedValueStorage + metrics *metrics.KeeperMetrics } var _ contracts.Keeper = (*SQLKeeper)(nil) @@ -22,19 +26,21 @@ func NewSQLKeeper( tracer trace.Tracer, encryptionManager contracts.EncryptionManager, store contracts.EncryptedValueStorage, + reg prometheus.Registerer, ) *SQLKeeper { return &SQLKeeper{ tracer: tracer, encryptionManager: encryptionManager, store: store, + metrics: metrics.NewKeeperMetrics(reg), } } -// TODO: parameter cfg is not being used -func (s *SQLKeeper) Store(ctx context.Context, _ secretv0alpha1.KeeperConfig, namespace string, exposedValueOrRef string) (contracts.ExternalID, error) { +func (s *SQLKeeper) Store(ctx context.Context, cfg secretv0alpha1.KeeperConfig, namespace string, exposedValueOrRef string) (contracts.ExternalID, error) { ctx, span := s.tracer.Start(ctx, "SQLKeeper.Store", trace.WithAttributes(attribute.String("namespace", namespace))) defer span.End() + start := time.Now() encryptedData, err := s.encryptionManager.Encrypt(ctx, namespace, []byte(exposedValueOrRef)) if err != nil { return "", fmt.Errorf("unable to encrypt value: %w", err) @@ -45,8 +51,8 @@ func (s *SQLKeeper) Store(ctx context.Context, _ secretv0alpha1.KeeperConfig, na return "", fmt.Errorf("unable to store encrypted value: %w", err) } + s.metrics.StoreDuration.WithLabelValues(string(cfg.Type())).Observe(time.Since(start).Seconds()) externalID := contracts.ExternalID(encryptedVal.UID) - span.SetAttributes(attribute.String("externalID", externalID.String())) return externalID, nil @@ -59,6 +65,7 @@ func (s *SQLKeeper) Expose(ctx context.Context, cfg secretv0alpha1.KeeperConfig, )) defer span.End() + start := time.Now() encryptedValue, err := s.store.Get(ctx, namespace, externalID.String()) if err != nil { return "", fmt.Errorf("unable to get encrypted value: %w", err) @@ -70,6 +77,8 @@ func (s *SQLKeeper) Expose(ctx context.Context, cfg secretv0alpha1.KeeperConfig, } exposedValue := secretv0alpha1.NewExposedSecureValue(string(exposedBytes)) + s.metrics.ExposeDuration.WithLabelValues(string(cfg.Type())).Observe(time.Since(start).Seconds()) + return exposedValue, nil } @@ -80,10 +89,14 @@ func (s *SQLKeeper) Delete(ctx context.Context, cfg secretv0alpha1.KeeperConfig, )) defer span.End() + start := time.Now() err := s.store.Delete(ctx, namespace, externalID.String()) if err != nil { return fmt.Errorf("failed to delete encrypted value: %w", err) } + + s.metrics.DeleteDuration.WithLabelValues(string(cfg.Type())).Observe(time.Since(start).Seconds()) + return nil } @@ -94,6 +107,7 @@ func (s *SQLKeeper) Update(ctx context.Context, cfg secretv0alpha1.KeeperConfig, )) defer span.End() + start := time.Now() encryptedData, err := s.encryptionManager.Encrypt(ctx, namespace, []byte(exposedValueOrRef)) if err != nil { return fmt.Errorf("unable to encrypt value: %w", err) @@ -103,5 +117,8 @@ func (s *SQLKeeper) Update(ctx context.Context, cfg secretv0alpha1.KeeperConfig, if err != nil { return fmt.Errorf("failed to update encrypted value: %w", err) } + + s.metrics.UpdateDuration.WithLabelValues(string(cfg.Type())).Observe(time.Since(start).Seconds()) + return nil } diff --git a/pkg/registry/apis/secret/secretkeeper/sqlkeeper/keeper_test.go b/pkg/registry/apis/secret/secretkeeper/sqlkeeper/keeper_test.go index 500d04bdf0e..fa9aa7a6ba5 100644 --- a/pkg/registry/apis/secret/secretkeeper/sqlkeeper/keeper_test.go +++ b/pkg/registry/apis/secret/secretkeeper/sqlkeeper/keeper_test.go @@ -159,7 +159,7 @@ func setupTestService(t *testing.T, cfg *setting.Cfg) (*SQLKeeper, error) { features := featuremgmt.WithFeatures(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, featuremgmt.FlagSecretsManagementAppPlatform) // Initialize the encryption manager - dataKeyStore, err := encryptionstorage.ProvideDataKeyStorage(database, tracer, features) + dataKeyStore, err := encryptionstorage.ProvideDataKeyStorage(database, tracer, features, nil) require.NoError(t, err) usageStats := &usagestats.UsageStatsMock{T: t} @@ -178,7 +178,7 @@ func setupTestService(t *testing.T, cfg *setting.Cfg) (*SQLKeeper, error) { require.NoError(t, err) // Initialize the SQLKeeper - sqlKeeper := NewSQLKeeper(tracer, encMgr, encValueStore) + sqlKeeper := NewSQLKeeper(tracer, encMgr, encValueStore, nil) return sqlKeeper, nil } diff --git a/pkg/setting/setting_secrets_manager.go b/pkg/setting/setting_secrets_manager.go index f52021a9ebf..f8a3b186e53 100644 --- a/pkg/setting/setting_secrets_manager.go +++ b/pkg/setting/setting_secrets_manager.go @@ -2,17 +2,10 @@ package setting import ( "regexp" - "time" "github.com/grafana/grafana/pkg/services/kmsproviders" ) -type EncryptionSettings struct { - DataKeysCacheTTL time.Duration - DataKeysCleanupInterval time.Duration - Algorithm string -} - type SecretsManagerSettings struct { SecretKey string EncryptionProvider string diff --git a/pkg/storage/secret/encryption/data_key_store.go b/pkg/storage/secret/encryption/data_key_store.go index c38c4ce1153..78c2bf63910 100644 --- a/pkg/storage/secret/encryption/data_key_store.go +++ b/pkg/storage/secret/encryption/data_key_store.go @@ -9,6 +9,7 @@ import ( "github.com/grafana/grafana/pkg/registry/apis/secret/contracts" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate" + "github.com/prometheus/client_golang/prometheus" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" ) @@ -19,9 +20,15 @@ type encryptionStoreImpl struct { dialect sqltemplate.Dialect tracer trace.Tracer log log.Logger + metrics *DataKeyMetrics } -func ProvideDataKeyStorage(db contracts.Database, tracer trace.Tracer, features featuremgmt.FeatureToggles) (contracts.DataKeyStorage, error) { +func ProvideDataKeyStorage( + db contracts.Database, + tracer trace.Tracer, + features featuremgmt.FeatureToggles, + registerer prometheus.Registerer, +) (contracts.DataKeyStorage, error) { if !features.IsEnabledGlobally(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs) || !features.IsEnabledGlobally(featuremgmt.FlagSecretsManagementAppPlatform) { return &encryptionStoreImpl{}, nil @@ -32,6 +39,7 @@ func ProvideDataKeyStorage(db contracts.Database, tracer trace.Tracer, features dialect: sqltemplate.DialectForDriver(db.DriverName()), tracer: tracer, log: log.New("encryption.store"), + metrics: NewDataKeyMetrics(registerer), } return store, nil diff --git a/pkg/storage/secret/encryption/data_key_store_test.go b/pkg/storage/secret/encryption/data_key_store_test.go index 450577f4584..4f2d52d3387 100644 --- a/pkg/storage/secret/encryption/data_key_store_test.go +++ b/pkg/storage/secret/encryption/data_key_store_test.go @@ -31,7 +31,7 @@ func TestEncryptionStoreImpl_DataKeyLifecycle(t *testing.T) { testDB := sqlstore.NewTestStore(t, sqlstore.WithMigrator(migrator.New())) tracer := noop.NewTracerProvider().Tracer("test") features := featuremgmt.WithFeatures(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, featuremgmt.FlagSecretsManagementAppPlatform) - store, err := ProvideDataKeyStorage(database.ProvideDatabase(testDB, tracer), tracer, features) + store, err := ProvideDataKeyStorage(database.ProvideDatabase(testDB, tracer), tracer, features, nil) require.NoError(t, err) ctx := context.Background() diff --git a/pkg/storage/secret/encryption/metrics.go b/pkg/storage/secret/encryption/metrics.go new file mode 100644 index 00000000000..a7a116541ce --- /dev/null +++ b/pkg/storage/secret/encryption/metrics.go @@ -0,0 +1,98 @@ +package encryption + +import ( + "github.com/prometheus/client_golang/prometheus" +) + +const ( + namespace = "grafana_secrets_manager" + subsystem = "data_key_storage" +) + +// DataKeyMetrics is a struct that contains all the metrics for all operations of encryption storage. +type DataKeyMetrics struct { + CreateDataKeyDuration prometheus.Histogram + GetDataKeyDuration prometheus.Histogram + GetCurrentDataKeyDuration prometheus.Histogram + GetAllDataKeysDuration prometheus.Histogram + DisableDataKeysDuration prometheus.Histogram + DeleteDataKeyDuration prometheus.Histogram + ReEncryptDataKeysDuration prometheus.Histogram +} + +func newDataKeyMetrics() *DataKeyMetrics { + return &DataKeyMetrics{ + CreateDataKeyDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "create_data_key_duration_seconds", + Help: "Duration of create data key operations", + Buckets: prometheus.DefBuckets, + }), + GetDataKeyDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "get_data_key_duration_seconds", + Help: "Duration of get data key operations", + Buckets: prometheus.DefBuckets, + }), + GetCurrentDataKeyDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "get_current_data_key_duration_seconds", + Help: "Duration of get current data key operations", + Buckets: prometheus.DefBuckets, + }), + GetAllDataKeysDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "get_all_data_keys_duration_seconds", + Help: "Duration of get all data keys operations", + Buckets: prometheus.DefBuckets, + }), + DisableDataKeysDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "disable_data_keys_duration_seconds", + Help: "Duration of disable data keys operations", + Buckets: prometheus.DefBuckets, + }), + DeleteDataKeyDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "delete_data_key_duration_seconds", + Help: "Duration of delete data key operations", + Buckets: prometheus.DefBuckets, + }), + ReEncryptDataKeysDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "re_encrypt_data_keys_duration_seconds", + Help: "Duration of re-encrypt data keys operations", + Buckets: prometheus.DefBuckets, + }), + } +} + +// NewDataKeyMetrics returns a singleton instance of the SecretsMetrics struct containing registered metrics +func NewDataKeyMetrics(reg prometheus.Registerer) *DataKeyMetrics { + m := newDataKeyMetrics() + + if reg != nil { + reg.MustRegister( + m.CreateDataKeyDuration, + m.GetDataKeyDuration, + m.GetCurrentDataKeyDuration, + m.GetAllDataKeysDuration, + m.DisableDataKeysDuration, + m.DeleteDataKeyDuration, + m.ReEncryptDataKeysDuration, + ) + } + + return m +} + +func NewTestMetrics() *DataKeyMetrics { + return newDataKeyMetrics() +} diff --git a/pkg/storage/secret/metadata/keeper_store.go b/pkg/storage/secret/metadata/keeper_store.go index 89b115eef2c..defc9974125 100644 --- a/pkg/storage/secret/metadata/keeper_store.go +++ b/pkg/storage/secret/metadata/keeper_store.go @@ -3,12 +3,15 @@ package metadata import ( "context" "fmt" + "time" secretv0alpha1 "github.com/grafana/grafana/pkg/apis/secret/v0alpha1" "github.com/grafana/grafana/pkg/registry/apis/secret/contracts" "github.com/grafana/grafana/pkg/registry/apis/secret/xkube" "github.com/grafana/grafana/pkg/services/featuremgmt" + "github.com/grafana/grafana/pkg/storage/secret/metadata/metrics" "github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate" + "github.com/prometheus/client_golang/prometheus" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" @@ -19,11 +22,17 @@ type keeperMetadataStorage struct { db contracts.Database dialect sqltemplate.Dialect tracer trace.Tracer + metrics *metrics.StorageMetrics } var _ contracts.KeeperMetadataStorage = (*keeperMetadataStorage)(nil) -func ProvideKeeperMetadataStorage(db contracts.Database, tracer trace.Tracer, features featuremgmt.FeatureToggles) (contracts.KeeperMetadataStorage, error) { +func ProvideKeeperMetadataStorage( + db contracts.Database, + tracer trace.Tracer, + features featuremgmt.FeatureToggles, + reg prometheus.Registerer, +) (contracts.KeeperMetadataStorage, error) { if !features.IsEnabledGlobally(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs) || !features.IsEnabledGlobally(featuremgmt.FlagSecretsManagementAppPlatform) { return &keeperMetadataStorage{}, nil @@ -33,10 +42,12 @@ func ProvideKeeperMetadataStorage(db contracts.Database, tracer trace.Tracer, fe db: db, dialect: sqltemplate.DialectForDriver(db.DriverName()), tracer: tracer, + metrics: metrics.NewStorageMetrics(reg), }, nil } func (s *keeperMetadataStorage) Create(ctx context.Context, keeper *secretv0alpha1.Keeper, actorUID string) (*secretv0alpha1.Keeper, error) { + start := time.Now() ctx, span := s.tracer.Start(ctx, "KeeperMetadataStorage.Create", trace.WithAttributes( attribute.String("name", keeper.GetName()), attribute.String("namespace", keeper.GetNamespace()), @@ -53,7 +64,6 @@ func (s *keeperMetadataStorage) Create(ctx context.Context, keeper *secretv0alph SQLTemplate: sqltemplate.New(s.dialect), Row: row, } - query, err := sqltemplate.Execute(sqlKeeperCreate, req) if err != nil { return nil, fmt.Errorf("execute template %q: %w", sqlKeeperCreate.Name(), err) @@ -65,6 +75,11 @@ func (s *keeperMetadataStorage) Create(ctx context.Context, keeper *secretv0alph return err } + // Validate before inserting that any `secureValues` referenced exist and do not reference other third-party keepers. + if err := s.validateSecureValueReferences(ctx, keeper); err != nil { + return err + } + result, err := s.db.ExecContext(ctx, query, req.GetArgs()...) if err != nil { return fmt.Errorf("inserting row: %w", err) @@ -90,10 +105,14 @@ func (s *keeperMetadataStorage) Create(ctx context.Context, keeper *secretv0alph return nil, fmt.Errorf("failed to convert to kubernetes object: %w", err) } + s.metrics.KeeperMetadataCreateDuration.WithLabelValues(string(createdKeeper.Spec.GetType())).Observe(time.Since(start).Seconds()) + s.metrics.KeeperMetadataCreateCount.WithLabelValues(string(createdKeeper.Spec.GetType())).Inc() + return createdKeeper, nil } func (s *keeperMetadataStorage) Read(ctx context.Context, namespace xkube.Namespace, name string, opts contracts.ReadOpts) (*secretv0alpha1.Keeper, error) { + start := time.Now() ctx, span := s.tracer.Start(ctx, "KeeperMetadataStorage.Read", trace.WithAttributes( attribute.String("name", name), attribute.String("namespace", namespace.String()), @@ -111,6 +130,9 @@ func (s *keeperMetadataStorage) Read(ctx context.Context, namespace xkube.Namesp return nil, fmt.Errorf("failed to convert to kubernetes object: %w", err) } + s.metrics.KeeperMetadataGetDuration.WithLabelValues(string(keeper.Spec.GetType())).Observe(time.Since(start).Seconds()) + s.metrics.KeeperMetadataGetCount.WithLabelValues(string(keeper.Spec.GetType())).Inc() + return keeper, nil } @@ -153,6 +175,7 @@ func (s *keeperMetadataStorage) read(ctx context.Context, namespace, name string } func (s *keeperMetadataStorage) Update(ctx context.Context, newKeeper *secretv0alpha1.Keeper, actorUID string) (*secretv0alpha1.Keeper, error) { + start := time.Now() ctx, span := s.tracer.Start(ctx, "KeeperMetadataStorage.Update", trace.WithAttributes( attribute.String("name", newKeeper.GetName()), attribute.String("namespace", newKeeper.GetNamespace()), @@ -168,6 +191,11 @@ func (s *keeperMetadataStorage) Update(ctx context.Context, newKeeper *secretv0a return err } + // Validate before updating that any `secureValues` referenced exists and does not reference other third-party keepers. + if err := s.validateSecureValueReferences(ctx, newKeeper); err != nil { + return err + } + // Read old value first. oldKeeperRow, err := s.read(ctx, newKeeper.Namespace, newKeeper.Name, contracts.ReadOpts{ForUpdate: true}) if err != nil { @@ -217,10 +245,14 @@ func (s *keeperMetadataStorage) Update(ctx context.Context, newKeeper *secretv0a return nil, fmt.Errorf("failed to convert to kubernetes object: %w", err) } + s.metrics.KeeperMetadataUpdateDuration.WithLabelValues(string(keeper.Spec.GetType())).Observe(time.Since(start).Seconds()) + s.metrics.KeeperMetadataUpdateCount.WithLabelValues(string(keeper.Spec.GetType())).Inc() + return keeper, nil } func (s *keeperMetadataStorage) Delete(ctx context.Context, namespace xkube.Namespace, name string) error { + start := time.Now() ctx, span := s.tracer.Start(ctx, "KeeperMetadataStorage.Delete", trace.WithAttributes( attribute.String("name", name), attribute.String("namespace", namespace.String()), @@ -253,10 +285,14 @@ func (s *keeperMetadataStorage) Delete(ctx context.Context, namespace xkube.Name return fmt.Errorf("expected 1 row affected, got %d for %s on %s", rowsAffected, name, namespace) } + s.metrics.KeeperMetadataDeleteDuration.Observe(time.Since(start).Seconds()) + s.metrics.KeeperMetadataDeleteCount.Inc() + return nil } func (s *keeperMetadataStorage) List(ctx context.Context, namespace xkube.Namespace) (keeperList []secretv0alpha1.Keeper, err error) { + start := time.Now() ctx, span := s.tracer.Start(ctx, "KeeperMetadataStorage.List", trace.WithAttributes( attribute.String("namespace", namespace.String()), )) @@ -306,6 +342,9 @@ func (s *keeperMetadataStorage) List(ctx context.Context, namespace xkube.Namesp return nil, fmt.Errorf("read rows error: %w", err) } + s.metrics.KeeperMetadataListDuration.Observe(time.Since(start).Seconds()) + s.metrics.KeeperMetadataListCount.Inc() + return keepers, nil } @@ -467,9 +506,10 @@ func (s *keeperMetadataStorage) GetKeeperConfig(ctx context.Context, namespace s // Check if keeper is the systemwide one. if name == nil { - return nil, nil + return &secretv0alpha1.SystemKeeperConfig{}, nil } + start := time.Now() span.SetAttributes(attribute.String("name", *name)) // Load keeper config from metadata store, or TODO: keeper cache. @@ -480,6 +520,8 @@ func (s *keeperMetadataStorage) GetKeeperConfig(ctx context.Context, namespace s keeperConfig := toProvider(secretv0alpha1.KeeperType(kp.Type), kp.Payload) + s.metrics.KeeperMetadataGetKeeperConfigDuration.Observe(time.Since(start).Seconds()) + // TODO: this would be a good place to check if credentials are secure values and load them. return keeperConfig, nil } diff --git a/pkg/storage/secret/metadata/keeper_store_test.go b/pkg/storage/secret/metadata/keeper_store_test.go index a2165d5273f..644b3ccf714 100644 --- a/pkg/storage/secret/metadata/keeper_store_test.go +++ b/pkg/storage/secret/metadata/keeper_store_test.go @@ -40,7 +40,7 @@ func Test_KeeperMetadataStorage_GetKeeperConfig(t *testing.T) { // get system keeper config keeperConfig, err := keeperMetadataStorage.GetKeeperConfig(ctx, defaultKeeperNS, nil, contracts.ReadOpts{}) require.NoError(t, err) - require.Nil(t, keeperConfig) + require.IsType(t, &secretv0alpha1.SystemKeeperConfig{}, keeperConfig) }) t.Run("get test keeper config", func(t *testing.T) { @@ -340,7 +340,7 @@ func initStorage(t *testing.T) contracts.KeeperMetadataStorage { features := featuremgmt.WithFeatures(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, featuremgmt.FlagSecretsManagementAppPlatform) // Initialize the keeper storage - keeperMetadataStorage, err := ProvideKeeperMetadataStorage(db, tracer, features) + keeperMetadataStorage, err := ProvideKeeperMetadataStorage(db, tracer, features, nil) require.NoError(t, err) return keeperMetadataStorage } diff --git a/pkg/storage/secret/metadata/metrics/metrics.go b/pkg/storage/secret/metadata/metrics/metrics.go new file mode 100644 index 00000000000..bffbaebc604 --- /dev/null +++ b/pkg/storage/secret/metadata/metrics/metrics.go @@ -0,0 +1,356 @@ +package metrics + +import ( + "sync" + + "github.com/prometheus/client_golang/prometheus" +) + +const ( + namespace = "grafana_secrets_manager" + subsystem = "storage" +) + +// StorageMetrics is a struct that contains all the metrics for all operations of secrets storage. +type StorageMetrics struct { + OutboxAppendDuration *prometheus.HistogramVec + OutboxReceiveDuration prometheus.Histogram + OutboxAppendCount *prometheus.CounterVec + OutboxReceiveCount prometheus.Counter + OutboxDeleteDuration prometheus.Histogram + OutboxDeleteCount prometheus.Counter + OutboxIncrementReceiveCountDuration prometheus.Histogram + OutboxIncrementReceiveCountCount prometheus.Counter + OutboxTotalMessageLifetimeDuration *prometheus.HistogramVec + + KeeperMetadataCreateDuration *prometheus.HistogramVec + KeeperMetadataCreateCount *prometheus.CounterVec + KeeperMetadataUpdateDuration *prometheus.HistogramVec + KeeperMetadataUpdateCount *prometheus.CounterVec + KeeperMetadataDeleteDuration prometheus.Histogram + KeeperMetadataDeleteCount prometheus.Counter + KeeperMetadataGetDuration *prometheus.HistogramVec + KeeperMetadataGetCount *prometheus.CounterVec + KeeperMetadataListDuration prometheus.Histogram + KeeperMetadataListCount prometheus.Counter + KeeperMetadataGetKeeperConfigDuration prometheus.Histogram + + SecureValueMetadataCreateDuration prometheus.Histogram + SecureValueMetadataCreateCount prometheus.Counter + SecureValueMetadataUpdateDuration prometheus.Histogram + SecureValueMetadataUpdateCount prometheus.Counter + SecureValueMetadataDeleteDuration prometheus.Histogram + SecureValueMetadataDeleteCount prometheus.Counter + SecureValueMetadataGetDuration prometheus.Histogram + SecureValueMetadataGetCount prometheus.Counter + SecureValueMetadataListDuration prometheus.Histogram + SecureValueMetadataListCount prometheus.Counter + SecureValueGetForDecryptDuration prometheus.Histogram + SecureValueSetExternalIDDuration prometheus.Histogram + SecureValueSetStatusDuration prometheus.Histogram + + DecryptDuration *prometheus.HistogramVec + DecryptRequestCount *prometheus.CounterVec +} + +func newStorageMetrics() *StorageMetrics { + return &StorageMetrics{ + // Outbox metrics + OutboxAppendDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "outbox_append_duration_seconds", + Help: "Duration of outbox message append operations", + Buckets: prometheus.DefBuckets, + }, []string{"message_type"}), + OutboxAppendCount: prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "outbox_append_count", + Help: "Count of outbox message append operations", + }, []string{"message_type"}), + OutboxReceiveDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "outbox_receive_duration_seconds", + Help: "Duration of outbox message receive operations", + Buckets: prometheus.DefBuckets, + }), + OutboxReceiveCount: prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "outbox_receive_count", + Help: "Count of outbox message receive operations", + }), + OutboxDeleteDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "outbox_delete_duration_seconds", + Help: "Duration of outbox message delete operations", + Buckets: prometheus.DefBuckets, + }), + OutboxDeleteCount: prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "outbox_delete_count", + Help: "Count of outbox message delete operations", + }), + OutboxIncrementReceiveCountDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "outbox_increment_receive_count_duration_seconds", + Help: "Duration of outbox message increment receive count operations", + Buckets: prometheus.DefBuckets, + }), + OutboxIncrementReceiveCountCount: prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "outbox_increment_receive_count_count", + Help: "Count of outbox message increment receive count operations", + }), + OutboxTotalMessageLifetimeDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "outbox_total_message_lifetime_duration_seconds", + Help: "Total duration of outbox message lifetime", + Buckets: prometheus.DefBuckets, + }, []string{"message_type"}), + + // Keeper metrics + KeeperMetadataCreateDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "keeper_metadata_create_duration_seconds", + Help: "Duration of keeper metadata create operations", + Buckets: prometheus.DefBuckets, + }, []string{"keeper_type"}), + KeeperMetadataCreateCount: prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "keeper_metadata_create_count", + Help: "Count of keeper metadata create operations", + }, []string{"keeper_type"}), + KeeperMetadataUpdateDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "keeper_metadata_update_duration_seconds", + Help: "Duration of keeper metadata update operations", + Buckets: prometheus.DefBuckets, + }, []string{"keeper_type"}), + KeeperMetadataUpdateCount: prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "keeper_metadata_update_count", + Help: "Count of keeper metadata update operations", + }, []string{"keeper_type"}), + KeeperMetadataDeleteDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "keeper_metadata_delete_duration_seconds", + Help: "Duration of keeper metadata delete operations", + Buckets: prometheus.DefBuckets, + }), + KeeperMetadataDeleteCount: prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "keeper_metadata_delete_count", + Help: "Count of keeper metadata delete operations", + }), + KeeperMetadataGetDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "keeper_metadata_get_duration_seconds", + Help: "Duration of keeper metadata get operations", + Buckets: prometheus.DefBuckets, + }, []string{"keeper_type"}), + KeeperMetadataGetCount: prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "keeper_metadata_get_count", + Help: "Count of keeper metadata get operations", + }, []string{"keeper_type"}), + KeeperMetadataListDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "keeper_metadata_list_duration_seconds", + Help: "Duration of keeper metadata list operations", + Buckets: prometheus.DefBuckets, + }), + KeeperMetadataListCount: prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "keeper_metadata_list_count", + Help: "Count of keeper metadata list operations", + }), + KeeperMetadataGetKeeperConfigDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "keeper_metadata_get_keeper_config_duration_seconds", + Help: "Duration of keeper metadata get keeper config operations", + Buckets: prometheus.DefBuckets, + }), + + // Secure value metrics + SecureValueMetadataCreateDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "secure_value_metadata_create_duration_seconds", + Help: "Duration of secure value metadata create operations", + Buckets: prometheus.DefBuckets, + }), + SecureValueMetadataCreateCount: prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "secure_value_metadata_create_count", + Help: "Count of secure value metadata create operations", + }), + SecureValueMetadataUpdateDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "secure_value_metadata_update_duration_seconds", + Help: "Duration of secure value metadata update operations", + Buckets: prometheus.DefBuckets, + }), + SecureValueMetadataUpdateCount: prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "secure_value_metadata_update_count", + Help: "Count of secure value metadata update operations", + }), + SecureValueMetadataDeleteDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "secure_value_metadata_delete_duration_seconds", + Help: "Duration of secure value metadata delete operations", + Buckets: prometheus.DefBuckets, + }), + SecureValueMetadataDeleteCount: prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "secure_value_metadata_delete_count", + Help: "Count of secure value metadata delete operations", + }), + SecureValueMetadataGetDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "secure_value_metadata_get_duration_seconds", + Help: "Duration of secure value metadata get operations", + Buckets: prometheus.DefBuckets, + }), + SecureValueMetadataGetCount: prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "secure_value_metadata_get_count", + Help: "Count of secure value metadata get operations", + }), + SecureValueMetadataListDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "secure_value_metadata_list_duration_seconds", + Help: "Duration of secure value metadata list operations", + Buckets: prometheus.DefBuckets, + }), + SecureValueMetadataListCount: prometheus.NewCounter(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "secure_value_metadata_list_count", + Help: "Count of secure value metadata list operations", + }), + SecureValueGetForDecryptDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "secure_value_get_for_decrypt_duration_seconds", + Help: "Duration of secure value get for decrypt operations", + Buckets: prometheus.DefBuckets, + }), + SecureValueSetExternalIDDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "secure_value_set_external_id_duration_seconds", + Help: "Duration of secure value set external id operations", + Buckets: prometheus.DefBuckets, + }), + SecureValueSetStatusDuration: prometheus.NewHistogram(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "secure_value_set_status_duration_seconds", + Help: "Duration of secure value set status operations", + Buckets: prometheus.DefBuckets, + }), + + // Decrypt metrics + DecryptDuration: prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "decrypt_duration_seconds", + Help: "Duration of decrypt operations", + Buckets: prometheus.DefBuckets, + }, []string{"successful"}), + DecryptRequestCount: prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "decrypt_request_count", + Help: "Count of decrypt operations", + }, []string{"successful"}), + } +} + +var ( + initOnce sync.Once + metricsInstance *StorageMetrics +) + +// NewStorageMetrics returns a singleton instance of the SecretsMetrics struct containing registered metrics +func NewStorageMetrics(reg prometheus.Registerer) *StorageMetrics { + initOnce.Do(func() { + m := newStorageMetrics() + + if reg != nil { + reg.MustRegister( + m.OutboxAppendDuration, + m.OutboxAppendCount, + m.OutboxReceiveDuration, + m.OutboxReceiveCount, + m.OutboxDeleteDuration, + m.OutboxDeleteCount, + m.OutboxIncrementReceiveCountDuration, + m.OutboxIncrementReceiveCountCount, + m.OutboxTotalMessageLifetimeDuration, + m.KeeperMetadataCreateDuration, + m.KeeperMetadataCreateCount, + m.KeeperMetadataUpdateDuration, + m.KeeperMetadataUpdateCount, + m.KeeperMetadataDeleteDuration, + m.KeeperMetadataDeleteCount, + m.KeeperMetadataGetDuration, + m.KeeperMetadataGetCount, + m.KeeperMetadataListDuration, + m.KeeperMetadataListCount, + m.KeeperMetadataGetKeeperConfigDuration, + m.SecureValueMetadataCreateDuration, + m.SecureValueMetadataCreateCount, + m.SecureValueMetadataUpdateDuration, + m.SecureValueMetadataUpdateCount, + m.SecureValueMetadataDeleteDuration, + m.SecureValueMetadataDeleteCount, + m.SecureValueMetadataGetDuration, + m.SecureValueMetadataGetCount, + m.SecureValueMetadataListDuration, + m.SecureValueMetadataListCount, + m.SecureValueGetForDecryptDuration, + m.SecureValueSetExternalIDDuration, + m.SecureValueSetStatusDuration, + m.DecryptDuration, + m.DecryptRequestCount, + ) + } + + metricsInstance = m + }) + + return metricsInstance +} + +func NewTestMetrics() *StorageMetrics { + return newStorageMetrics() +} diff --git a/pkg/storage/secret/metadata/outbox_store.go b/pkg/storage/secret/metadata/outbox_store.go index bfc01bb1444..1f183b7882b 100644 --- a/pkg/storage/secret/metadata/outbox_store.go +++ b/pkg/storage/secret/metadata/outbox_store.go @@ -6,7 +6,9 @@ import ( "fmt" "time" + "github.com/grafana/grafana/pkg/storage/secret/metadata/metrics" unifiedsql "github.com/grafana/grafana/pkg/storage/unified/sql" + "github.com/prometheus/client_golang/prometheus" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" @@ -20,15 +22,18 @@ type outboxStore struct { db contracts.Database dialect sqltemplate.Dialect tracer trace.Tracer + metrics *metrics.StorageMetrics } func ProvideOutboxQueue( db contracts.Database, tracer trace.Tracer, + reg prometheus.Registerer, ) contracts.OutboxQueue { return &outboxStore{ db: db, dialect: sqltemplate.DialectForDriver(db.DriverName()), + metrics: metrics.NewStorageMetrics(reg), tracer: tracer, } } @@ -47,6 +52,7 @@ type outboxMessageDB struct { } func (s *outboxStore) Append(ctx context.Context, input contracts.AppendOutboxMessage) (messageID int64, err error) { + start := time.Now() ctx, span := s.tracer.Start(ctx, "outboxStore.Append", trace.WithAttributes( attribute.String("name", input.Name), attribute.String("namespace", input.Namespace), @@ -73,6 +79,9 @@ func (s *outboxStore) Append(ctx context.Context, input contracts.AppendOutboxMe return messageID, fmt.Errorf("inserting message into outbox table: %+w", err) } + s.metrics.OutboxAppendDuration.WithLabelValues(string(input.Type)).Observe(time.Since(start).Seconds()) + s.metrics.OutboxAppendCount.WithLabelValues(string(input.Type)).Inc() + return messageID, nil } @@ -147,6 +156,7 @@ func (s *outboxStore) insertMessage(ctx context.Context, input contracts.AppendO } func (s *outboxStore) ReceiveN(ctx context.Context, limit uint) ([]contracts.OutboxMessage, error) { + start := time.Now() messageIDs, err := s.fetchMessageIdsInQueue(ctx, limit) if err != nil { return nil, fmt.Errorf("fetching message ids from queue: %w", err) @@ -223,6 +233,9 @@ func (s *outboxStore) ReceiveN(ctx context.Context, limit uint) ([]contracts.Out return messages, fmt.Errorf("reading rows: %w", err) } + s.metrics.OutboxReceiveDuration.Observe(time.Since(start).Seconds()) + s.metrics.OutboxReceiveCount.Add(float64(len(messages))) + return messages, nil } @@ -275,10 +288,14 @@ func (s *outboxStore) Delete(ctx context.Context, messageID int64) (err error) { assert.True(messageID != 0, "outboxStore.Delete: messageID is required") + start := time.Now() if err := s.deleteMessage(ctx, messageID); err != nil { return fmt.Errorf("deleting message from outbox table %+w", err) } + s.metrics.OutboxDeleteDuration.Observe(time.Since(start).Seconds()) + s.metrics.OutboxDeleteCount.Inc() + return nil } @@ -320,6 +337,9 @@ func (s *outboxStore) deleteMessage(ctx context.Context, messageID int64) error return fmt.Errorf("rows error: %w", err) } + totalLifetime := time.Since(time.UnixMilli(timestamp)) + s.metrics.OutboxTotalMessageLifetimeDuration.WithLabelValues(messageType).Observe(totalLifetime.Seconds()) + // Then delete the object delReq := deleteSecureValueOutbox{ SQLTemplate: sqltemplate.New(s.dialect), @@ -359,6 +379,7 @@ func (s *outboxStore) IncrementReceiveCount(ctx context.Context, messageIDs []in MessageIDs: messageIDs, } + start := time.Now() query, err := sqltemplate.Execute(sqlSecureValueOutboxUpdateReceiveCount, req) if err != nil { return fmt.Errorf("execute template %q: %w", sqlSecureValueOutboxUpdateReceiveCount.Name(), err) @@ -369,5 +390,8 @@ func (s *outboxStore) IncrementReceiveCount(ctx context.Context, messageIDs []in return fmt.Errorf("updating outbox messages receive count: %w", err) } + s.metrics.OutboxIncrementReceiveCountDuration.Observe(time.Since(start).Seconds()) + s.metrics.OutboxIncrementReceiveCountCount.Add(float64(len(messageIDs))) + return nil } diff --git a/pkg/storage/secret/metadata/outbox_store_test.go b/pkg/storage/secret/metadata/outbox_store_test.go index 518618833cf..f757e8b6b38 100644 --- a/pkg/storage/secret/metadata/outbox_store_test.go +++ b/pkg/storage/secret/metadata/outbox_store_test.go @@ -39,7 +39,7 @@ func (model *outboxStoreModel) Append(messageID int64, message contracts.AppendO func (model *outboxStoreModel) ReceiveN(n uint) []contracts.OutboxMessage { maxMessages := min(len(model.rows), int(n)) if maxMessages == 0 { - return []contracts.OutboxMessage{} + return nil } return model.rows[:maxMessages] } @@ -115,7 +115,7 @@ func TestOutboxStoreSecureValueOperationInProgress(t *testing.T) { ctx := context.Background() - outbox := ProvideOutboxQueue(database.ProvideDatabase(testDB, tracer), tracer) + outbox := ProvideOutboxQueue(database.ProvideDatabase(testDB, tracer), tracer, nil) _, err := outbox.Append(ctx, contracts.AppendOutboxMessage{ RequestID: "1", @@ -148,7 +148,7 @@ func TestOutboxStore(t *testing.T) { ctx := context.Background() - outbox := ProvideOutboxQueue(database.ProvideDatabase(testDB, tracer), tracer) + outbox := ProvideOutboxQueue(database.ProvideDatabase(testDB, tracer), tracer, nil) m1 := contracts.AppendOutboxMessage{ Type: contracts.CreateSecretOutboxMessage, @@ -216,7 +216,7 @@ func TestOutboxStoreProperty(t *testing.T) { testDB := sqlstore.NewTestStore(t, sqlstore.WithMigrator(migrator.New())) tracer := noop.NewTracerProvider().Tracer("test") - outbox := ProvideOutboxQueue(database.ProvideDatabase(testDB, tracer), tracer) + outbox := ProvideOutboxQueue(database.ProvideDatabase(testDB, tracer), tracer, nil) model := newOutboxStoreModel() diff --git a/pkg/storage/secret/metadata/secure_value_store.go b/pkg/storage/secret/metadata/secure_value_store.go index 39f42dcbdbe..6f79dfbd353 100644 --- a/pkg/storage/secret/metadata/secure_value_store.go +++ b/pkg/storage/secret/metadata/secure_value_store.go @@ -3,20 +3,28 @@ package metadata import ( "context" "fmt" + "time" secretv0alpha1 "github.com/grafana/grafana/pkg/apis/secret/v0alpha1" "github.com/grafana/grafana/pkg/registry/apis/secret/contracts" "github.com/grafana/grafana/pkg/registry/apis/secret/xkube" "github.com/grafana/grafana/pkg/services/featuremgmt" + "github.com/grafana/grafana/pkg/storage/secret/metadata/metrics" "github.com/grafana/grafana/pkg/storage/unified/sql" "github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate" + "github.com/prometheus/client_golang/prometheus" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" ) var _ contracts.SecureValueMetadataStorage = (*secureValueMetadataStorage)(nil) -func ProvideSecureValueMetadataStorage(db contracts.Database, tracer trace.Tracer, features featuremgmt.FeatureToggles) (contracts.SecureValueMetadataStorage, error) { +func ProvideSecureValueMetadataStorage( + db contracts.Database, + tracer trace.Tracer, + features featuremgmt.FeatureToggles, + reg prometheus.Registerer, +) (contracts.SecureValueMetadataStorage, error) { if !features.IsEnabledGlobally(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs) || !features.IsEnabledGlobally(featuremgmt.FlagSecretsManagementAppPlatform) { return &secureValueMetadataStorage{}, nil @@ -25,6 +33,7 @@ func ProvideSecureValueMetadataStorage(db contracts.Database, tracer trace.Trace return &secureValueMetadataStorage{ db: db, dialect: sqltemplate.DialectForDriver(db.DriverName()), + metrics: metrics.NewStorageMetrics(reg), tracer: tracer, }, nil } @@ -33,10 +42,12 @@ func ProvideSecureValueMetadataStorage(db contracts.Database, tracer trace.Trace type secureValueMetadataStorage struct { db contracts.Database dialect sqltemplate.Dialect + metrics *metrics.StorageMetrics tracer trace.Tracer } func (s *secureValueMetadataStorage) Create(ctx context.Context, sv *secretv0alpha1.SecureValue, actorUID string) (*secretv0alpha1.SecureValue, error) { + start := time.Now() ctx, span := s.tracer.Start(ctx, "SecureValueMetadataStorage.Create", trace.WithAttributes( attribute.String("name", sv.GetName()), attribute.String("namespace", sv.GetNamespace()), @@ -117,10 +128,14 @@ func (s *secureValueMetadataStorage) Create(ctx context.Context, sv *secretv0alp return nil, fmt.Errorf("convert to kubernetes object: %w", err) } + s.metrics.SecureValueMetadataCreateDuration.Observe(time.Since(start).Seconds()) + s.metrics.SecureValueMetadataCreateCount.Inc() + return createdSecureValue, nil } func (s *secureValueMetadataStorage) Read(ctx context.Context, namespace xkube.Namespace, name string, opts contracts.ReadOpts) (*secretv0alpha1.SecureValue, error) { + start := time.Now() ctx, span := s.tracer.Start(ctx, "SecureValueMetadataStorage.Read", trace.WithAttributes( attribute.String("name", name), attribute.String("namespace", namespace.String()), @@ -138,10 +153,14 @@ func (s *secureValueMetadataStorage) Read(ctx context.Context, namespace xkube.N return nil, fmt.Errorf("convert to kubernetes object: %w", err) } + s.metrics.SecureValueMetadataGetDuration.Observe(time.Since(start).Seconds()) + s.metrics.SecureValueMetadataGetCount.Inc() + return secureValueKub, nil } func (s *secureValueMetadataStorage) Update(ctx context.Context, newSecureValue *secretv0alpha1.SecureValue, actorUID string) (*secretv0alpha1.SecureValue, error) { + start := time.Now() ctx, span := s.tracer.Start(ctx, "SecureValueMetadataStorage.Update", trace.WithAttributes( attribute.String("name", newSecureValue.GetName()), attribute.String("namespace", newSecureValue.GetNamespace()), @@ -228,10 +247,14 @@ func (s *secureValueMetadataStorage) Update(ctx context.Context, newSecureValue return nil, fmt.Errorf("convert to kubernetes object: %w", err) } + s.metrics.SecureValueMetadataUpdateDuration.Observe(time.Since(start).Seconds()) + s.metrics.SecureValueMetadataUpdateCount.Inc() + return secureValue, nil } func (s *secureValueMetadataStorage) Delete(ctx context.Context, namespace xkube.Namespace, name string) error { + start := time.Now() ctx, span := s.tracer.Start(ctx, "SecureValueMetadataStorage.Delete", trace.WithAttributes( attribute.String("name", name), attribute.String("namespace", namespace.String()), @@ -258,10 +281,14 @@ func (s *secureValueMetadataStorage) Delete(ctx context.Context, namespace xkube return fmt.Errorf("deleting secure value rowsAffected=%d error=%w", rowsAffected, err) } + s.metrics.SecureValueMetadataDeleteDuration.Observe(time.Since(start).Seconds()) + s.metrics.SecureValueMetadataDeleteCount.Inc() + return nil } func (s *secureValueMetadataStorage) List(ctx context.Context, namespace xkube.Namespace) (svList []secretv0alpha1.SecureValue, error error) { + start := time.Now() ctx, span := s.tracer.Start(ctx, "SecureValueMetadataStorage.List", trace.WithAttributes( attribute.String("namespace", namespace.String()), )) @@ -316,10 +343,14 @@ func (s *secureValueMetadataStorage) List(ctx context.Context, namespace xkube.N return nil, fmt.Errorf("read rows error: %w", err) } + s.metrics.SecureValueMetadataListDuration.Observe(time.Since(start).Seconds()) + s.metrics.SecureValueMetadataListCount.Inc() + return secureValues, nil } func (s *secureValueMetadataStorage) SetExternalID(ctx context.Context, namespace xkube.Namespace, name string, externalID contracts.ExternalID) error { + start := time.Now() ctx, span := s.tracer.Start(ctx, "SecureValueMetadataStorage.SetExternalID", trace.WithAttributes( attribute.String("name", name), attribute.String("namespace", namespace.String()), @@ -352,10 +383,13 @@ func (s *secureValueMetadataStorage) SetExternalID(ctx context.Context, namespac if modifiedCount > 1 { return fmt.Errorf("secureValueMetadataStorage.SetExternalID: modified more than one secret, this is a bug, check the where condition: modifiedCount=%d", modifiedCount) } + s.metrics.SecureValueSetExternalIDDuration.Observe(time.Since(start).Seconds()) + return nil } func (s *secureValueMetadataStorage) SetStatus(ctx context.Context, namespace xkube.Namespace, name string, status secretv0alpha1.SecureValueStatus) error { + start := time.Now() ctx, span := s.tracer.Start(ctx, "SecureValueMetadataStorage.SetStatus", trace.WithAttributes( attribute.String("name", name), attribute.String("namespace", namespace.String()), @@ -391,10 +425,13 @@ func (s *secureValueMetadataStorage) SetStatus(ctx context.Context, namespace xk if modifiedCount > 1 { return fmt.Errorf("secureValueMetadataStorage.SetExternalID: modified more than one secret, this is a bug, check the where condition: modifiedCount=%d", modifiedCount) } + s.metrics.SecureValueSetStatusDuration.Observe(time.Since(start).Seconds()) + return nil } func (s *secureValueMetadataStorage) ReadForDecrypt(ctx context.Context, namespace xkube.Namespace, name string) (*contracts.DecryptSecureValue, error) { + start := time.Now() ctx, span := s.tracer.Start(ctx, "SecureValueMetadataStorage.ReadForDecrypt", trace.WithAttributes( attribute.String("name", name), attribute.String("namespace", namespace.String()), @@ -437,6 +474,8 @@ func (s *secureValueMetadataStorage) ReadForDecrypt(ctx context.Context, namespa return nil, fmt.Errorf("convert to kubernetes object: %w", err) } + s.metrics.SecureValueGetForDecryptDuration.Observe(time.Since(start).Seconds()) + return secureValue, nil } diff --git a/pkg/storage/secret/metadata/secure_value_store_test.go b/pkg/storage/secret/metadata/secure_value_store_test.go index 6c710f0877d..b9ec0023430 100644 --- a/pkg/storage/secret/metadata/secure_value_store_test.go +++ b/pkg/storage/secret/metadata/secure_value_store_test.go @@ -43,11 +43,11 @@ func Test_SecureValueMetadataStorage_CreateAndRead(t *testing.T) { features := featuremgmt.WithFeatures(featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, featuremgmt.FlagSecretsManagementAppPlatform) // Initialize the secure value storage - secureValueStorage, err := ProvideSecureValueMetadataStorage(db, tracer, features) + secureValueStorage, err := ProvideSecureValueMetadataStorage(db, tracer, features, nil) require.NoError(t, err) // Initialize the keeper storage - keeperStorage, err := ProvideKeeperMetadataStorage(db, tracer, features) + keeperStorage, err := ProvideKeeperMetadataStorage(db, tracer, features, nil) require.NoError(t, err) t.Run("create and read a secure value", func(t *testing.T) { diff --git a/pkg/storage/secret/migrator/migrator.go b/pkg/storage/secret/migrator/migrator.go index d7d0bd6560b..f453d6dd3af 100644 --- a/pkg/storage/secret/migrator/migrator.go +++ b/pkg/storage/secret/migrator/migrator.go @@ -133,8 +133,8 @@ func (*SecretDB) AddMigration(mg *migrator.Migrator) { tables = append(tables, migrator.Table{ Name: TableNameSecureValueOutbox, Columns: []*migrator.Column{ - {Name: "request_id", Type: migrator.DB_NVarchar, Length: 253, Nullable: false}, - {Name: "id", Type: migrator.DB_BigInt, Length: 36, IsPrimaryKey: true, IsAutoIncrement: true}, // Fixed size of a UUID. + {Name: "request_id", Type: migrator.DB_NVarchar, Length: 1024, Nullable: false}, // Safer upper limit because we hex-encode traceparent+tracestate to form the request_id. + {Name: "id", Type: migrator.DB_BigInt, Length: 36, IsPrimaryKey: true, IsAutoIncrement: true}, {Name: "message_type", Type: migrator.DB_NVarchar, Length: 16, Nullable: false}, {Name: "name", Type: migrator.DB_NVarchar, Length: 253, Nullable: false}, // Limit enforced by K8s. {Name: "namespace", Type: migrator.DB_NVarchar, Length: 253, Nullable: false}, // Limit enforced by K8s.