Skip to content

Container Monitor

PyCloudSim has created a series of container monitor for convenience.

Container Logging Monitor

This monitor simply output the container telemetries in terminal

Bases: Monitor

A default container monitor that will simply log the CPU and RAM usage of the containers.

Source code in PyCloudSim\monitor\container_monitor.py
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class LoggingContainerMonitor(Monitor):
    """A default container monitor that will simply log the CPU and RAM usage of the containers.
    """
    def __init__(
        self,
        label: str,
        target_containers: List[vContainer] | None = None,
        sample_period: int | float | Callable[..., int] | Callable[..., float] = 0.1,
    ) -> None:
        """Initialize the LoggingContainerMonitor.

        Args:
            label (str): short name of the monitor.
            target_containers (List[vContainer] | None, optional): the container to be monitored. Defaults to None then all containers will be monitored.
            sample_period (int | float | Callable[..., int] | Callable[..., float], optional): the sampling period. Defaults to 0.1.
        """
        super().__init__(label, sample_period)

        if target_containers is None:
            self._target_containers = simulation.containers
        else:
            self._target_containers = target_containers

    def on_observation(self, *arg, **kwargs):
        """Simply log the CPU and RAM usage of the containers.
        """
        for container in self.target_containers:
            if container.initiated:
                logger.info(
                    f"{simulation.now}:\t{container} CPU usage: {container.cpu_usage/container.cpu_limit*100:.2f}% , RAM usage: {container.ram_usage/container.ram_limit*100:.2f}%"
                )

    @property
    def target_containers(self):
        """Return the target containers of the monitor."""
        return self._target_containers

target_containers property

Return the target containers of the monitor.

__init__(label, target_containers=None, sample_period=0.1)

Initialize the LoggingContainerMonitor.

Parameters:

Name Type Description Default
label str

short name of the monitor.

required
target_containers List[vContainer] | None

the container to be monitored. Defaults to None then all containers will be monitored.

None
sample_period int | float | Callable[..., int] | Callable[..., float]

the sampling period. Defaults to 0.1.

0.1
Source code in PyCloudSim\monitor\container_monitor.py
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
def __init__(
    self,
    label: str,
    target_containers: List[vContainer] | None = None,
    sample_period: int | float | Callable[..., int] | Callable[..., float] = 0.1,
) -> None:
    """Initialize the LoggingContainerMonitor.

    Args:
        label (str): short name of the monitor.
        target_containers (List[vContainer] | None, optional): the container to be monitored. Defaults to None then all containers will be monitored.
        sample_period (int | float | Callable[..., int] | Callable[..., float], optional): the sampling period. Defaults to 0.1.
    """
    super().__init__(label, sample_period)

    if target_containers is None:
        self._target_containers = simulation.containers
    else:
        self._target_containers = target_containers

on_observation(*arg, **kwargs)

Simply log the CPU and RAM usage of the containers.

Source code in PyCloudSim\monitor\container_monitor.py
38
39
40
41
42
43
44
45
def on_observation(self, *arg, **kwargs):
    """Simply log the CPU and RAM usage of the containers.
    """
    for container in self.target_containers:
        if container.initiated:
            logger.info(
                f"{simulation.now}:\t{container} CPU usage: {container.cpu_usage/container.cpu_limit*100:.2f}% , RAM usage: {container.ram_usage/container.ram_limit*100:.2f}%"
            )

Container Dataframe Monitor

This monitor create a pandas data frame to record the container telemetries.

Bases: Monitor

A simple monitor that will log the CPU and RAM usage of the containers in a dataframe.

Source code in PyCloudSim\monitor\container_monitor.py
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
class DataframeContainerMonitor(Monitor):
    """A simple monitor that will log the CPU and RAM usage of the containers in a dataframe."""
    def __init__(
        self,
        label: str,
        target_containers: List[vContainer] | None = None,
        sample_period: int | float | Callable[..., int] | Callable[..., float] = 0.1,
    ) -> None:
        """Initialize the LoggingContainerMonitor.

        Args:
            label (str): short name of the monitor.
            target_containers (List[vContainer] | None, optional): the container to be monitored. Defaults to None then all containers will be monitored.
            sample_period (int | float | Callable[..., int] | Callable[..., float], optional): the sampling period. Defaults to 0.1.
        """
        super().__init__(label, sample_period)

        if target_containers is None:
            self._target_containers = simulation.containers
        else:
            self._target_containers = target_containers

        self._dataframe = pd.DataFrame({
            "time": pd.Series([], dtype="str"),
            "container_label": pd.Series([], dtype="str"),
            "cpu_usage": pd.Series([], dtype="float"),
            "cpu_usage_percent": pd.Series([], dtype="float"),
            "ram_usage": pd.Series([], dtype="float"),
            "ram_usage_percent": pd.Series([], dtype="float"),
            "num_of_process": pd.Series([], dtype="int"),
        })

    def on_observation(self, *arg, **kwargs):
        """Collect the data from the containers and append it to the dataframe."""
        for container in self.target_containers:
            if container.initiated:
                container_telemetries = pd.DataFrame(
                    {
                        "time": pd.Series([simulation.now], dtype="str"),
                        "container_label": pd.Series([container.label], dtype="str"),
                        "cpu_usage": pd.Series([container.cpu_usage], dtype="float"),
                        "cpu_usage_percent": pd.Series([container.cpu_usage/container.cpu_limit*100], dtype="float"),
                        "ram_usage": pd.Series([container.ram_usage], dtype="float"),
                        "ram_usage_percent": pd.Series([container.ram_usage/container.ram_limit*100], dtype="float"),
                        "num_of_process": pd.Series([len(container.process_queue)], dtype="int"),
                    }
                )
                self._dataframe = pd.concat([self._dataframe, container_telemetries], ignore_index=True)


    @property
    def target_containers(self):
        """Return the target containers of the monitor."""
        return self._target_containers

    @property
    def dataframe(self):
        """Return the dataframe of the monitor."""
        return self._dataframe

dataframe property

Return the dataframe of the monitor.

target_containers property

Return the target containers of the monitor.

__init__(label, target_containers=None, sample_period=0.1)

Initialize the LoggingContainerMonitor.

Parameters:

Name Type Description Default
label str

short name of the monitor.

required
target_containers List[vContainer] | None

the container to be monitored. Defaults to None then all containers will be monitored.

None
sample_period int | float | Callable[..., int] | Callable[..., float]

the sampling period. Defaults to 0.1.

0.1
Source code in PyCloudSim\monitor\container_monitor.py
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
def __init__(
    self,
    label: str,
    target_containers: List[vContainer] | None = None,
    sample_period: int | float | Callable[..., int] | Callable[..., float] = 0.1,
) -> None:
    """Initialize the LoggingContainerMonitor.

    Args:
        label (str): short name of the monitor.
        target_containers (List[vContainer] | None, optional): the container to be monitored. Defaults to None then all containers will be monitored.
        sample_period (int | float | Callable[..., int] | Callable[..., float], optional): the sampling period. Defaults to 0.1.
    """
    super().__init__(label, sample_period)

    if target_containers is None:
        self._target_containers = simulation.containers
    else:
        self._target_containers = target_containers

    self._dataframe = pd.DataFrame({
        "time": pd.Series([], dtype="str"),
        "container_label": pd.Series([], dtype="str"),
        "cpu_usage": pd.Series([], dtype="float"),
        "cpu_usage_percent": pd.Series([], dtype="float"),
        "ram_usage": pd.Series([], dtype="float"),
        "ram_usage_percent": pd.Series([], dtype="float"),
        "num_of_process": pd.Series([], dtype="int"),
    })

on_observation(*arg, **kwargs)

Collect the data from the containers and append it to the dataframe.

Source code in PyCloudSim\monitor\container_monitor.py
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
def on_observation(self, *arg, **kwargs):
    """Collect the data from the containers and append it to the dataframe."""
    for container in self.target_containers:
        if container.initiated:
            container_telemetries = pd.DataFrame(
                {
                    "time": pd.Series([simulation.now], dtype="str"),
                    "container_label": pd.Series([container.label], dtype="str"),
                    "cpu_usage": pd.Series([container.cpu_usage], dtype="float"),
                    "cpu_usage_percent": pd.Series([container.cpu_usage/container.cpu_limit*100], dtype="float"),
                    "ram_usage": pd.Series([container.ram_usage], dtype="float"),
                    "ram_usage_percent": pd.Series([container.ram_usage/container.ram_limit*100], dtype="float"),
                    "num_of_process": pd.Series([len(container.process_queue)], dtype="int"),
                }
            )
            self._dataframe = pd.concat([self._dataframe, container_telemetries], ignore_index=True)