sigs.k8s.io/kueue@v0.6.2/pkg/metrics/metrics_test.go (about)

     1  /*
     2  Copyright 2023 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package metrics
    18  
    19  import (
    20  	"testing"
    21  
    22  	"github.com/prometheus/client_golang/prometheus"
    23  
    24  	"sigs.k8s.io/kueue/pkg/features"
    25  	"sigs.k8s.io/kueue/pkg/util/testing/metrics"
    26  )
    27  
    28  func expectFilteredMetricsCount(t *testing.T, vec *prometheus.GaugeVec, count int, kvs ...string) {
    29  	labels := prometheus.Labels{}
    30  	for i := 0; i < len(kvs)/2; i++ {
    31  		labels[kvs[i*2]] = kvs[i*2+1]
    32  	}
    33  	all := metrics.CollectFilteredGaugeVec(vec, labels)
    34  	if len(all) != count {
    35  		t.Helper()
    36  		t.Errorf("Expecting %d metrics got %d, matching labels %v", count, len(all), kvs)
    37  	}
    38  }
    39  
    40  func TestReportAndCleanupClusterQueueMetrics(t *testing.T) {
    41  	defer features.SetFeatureGateDuringTest(t, features.LendingLimit, true)()
    42  	ReportClusterQueueQuotas("cohort", "queue", "flavor", "res", 5, 10, 3)
    43  	ReportClusterQueueQuotas("cohort", "queue", "flavor2", "res", 1, 2, 1)
    44  
    45  	expectFilteredMetricsCount(t, ClusterQueueResourceNominalQuota, 2, "cluster_queue", "queue")
    46  	expectFilteredMetricsCount(t, ClusterQueueResourceBorrowingLimit, 2, "cluster_queue", "queue")
    47  	expectFilteredMetricsCount(t, ClusterQueueResourceLendingLimit, 2, "cluster_queue", "queue")
    48  
    49  	ReportClusterQueueResourceReservations("cohort", "queue", "flavor", "res", 7)
    50  	ReportClusterQueueResourceReservations("cohort", "queue", "flavor2", "res", 3)
    51  
    52  	ReportClusterQueueResourceUsage("cohort", "queue", "flavor", "res", 7)
    53  	ReportClusterQueueResourceUsage("cohort", "queue", "flavor2", "res", 3)
    54  
    55  	expectFilteredMetricsCount(t, ClusterQueueResourceReservations, 2, "cluster_queue", "queue")
    56  	expectFilteredMetricsCount(t, ClusterQueueResourceUsage, 2, "cluster_queue", "queue")
    57  
    58  	ClearClusterQueueResourceMetrics("queue")
    59  
    60  	expectFilteredMetricsCount(t, ClusterQueueResourceNominalQuota, 0, "cluster_queue", "queue")
    61  	expectFilteredMetricsCount(t, ClusterQueueResourceBorrowingLimit, 0, "cluster_queue", "queue")
    62  	expectFilteredMetricsCount(t, ClusterQueueResourceLendingLimit, 0, "cluster_queue", "queue")
    63  	expectFilteredMetricsCount(t, ClusterQueueResourceReservations, 0, "cluster_queue", "queue")
    64  	expectFilteredMetricsCount(t, ClusterQueueResourceUsage, 0, "cluster_queue", "queue")
    65  }
    66  
    67  func TestReportAndCleanupClusterQueueQuotas(t *testing.T) {
    68  	defer features.SetFeatureGateDuringTest(t, features.LendingLimit, true)()
    69  	ReportClusterQueueQuotas("cohort", "queue", "flavor", "res", 5, 10, 3)
    70  	ReportClusterQueueQuotas("cohort", "queue", "flavor", "res2", 5, 10, 3)
    71  	ReportClusterQueueQuotas("cohort", "queue", "flavor2", "res", 1, 2, 1)
    72  	ReportClusterQueueQuotas("cohort", "queue", "flavor2", "res2", 1, 2, 1)
    73  
    74  	expectFilteredMetricsCount(t, ClusterQueueResourceNominalQuota, 4, "cluster_queue", "queue")
    75  	expectFilteredMetricsCount(t, ClusterQueueResourceBorrowingLimit, 4, "cluster_queue", "queue")
    76  	expectFilteredMetricsCount(t, ClusterQueueResourceLendingLimit, 4, "cluster_queue", "queue")
    77  
    78  	// drop flavor2
    79  	ClearClusterQueueResourceQuotas("queue", "flavor2", "")
    80  
    81  	expectFilteredMetricsCount(t, ClusterQueueResourceNominalQuota, 2, "cluster_queue", "queue")
    82  	expectFilteredMetricsCount(t, ClusterQueueResourceBorrowingLimit, 2, "cluster_queue", "queue")
    83  	expectFilteredMetricsCount(t, ClusterQueueResourceLendingLimit, 2, "cluster_queue", "queue")
    84  
    85  	expectFilteredMetricsCount(t, ClusterQueueResourceNominalQuota, 0, "cluster_queue", "queue", "flavor", "flavor2")
    86  	expectFilteredMetricsCount(t, ClusterQueueResourceBorrowingLimit, 0, "cluster_queue", "queue", "flavor", "flavor2")
    87  	expectFilteredMetricsCount(t, ClusterQueueResourceLendingLimit, 0, "cluster_queue", "queue", "flavor", "flavor2")
    88  
    89  	// drop res2
    90  	ClearClusterQueueResourceQuotas("queue", "flavor", "res2")
    91  
    92  	expectFilteredMetricsCount(t, ClusterQueueResourceNominalQuota, 1, "cluster_queue", "queue")
    93  	expectFilteredMetricsCount(t, ClusterQueueResourceBorrowingLimit, 1, "cluster_queue", "queue")
    94  	expectFilteredMetricsCount(t, ClusterQueueResourceLendingLimit, 1, "cluster_queue", "queue")
    95  
    96  	expectFilteredMetricsCount(t, ClusterQueueResourceNominalQuota, 0, "cluster_queue", "queue", "flavor", "flavor", "resource", "res2")
    97  	expectFilteredMetricsCount(t, ClusterQueueResourceBorrowingLimit, 0, "cluster_queue", "queue", "flavor", "flavor", "resource", "res2")
    98  	expectFilteredMetricsCount(t, ClusterQueueResourceLendingLimit, 0, "cluster_queue", "queue", "flavor", "flavor", "resource", "res2")
    99  }
   100  
   101  func TestReportAndCleanupClusterQueueUsage(t *testing.T) {
   102  	ReportClusterQueueResourceReservations("cohort", "queue", "flavor", "res", 5)
   103  	ReportClusterQueueResourceReservations("cohort", "queue", "flavor", "res2", 5)
   104  	ReportClusterQueueResourceReservations("cohort", "queue", "flavor2", "res", 1)
   105  	ReportClusterQueueResourceReservations("cohort", "queue", "flavor2", "res2", 1)
   106  
   107  	expectFilteredMetricsCount(t, ClusterQueueResourceReservations, 4, "cluster_queue", "queue")
   108  
   109  	// drop flavor2
   110  	ClearClusterQueueResourceReservations("queue", "flavor2", "")
   111  
   112  	expectFilteredMetricsCount(t, ClusterQueueResourceReservations, 2, "cluster_queue", "queue")
   113  	expectFilteredMetricsCount(t, ClusterQueueResourceReservations, 0, "cluster_queue", "queue", "flavor", "flavor2")
   114  
   115  	// drop res2
   116  	ClearClusterQueueResourceReservations("queue", "flavor", "res2")
   117  
   118  	expectFilteredMetricsCount(t, ClusterQueueResourceReservations, 1, "cluster_queue", "queue")
   119  	expectFilteredMetricsCount(t, ClusterQueueResourceReservations, 0, "cluster_queue", "queue", "flavor", "flavor", "resource", "res2")
   120  
   121  	ReportClusterQueueResourceUsage("cohort", "queue", "flavor", "res", 5)
   122  	ReportClusterQueueResourceUsage("cohort", "queue", "flavor", "res2", 5)
   123  	ReportClusterQueueResourceUsage("cohort", "queue", "flavor2", "res", 1)
   124  	ReportClusterQueueResourceUsage("cohort", "queue", "flavor2", "res2", 1)
   125  
   126  	expectFilteredMetricsCount(t, ClusterQueueResourceUsage, 4, "cluster_queue", "queue")
   127  
   128  	// drop flavor2
   129  	ClearClusterQueueResourceUsage("queue", "flavor2", "")
   130  
   131  	expectFilteredMetricsCount(t, ClusterQueueResourceUsage, 2, "cluster_queue", "queue")
   132  	expectFilteredMetricsCount(t, ClusterQueueResourceUsage, 0, "cluster_queue", "queue", "flavor", "flavor2")
   133  
   134  	// drop res2
   135  	ClearClusterQueueResourceUsage("queue", "flavor", "res2")
   136  
   137  	expectFilteredMetricsCount(t, ClusterQueueResourceUsage, 1, "cluster_queue", "queue")
   138  	expectFilteredMetricsCount(t, ClusterQueueResourceUsage, 0, "cluster_queue", "queue", "flavor", "flavor", "resource", "res2")
   139  }