Storage: Query stats within a namespace (#97403)

This commit is contained in:
Ryan McKinley 2024-12-05 13:58:13 +03:00 committed by GitHub
parent 3724ffd858
commit 8165258a2d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 64 additions and 7 deletions

View File

@ -132,7 +132,7 @@ type rowsWrapper struct {
err error
}
func (a *dashboardSqlAccess) GetResourceStats(ctx context.Context, minCount int) ([]resource.ResourceStats, error) {
func (a *dashboardSqlAccess) GetResourceStats(ctx context.Context, namespace string, minCount int) ([]resource.ResourceStats, error) {
return nil, fmt.Errorf("not implemented")
}

View File

@ -109,7 +109,7 @@ func (s *cdkBackend) getPath(key *ResourceKey, rv int64) string {
}
// GetResourceStats implements Backend.
func (s *cdkBackend) GetResourceStats(ctx context.Context, minCount int) ([]ResourceStats, error) {
func (s *cdkBackend) GetResourceStats(ctx context.Context, namespace string, minCount int) ([]ResourceStats, error) {
return nil, fmt.Errorf("not implemented")
}

View File

@ -179,7 +179,7 @@ func (s *searchSupport) init(ctx context.Context) error {
group := errgroup.Group{}
group.SetLimit(s.initWorkers)
stats, err := s.storage.GetResourceStats(ctx, s.initMinSize)
stats, err := s.storage.GetResourceStats(ctx, "", s.initMinSize)
if err != nil {
return err
}

View File

@ -95,7 +95,8 @@ type StorageBackend interface {
// For HA setups, this will be more events than the local WriteEvent above!
WatchWriteEvents(ctx context.Context) (<-chan *WrittenEvent, error)
GetResourceStats(ctx context.Context, minCount int) ([]ResourceStats, error)
// Get resource stats within the storage backend. When namespace is empty, it will apply to all
GetResourceStats(ctx context.Context, namespace string, minCount int) ([]ResourceStats, error)
}
type ResourceStats struct {

View File

@ -122,12 +122,13 @@ func (b *backend) Stop(_ context.Context) error {
}
// GetResourceStats implements Backend.
func (b *backend) GetResourceStats(ctx context.Context, minCount int) ([]resource.ResourceStats, error) {
func (b *backend) GetResourceStats(ctx context.Context, namespace string, minCount int) ([]resource.ResourceStats, error) {
_, span := b.tracer.Start(ctx, tracePrefix+".GetResourceStats")
defer span.End()
req := &sqlStatsRequest{
SQLTemplate: sqltemplate.New(b.dialect),
Namespace: namespace,
MinCount: minCount, // not used in query... yet?
}

View File

@ -5,6 +5,10 @@ SELECT
COUNT(*),
MAX({{ .Ident "resource_version" }})
FROM {{ .Ident "resource" }}
{{ if .Namespace }}
WHERE 1 = 1
AND {{ .Ident "namespace" }} = {{ .Arg .Namespace }}
{{ end}}
GROUP BY
{{ .Ident "namespace" }},
{{ .Ident "group" }},

View File

@ -74,7 +74,8 @@ func (r sqlResourceRequest) Validate() error {
type sqlStatsRequest struct {
sqltemplate.SQLTemplate
MinCount int
Namespace string
MinCount int
}
func (r sqlStatsRequest) Validate() error {

View File

@ -228,6 +228,14 @@ func TestUnifiedStorageQueries(t *testing.T) {
MinCount: 10, // Not yet used in query (only response filter)
},
},
{
Name: "query-namespace",
Data: &sqlStatsRequest{
SQLTemplate: mocks.NewTestingSQLTemplate(),
Namespace: "default",
MinCount: 10, // Not yet used in query (only response filter)
},
},
},
}})
}

View File

@ -98,7 +98,7 @@ func TestIntegrationBackendHappyPath(t *testing.T) {
require.NoError(t, err)
require.Greater(t, rv3, rv2)
stats, err := backend.GetResourceStats(ctx, 0)
stats, err := backend.GetResourceStats(ctx, "", 0)
require.NoError(t, err)
require.Len(t, stats, 1)
require.Equal(t, int64(3), stats[0].Count)

View File

@ -0,0 +1,14 @@
SELECT
`namespace`,
`group`,
`resource`,
COUNT(*),
MAX(`resource_version`)
FROM `resource`
WHERE 1 = 1
AND `namespace` = 'default'
GROUP BY
`namespace`,
`group`,
`resource`
;

View File

@ -0,0 +1,14 @@
SELECT
"namespace",
"group",
"resource",
COUNT(*),
MAX("resource_version")
FROM "resource"
WHERE 1 = 1
AND "namespace" = 'default'
GROUP BY
"namespace",
"group",
"resource"
;

View File

@ -0,0 +1,14 @@
SELECT
"namespace",
"group",
"resource",
COUNT(*),
MAX("resource_version")
FROM "resource"
WHERE 1 = 1
AND "namespace" = 'default'
GROUP BY
"namespace",
"group",
"resource"
;