Small statistics refactor

Extracted common parts to separate methods
Added get_stat_value()

Signed-off-by: Daniel Madej <daniel.madej@huawei.com>
This commit is contained in:
Daniel Madej 2024-10-02 17:49:17 +02:00
parent 2a536b0007
commit 65879e01cd

View File

@ -5,9 +5,8 @@
# #
import csv import csv
from enum import Enum
from datetime import timedelta from datetime import timedelta
from enum import Enum
from typing import List from typing import List
from api.cas import casadm from api.cas import casadm
@ -43,34 +42,10 @@ class CacheStats:
filter: List[StatsFilter] = None, filter: List[StatsFilter] = None,
percentage_val: bool = False, percentage_val: bool = False,
): ):
stats_dict = get_stats_dict(filter=filter, cache_id=cache_id)
if filter is None: for section in _get_section_filters(filter):
filters = [ match section:
StatsFilter.conf,
StatsFilter.usage,
StatsFilter.req,
StatsFilter.blk,
StatsFilter.err,
]
else:
filters = filter
csv_stats = casadm.print_statistics(
cache_id=cache_id,
filter=filter,
output_format=casadm.OutputFormat.csv,
).stdout.splitlines()
stat_keys, stat_values = csv.reader(csv_stats)
# Unify names in block stats for core and cache:
# cache stats: Reads from core(s)
# core stats: Reads from core
stat_keys = [x.replace("(s)", "") for x in stat_keys]
stats_dict = dict(zip(stat_keys, stat_values))
for filter in filters:
match filter:
case StatsFilter.conf: case StatsFilter.conf:
self.config_stats = CacheConfigStats(stats_dict) self.config_stats = CacheConfigStats(stats_dict)
case StatsFilter.usage: case StatsFilter.usage:
@ -102,30 +77,10 @@ class CoreStats:
filter: List[StatsFilter] = None, filter: List[StatsFilter] = None,
percentage_val: bool = False, percentage_val: bool = False,
): ):
stats_dict = get_stats_dict(filter=filter, cache_id=cache_id, core_id=core_id)
if filter is None: for section in _get_section_filters(filter):
filters = [ match section:
StatsFilter.conf,
StatsFilter.usage,
StatsFilter.req,
StatsFilter.blk,
StatsFilter.err,
]
else:
filters = filter
csv_stats = casadm.print_statistics(
cache_id=cache_id,
core_id=core_id,
filter=filter,
output_format=casadm.OutputFormat.csv,
).stdout.splitlines()
stat_keys, stat_values = csv.reader(csv_stats)
stats_dict = dict(zip(stat_keys, stat_values))
for filter in filters:
match filter:
case StatsFilter.conf: case StatsFilter.conf:
self.config_stats = CoreConfigStats(stats_dict) self.config_stats = CoreConfigStats(stats_dict)
case StatsFilter.usage: case StatsFilter.usage:
@ -158,34 +113,12 @@ class CoreIoClassStats:
filter: List[StatsFilter] = None, filter: List[StatsFilter] = None,
percentage_val: bool = False, percentage_val: bool = False,
): ):
if filter is None: stats_dict = get_stats_dict(
filters = [ filter=filter, cache_id=cache_id, core_id=core_id, io_class_id=io_class_id
StatsFilter.conf, )
StatsFilter.usage,
StatsFilter.req,
StatsFilter.blk,
]
else:
filters = filter
csv_stats = casadm.print_statistics( for section in _get_section_filters(filter):
cache_id=cache_id, match section:
core_id=core_id,
io_class_id=io_class_id,
filter=filter,
output_format=casadm.OutputFormat.csv,
).stdout.splitlines()
stat_keys, stat_values = csv.reader(csv_stats)
# Unify names in block stats for core and cache:
# cache stats: Reads from core(s)
# core stats: Reads from core
stat_keys = [x.replace("(s)", "") for x in stat_keys]
stats_dict = dict(zip(stat_keys, stat_values))
for filter in filters:
match filter:
case StatsFilter.conf: case StatsFilter.conf:
self.config_stats = IoClassConfigStats(stats_dict) self.config_stats = IoClassConfigStats(stats_dict)
case StatsFilter.usage: case StatsFilter.usage:
@ -243,7 +176,7 @@ class CacheConfigStats:
self.metadata_memory_footprint = parse_value( self.metadata_memory_footprint = parse_value(
value=stats_dict["Metadata Memory Footprint [MiB]"], unit_type=UnitType.mebibyte value=stats_dict["Metadata Memory Footprint [MiB]"], unit_type=UnitType.mebibyte
) )
self.dirty_for = parse_value(value=stats_dict["Dirty for [s]"], unit_type="[s]") self.dirty_for = parse_value(value=stats_dict["Dirty for [s]"], unit_type=UnitType.seconds)
self.status = stats_dict["Status"] self.status = stats_dict["Status"]
def __str__(self): def __str__(self):
@ -655,6 +588,12 @@ class BasicStatsChunkError:
) )
def get_stat_value(stat_dict: dict, key: str):
idx = key.index("[")
unit = UnitType(key[idx:])
return parse_value(stat_dict[key], unit)
def parse_value(value: str, unit_type: UnitType) -> int | float | Size | timedelta | str: def parse_value(value: str, unit_type: UnitType) -> int | float | Size | timedelta | str:
match unit_type: match unit_type:
case UnitType.requests: case UnitType.requests:
@ -674,3 +613,42 @@ def parse_value(value: str, unit_type: UnitType) -> int | float | Size | timedel
case _: case _:
stat_unit = value stat_unit = value
return stat_unit return stat_unit
def _get_section_filters(filter: List[StatsFilter], io_class_stats: bool = False):
if filter is None or StatsFilter.all in filter:
filters = [
StatsFilter.conf,
StatsFilter.usage,
StatsFilter.req,
StatsFilter.blk,
StatsFilter.err,
]
else:
filters = filter
if io_class_stats and StatsFilter.err in filters:
filters.remove(StatsFilter.err)
return filters
def get_stats_dict(
filter: List[StatsFilter],
cache_id: int,
core_id: int = None,
io_class_id: int = None
):
csv_stats = casadm.print_statistics(
cache_id=cache_id,
core_id=core_id,
io_class_id=io_class_id,
filter=filter,
output_format=casadm.OutputFormat.csv,
).stdout.splitlines()
stat_keys, stat_values = csv.reader(csv_stats)
# Unify names in block stats for core and cache to easier compare
# cache vs core stats using unified key
# cache stats: Reads from core(s)
# core stats: Reads from core
stat_keys = [x.replace("(s)", "") for x in stat_keys]
stats_dict = dict(zip(stat_keys, stat_values))
return stats_dict