Skip to content

Commit 41c3949

Browse files
committed
Add ephemeral-storage columns to sc-utilization
1 parent a188c2c commit 41c3949

File tree

1 file changed

+82
-4
lines changed

1 file changed

+82
-4
lines changed

sefcom_clusterutils/utilization.py

Lines changed: 82 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ class TableRow(NamedTuple):
3030
mem_limit_percent: float
3131
mem_usage: int
3232
mem_usage_percent: float
33+
storage_request: int
34+
storage_request_percent: float
35+
storage_limit: int
36+
storage_limit_percent: float
3337

3438

3539
def parse_cpu(size_str: str, fallback_unit: str | None) -> int:
@@ -110,7 +114,14 @@ def get_summary_pod_resources() -> dict[str, dict[str, int]]:
110114
continue
111115
resource_dict = resources.get(
112116
namespace,
113-
{"cpu_request": 0, "cpu_limit": 0, "mem_request": 0, "mem_limit": 0},
117+
{
118+
"cpu_request": 0,
119+
"cpu_limit": 0,
120+
"mem_request": 0,
121+
"mem_limit": 0,
122+
"storage_request": 0,
123+
"storage_limit": 0,
124+
},
114125
)
115126

116127
cpu_request = (
@@ -133,6 +144,16 @@ def get_summary_pod_resources() -> dict[str, dict[str, int]]:
133144
if container.resources.limits
134145
else None
135146
)
147+
storage_request = (
148+
container.resources.requests.get("ephemeral-storage")
149+
if container.resources.requests
150+
else None
151+
)
152+
storage_limit = (
153+
container.resources.limits.get("ephemeral-storage")
154+
if container.resources.limits
155+
else None
156+
)
136157

137158
resource_dict["cpu_request"] += (
138159
parse_cpu(cpu_request, fallback_unit="unit") if cpu_request else 0
@@ -144,6 +165,12 @@ def get_summary_pod_resources() -> dict[str, dict[str, int]]:
144165
parse_memory(mem_request) if mem_request else 0
145166
)
146167
resource_dict["mem_limit"] += parse_memory(mem_limit) if mem_limit else 0
168+
resource_dict["storage_request"] += (
169+
parse_memory(storage_request) if storage_request else 0
170+
)
171+
resource_dict["storage_limit"] += (
172+
parse_memory(storage_limit) if storage_limit else 0
173+
)
147174

148175
resources[namespace] = resource_dict
149176

@@ -161,7 +188,10 @@ def get_pod_metrics() -> dict[str, dict[str, int]]:
161188
for item in metrics["items"]:
162189
ns_name = item["metadata"]["namespace"]
163190

164-
ns_metrics = all_metrics.get(ns_name, {"cpu_usage": 0, "mem_usage": 0})
191+
ns_metrics = all_metrics.get(
192+
ns_name,
193+
{"cpu_usage": 0, "mem_usage": 0},
194+
)
165195

166196
for container in item["containers"]:
167197
ns_metrics["cpu_usage"] += parse_cpu(
@@ -180,7 +210,7 @@ def get_cluster_capacity() -> dict[str, int]:
180210
v1 = client.CoreV1Api()
181211

182212
nodes = v1.list_node()
183-
total_capacity = {"cpu": 0, "memory": 0}
213+
total_capacity = {"cpu": 0, "memory": 0, "storage": 0}
184214

185215
for node in nodes.items:
186216
total_capacity["cpu"] += parse_cpu(
@@ -191,6 +221,10 @@ def get_cluster_capacity() -> dict[str, int]:
191221
node.status.capacity.get("memory", "0"),
192222
fallback_unit="b",
193223
)
224+
total_capacity["storage"] += parse_memory(
225+
node.status.capacity.get("ephemeral-storage", "0"),
226+
fallback_unit="b",
227+
)
194228

195229
return total_capacity
196230

@@ -233,7 +267,10 @@ def build_table(
233267
table: list[TableRow] = []
234268

235269
for namespace, resource_dict in resources.items():
236-
metric_dict = metrics.get(namespace, {"cpu_usage": 0, "mem_usage": 0})
270+
metric_dict = metrics.get(
271+
namespace,
272+
{"cpu_usage": 0, "mem_usage": 0},
273+
)
237274

238275
row = TableRow(
239276
namespace,
@@ -249,6 +286,10 @@ def build_table(
249286
resource_dict["mem_limit"] / total_capacity["memory"] * 100,
250287
metric_dict["mem_usage"],
251288
metric_dict["mem_usage"] / total_capacity["memory"] * 100,
289+
resource_dict["storage_request"],
290+
resource_dict["storage_request"] / total_capacity["storage"] * 100,
291+
resource_dict["storage_limit"],
292+
resource_dict["storage_limit"] / total_capacity["storage"] * 100,
252293
)
253294
table.append(row)
254295

@@ -266,13 +307,17 @@ def sort_table(table: list[TableRow], sort_key: str) -> list[TableRow]:
266307
"mem-request": lambda row: row.mem_request,
267308
"mem-limit": lambda row: row.mem_limit,
268309
"mem-usage": lambda row: row.mem_usage,
310+
"storage-request": lambda row: row.storage_request,
311+
"storage-limit": lambda row: row.storage_limit,
269312
"n": lambda row: row.namespace,
270313
"cr": lambda row: row.cpu_request,
271314
"cl": lambda row: row.cpu_limit,
272315
"cu": lambda row: row.cpu_usage,
273316
"mr": lambda row: row.mem_request,
274317
"ml": lambda row: row.mem_limit,
275318
"mu": lambda row: row.mem_usage,
319+
"sr": lambda row: row.storage_request,
320+
"sl": lambda row: row.storage_limit,
276321
}
277322

278323
# Ensure the provided sort_key is valid
@@ -290,6 +335,8 @@ def add_total_row(table: list[TableRow]) -> list[TableRow]:
290335
total_mem_request = sum(row.mem_request for row in table)
291336
total_mem_limit = sum(row.mem_limit for row in table)
292337
total_mem_usage = sum(row.mem_usage for row in table)
338+
total_storage_request = sum(row.storage_request for row in table)
339+
total_storage_limit = sum(row.storage_limit for row in table)
293340

294341
total_row = TableRow(
295342
namespace="Total Used",
@@ -305,6 +352,10 @@ def add_total_row(table: list[TableRow]) -> list[TableRow]:
305352
mem_limit_percent=sum(row.mem_limit_percent for row in table),
306353
mem_usage=total_mem_usage,
307354
mem_usage_percent=sum(row.mem_usage_percent for row in table),
355+
storage_request=total_storage_request,
356+
storage_request_percent=sum(row.storage_request_percent for row in table),
357+
storage_limit=total_storage_limit,
358+
storage_limit_percent=sum(row.storage_limit_percent for row in table),
308359
)
309360

310361
table.append(total_row)
@@ -329,6 +380,10 @@ def add_capacity_row(
329380
mem_limit_percent=100.0,
330381
mem_usage=0,
331382
mem_usage_percent=0,
383+
storage_request=total_capacity["storage"],
384+
storage_request_percent=100.0,
385+
storage_limit=total_capacity["storage"],
386+
storage_limit_percent=100.0,
332387
)
333388

334389
table.append(capacity_row)
@@ -365,6 +420,10 @@ def print_table(table: list[TableRow]) -> None:
365420
Column("%", justify="right"),
366421
Column("Mem Usage"),
367422
Column("%", justify="right"),
423+
Column("Storage Req"),
424+
Column("%", justify="right"),
425+
Column("Storage Lim"),
426+
Column("%", justify="right"),
368427
]
369428

370429
rich_table = Table(*headers, box=box.SIMPLE)
@@ -386,6 +445,13 @@ def print_table(table: list[TableRow]) -> None:
386445
calc_severity(row.mem_limit_percent, row.namespace != "Total Capacity"),
387446
format_mem(row.mem_usage),
388447
calc_severity(row.mem_usage_percent, row.namespace != "Total Capacity"),
448+
format_mem(row.storage_request),
449+
calc_severity(
450+
row.storage_request_percent,
451+
row.namespace != "Total Capacity",
452+
),
453+
format_mem(row.storage_limit),
454+
calc_severity(row.storage_limit_percent, row.namespace != "Total Capacity"),
389455
]
390456
rich_table.add_row(*pretty_row)
391457

@@ -411,6 +477,10 @@ def print_csv(table: list[TableRow]) -> None:
411477
"mem_limit_percent",
412478
"mem_usage",
413479
"mem_usage_percent",
480+
"storage_request",
481+
"storage_request_percent",
482+
"storage_limit",
483+
"storage_limit_percent",
414484
]
415485
writer.writerow(headers)
416486

@@ -431,6 +501,10 @@ def print_csv(table: list[TableRow]) -> None:
431501
row.mem_limit_percent,
432502
row.mem_usage,
433503
row.mem_usage_percent,
504+
row.storage_request,
505+
row.storage_request_percent,
506+
row.storage_limit,
507+
row.storage_limit_percent,
434508
],
435509
)
436510

@@ -459,13 +533,17 @@ def parse_args() -> argparse.Namespace:
459533
"mem-request",
460534
"mem-limit",
461535
"mem-usage",
536+
"storage-request",
537+
"storage-limit",
462538
"n",
463539
"cr",
464540
"cl",
465541
"cu",
466542
"mr",
467543
"ml",
468544
"mu",
545+
"sr",
546+
"sl",
469547
],
470548
help="sort by specified field",
471549
)

0 commit comments

Comments
 (0)