diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 668b5ce62658a085faebfb3fd6b9296edf50a928..e47c3f4610dc14fd9cac81081b78d9f62a7227df 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -34,7 +34,7 @@ include:
   - local: '/src/opticalattackmitigator/.gitlab-ci.yml'
   - local: '/src/opticalcentralizedattackdetector/.gitlab-ci.yml'
   - local: '/src/automation/.gitlab-ci.yml'
-  - local: '/src/webui/.gitlab-ci.yml'
+  #- local: '/src/webui/.gitlab-ci.yml'
   #- local: '/src/l3_distributedattackdetector/.gitlab-ci.yml'
   #- local: '/src/l3_centralizedattackdetector/.gitlab-ci.yml'
   #- local: '/src/l3_attackmitigator/.gitlab-ci.yml'
diff --git a/proto/monitoring.proto b/proto/monitoring.proto
index 293eb982a758e9869d8310134bd65bca6c8dfd32..ef3594e2a9fae7e6909de1755e242098e03712c4 100644
--- a/proto/monitoring.proto
+++ b/proto/monitoring.proto
@@ -19,12 +19,19 @@ import "context.proto";
 import "kpi_sample_types.proto";
 
 service MonitoringService {
-  rpc CreateKpi       (KpiDescriptor    ) returns (KpiId        ) {}
-  rpc GetKpiDescriptor(KpiId            ) returns (KpiDescriptor) {}
-  rpc IncludeKpi      (Kpi              ) returns (context.Empty) {}
-  rpc MonitorKpi      (MonitorKpiRequest) returns (context.Empty) {}
-  rpc GetStreamKpi    (KpiId            ) returns (stream Kpi   ) {}
-  rpc GetInstantKpi   (KpiId            ) returns (Kpi          ) {}
+  rpc CreateKpi               (KpiDescriptor        ) returns (KpiId            ) {}
+  rpc GetKpiDescriptor        (KpiId                ) returns (KpiDescriptor    ) {}
+  rpc IncludeKpi              (Kpi                  ) returns (context.Empty    ) {}
+  rpc MonitorKpi              (MonitorKpiRequest    ) returns (context.Empty    ) {}
+  rpc GetStreamKpi            (KpiId                ) returns (stream Kpi       ) {}
+  rpc GetInstantKpi           (KpiId                ) returns (Kpi              ) {}
+  rpc CreateMetrics           (MetricsDescriptor    ) returns (MetricsId        ) {}
+  rpc GetMetricsDescriptor    (MetricsId            ) returns (MetricsDescriptor) {}
+  rpc IncludeMetrics          (Metrics              ) returns (context.Empty    ) {}
+  rpc MonitorMetrics          (MonitorMetricsRequest) returns (context.Empty    ) {}
+  rpc GetStreamMetrics        (MetricsId            ) returns (stream Metrics   ) {}
+  rpc GetInstantMetrics       (MetricsId            ) returns (Metrics          ) {}
+
 }
 
 message KpiDescriptor {
@@ -36,22 +43,47 @@ message KpiDescriptor {
 //  context.SliceId    slice_id    = 6;
 }
 
+message MetricsDescriptor {
+  string metrics_description = 1;
+  kpi_sample_types.KpiSampleType kpi_sample_type = 2;
+  context.DeviceId device_id = 3;
+  context.EndPointId endpoint_id = 4;
+  context.ServiceId  service_id  = 5;
+//  context.SliceId    slice_id    = 6;
+}
+
 message MonitorKpiRequest{
   KpiId kpi_id = 1;
   float sampling_duration_s = 2;
   float sampling_interval_s = 3;
 }
 
+message MonitorMetricsRequest{
+  MetricsId metrics_id = 1;
+  float sampling_duration_s = 2;
+  float sampling_interval_s = 3;
+}
+
 message KpiId {
   context.Uuid kpi_id = 1;
 }
 
+message MetricsId {
+  context.Uuid kpi_id = 1;
+}
+
 message Kpi {
   KpiId kpi_id = 1;
   string timestamp = 2;
   KpiValue kpi_value = 4;
 }
 
+message Metrics {
+  MetricsId metrics_id = 1;
+  string timestamp = 2;
+  MetricsValue metrics_value = 4;
+}
+
 message KpiValue {
   oneof value {
     uint32 intVal = 1;
@@ -61,6 +93,19 @@ message KpiValue {
   }
 }
 
+message MetricsValue {
+  oneof value {
+    uint32 intVal = 1;
+    float floatVal = 2;
+    string stringVal = 3;
+    bool boolVal = 4;
+  }
+}
+
 message KpiList {
-  repeated Kpi kpi_list = 1;
+    repeated Kpi kpi_list = 1;
 }
+
+message MetricsList {
+    repeated Metrics metrics_list = 1;
+}
\ No newline at end of file
diff --git a/src/automation/.gitlab-ci.yml b/src/automation/.gitlab-ci.yml
index 76cd4ea0d07496af864275cd63c5fbd8f94b7659..87d141d5bef56c8d3fbd5bb5a0a961ac12598dd6 100644
--- a/src/automation/.gitlab-ci.yml
+++ b/src/automation/.gitlab-ci.yml
@@ -69,7 +69,6 @@ unit_test automation:
   coverage: '/JaCoCo Coverage Total: ([0-9]{1,3})%/'
   artifacts:
     reports:
-      cobertura: ${REPORTS_PATH}/cobertura.xml
       junit:
         - ${REPORTS_PATH}/surefire-reports/TEST-*.xml
   rules:
diff --git a/src/compute/.gitlab-ci.yml b/src/compute/.gitlab-ci.yml
index 7daa1764a9c10a79df3cc1b2aadb270b982c1224..f3d7c0f306b9d62a89382578bfb6c4c740b389e6 100644
--- a/src/compute/.gitlab-ci.yml
+++ b/src/compute/.gitlab-ci.yml
@@ -56,7 +56,6 @@ unit test compute:
     - docker ps -a
     - docker logs $IMAGE_NAME
     - docker exec -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_unitary.py --junitxml=/opt/results/${IMAGE_NAME}_report.xml"
-    - docker exec -i $IMAGE_NAME bash -c "coverage xml -o /opt/results/${IMAGE_NAME}_coverage.xml"
     - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing"
   coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
   after_script:
@@ -64,7 +63,7 @@ unit test compute:
     - docker network rm teraflowbridge
   rules:
     - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)'
-    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"' 
+    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"'
     - changes:
       - src/$IMAGE_NAME/**/*.{py,in,yml}
       - src/$IMAGE_NAME/Dockerfile
@@ -76,7 +75,6 @@ unit test compute:
       when: always
       reports:
         junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
-        cobertura: src/$IMAGE_NAME/tests/${IMAGE_NAME}_coverage.xml
 
 # Deployment of the service in Kubernetes Cluster
 deploy compute:
diff --git a/src/context/.gitlab-ci.yml b/src/context/.gitlab-ci.yml
index c0cbef8d7d8e2165e5d2f64c79fa2e6215ef8b96..dc302cbd3aa7dbe197450c91a0e9c90714df6110 100644
--- a/src/context/.gitlab-ci.yml
+++ b/src/context/.gitlab-ci.yml
@@ -58,7 +58,6 @@ unit test context:
     - docker ps -a
     - docker logs $IMAGE_NAME
     - docker exec -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_unitary.py --junitxml=/opt/results/${IMAGE_NAME}_report.xml"
-    - docker exec -i $IMAGE_NAME bash -c "coverage xml -o /opt/results/${IMAGE_NAME}_coverage.xml"
     - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing"
   coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
   after_script:
@@ -79,7 +78,6 @@ unit test context:
       when: always
       reports:
         junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
-        cobertura: src/$IMAGE_NAME/tests/${IMAGE_NAME}_coverage.xml
 
 # Deployment of the service in Kubernetes Cluster
 deploy context:
diff --git a/src/dbscanserving/.gitlab-ci.yml b/src/dbscanserving/.gitlab-ci.yml
index 1e499fae232ff805fe3f70d1b1c586a9c9a8de5f..fd0d66bac25bbb5417a9f90415f3d0732312516b 100644
--- a/src/dbscanserving/.gitlab-ci.yml
+++ b/src/dbscanserving/.gitlab-ci.yml
@@ -56,7 +56,6 @@ unit test dbscanserving:
     - docker ps -a
     - docker logs $IMAGE_NAME
     - docker exec -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_unitary.py --junitxml=/opt/results/${IMAGE_NAME}_report.xml"
-    - docker exec -i $IMAGE_NAME bash -c "coverage xml -o /opt/results/${IMAGE_NAME}_coverage.xml"
     - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing"
   coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
   after_script:
@@ -76,7 +75,6 @@ unit test dbscanserving:
     when: always
     reports:
       junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
-      cobertura: src/$IMAGE_NAME/tests/${IMAGE_NAME}_coverage.xml
 
 
 # Deployment of the dbscanserving service in Kubernetes Cluster
diff --git a/src/device/.gitlab-ci.yml b/src/device/.gitlab-ci.yml
index aa2f9114a8c1507397171286e79d4daf8c348899..90f00f7a168404dc5196c923e76430a6d029f6c9 100644
--- a/src/device/.gitlab-ci.yml
+++ b/src/device/.gitlab-ci.yml
@@ -55,7 +55,6 @@ unit test device:
     - docker ps -a
     - docker logs $IMAGE_NAME
     - docker exec -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_unitary.py --junitxml=/opt/results/${IMAGE_NAME}_report.xml"
-    - docker exec -i $IMAGE_NAME bash -c "coverage xml -o /opt/results/${IMAGE_NAME}_coverage.xml"
     - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing"
   coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
   after_script:
@@ -75,7 +74,6 @@ unit test device:
       when: always
       reports:
         junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
-        cobertura: src/$IMAGE_NAME/tests/${IMAGE_NAME}_coverage.xml
 
 # Deployment of the service in Kubernetes Cluster
 deploy device:
diff --git a/src/interdomain/.gitlab-ci.yml b/src/interdomain/.gitlab-ci.yml
index f4dd49fd0cd674a95768eccf2193ac6deb0db490..a91f9e4edb8cae14029897df3aafa2b6f1bea3a9 100644
--- a/src/interdomain/.gitlab-ci.yml
+++ b/src/interdomain/.gitlab-ci.yml
@@ -54,7 +54,8 @@ unit test service:
     - sleep 5
     - docker ps -a
     - docker logs $IMAGE_NAME
-    - docker exec -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_unitary.py --junitxml=/opt/results/${IMAGE_NAME}_report.xml; coverage xml -o /opt/results/${IMAGE_NAME}_coverage.xml; coverage report --include='${IMAGE_NAME}/*' --show-missing"
+    - docker exec -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_unitary.py --junitxml=/opt/results/${IMAGE_NAME}_report.xml"
+    - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing"
   coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
   after_script:
     - docker rm -f $IMAGE_NAME
@@ -73,7 +74,6 @@ unit test service:
       when: always
       reports:
         junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
-        cobertura: src/$IMAGE_NAME/tests/${IMAGE_NAME}_coverage.xml
 
 # Deployment of the service in Kubernetes Cluster
 deploy service:
diff --git a/src/l3_attackmitigator/.gitlab-ci.yml b/src/l3_attackmitigator/.gitlab-ci.yml
index dbf8d90fcbcb38a0574de4130b4181e77cf5afd6..28d5ad4cf109cd438da2625a08689b327688ea37 100644
--- a/src/l3_attackmitigator/.gitlab-ci.yml
+++ b/src/l3_attackmitigator/.gitlab-ci.yml
@@ -55,7 +55,6 @@ unit test l3_attackmitigator:
     - docker ps -a
     - docker logs $IMAGE_NAME
     - docker exec -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_unitary.py --junitxml=/opt/results/${IMAGE_NAME}_report.xml"
-    - docker exec -i $IMAGE_NAME bash -c "coverage xml -o /opt/results/${IMAGE_NAME}_coverage.xml"
     - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing"
   coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
   after_script:
@@ -75,7 +74,6 @@ unit test l3_attackmitigator:
       when: always
       reports:
         junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
-        cobertura: src/$IMAGE_NAME/tests/${IMAGE_NAME}_coverage.xml
 
 # Deployment of the service in Kubernetes Cluster
 deploy l3_attackmitigator:
diff --git a/src/l3_centralizedattackdetector/.gitlab-ci.yml b/src/l3_centralizedattackdetector/.gitlab-ci.yml
index 43ca269d3c8c1456d86717f423c81fafbc5b03af..ca95af8816ce01b433d462a5d09d8ef14776734f 100644
--- a/src/l3_centralizedattackdetector/.gitlab-ci.yml
+++ b/src/l3_centralizedattackdetector/.gitlab-ci.yml
@@ -55,7 +55,6 @@ unit test l3_centralizedattackdetector:
     - docker ps -a
     - docker logs $IMAGE_NAME
     - docker exec -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_unitary.py --junitxml=/opt/results/${IMAGE_NAME}_report.xml"
-    - docker exec -i $IMAGE_NAME bash -c "coverage xml -o /opt/results/${IMAGE_NAME}_coverage.xml"
     - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing"
   coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
   after_script:
@@ -75,7 +74,6 @@ unit test l3_centralizedattackdetector:
       when: always
       reports:
         junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
-        cobertura: src/$IMAGE_NAME/tests/${IMAGE_NAME}_coverage.xml
 
 # Deployment of the service in Kubernetes Cluster
 deploy l3_centralizedattackdetector:
diff --git a/src/l3_distributedattackdetector/.gitlab-ci.yml b/src/l3_distributedattackdetector/.gitlab-ci.yml
index 1e34c6c7e44d5bfdac06aabb2e738e368b633675..7ced7a62c19c717e2c4091f08c73579a79ad383b 100644
--- a/src/l3_distributedattackdetector/.gitlab-ci.yml
+++ b/src/l3_distributedattackdetector/.gitlab-ci.yml
@@ -55,7 +55,6 @@ unit test l3_distributedattackdetector:
     - docker ps -a
     - docker logs $IMAGE_NAME
     - docker exec -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_unitary.py --junitxml=/opt/results/${IMAGE_NAME}_report.xml"
-    - docker exec -i $IMAGE_NAME bash -c "coverage xml -o /opt/results/${IMAGE_NAME}_coverage.xml"
     - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing"
   coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
   after_script:
@@ -75,7 +74,6 @@ unit test l3_distributedattackdetector:
       when: always
       reports:
         junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
-        cobertura: src/$IMAGE_NAME/tests/${IMAGE_NAME}_coverage.xml
 
 # Deployment of the service in Kubernetes Cluster
 deploy l3_distributedattackdetector:
diff --git a/src/monitoring/.gitlab-ci.yml b/src/monitoring/.gitlab-ci.yml
index f715417765de6d7517f2430e9bf3a2a9937fa8d6..61aec5fb3b29b40bc413a5d9a6452086d0005dce 100644
--- a/src/monitoring/.gitlab-ci.yml
+++ b/src/monitoring/.gitlab-ci.yml
@@ -58,7 +58,6 @@ unit test monitoring:
     - docker ps -a
     - docker logs $IMAGE_NAME
     - docker exec -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_unitary.py --junitxml=/opt/results/${IMAGE_NAME}_report.xml"
-    - docker exec -i $IMAGE_NAME bash -c "coverage xml -o /opt/results/${IMAGE_NAME}_coverage.xml"
     - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing"
   coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
   after_script:
@@ -79,7 +78,6 @@ unit test monitoring:
       when: always
       reports:
         junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
-        cobertura: src/$IMAGE_NAME/tests/${IMAGE_NAME}_coverage.xml
  
 # Deployment of the service in Kubernetes Cluster
 deploy monitoring:
diff --git a/src/monitoring/proto/context_pb2.py b/src/monitoring/proto/context_pb2.py
index 50d501d3ac053ad644554331af26e3c40cd426a1..643508f6b929a9390bc6cfa0e8f8b7484fbc7c8a 100644
--- a/src/monitoring/proto/context_pb2.py
+++ b/src/monitoring/proto/context_pb2.py
@@ -12,7 +12,7 @@ from google.protobuf import symbol_database as _symbol_database
 _sym_db = _symbol_database.Default()
 
 
-from . import kpi_sample_types_pb2 as kpi__sample__types__pb2
+import kpi_sample_types_pb2 as kpi__sample__types__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
diff --git a/src/monitoring/proto/monitoring_pb2.py b/src/monitoring/proto/monitoring_pb2.py
index b313ebb68f0da37a540898e8c362fd204a799076..5eb1b503da7a33b87662b42a2bf1b314462e7834 100644
--- a/src/monitoring/proto/monitoring_pb2.py
+++ b/src/monitoring/proto/monitoring_pb2.py
@@ -11,8 +11,8 @@ from google.protobuf import symbol_database as _symbol_database
 _sym_db = _symbol_database.Default()
 
 
-from . import context_pb2 as context__pb2
-from . import kpi_sample_types_pb2 as kpi__sample__types__pb2
+import context_pb2 as context__pb2
+import kpi_sample_types_pb2 as kpi__sample__types__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
@@ -21,7 +21,7 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   syntax='proto3',
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x10monitoring.proto\x12\nmonitoring\x1a\rcontext.proto\x1a\x16kpi_sample_types.proto\"\xda\x01\n\rKpiDescriptor\x12\x17\n\x0fkpi_description\x18\x01 \x01(\t\x12\x38\n\x0fkpi_sample_type\x18\x02 \x01(\x0e\x32\x1f.kpi_sample_types.KpiSampleType\x12$\n\tdevice_id\x18\x03 \x01(\x0b\x32\x11.context.DeviceId\x12(\n\x0b\x65ndpoint_id\x18\x04 \x01(\x0b\x32\x13.context.EndPointId\x12&\n\nservice_id\x18\x05 \x01(\x0b\x32\x12.context.ServiceId\"p\n\x11MonitorKpiRequest\x12!\n\x06kpi_id\x18\x01 \x01(\x0b\x32\x11.monitoring.KpiId\x12\x1b\n\x13sampling_duration_s\x18\x02 \x01(\x02\x12\x1b\n\x13sampling_interval_s\x18\x03 \x01(\x02\"&\n\x05KpiId\x12\x1d\n\x06kpi_id\x18\x01 \x01(\x0b\x32\r.context.Uuid\"d\n\x03Kpi\x12!\n\x06kpi_id\x18\x01 \x01(\x0b\x32\x11.monitoring.KpiId\x12\x11\n\ttimestamp\x18\x02 \x01(\t\x12\'\n\tkpi_value\x18\x04 \x01(\x0b\x32\x14.monitoring.KpiValue\"a\n\x08KpiValue\x12\x10\n\x06intVal\x18\x01 \x01(\rH\x00\x12\x12\n\x08\x66loatVal\x18\x02 \x01(\x02H\x00\x12\x13\n\tstringVal\x18\x03 \x01(\tH\x00\x12\x11\n\x07\x62oolVal\x18\x04 \x01(\x08H\x00\x42\x07\n\x05value\",\n\x07KpiList\x12!\n\x08kpi_list\x18\x01 \x03(\x0b\x32\x0f.monitoring.Kpi2\xf3\x02\n\x11MonitoringService\x12;\n\tCreateKpi\x12\x19.monitoring.KpiDescriptor\x1a\x11.monitoring.KpiId\"\x00\x12\x42\n\x10GetKpiDescriptor\x12\x11.monitoring.KpiId\x1a\x19.monitoring.KpiDescriptor\"\x00\x12/\n\nIncludeKpi\x12\x0f.monitoring.Kpi\x1a\x0e.context.Empty\"\x00\x12=\n\nMonitorKpi\x12\x1d.monitoring.MonitorKpiRequest\x1a\x0e.context.Empty\"\x00\x12\x36\n\x0cGetStreamKpi\x12\x11.monitoring.KpiId\x1a\x0f.monitoring.Kpi\"\x00\x30\x01\x12\x35\n\rGetInstantKpi\x12\x11.monitoring.KpiId\x1a\x0f.monitoring.Kpi\"\x00\x62\x06proto3'
+  serialized_pb=b'\n\x10monitoring.proto\x12\nmonitoring\x1a\rcontext.proto\x1a\x16kpi_sample_types.proto\"\xda\x01\n\rKpiDescriptor\x12\x17\n\x0fkpi_description\x18\x01 \x01(\t\x12\x38\n\x0fkpi_sample_type\x18\x02 \x01(\x0e\x32\x1f.kpi_sample_types.KpiSampleType\x12$\n\tdevice_id\x18\x03 \x01(\x0b\x32\x11.context.DeviceId\x12(\n\x0b\x65ndpoint_id\x18\x04 \x01(\x0b\x32\x13.context.EndPointId\x12&\n\nservice_id\x18\x05 \x01(\x0b\x32\x12.context.ServiceId\"\xe2\x01\n\x11MetricsDescriptor\x12\x1b\n\x13metrics_description\x18\x01 \x01(\t\x12\x38\n\x0fkpi_sample_type\x18\x02 \x01(\x0e\x32\x1f.kpi_sample_types.KpiSampleType\x12$\n\tdevice_id\x18\x03 \x01(\x0b\x32\x11.context.DeviceId\x12(\n\x0b\x65ndpoint_id\x18\x04 \x01(\x0b\x32\x13.context.EndPointId\x12&\n\nservice_id\x18\x05 \x01(\x0b\x32\x12.context.ServiceId\"p\n\x11MonitorKpiRequest\x12!\n\x06kpi_id\x18\x01 \x01(\x0b\x32\x11.monitoring.KpiId\x12\x1b\n\x13sampling_duration_s\x18\x02 \x01(\x02\x12\x1b\n\x13sampling_interval_s\x18\x03 \x01(\x02\"|\n\x15MonitorMetricsRequest\x12)\n\nmetrics_id\x18\x01 \x01(\x0b\x32\x15.monitoring.MetricsId\x12\x1b\n\x13sampling_duration_s\x18\x02 \x01(\x02\x12\x1b\n\x13sampling_interval_s\x18\x03 \x01(\x02\"&\n\x05KpiId\x12\x1d\n\x06kpi_id\x18\x01 \x01(\x0b\x32\r.context.Uuid\"*\n\tMetricsId\x12\x1d\n\x06kpi_id\x18\x01 \x01(\x0b\x32\r.context.Uuid\"d\n\x03Kpi\x12!\n\x06kpi_id\x18\x01 \x01(\x0b\x32\x11.monitoring.KpiId\x12\x11\n\ttimestamp\x18\x02 \x01(\t\x12\'\n\tkpi_value\x18\x04 \x01(\x0b\x32\x14.monitoring.KpiValue\"x\n\x07Metrics\x12)\n\nmetrics_id\x18\x01 \x01(\x0b\x32\x15.monitoring.MetricsId\x12\x11\n\ttimestamp\x18\x02 \x01(\t\x12/\n\rmetrics_value\x18\x04 \x01(\x0b\x32\x18.monitoring.MetricsValue\"a\n\x08KpiValue\x12\x10\n\x06intVal\x18\x01 \x01(\rH\x00\x12\x12\n\x08\x66loatVal\x18\x02 \x01(\x02H\x00\x12\x13\n\tstringVal\x18\x03 \x01(\tH\x00\x12\x11\n\x07\x62oolVal\x18\x04 \x01(\x08H\x00\x42\x07\n\x05value\"e\n\x0cMetricsValue\x12\x10\n\x06intVal\x18\x01 \x01(\rH\x00\x12\x12\n\x08\x66loatVal\x18\x02 \x01(\x02H\x00\x12\x13\n\tstringVal\x18\x03 \x01(\tH\x00\x12\x11\n\x07\x62oolVal\x18\x04 \x01(\x08H\x00\x42\x07\n\x05value\",\n\x07KpiList\x12!\n\x08kpi_list\x18\x01 \x03(\x0b\x32\x0f.monitoring.Kpi\"8\n\x0bMetricsList\x12)\n\x0cmetrics_list\x18\x01 \x03(\x0b\x32\x13.monitoring.Metrics2\x93\x06\n\x11MonitoringService\x12;\n\tCreateKpi\x12\x19.monitoring.KpiDescriptor\x1a\x11.monitoring.KpiId\"\x00\x12\x42\n\x10GetKpiDescriptor\x12\x11.monitoring.KpiId\x1a\x19.monitoring.KpiDescriptor\"\x00\x12/\n\nIncludeKpi\x12\x0f.monitoring.Kpi\x1a\x0e.context.Empty\"\x00\x12=\n\nMonitorKpi\x12\x1d.monitoring.MonitorKpiRequest\x1a\x0e.context.Empty\"\x00\x12\x36\n\x0cGetStreamKpi\x12\x11.monitoring.KpiId\x1a\x0f.monitoring.Kpi\"\x00\x30\x01\x12\x35\n\rGetInstantKpi\x12\x11.monitoring.KpiId\x1a\x0f.monitoring.Kpi\"\x00\x12G\n\rCreateMetrics\x12\x1d.monitoring.MetricsDescriptor\x1a\x15.monitoring.MetricsId\"\x00\x12N\n\x14GetMetricsDescriptor\x12\x15.monitoring.MetricsId\x1a\x1d.monitoring.MetricsDescriptor\"\x00\x12\x37\n\x0eIncludeMetrics\x12\x13.monitoring.Metrics\x1a\x0e.context.Empty\"\x00\x12\x45\n\x0eMonitorMetrics\x12!.monitoring.MonitorMetricsRequest\x1a\x0e.context.Empty\"\x00\x12\x42\n\x10GetStreamMetrics\x12\x15.monitoring.MetricsId\x1a\x13.monitoring.Metrics\"\x00\x30\x01\x12\x41\n\x11GetInstantMetrics\x12\x15.monitoring.MetricsId\x1a\x13.monitoring.Metrics\"\x00\x62\x06proto3'
   ,
   dependencies=[context__pb2.DESCRIPTOR,kpi__sample__types__pb2.DESCRIPTOR,])
 
@@ -88,6 +88,66 @@ _KPIDESCRIPTOR = _descriptor.Descriptor(
 )
 
 
+_METRICSDESCRIPTOR = _descriptor.Descriptor(
+  name='MetricsDescriptor',
+  full_name='monitoring.MetricsDescriptor',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='metrics_description', full_name='monitoring.MetricsDescriptor.metrics_description', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='kpi_sample_type', full_name='monitoring.MetricsDescriptor.kpi_sample_type', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='device_id', full_name='monitoring.MetricsDescriptor.device_id', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='endpoint_id', full_name='monitoring.MetricsDescriptor.endpoint_id', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='service_id', full_name='monitoring.MetricsDescriptor.service_id', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=293,
+  serialized_end=519,
+)
+
+
 _MONITORKPIREQUEST = _descriptor.Descriptor(
   name='MonitorKpiRequest',
   full_name='monitoring.MonitorKpiRequest',
@@ -129,8 +189,54 @@ _MONITORKPIREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=292,
-  serialized_end=404,
+  serialized_start=521,
+  serialized_end=633,
+)
+
+
+_MONITORMETRICSREQUEST = _descriptor.Descriptor(
+  name='MonitorMetricsRequest',
+  full_name='monitoring.MonitorMetricsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='metrics_id', full_name='monitoring.MonitorMetricsRequest.metrics_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sampling_duration_s', full_name='monitoring.MonitorMetricsRequest.sampling_duration_s', index=1,
+      number=2, type=2, cpp_type=6, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sampling_interval_s', full_name='monitoring.MonitorMetricsRequest.sampling_interval_s', index=2,
+      number=3, type=2, cpp_type=6, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=635,
+  serialized_end=759,
 )
 
 
@@ -161,8 +267,40 @@ _KPIID = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=406,
-  serialized_end=444,
+  serialized_start=761,
+  serialized_end=799,
+)
+
+
+_METRICSID = _descriptor.Descriptor(
+  name='MetricsId',
+  full_name='monitoring.MetricsId',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='kpi_id', full_name='monitoring.MetricsId.kpi_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=801,
+  serialized_end=843,
 )
 
 
@@ -207,8 +345,54 @@ _KPI = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=446,
-  serialized_end=546,
+  serialized_start=845,
+  serialized_end=945,
+)
+
+
+_METRICS = _descriptor.Descriptor(
+  name='Metrics',
+  full_name='monitoring.Metrics',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='metrics_id', full_name='monitoring.Metrics.metrics_id', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='timestamp', full_name='monitoring.Metrics.timestamp', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='metrics_value', full_name='monitoring.Metrics.metrics_value', index=2,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=947,
+  serialized_end=1067,
 )
 
 
@@ -265,8 +449,66 @@ _KPIVALUE = _descriptor.Descriptor(
       create_key=_descriptor._internal_create_key,
     fields=[]),
   ],
-  serialized_start=548,
-  serialized_end=645,
+  serialized_start=1069,
+  serialized_end=1166,
+)
+
+
+_METRICSVALUE = _descriptor.Descriptor(
+  name='MetricsValue',
+  full_name='monitoring.MetricsValue',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='intVal', full_name='monitoring.MetricsValue.intVal', index=0,
+      number=1, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='floatVal', full_name='monitoring.MetricsValue.floatVal', index=1,
+      number=2, type=2, cpp_type=6, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='stringVal', full_name='monitoring.MetricsValue.stringVal', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='boolVal', full_name='monitoring.MetricsValue.boolVal', index=3,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+    _descriptor.OneofDescriptor(
+      name='value', full_name='monitoring.MetricsValue.value',
+      index=0, containing_type=None,
+      create_key=_descriptor._internal_create_key,
+    fields=[]),
+  ],
+  serialized_start=1168,
+  serialized_end=1269,
 )
 
 
@@ -297,18 +539,58 @@ _KPILIST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=647,
-  serialized_end=691,
+  serialized_start=1271,
+  serialized_end=1315,
+)
+
+
+_METRICSLIST = _descriptor.Descriptor(
+  name='MetricsList',
+  full_name='monitoring.MetricsList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='metrics_list', full_name='monitoring.MetricsList.metrics_list', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1317,
+  serialized_end=1373,
 )
 
 _KPIDESCRIPTOR.fields_by_name['kpi_sample_type'].enum_type = kpi__sample__types__pb2._KPISAMPLETYPE
 _KPIDESCRIPTOR.fields_by_name['device_id'].message_type = context__pb2._DEVICEID
 _KPIDESCRIPTOR.fields_by_name['endpoint_id'].message_type = context__pb2._ENDPOINTID
 _KPIDESCRIPTOR.fields_by_name['service_id'].message_type = context__pb2._SERVICEID
+_METRICSDESCRIPTOR.fields_by_name['kpi_sample_type'].enum_type = kpi__sample__types__pb2._KPISAMPLETYPE
+_METRICSDESCRIPTOR.fields_by_name['device_id'].message_type = context__pb2._DEVICEID
+_METRICSDESCRIPTOR.fields_by_name['endpoint_id'].message_type = context__pb2._ENDPOINTID
+_METRICSDESCRIPTOR.fields_by_name['service_id'].message_type = context__pb2._SERVICEID
 _MONITORKPIREQUEST.fields_by_name['kpi_id'].message_type = _KPIID
+_MONITORMETRICSREQUEST.fields_by_name['metrics_id'].message_type = _METRICSID
 _KPIID.fields_by_name['kpi_id'].message_type = context__pb2._UUID
+_METRICSID.fields_by_name['kpi_id'].message_type = context__pb2._UUID
 _KPI.fields_by_name['kpi_id'].message_type = _KPIID
 _KPI.fields_by_name['kpi_value'].message_type = _KPIVALUE
+_METRICS.fields_by_name['metrics_id'].message_type = _METRICSID
+_METRICS.fields_by_name['metrics_value'].message_type = _METRICSVALUE
 _KPIVALUE.oneofs_by_name['value'].fields.append(
   _KPIVALUE.fields_by_name['intVal'])
 _KPIVALUE.fields_by_name['intVal'].containing_oneof = _KPIVALUE.oneofs_by_name['value']
@@ -321,13 +603,32 @@ _KPIVALUE.fields_by_name['stringVal'].containing_oneof = _KPIVALUE.oneofs_by_nam
 _KPIVALUE.oneofs_by_name['value'].fields.append(
   _KPIVALUE.fields_by_name['boolVal'])
 _KPIVALUE.fields_by_name['boolVal'].containing_oneof = _KPIVALUE.oneofs_by_name['value']
+_METRICSVALUE.oneofs_by_name['value'].fields.append(
+  _METRICSVALUE.fields_by_name['intVal'])
+_METRICSVALUE.fields_by_name['intVal'].containing_oneof = _METRICSVALUE.oneofs_by_name['value']
+_METRICSVALUE.oneofs_by_name['value'].fields.append(
+  _METRICSVALUE.fields_by_name['floatVal'])
+_METRICSVALUE.fields_by_name['floatVal'].containing_oneof = _METRICSVALUE.oneofs_by_name['value']
+_METRICSVALUE.oneofs_by_name['value'].fields.append(
+  _METRICSVALUE.fields_by_name['stringVal'])
+_METRICSVALUE.fields_by_name['stringVal'].containing_oneof = _METRICSVALUE.oneofs_by_name['value']
+_METRICSVALUE.oneofs_by_name['value'].fields.append(
+  _METRICSVALUE.fields_by_name['boolVal'])
+_METRICSVALUE.fields_by_name['boolVal'].containing_oneof = _METRICSVALUE.oneofs_by_name['value']
 _KPILIST.fields_by_name['kpi_list'].message_type = _KPI
+_METRICSLIST.fields_by_name['metrics_list'].message_type = _METRICS
 DESCRIPTOR.message_types_by_name['KpiDescriptor'] = _KPIDESCRIPTOR
+DESCRIPTOR.message_types_by_name['MetricsDescriptor'] = _METRICSDESCRIPTOR
 DESCRIPTOR.message_types_by_name['MonitorKpiRequest'] = _MONITORKPIREQUEST
+DESCRIPTOR.message_types_by_name['MonitorMetricsRequest'] = _MONITORMETRICSREQUEST
 DESCRIPTOR.message_types_by_name['KpiId'] = _KPIID
+DESCRIPTOR.message_types_by_name['MetricsId'] = _METRICSID
 DESCRIPTOR.message_types_by_name['Kpi'] = _KPI
+DESCRIPTOR.message_types_by_name['Metrics'] = _METRICS
 DESCRIPTOR.message_types_by_name['KpiValue'] = _KPIVALUE
+DESCRIPTOR.message_types_by_name['MetricsValue'] = _METRICSVALUE
 DESCRIPTOR.message_types_by_name['KpiList'] = _KPILIST
+DESCRIPTOR.message_types_by_name['MetricsList'] = _METRICSLIST
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
 KpiDescriptor = _reflection.GeneratedProtocolMessageType('KpiDescriptor', (_message.Message,), {
@@ -337,6 +638,13 @@ KpiDescriptor = _reflection.GeneratedProtocolMessageType('KpiDescriptor', (_mess
   })
 _sym_db.RegisterMessage(KpiDescriptor)
 
+MetricsDescriptor = _reflection.GeneratedProtocolMessageType('MetricsDescriptor', (_message.Message,), {
+  'DESCRIPTOR' : _METRICSDESCRIPTOR,
+  '__module__' : 'monitoring_pb2'
+  # @@protoc_insertion_point(class_scope:monitoring.MetricsDescriptor)
+  })
+_sym_db.RegisterMessage(MetricsDescriptor)
+
 MonitorKpiRequest = _reflection.GeneratedProtocolMessageType('MonitorKpiRequest', (_message.Message,), {
   'DESCRIPTOR' : _MONITORKPIREQUEST,
   '__module__' : 'monitoring_pb2'
@@ -344,6 +652,13 @@ MonitorKpiRequest = _reflection.GeneratedProtocolMessageType('MonitorKpiRequest'
   })
 _sym_db.RegisterMessage(MonitorKpiRequest)
 
+MonitorMetricsRequest = _reflection.GeneratedProtocolMessageType('MonitorMetricsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _MONITORMETRICSREQUEST,
+  '__module__' : 'monitoring_pb2'
+  # @@protoc_insertion_point(class_scope:monitoring.MonitorMetricsRequest)
+  })
+_sym_db.RegisterMessage(MonitorMetricsRequest)
+
 KpiId = _reflection.GeneratedProtocolMessageType('KpiId', (_message.Message,), {
   'DESCRIPTOR' : _KPIID,
   '__module__' : 'monitoring_pb2'
@@ -351,6 +666,13 @@ KpiId = _reflection.GeneratedProtocolMessageType('KpiId', (_message.Message,), {
   })
 _sym_db.RegisterMessage(KpiId)
 
+MetricsId = _reflection.GeneratedProtocolMessageType('MetricsId', (_message.Message,), {
+  'DESCRIPTOR' : _METRICSID,
+  '__module__' : 'monitoring_pb2'
+  # @@protoc_insertion_point(class_scope:monitoring.MetricsId)
+  })
+_sym_db.RegisterMessage(MetricsId)
+
 Kpi = _reflection.GeneratedProtocolMessageType('Kpi', (_message.Message,), {
   'DESCRIPTOR' : _KPI,
   '__module__' : 'monitoring_pb2'
@@ -358,6 +680,13 @@ Kpi = _reflection.GeneratedProtocolMessageType('Kpi', (_message.Message,), {
   })
 _sym_db.RegisterMessage(Kpi)
 
+Metrics = _reflection.GeneratedProtocolMessageType('Metrics', (_message.Message,), {
+  'DESCRIPTOR' : _METRICS,
+  '__module__' : 'monitoring_pb2'
+  # @@protoc_insertion_point(class_scope:monitoring.Metrics)
+  })
+_sym_db.RegisterMessage(Metrics)
+
 KpiValue = _reflection.GeneratedProtocolMessageType('KpiValue', (_message.Message,), {
   'DESCRIPTOR' : _KPIVALUE,
   '__module__' : 'monitoring_pb2'
@@ -365,6 +694,13 @@ KpiValue = _reflection.GeneratedProtocolMessageType('KpiValue', (_message.Messag
   })
 _sym_db.RegisterMessage(KpiValue)
 
+MetricsValue = _reflection.GeneratedProtocolMessageType('MetricsValue', (_message.Message,), {
+  'DESCRIPTOR' : _METRICSVALUE,
+  '__module__' : 'monitoring_pb2'
+  # @@protoc_insertion_point(class_scope:monitoring.MetricsValue)
+  })
+_sym_db.RegisterMessage(MetricsValue)
+
 KpiList = _reflection.GeneratedProtocolMessageType('KpiList', (_message.Message,), {
   'DESCRIPTOR' : _KPILIST,
   '__module__' : 'monitoring_pb2'
@@ -372,6 +708,13 @@ KpiList = _reflection.GeneratedProtocolMessageType('KpiList', (_message.Message,
   })
 _sym_db.RegisterMessage(KpiList)
 
+MetricsList = _reflection.GeneratedProtocolMessageType('MetricsList', (_message.Message,), {
+  'DESCRIPTOR' : _METRICSLIST,
+  '__module__' : 'monitoring_pb2'
+  # @@protoc_insertion_point(class_scope:monitoring.MetricsList)
+  })
+_sym_db.RegisterMessage(MetricsList)
+
 
 
 _MONITORINGSERVICE = _descriptor.ServiceDescriptor(
@@ -381,8 +724,8 @@ _MONITORINGSERVICE = _descriptor.ServiceDescriptor(
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=694,
-  serialized_end=1065,
+  serialized_start=1376,
+  serialized_end=2163,
   methods=[
   _descriptor.MethodDescriptor(
     name='CreateKpi',
@@ -444,6 +787,66 @@ _MONITORINGSERVICE = _descriptor.ServiceDescriptor(
     serialized_options=None,
     create_key=_descriptor._internal_create_key,
   ),
+  _descriptor.MethodDescriptor(
+    name='CreateMetrics',
+    full_name='monitoring.MonitoringService.CreateMetrics',
+    index=6,
+    containing_service=None,
+    input_type=_METRICSDESCRIPTOR,
+    output_type=_METRICSID,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetMetricsDescriptor',
+    full_name='monitoring.MonitoringService.GetMetricsDescriptor',
+    index=7,
+    containing_service=None,
+    input_type=_METRICSID,
+    output_type=_METRICSDESCRIPTOR,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='IncludeMetrics',
+    full_name='monitoring.MonitoringService.IncludeMetrics',
+    index=8,
+    containing_service=None,
+    input_type=_METRICS,
+    output_type=context__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='MonitorMetrics',
+    full_name='monitoring.MonitoringService.MonitorMetrics',
+    index=9,
+    containing_service=None,
+    input_type=_MONITORMETRICSREQUEST,
+    output_type=context__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetStreamMetrics',
+    full_name='monitoring.MonitoringService.GetStreamMetrics',
+    index=10,
+    containing_service=None,
+    input_type=_METRICSID,
+    output_type=_METRICS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetInstantMetrics',
+    full_name='monitoring.MonitoringService.GetInstantMetrics',
+    index=11,
+    containing_service=None,
+    input_type=_METRICSID,
+    output_type=_METRICS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
 ])
 _sym_db.RegisterServiceDescriptor(_MONITORINGSERVICE)
 
diff --git a/src/monitoring/proto/monitoring_pb2_grpc.py b/src/monitoring/proto/monitoring_pb2_grpc.py
index 36c6835938af46b34b37f673bb6d4a1374a57cf0..9e4e523a1a238c25b8bb8a3ae7d3c6cc9a238838 100644
--- a/src/monitoring/proto/monitoring_pb2_grpc.py
+++ b/src/monitoring/proto/monitoring_pb2_grpc.py
@@ -2,8 +2,8 @@
 """Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
-from . import context_pb2 as context__pb2
-from . import monitoring_pb2 as monitoring__pb2
+import context_pb2 as context__pb2
+import monitoring_pb2 as monitoring__pb2
 
 
 class MonitoringServiceStub(object):
@@ -45,6 +45,36 @@ class MonitoringServiceStub(object):
                 request_serializer=monitoring__pb2.KpiId.SerializeToString,
                 response_deserializer=monitoring__pb2.Kpi.FromString,
                 )
+        self.CreateMetrics = channel.unary_unary(
+                '/monitoring.MonitoringService/CreateMetrics',
+                request_serializer=monitoring__pb2.MetricsDescriptor.SerializeToString,
+                response_deserializer=monitoring__pb2.MetricsId.FromString,
+                )
+        self.GetMetricsDescriptor = channel.unary_unary(
+                '/monitoring.MonitoringService/GetMetricsDescriptor',
+                request_serializer=monitoring__pb2.MetricsId.SerializeToString,
+                response_deserializer=monitoring__pb2.MetricsDescriptor.FromString,
+                )
+        self.IncludeMetrics = channel.unary_unary(
+                '/monitoring.MonitoringService/IncludeMetrics',
+                request_serializer=monitoring__pb2.Metrics.SerializeToString,
+                response_deserializer=context__pb2.Empty.FromString,
+                )
+        self.MonitorMetrics = channel.unary_unary(
+                '/monitoring.MonitoringService/MonitorMetrics',
+                request_serializer=monitoring__pb2.MonitorMetricsRequest.SerializeToString,
+                response_deserializer=context__pb2.Empty.FromString,
+                )
+        self.GetStreamMetrics = channel.unary_stream(
+                '/monitoring.MonitoringService/GetStreamMetrics',
+                request_serializer=monitoring__pb2.MetricsId.SerializeToString,
+                response_deserializer=monitoring__pb2.Metrics.FromString,
+                )
+        self.GetInstantMetrics = channel.unary_unary(
+                '/monitoring.MonitoringService/GetInstantMetrics',
+                request_serializer=monitoring__pb2.MetricsId.SerializeToString,
+                response_deserializer=monitoring__pb2.Metrics.FromString,
+                )
 
 
 class MonitoringServiceServicer(object):
@@ -86,6 +116,42 @@ class MonitoringServiceServicer(object):
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def CreateMetrics(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetMetricsDescriptor(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def IncludeMetrics(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def MonitorMetrics(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetStreamMetrics(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetInstantMetrics(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
 
 def add_MonitoringServiceServicer_to_server(servicer, server):
     rpc_method_handlers = {
@@ -119,6 +185,36 @@ def add_MonitoringServiceServicer_to_server(servicer, server):
                     request_deserializer=monitoring__pb2.KpiId.FromString,
                     response_serializer=monitoring__pb2.Kpi.SerializeToString,
             ),
+            'CreateMetrics': grpc.unary_unary_rpc_method_handler(
+                    servicer.CreateMetrics,
+                    request_deserializer=monitoring__pb2.MetricsDescriptor.FromString,
+                    response_serializer=monitoring__pb2.MetricsId.SerializeToString,
+            ),
+            'GetMetricsDescriptor': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetMetricsDescriptor,
+                    request_deserializer=monitoring__pb2.MetricsId.FromString,
+                    response_serializer=monitoring__pb2.MetricsDescriptor.SerializeToString,
+            ),
+            'IncludeMetrics': grpc.unary_unary_rpc_method_handler(
+                    servicer.IncludeMetrics,
+                    request_deserializer=monitoring__pb2.Metrics.FromString,
+                    response_serializer=context__pb2.Empty.SerializeToString,
+            ),
+            'MonitorMetrics': grpc.unary_unary_rpc_method_handler(
+                    servicer.MonitorMetrics,
+                    request_deserializer=monitoring__pb2.MonitorMetricsRequest.FromString,
+                    response_serializer=context__pb2.Empty.SerializeToString,
+            ),
+            'GetStreamMetrics': grpc.unary_stream_rpc_method_handler(
+                    servicer.GetStreamMetrics,
+                    request_deserializer=monitoring__pb2.MetricsId.FromString,
+                    response_serializer=monitoring__pb2.Metrics.SerializeToString,
+            ),
+            'GetInstantMetrics': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetInstantMetrics,
+                    request_deserializer=monitoring__pb2.MetricsId.FromString,
+                    response_serializer=monitoring__pb2.Metrics.SerializeToString,
+            ),
     }
     generic_handler = grpc.method_handlers_generic_handler(
             'monitoring.MonitoringService', rpc_method_handlers)
@@ -230,3 +326,105 @@ class MonitoringService(object):
             monitoring__pb2.Kpi.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def CreateMetrics(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/monitoring.MonitoringService/CreateMetrics',
+            monitoring__pb2.MetricsDescriptor.SerializeToString,
+            monitoring__pb2.MetricsId.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetMetricsDescriptor(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/monitoring.MonitoringService/GetMetricsDescriptor',
+            monitoring__pb2.MetricsId.SerializeToString,
+            monitoring__pb2.MetricsDescriptor.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def IncludeMetrics(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/monitoring.MonitoringService/IncludeMetrics',
+            monitoring__pb2.Metrics.SerializeToString,
+            context__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def MonitorMetrics(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/monitoring.MonitoringService/MonitorMetrics',
+            monitoring__pb2.MonitorMetricsRequest.SerializeToString,
+            context__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetStreamMetrics(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/monitoring.MonitoringService/GetStreamMetrics',
+            monitoring__pb2.MetricsId.SerializeToString,
+            monitoring__pb2.Metrics.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetInstantMetrics(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/monitoring.MonitoringService/GetInstantMetrics',
+            monitoring__pb2.MetricsId.SerializeToString,
+            monitoring__pb2.Metrics.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/src/opticalattackmitigator/.gitlab-ci.yml b/src/opticalattackmitigator/.gitlab-ci.yml
index a39a83f6f4a7f98cce08fd4b7d5b9a0379105935..5b9a133bd0cbf4b7dc4a4b6cf290a3be9adf663e 100644
--- a/src/opticalattackmitigator/.gitlab-ci.yml
+++ b/src/opticalattackmitigator/.gitlab-ci.yml
@@ -55,7 +55,6 @@ unit test opticalattackmitigator:
     - sleep 5
     - docker ps -a
     - docker exec -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_unitary.py --junitxml=/opt/results/${IMAGE_NAME}_report.xml"
-    - docker exec -i $IMAGE_NAME bash -c "coverage xml -o /opt/results/${IMAGE_NAME}_coverage.xml"
     - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing"
   coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
   after_script:
@@ -75,7 +74,6 @@ unit test opticalattackmitigator:
     when: always
     reports:
       junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
-      cobertura: src/$IMAGE_NAME/tests/${IMAGE_NAME}_coverage.xml
 
 
 # Deployment of the opticalattackmitigator service in Kubernetes Cluster
diff --git a/src/opticalcentralizedattackdetector/.gitlab-ci.yml b/src/opticalcentralizedattackdetector/.gitlab-ci.yml
index 8a1445e80347fe64dac1beb1780894fa98ba85fd..c3d91aec6e10c7450cfda0b74d0bc3bbe613558b 100644
--- a/src/opticalcentralizedattackdetector/.gitlab-ci.yml
+++ b/src/opticalcentralizedattackdetector/.gitlab-ci.yml
@@ -55,7 +55,6 @@ unit test opticalcentralizedattackdetector:
     - sleep 5
     - docker ps -a
     - docker exec -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_unitary.py --junitxml=/opt/results/${IMAGE_NAME}_report.xml"
-    - docker exec -i $IMAGE_NAME bash -c "coverage xml -o /opt/results/${IMAGE_NAME}_coverage.xml"
     - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing"
   coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
   after_script:
@@ -75,7 +74,6 @@ unit test opticalcentralizedattackdetector:
     when: always
     reports:
       junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
-      cobertura: src/$IMAGE_NAME/tests/${IMAGE_NAME}_coverage.xml
 
 
 # Deployment of the opticalcentralizedattackdetector service in Kubernetes Cluster
diff --git a/src/service/.gitlab-ci.yml b/src/service/.gitlab-ci.yml
index 3f845a9dd960b6a9dcfd140720b3b8db923f8ddf..a91f9e4edb8cae14029897df3aafa2b6f1bea3a9 100644
--- a/src/service/.gitlab-ci.yml
+++ b/src/service/.gitlab-ci.yml
@@ -55,7 +55,6 @@ unit test service:
     - docker ps -a
     - docker logs $IMAGE_NAME
     - docker exec -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_unitary.py --junitxml=/opt/results/${IMAGE_NAME}_report.xml"
-    - docker exec -i $IMAGE_NAME bash -c "coverage xml -o /opt/results/${IMAGE_NAME}_coverage.xml"
     - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing"
   coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
   after_script:
@@ -75,7 +74,6 @@ unit test service:
       when: always
       reports:
         junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
-        cobertura: src/$IMAGE_NAME/tests/${IMAGE_NAME}_coverage.xml
 
 # Deployment of the service in Kubernetes Cluster
 deploy service:
diff --git a/src/webui/.gitlab-ci.yml b/src/webui/.gitlab-ci.yml
index 65fd7127848224d2afb7c45280a3d15ffbcab6c5..3865541d040a4320bac02caaa42f66f1e8ca10e9 100644
--- a/src/webui/.gitlab-ci.yml
+++ b/src/webui/.gitlab-ci.yml
@@ -55,7 +55,8 @@ unit test webui:
     - sleep 5
     - docker ps -a
     - docker logs $IMAGE_NAME
-    - docker exec --user root -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=DEBUG --verbose ${IMAGE_NAME}/tests/test_unitary.py --junitxml=/opt/results/${IMAGE_NAME}_report.xml; coverage xml -o /opt/results/${IMAGE_NAME}_coverage.xml; ls -la /opt/results; coverage report --include='${IMAGE_NAME}/*' --show-missing"
+    - docker exec --user root -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=DEBUG --verbose ${IMAGE_NAME}/tests/test_unitary.py --junitxml=/opt/results/${IMAGE_NAME}_report.xml"
+    - docker exec --user root -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing"
   coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
   after_script:
     - docker rm -f $IMAGE_NAME
@@ -74,7 +75,6 @@ unit test webui:
       when: always
       reports:
         junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
-        cobertura: src/$IMAGE_NAME/tests/${IMAGE_NAME}_coverage.xml
 
 # Deployment of the webui service in Kubernetes Cluster
 deploy webui: