Skip to content

Host Monitor

PyCloudSim has implemented a series of default host monitors for convenience.

Host Logging Monitor

This monitor simply output the telemetries of the host in terminal.

Bases: Monitor

A default host monitor that will simply log the CPU and RAM usage of the hosts.

Source code in PyCloudSim\monitor\host_monitor.py
14
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
class LoggingHostMonitor(Monitor):
    """A default host monitor that will simply log the CPU and RAM usage of the hosts."""

    def __init__(
        self,
        label: str,
        target_hosts: List[vHost] | None = None,
        sample_period: int | float | Callable[..., int] | Callable[..., float] = 0.1,
    ) -> None:
        """Initialize the LoggingHostMonitor.

        Args:
            label (str): short name of the monitor.
            target_hosts (List[vHost] | None, optional): the hosts to be monitored. Defaults to None then all hosts will be monitored.
            sample_period (int | float | Callable[..., int] | Callable[..., float], optional): the sampling frequency. Defaults to 0.1.
        """
        super().__init__(label, sample_period)

        if target_hosts is None:
            self._target_hosts = simulation.hosts
        else:
            self._target_hosts = target_hosts

    def on_observation(self, *arg, **kwargs):
        """Collect the data from the hosts and log it."""
        for host in self.target_hosts:
            if host.powered_on:
                logger.info(
                    f"{simulation.now}:\t{host} CPU usage: {host.cpu_utilization(self.sample_period)*100:.2f}% , RAM usage: {host.ram_utilization(self.sample_period)*100:.2f}%, BW-Out usage: {host.NIC.egress_usage(self.sample_period):.2f}%, BW-In usage: {host.NIC.ingress_usage(self.sample_period):.2f}%"
                )

    @property
    def target_hosts(self):
        """The target hosts of the monitor."""
        return self._target_hosts

target_hosts property

The target hosts of the monitor.

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

Initialize the LoggingHostMonitor.

Parameters:

Name Type Description Default
label str

short name of the monitor.

required
target_hosts List[vHost] | None

the hosts to be monitored. Defaults to None then all hosts will be monitored.

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

the sampling frequency. Defaults to 0.1.

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

    Args:
        label (str): short name of the monitor.
        target_hosts (List[vHost] | None, optional): the hosts to be monitored. Defaults to None then all hosts will be monitored.
        sample_period (int | float | Callable[..., int] | Callable[..., float], optional): the sampling frequency. Defaults to 0.1.
    """
    super().__init__(label, sample_period)

    if target_hosts is None:
        self._target_hosts = simulation.hosts
    else:
        self._target_hosts = target_hosts

on_observation(*arg, **kwargs)

Collect the data from the hosts and log it.

Source code in PyCloudSim\monitor\host_monitor.py
37
38
39
40
41
42
43
def on_observation(self, *arg, **kwargs):
    """Collect the data from the hosts and log it."""
    for host in self.target_hosts:
        if host.powered_on:
            logger.info(
                f"{simulation.now}:\t{host} CPU usage: {host.cpu_utilization(self.sample_period)*100:.2f}% , RAM usage: {host.ram_utilization(self.sample_period)*100:.2f}%, BW-Out usage: {host.NIC.egress_usage(self.sample_period):.2f}%, BW-In usage: {host.NIC.ingress_usage(self.sample_period):.2f}%"
            )

Host Dataframe Monitor

This monitor will create a pandas dataframe to record the telemetries.

Bases: Monitor

Source code in PyCloudSim\monitor\host_monitor.py
 51
 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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
class DataframeHostMonitor(Monitor):
    def __init__(
        self,
        label: str,
        target_hosts: List[vHost] | None = None,
        sample_period: int | float | Callable[..., int] | Callable[..., float] = 0.1,
    ) -> None:
        """Initialize the LoggingHostMonitor.

        Args:
            label (str): short name of the monitor.
            target_hosts (List[vHost] | None, optional): the hosts to be monitored. Defaults to None then all hosts will be monitored.
            sample_period (int | float | Callable[..., int] | Callable[..., float], optional): the sampling frequency. Defaults to 0.1.
        """
        super().__init__(label, sample_period)

        if target_hosts is None:
            self._target_hosts = simulation.hosts
        else:
            self._target_hosts = target_hosts

        self._dataframe = pd.DataFrame(
            {
                "time": pd.Series([], dtype="str"),
                "host_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"),
                "rom_usage": pd.Series([], dtype="float"),
                "rom_usage_percent": pd.Series([], dtype="float"),
                "bandwidth_usage": pd.Series([], dtype="float"),
                "ingress_usage": pd.Series([], dtype="float"),
                "ingress_usage_percent": pd.Series([], dtype="float"),
                "egress_usage": pd.Series([], dtype="float"),
                "egress_usage_percent": pd.Series([], dtype="float"),
            }
        )

    def on_observation(self, *arg, **kwargs):
        """Collect the data from the hosts and append it to the dataframe."""
        for host in self.target_hosts:
            host_telemetries = pd.DataFrame(
                {
                    "time": pd.Series([simulation.now], dtype="str"),
                    "host_label": pd.Series([host.label], dtype="str"),
                    "cpu_usage": pd.Series(
                        [host.cpu_usage(self.sample_period)], dtype="float"
                    ),
                    "cpu_usage_percent": pd.Series(
                        [host.cpu_utilization(self.sample_period) * 100], dtype="float"
                    ),
                    "ram_usage": pd.Series(
                        [host.ram_usage(self.sample_period)], dtype="float"
                    ),
                    "ram_usage_percent": pd.Series(
                        [host.ram_utilization(self.sample_period) * 100], dtype="float"
                    ),
                    "rom_usage": pd.Series(
                        [host.rom.usage(self.sample_period)], dtype="float"
                    ),
                    "rom_usage_percent": pd.Series(
                        [host.rom.utilization(self.sample_period) * 100], dtype="float"
                    ),
                    "bandwidth_usage": pd.Series(
                        [host.NIC.egress_usage(self.sample_period)], dtype="float"
                    ),
                    "ingress_usage": pd.Series(
                        [host.NIC.ingress_usage(self.sample_period)], dtype="float"
                    ),
                    "ingress_usage_percent": pd.Series(
                        [host.NIC.ingress_utilization(self.sample_period) * 100],
                        dtype="float",
                    ),
                    "egress_usage": pd.Series(
                        [host.NIC.egress_usage(self.sample_period)], dtype="float"
                    ),
                    "egress_usage_percent": pd.Series(
                        [host.NIC.egress_utilization(self.sample_period) * 100],
                        dtype="float",
                    ),
                }
            )
            self._dataframe = pd.concat(
                [self._dataframe, host_telemetries], ignore_index=True
            )

    @property
    def target_hosts(self):
        """The target hosts of the monitor."""
        return self._target_hosts

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

dataframe property

Return the dataframe of the monitor.

target_hosts property

The target hosts of the monitor.

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

Initialize the LoggingHostMonitor.

Parameters:

Name Type Description Default
label str

short name of the monitor.

required
target_hosts List[vHost] | None

the hosts to be monitored. Defaults to None then all hosts will be monitored.

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

the sampling frequency. Defaults to 0.1.

0.1
Source code in PyCloudSim\monitor\host_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
def __init__(
    self,
    label: str,
    target_hosts: List[vHost] | None = None,
    sample_period: int | float | Callable[..., int] | Callable[..., float] = 0.1,
) -> None:
    """Initialize the LoggingHostMonitor.

    Args:
        label (str): short name of the monitor.
        target_hosts (List[vHost] | None, optional): the hosts to be monitored. Defaults to None then all hosts will be monitored.
        sample_period (int | float | Callable[..., int] | Callable[..., float], optional): the sampling frequency. Defaults to 0.1.
    """
    super().__init__(label, sample_period)

    if target_hosts is None:
        self._target_hosts = simulation.hosts
    else:
        self._target_hosts = target_hosts

    self._dataframe = pd.DataFrame(
        {
            "time": pd.Series([], dtype="str"),
            "host_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"),
            "rom_usage": pd.Series([], dtype="float"),
            "rom_usage_percent": pd.Series([], dtype="float"),
            "bandwidth_usage": pd.Series([], dtype="float"),
            "ingress_usage": pd.Series([], dtype="float"),
            "ingress_usage_percent": pd.Series([], dtype="float"),
            "egress_usage": pd.Series([], dtype="float"),
            "egress_usage_percent": pd.Series([], dtype="float"),
        }
    )

on_observation(*arg, **kwargs)

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

Source code in PyCloudSim\monitor\host_monitor.py
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
def on_observation(self, *arg, **kwargs):
    """Collect the data from the hosts and append it to the dataframe."""
    for host in self.target_hosts:
        host_telemetries = pd.DataFrame(
            {
                "time": pd.Series([simulation.now], dtype="str"),
                "host_label": pd.Series([host.label], dtype="str"),
                "cpu_usage": pd.Series(
                    [host.cpu_usage(self.sample_period)], dtype="float"
                ),
                "cpu_usage_percent": pd.Series(
                    [host.cpu_utilization(self.sample_period) * 100], dtype="float"
                ),
                "ram_usage": pd.Series(
                    [host.ram_usage(self.sample_period)], dtype="float"
                ),
                "ram_usage_percent": pd.Series(
                    [host.ram_utilization(self.sample_period) * 100], dtype="float"
                ),
                "rom_usage": pd.Series(
                    [host.rom.usage(self.sample_period)], dtype="float"
                ),
                "rom_usage_percent": pd.Series(
                    [host.rom.utilization(self.sample_period) * 100], dtype="float"
                ),
                "bandwidth_usage": pd.Series(
                    [host.NIC.egress_usage(self.sample_period)], dtype="float"
                ),
                "ingress_usage": pd.Series(
                    [host.NIC.ingress_usage(self.sample_period)], dtype="float"
                ),
                "ingress_usage_percent": pd.Series(
                    [host.NIC.ingress_utilization(self.sample_period) * 100],
                    dtype="float",
                ),
                "egress_usage": pd.Series(
                    [host.NIC.egress_usage(self.sample_period)], dtype="float"
                ),
                "egress_usage_percent": pd.Series(
                    [host.NIC.egress_utilization(self.sample_period) * 100],
                    dtype="float",
                ),
            }
        )
        self._dataframe = pd.concat(
            [self._dataframe, host_telemetries], ignore_index=True
        )