Commit 391cfbe6 authored by Carlos Natalino's avatar Carlos Natalino
Browse files

Improving the scripts and including the case where the ping times out and a...

Improving the scripts and including the case where the ping times out and a minus one is sent to the monitoring component.
parent 96a7dee2
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
# Probe for P4 mininet devices

To check the latest monitoring samples, run

```
python src/tests/p4/probe/monitoring_kpis.py
```
 No newline at end of file
+20 −0
Original line number Diff line number Diff line
%% Cell type:markdown id: tags:

# Checking the monitoring component

%% Cell type:code id: tags:

``` python
import time
import datetime
import uuid
import random

from dotenv import load_dotenv
from IPython.display import clear_output, display, HTML

from common.tools.timestamp.Converters import timestamp_utcnow_to_float, timestamp_float_to_string
from common.tools.grpc.Tools import grpc_message_to_json_string
from common.proto.kpi_sample_types_pb2 import KpiSampleType
from common.proto.monitoring_pb2 import KpiDescriptor, KpiId, KpiQuery, Kpi
from monitoring.client.MonitoringClient import MonitoringClient
```

%% Cell type:code id: tags:

``` python
load_dotenv()

monitoring_client = MonitoringClient()
uuid.uuid4().hex
```

%% Output

    '0abfb00117d4461b9fa5085bee4be58f'

%% Cell type:code id: tags:

``` python
kpi_description: KpiDescriptor = KpiDescriptor()
kpi_description.kpi_description = "Security status of service {}".format(uuid.uuid4().hex)
kpi_description.service_id.service_uuid.uuid = "608df176-90b8-5950-b50d-1810c6eaaa5d"
kpi_description.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_UNKNOWN
new_kpi = monitoring_client.SetKpi(kpi_description)
print("Created KPI {}: ".format(grpc_message_to_json_string(new_kpi)))
```

%% Output

    Created KPI {"kpi_id": {"uuid": "1"}}:

%% Cell type:code id: tags:

``` python
kpi_id = input("What is the KPI ID?")
query = KpiQuery()
query.kpi_ids.append(KpiId(**{"kpi_id": {"uuid": kpi_id}}))
query.last_n_samples = 10

while True:

    kpi = Kpi()
    kpi.kpi_id.kpi_id.uuid = new_kpi.kpi_id.uuid
    kpi.timestamp.timestamp = timestamp_utcnow_to_float()
    kpi.kpi_value.int32Val = random.randint(10, 4000)
    # monitoring_client.IncludeKpi(kpi)

    response = monitoring_client.QueryKpiData(query)
    # print(response)
    table = f"""<table>
    <thead>
        <tr><th colspan=3>{datetime.datetime.now()}</th></tr>
        <tr><th>KPI ID</th><th>Timestamp</th><th>Value</th></tr>
    <thead>
    <tbody>"""
    for kpi in response.raw_kpi_lists:
        cur_kpi_id = kpi.kpi_id.kpi_id.uuid
        for i, raw_kpi in enumerate(kpi.raw_kpis):
            # print(cur_kpi_id, raw_kpi.timestamp.timestamp, raw_kpi.kpi_value)
            table += "<tr><td>{} - {}</td><td>{}</td><td>{}</td></tr>".format(
                i, cur_kpi_id, timestamp_float_to_string(raw_kpi.timestamp.timestamp), raw_kpi.kpi_value
            )
    table += "</tbody></table>"
    display(HTML(table))
    time.sleep(5)
    clear_output(wait=True)
```

%% Output


    ---------------------------------------------------------------------------
    KeyboardInterrupt                         Traceback (most recent call last)
Cell     In [4], line 31
         29 table += "</tbody></table>"
         30 display(HTML(table))
    ---> 31 time.sleep(5)
         32 clear_output(wait=True)
    KeyboardInterrupt:
+71 −0
Original line number Diff line number Diff line
# File to monitor the latest *n* samples from the KPI ID *id*
# and updates it every *i* seconds
#
# Author: Carlos Natalino <carlos.natalino@chalmers.se>

import argparse
import datetime
import time

from common.proto.kpi_sample_types_pb2 import KpiSampleType
from common.proto.monitoring_pb2 import KpiDescriptor, KpiId, KpiQuery
from common.tools.grpc.Tools import grpc_message_to_json_string
from common.tools.timestamp.Converters import timestamp_float_to_string
from monitoring.client.MonitoringClient import MonitoringClient

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-n",
        "--last-n-samples",
        default=10,
        type=int,
        help="Number of latest samples of the KPI to show.",
    )
    parser.add_argument(
        "-s",
        "--sleep",
        default=5,
        type=int,
        help="Seconds between consecutive refreshes.",
    )
    parser.add_argument("-id", "--kpi-id", help="KPI ID, if known.")
    args = parser.parse_args()

    monitoring_client = MonitoringClient()

    if args.kpi_id is None:
        service_uuid = "608df176-90b8-5950-b50d-1810c6eaaa5d"
        kpi_description: KpiDescriptor = KpiDescriptor()
        kpi_description.kpi_description = "Security status of service {}".format(
            service_uuid
        )
        kpi_description.service_id.service_uuid.uuid = service_uuid
        kpi_description.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_UNKNOWN
        new_kpi = monitoring_client.SetKpi(kpi_description)
        print("Created KPI {}: ".format(grpc_message_to_json_string(new_kpi)))
        kpi_id = new_kpi.kpi_id.uuid
    else:
        kpi_id = args.kpi_id

    query = KpiQuery()
    query.kpi_ids.append(KpiId(**{"kpi_id": {"uuid": kpi_id}}))
    query.last_n_samples = args.last_n_samples

    while True:
        print(chr(27) + "[2J")
        response = monitoring_client.QueryKpiData(query)
        print("{}\t{}\t{:<20}\t{}".format("Index", "KPI ID", "Timestamp", "Value"))
        for kpi in response.raw_kpi_lists:
            cur_kpi_id = kpi.kpi_id.kpi_id.uuid
            for i, raw_kpi in enumerate(kpi.raw_kpis):
                print(
                    "{}\t{}\t{}\t{}".format(
                        i,
                        cur_kpi_id,
                        timestamp_float_to_string(raw_kpi.timestamp.timestamp),
                        raw_kpi.kpi_value.floatVal,
                    )
                )
        print("Last update:", datetime.datetime.now().strftime("%H:%M:%S"))
        time.sleep(args.sleep)
+7 −1
Original line number Diff line number Diff line
/**
 * Build script that generates Rust code for the protobuffers.
 *
 * Author: Carlos Natalino <carlos.natalino@chalmers.se>
 */

fn main() {
    tonic_build::configure()
        .build_server(false)
@@ -8,7 +14,7 @@ fn main() {
                "proto/kpi_sample_types.proto",
                "proto/monitoring.proto",
            ],
            &["proto"]
            &["proto"],
        )
        .unwrap_or_else(|e| panic!("Failed to compile protos {:?}", e));
}
+7 −0
Original line number Diff line number Diff line
@@ -4,6 +4,13 @@

# build a .env file with the info from context and monitoring services

if [ -z "${CONTEXTSERVICE_SERVICE_HOST}" ] || [ -z "${CONTEXTSERVICE_SERVICE_PORT_GRPC}" ] || \
   [ -z "${MONITORINGSERVICE_SERVICE_HOST}" ] || [ -z "${MONITORINGSERVICE_SERVICE_PORT_GRPC}" ]
then
    echo "TFS_ENV_VARS are not loaded."
    exit 1
fi

echo "CONTEXTSERVICE_SERVICE_HOST=${CONTEXTSERVICE_SERVICE_HOST}" > .env
echo "CONTEXTSERVICE_SERVICE_PORT_GRPC=${CONTEXTSERVICE_SERVICE_PORT_GRPC}" >> .env
echo "MONITORINGSERVICE_SERVICE_HOST=${MONITORINGSERVICE_SERVICE_HOST}" >> .env
Loading