@@ -25,28 +25,34 @@ class TestGetContainerMetricType:
2525 def builder (self ) -> FixedQueryBuilder :
2626 return FixedQueryBuilder ("1m" )
2727
28- def test_gauge_for_unknown_metric (self , builder : FixedQueryBuilder ) -> None :
29- label = ContainerMetricOptionalLabel (value_type = ValueType .CURRENT )
30- assert builder .get_container_metric_type ("mem" , label ) == MetricType .GAUGE
31-
32- def test_gauge_for_capacity_value_type (self , builder : FixedQueryBuilder ) -> None :
33- """cpu_util with CAPACITY value_type should be GAUGE, not DIFF."""
34- label = ContainerMetricOptionalLabel (value_type = ValueType .CAPACITY )
35- assert builder .get_container_metric_type ("cpu_util" , label ) == MetricType .GAUGE
36-
37- @pytest .mark .parametrize ("metric_name" , ["net_rx" , "net_tx" ])
38- def test_rate_for_network_metrics (self , builder : FixedQueryBuilder , metric_name : str ) -> None :
39- label = ContainerMetricOptionalLabel (value_type = ValueType .CURRENT )
40- assert builder .get_container_metric_type (metric_name , label ) == MetricType .RATE
41-
42- def test_rate_takes_precedence_over_value_type (self , builder : FixedQueryBuilder ) -> None :
43- """net_rx is RATE regardless of value_type."""
44- label = ContainerMetricOptionalLabel (value_type = ValueType .CAPACITY )
45- assert builder .get_container_metric_type ("net_rx" , label ) == MetricType .RATE
46-
47- def test_diff_for_cpu_util_with_current (self , builder : FixedQueryBuilder ) -> None :
48- label = ContainerMetricOptionalLabel (value_type = ValueType .CURRENT )
49- assert builder .get_container_metric_type ("cpu_util" , label ) == MetricType .DIFF
28+ @pytest .mark .parametrize (
29+ ("metric_name" , "value_type" , "expected" ),
30+ [
31+ ("mem" , ValueType .CURRENT , MetricType .GAUGE ),
32+ ("cpu_util" , ValueType .CAPACITY , MetricType .GAUGE ),
33+ ("net_rx" , ValueType .CURRENT , MetricType .RATE ),
34+ ("net_tx" , ValueType .CURRENT , MetricType .RATE ),
35+ ("net_rx" , ValueType .CAPACITY , MetricType .RATE ),
36+ ("cpu_util" , ValueType .CURRENT , MetricType .DIFF ),
37+ ],
38+ ids = [
39+ "gauge-unknown-metric" ,
40+ "gauge-capacity-overrides-diff" ,
41+ "rate-net_rx" ,
42+ "rate-net_tx" ,
43+ "rate-precedence-over-value_type" ,
44+ "diff-cpu_util-current" ,
45+ ],
46+ )
47+ def test_metric_type_classification (
48+ self ,
49+ builder : FixedQueryBuilder ,
50+ metric_name : str ,
51+ value_type : ValueType ,
52+ expected : MetricType ,
53+ ) -> None :
54+ label = ContainerMetricOptionalLabel (value_type = value_type )
55+ assert builder .get_container_metric_type (metric_name , label ) == expected
5056
5157
5258class TestGetContainerMetricQuery :
@@ -61,26 +67,18 @@ def test_gauge_query_preset(self, builder: FixedQueryBuilder) -> None:
6167
6268 assert isinstance (result , MetricPreset )
6369 assert result .window == "5m"
64- assert "container_metric_name" in result .labels
6570 assert result .labels ["container_metric_name" ] == LabelMatcher .exact ("mem" )
6671 assert result .labels ["value_type" ] == LabelMatcher .exact ("current" )
6772 assert "value_type" in result .group_by
6873
69- def test_rate_query_preset (self , builder : FixedQueryBuilder ) -> None :
74+ @pytest .mark .parametrize ("metric_name" , ["net_rx" , "cpu_util" ])
75+ def test_rate_based_query_uses_rate_function (
76+ self , builder : FixedQueryBuilder , metric_name : str
77+ ) -> None :
7078 label = ContainerMetricOptionalLabel (value_type = ValueType .CURRENT )
7179
72- result = builder .get_container_metric_query ("net_rx" , label )
80+ rendered = builder .get_container_metric_query (metric_name , label ). render ( )
7381
74- rendered = result .render ()
75- assert "rate(" in rendered
76- assert "[5m]" in rendered
77-
78- def test_diff_query_preset (self , builder : FixedQueryBuilder ) -> None :
79- label = ContainerMetricOptionalLabel (value_type = ValueType .CURRENT )
80-
81- result = builder .get_container_metric_query ("cpu_util" , label )
82-
83- rendered = result .render ()
8482 assert "rate(" in rendered
8583 assert "[5m]" in rendered
8684
@@ -93,7 +91,6 @@ def test_query_with_optional_labels(self, builder: FixedQueryBuilder) -> None:
9391
9492 result = builder .get_container_metric_query ("mem" , label )
9593
96- assert "kernel_id" in result .labels
9794 assert result .labels ["kernel_id" ] == LabelMatcher .exact (str (kid ))
9895 assert "kernel_id" in result .group_by
9996
@@ -106,38 +103,31 @@ def test_kernel_id_regex_filter(self) -> None:
106103
107104 result = builder .get_container_live_stat_queries ([kid1 , kid2 ])
108105
109- gauge_labels = result .gauge .labels
110- assert "kernel_id" in gauge_labels
111- matcher = gauge_labels ["kernel_id" ]
106+ matcher = result .gauge .labels ["kernel_id" ]
112107 assert matcher .operator == LabelOperator .REGEX
113108 assert str (kid1 ) in matcher .value
114109 assert str (kid2 ) in matcher .value
115110
116- def test_diff_filters_by_metric_name_and_value_type (self ) -> None :
117- builder = FixedQueryBuilder ("1m" )
118- kid = KernelId (UUID ("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" ))
119-
120- result = builder .get_container_live_stat_queries ([kid ])
121-
122- diff_labels = result .diff .labels
123- assert "container_metric_name" in diff_labels
124- assert diff_labels ["container_metric_name" ].operator == LabelOperator .REGEX
125- assert "cpu_util" in diff_labels ["container_metric_name" ].value
126- assert "value_type" in diff_labels
127- assert diff_labels ["value_type" ] == LabelMatcher .exact ("current" )
128-
129- def test_rate_filters_by_metric_name_and_value_type (self ) -> None :
111+ @pytest .mark .parametrize (
112+ ("preset_attr" , "expected_metrics" ),
113+ [
114+ ("diff" , ["cpu_util" ]),
115+ ("rate" , ["net_rx" , "net_tx" ]),
116+ ],
117+ )
118+ def test_preset_filters_by_metric_name_and_value_type (
119+ self , preset_attr : str , expected_metrics : list [str ]
120+ ) -> None :
130121 builder = FixedQueryBuilder ("1m" )
131122 kid = KernelId (UUID ("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" ))
132123
133124 result = builder .get_container_live_stat_queries ([kid ])
125+ labels = getattr (result , preset_attr ).labels
134126
135- rate_labels = result .rate .labels
136- assert "container_metric_name" in rate_labels
137- assert "net_rx" in rate_labels ["container_metric_name" ].value
138- assert "net_tx" in rate_labels ["container_metric_name" ].value
139- assert "value_type" in rate_labels
140- assert rate_labels ["value_type" ] == LabelMatcher .exact ("current" )
127+ assert labels ["container_metric_name" ].operator == LabelOperator .REGEX
128+ for metric in expected_metrics :
129+ assert metric in labels ["container_metric_name" ].value
130+ assert labels ["value_type" ] == LabelMatcher .exact ("current" )
141131
142132 def test_gauge_has_no_metric_name_filter (self ) -> None :
143133 builder = FixedQueryBuilder ("1m" )
0 commit comments