Skip to content

Commit 484fd27

Browse files
hubatishcopybara-github
authored andcommitted
Pull machine type from node conditions
PiperOrigin-RevId: 930114727
1 parent 0fedabb commit 484fd27

4 files changed

Lines changed: 108 additions & 8 deletions

File tree

perfkitbenchmarker/linux_benchmarks/kubernetes_scale_benchmark.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -445,10 +445,12 @@ def ParseStatusChanges(
445445
A list of samples, with various percentiles for each status condition.
446446
"""
447447

448-
conditions = kubernetes_conditions.GetStatusConditionsForResourceType(
449-
resource_type,
450-
resources_to_ignore,
451-
suppress_logging=_ShouldSuppressLogging(),
448+
conditions: list[kubernetes_conditions.KubernetesStatusCondition] = (
449+
kubernetes_conditions.GetStatusConditionsForResourceType(
450+
resource_type,
451+
resources_to_ignore,
452+
suppress_logging=_ShouldSuppressLogging(),
453+
)
452454
)
453455
# Filter out conditions that are too early.
454456
conditions = [c for c in conditions if c.epoch_time >= start_time]
@@ -482,7 +484,7 @@ def ParseStatusChanges(
482484
return samples
483485

484486
for condition in conditions:
485-
metadata = {
487+
metadata = condition.metadata | {
486488
'k8s_resource_name': condition.resource_name,
487489
}
488490
samples.append(

perfkitbenchmarker/resources/container_service/kubernetes_conditions.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,12 @@ class KubernetesStatusCondition:
3636
resource_name: str
3737
epoch_time: int
3838
event: str
39+
metadata: dict[str, str]
3940

4041
@classmethod
4142
def FromJsonPathResult(
42-
cls, resource_type: str, resource_name: str, condition: dict[str, Any]
43+
cls, resource_type: str, resource_name: str, condition: dict[str, Any],
44+
extra_metadata: dict[str, str],
4345
) -> 'KubernetesStatusCondition':
4446
"""Parses the json result of kubectl get."""
4547
str_time = condition['lastTransitionTime']
@@ -48,6 +50,7 @@ def FromJsonPathResult(
4850
resource_name,
4951
epoch_time=ConvertToEpochTime(str_time),
5052
event=condition['type'],
53+
metadata=extra_metadata,
5154
)
5255

5356
@classmethod
@@ -88,8 +91,17 @@ def GetStatusConditionsForResourceType(
8891
)
8992
data = json.loads(stdout)
9093
name_to_conditions = {}
94+
name_to_metadata: dict[str, dict[str, str]] = {}
9195
for item in data.get('items', []):
92-
name = item.get('metadata', {}).get('name')
96+
metadata = item.get('metadata', {})
97+
name = metadata.get('name')
98+
labels = metadata.get('labels', {})
99+
found_metadata = {}
100+
if 'node.kubernetes.io/instance-type' in labels:
101+
found_metadata['machine_type'] = labels[
102+
'node.kubernetes.io/instance-type'
103+
]
104+
name_to_metadata[name] = found_metadata
93105
conditions = item.get('status', {}).get('conditions')
94106
if name is not None and conditions is not None:
95107
name_to_conditions[name] = conditions
@@ -106,7 +118,7 @@ def GetStatusConditionsForResourceType(
106118
continue
107119
results.append(
108120
KubernetesStatusCondition.FromJsonPathResult(
109-
resource_type, name, conditions
121+
resource_type, name, conditions, name_to_metadata[name]
110122
)
111123
)
112124

tests/kubernetes_conditions_test.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,46 @@ def testPodStatusConditionsWithIgnoredResources(self):
178178
)
179179
self.assertLen(conditions, 2)
180180

181+
def testStatusConditionsWithInstanceType(self):
182+
stdout = json.dumps({
183+
'items': [
184+
{
185+
'metadata': {
186+
'name': 'node123',
187+
'labels': {
188+
'node.kubernetes.io/instance-type': 'n2-standard-4',
189+
},
190+
},
191+
'status': {
192+
'conditions': [
193+
{
194+
'lastProbeTime': None,
195+
'lastTransitionTime': '1970-01-01T00:01:19Z',
196+
'status': 'True',
197+
'type': 'Ready',
198+
},
199+
]
200+
},
201+
},
202+
]
203+
})
204+
self.enter_context(
205+
mock.patch.object(
206+
kubectl,
207+
'RunKubectlCommand',
208+
return_value=(stdout, '', 0),
209+
)
210+
)
211+
conditions = kubernetes_conditions.GetStatusConditionsForResourceType(
212+
'node',
213+
frozenset(),
214+
)
215+
self.assertLen(conditions, 1)
216+
self.assertEqual(
217+
conditions[0].metadata,
218+
{'machine_type': 'n2-standard-4'},
219+
)
220+
181221

182222
if __name__ == '__main__':
183223
unittest.main()

tests/linux_benchmarks/kubernetes_scale_benchmark_test.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,52 @@ def testReportLatenciesMultipleStatsOnePod(self):
271271
},
272272
)
273273

274+
@flagsaver.flagsaver(kubernetes_scale_report_latency_percentiles=False)
275+
@flagsaver.flagsaver(kubernetes_scale_report_individual_latencies=True)
276+
def testReportLatenciesContainsMachineType(self):
277+
stdout = json.dumps({
278+
'items': [
279+
{
280+
'metadata': {
281+
'name': 'node1',
282+
'labels': {
283+
'node.kubernetes.io/instance-type': 'n2-standard-4',
284+
},
285+
},
286+
'status': {
287+
'conditions': [
288+
{
289+
'lastProbeTime': None,
290+
'lastTransitionTime': '1970-01-01T00:01:00Z',
291+
'status': 'True',
292+
'type': 'Ready',
293+
},
294+
]
295+
},
296+
},
297+
]
298+
})
299+
self.enter_context(
300+
mock.patch.object(
301+
kubectl,
302+
'RunKubectlCommand',
303+
side_effect=[(stdout, '', 0)],
304+
)
305+
)
306+
samples = kubernetes_scale_benchmark.ParseStatusChanges(
307+
'node', start_time=0
308+
)
309+
samples_by_metric = _SamplesByMetric(samples)
310+
self.assertIn('node_Ready', samples_by_metric)
311+
node_ready_sample = samples_by_metric['node_Ready']
312+
self.assertEqual(
313+
node_ready_sample.metadata,
314+
{
315+
'k8s_resource_name': 'node1',
316+
'machine_type': 'n2-standard-4',
317+
},
318+
)
319+
274320
@flagsaver.flagsaver(kubernetes_scale_num_replicas=10)
275321
def testCheckFailuresPassesWithCorrectNumberOfPods(self):
276322
self.cluster.event_poller = kubernetes_events.KubernetesEventPoller(set)

0 commit comments

Comments
 (0)