diff --git a/src/automation/src/main/proto/kpi_sample_types.proto b/src/automation/src/main/proto/kpi_sample_types.proto
new file mode 120000
index 0000000000000000000000000000000000000000..98e748bbf4fbadbc04c3657f458d733f1bc7bdb8
--- /dev/null
+++ b/src/automation/src/main/proto/kpi_sample_types.proto
@@ -0,0 +1 @@
+../../../../../proto/kpi_sample_types.proto
\ No newline at end of file
diff --git a/src/automation/src/main/proto/monitoring.proto b/src/automation/src/main/proto/monitoring.proto
new file mode 120000
index 0000000000000000000000000000000000000000..aceaa7328099fe736163be048ee1ad21a61d79a2
--- /dev/null
+++ b/src/automation/src/main/proto/monitoring.proto
@@ -0,0 +1 @@
+../../../../../proto/monitoring.proto
\ No newline at end of file
diff --git a/src/automation/target/generated-sources/grpc/context/ContextOuterClass.java b/src/automation/target/generated-sources/grpc/context/ContextOuterClass.java
index 21d845ecd69f3ec21bdc185dfac5e2cbd171904d..3decce929e0eb9ac2e50c23f8aa3dba36b4321bf 100644
--- a/src/automation/target/generated-sources/grpc/context/ContextOuterClass.java
+++ b/src/automation/target/generated-sources/grpc/context/ContextOuterClass.java
@@ -28708,24 +28708,45 @@ public final class ContextOuterClass {
     context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
 
     /**
-     * <pre>
-     *repeated kpi_sample_types.KpiSampleType kpi_sample_types = 3;
-     * </pre>
-     *
      * <code>string endpoint_type = 2;</code>
      * @return The endpointType.
      */
     java.lang.String getEndpointType();
     /**
-     * <pre>
-     *repeated kpi_sample_types.KpiSampleType kpi_sample_types = 3;
-     * </pre>
-     *
      * <code>string endpoint_type = 2;</code>
      * @return The bytes for endpointType.
      */
     com.google.protobuf.ByteString
         getEndpointTypeBytes();
+
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+     * @return A list containing the kpiSampleTypes.
+     */
+    java.util.List<kpi_sample_types.KpiSampleTypes.KpiSampleType> getKpiSampleTypesList();
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+     * @return The count of kpiSampleTypes.
+     */
+    int getKpiSampleTypesCount();
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+     * @param index The index of the element to return.
+     * @return The kpiSampleTypes at the given index.
+     */
+    kpi_sample_types.KpiSampleTypes.KpiSampleType getKpiSampleTypes(int index);
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+     * @return A list containing the enum numeric values on the wire for kpiSampleTypes.
+     */
+    java.util.List<java.lang.Integer>
+    getKpiSampleTypesValueList();
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+     * @param index The index of the value to return.
+     * @return The enum numeric value on the wire of kpiSampleTypes at the given index.
+     */
+    int getKpiSampleTypesValue(int index);
   }
   /**
    * Protobuf type {@code context.EndPoint}
@@ -28741,6 +28762,7 @@ public final class ContextOuterClass {
     }
     private EndPoint() {
       endpointType_ = "";
+      kpiSampleTypes_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
@@ -28763,6 +28785,7 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
+      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -28792,6 +28815,29 @@ public final class ContextOuterClass {
               endpointType_ = s;
               break;
             }
+            case 24: {
+              int rawValue = input.readEnum();
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                kpiSampleTypes_ = new java.util.ArrayList<java.lang.Integer>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              kpiSampleTypes_.add(rawValue);
+              break;
+            }
+            case 26: {
+              int length = input.readRawVarint32();
+              int oldLimit = input.pushLimit(length);
+              while(input.getBytesUntilLimit() > 0) {
+                int rawValue = input.readEnum();
+                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                  kpiSampleTypes_ = new java.util.ArrayList<java.lang.Integer>();
+                  mutable_bitField0_ |= 0x00000001;
+                }
+                kpiSampleTypes_.add(rawValue);
+              }
+              input.popLimit(oldLimit);
+              break;
+            }
             default: {
               if (!parseUnknownField(
                   input, unknownFields, extensionRegistry, tag)) {
@@ -28807,6 +28853,9 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          kpiSampleTypes_ = java.util.Collections.unmodifiableList(kpiSampleTypes_);
+        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
@@ -28853,10 +28902,6 @@ public final class ContextOuterClass {
     public static final int ENDPOINT_TYPE_FIELD_NUMBER = 2;
     private volatile java.lang.Object endpointType_;
     /**
-     * <pre>
-     *repeated kpi_sample_types.KpiSampleType kpi_sample_types = 3;
-     * </pre>
-     *
      * <code>string endpoint_type = 2;</code>
      * @return The endpointType.
      */
@@ -28874,10 +28919,6 @@ public final class ContextOuterClass {
       }
     }
     /**
-     * <pre>
-     *repeated kpi_sample_types.KpiSampleType kpi_sample_types = 3;
-     * </pre>
-     *
      * <code>string endpoint_type = 2;</code>
      * @return The bytes for endpointType.
      */
@@ -28896,6 +28937,64 @@ public final class ContextOuterClass {
       }
     }
 
+    public static final int KPI_SAMPLE_TYPES_FIELD_NUMBER = 3;
+    private java.util.List<java.lang.Integer> kpiSampleTypes_;
+    private static final com.google.protobuf.Internal.ListAdapter.Converter<
+        java.lang.Integer, kpi_sample_types.KpiSampleTypes.KpiSampleType> kpiSampleTypes_converter_ =
+            new com.google.protobuf.Internal.ListAdapter.Converter<
+                java.lang.Integer, kpi_sample_types.KpiSampleTypes.KpiSampleType>() {
+              public kpi_sample_types.KpiSampleTypes.KpiSampleType convert(java.lang.Integer from) {
+                @SuppressWarnings("deprecation")
+                kpi_sample_types.KpiSampleTypes.KpiSampleType result = kpi_sample_types.KpiSampleTypes.KpiSampleType.valueOf(from);
+                return result == null ? kpi_sample_types.KpiSampleTypes.KpiSampleType.UNRECOGNIZED : result;
+              }
+            };
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+     * @return A list containing the kpiSampleTypes.
+     */
+    @java.lang.Override
+    public java.util.List<kpi_sample_types.KpiSampleTypes.KpiSampleType> getKpiSampleTypesList() {
+      return new com.google.protobuf.Internal.ListAdapter<
+          java.lang.Integer, kpi_sample_types.KpiSampleTypes.KpiSampleType>(kpiSampleTypes_, kpiSampleTypes_converter_);
+    }
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+     * @return The count of kpiSampleTypes.
+     */
+    @java.lang.Override
+    public int getKpiSampleTypesCount() {
+      return kpiSampleTypes_.size();
+    }
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+     * @param index The index of the element to return.
+     * @return The kpiSampleTypes at the given index.
+     */
+    @java.lang.Override
+    public kpi_sample_types.KpiSampleTypes.KpiSampleType getKpiSampleTypes(int index) {
+      return kpiSampleTypes_converter_.convert(kpiSampleTypes_.get(index));
+    }
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+     * @return A list containing the enum numeric values on the wire for kpiSampleTypes.
+     */
+    @java.lang.Override
+    public java.util.List<java.lang.Integer>
+    getKpiSampleTypesValueList() {
+      return kpiSampleTypes_;
+    }
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+     * @param index The index of the value to return.
+     * @return The enum numeric value on the wire of kpiSampleTypes at the given index.
+     */
+    @java.lang.Override
+    public int getKpiSampleTypesValue(int index) {
+      return kpiSampleTypes_.get(index);
+    }
+    private int kpiSampleTypesMemoizedSerializedSize;
+
     private byte memoizedIsInitialized = -1;
     @java.lang.Override
     public final boolean isInitialized() {
@@ -28910,12 +29009,20 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
+      getSerializedSize();
       if (endpointId_ != null) {
         output.writeMessage(1, getEndpointId());
       }
       if (!getEndpointTypeBytes().isEmpty()) {
         com.google.protobuf.GeneratedMessageV3.writeString(output, 2, endpointType_);
       }
+      if (getKpiSampleTypesList().size() > 0) {
+        output.writeUInt32NoTag(26);
+        output.writeUInt32NoTag(kpiSampleTypesMemoizedSerializedSize);
+      }
+      for (int i = 0; i < kpiSampleTypes_.size(); i++) {
+        output.writeEnumNoTag(kpiSampleTypes_.get(i));
+      }
       unknownFields.writeTo(output);
     }
 
@@ -28932,6 +29039,18 @@ public final class ContextOuterClass {
       if (!getEndpointTypeBytes().isEmpty()) {
         size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, endpointType_);
       }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < kpiSampleTypes_.size(); i++) {
+          dataSize += com.google.protobuf.CodedOutputStream
+            .computeEnumSizeNoTag(kpiSampleTypes_.get(i));
+        }
+        size += dataSize;
+        if (!getKpiSampleTypesList().isEmpty()) {  size += 1;
+          size += com.google.protobuf.CodedOutputStream
+            .computeUInt32SizeNoTag(dataSize);
+        }kpiSampleTypesMemoizedSerializedSize = dataSize;
+      }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
       return size;
@@ -28954,6 +29073,7 @@ public final class ContextOuterClass {
       }
       if (!getEndpointType()
           .equals(other.getEndpointType())) return false;
+      if (!kpiSampleTypes_.equals(other.kpiSampleTypes_)) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -28971,6 +29091,10 @@ public final class ContextOuterClass {
       }
       hash = (37 * hash) + ENDPOINT_TYPE_FIELD_NUMBER;
       hash = (53 * hash) + getEndpointType().hashCode();
+      if (getKpiSampleTypesCount() > 0) {
+        hash = (37 * hash) + KPI_SAMPLE_TYPES_FIELD_NUMBER;
+        hash = (53 * hash) + kpiSampleTypes_.hashCode();
+      }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
@@ -29112,6 +29236,8 @@ public final class ContextOuterClass {
         }
         endpointType_ = "";
 
+        kpiSampleTypes_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
         return this;
       }
 
@@ -29138,12 +29264,18 @@ public final class ContextOuterClass {
       @java.lang.Override
       public context.ContextOuterClass.EndPoint buildPartial() {
         context.ContextOuterClass.EndPoint result = new context.ContextOuterClass.EndPoint(this);
+        int from_bitField0_ = bitField0_;
         if (endpointIdBuilder_ == null) {
           result.endpointId_ = endpointId_;
         } else {
           result.endpointId_ = endpointIdBuilder_.build();
         }
         result.endpointType_ = endpointType_;
+        if (((bitField0_ & 0x00000001) != 0)) {
+          kpiSampleTypes_ = java.util.Collections.unmodifiableList(kpiSampleTypes_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.kpiSampleTypes_ = kpiSampleTypes_;
         onBuilt();
         return result;
       }
@@ -29199,6 +29331,16 @@ public final class ContextOuterClass {
           endpointType_ = other.endpointType_;
           onChanged();
         }
+        if (!other.kpiSampleTypes_.isEmpty()) {
+          if (kpiSampleTypes_.isEmpty()) {
+            kpiSampleTypes_ = other.kpiSampleTypes_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureKpiSampleTypesIsMutable();
+            kpiSampleTypes_.addAll(other.kpiSampleTypes_);
+          }
+          onChanged();
+        }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
         return this;
@@ -29227,6 +29369,7 @@ public final class ContextOuterClass {
         }
         return this;
       }
+      private int bitField0_;
 
       private context.ContextOuterClass.EndPointId endpointId_;
       private com.google.protobuf.SingleFieldBuilderV3<
@@ -29349,10 +29492,6 @@ public final class ContextOuterClass {
 
       private java.lang.Object endpointType_ = "";
       /**
-       * <pre>
-       *repeated kpi_sample_types.KpiSampleType kpi_sample_types = 3;
-       * </pre>
-       *
        * <code>string endpoint_type = 2;</code>
        * @return The endpointType.
        */
@@ -29369,10 +29508,6 @@ public final class ContextOuterClass {
         }
       }
       /**
-       * <pre>
-       *repeated kpi_sample_types.KpiSampleType kpi_sample_types = 3;
-       * </pre>
-       *
        * <code>string endpoint_type = 2;</code>
        * @return The bytes for endpointType.
        */
@@ -29390,10 +29525,6 @@ public final class ContextOuterClass {
         }
       }
       /**
-       * <pre>
-       *repeated kpi_sample_types.KpiSampleType kpi_sample_types = 3;
-       * </pre>
-       *
        * <code>string endpoint_type = 2;</code>
        * @param value The endpointType to set.
        * @return This builder for chaining.
@@ -29409,10 +29540,6 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <pre>
-       *repeated kpi_sample_types.KpiSampleType kpi_sample_types = 3;
-       * </pre>
-       *
        * <code>string endpoint_type = 2;</code>
        * @return This builder for chaining.
        */
@@ -29423,10 +29550,6 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <pre>
-       *repeated kpi_sample_types.KpiSampleType kpi_sample_types = 3;
-       * </pre>
-       *
        * <code>string endpoint_type = 2;</code>
        * @param value The bytes for endpointType to set.
        * @return This builder for chaining.
@@ -29442,6 +29565,146 @@ public final class ContextOuterClass {
         onChanged();
         return this;
       }
+
+      private java.util.List<java.lang.Integer> kpiSampleTypes_ =
+        java.util.Collections.emptyList();
+      private void ensureKpiSampleTypesIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          kpiSampleTypes_ = new java.util.ArrayList<java.lang.Integer>(kpiSampleTypes_);
+          bitField0_ |= 0x00000001;
+        }
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+       * @return A list containing the kpiSampleTypes.
+       */
+      public java.util.List<kpi_sample_types.KpiSampleTypes.KpiSampleType> getKpiSampleTypesList() {
+        return new com.google.protobuf.Internal.ListAdapter<
+            java.lang.Integer, kpi_sample_types.KpiSampleTypes.KpiSampleType>(kpiSampleTypes_, kpiSampleTypes_converter_);
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+       * @return The count of kpiSampleTypes.
+       */
+      public int getKpiSampleTypesCount() {
+        return kpiSampleTypes_.size();
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+       * @param index The index of the element to return.
+       * @return The kpiSampleTypes at the given index.
+       */
+      public kpi_sample_types.KpiSampleTypes.KpiSampleType getKpiSampleTypes(int index) {
+        return kpiSampleTypes_converter_.convert(kpiSampleTypes_.get(index));
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+       * @param index The index to set the value at.
+       * @param value The kpiSampleTypes to set.
+       * @return This builder for chaining.
+       */
+      public Builder setKpiSampleTypes(
+          int index, kpi_sample_types.KpiSampleTypes.KpiSampleType value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureKpiSampleTypesIsMutable();
+        kpiSampleTypes_.set(index, value.getNumber());
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+       * @param value The kpiSampleTypes to add.
+       * @return This builder for chaining.
+       */
+      public Builder addKpiSampleTypes(kpi_sample_types.KpiSampleTypes.KpiSampleType value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureKpiSampleTypesIsMutable();
+        kpiSampleTypes_.add(value.getNumber());
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+       * @param values The kpiSampleTypes to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllKpiSampleTypes(
+          java.lang.Iterable<? extends kpi_sample_types.KpiSampleTypes.KpiSampleType> values) {
+        ensureKpiSampleTypesIsMutable();
+        for (kpi_sample_types.KpiSampleTypes.KpiSampleType value : values) {
+          kpiSampleTypes_.add(value.getNumber());
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearKpiSampleTypes() {
+        kpiSampleTypes_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+       * @return A list containing the enum numeric values on the wire for kpiSampleTypes.
+       */
+      public java.util.List<java.lang.Integer>
+      getKpiSampleTypesValueList() {
+        return java.util.Collections.unmodifiableList(kpiSampleTypes_);
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+       * @param index The index of the value to return.
+       * @return The enum numeric value on the wire of kpiSampleTypes at the given index.
+       */
+      public int getKpiSampleTypesValue(int index) {
+        return kpiSampleTypes_.get(index);
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+       * @param index The index of the value to return.
+       * @return The enum numeric value on the wire of kpiSampleTypes at the given index.
+       * @return This builder for chaining.
+       */
+      public Builder setKpiSampleTypesValue(
+          int index, int value) {
+        ensureKpiSampleTypesIsMutable();
+        kpiSampleTypes_.set(index, value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+       * @param value The enum numeric value on the wire for kpiSampleTypes to add.
+       * @return This builder for chaining.
+       */
+      public Builder addKpiSampleTypesValue(int value) {
+        ensureKpiSampleTypesIsMutable();
+        kpiSampleTypes_.add(value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 3;</code>
+       * @param values The enum numeric values on the wire for kpiSampleTypes to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllKpiSampleTypesValue(
+          java.lang.Iterable<java.lang.Integer> values) {
+        ensureKpiSampleTypesIsMutable();
+        for (int value : values) {
+          kpiSampleTypes_.add(value);
+        }
+        onChanged();
+        return this;
+      }
       @java.lang.Override
       public final Builder setUnknownFields(
           final com.google.protobuf.UnknownFieldSet unknownFields) {
@@ -36215,160 +36478,164 @@ public final class ContextOuterClass {
       descriptor;
   static {
     java.lang.String[] descriptorData = {
-      "\n\rcontext.proto\022\007context\"\007\n\005Empty\"\024\n\004Uui" +
-      "d\022\014\n\004uuid\030\001 \001(\t\"F\n\005Event\022\021\n\ttimestamp\030\001 " +
-      "\001(\001\022*\n\nevent_type\030\002 \001(\0162\026.context.EventT" +
-      "ypeEnum\"0\n\tContextId\022#\n\014context_uuid\030\001 \001" +
-      "(\0132\r.context.Uuid\"\266\001\n\007Context\022&\n\ncontext" +
-      "_id\030\001 \001(\0132\022.context.ContextId\022)\n\014topolog" +
-      "y_ids\030\002 \003(\0132\023.context.TopologyId\022\'\n\013serv" +
-      "ice_ids\030\003 \003(\0132\022.context.ServiceId\022/\n\ncon" +
-      "troller\030\004 \001(\0132\033.context.TeraFlowControll" +
-      "er\"8\n\rContextIdList\022\'\n\013context_ids\030\001 \003(\013" +
-      "2\022.context.ContextId\"1\n\013ContextList\022\"\n\010c" +
-      "ontexts\030\001 \003(\0132\020.context.Context\"U\n\014Conte" +
-      "xtEvent\022\035\n\005event\030\001 \001(\0132\016.context.Event\022&" +
-      "\n\ncontext_id\030\002 \001(\0132\022.context.ContextId\"Z" +
-      "\n\nTopologyId\022&\n\ncontext_id\030\001 \001(\0132\022.conte" +
-      "xt.ContextId\022$\n\rtopology_uuid\030\002 \001(\0132\r.co" +
-      "ntext.Uuid\"~\n\010Topology\022(\n\013topology_id\030\001 " +
-      "\001(\0132\023.context.TopologyId\022%\n\ndevice_ids\030\002" +
-      " \003(\0132\021.context.DeviceId\022!\n\010link_ids\030\003 \003(" +
-      "\0132\017.context.LinkId\";\n\016TopologyIdList\022)\n\014" +
-      "topology_ids\030\001 \003(\0132\023.context.TopologyId\"" +
-      "5\n\014TopologyList\022%\n\ntopologies\030\001 \003(\0132\021.co" +
-      "ntext.Topology\"X\n\rTopologyEvent\022\035\n\005event" +
-      "\030\001 \001(\0132\016.context.Event\022(\n\013topology_id\030\002 " +
-      "\001(\0132\023.context.TopologyId\".\n\010DeviceId\022\"\n\013" +
-      "device_uuid\030\001 \001(\0132\r.context.Uuid\"\232\002\n\006Dev" +
-      "ice\022$\n\tdevice_id\030\001 \001(\0132\021.context.DeviceI" +
-      "d\022\023\n\013device_type\030\002 \001(\t\022,\n\rdevice_config\030" +
-      "\003 \001(\0132\025.context.DeviceConfig\022G\n\031device_o" +
-      "perational_status\030\004 \001(\0162$.context.Device" +
-      "OperationalStatusEnum\0221\n\016device_drivers\030" +
-      "\005 \003(\0162\031.context.DeviceDriverEnum\022+\n\020devi" +
-      "ce_endpoints\030\006 \003(\0132\021.context.EndPoint\"9\n" +
-      "\014DeviceConfig\022)\n\014config_rules\030\001 \003(\0132\023.co" +
-      "ntext.ConfigRule\"5\n\014DeviceIdList\022%\n\ndevi" +
-      "ce_ids\030\001 \003(\0132\021.context.DeviceId\".\n\nDevic" +
-      "eList\022 \n\007devices\030\001 \003(\0132\017.context.Device\"" +
-      "R\n\013DeviceEvent\022\035\n\005event\030\001 \001(\0132\016.context." +
-      "Event\022$\n\tdevice_id\030\002 \001(\0132\021.context.Devic" +
-      "eId\"*\n\006LinkId\022 \n\tlink_uuid\030\001 \001(\0132\r.conte" +
-      "xt.Uuid\"X\n\004Link\022 \n\007link_id\030\001 \001(\0132\017.conte" +
-      "xt.LinkId\022.\n\021link_endpoint_ids\030\002 \003(\0132\023.c" +
-      "ontext.EndPointId\"/\n\nLinkIdList\022!\n\010link_" +
-      "ids\030\001 \003(\0132\017.context.LinkId\"(\n\010LinkList\022\034" +
-      "\n\005links\030\001 \003(\0132\r.context.Link\"L\n\tLinkEven" +
-      "t\022\035\n\005event\030\001 \001(\0132\016.context.Event\022 \n\007link" +
-      "_id\030\002 \001(\0132\017.context.LinkId\"X\n\tServiceId\022" +
-      "&\n\ncontext_id\030\001 \001(\0132\022.context.ContextId\022" +
-      "#\n\014service_uuid\030\002 \001(\0132\r.context.Uuid\"\246\002\n" +
-      "\007Service\022&\n\nservice_id\030\001 \001(\0132\022.context.S" +
-      "erviceId\022.\n\014service_type\030\002 \001(\0162\030.context" +
-      ".ServiceTypeEnum\0221\n\024service_endpoint_ids" +
-      "\030\003 \003(\0132\023.context.EndPointId\0220\n\023service_c" +
-      "onstraints\030\004 \003(\0132\023.context.Constraint\022.\n" +
-      "\016service_status\030\005 \001(\0132\026.context.ServiceS" +
-      "tatus\022.\n\016service_config\030\006 \001(\0132\026.context." +
-      "ServiceConfig\"C\n\rServiceStatus\0222\n\016servic" +
-      "e_status\030\001 \001(\0162\032.context.ServiceStatusEn" +
-      "um\":\n\rServiceConfig\022)\n\014config_rules\030\001 \003(" +
-      "\0132\023.context.ConfigRule\"8\n\rServiceIdList\022" +
-      "\'\n\013service_ids\030\001 \003(\0132\022.context.ServiceId" +
-      "\"1\n\013ServiceList\022\"\n\010services\030\001 \003(\0132\020.cont" +
-      "ext.Service\"U\n\014ServiceEvent\022\035\n\005event\030\001 \001" +
-      "(\0132\016.context.Event\022&\n\nservice_id\030\002 \001(\0132\022" +
-      ".context.ServiceId\"\202\001\n\nEndPointId\022(\n\013top" +
-      "ology_id\030\001 \001(\0132\023.context.TopologyId\022$\n\td" +
-      "evice_id\030\002 \001(\0132\021.context.DeviceId\022$\n\rend" +
-      "point_uuid\030\003 \001(\0132\r.context.Uuid\"K\n\010EndPo" +
-      "int\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndPo" +
-      "intId\022\025\n\rendpoint_type\030\002 \001(\t\"e\n\nConfigRu" +
-      "le\022)\n\006action\030\001 \001(\0162\031.context.ConfigActio" +
-      "nEnum\022\024\n\014resource_key\030\002 \001(\t\022\026\n\016resource_" +
-      "value\030\003 \001(\t\"?\n\nConstraint\022\027\n\017constraint_" +
-      "type\030\001 \001(\t\022\030\n\020constraint_value\030\002 \001(\t\"6\n\014" +
-      "ConnectionId\022&\n\017connection_uuid\030\001 \001(\0132\r." +
-      "context.Uuid\"\215\001\n\nConnection\022,\n\rconnectio" +
-      "n_id\030\001 \001(\0132\025.context.ConnectionId\022.\n\022rel" +
-      "ated_service_id\030\002 \001(\0132\022.context.ServiceI" +
-      "d\022!\n\004path\030\003 \003(\0132\023.context.EndPointId\"A\n\020" +
-      "ConnectionIdList\022-\n\016connection_ids\030\001 \003(\013" +
-      "2\025.context.ConnectionId\":\n\016ConnectionLis" +
-      "t\022(\n\013connections\030\001 \003(\0132\023.context.Connect" +
-      "ion\"^\n\022TeraFlowController\022&\n\ncontext_id\030" +
-      "\001 \001(\0132\022.context.ContextId\022\022\n\nip_address\030" +
-      "\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024AuthenticationRes" +
-      "ult\022&\n\ncontext_id\030\001 \001(\0132\022.context.Contex" +
-      "tId\022\025\n\rauthenticated\030\002 \001(\010*j\n\rEventTypeE" +
-      "num\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020EVENTTYP" +
-      "E_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022\024\n\020EVEN" +
-      "TTYPE_REMOVE\020\003*\305\001\n\020DeviceDriverEnum\022\032\n\026D" +
-      "EVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICEDRIVER_" +
-      "OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRANSPORT_A" +
-      "PI\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVICEDRIVE" +
-      "R_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVICEDRIVE" +
-      "R_ONF_TR_352\020\005*\217\001\n\033DeviceOperationalStat" +
-      "usEnum\022%\n!DEVICEOPERATIONALSTATUS_UNDEFI" +
-      "NED\020\000\022$\n DEVICEOPERATIONALSTATUS_DISABLE" +
-      "D\020\001\022#\n\037DEVICEOPERATIONALSTATUS_ENABLED\020\002" +
-      "*\201\001\n\017ServiceTypeEnum\022\027\n\023SERVICETYPE_UNKN" +
-      "OWN\020\000\022\024\n\020SERVICETYPE_L3NM\020\001\022\024\n\020SERVICETY" +
-      "PE_L2NM\020\002\022)\n%SERVICETYPE_TAPI_CONNECTIVI" +
-      "TY_SERVICE\020\003*\210\001\n\021ServiceStatusEnum\022\033\n\027SE" +
-      "RVICESTATUS_UNDEFINED\020\000\022\031\n\025SERVICESTATUS" +
-      "_PLANNED\020\001\022\030\n\024SERVICESTATUS_ACTIVE\020\002\022!\n\035" +
-      "SERVICESTATUS_PENDING_REMOVAL\020\003*]\n\020Confi" +
-      "gActionEnum\022\032\n\026CONFIGACTION_UNDEFINED\020\000\022" +
-      "\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CONFIGACTION_DE" +
-      "LETE\020\0022\245\r\n\016ContextService\022:\n\016ListContext" +
-      "Ids\022\016.context.Empty\032\026.context.ContextIdL" +
-      "ist\"\000\0226\n\014ListContexts\022\016.context.Empty\032\024." +
-      "context.ContextList\"\000\0224\n\nGetContext\022\022.co" +
-      "ntext.ContextId\032\020.context.Context\"\000\0224\n\nS" +
-      "etContext\022\020.context.Context\032\022.context.Co" +
-      "ntextId\"\000\0225\n\rRemoveContext\022\022.context.Con" +
-      "textId\032\016.context.Empty\"\000\022=\n\020GetContextEv" +
-      "ents\022\016.context.Empty\032\025.context.ContextEv" +
-      "ent\"\0000\001\022@\n\017ListTopologyIds\022\022.context.Con" +
-      "textId\032\027.context.TopologyIdList\"\000\022=\n\016Lis" +
-      "tTopologies\022\022.context.ContextId\032\025.contex" +
-      "t.TopologyList\"\000\0227\n\013GetTopology\022\023.contex" +
-      "t.TopologyId\032\021.context.Topology\"\000\0227\n\013Set" +
-      "Topology\022\021.context.Topology\032\023.context.To" +
-      "pologyId\"\000\0227\n\016RemoveTopology\022\023.context.T" +
-      "opologyId\032\016.context.Empty\"\000\022?\n\021GetTopolo" +
-      "gyEvents\022\016.context.Empty\032\026.context.Topol" +
-      "ogyEvent\"\0000\001\0228\n\rListDeviceIds\022\016.context." +
-      "Empty\032\025.context.DeviceIdList\"\000\0224\n\013ListDe" +
-      "vices\022\016.context.Empty\032\023.context.DeviceLi" +
-      "st\"\000\0221\n\tGetDevice\022\021.context.DeviceId\032\017.c" +
-      "ontext.Device\"\000\0221\n\tSetDevice\022\017.context.D" +
-      "evice\032\021.context.DeviceId\"\000\0223\n\014RemoveDevi" +
-      "ce\022\021.context.DeviceId\032\016.context.Empty\"\000\022" +
-      ";\n\017GetDeviceEvents\022\016.context.Empty\032\024.con" +
-      "text.DeviceEvent\"\0000\001\0224\n\013ListLinkIds\022\016.co" +
-      "ntext.Empty\032\023.context.LinkIdList\"\000\0220\n\tLi" +
-      "stLinks\022\016.context.Empty\032\021.context.LinkLi" +
-      "st\"\000\022+\n\007GetLink\022\017.context.LinkId\032\r.conte" +
-      "xt.Link\"\000\022+\n\007SetLink\022\r.context.Link\032\017.co" +
-      "ntext.LinkId\"\000\022/\n\nRemoveLink\022\017.context.L" +
-      "inkId\032\016.context.Empty\"\000\0227\n\rGetLinkEvents" +
-      "\022\016.context.Empty\032\022.context.LinkEvent\"\0000\001" +
-      "\022>\n\016ListServiceIds\022\022.context.ContextId\032\026" +
-      ".context.ServiceIdList\"\000\022:\n\014ListServices" +
-      "\022\022.context.ContextId\032\024.context.ServiceLi" +
-      "st\"\000\0224\n\nGetService\022\022.context.ServiceId\032\020" +
-      ".context.Service\"\000\0224\n\nSetService\022\020.conte" +
-      "xt.Service\032\022.context.ServiceId\"\000\0225\n\rRemo" +
-      "veService\022\022.context.ServiceId\032\016.context." +
-      "Empty\"\000\022=\n\020GetServiceEvents\022\016.context.Em" +
-      "pty\032\025.context.ServiceEvent\"\0000\001b\006proto3"
+      "\n\rcontext.proto\022\007context\032\026kpi_sample_typ" +
+      "es.proto\"\007\n\005Empty\"\024\n\004Uuid\022\014\n\004uuid\030\001 \001(\t\"" +
+      "F\n\005Event\022\021\n\ttimestamp\030\001 \001(\001\022*\n\nevent_typ" +
+      "e\030\002 \001(\0162\026.context.EventTypeEnum\"0\n\tConte" +
+      "xtId\022#\n\014context_uuid\030\001 \001(\0132\r.context.Uui" +
+      "d\"\266\001\n\007Context\022&\n\ncontext_id\030\001 \001(\0132\022.cont" +
+      "ext.ContextId\022)\n\014topology_ids\030\002 \003(\0132\023.co" +
+      "ntext.TopologyId\022\'\n\013service_ids\030\003 \003(\0132\022." +
+      "context.ServiceId\022/\n\ncontroller\030\004 \001(\0132\033." +
+      "context.TeraFlowController\"8\n\rContextIdL" +
+      "ist\022\'\n\013context_ids\030\001 \003(\0132\022.context.Conte" +
+      "xtId\"1\n\013ContextList\022\"\n\010contexts\030\001 \003(\0132\020." +
+      "context.Context\"U\n\014ContextEvent\022\035\n\005event" +
+      "\030\001 \001(\0132\016.context.Event\022&\n\ncontext_id\030\002 \001" +
+      "(\0132\022.context.ContextId\"Z\n\nTopologyId\022&\n\n" +
+      "context_id\030\001 \001(\0132\022.context.ContextId\022$\n\r" +
+      "topology_uuid\030\002 \001(\0132\r.context.Uuid\"~\n\010To" +
+      "pology\022(\n\013topology_id\030\001 \001(\0132\023.context.To" +
+      "pologyId\022%\n\ndevice_ids\030\002 \003(\0132\021.context.D" +
+      "eviceId\022!\n\010link_ids\030\003 \003(\0132\017.context.Link" +
+      "Id\";\n\016TopologyIdList\022)\n\014topology_ids\030\001 \003" +
+      "(\0132\023.context.TopologyId\"5\n\014TopologyList\022" +
+      "%\n\ntopologies\030\001 \003(\0132\021.context.Topology\"X" +
+      "\n\rTopologyEvent\022\035\n\005event\030\001 \001(\0132\016.context" +
+      ".Event\022(\n\013topology_id\030\002 \001(\0132\023.context.To" +
+      "pologyId\".\n\010DeviceId\022\"\n\013device_uuid\030\001 \001(" +
+      "\0132\r.context.Uuid\"\232\002\n\006Device\022$\n\tdevice_id" +
+      "\030\001 \001(\0132\021.context.DeviceId\022\023\n\013device_type" +
+      "\030\002 \001(\t\022,\n\rdevice_config\030\003 \001(\0132\025.context." +
+      "DeviceConfig\022G\n\031device_operational_statu" +
+      "s\030\004 \001(\0162$.context.DeviceOperationalStatu" +
+      "sEnum\0221\n\016device_drivers\030\005 \003(\0162\031.context." +
+      "DeviceDriverEnum\022+\n\020device_endpoints\030\006 \003" +
+      "(\0132\021.context.EndPoint\"9\n\014DeviceConfig\022)\n" +
+      "\014config_rules\030\001 \003(\0132\023.context.ConfigRule" +
+      "\"5\n\014DeviceIdList\022%\n\ndevice_ids\030\001 \003(\0132\021.c" +
+      "ontext.DeviceId\".\n\nDeviceList\022 \n\007devices" +
+      "\030\001 \003(\0132\017.context.Device\"R\n\013DeviceEvent\022\035" +
+      "\n\005event\030\001 \001(\0132\016.context.Event\022$\n\tdevice_" +
+      "id\030\002 \001(\0132\021.context.DeviceId\"*\n\006LinkId\022 \n" +
+      "\tlink_uuid\030\001 \001(\0132\r.context.Uuid\"X\n\004Link\022" +
+      " \n\007link_id\030\001 \001(\0132\017.context.LinkId\022.\n\021lin" +
+      "k_endpoint_ids\030\002 \003(\0132\023.context.EndPointI" +
+      "d\"/\n\nLinkIdList\022!\n\010link_ids\030\001 \003(\0132\017.cont" +
+      "ext.LinkId\"(\n\010LinkList\022\034\n\005links\030\001 \003(\0132\r." +
+      "context.Link\"L\n\tLinkEvent\022\035\n\005event\030\001 \001(\013" +
+      "2\016.context.Event\022 \n\007link_id\030\002 \001(\0132\017.cont" +
+      "ext.LinkId\"X\n\tServiceId\022&\n\ncontext_id\030\001 " +
+      "\001(\0132\022.context.ContextId\022#\n\014service_uuid\030" +
+      "\002 \001(\0132\r.context.Uuid\"\246\002\n\007Service\022&\n\nserv" +
+      "ice_id\030\001 \001(\0132\022.context.ServiceId\022.\n\014serv" +
+      "ice_type\030\002 \001(\0162\030.context.ServiceTypeEnum" +
+      "\0221\n\024service_endpoint_ids\030\003 \003(\0132\023.context" +
+      ".EndPointId\0220\n\023service_constraints\030\004 \003(\013" +
+      "2\023.context.Constraint\022.\n\016service_status\030" +
+      "\005 \001(\0132\026.context.ServiceStatus\022.\n\016service" +
+      "_config\030\006 \001(\0132\026.context.ServiceConfig\"C\n" +
+      "\rServiceStatus\0222\n\016service_status\030\001 \001(\0162\032" +
+      ".context.ServiceStatusEnum\":\n\rServiceCon" +
+      "fig\022)\n\014config_rules\030\001 \003(\0132\023.context.Conf" +
+      "igRule\"8\n\rServiceIdList\022\'\n\013service_ids\030\001" +
+      " \003(\0132\022.context.ServiceId\"1\n\013ServiceList\022" +
+      "\"\n\010services\030\001 \003(\0132\020.context.Service\"U\n\014S" +
+      "erviceEvent\022\035\n\005event\030\001 \001(\0132\016.context.Eve" +
+      "nt\022&\n\nservice_id\030\002 \001(\0132\022.context.Service" +
+      "Id\"\202\001\n\nEndPointId\022(\n\013topology_id\030\001 \001(\0132\023" +
+      ".context.TopologyId\022$\n\tdevice_id\030\002 \001(\0132\021" +
+      ".context.DeviceId\022$\n\rendpoint_uuid\030\003 \001(\013" +
+      "2\r.context.Uuid\"\206\001\n\010EndPoint\022(\n\013endpoint" +
+      "_id\030\001 \001(\0132\023.context.EndPointId\022\025\n\rendpoi" +
+      "nt_type\030\002 \001(\t\0229\n\020kpi_sample_types\030\003 \003(\0162" +
+      "\037.kpi_sample_types.KpiSampleType\"e\n\nConf" +
+      "igRule\022)\n\006action\030\001 \001(\0162\031.context.ConfigA" +
+      "ctionEnum\022\024\n\014resource_key\030\002 \001(\t\022\026\n\016resou" +
+      "rce_value\030\003 \001(\t\"?\n\nConstraint\022\027\n\017constra" +
+      "int_type\030\001 \001(\t\022\030\n\020constraint_value\030\002 \001(\t" +
+      "\"6\n\014ConnectionId\022&\n\017connection_uuid\030\001 \001(" +
+      "\0132\r.context.Uuid\"\215\001\n\nConnection\022,\n\rconne" +
+      "ction_id\030\001 \001(\0132\025.context.ConnectionId\022.\n" +
+      "\022related_service_id\030\002 \001(\0132\022.context.Serv" +
+      "iceId\022!\n\004path\030\003 \003(\0132\023.context.EndPointId" +
+      "\"A\n\020ConnectionIdList\022-\n\016connection_ids\030\001" +
+      " \003(\0132\025.context.ConnectionId\":\n\016Connectio" +
+      "nList\022(\n\013connections\030\001 \003(\0132\023.context.Con" +
+      "nection\"^\n\022TeraFlowController\022&\n\ncontext" +
+      "_id\030\001 \001(\0132\022.context.ContextId\022\022\n\nip_addr" +
+      "ess\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024Authenticatio" +
+      "nResult\022&\n\ncontext_id\030\001 \001(\0132\022.context.Co" +
+      "ntextId\022\025\n\rauthenticated\030\002 \001(\010*j\n\rEventT" +
+      "ypeEnum\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020EVEN" +
+      "TTYPE_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022\024\n\020" +
+      "EVENTTYPE_REMOVE\020\003*\305\001\n\020DeviceDriverEnum\022" +
+      "\032\n\026DEVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICEDRI" +
+      "VER_OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRANSPO" +
+      "RT_API\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVICED" +
+      "RIVER_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVICED" +
+      "RIVER_ONF_TR_352\020\005*\217\001\n\033DeviceOperational" +
+      "StatusEnum\022%\n!DEVICEOPERATIONALSTATUS_UN" +
+      "DEFINED\020\000\022$\n DEVICEOPERATIONALSTATUS_DIS" +
+      "ABLED\020\001\022#\n\037DEVICEOPERATIONALSTATUS_ENABL" +
+      "ED\020\002*\201\001\n\017ServiceTypeEnum\022\027\n\023SERVICETYPE_" +
+      "UNKNOWN\020\000\022\024\n\020SERVICETYPE_L3NM\020\001\022\024\n\020SERVI" +
+      "CETYPE_L2NM\020\002\022)\n%SERVICETYPE_TAPI_CONNEC" +
+      "TIVITY_SERVICE\020\003*\210\001\n\021ServiceStatusEnum\022\033" +
+      "\n\027SERVICESTATUS_UNDEFINED\020\000\022\031\n\025SERVICEST" +
+      "ATUS_PLANNED\020\001\022\030\n\024SERVICESTATUS_ACTIVE\020\002" +
+      "\022!\n\035SERVICESTATUS_PENDING_REMOVAL\020\003*]\n\020C" +
+      "onfigActionEnum\022\032\n\026CONFIGACTION_UNDEFINE" +
+      "D\020\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CONFIGACTIO" +
+      "N_DELETE\020\0022\245\r\n\016ContextService\022:\n\016ListCon" +
+      "textIds\022\016.context.Empty\032\026.context.Contex" +
+      "tIdList\"\000\0226\n\014ListContexts\022\016.context.Empt" +
+      "y\032\024.context.ContextList\"\000\0224\n\nGetContext\022" +
+      "\022.context.ContextId\032\020.context.Context\"\000\022" +
+      "4\n\nSetContext\022\020.context.Context\032\022.contex" +
+      "t.ContextId\"\000\0225\n\rRemoveContext\022\022.context" +
+      ".ContextId\032\016.context.Empty\"\000\022=\n\020GetConte" +
+      "xtEvents\022\016.context.Empty\032\025.context.Conte" +
+      "xtEvent\"\0000\001\022@\n\017ListTopologyIds\022\022.context" +
+      ".ContextId\032\027.context.TopologyIdList\"\000\022=\n" +
+      "\016ListTopologies\022\022.context.ContextId\032\025.co" +
+      "ntext.TopologyList\"\000\0227\n\013GetTopology\022\023.co" +
+      "ntext.TopologyId\032\021.context.Topology\"\000\0227\n" +
+      "\013SetTopology\022\021.context.Topology\032\023.contex" +
+      "t.TopologyId\"\000\0227\n\016RemoveTopology\022\023.conte" +
+      "xt.TopologyId\032\016.context.Empty\"\000\022?\n\021GetTo" +
+      "pologyEvents\022\016.context.Empty\032\026.context.T" +
+      "opologyEvent\"\0000\001\0228\n\rListDeviceIds\022\016.cont" +
+      "ext.Empty\032\025.context.DeviceIdList\"\000\0224\n\013Li" +
+      "stDevices\022\016.context.Empty\032\023.context.Devi" +
+      "ceList\"\000\0221\n\tGetDevice\022\021.context.DeviceId" +
+      "\032\017.context.Device\"\000\0221\n\tSetDevice\022\017.conte" +
+      "xt.Device\032\021.context.DeviceId\"\000\0223\n\014Remove" +
+      "Device\022\021.context.DeviceId\032\016.context.Empt" +
+      "y\"\000\022;\n\017GetDeviceEvents\022\016.context.Empty\032\024" +
+      ".context.DeviceEvent\"\0000\001\0224\n\013ListLinkIds\022" +
+      "\016.context.Empty\032\023.context.LinkIdList\"\000\0220" +
+      "\n\tListLinks\022\016.context.Empty\032\021.context.Li" +
+      "nkList\"\000\022+\n\007GetLink\022\017.context.LinkId\032\r.c" +
+      "ontext.Link\"\000\022+\n\007SetLink\022\r.context.Link\032" +
+      "\017.context.LinkId\"\000\022/\n\nRemoveLink\022\017.conte" +
+      "xt.LinkId\032\016.context.Empty\"\000\0227\n\rGetLinkEv" +
+      "ents\022\016.context.Empty\032\022.context.LinkEvent" +
+      "\"\0000\001\022>\n\016ListServiceIds\022\022.context.Context" +
+      "Id\032\026.context.ServiceIdList\"\000\022:\n\014ListServ" +
+      "ices\022\022.context.ContextId\032\024.context.Servi" +
+      "ceList\"\000\0224\n\nGetService\022\022.context.Service" +
+      "Id\032\020.context.Service\"\000\0224\n\nSetService\022\020.c" +
+      "ontext.Service\032\022.context.ServiceId\"\000\0225\n\r" +
+      "RemoveService\022\022.context.ServiceId\032\016.cont" +
+      "ext.Empty\"\000\022=\n\020GetServiceEvents\022\016.contex" +
+      "t.Empty\032\025.context.ServiceEvent\"\0000\001b\006prot" +
+      "o3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
         new com.google.protobuf.Descriptors.FileDescriptor[] {
+          kpi_sample_types.KpiSampleTypes.getDescriptor(),
         });
     internal_static_context_Empty_descriptor =
       getDescriptor().getMessageTypes().get(0);
@@ -36567,7 +36834,7 @@ public final class ContextOuterClass {
     internal_static_context_EndPoint_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_EndPoint_descriptor,
-        new java.lang.String[] { "EndpointId", "EndpointType", });
+        new java.lang.String[] { "EndpointId", "EndpointType", "KpiSampleTypes", });
     internal_static_context_ConfigRule_descriptor =
       getDescriptor().getMessageTypes().get(33);
     internal_static_context_ConfigRule_fieldAccessorTable = new
@@ -36616,6 +36883,7 @@ public final class ContextOuterClass {
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_AuthenticationResult_descriptor,
         new java.lang.String[] { "ContextId", "Authenticated", });
+    kpi_sample_types.KpiSampleTypes.getDescriptor();
   }
 
   // @@protoc_insertion_point(outer_class_scope)
diff --git a/src/automation/target/generated-sources/grpc/device/Device.java b/src/automation/target/generated-sources/grpc/device/Device.java
index 460f29a6188215daff9a55c1039ba84c5abf3ecc..bc57d19cae53bf0540a402e9771bc87c1ecf49c5 100644
--- a/src/automation/target/generated-sources/grpc/device/Device.java
+++ b/src/automation/target/generated-sources/grpc/device/Device.java
@@ -14,6 +14,979 @@ public final class Device {
     registerAllExtensions(
         (com.google.protobuf.ExtensionRegistryLite) registry);
   }
+  public interface MonitoringSettingsOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:device.MonitoringSettings)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     * @return Whether the kpiId field is set.
+     */
+    boolean hasKpiId();
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     * @return The kpiId.
+     */
+    monitoring.Monitoring.KpiId getKpiId();
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     */
+    monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder();
+
+    /**
+     * <code>.monitoring.KpiDescriptor kpi_descriptor = 2;</code>
+     * @return Whether the kpiDescriptor field is set.
+     */
+    boolean hasKpiDescriptor();
+    /**
+     * <code>.monitoring.KpiDescriptor kpi_descriptor = 2;</code>
+     * @return The kpiDescriptor.
+     */
+    monitoring.Monitoring.KpiDescriptor getKpiDescriptor();
+    /**
+     * <code>.monitoring.KpiDescriptor kpi_descriptor = 2;</code>
+     */
+    monitoring.Monitoring.KpiDescriptorOrBuilder getKpiDescriptorOrBuilder();
+
+    /**
+     * <code>float sampling_duration_s = 3;</code>
+     * @return The samplingDurationS.
+     */
+    float getSamplingDurationS();
+
+    /**
+     * <code>float sampling_interval_s = 4;</code>
+     * @return The samplingIntervalS.
+     */
+    float getSamplingIntervalS();
+  }
+  /**
+   * Protobuf type {@code device.MonitoringSettings}
+   */
+  public static final class MonitoringSettings extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:device.MonitoringSettings)
+      MonitoringSettingsOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use MonitoringSettings.newBuilder() to construct.
+    private MonitoringSettings(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private MonitoringSettings() {
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new MonitoringSettings();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private MonitoringSettings(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              monitoring.Monitoring.KpiId.Builder subBuilder = null;
+              if (kpiId_ != null) {
+                subBuilder = kpiId_.toBuilder();
+              }
+              kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(kpiId_);
+                kpiId_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 18: {
+              monitoring.Monitoring.KpiDescriptor.Builder subBuilder = null;
+              if (kpiDescriptor_ != null) {
+                subBuilder = kpiDescriptor_.toBuilder();
+              }
+              kpiDescriptor_ = input.readMessage(monitoring.Monitoring.KpiDescriptor.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(kpiDescriptor_);
+                kpiDescriptor_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 29: {
+
+              samplingDurationS_ = input.readFloat();
+              break;
+            }
+            case 37: {
+
+              samplingIntervalS_ = input.readFloat();
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return device.Device.internal_static_device_MonitoringSettings_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return device.Device.internal_static_device_MonitoringSettings_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              device.Device.MonitoringSettings.class, device.Device.MonitoringSettings.Builder.class);
+    }
+
+    public static final int KPI_ID_FIELD_NUMBER = 1;
+    private monitoring.Monitoring.KpiId kpiId_;
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     * @return Whether the kpiId field is set.
+     */
+    @java.lang.Override
+    public boolean hasKpiId() {
+      return kpiId_ != null;
+    }
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     * @return The kpiId.
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.KpiId getKpiId() {
+      return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+    }
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
+      return getKpiId();
+    }
+
+    public static final int KPI_DESCRIPTOR_FIELD_NUMBER = 2;
+    private monitoring.Monitoring.KpiDescriptor kpiDescriptor_;
+    /**
+     * <code>.monitoring.KpiDescriptor kpi_descriptor = 2;</code>
+     * @return Whether the kpiDescriptor field is set.
+     */
+    @java.lang.Override
+    public boolean hasKpiDescriptor() {
+      return kpiDescriptor_ != null;
+    }
+    /**
+     * <code>.monitoring.KpiDescriptor kpi_descriptor = 2;</code>
+     * @return The kpiDescriptor.
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.KpiDescriptor getKpiDescriptor() {
+      return kpiDescriptor_ == null ? monitoring.Monitoring.KpiDescriptor.getDefaultInstance() : kpiDescriptor_;
+    }
+    /**
+     * <code>.monitoring.KpiDescriptor kpi_descriptor = 2;</code>
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.KpiDescriptorOrBuilder getKpiDescriptorOrBuilder() {
+      return getKpiDescriptor();
+    }
+
+    public static final int SAMPLING_DURATION_S_FIELD_NUMBER = 3;
+    private float samplingDurationS_;
+    /**
+     * <code>float sampling_duration_s = 3;</code>
+     * @return The samplingDurationS.
+     */
+    @java.lang.Override
+    public float getSamplingDurationS() {
+      return samplingDurationS_;
+    }
+
+    public static final int SAMPLING_INTERVAL_S_FIELD_NUMBER = 4;
+    private float samplingIntervalS_;
+    /**
+     * <code>float sampling_interval_s = 4;</code>
+     * @return The samplingIntervalS.
+     */
+    @java.lang.Override
+    public float getSamplingIntervalS() {
+      return samplingIntervalS_;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (kpiId_ != null) {
+        output.writeMessage(1, getKpiId());
+      }
+      if (kpiDescriptor_ != null) {
+        output.writeMessage(2, getKpiDescriptor());
+      }
+      if (samplingDurationS_ != 0F) {
+        output.writeFloat(3, samplingDurationS_);
+      }
+      if (samplingIntervalS_ != 0F) {
+        output.writeFloat(4, samplingIntervalS_);
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (kpiId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, getKpiId());
+      }
+      if (kpiDescriptor_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, getKpiDescriptor());
+      }
+      if (samplingDurationS_ != 0F) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeFloatSize(3, samplingDurationS_);
+      }
+      if (samplingIntervalS_ != 0F) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeFloatSize(4, samplingIntervalS_);
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof device.Device.MonitoringSettings)) {
+        return super.equals(obj);
+      }
+      device.Device.MonitoringSettings other = (device.Device.MonitoringSettings) obj;
+
+      if (hasKpiId() != other.hasKpiId()) return false;
+      if (hasKpiId()) {
+        if (!getKpiId()
+            .equals(other.getKpiId())) return false;
+      }
+      if (hasKpiDescriptor() != other.hasKpiDescriptor()) return false;
+      if (hasKpiDescriptor()) {
+        if (!getKpiDescriptor()
+            .equals(other.getKpiDescriptor())) return false;
+      }
+      if (java.lang.Float.floatToIntBits(getSamplingDurationS())
+          != java.lang.Float.floatToIntBits(
+              other.getSamplingDurationS())) return false;
+      if (java.lang.Float.floatToIntBits(getSamplingIntervalS())
+          != java.lang.Float.floatToIntBits(
+              other.getSamplingIntervalS())) return false;
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (hasKpiId()) {
+        hash = (37 * hash) + KPI_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getKpiId().hashCode();
+      }
+      if (hasKpiDescriptor()) {
+        hash = (37 * hash) + KPI_DESCRIPTOR_FIELD_NUMBER;
+        hash = (53 * hash) + getKpiDescriptor().hashCode();
+      }
+      hash = (37 * hash) + SAMPLING_DURATION_S_FIELD_NUMBER;
+      hash = (53 * hash) + java.lang.Float.floatToIntBits(
+          getSamplingDurationS());
+      hash = (37 * hash) + SAMPLING_INTERVAL_S_FIELD_NUMBER;
+      hash = (53 * hash) + java.lang.Float.floatToIntBits(
+          getSamplingIntervalS());
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static device.Device.MonitoringSettings parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static device.Device.MonitoringSettings parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static device.Device.MonitoringSettings parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static device.Device.MonitoringSettings parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static device.Device.MonitoringSettings parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static device.Device.MonitoringSettings parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static device.Device.MonitoringSettings parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static device.Device.MonitoringSettings parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static device.Device.MonitoringSettings parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static device.Device.MonitoringSettings parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static device.Device.MonitoringSettings parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static device.Device.MonitoringSettings parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(device.Device.MonitoringSettings prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code device.MonitoringSettings}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:device.MonitoringSettings)
+        device.Device.MonitoringSettingsOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return device.Device.internal_static_device_MonitoringSettings_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return device.Device.internal_static_device_MonitoringSettings_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                device.Device.MonitoringSettings.class, device.Device.MonitoringSettings.Builder.class);
+      }
+
+      // Construct using device.Device.MonitoringSettings.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (kpiIdBuilder_ == null) {
+          kpiId_ = null;
+        } else {
+          kpiId_ = null;
+          kpiIdBuilder_ = null;
+        }
+        if (kpiDescriptorBuilder_ == null) {
+          kpiDescriptor_ = null;
+        } else {
+          kpiDescriptor_ = null;
+          kpiDescriptorBuilder_ = null;
+        }
+        samplingDurationS_ = 0F;
+
+        samplingIntervalS_ = 0F;
+
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return device.Device.internal_static_device_MonitoringSettings_descriptor;
+      }
+
+      @java.lang.Override
+      public device.Device.MonitoringSettings getDefaultInstanceForType() {
+        return device.Device.MonitoringSettings.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public device.Device.MonitoringSettings build() {
+        device.Device.MonitoringSettings result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public device.Device.MonitoringSettings buildPartial() {
+        device.Device.MonitoringSettings result = new device.Device.MonitoringSettings(this);
+        if (kpiIdBuilder_ == null) {
+          result.kpiId_ = kpiId_;
+        } else {
+          result.kpiId_ = kpiIdBuilder_.build();
+        }
+        if (kpiDescriptorBuilder_ == null) {
+          result.kpiDescriptor_ = kpiDescriptor_;
+        } else {
+          result.kpiDescriptor_ = kpiDescriptorBuilder_.build();
+        }
+        result.samplingDurationS_ = samplingDurationS_;
+        result.samplingIntervalS_ = samplingIntervalS_;
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof device.Device.MonitoringSettings) {
+          return mergeFrom((device.Device.MonitoringSettings)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(device.Device.MonitoringSettings other) {
+        if (other == device.Device.MonitoringSettings.getDefaultInstance()) return this;
+        if (other.hasKpiId()) {
+          mergeKpiId(other.getKpiId());
+        }
+        if (other.hasKpiDescriptor()) {
+          mergeKpiDescriptor(other.getKpiDescriptor());
+        }
+        if (other.getSamplingDurationS() != 0F) {
+          setSamplingDurationS(other.getSamplingDurationS());
+        }
+        if (other.getSamplingIntervalS() != 0F) {
+          setSamplingIntervalS(other.getSamplingIntervalS());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        device.Device.MonitoringSettings parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (device.Device.MonitoringSettings) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+
+      private monitoring.Monitoring.KpiId kpiId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder> kpiIdBuilder_;
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       * @return Whether the kpiId field is set.
+       */
+      public boolean hasKpiId() {
+        return kpiIdBuilder_ != null || kpiId_ != null;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       * @return The kpiId.
+       */
+      public monitoring.Monitoring.KpiId getKpiId() {
+        if (kpiIdBuilder_ == null) {
+          return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+        } else {
+          return kpiIdBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public Builder setKpiId(monitoring.Monitoring.KpiId value) {
+        if (kpiIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          kpiId_ = value;
+          onChanged();
+        } else {
+          kpiIdBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public Builder setKpiId(
+          monitoring.Monitoring.KpiId.Builder builderForValue) {
+        if (kpiIdBuilder_ == null) {
+          kpiId_ = builderForValue.build();
+          onChanged();
+        } else {
+          kpiIdBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public Builder mergeKpiId(monitoring.Monitoring.KpiId value) {
+        if (kpiIdBuilder_ == null) {
+          if (kpiId_ != null) {
+            kpiId_ =
+              monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial();
+          } else {
+            kpiId_ = value;
+          }
+          onChanged();
+        } else {
+          kpiIdBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public Builder clearKpiId() {
+        if (kpiIdBuilder_ == null) {
+          kpiId_ = null;
+          onChanged();
+        } else {
+          kpiId_ = null;
+          kpiIdBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() {
+        
+        onChanged();
+        return getKpiIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
+        if (kpiIdBuilder_ != null) {
+          return kpiIdBuilder_.getMessageOrBuilder();
+        } else {
+          return kpiId_ == null ?
+              monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+        }
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder> 
+          getKpiIdFieldBuilder() {
+        if (kpiIdBuilder_ == null) {
+          kpiIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder>(
+                  getKpiId(),
+                  getParentForChildren(),
+                  isClean());
+          kpiId_ = null;
+        }
+        return kpiIdBuilder_;
+      }
+
+      private monitoring.Monitoring.KpiDescriptor kpiDescriptor_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          monitoring.Monitoring.KpiDescriptor, monitoring.Monitoring.KpiDescriptor.Builder, monitoring.Monitoring.KpiDescriptorOrBuilder> kpiDescriptorBuilder_;
+      /**
+       * <code>.monitoring.KpiDescriptor kpi_descriptor = 2;</code>
+       * @return Whether the kpiDescriptor field is set.
+       */
+      public boolean hasKpiDescriptor() {
+        return kpiDescriptorBuilder_ != null || kpiDescriptor_ != null;
+      }
+      /**
+       * <code>.monitoring.KpiDescriptor kpi_descriptor = 2;</code>
+       * @return The kpiDescriptor.
+       */
+      public monitoring.Monitoring.KpiDescriptor getKpiDescriptor() {
+        if (kpiDescriptorBuilder_ == null) {
+          return kpiDescriptor_ == null ? monitoring.Monitoring.KpiDescriptor.getDefaultInstance() : kpiDescriptor_;
+        } else {
+          return kpiDescriptorBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.monitoring.KpiDescriptor kpi_descriptor = 2;</code>
+       */
+      public Builder setKpiDescriptor(monitoring.Monitoring.KpiDescriptor value) {
+        if (kpiDescriptorBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          kpiDescriptor_ = value;
+          onChanged();
+        } else {
+          kpiDescriptorBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiDescriptor kpi_descriptor = 2;</code>
+       */
+      public Builder setKpiDescriptor(
+          monitoring.Monitoring.KpiDescriptor.Builder builderForValue) {
+        if (kpiDescriptorBuilder_ == null) {
+          kpiDescriptor_ = builderForValue.build();
+          onChanged();
+        } else {
+          kpiDescriptorBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiDescriptor kpi_descriptor = 2;</code>
+       */
+      public Builder mergeKpiDescriptor(monitoring.Monitoring.KpiDescriptor value) {
+        if (kpiDescriptorBuilder_ == null) {
+          if (kpiDescriptor_ != null) {
+            kpiDescriptor_ =
+              monitoring.Monitoring.KpiDescriptor.newBuilder(kpiDescriptor_).mergeFrom(value).buildPartial();
+          } else {
+            kpiDescriptor_ = value;
+          }
+          onChanged();
+        } else {
+          kpiDescriptorBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiDescriptor kpi_descriptor = 2;</code>
+       */
+      public Builder clearKpiDescriptor() {
+        if (kpiDescriptorBuilder_ == null) {
+          kpiDescriptor_ = null;
+          onChanged();
+        } else {
+          kpiDescriptor_ = null;
+          kpiDescriptorBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiDescriptor kpi_descriptor = 2;</code>
+       */
+      public monitoring.Monitoring.KpiDescriptor.Builder getKpiDescriptorBuilder() {
+        
+        onChanged();
+        return getKpiDescriptorFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.monitoring.KpiDescriptor kpi_descriptor = 2;</code>
+       */
+      public monitoring.Monitoring.KpiDescriptorOrBuilder getKpiDescriptorOrBuilder() {
+        if (kpiDescriptorBuilder_ != null) {
+          return kpiDescriptorBuilder_.getMessageOrBuilder();
+        } else {
+          return kpiDescriptor_ == null ?
+              monitoring.Monitoring.KpiDescriptor.getDefaultInstance() : kpiDescriptor_;
+        }
+      }
+      /**
+       * <code>.monitoring.KpiDescriptor kpi_descriptor = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          monitoring.Monitoring.KpiDescriptor, monitoring.Monitoring.KpiDescriptor.Builder, monitoring.Monitoring.KpiDescriptorOrBuilder> 
+          getKpiDescriptorFieldBuilder() {
+        if (kpiDescriptorBuilder_ == null) {
+          kpiDescriptorBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              monitoring.Monitoring.KpiDescriptor, monitoring.Monitoring.KpiDescriptor.Builder, monitoring.Monitoring.KpiDescriptorOrBuilder>(
+                  getKpiDescriptor(),
+                  getParentForChildren(),
+                  isClean());
+          kpiDescriptor_ = null;
+        }
+        return kpiDescriptorBuilder_;
+      }
+
+      private float samplingDurationS_ ;
+      /**
+       * <code>float sampling_duration_s = 3;</code>
+       * @return The samplingDurationS.
+       */
+      @java.lang.Override
+      public float getSamplingDurationS() {
+        return samplingDurationS_;
+      }
+      /**
+       * <code>float sampling_duration_s = 3;</code>
+       * @param value The samplingDurationS to set.
+       * @return This builder for chaining.
+       */
+      public Builder setSamplingDurationS(float value) {
+        
+        samplingDurationS_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>float sampling_duration_s = 3;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearSamplingDurationS() {
+        
+        samplingDurationS_ = 0F;
+        onChanged();
+        return this;
+      }
+
+      private float samplingIntervalS_ ;
+      /**
+       * <code>float sampling_interval_s = 4;</code>
+       * @return The samplingIntervalS.
+       */
+      @java.lang.Override
+      public float getSamplingIntervalS() {
+        return samplingIntervalS_;
+      }
+      /**
+       * <code>float sampling_interval_s = 4;</code>
+       * @param value The samplingIntervalS to set.
+       * @return This builder for chaining.
+       */
+      public Builder setSamplingIntervalS(float value) {
+        
+        samplingIntervalS_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>float sampling_interval_s = 4;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearSamplingIntervalS() {
+        
+        samplingIntervalS_ = 0F;
+        onChanged();
+        return this;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:device.MonitoringSettings)
+    }
+
+    // @@protoc_insertion_point(class_scope:device.MonitoringSettings)
+    private static final device.Device.MonitoringSettings DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new device.Device.MonitoringSettings();
+    }
+
+    public static device.Device.MonitoringSettings getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<MonitoringSettings>
+        PARSER = new com.google.protobuf.AbstractParser<MonitoringSettings>() {
+      @java.lang.Override
+      public MonitoringSettings parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new MonitoringSettings(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<MonitoringSettings> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<MonitoringSettings> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public device.Device.MonitoringSettings getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_device_MonitoringSettings_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_device_MonitoringSettings_fieldAccessorTable;
 
   public static com.google.protobuf.Descriptors.FileDescriptor
       getDescriptor() {
@@ -23,21 +996,35 @@ public final class Device {
       descriptor;
   static {
     java.lang.String[] descriptorData = {
-      "\n\014device.proto\022\006device\032\rcontext.proto2\360\001" +
-      "\n\rDeviceService\0221\n\tAddDevice\022\017.context.D" +
-      "evice\032\021.context.DeviceId\"\000\0227\n\017ConfigureD" +
-      "evice\022\017.context.Device\032\021.context.DeviceI" +
-      "d\"\000\0223\n\014DeleteDevice\022\021.context.DeviceId\032\016" +
-      ".context.Empty\"\000\022>\n\020GetInitialConfig\022\021.c" +
-      "ontext.DeviceId\032\025.context.DeviceConfig\"\000" +
-      "b\006proto3"
+      "\n\014device.proto\022\006device\032\rcontext.proto\032\020m" +
+      "onitoring.proto\"\244\001\n\022MonitoringSettings\022!" +
+      "\n\006kpi_id\030\001 \001(\0132\021.monitoring.KpiId\0221\n\016kpi" +
+      "_descriptor\030\002 \001(\0132\031.monitoring.KpiDescri" +
+      "ptor\022\033\n\023sampling_duration_s\030\003 \001(\002\022\033\n\023sam" +
+      "pling_interval_s\030\004 \001(\0022\262\002\n\rDeviceService" +
+      "\0221\n\tAddDevice\022\017.context.Device\032\021.context" +
+      ".DeviceId\"\000\0227\n\017ConfigureDevice\022\017.context" +
+      ".Device\032\021.context.DeviceId\"\000\0223\n\014DeleteDe" +
+      "vice\022\021.context.DeviceId\032\016.context.Empty\"" +
+      "\000\022>\n\020GetInitialConfig\022\021.context.DeviceId" +
+      "\032\025.context.DeviceConfig\"\000\022@\n\020MonitorDevi" +
+      "ceKpi\022\032.device.MonitoringSettings\032\016.cont" +
+      "ext.Empty\"\000b\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
         new com.google.protobuf.Descriptors.FileDescriptor[] {
           context.ContextOuterClass.getDescriptor(),
+          monitoring.Monitoring.getDescriptor(),
         });
+    internal_static_device_MonitoringSettings_descriptor =
+      getDescriptor().getMessageTypes().get(0);
+    internal_static_device_MonitoringSettings_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_device_MonitoringSettings_descriptor,
+        new java.lang.String[] { "KpiId", "KpiDescriptor", "SamplingDurationS", "SamplingIntervalS", });
     context.ContextOuterClass.getDescriptor();
+    monitoring.Monitoring.getDescriptor();
   }
 
   // @@protoc_insertion_point(outer_class_scope)
diff --git a/src/automation/target/generated-sources/grpc/device/DeviceService.java b/src/automation/target/generated-sources/grpc/device/DeviceService.java
index c2d9be46eb44a8e05efab74866f7ff8337934ed3..1768f9911b9d05a7c61e70d8f75e397f9a3341a4 100644
--- a/src/automation/target/generated-sources/grpc/device/DeviceService.java
+++ b/src/automation/target/generated-sources/grpc/device/DeviceService.java
@@ -16,6 +16,8 @@ public interface DeviceService extends MutinyService {
     
     io.smallrye.mutiny.Uni<context.ContextOuterClass.DeviceConfig> getInitialConfig(context.ContextOuterClass.DeviceId request);
     
+    io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> monitorDeviceKpi(device.Device.MonitoringSettings request);
+    
     
     
 
diff --git a/src/automation/target/generated-sources/grpc/device/DeviceServiceBean.java b/src/automation/target/generated-sources/grpc/device/DeviceServiceBean.java
index 203e2f2b3e1d42e7a848cdcc19f251e484def93f..c7e767237abc22ff273cc454f1433e5f811382fc 100644
--- a/src/automation/target/generated-sources/grpc/device/DeviceServiceBean.java
+++ b/src/automation/target/generated-sources/grpc/device/DeviceServiceBean.java
@@ -47,5 +47,13 @@ public class DeviceServiceBean extends MutinyDeviceServiceGrpc.DeviceServiceImpl
           throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
        }
     }
+    @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> monitorDeviceKpi(device.Device.MonitoringSettings request) {
+       try {
+         return delegate.monitorDeviceKpi(request);
+       } catch (UnsupportedOperationException e) {
+          throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+       }
+    }
 
 }
\ No newline at end of file
diff --git a/src/automation/target/generated-sources/grpc/device/DeviceServiceClient.java b/src/automation/target/generated-sources/grpc/device/DeviceServiceClient.java
index e987e6333549200193cf9b6a77f8589b15086718..2445752a6392c3f6f9df0b0ef439d789e6a8d925 100644
--- a/src/automation/target/generated-sources/grpc/device/DeviceServiceClient.java
+++ b/src/automation/target/generated-sources/grpc/device/DeviceServiceClient.java
@@ -36,5 +36,9 @@ public class DeviceServiceClient implements DeviceService, MutinyClient<MutinyDe
     public io.smallrye.mutiny.Uni<context.ContextOuterClass.DeviceConfig> getInitialConfig(context.ContextOuterClass.DeviceId request) {
        return stub.getInitialConfig(request);
     }
+    @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> monitorDeviceKpi(device.Device.MonitoringSettings request) {
+       return stub.monitorDeviceKpi(request);
+    }
 
 }
\ No newline at end of file
diff --git a/src/automation/target/generated-sources/grpc/device/DeviceServiceGrpc.java b/src/automation/target/generated-sources/grpc/device/DeviceServiceGrpc.java
index c19e45888168c69c1454dfde99af59cf64195851..9c2e379d311a58ca51c9208feba359120c086c0e 100644
--- a/src/automation/target/generated-sources/grpc/device/DeviceServiceGrpc.java
+++ b/src/automation/target/generated-sources/grpc/device/DeviceServiceGrpc.java
@@ -138,6 +138,37 @@ public final class DeviceServiceGrpc {
     return getGetInitialConfigMethod;
   }
 
+  private static volatile io.grpc.MethodDescriptor<device.Device.MonitoringSettings,
+      context.ContextOuterClass.Empty> getMonitorDeviceKpiMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "MonitorDeviceKpi",
+      requestType = device.Device.MonitoringSettings.class,
+      responseType = context.ContextOuterClass.Empty.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<device.Device.MonitoringSettings,
+      context.ContextOuterClass.Empty> getMonitorDeviceKpiMethod() {
+    io.grpc.MethodDescriptor<device.Device.MonitoringSettings, context.ContextOuterClass.Empty> getMonitorDeviceKpiMethod;
+    if ((getMonitorDeviceKpiMethod = DeviceServiceGrpc.getMonitorDeviceKpiMethod) == null) {
+      synchronized (DeviceServiceGrpc.class) {
+        if ((getMonitorDeviceKpiMethod = DeviceServiceGrpc.getMonitorDeviceKpiMethod) == null) {
+          DeviceServiceGrpc.getMonitorDeviceKpiMethod = getMonitorDeviceKpiMethod =
+              io.grpc.MethodDescriptor.<device.Device.MonitoringSettings, context.ContextOuterClass.Empty>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "MonitorDeviceKpi"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  device.Device.MonitoringSettings.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  context.ContextOuterClass.Empty.getDefaultInstance()))
+              .setSchemaDescriptor(new DeviceServiceMethodDescriptorSupplier("MonitorDeviceKpi"))
+              .build();
+        }
+      }
+    }
+    return getMonitorDeviceKpiMethod;
+  }
+
   /**
    * Creates a new async stub that supports all call types for the service
    */
@@ -214,6 +245,13 @@ public final class DeviceServiceGrpc {
       io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetInitialConfigMethod(), responseObserver);
     }
 
+    /**
+     */
+    public void monitorDeviceKpi(device.Device.MonitoringSettings request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.Empty> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getMonitorDeviceKpiMethod(), responseObserver);
+    }
+
     @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
       return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
           .addMethod(
@@ -244,6 +282,13 @@ public final class DeviceServiceGrpc {
                 context.ContextOuterClass.DeviceId,
                 context.ContextOuterClass.DeviceConfig>(
                   this, METHODID_GET_INITIAL_CONFIG)))
+          .addMethod(
+            getMonitorDeviceKpiMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                device.Device.MonitoringSettings,
+                context.ContextOuterClass.Empty>(
+                  this, METHODID_MONITOR_DEVICE_KPI)))
           .build();
     }
   }
@@ -293,6 +338,14 @@ public final class DeviceServiceGrpc {
       io.grpc.stub.ClientCalls.asyncUnaryCall(
           getChannel().newCall(getGetInitialConfigMethod(), getCallOptions()), request, responseObserver);
     }
+
+    /**
+     */
+    public void monitorDeviceKpi(device.Device.MonitoringSettings request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.Empty> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getMonitorDeviceKpiMethod(), getCallOptions()), request, responseObserver);
+    }
   }
 
   /**
@@ -336,6 +389,13 @@ public final class DeviceServiceGrpc {
       return io.grpc.stub.ClientCalls.blockingUnaryCall(
           getChannel(), getGetInitialConfigMethod(), getCallOptions(), request);
     }
+
+    /**
+     */
+    public context.ContextOuterClass.Empty monitorDeviceKpi(device.Device.MonitoringSettings request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getMonitorDeviceKpiMethod(), getCallOptions(), request);
+    }
   }
 
   /**
@@ -383,12 +443,21 @@ public final class DeviceServiceGrpc {
       return io.grpc.stub.ClientCalls.futureUnaryCall(
           getChannel().newCall(getGetInitialConfigMethod(), getCallOptions()), request);
     }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<context.ContextOuterClass.Empty> monitorDeviceKpi(
+        device.Device.MonitoringSettings request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getMonitorDeviceKpiMethod(), getCallOptions()), request);
+    }
   }
 
   private static final int METHODID_ADD_DEVICE = 0;
   private static final int METHODID_CONFIGURE_DEVICE = 1;
   private static final int METHODID_DELETE_DEVICE = 2;
   private static final int METHODID_GET_INITIAL_CONFIG = 3;
+  private static final int METHODID_MONITOR_DEVICE_KPI = 4;
 
   private static final class MethodHandlers<Req, Resp> implements
       io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
@@ -423,6 +492,10 @@ public final class DeviceServiceGrpc {
           serviceImpl.getInitialConfig((context.ContextOuterClass.DeviceId) request,
               (io.grpc.stub.StreamObserver<context.ContextOuterClass.DeviceConfig>) responseObserver);
           break;
+        case METHODID_MONITOR_DEVICE_KPI:
+          serviceImpl.monitorDeviceKpi((device.Device.MonitoringSettings) request,
+              (io.grpc.stub.StreamObserver<context.ContextOuterClass.Empty>) responseObserver);
+          break;
         default:
           throw new AssertionError();
       }
@@ -488,6 +561,7 @@ public final class DeviceServiceGrpc {
               .addMethod(getConfigureDeviceMethod())
               .addMethod(getDeleteDeviceMethod())
               .addMethod(getGetInitialConfigMethod())
+              .addMethod(getMonitorDeviceKpiMethod())
               .build();
         }
       }
diff --git a/src/automation/target/generated-sources/grpc/device/MutinyDeviceServiceGrpc.java b/src/automation/target/generated-sources/grpc/device/MutinyDeviceServiceGrpc.java
index ee52d131578ede0769997d3f76a02a302568c21f..096784b5a39fa66afbe2ff5402b8beec6c294730 100644
--- a/src/automation/target/generated-sources/grpc/device/MutinyDeviceServiceGrpc.java
+++ b/src/automation/target/generated-sources/grpc/device/MutinyDeviceServiceGrpc.java
@@ -55,6 +55,11 @@ public final class MutinyDeviceServiceGrpc implements io.quarkus.grpc.runtime.Mu
             return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::getInitialConfig);
         }
 
+        
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> monitorDeviceKpi(device.Device.MonitoringSettings request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::monitorDeviceKpi);
+        }
+
     }
 
     
@@ -92,6 +97,11 @@ public final class MutinyDeviceServiceGrpc implements io.quarkus.grpc.runtime.Mu
             throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
         }
 
+        
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> monitorDeviceKpi(device.Device.MonitoringSettings request) {
+            throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+        }
+
         @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
             return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
                     .addMethod(
@@ -122,6 +132,13 @@ public final class MutinyDeviceServiceGrpc implements io.quarkus.grpc.runtime.Mu
                                             context.ContextOuterClass.DeviceId,
                                             context.ContextOuterClass.DeviceConfig>(
                                             this, METHODID_GET_INITIAL_CONFIG, compression)))
+                    .addMethod(
+                            device.DeviceServiceGrpc.getMonitorDeviceKpiMethod(),
+                            asyncUnaryCall(
+                                    new MethodHandlers<
+                                            device.Device.MonitoringSettings,
+                                            context.ContextOuterClass.Empty>(
+                                            this, METHODID_MONITOR_DEVICE_KPI, compression)))
                     .build();
         }
     }
@@ -130,6 +147,7 @@ public final class MutinyDeviceServiceGrpc implements io.quarkus.grpc.runtime.Mu
     private static final int METHODID_CONFIGURE_DEVICE = 1;
     private static final int METHODID_DELETE_DEVICE = 2;
     private static final int METHODID_GET_INITIAL_CONFIG = 3;
+    private static final int METHODID_MONITOR_DEVICE_KPI = 4;
 
     private static final class MethodHandlers<Req, Resp> implements
             io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
@@ -174,6 +192,12 @@ public final class MutinyDeviceServiceGrpc implements io.quarkus.grpc.runtime.Mu
                             compression,
                             serviceImpl::getInitialConfig);
                     break;
+                case METHODID_MONITOR_DEVICE_KPI:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((device.Device.MonitoringSettings) request,
+                            (io.grpc.stub.StreamObserver<context.ContextOuterClass.Empty>) responseObserver,
+                            compression,
+                            serviceImpl::monitorDeviceKpi);
+                    break;
                 default:
                     throw new java.lang.AssertionError();
             }
diff --git a/src/automation/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java b/src/automation/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java
new file mode 100644
index 0000000000000000000000000000000000000000..67e1ec736f9d83cbf95b419e9e61e92e82e73b88
--- /dev/null
+++ b/src/automation/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java
@@ -0,0 +1,176 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: kpi_sample_types.proto
+
+package kpi_sample_types;
+
+public final class KpiSampleTypes {
+  private KpiSampleTypes() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistryLite registry) {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registerAllExtensions(
+        (com.google.protobuf.ExtensionRegistryLite) registry);
+  }
+  /**
+   * Protobuf enum {@code kpi_sample_types.KpiSampleType}
+   */
+  public enum KpiSampleType
+      implements com.google.protobuf.ProtocolMessageEnum {
+    /**
+     * <code>KPISAMPLETYPE_UNKNOWN = 0;</code>
+     */
+    KPISAMPLETYPE_UNKNOWN(0),
+    /**
+     * <code>KPISAMPLETYPE_PACKETS_TRANSMITTED = 101;</code>
+     */
+    KPISAMPLETYPE_PACKETS_TRANSMITTED(101),
+    /**
+     * <code>KPISAMPLETYPE_PACKETS_RECEIVED = 102;</code>
+     */
+    KPISAMPLETYPE_PACKETS_RECEIVED(102),
+    /**
+     * <code>KPISAMPLETYPE_BYTES_TRANSMITTED = 201;</code>
+     */
+    KPISAMPLETYPE_BYTES_TRANSMITTED(201),
+    /**
+     * <code>KPISAMPLETYPE_BYTES_RECEIVED = 202;</code>
+     */
+    KPISAMPLETYPE_BYTES_RECEIVED(202),
+    UNRECOGNIZED(-1),
+    ;
+
+    /**
+     * <code>KPISAMPLETYPE_UNKNOWN = 0;</code>
+     */
+    public static final int KPISAMPLETYPE_UNKNOWN_VALUE = 0;
+    /**
+     * <code>KPISAMPLETYPE_PACKETS_TRANSMITTED = 101;</code>
+     */
+    public static final int KPISAMPLETYPE_PACKETS_TRANSMITTED_VALUE = 101;
+    /**
+     * <code>KPISAMPLETYPE_PACKETS_RECEIVED = 102;</code>
+     */
+    public static final int KPISAMPLETYPE_PACKETS_RECEIVED_VALUE = 102;
+    /**
+     * <code>KPISAMPLETYPE_BYTES_TRANSMITTED = 201;</code>
+     */
+    public static final int KPISAMPLETYPE_BYTES_TRANSMITTED_VALUE = 201;
+    /**
+     * <code>KPISAMPLETYPE_BYTES_RECEIVED = 202;</code>
+     */
+    public static final int KPISAMPLETYPE_BYTES_RECEIVED_VALUE = 202;
+
+
+    public final int getNumber() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalArgumentException(
+            "Can't get the number of an unknown enum value.");
+      }
+      return value;
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
+    public static KpiSampleType valueOf(int value) {
+      return forNumber(value);
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     */
+    public static KpiSampleType forNumber(int value) {
+      switch (value) {
+        case 0: return KPISAMPLETYPE_UNKNOWN;
+        case 101: return KPISAMPLETYPE_PACKETS_TRANSMITTED;
+        case 102: return KPISAMPLETYPE_PACKETS_RECEIVED;
+        case 201: return KPISAMPLETYPE_BYTES_TRANSMITTED;
+        case 202: return KPISAMPLETYPE_BYTES_RECEIVED;
+        default: return null;
+      }
+    }
+
+    public static com.google.protobuf.Internal.EnumLiteMap<KpiSampleType>
+        internalGetValueMap() {
+      return internalValueMap;
+    }
+    private static final com.google.protobuf.Internal.EnumLiteMap<
+        KpiSampleType> internalValueMap =
+          new com.google.protobuf.Internal.EnumLiteMap<KpiSampleType>() {
+            public KpiSampleType findValueByNumber(int number) {
+              return KpiSampleType.forNumber(number);
+            }
+          };
+
+    public final com.google.protobuf.Descriptors.EnumValueDescriptor
+        getValueDescriptor() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalStateException(
+            "Can't get the descriptor of an unrecognized enum value.");
+      }
+      return getDescriptor().getValues().get(ordinal());
+    }
+    public final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptorForType() {
+      return getDescriptor();
+    }
+    public static final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptor() {
+      return kpi_sample_types.KpiSampleTypes.getDescriptor().getEnumTypes().get(0);
+    }
+
+    private static final KpiSampleType[] VALUES = values();
+
+    public static KpiSampleType valueOf(
+        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+      if (desc.getType() != getDescriptor()) {
+        throw new java.lang.IllegalArgumentException(
+          "EnumValueDescriptor is not for this type.");
+      }
+      if (desc.getIndex() == -1) {
+        return UNRECOGNIZED;
+      }
+      return VALUES[desc.getIndex()];
+    }
+
+    private final int value;
+
+    private KpiSampleType(int value) {
+      this.value = value;
+    }
+
+    // @@protoc_insertion_point(enum_scope:kpi_sample_types.KpiSampleType)
+  }
+
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static  com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\026kpi_sample_types.proto\022\020kpi_sample_typ" +
+      "es*\276\001\n\rKpiSampleType\022\031\n\025KPISAMPLETYPE_UN" +
+      "KNOWN\020\000\022%\n!KPISAMPLETYPE_PACKETS_TRANSMI" +
+      "TTED\020e\022\"\n\036KPISAMPLETYPE_PACKETS_RECEIVED" +
+      "\020f\022$\n\037KPISAMPLETYPE_BYTES_TRANSMITTED\020\311\001" +
+      "\022!\n\034KPISAMPLETYPE_BYTES_RECEIVED\020\312\001b\006pro" +
+      "to3"
+    };
+    descriptor = com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+        });
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/src/automation/target/generated-sources/grpc/monitoring/Monitoring.java b/src/automation/target/generated-sources/grpc/monitoring/Monitoring.java
new file mode 100644
index 0000000000000000000000000000000000000000..1ef1f0c029d1d5916eaf5ffc4f185c048a40b5a3
--- /dev/null
+++ b/src/automation/target/generated-sources/grpc/monitoring/Monitoring.java
@@ -0,0 +1,5629 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: monitoring.proto
+
+package monitoring;
+
+public final class Monitoring {
+  private Monitoring() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistryLite registry) {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registerAllExtensions(
+        (com.google.protobuf.ExtensionRegistryLite) registry);
+  }
+  public interface KpiDescriptorOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:monitoring.KpiDescriptor)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>string kpi_description = 1;</code>
+     * @return The kpiDescription.
+     */
+    java.lang.String getKpiDescription();
+    /**
+     * <code>string kpi_description = 1;</code>
+     * @return The bytes for kpiDescription.
+     */
+    com.google.protobuf.ByteString
+        getKpiDescriptionBytes();
+
+    /**
+     * <code>.kpi_sample_types.KpiSampleType kpi_sample_type = 2;</code>
+     * @return The enum numeric value on the wire for kpiSampleType.
+     */
+    int getKpiSampleTypeValue();
+    /**
+     * <code>.kpi_sample_types.KpiSampleType kpi_sample_type = 2;</code>
+     * @return The kpiSampleType.
+     */
+    kpi_sample_types.KpiSampleTypes.KpiSampleType getKpiSampleType();
+
+    /**
+     * <code>.context.DeviceId device_id = 3;</code>
+     * @return Whether the deviceId field is set.
+     */
+    boolean hasDeviceId();
+    /**
+     * <code>.context.DeviceId device_id = 3;</code>
+     * @return The deviceId.
+     */
+    context.ContextOuterClass.DeviceId getDeviceId();
+    /**
+     * <code>.context.DeviceId device_id = 3;</code>
+     */
+    context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder();
+
+    /**
+     * <code>.context.EndPointId endpoint_id = 4;</code>
+     * @return Whether the endpointId field is set.
+     */
+    boolean hasEndpointId();
+    /**
+     * <code>.context.EndPointId endpoint_id = 4;</code>
+     * @return The endpointId.
+     */
+    context.ContextOuterClass.EndPointId getEndpointId();
+    /**
+     * <code>.context.EndPointId endpoint_id = 4;</code>
+     */
+    context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
+
+    /**
+     * <pre>
+     *  context.SliceId    slice_id    = 6;
+     * </pre>
+     *
+     * <code>.context.ServiceId service_id = 5;</code>
+     * @return Whether the serviceId field is set.
+     */
+    boolean hasServiceId();
+    /**
+     * <pre>
+     *  context.SliceId    slice_id    = 6;
+     * </pre>
+     *
+     * <code>.context.ServiceId service_id = 5;</code>
+     * @return The serviceId.
+     */
+    context.ContextOuterClass.ServiceId getServiceId();
+    /**
+     * <pre>
+     *  context.SliceId    slice_id    = 6;
+     * </pre>
+     *
+     * <code>.context.ServiceId service_id = 5;</code>
+     */
+    context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder();
+  }
+  /**
+   * Protobuf type {@code monitoring.KpiDescriptor}
+   */
+  public static final class KpiDescriptor extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:monitoring.KpiDescriptor)
+      KpiDescriptorOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use KpiDescriptor.newBuilder() to construct.
+    private KpiDescriptor(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private KpiDescriptor() {
+      kpiDescription_ = "";
+      kpiSampleType_ = 0;
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new KpiDescriptor();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private KpiDescriptor(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              kpiDescription_ = s;
+              break;
+            }
+            case 16: {
+              int rawValue = input.readEnum();
+
+              kpiSampleType_ = rawValue;
+              break;
+            }
+            case 26: {
+              context.ContextOuterClass.DeviceId.Builder subBuilder = null;
+              if (deviceId_ != null) {
+                subBuilder = deviceId_.toBuilder();
+              }
+              deviceId_ = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(deviceId_);
+                deviceId_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 34: {
+              context.ContextOuterClass.EndPointId.Builder subBuilder = null;
+              if (endpointId_ != null) {
+                subBuilder = endpointId_.toBuilder();
+              }
+              endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(endpointId_);
+                endpointId_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 42: {
+              context.ContextOuterClass.ServiceId.Builder subBuilder = null;
+              if (serviceId_ != null) {
+                subBuilder = serviceId_.toBuilder();
+              }
+              serviceId_ = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(serviceId_);
+                serviceId_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return monitoring.Monitoring.internal_static_monitoring_KpiDescriptor_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return monitoring.Monitoring.internal_static_monitoring_KpiDescriptor_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              monitoring.Monitoring.KpiDescriptor.class, monitoring.Monitoring.KpiDescriptor.Builder.class);
+    }
+
+    public static final int KPI_DESCRIPTION_FIELD_NUMBER = 1;
+    private volatile java.lang.Object kpiDescription_;
+    /**
+     * <code>string kpi_description = 1;</code>
+     * @return The kpiDescription.
+     */
+    @java.lang.Override
+    public java.lang.String getKpiDescription() {
+      java.lang.Object ref = kpiDescription_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        kpiDescription_ = s;
+        return s;
+      }
+    }
+    /**
+     * <code>string kpi_description = 1;</code>
+     * @return The bytes for kpiDescription.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString
+        getKpiDescriptionBytes() {
+      java.lang.Object ref = kpiDescription_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        kpiDescription_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int KPI_SAMPLE_TYPE_FIELD_NUMBER = 2;
+    private int kpiSampleType_;
+    /**
+     * <code>.kpi_sample_types.KpiSampleType kpi_sample_type = 2;</code>
+     * @return The enum numeric value on the wire for kpiSampleType.
+     */
+    @java.lang.Override public int getKpiSampleTypeValue() {
+      return kpiSampleType_;
+    }
+    /**
+     * <code>.kpi_sample_types.KpiSampleType kpi_sample_type = 2;</code>
+     * @return The kpiSampleType.
+     */
+    @java.lang.Override public kpi_sample_types.KpiSampleTypes.KpiSampleType getKpiSampleType() {
+      @SuppressWarnings("deprecation")
+      kpi_sample_types.KpiSampleTypes.KpiSampleType result = kpi_sample_types.KpiSampleTypes.KpiSampleType.valueOf(kpiSampleType_);
+      return result == null ? kpi_sample_types.KpiSampleTypes.KpiSampleType.UNRECOGNIZED : result;
+    }
+
+    public static final int DEVICE_ID_FIELD_NUMBER = 3;
+    private context.ContextOuterClass.DeviceId deviceId_;
+    /**
+     * <code>.context.DeviceId device_id = 3;</code>
+     * @return Whether the deviceId field is set.
+     */
+    @java.lang.Override
+    public boolean hasDeviceId() {
+      return deviceId_ != null;
+    }
+    /**
+     * <code>.context.DeviceId device_id = 3;</code>
+     * @return The deviceId.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.DeviceId getDeviceId() {
+      return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
+    }
+    /**
+     * <code>.context.DeviceId device_id = 3;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() {
+      return getDeviceId();
+    }
+
+    public static final int ENDPOINT_ID_FIELD_NUMBER = 4;
+    private context.ContextOuterClass.EndPointId endpointId_;
+    /**
+     * <code>.context.EndPointId endpoint_id = 4;</code>
+     * @return Whether the endpointId field is set.
+     */
+    @java.lang.Override
+    public boolean hasEndpointId() {
+      return endpointId_ != null;
+    }
+    /**
+     * <code>.context.EndPointId endpoint_id = 4;</code>
+     * @return The endpointId.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.EndPointId getEndpointId() {
+      return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+    }
+    /**
+     * <code>.context.EndPointId endpoint_id = 4;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+      return getEndpointId();
+    }
+
+    public static final int SERVICE_ID_FIELD_NUMBER = 5;
+    private context.ContextOuterClass.ServiceId serviceId_;
+    /**
+     * <pre>
+     *  context.SliceId    slice_id    = 6;
+     * </pre>
+     *
+     * <code>.context.ServiceId service_id = 5;</code>
+     * @return Whether the serviceId field is set.
+     */
+    @java.lang.Override
+    public boolean hasServiceId() {
+      return serviceId_ != null;
+    }
+    /**
+     * <pre>
+     *  context.SliceId    slice_id    = 6;
+     * </pre>
+     *
+     * <code>.context.ServiceId service_id = 5;</code>
+     * @return The serviceId.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ServiceId getServiceId() {
+      return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+    }
+    /**
+     * <pre>
+     *  context.SliceId    slice_id    = 6;
+     * </pre>
+     *
+     * <code>.context.ServiceId service_id = 5;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
+      return getServiceId();
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (!getKpiDescriptionBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, kpiDescription_);
+      }
+      if (kpiSampleType_ != kpi_sample_types.KpiSampleTypes.KpiSampleType.KPISAMPLETYPE_UNKNOWN.getNumber()) {
+        output.writeEnum(2, kpiSampleType_);
+      }
+      if (deviceId_ != null) {
+        output.writeMessage(3, getDeviceId());
+      }
+      if (endpointId_ != null) {
+        output.writeMessage(4, getEndpointId());
+      }
+      if (serviceId_ != null) {
+        output.writeMessage(5, getServiceId());
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (!getKpiDescriptionBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, kpiDescription_);
+      }
+      if (kpiSampleType_ != kpi_sample_types.KpiSampleTypes.KpiSampleType.KPISAMPLETYPE_UNKNOWN.getNumber()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(2, kpiSampleType_);
+      }
+      if (deviceId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, getDeviceId());
+      }
+      if (endpointId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, getEndpointId());
+      }
+      if (serviceId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(5, getServiceId());
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof monitoring.Monitoring.KpiDescriptor)) {
+        return super.equals(obj);
+      }
+      monitoring.Monitoring.KpiDescriptor other = (monitoring.Monitoring.KpiDescriptor) obj;
+
+      if (!getKpiDescription()
+          .equals(other.getKpiDescription())) return false;
+      if (kpiSampleType_ != other.kpiSampleType_) return false;
+      if (hasDeviceId() != other.hasDeviceId()) return false;
+      if (hasDeviceId()) {
+        if (!getDeviceId()
+            .equals(other.getDeviceId())) return false;
+      }
+      if (hasEndpointId() != other.hasEndpointId()) return false;
+      if (hasEndpointId()) {
+        if (!getEndpointId()
+            .equals(other.getEndpointId())) return false;
+      }
+      if (hasServiceId() != other.hasServiceId()) return false;
+      if (hasServiceId()) {
+        if (!getServiceId()
+            .equals(other.getServiceId())) return false;
+      }
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + KPI_DESCRIPTION_FIELD_NUMBER;
+      hash = (53 * hash) + getKpiDescription().hashCode();
+      hash = (37 * hash) + KPI_SAMPLE_TYPE_FIELD_NUMBER;
+      hash = (53 * hash) + kpiSampleType_;
+      if (hasDeviceId()) {
+        hash = (37 * hash) + DEVICE_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getDeviceId().hashCode();
+      }
+      if (hasEndpointId()) {
+        hash = (37 * hash) + ENDPOINT_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getEndpointId().hashCode();
+      }
+      if (hasServiceId()) {
+        hash = (37 * hash) + SERVICE_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getServiceId().hashCode();
+      }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static monitoring.Monitoring.KpiDescriptor parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.KpiDescriptor parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiDescriptor parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.KpiDescriptor parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiDescriptor parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.KpiDescriptor parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiDescriptor parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.KpiDescriptor parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiDescriptor parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.KpiDescriptor parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiDescriptor parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.KpiDescriptor parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(monitoring.Monitoring.KpiDescriptor prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code monitoring.KpiDescriptor}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:monitoring.KpiDescriptor)
+        monitoring.Monitoring.KpiDescriptorOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return monitoring.Monitoring.internal_static_monitoring_KpiDescriptor_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return monitoring.Monitoring.internal_static_monitoring_KpiDescriptor_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                monitoring.Monitoring.KpiDescriptor.class, monitoring.Monitoring.KpiDescriptor.Builder.class);
+      }
+
+      // Construct using monitoring.Monitoring.KpiDescriptor.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        kpiDescription_ = "";
+
+        kpiSampleType_ = 0;
+
+        if (deviceIdBuilder_ == null) {
+          deviceId_ = null;
+        } else {
+          deviceId_ = null;
+          deviceIdBuilder_ = null;
+        }
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = null;
+        } else {
+          endpointId_ = null;
+          endpointIdBuilder_ = null;
+        }
+        if (serviceIdBuilder_ == null) {
+          serviceId_ = null;
+        } else {
+          serviceId_ = null;
+          serviceIdBuilder_ = null;
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return monitoring.Monitoring.internal_static_monitoring_KpiDescriptor_descriptor;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.KpiDescriptor getDefaultInstanceForType() {
+        return monitoring.Monitoring.KpiDescriptor.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.KpiDescriptor build() {
+        monitoring.Monitoring.KpiDescriptor result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.KpiDescriptor buildPartial() {
+        monitoring.Monitoring.KpiDescriptor result = new monitoring.Monitoring.KpiDescriptor(this);
+        result.kpiDescription_ = kpiDescription_;
+        result.kpiSampleType_ = kpiSampleType_;
+        if (deviceIdBuilder_ == null) {
+          result.deviceId_ = deviceId_;
+        } else {
+          result.deviceId_ = deviceIdBuilder_.build();
+        }
+        if (endpointIdBuilder_ == null) {
+          result.endpointId_ = endpointId_;
+        } else {
+          result.endpointId_ = endpointIdBuilder_.build();
+        }
+        if (serviceIdBuilder_ == null) {
+          result.serviceId_ = serviceId_;
+        } else {
+          result.serviceId_ = serviceIdBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof monitoring.Monitoring.KpiDescriptor) {
+          return mergeFrom((monitoring.Monitoring.KpiDescriptor)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(monitoring.Monitoring.KpiDescriptor other) {
+        if (other == monitoring.Monitoring.KpiDescriptor.getDefaultInstance()) return this;
+        if (!other.getKpiDescription().isEmpty()) {
+          kpiDescription_ = other.kpiDescription_;
+          onChanged();
+        }
+        if (other.kpiSampleType_ != 0) {
+          setKpiSampleTypeValue(other.getKpiSampleTypeValue());
+        }
+        if (other.hasDeviceId()) {
+          mergeDeviceId(other.getDeviceId());
+        }
+        if (other.hasEndpointId()) {
+          mergeEndpointId(other.getEndpointId());
+        }
+        if (other.hasServiceId()) {
+          mergeServiceId(other.getServiceId());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        monitoring.Monitoring.KpiDescriptor parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (monitoring.Monitoring.KpiDescriptor) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+
+      private java.lang.Object kpiDescription_ = "";
+      /**
+       * <code>string kpi_description = 1;</code>
+       * @return The kpiDescription.
+       */
+      public java.lang.String getKpiDescription() {
+        java.lang.Object ref = kpiDescription_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          kpiDescription_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>string kpi_description = 1;</code>
+       * @return The bytes for kpiDescription.
+       */
+      public com.google.protobuf.ByteString
+          getKpiDescriptionBytes() {
+        java.lang.Object ref = kpiDescription_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          kpiDescription_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>string kpi_description = 1;</code>
+       * @param value The kpiDescription to set.
+       * @return This builder for chaining.
+       */
+      public Builder setKpiDescription(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        kpiDescription_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string kpi_description = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearKpiDescription() {
+        
+        kpiDescription_ = getDefaultInstance().getKpiDescription();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string kpi_description = 1;</code>
+       * @param value The bytes for kpiDescription to set.
+       * @return This builder for chaining.
+       */
+      public Builder setKpiDescriptionBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        kpiDescription_ = value;
+        onChanged();
+        return this;
+      }
+
+      private int kpiSampleType_ = 0;
+      /**
+       * <code>.kpi_sample_types.KpiSampleType kpi_sample_type = 2;</code>
+       * @return The enum numeric value on the wire for kpiSampleType.
+       */
+      @java.lang.Override public int getKpiSampleTypeValue() {
+        return kpiSampleType_;
+      }
+      /**
+       * <code>.kpi_sample_types.KpiSampleType kpi_sample_type = 2;</code>
+       * @param value The enum numeric value on the wire for kpiSampleType to set.
+       * @return This builder for chaining.
+       */
+      public Builder setKpiSampleTypeValue(int value) {
+        
+        kpiSampleType_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>.kpi_sample_types.KpiSampleType kpi_sample_type = 2;</code>
+       * @return The kpiSampleType.
+       */
+      @java.lang.Override
+      public kpi_sample_types.KpiSampleTypes.KpiSampleType getKpiSampleType() {
+        @SuppressWarnings("deprecation")
+        kpi_sample_types.KpiSampleTypes.KpiSampleType result = kpi_sample_types.KpiSampleTypes.KpiSampleType.valueOf(kpiSampleType_);
+        return result == null ? kpi_sample_types.KpiSampleTypes.KpiSampleType.UNRECOGNIZED : result;
+      }
+      /**
+       * <code>.kpi_sample_types.KpiSampleType kpi_sample_type = 2;</code>
+       * @param value The kpiSampleType to set.
+       * @return This builder for chaining.
+       */
+      public Builder setKpiSampleType(kpi_sample_types.KpiSampleTypes.KpiSampleType value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        
+        kpiSampleType_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>.kpi_sample_types.KpiSampleType kpi_sample_type = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearKpiSampleType() {
+        
+        kpiSampleType_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private context.ContextOuterClass.DeviceId deviceId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> deviceIdBuilder_;
+      /**
+       * <code>.context.DeviceId device_id = 3;</code>
+       * @return Whether the deviceId field is set.
+       */
+      public boolean hasDeviceId() {
+        return deviceIdBuilder_ != null || deviceId_ != null;
+      }
+      /**
+       * <code>.context.DeviceId device_id = 3;</code>
+       * @return The deviceId.
+       */
+      public context.ContextOuterClass.DeviceId getDeviceId() {
+        if (deviceIdBuilder_ == null) {
+          return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
+        } else {
+          return deviceIdBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.context.DeviceId device_id = 3;</code>
+       */
+      public Builder setDeviceId(context.ContextOuterClass.DeviceId value) {
+        if (deviceIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          deviceId_ = value;
+          onChanged();
+        } else {
+          deviceIdBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.DeviceId device_id = 3;</code>
+       */
+      public Builder setDeviceId(
+          context.ContextOuterClass.DeviceId.Builder builderForValue) {
+        if (deviceIdBuilder_ == null) {
+          deviceId_ = builderForValue.build();
+          onChanged();
+        } else {
+          deviceIdBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.DeviceId device_id = 3;</code>
+       */
+      public Builder mergeDeviceId(context.ContextOuterClass.DeviceId value) {
+        if (deviceIdBuilder_ == null) {
+          if (deviceId_ != null) {
+            deviceId_ =
+              context.ContextOuterClass.DeviceId.newBuilder(deviceId_).mergeFrom(value).buildPartial();
+          } else {
+            deviceId_ = value;
+          }
+          onChanged();
+        } else {
+          deviceIdBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.DeviceId device_id = 3;</code>
+       */
+      public Builder clearDeviceId() {
+        if (deviceIdBuilder_ == null) {
+          deviceId_ = null;
+          onChanged();
+        } else {
+          deviceId_ = null;
+          deviceIdBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.DeviceId device_id = 3;</code>
+       */
+      public context.ContextOuterClass.DeviceId.Builder getDeviceIdBuilder() {
+        
+        onChanged();
+        return getDeviceIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.DeviceId device_id = 3;</code>
+       */
+      public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() {
+        if (deviceIdBuilder_ != null) {
+          return deviceIdBuilder_.getMessageOrBuilder();
+        } else {
+          return deviceId_ == null ?
+              context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
+        }
+      }
+      /**
+       * <code>.context.DeviceId device_id = 3;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> 
+          getDeviceIdFieldBuilder() {
+        if (deviceIdBuilder_ == null) {
+          deviceIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder>(
+                  getDeviceId(),
+                  getParentForChildren(),
+                  isClean());
+          deviceId_ = null;
+        }
+        return deviceIdBuilder_;
+      }
+
+      private context.ContextOuterClass.EndPointId endpointId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> endpointIdBuilder_;
+      /**
+       * <code>.context.EndPointId endpoint_id = 4;</code>
+       * @return Whether the endpointId field is set.
+       */
+      public boolean hasEndpointId() {
+        return endpointIdBuilder_ != null || endpointId_ != null;
+      }
+      /**
+       * <code>.context.EndPointId endpoint_id = 4;</code>
+       * @return The endpointId.
+       */
+      public context.ContextOuterClass.EndPointId getEndpointId() {
+        if (endpointIdBuilder_ == null) {
+          return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+        } else {
+          return endpointIdBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.context.EndPointId endpoint_id = 4;</code>
+       */
+      public Builder setEndpointId(context.ContextOuterClass.EndPointId value) {
+        if (endpointIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          endpointId_ = value;
+          onChanged();
+        } else {
+          endpointIdBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.EndPointId endpoint_id = 4;</code>
+       */
+      public Builder setEndpointId(
+          context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = builderForValue.build();
+          onChanged();
+        } else {
+          endpointIdBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.EndPointId endpoint_id = 4;</code>
+       */
+      public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
+        if (endpointIdBuilder_ == null) {
+          if (endpointId_ != null) {
+            endpointId_ =
+              context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
+          } else {
+            endpointId_ = value;
+          }
+          onChanged();
+        } else {
+          endpointIdBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.EndPointId endpoint_id = 4;</code>
+       */
+      public Builder clearEndpointId() {
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = null;
+          onChanged();
+        } else {
+          endpointId_ = null;
+          endpointIdBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.EndPointId endpoint_id = 4;</code>
+       */
+      public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
+        
+        onChanged();
+        return getEndpointIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.EndPointId endpoint_id = 4;</code>
+       */
+      public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+        if (endpointIdBuilder_ != null) {
+          return endpointIdBuilder_.getMessageOrBuilder();
+        } else {
+          return endpointId_ == null ?
+              context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+        }
+      }
+      /**
+       * <code>.context.EndPointId endpoint_id = 4;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
+          getEndpointIdFieldBuilder() {
+        if (endpointIdBuilder_ == null) {
+          endpointIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
+                  getEndpointId(),
+                  getParentForChildren(),
+                  isClean());
+          endpointId_ = null;
+        }
+        return endpointIdBuilder_;
+      }
+
+      private context.ContextOuterClass.ServiceId serviceId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> serviceIdBuilder_;
+      /**
+       * <pre>
+       *  context.SliceId    slice_id    = 6;
+       * </pre>
+       *
+       * <code>.context.ServiceId service_id = 5;</code>
+       * @return Whether the serviceId field is set.
+       */
+      public boolean hasServiceId() {
+        return serviceIdBuilder_ != null || serviceId_ != null;
+      }
+      /**
+       * <pre>
+       *  context.SliceId    slice_id    = 6;
+       * </pre>
+       *
+       * <code>.context.ServiceId service_id = 5;</code>
+       * @return The serviceId.
+       */
+      public context.ContextOuterClass.ServiceId getServiceId() {
+        if (serviceIdBuilder_ == null) {
+          return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+        } else {
+          return serviceIdBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       *  context.SliceId    slice_id    = 6;
+       * </pre>
+       *
+       * <code>.context.ServiceId service_id = 5;</code>
+       */
+      public Builder setServiceId(context.ContextOuterClass.ServiceId value) {
+        if (serviceIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          serviceId_ = value;
+          onChanged();
+        } else {
+          serviceIdBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       *  context.SliceId    slice_id    = 6;
+       * </pre>
+       *
+       * <code>.context.ServiceId service_id = 5;</code>
+       */
+      public Builder setServiceId(
+          context.ContextOuterClass.ServiceId.Builder builderForValue) {
+        if (serviceIdBuilder_ == null) {
+          serviceId_ = builderForValue.build();
+          onChanged();
+        } else {
+          serviceIdBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       *  context.SliceId    slice_id    = 6;
+       * </pre>
+       *
+       * <code>.context.ServiceId service_id = 5;</code>
+       */
+      public Builder mergeServiceId(context.ContextOuterClass.ServiceId value) {
+        if (serviceIdBuilder_ == null) {
+          if (serviceId_ != null) {
+            serviceId_ =
+              context.ContextOuterClass.ServiceId.newBuilder(serviceId_).mergeFrom(value).buildPartial();
+          } else {
+            serviceId_ = value;
+          }
+          onChanged();
+        } else {
+          serviceIdBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       *  context.SliceId    slice_id    = 6;
+       * </pre>
+       *
+       * <code>.context.ServiceId service_id = 5;</code>
+       */
+      public Builder clearServiceId() {
+        if (serviceIdBuilder_ == null) {
+          serviceId_ = null;
+          onChanged();
+        } else {
+          serviceId_ = null;
+          serviceIdBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       *  context.SliceId    slice_id    = 6;
+       * </pre>
+       *
+       * <code>.context.ServiceId service_id = 5;</code>
+       */
+      public context.ContextOuterClass.ServiceId.Builder getServiceIdBuilder() {
+        
+        onChanged();
+        return getServiceIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       *  context.SliceId    slice_id    = 6;
+       * </pre>
+       *
+       * <code>.context.ServiceId service_id = 5;</code>
+       */
+      public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
+        if (serviceIdBuilder_ != null) {
+          return serviceIdBuilder_.getMessageOrBuilder();
+        } else {
+          return serviceId_ == null ?
+              context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+        }
+      }
+      /**
+       * <pre>
+       *  context.SliceId    slice_id    = 6;
+       * </pre>
+       *
+       * <code>.context.ServiceId service_id = 5;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> 
+          getServiceIdFieldBuilder() {
+        if (serviceIdBuilder_ == null) {
+          serviceIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder>(
+                  getServiceId(),
+                  getParentForChildren(),
+                  isClean());
+          serviceId_ = null;
+        }
+        return serviceIdBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:monitoring.KpiDescriptor)
+    }
+
+    // @@protoc_insertion_point(class_scope:monitoring.KpiDescriptor)
+    private static final monitoring.Monitoring.KpiDescriptor DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new monitoring.Monitoring.KpiDescriptor();
+    }
+
+    public static monitoring.Monitoring.KpiDescriptor getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<KpiDescriptor>
+        PARSER = new com.google.protobuf.AbstractParser<KpiDescriptor>() {
+      @java.lang.Override
+      public KpiDescriptor parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new KpiDescriptor(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<KpiDescriptor> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<KpiDescriptor> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public monitoring.Monitoring.KpiDescriptor getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface MonitorKpiRequestOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:monitoring.MonitorKpiRequest)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     * @return Whether the kpiId field is set.
+     */
+    boolean hasKpiId();
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     * @return The kpiId.
+     */
+    monitoring.Monitoring.KpiId getKpiId();
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     */
+    monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder();
+
+    /**
+     * <code>float sampling_duration_s = 2;</code>
+     * @return The samplingDurationS.
+     */
+    float getSamplingDurationS();
+
+    /**
+     * <code>float sampling_interval_s = 3;</code>
+     * @return The samplingIntervalS.
+     */
+    float getSamplingIntervalS();
+  }
+  /**
+   * Protobuf type {@code monitoring.MonitorKpiRequest}
+   */
+  public static final class MonitorKpiRequest extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:monitoring.MonitorKpiRequest)
+      MonitorKpiRequestOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use MonitorKpiRequest.newBuilder() to construct.
+    private MonitorKpiRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private MonitorKpiRequest() {
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new MonitorKpiRequest();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private MonitorKpiRequest(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              monitoring.Monitoring.KpiId.Builder subBuilder = null;
+              if (kpiId_ != null) {
+                subBuilder = kpiId_.toBuilder();
+              }
+              kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(kpiId_);
+                kpiId_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 21: {
+
+              samplingDurationS_ = input.readFloat();
+              break;
+            }
+            case 29: {
+
+              samplingIntervalS_ = input.readFloat();
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return monitoring.Monitoring.internal_static_monitoring_MonitorKpiRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return monitoring.Monitoring.internal_static_monitoring_MonitorKpiRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              monitoring.Monitoring.MonitorKpiRequest.class, monitoring.Monitoring.MonitorKpiRequest.Builder.class);
+    }
+
+    public static final int KPI_ID_FIELD_NUMBER = 1;
+    private monitoring.Monitoring.KpiId kpiId_;
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     * @return Whether the kpiId field is set.
+     */
+    @java.lang.Override
+    public boolean hasKpiId() {
+      return kpiId_ != null;
+    }
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     * @return The kpiId.
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.KpiId getKpiId() {
+      return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+    }
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
+      return getKpiId();
+    }
+
+    public static final int SAMPLING_DURATION_S_FIELD_NUMBER = 2;
+    private float samplingDurationS_;
+    /**
+     * <code>float sampling_duration_s = 2;</code>
+     * @return The samplingDurationS.
+     */
+    @java.lang.Override
+    public float getSamplingDurationS() {
+      return samplingDurationS_;
+    }
+
+    public static final int SAMPLING_INTERVAL_S_FIELD_NUMBER = 3;
+    private float samplingIntervalS_;
+    /**
+     * <code>float sampling_interval_s = 3;</code>
+     * @return The samplingIntervalS.
+     */
+    @java.lang.Override
+    public float getSamplingIntervalS() {
+      return samplingIntervalS_;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (kpiId_ != null) {
+        output.writeMessage(1, getKpiId());
+      }
+      if (samplingDurationS_ != 0F) {
+        output.writeFloat(2, samplingDurationS_);
+      }
+      if (samplingIntervalS_ != 0F) {
+        output.writeFloat(3, samplingIntervalS_);
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (kpiId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, getKpiId());
+      }
+      if (samplingDurationS_ != 0F) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeFloatSize(2, samplingDurationS_);
+      }
+      if (samplingIntervalS_ != 0F) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeFloatSize(3, samplingIntervalS_);
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof monitoring.Monitoring.MonitorKpiRequest)) {
+        return super.equals(obj);
+      }
+      monitoring.Monitoring.MonitorKpiRequest other = (monitoring.Monitoring.MonitorKpiRequest) obj;
+
+      if (hasKpiId() != other.hasKpiId()) return false;
+      if (hasKpiId()) {
+        if (!getKpiId()
+            .equals(other.getKpiId())) return false;
+      }
+      if (java.lang.Float.floatToIntBits(getSamplingDurationS())
+          != java.lang.Float.floatToIntBits(
+              other.getSamplingDurationS())) return false;
+      if (java.lang.Float.floatToIntBits(getSamplingIntervalS())
+          != java.lang.Float.floatToIntBits(
+              other.getSamplingIntervalS())) return false;
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (hasKpiId()) {
+        hash = (37 * hash) + KPI_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getKpiId().hashCode();
+      }
+      hash = (37 * hash) + SAMPLING_DURATION_S_FIELD_NUMBER;
+      hash = (53 * hash) + java.lang.Float.floatToIntBits(
+          getSamplingDurationS());
+      hash = (37 * hash) + SAMPLING_INTERVAL_S_FIELD_NUMBER;
+      hash = (53 * hash) + java.lang.Float.floatToIntBits(
+          getSamplingIntervalS());
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static monitoring.Monitoring.MonitorKpiRequest parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.MonitorKpiRequest parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.MonitorKpiRequest parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.MonitorKpiRequest parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.MonitorKpiRequest parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.MonitorKpiRequest parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.MonitorKpiRequest parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.MonitorKpiRequest parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.MonitorKpiRequest parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.MonitorKpiRequest parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.MonitorKpiRequest parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.MonitorKpiRequest parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(monitoring.Monitoring.MonitorKpiRequest prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code monitoring.MonitorKpiRequest}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:monitoring.MonitorKpiRequest)
+        monitoring.Monitoring.MonitorKpiRequestOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return monitoring.Monitoring.internal_static_monitoring_MonitorKpiRequest_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return monitoring.Monitoring.internal_static_monitoring_MonitorKpiRequest_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                monitoring.Monitoring.MonitorKpiRequest.class, monitoring.Monitoring.MonitorKpiRequest.Builder.class);
+      }
+
+      // Construct using monitoring.Monitoring.MonitorKpiRequest.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (kpiIdBuilder_ == null) {
+          kpiId_ = null;
+        } else {
+          kpiId_ = null;
+          kpiIdBuilder_ = null;
+        }
+        samplingDurationS_ = 0F;
+
+        samplingIntervalS_ = 0F;
+
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return monitoring.Monitoring.internal_static_monitoring_MonitorKpiRequest_descriptor;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.MonitorKpiRequest getDefaultInstanceForType() {
+        return monitoring.Monitoring.MonitorKpiRequest.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.MonitorKpiRequest build() {
+        monitoring.Monitoring.MonitorKpiRequest result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.MonitorKpiRequest buildPartial() {
+        monitoring.Monitoring.MonitorKpiRequest result = new monitoring.Monitoring.MonitorKpiRequest(this);
+        if (kpiIdBuilder_ == null) {
+          result.kpiId_ = kpiId_;
+        } else {
+          result.kpiId_ = kpiIdBuilder_.build();
+        }
+        result.samplingDurationS_ = samplingDurationS_;
+        result.samplingIntervalS_ = samplingIntervalS_;
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof monitoring.Monitoring.MonitorKpiRequest) {
+          return mergeFrom((monitoring.Monitoring.MonitorKpiRequest)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(monitoring.Monitoring.MonitorKpiRequest other) {
+        if (other == monitoring.Monitoring.MonitorKpiRequest.getDefaultInstance()) return this;
+        if (other.hasKpiId()) {
+          mergeKpiId(other.getKpiId());
+        }
+        if (other.getSamplingDurationS() != 0F) {
+          setSamplingDurationS(other.getSamplingDurationS());
+        }
+        if (other.getSamplingIntervalS() != 0F) {
+          setSamplingIntervalS(other.getSamplingIntervalS());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        monitoring.Monitoring.MonitorKpiRequest parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (monitoring.Monitoring.MonitorKpiRequest) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+
+      private monitoring.Monitoring.KpiId kpiId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder> kpiIdBuilder_;
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       * @return Whether the kpiId field is set.
+       */
+      public boolean hasKpiId() {
+        return kpiIdBuilder_ != null || kpiId_ != null;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       * @return The kpiId.
+       */
+      public monitoring.Monitoring.KpiId getKpiId() {
+        if (kpiIdBuilder_ == null) {
+          return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+        } else {
+          return kpiIdBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public Builder setKpiId(monitoring.Monitoring.KpiId value) {
+        if (kpiIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          kpiId_ = value;
+          onChanged();
+        } else {
+          kpiIdBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public Builder setKpiId(
+          monitoring.Monitoring.KpiId.Builder builderForValue) {
+        if (kpiIdBuilder_ == null) {
+          kpiId_ = builderForValue.build();
+          onChanged();
+        } else {
+          kpiIdBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public Builder mergeKpiId(monitoring.Monitoring.KpiId value) {
+        if (kpiIdBuilder_ == null) {
+          if (kpiId_ != null) {
+            kpiId_ =
+              monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial();
+          } else {
+            kpiId_ = value;
+          }
+          onChanged();
+        } else {
+          kpiIdBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public Builder clearKpiId() {
+        if (kpiIdBuilder_ == null) {
+          kpiId_ = null;
+          onChanged();
+        } else {
+          kpiId_ = null;
+          kpiIdBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() {
+        
+        onChanged();
+        return getKpiIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
+        if (kpiIdBuilder_ != null) {
+          return kpiIdBuilder_.getMessageOrBuilder();
+        } else {
+          return kpiId_ == null ?
+              monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+        }
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder> 
+          getKpiIdFieldBuilder() {
+        if (kpiIdBuilder_ == null) {
+          kpiIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder>(
+                  getKpiId(),
+                  getParentForChildren(),
+                  isClean());
+          kpiId_ = null;
+        }
+        return kpiIdBuilder_;
+      }
+
+      private float samplingDurationS_ ;
+      /**
+       * <code>float sampling_duration_s = 2;</code>
+       * @return The samplingDurationS.
+       */
+      @java.lang.Override
+      public float getSamplingDurationS() {
+        return samplingDurationS_;
+      }
+      /**
+       * <code>float sampling_duration_s = 2;</code>
+       * @param value The samplingDurationS to set.
+       * @return This builder for chaining.
+       */
+      public Builder setSamplingDurationS(float value) {
+        
+        samplingDurationS_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>float sampling_duration_s = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearSamplingDurationS() {
+        
+        samplingDurationS_ = 0F;
+        onChanged();
+        return this;
+      }
+
+      private float samplingIntervalS_ ;
+      /**
+       * <code>float sampling_interval_s = 3;</code>
+       * @return The samplingIntervalS.
+       */
+      @java.lang.Override
+      public float getSamplingIntervalS() {
+        return samplingIntervalS_;
+      }
+      /**
+       * <code>float sampling_interval_s = 3;</code>
+       * @param value The samplingIntervalS to set.
+       * @return This builder for chaining.
+       */
+      public Builder setSamplingIntervalS(float value) {
+        
+        samplingIntervalS_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>float sampling_interval_s = 3;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearSamplingIntervalS() {
+        
+        samplingIntervalS_ = 0F;
+        onChanged();
+        return this;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:monitoring.MonitorKpiRequest)
+    }
+
+    // @@protoc_insertion_point(class_scope:monitoring.MonitorKpiRequest)
+    private static final monitoring.Monitoring.MonitorKpiRequest DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new monitoring.Monitoring.MonitorKpiRequest();
+    }
+
+    public static monitoring.Monitoring.MonitorKpiRequest getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<MonitorKpiRequest>
+        PARSER = new com.google.protobuf.AbstractParser<MonitorKpiRequest>() {
+      @java.lang.Override
+      public MonitorKpiRequest parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new MonitorKpiRequest(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<MonitorKpiRequest> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<MonitorKpiRequest> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public monitoring.Monitoring.MonitorKpiRequest getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface KpiIdOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:monitoring.KpiId)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>.context.Uuid kpi_id = 1;</code>
+     * @return Whether the kpiId field is set.
+     */
+    boolean hasKpiId();
+    /**
+     * <code>.context.Uuid kpi_id = 1;</code>
+     * @return The kpiId.
+     */
+    context.ContextOuterClass.Uuid getKpiId();
+    /**
+     * <code>.context.Uuid kpi_id = 1;</code>
+     */
+    context.ContextOuterClass.UuidOrBuilder getKpiIdOrBuilder();
+  }
+  /**
+   * Protobuf type {@code monitoring.KpiId}
+   */
+  public static final class KpiId extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:monitoring.KpiId)
+      KpiIdOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use KpiId.newBuilder() to construct.
+    private KpiId(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private KpiId() {
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new KpiId();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private KpiId(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              context.ContextOuterClass.Uuid.Builder subBuilder = null;
+              if (kpiId_ != null) {
+                subBuilder = kpiId_.toBuilder();
+              }
+              kpiId_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(kpiId_);
+                kpiId_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return monitoring.Monitoring.internal_static_monitoring_KpiId_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return monitoring.Monitoring.internal_static_monitoring_KpiId_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              monitoring.Monitoring.KpiId.class, monitoring.Monitoring.KpiId.Builder.class);
+    }
+
+    public static final int KPI_ID_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.Uuid kpiId_;
+    /**
+     * <code>.context.Uuid kpi_id = 1;</code>
+     * @return Whether the kpiId field is set.
+     */
+    @java.lang.Override
+    public boolean hasKpiId() {
+      return kpiId_ != null;
+    }
+    /**
+     * <code>.context.Uuid kpi_id = 1;</code>
+     * @return The kpiId.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.Uuid getKpiId() {
+      return kpiId_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : kpiId_;
+    }
+    /**
+     * <code>.context.Uuid kpi_id = 1;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.UuidOrBuilder getKpiIdOrBuilder() {
+      return getKpiId();
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (kpiId_ != null) {
+        output.writeMessage(1, getKpiId());
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (kpiId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, getKpiId());
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof monitoring.Monitoring.KpiId)) {
+        return super.equals(obj);
+      }
+      monitoring.Monitoring.KpiId other = (monitoring.Monitoring.KpiId) obj;
+
+      if (hasKpiId() != other.hasKpiId()) return false;
+      if (hasKpiId()) {
+        if (!getKpiId()
+            .equals(other.getKpiId())) return false;
+      }
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (hasKpiId()) {
+        hash = (37 * hash) + KPI_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getKpiId().hashCode();
+      }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static monitoring.Monitoring.KpiId parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.KpiId parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiId parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.KpiId parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiId parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.KpiId parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiId parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.KpiId parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiId parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.KpiId parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiId parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.KpiId parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(monitoring.Monitoring.KpiId prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code monitoring.KpiId}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:monitoring.KpiId)
+        monitoring.Monitoring.KpiIdOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return monitoring.Monitoring.internal_static_monitoring_KpiId_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return monitoring.Monitoring.internal_static_monitoring_KpiId_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                monitoring.Monitoring.KpiId.class, monitoring.Monitoring.KpiId.Builder.class);
+      }
+
+      // Construct using monitoring.Monitoring.KpiId.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (kpiIdBuilder_ == null) {
+          kpiId_ = null;
+        } else {
+          kpiId_ = null;
+          kpiIdBuilder_ = null;
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return monitoring.Monitoring.internal_static_monitoring_KpiId_descriptor;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.KpiId getDefaultInstanceForType() {
+        return monitoring.Monitoring.KpiId.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.KpiId build() {
+        monitoring.Monitoring.KpiId result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.KpiId buildPartial() {
+        monitoring.Monitoring.KpiId result = new monitoring.Monitoring.KpiId(this);
+        if (kpiIdBuilder_ == null) {
+          result.kpiId_ = kpiId_;
+        } else {
+          result.kpiId_ = kpiIdBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof monitoring.Monitoring.KpiId) {
+          return mergeFrom((monitoring.Monitoring.KpiId)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(monitoring.Monitoring.KpiId other) {
+        if (other == monitoring.Monitoring.KpiId.getDefaultInstance()) return this;
+        if (other.hasKpiId()) {
+          mergeKpiId(other.getKpiId());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        monitoring.Monitoring.KpiId parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (monitoring.Monitoring.KpiId) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+
+      private context.ContextOuterClass.Uuid kpiId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> kpiIdBuilder_;
+      /**
+       * <code>.context.Uuid kpi_id = 1;</code>
+       * @return Whether the kpiId field is set.
+       */
+      public boolean hasKpiId() {
+        return kpiIdBuilder_ != null || kpiId_ != null;
+      }
+      /**
+       * <code>.context.Uuid kpi_id = 1;</code>
+       * @return The kpiId.
+       */
+      public context.ContextOuterClass.Uuid getKpiId() {
+        if (kpiIdBuilder_ == null) {
+          return kpiId_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : kpiId_;
+        } else {
+          return kpiIdBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.context.Uuid kpi_id = 1;</code>
+       */
+      public Builder setKpiId(context.ContextOuterClass.Uuid value) {
+        if (kpiIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          kpiId_ = value;
+          onChanged();
+        } else {
+          kpiIdBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.Uuid kpi_id = 1;</code>
+       */
+      public Builder setKpiId(
+          context.ContextOuterClass.Uuid.Builder builderForValue) {
+        if (kpiIdBuilder_ == null) {
+          kpiId_ = builderForValue.build();
+          onChanged();
+        } else {
+          kpiIdBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.Uuid kpi_id = 1;</code>
+       */
+      public Builder mergeKpiId(context.ContextOuterClass.Uuid value) {
+        if (kpiIdBuilder_ == null) {
+          if (kpiId_ != null) {
+            kpiId_ =
+              context.ContextOuterClass.Uuid.newBuilder(kpiId_).mergeFrom(value).buildPartial();
+          } else {
+            kpiId_ = value;
+          }
+          onChanged();
+        } else {
+          kpiIdBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.Uuid kpi_id = 1;</code>
+       */
+      public Builder clearKpiId() {
+        if (kpiIdBuilder_ == null) {
+          kpiId_ = null;
+          onChanged();
+        } else {
+          kpiId_ = null;
+          kpiIdBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.Uuid kpi_id = 1;</code>
+       */
+      public context.ContextOuterClass.Uuid.Builder getKpiIdBuilder() {
+        
+        onChanged();
+        return getKpiIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.Uuid kpi_id = 1;</code>
+       */
+      public context.ContextOuterClass.UuidOrBuilder getKpiIdOrBuilder() {
+        if (kpiIdBuilder_ != null) {
+          return kpiIdBuilder_.getMessageOrBuilder();
+        } else {
+          return kpiId_ == null ?
+              context.ContextOuterClass.Uuid.getDefaultInstance() : kpiId_;
+        }
+      }
+      /**
+       * <code>.context.Uuid kpi_id = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> 
+          getKpiIdFieldBuilder() {
+        if (kpiIdBuilder_ == null) {
+          kpiIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder>(
+                  getKpiId(),
+                  getParentForChildren(),
+                  isClean());
+          kpiId_ = null;
+        }
+        return kpiIdBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:monitoring.KpiId)
+    }
+
+    // @@protoc_insertion_point(class_scope:monitoring.KpiId)
+    private static final monitoring.Monitoring.KpiId DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new monitoring.Monitoring.KpiId();
+    }
+
+    public static monitoring.Monitoring.KpiId getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<KpiId>
+        PARSER = new com.google.protobuf.AbstractParser<KpiId>() {
+      @java.lang.Override
+      public KpiId parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new KpiId(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<KpiId> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<KpiId> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public monitoring.Monitoring.KpiId getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface KpiOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:monitoring.Kpi)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     * @return Whether the kpiId field is set.
+     */
+    boolean hasKpiId();
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     * @return The kpiId.
+     */
+    monitoring.Monitoring.KpiId getKpiId();
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     */
+    monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder();
+
+    /**
+     * <code>string timestamp = 2;</code>
+     * @return The timestamp.
+     */
+    java.lang.String getTimestamp();
+    /**
+     * <code>string timestamp = 2;</code>
+     * @return The bytes for timestamp.
+     */
+    com.google.protobuf.ByteString
+        getTimestampBytes();
+
+    /**
+     * <code>.monitoring.KpiValue kpi_value = 4;</code>
+     * @return Whether the kpiValue field is set.
+     */
+    boolean hasKpiValue();
+    /**
+     * <code>.monitoring.KpiValue kpi_value = 4;</code>
+     * @return The kpiValue.
+     */
+    monitoring.Monitoring.KpiValue getKpiValue();
+    /**
+     * <code>.monitoring.KpiValue kpi_value = 4;</code>
+     */
+    monitoring.Monitoring.KpiValueOrBuilder getKpiValueOrBuilder();
+  }
+  /**
+   * Protobuf type {@code monitoring.Kpi}
+   */
+  public static final class Kpi extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:monitoring.Kpi)
+      KpiOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use Kpi.newBuilder() to construct.
+    private Kpi(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private Kpi() {
+      timestamp_ = "";
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new Kpi();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private Kpi(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              monitoring.Monitoring.KpiId.Builder subBuilder = null;
+              if (kpiId_ != null) {
+                subBuilder = kpiId_.toBuilder();
+              }
+              kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(kpiId_);
+                kpiId_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 18: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              timestamp_ = s;
+              break;
+            }
+            case 34: {
+              monitoring.Monitoring.KpiValue.Builder subBuilder = null;
+              if (kpiValue_ != null) {
+                subBuilder = kpiValue_.toBuilder();
+              }
+              kpiValue_ = input.readMessage(monitoring.Monitoring.KpiValue.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(kpiValue_);
+                kpiValue_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return monitoring.Monitoring.internal_static_monitoring_Kpi_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return monitoring.Monitoring.internal_static_monitoring_Kpi_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              monitoring.Monitoring.Kpi.class, monitoring.Monitoring.Kpi.Builder.class);
+    }
+
+    public static final int KPI_ID_FIELD_NUMBER = 1;
+    private monitoring.Monitoring.KpiId kpiId_;
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     * @return Whether the kpiId field is set.
+     */
+    @java.lang.Override
+    public boolean hasKpiId() {
+      return kpiId_ != null;
+    }
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     * @return The kpiId.
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.KpiId getKpiId() {
+      return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+    }
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
+      return getKpiId();
+    }
+
+    public static final int TIMESTAMP_FIELD_NUMBER = 2;
+    private volatile java.lang.Object timestamp_;
+    /**
+     * <code>string timestamp = 2;</code>
+     * @return The timestamp.
+     */
+    @java.lang.Override
+    public java.lang.String getTimestamp() {
+      java.lang.Object ref = timestamp_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        timestamp_ = s;
+        return s;
+      }
+    }
+    /**
+     * <code>string timestamp = 2;</code>
+     * @return The bytes for timestamp.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString
+        getTimestampBytes() {
+      java.lang.Object ref = timestamp_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        timestamp_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int KPI_VALUE_FIELD_NUMBER = 4;
+    private monitoring.Monitoring.KpiValue kpiValue_;
+    /**
+     * <code>.monitoring.KpiValue kpi_value = 4;</code>
+     * @return Whether the kpiValue field is set.
+     */
+    @java.lang.Override
+    public boolean hasKpiValue() {
+      return kpiValue_ != null;
+    }
+    /**
+     * <code>.monitoring.KpiValue kpi_value = 4;</code>
+     * @return The kpiValue.
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.KpiValue getKpiValue() {
+      return kpiValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_;
+    }
+    /**
+     * <code>.monitoring.KpiValue kpi_value = 4;</code>
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.KpiValueOrBuilder getKpiValueOrBuilder() {
+      return getKpiValue();
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (kpiId_ != null) {
+        output.writeMessage(1, getKpiId());
+      }
+      if (!getTimestampBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, timestamp_);
+      }
+      if (kpiValue_ != null) {
+        output.writeMessage(4, getKpiValue());
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (kpiId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, getKpiId());
+      }
+      if (!getTimestampBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, timestamp_);
+      }
+      if (kpiValue_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, getKpiValue());
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof monitoring.Monitoring.Kpi)) {
+        return super.equals(obj);
+      }
+      monitoring.Monitoring.Kpi other = (monitoring.Monitoring.Kpi) obj;
+
+      if (hasKpiId() != other.hasKpiId()) return false;
+      if (hasKpiId()) {
+        if (!getKpiId()
+            .equals(other.getKpiId())) return false;
+      }
+      if (!getTimestamp()
+          .equals(other.getTimestamp())) return false;
+      if (hasKpiValue() != other.hasKpiValue()) return false;
+      if (hasKpiValue()) {
+        if (!getKpiValue()
+            .equals(other.getKpiValue())) return false;
+      }
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (hasKpiId()) {
+        hash = (37 * hash) + KPI_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getKpiId().hashCode();
+      }
+      hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
+      hash = (53 * hash) + getTimestamp().hashCode();
+      if (hasKpiValue()) {
+        hash = (37 * hash) + KPI_VALUE_FIELD_NUMBER;
+        hash = (53 * hash) + getKpiValue().hashCode();
+      }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static monitoring.Monitoring.Kpi parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.Kpi parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.Kpi parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.Kpi parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.Kpi parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.Kpi parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.Kpi parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.Kpi parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.Kpi parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.Kpi parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.Kpi parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.Kpi parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(monitoring.Monitoring.Kpi prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code monitoring.Kpi}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:monitoring.Kpi)
+        monitoring.Monitoring.KpiOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return monitoring.Monitoring.internal_static_monitoring_Kpi_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return monitoring.Monitoring.internal_static_monitoring_Kpi_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                monitoring.Monitoring.Kpi.class, monitoring.Monitoring.Kpi.Builder.class);
+      }
+
+      // Construct using monitoring.Monitoring.Kpi.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (kpiIdBuilder_ == null) {
+          kpiId_ = null;
+        } else {
+          kpiId_ = null;
+          kpiIdBuilder_ = null;
+        }
+        timestamp_ = "";
+
+        if (kpiValueBuilder_ == null) {
+          kpiValue_ = null;
+        } else {
+          kpiValue_ = null;
+          kpiValueBuilder_ = null;
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return monitoring.Monitoring.internal_static_monitoring_Kpi_descriptor;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.Kpi getDefaultInstanceForType() {
+        return monitoring.Monitoring.Kpi.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.Kpi build() {
+        monitoring.Monitoring.Kpi result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.Kpi buildPartial() {
+        monitoring.Monitoring.Kpi result = new monitoring.Monitoring.Kpi(this);
+        if (kpiIdBuilder_ == null) {
+          result.kpiId_ = kpiId_;
+        } else {
+          result.kpiId_ = kpiIdBuilder_.build();
+        }
+        result.timestamp_ = timestamp_;
+        if (kpiValueBuilder_ == null) {
+          result.kpiValue_ = kpiValue_;
+        } else {
+          result.kpiValue_ = kpiValueBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof monitoring.Monitoring.Kpi) {
+          return mergeFrom((monitoring.Monitoring.Kpi)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(monitoring.Monitoring.Kpi other) {
+        if (other == monitoring.Monitoring.Kpi.getDefaultInstance()) return this;
+        if (other.hasKpiId()) {
+          mergeKpiId(other.getKpiId());
+        }
+        if (!other.getTimestamp().isEmpty()) {
+          timestamp_ = other.timestamp_;
+          onChanged();
+        }
+        if (other.hasKpiValue()) {
+          mergeKpiValue(other.getKpiValue());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        monitoring.Monitoring.Kpi parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (monitoring.Monitoring.Kpi) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+
+      private monitoring.Monitoring.KpiId kpiId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder> kpiIdBuilder_;
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       * @return Whether the kpiId field is set.
+       */
+      public boolean hasKpiId() {
+        return kpiIdBuilder_ != null || kpiId_ != null;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       * @return The kpiId.
+       */
+      public monitoring.Monitoring.KpiId getKpiId() {
+        if (kpiIdBuilder_ == null) {
+          return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+        } else {
+          return kpiIdBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public Builder setKpiId(monitoring.Monitoring.KpiId value) {
+        if (kpiIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          kpiId_ = value;
+          onChanged();
+        } else {
+          kpiIdBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public Builder setKpiId(
+          monitoring.Monitoring.KpiId.Builder builderForValue) {
+        if (kpiIdBuilder_ == null) {
+          kpiId_ = builderForValue.build();
+          onChanged();
+        } else {
+          kpiIdBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public Builder mergeKpiId(monitoring.Monitoring.KpiId value) {
+        if (kpiIdBuilder_ == null) {
+          if (kpiId_ != null) {
+            kpiId_ =
+              monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial();
+          } else {
+            kpiId_ = value;
+          }
+          onChanged();
+        } else {
+          kpiIdBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public Builder clearKpiId() {
+        if (kpiIdBuilder_ == null) {
+          kpiId_ = null;
+          onChanged();
+        } else {
+          kpiId_ = null;
+          kpiIdBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() {
+        
+        onChanged();
+        return getKpiIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
+        if (kpiIdBuilder_ != null) {
+          return kpiIdBuilder_.getMessageOrBuilder();
+        } else {
+          return kpiId_ == null ?
+              monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+        }
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder> 
+          getKpiIdFieldBuilder() {
+        if (kpiIdBuilder_ == null) {
+          kpiIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder>(
+                  getKpiId(),
+                  getParentForChildren(),
+                  isClean());
+          kpiId_ = null;
+        }
+        return kpiIdBuilder_;
+      }
+
+      private java.lang.Object timestamp_ = "";
+      /**
+       * <code>string timestamp = 2;</code>
+       * @return The timestamp.
+       */
+      public java.lang.String getTimestamp() {
+        java.lang.Object ref = timestamp_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          timestamp_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>string timestamp = 2;</code>
+       * @return The bytes for timestamp.
+       */
+      public com.google.protobuf.ByteString
+          getTimestampBytes() {
+        java.lang.Object ref = timestamp_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          timestamp_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>string timestamp = 2;</code>
+       * @param value The timestamp to set.
+       * @return This builder for chaining.
+       */
+      public Builder setTimestamp(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        timestamp_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string timestamp = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearTimestamp() {
+        
+        timestamp_ = getDefaultInstance().getTimestamp();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string timestamp = 2;</code>
+       * @param value The bytes for timestamp to set.
+       * @return This builder for chaining.
+       */
+      public Builder setTimestampBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        timestamp_ = value;
+        onChanged();
+        return this;
+      }
+
+      private monitoring.Monitoring.KpiValue kpiValue_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          monitoring.Monitoring.KpiValue, monitoring.Monitoring.KpiValue.Builder, monitoring.Monitoring.KpiValueOrBuilder> kpiValueBuilder_;
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 4;</code>
+       * @return Whether the kpiValue field is set.
+       */
+      public boolean hasKpiValue() {
+        return kpiValueBuilder_ != null || kpiValue_ != null;
+      }
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 4;</code>
+       * @return The kpiValue.
+       */
+      public monitoring.Monitoring.KpiValue getKpiValue() {
+        if (kpiValueBuilder_ == null) {
+          return kpiValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_;
+        } else {
+          return kpiValueBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 4;</code>
+       */
+      public Builder setKpiValue(monitoring.Monitoring.KpiValue value) {
+        if (kpiValueBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          kpiValue_ = value;
+          onChanged();
+        } else {
+          kpiValueBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 4;</code>
+       */
+      public Builder setKpiValue(
+          monitoring.Monitoring.KpiValue.Builder builderForValue) {
+        if (kpiValueBuilder_ == null) {
+          kpiValue_ = builderForValue.build();
+          onChanged();
+        } else {
+          kpiValueBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 4;</code>
+       */
+      public Builder mergeKpiValue(monitoring.Monitoring.KpiValue value) {
+        if (kpiValueBuilder_ == null) {
+          if (kpiValue_ != null) {
+            kpiValue_ =
+              monitoring.Monitoring.KpiValue.newBuilder(kpiValue_).mergeFrom(value).buildPartial();
+          } else {
+            kpiValue_ = value;
+          }
+          onChanged();
+        } else {
+          kpiValueBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 4;</code>
+       */
+      public Builder clearKpiValue() {
+        if (kpiValueBuilder_ == null) {
+          kpiValue_ = null;
+          onChanged();
+        } else {
+          kpiValue_ = null;
+          kpiValueBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 4;</code>
+       */
+      public monitoring.Monitoring.KpiValue.Builder getKpiValueBuilder() {
+        
+        onChanged();
+        return getKpiValueFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 4;</code>
+       */
+      public monitoring.Monitoring.KpiValueOrBuilder getKpiValueOrBuilder() {
+        if (kpiValueBuilder_ != null) {
+          return kpiValueBuilder_.getMessageOrBuilder();
+        } else {
+          return kpiValue_ == null ?
+              monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_;
+        }
+      }
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 4;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          monitoring.Monitoring.KpiValue, monitoring.Monitoring.KpiValue.Builder, monitoring.Monitoring.KpiValueOrBuilder> 
+          getKpiValueFieldBuilder() {
+        if (kpiValueBuilder_ == null) {
+          kpiValueBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              monitoring.Monitoring.KpiValue, monitoring.Monitoring.KpiValue.Builder, monitoring.Monitoring.KpiValueOrBuilder>(
+                  getKpiValue(),
+                  getParentForChildren(),
+                  isClean());
+          kpiValue_ = null;
+        }
+        return kpiValueBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:monitoring.Kpi)
+    }
+
+    // @@protoc_insertion_point(class_scope:monitoring.Kpi)
+    private static final monitoring.Monitoring.Kpi DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new monitoring.Monitoring.Kpi();
+    }
+
+    public static monitoring.Monitoring.Kpi getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Kpi>
+        PARSER = new com.google.protobuf.AbstractParser<Kpi>() {
+      @java.lang.Override
+      public Kpi parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new Kpi(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<Kpi> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Kpi> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public monitoring.Monitoring.Kpi getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface KpiValueOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:monitoring.KpiValue)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>uint32 intVal = 1;</code>
+     * @return Whether the intVal field is set.
+     */
+    boolean hasIntVal();
+    /**
+     * <code>uint32 intVal = 1;</code>
+     * @return The intVal.
+     */
+    int getIntVal();
+
+    /**
+     * <code>float floatVal = 2;</code>
+     * @return Whether the floatVal field is set.
+     */
+    boolean hasFloatVal();
+    /**
+     * <code>float floatVal = 2;</code>
+     * @return The floatVal.
+     */
+    float getFloatVal();
+
+    /**
+     * <code>string stringVal = 3;</code>
+     * @return Whether the stringVal field is set.
+     */
+    boolean hasStringVal();
+    /**
+     * <code>string stringVal = 3;</code>
+     * @return The stringVal.
+     */
+    java.lang.String getStringVal();
+    /**
+     * <code>string stringVal = 3;</code>
+     * @return The bytes for stringVal.
+     */
+    com.google.protobuf.ByteString
+        getStringValBytes();
+
+    /**
+     * <code>bool boolVal = 4;</code>
+     * @return Whether the boolVal field is set.
+     */
+    boolean hasBoolVal();
+    /**
+     * <code>bool boolVal = 4;</code>
+     * @return The boolVal.
+     */
+    boolean getBoolVal();
+
+    public monitoring.Monitoring.KpiValue.ValueCase getValueCase();
+  }
+  /**
+   * Protobuf type {@code monitoring.KpiValue}
+   */
+  public static final class KpiValue extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:monitoring.KpiValue)
+      KpiValueOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use KpiValue.newBuilder() to construct.
+    private KpiValue(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private KpiValue() {
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new KpiValue();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private KpiValue(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 8: {
+              valueCase_ = 1;
+              value_ = input.readUInt32();
+              break;
+            }
+            case 21: {
+              valueCase_ = 2;
+              value_ = input.readFloat();
+              break;
+            }
+            case 26: {
+              java.lang.String s = input.readStringRequireUtf8();
+              valueCase_ = 3;
+              value_ = s;
+              break;
+            }
+            case 32: {
+              valueCase_ = 4;
+              value_ = input.readBool();
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return monitoring.Monitoring.internal_static_monitoring_KpiValue_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return monitoring.Monitoring.internal_static_monitoring_KpiValue_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              monitoring.Monitoring.KpiValue.class, monitoring.Monitoring.KpiValue.Builder.class);
+    }
+
+    private int valueCase_ = 0;
+    private java.lang.Object value_;
+    public enum ValueCase
+        implements com.google.protobuf.Internal.EnumLite,
+            com.google.protobuf.AbstractMessage.InternalOneOfEnum {
+      INTVAL(1),
+      FLOATVAL(2),
+      STRINGVAL(3),
+      BOOLVAL(4),
+      VALUE_NOT_SET(0);
+      private final int value;
+      private ValueCase(int value) {
+        this.value = value;
+      }
+      /**
+       * @param value The number of the enum to look for.
+       * @return The enum associated with the given number.
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
+      public static ValueCase valueOf(int value) {
+        return forNumber(value);
+      }
+
+      public static ValueCase forNumber(int value) {
+        switch (value) {
+          case 1: return INTVAL;
+          case 2: return FLOATVAL;
+          case 3: return STRINGVAL;
+          case 4: return BOOLVAL;
+          case 0: return VALUE_NOT_SET;
+          default: return null;
+        }
+      }
+      public int getNumber() {
+        return this.value;
+      }
+    };
+
+    public ValueCase
+    getValueCase() {
+      return ValueCase.forNumber(
+          valueCase_);
+    }
+
+    public static final int INTVAL_FIELD_NUMBER = 1;
+    /**
+     * <code>uint32 intVal = 1;</code>
+     * @return Whether the intVal field is set.
+     */
+    @java.lang.Override
+    public boolean hasIntVal() {
+      return valueCase_ == 1;
+    }
+    /**
+     * <code>uint32 intVal = 1;</code>
+     * @return The intVal.
+     */
+    @java.lang.Override
+    public int getIntVal() {
+      if (valueCase_ == 1) {
+        return (java.lang.Integer) value_;
+      }
+      return 0;
+    }
+
+    public static final int FLOATVAL_FIELD_NUMBER = 2;
+    /**
+     * <code>float floatVal = 2;</code>
+     * @return Whether the floatVal field is set.
+     */
+    @java.lang.Override
+    public boolean hasFloatVal() {
+      return valueCase_ == 2;
+    }
+    /**
+     * <code>float floatVal = 2;</code>
+     * @return The floatVal.
+     */
+    @java.lang.Override
+    public float getFloatVal() {
+      if (valueCase_ == 2) {
+        return (java.lang.Float) value_;
+      }
+      return 0F;
+    }
+
+    public static final int STRINGVAL_FIELD_NUMBER = 3;
+    /**
+     * <code>string stringVal = 3;</code>
+     * @return Whether the stringVal field is set.
+     */
+    public boolean hasStringVal() {
+      return valueCase_ == 3;
+    }
+    /**
+     * <code>string stringVal = 3;</code>
+     * @return The stringVal.
+     */
+    public java.lang.String getStringVal() {
+      java.lang.Object ref = "";
+      if (valueCase_ == 3) {
+        ref = value_;
+      }
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (valueCase_ == 3) {
+          value_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>string stringVal = 3;</code>
+     * @return The bytes for stringVal.
+     */
+    public com.google.protobuf.ByteString
+        getStringValBytes() {
+      java.lang.Object ref = "";
+      if (valueCase_ == 3) {
+        ref = value_;
+      }
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        if (valueCase_ == 3) {
+          value_ = b;
+        }
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int BOOLVAL_FIELD_NUMBER = 4;
+    /**
+     * <code>bool boolVal = 4;</code>
+     * @return Whether the boolVal field is set.
+     */
+    @java.lang.Override
+    public boolean hasBoolVal() {
+      return valueCase_ == 4;
+    }
+    /**
+     * <code>bool boolVal = 4;</code>
+     * @return The boolVal.
+     */
+    @java.lang.Override
+    public boolean getBoolVal() {
+      if (valueCase_ == 4) {
+        return (java.lang.Boolean) value_;
+      }
+      return false;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (valueCase_ == 1) {
+        output.writeUInt32(
+            1, (int)((java.lang.Integer) value_));
+      }
+      if (valueCase_ == 2) {
+        output.writeFloat(
+            2, (float)((java.lang.Float) value_));
+      }
+      if (valueCase_ == 3) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 3, value_);
+      }
+      if (valueCase_ == 4) {
+        output.writeBool(
+            4, (boolean)((java.lang.Boolean) value_));
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (valueCase_ == 1) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(
+              1, (int)((java.lang.Integer) value_));
+      }
+      if (valueCase_ == 2) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeFloatSize(
+              2, (float)((java.lang.Float) value_));
+      }
+      if (valueCase_ == 3) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, value_);
+      }
+      if (valueCase_ == 4) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(
+              4, (boolean)((java.lang.Boolean) value_));
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof monitoring.Monitoring.KpiValue)) {
+        return super.equals(obj);
+      }
+      monitoring.Monitoring.KpiValue other = (monitoring.Monitoring.KpiValue) obj;
+
+      if (!getValueCase().equals(other.getValueCase())) return false;
+      switch (valueCase_) {
+        case 1:
+          if (getIntVal()
+              != other.getIntVal()) return false;
+          break;
+        case 2:
+          if (java.lang.Float.floatToIntBits(getFloatVal())
+              != java.lang.Float.floatToIntBits(
+                  other.getFloatVal())) return false;
+          break;
+        case 3:
+          if (!getStringVal()
+              .equals(other.getStringVal())) return false;
+          break;
+        case 4:
+          if (getBoolVal()
+              != other.getBoolVal()) return false;
+          break;
+        case 0:
+        default:
+      }
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      switch (valueCase_) {
+        case 1:
+          hash = (37 * hash) + INTVAL_FIELD_NUMBER;
+          hash = (53 * hash) + getIntVal();
+          break;
+        case 2:
+          hash = (37 * hash) + FLOATVAL_FIELD_NUMBER;
+          hash = (53 * hash) + java.lang.Float.floatToIntBits(
+              getFloatVal());
+          break;
+        case 3:
+          hash = (37 * hash) + STRINGVAL_FIELD_NUMBER;
+          hash = (53 * hash) + getStringVal().hashCode();
+          break;
+        case 4:
+          hash = (37 * hash) + BOOLVAL_FIELD_NUMBER;
+          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+              getBoolVal());
+          break;
+        case 0:
+        default:
+      }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static monitoring.Monitoring.KpiValue parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.KpiValue parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiValue parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.KpiValue parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiValue parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.KpiValue parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiValue parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.KpiValue parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiValue parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.KpiValue parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiValue parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.KpiValue parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(monitoring.Monitoring.KpiValue prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code monitoring.KpiValue}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:monitoring.KpiValue)
+        monitoring.Monitoring.KpiValueOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return monitoring.Monitoring.internal_static_monitoring_KpiValue_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return monitoring.Monitoring.internal_static_monitoring_KpiValue_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                monitoring.Monitoring.KpiValue.class, monitoring.Monitoring.KpiValue.Builder.class);
+      }
+
+      // Construct using monitoring.Monitoring.KpiValue.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        valueCase_ = 0;
+        value_ = null;
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return monitoring.Monitoring.internal_static_monitoring_KpiValue_descriptor;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.KpiValue getDefaultInstanceForType() {
+        return monitoring.Monitoring.KpiValue.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.KpiValue build() {
+        monitoring.Monitoring.KpiValue result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.KpiValue buildPartial() {
+        monitoring.Monitoring.KpiValue result = new monitoring.Monitoring.KpiValue(this);
+        if (valueCase_ == 1) {
+          result.value_ = value_;
+        }
+        if (valueCase_ == 2) {
+          result.value_ = value_;
+        }
+        if (valueCase_ == 3) {
+          result.value_ = value_;
+        }
+        if (valueCase_ == 4) {
+          result.value_ = value_;
+        }
+        result.valueCase_ = valueCase_;
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof monitoring.Monitoring.KpiValue) {
+          return mergeFrom((monitoring.Monitoring.KpiValue)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(monitoring.Monitoring.KpiValue other) {
+        if (other == monitoring.Monitoring.KpiValue.getDefaultInstance()) return this;
+        switch (other.getValueCase()) {
+          case INTVAL: {
+            setIntVal(other.getIntVal());
+            break;
+          }
+          case FLOATVAL: {
+            setFloatVal(other.getFloatVal());
+            break;
+          }
+          case STRINGVAL: {
+            valueCase_ = 3;
+            value_ = other.value_;
+            onChanged();
+            break;
+          }
+          case BOOLVAL: {
+            setBoolVal(other.getBoolVal());
+            break;
+          }
+          case VALUE_NOT_SET: {
+            break;
+          }
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        monitoring.Monitoring.KpiValue parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (monitoring.Monitoring.KpiValue) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int valueCase_ = 0;
+      private java.lang.Object value_;
+      public ValueCase
+          getValueCase() {
+        return ValueCase.forNumber(
+            valueCase_);
+      }
+
+      public Builder clearValue() {
+        valueCase_ = 0;
+        value_ = null;
+        onChanged();
+        return this;
+      }
+
+
+      /**
+       * <code>uint32 intVal = 1;</code>
+       * @return Whether the intVal field is set.
+       */
+      public boolean hasIntVal() {
+        return valueCase_ == 1;
+      }
+      /**
+       * <code>uint32 intVal = 1;</code>
+       * @return The intVal.
+       */
+      public int getIntVal() {
+        if (valueCase_ == 1) {
+          return (java.lang.Integer) value_;
+        }
+        return 0;
+      }
+      /**
+       * <code>uint32 intVal = 1;</code>
+       * @param value The intVal to set.
+       * @return This builder for chaining.
+       */
+      public Builder setIntVal(int value) {
+        valueCase_ = 1;
+        value_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>uint32 intVal = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearIntVal() {
+        if (valueCase_ == 1) {
+          valueCase_ = 0;
+          value_ = null;
+          onChanged();
+        }
+        return this;
+      }
+
+      /**
+       * <code>float floatVal = 2;</code>
+       * @return Whether the floatVal field is set.
+       */
+      public boolean hasFloatVal() {
+        return valueCase_ == 2;
+      }
+      /**
+       * <code>float floatVal = 2;</code>
+       * @return The floatVal.
+       */
+      public float getFloatVal() {
+        if (valueCase_ == 2) {
+          return (java.lang.Float) value_;
+        }
+        return 0F;
+      }
+      /**
+       * <code>float floatVal = 2;</code>
+       * @param value The floatVal to set.
+       * @return This builder for chaining.
+       */
+      public Builder setFloatVal(float value) {
+        valueCase_ = 2;
+        value_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>float floatVal = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearFloatVal() {
+        if (valueCase_ == 2) {
+          valueCase_ = 0;
+          value_ = null;
+          onChanged();
+        }
+        return this;
+      }
+
+      /**
+       * <code>string stringVal = 3;</code>
+       * @return Whether the stringVal field is set.
+       */
+      @java.lang.Override
+      public boolean hasStringVal() {
+        return valueCase_ == 3;
+      }
+      /**
+       * <code>string stringVal = 3;</code>
+       * @return The stringVal.
+       */
+      @java.lang.Override
+      public java.lang.String getStringVal() {
+        java.lang.Object ref = "";
+        if (valueCase_ == 3) {
+          ref = value_;
+        }
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          if (valueCase_ == 3) {
+            value_ = s;
+          }
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>string stringVal = 3;</code>
+       * @return The bytes for stringVal.
+       */
+      @java.lang.Override
+      public com.google.protobuf.ByteString
+          getStringValBytes() {
+        java.lang.Object ref = "";
+        if (valueCase_ == 3) {
+          ref = value_;
+        }
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          if (valueCase_ == 3) {
+            value_ = b;
+          }
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>string stringVal = 3;</code>
+       * @param value The stringVal to set.
+       * @return This builder for chaining.
+       */
+      public Builder setStringVal(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  valueCase_ = 3;
+        value_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string stringVal = 3;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearStringVal() {
+        if (valueCase_ == 3) {
+          valueCase_ = 0;
+          value_ = null;
+          onChanged();
+        }
+        return this;
+      }
+      /**
+       * <code>string stringVal = 3;</code>
+       * @param value The bytes for stringVal to set.
+       * @return This builder for chaining.
+       */
+      public Builder setStringValBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        valueCase_ = 3;
+        value_ = value;
+        onChanged();
+        return this;
+      }
+
+      /**
+       * <code>bool boolVal = 4;</code>
+       * @return Whether the boolVal field is set.
+       */
+      public boolean hasBoolVal() {
+        return valueCase_ == 4;
+      }
+      /**
+       * <code>bool boolVal = 4;</code>
+       * @return The boolVal.
+       */
+      public boolean getBoolVal() {
+        if (valueCase_ == 4) {
+          return (java.lang.Boolean) value_;
+        }
+        return false;
+      }
+      /**
+       * <code>bool boolVal = 4;</code>
+       * @param value The boolVal to set.
+       * @return This builder for chaining.
+       */
+      public Builder setBoolVal(boolean value) {
+        valueCase_ = 4;
+        value_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>bool boolVal = 4;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearBoolVal() {
+        if (valueCase_ == 4) {
+          valueCase_ = 0;
+          value_ = null;
+          onChanged();
+        }
+        return this;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:monitoring.KpiValue)
+    }
+
+    // @@protoc_insertion_point(class_scope:monitoring.KpiValue)
+    private static final monitoring.Monitoring.KpiValue DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new monitoring.Monitoring.KpiValue();
+    }
+
+    public static monitoring.Monitoring.KpiValue getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<KpiValue>
+        PARSER = new com.google.protobuf.AbstractParser<KpiValue>() {
+      @java.lang.Override
+      public KpiValue parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new KpiValue(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<KpiValue> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<KpiValue> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public monitoring.Monitoring.KpiValue getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface KpiListOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:monitoring.KpiList)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     */
+    java.util.List<monitoring.Monitoring.Kpi> 
+        getKpiListList();
+    /**
+     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     */
+    monitoring.Monitoring.Kpi getKpiList(int index);
+    /**
+     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     */
+    int getKpiListCount();
+    /**
+     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     */
+    java.util.List<? extends monitoring.Monitoring.KpiOrBuilder> 
+        getKpiListOrBuilderList();
+    /**
+     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     */
+    monitoring.Monitoring.KpiOrBuilder getKpiListOrBuilder(
+        int index);
+  }
+  /**
+   * Protobuf type {@code monitoring.KpiList}
+   */
+  public static final class KpiList extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:monitoring.KpiList)
+      KpiListOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use KpiList.newBuilder() to construct.
+    private KpiList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private KpiList() {
+      kpiList_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new KpiList();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private KpiList(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                kpiList_ = new java.util.ArrayList<monitoring.Monitoring.Kpi>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              kpiList_.add(
+                  input.readMessage(monitoring.Monitoring.Kpi.parser(), extensionRegistry));
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          kpiList_ = java.util.Collections.unmodifiableList(kpiList_);
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return monitoring.Monitoring.internal_static_monitoring_KpiList_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return monitoring.Monitoring.internal_static_monitoring_KpiList_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              monitoring.Monitoring.KpiList.class, monitoring.Monitoring.KpiList.Builder.class);
+    }
+
+    public static final int KPI_LIST_FIELD_NUMBER = 1;
+    private java.util.List<monitoring.Monitoring.Kpi> kpiList_;
+    /**
+     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<monitoring.Monitoring.Kpi> getKpiListList() {
+      return kpiList_;
+    }
+    /**
+     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends monitoring.Monitoring.KpiOrBuilder> 
+        getKpiListOrBuilderList() {
+      return kpiList_;
+    }
+    /**
+     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     */
+    @java.lang.Override
+    public int getKpiListCount() {
+      return kpiList_.size();
+    }
+    /**
+     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.Kpi getKpiList(int index) {
+      return kpiList_.get(index);
+    }
+    /**
+     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.KpiOrBuilder getKpiListOrBuilder(
+        int index) {
+      return kpiList_.get(index);
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      for (int i = 0; i < kpiList_.size(); i++) {
+        output.writeMessage(1, kpiList_.get(i));
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      for (int i = 0; i < kpiList_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, kpiList_.get(i));
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof monitoring.Monitoring.KpiList)) {
+        return super.equals(obj);
+      }
+      monitoring.Monitoring.KpiList other = (monitoring.Monitoring.KpiList) obj;
+
+      if (!getKpiListList()
+          .equals(other.getKpiListList())) return false;
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (getKpiListCount() > 0) {
+        hash = (37 * hash) + KPI_LIST_FIELD_NUMBER;
+        hash = (53 * hash) + getKpiListList().hashCode();
+      }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static monitoring.Monitoring.KpiList parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.KpiList parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiList parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.KpiList parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiList parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.KpiList parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiList parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.KpiList parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiList parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.KpiList parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.KpiList parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.KpiList parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(monitoring.Monitoring.KpiList prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code monitoring.KpiList}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:monitoring.KpiList)
+        monitoring.Monitoring.KpiListOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return monitoring.Monitoring.internal_static_monitoring_KpiList_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return monitoring.Monitoring.internal_static_monitoring_KpiList_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                monitoring.Monitoring.KpiList.class, monitoring.Monitoring.KpiList.Builder.class);
+      }
+
+      // Construct using monitoring.Monitoring.KpiList.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+          getKpiListFieldBuilder();
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (kpiListBuilder_ == null) {
+          kpiList_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          kpiListBuilder_.clear();
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return monitoring.Monitoring.internal_static_monitoring_KpiList_descriptor;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.KpiList getDefaultInstanceForType() {
+        return monitoring.Monitoring.KpiList.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.KpiList build() {
+        monitoring.Monitoring.KpiList result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.KpiList buildPartial() {
+        monitoring.Monitoring.KpiList result = new monitoring.Monitoring.KpiList(this);
+        int from_bitField0_ = bitField0_;
+        if (kpiListBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            kpiList_ = java.util.Collections.unmodifiableList(kpiList_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.kpiList_ = kpiList_;
+        } else {
+          result.kpiList_ = kpiListBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof monitoring.Monitoring.KpiList) {
+          return mergeFrom((monitoring.Monitoring.KpiList)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(monitoring.Monitoring.KpiList other) {
+        if (other == monitoring.Monitoring.KpiList.getDefaultInstance()) return this;
+        if (kpiListBuilder_ == null) {
+          if (!other.kpiList_.isEmpty()) {
+            if (kpiList_.isEmpty()) {
+              kpiList_ = other.kpiList_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureKpiListIsMutable();
+              kpiList_.addAll(other.kpiList_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.kpiList_.isEmpty()) {
+            if (kpiListBuilder_.isEmpty()) {
+              kpiListBuilder_.dispose();
+              kpiListBuilder_ = null;
+              kpiList_ = other.kpiList_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              kpiListBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getKpiListFieldBuilder() : null;
+            } else {
+              kpiListBuilder_.addAllMessages(other.kpiList_);
+            }
+          }
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        monitoring.Monitoring.KpiList parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (monitoring.Monitoring.KpiList) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      private java.util.List<monitoring.Monitoring.Kpi> kpiList_ =
+        java.util.Collections.emptyList();
+      private void ensureKpiListIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          kpiList_ = new java.util.ArrayList<monitoring.Monitoring.Kpi>(kpiList_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          monitoring.Monitoring.Kpi, monitoring.Monitoring.Kpi.Builder, monitoring.Monitoring.KpiOrBuilder> kpiListBuilder_;
+
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public java.util.List<monitoring.Monitoring.Kpi> getKpiListList() {
+        if (kpiListBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(kpiList_);
+        } else {
+          return kpiListBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public int getKpiListCount() {
+        if (kpiListBuilder_ == null) {
+          return kpiList_.size();
+        } else {
+          return kpiListBuilder_.getCount();
+        }
+      }
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public monitoring.Monitoring.Kpi getKpiList(int index) {
+        if (kpiListBuilder_ == null) {
+          return kpiList_.get(index);
+        } else {
+          return kpiListBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public Builder setKpiList(
+          int index, monitoring.Monitoring.Kpi value) {
+        if (kpiListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureKpiListIsMutable();
+          kpiList_.set(index, value);
+          onChanged();
+        } else {
+          kpiListBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public Builder setKpiList(
+          int index, monitoring.Monitoring.Kpi.Builder builderForValue) {
+        if (kpiListBuilder_ == null) {
+          ensureKpiListIsMutable();
+          kpiList_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          kpiListBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public Builder addKpiList(monitoring.Monitoring.Kpi value) {
+        if (kpiListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureKpiListIsMutable();
+          kpiList_.add(value);
+          onChanged();
+        } else {
+          kpiListBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public Builder addKpiList(
+          int index, monitoring.Monitoring.Kpi value) {
+        if (kpiListBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureKpiListIsMutable();
+          kpiList_.add(index, value);
+          onChanged();
+        } else {
+          kpiListBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public Builder addKpiList(
+          monitoring.Monitoring.Kpi.Builder builderForValue) {
+        if (kpiListBuilder_ == null) {
+          ensureKpiListIsMutable();
+          kpiList_.add(builderForValue.build());
+          onChanged();
+        } else {
+          kpiListBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public Builder addKpiList(
+          int index, monitoring.Monitoring.Kpi.Builder builderForValue) {
+        if (kpiListBuilder_ == null) {
+          ensureKpiListIsMutable();
+          kpiList_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          kpiListBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public Builder addAllKpiList(
+          java.lang.Iterable<? extends monitoring.Monitoring.Kpi> values) {
+        if (kpiListBuilder_ == null) {
+          ensureKpiListIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, kpiList_);
+          onChanged();
+        } else {
+          kpiListBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public Builder clearKpiList() {
+        if (kpiListBuilder_ == null) {
+          kpiList_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          kpiListBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public Builder removeKpiList(int index) {
+        if (kpiListBuilder_ == null) {
+          ensureKpiListIsMutable();
+          kpiList_.remove(index);
+          onChanged();
+        } else {
+          kpiListBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public monitoring.Monitoring.Kpi.Builder getKpiListBuilder(
+          int index) {
+        return getKpiListFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public monitoring.Monitoring.KpiOrBuilder getKpiListOrBuilder(
+          int index) {
+        if (kpiListBuilder_ == null) {
+          return kpiList_.get(index);  } else {
+          return kpiListBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public java.util.List<? extends monitoring.Monitoring.KpiOrBuilder> 
+           getKpiListOrBuilderList() {
+        if (kpiListBuilder_ != null) {
+          return kpiListBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(kpiList_);
+        }
+      }
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public monitoring.Monitoring.Kpi.Builder addKpiListBuilder() {
+        return getKpiListFieldBuilder().addBuilder(
+            monitoring.Monitoring.Kpi.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public monitoring.Monitoring.Kpi.Builder addKpiListBuilder(
+          int index) {
+        return getKpiListFieldBuilder().addBuilder(
+            index, monitoring.Monitoring.Kpi.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       */
+      public java.util.List<monitoring.Monitoring.Kpi.Builder> 
+           getKpiListBuilderList() {
+        return getKpiListFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          monitoring.Monitoring.Kpi, monitoring.Monitoring.Kpi.Builder, monitoring.Monitoring.KpiOrBuilder> 
+          getKpiListFieldBuilder() {
+        if (kpiListBuilder_ == null) {
+          kpiListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              monitoring.Monitoring.Kpi, monitoring.Monitoring.Kpi.Builder, monitoring.Monitoring.KpiOrBuilder>(
+                  kpiList_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          kpiList_ = null;
+        }
+        return kpiListBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:monitoring.KpiList)
+    }
+
+    // @@protoc_insertion_point(class_scope:monitoring.KpiList)
+    private static final monitoring.Monitoring.KpiList DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new monitoring.Monitoring.KpiList();
+    }
+
+    public static monitoring.Monitoring.KpiList getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<KpiList>
+        PARSER = new com.google.protobuf.AbstractParser<KpiList>() {
+      @java.lang.Override
+      public KpiList parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new KpiList(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<KpiList> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<KpiList> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public monitoring.Monitoring.KpiList getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_monitoring_KpiDescriptor_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_monitoring_KpiDescriptor_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_monitoring_MonitorKpiRequest_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_monitoring_MonitorKpiRequest_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_monitoring_KpiId_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_monitoring_KpiId_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_monitoring_Kpi_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_monitoring_Kpi_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_monitoring_KpiValue_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_monitoring_KpiValue_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_monitoring_KpiList_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_monitoring_KpiList_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static  com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\020monitoring.proto\022\nmonitoring\032\rcontext." +
+      "proto\032\026kpi_sample_types.proto\"\332\001\n\rKpiDes" +
+      "criptor\022\027\n\017kpi_description\030\001 \001(\t\0228\n\017kpi_" +
+      "sample_type\030\002 \001(\0162\037.kpi_sample_types.Kpi" +
+      "SampleType\022$\n\tdevice_id\030\003 \001(\0132\021.context." +
+      "DeviceId\022(\n\013endpoint_id\030\004 \001(\0132\023.context." +
+      "EndPointId\022&\n\nservice_id\030\005 \001(\0132\022.context" +
+      ".ServiceId\"p\n\021MonitorKpiRequest\022!\n\006kpi_i" +
+      "d\030\001 \001(\0132\021.monitoring.KpiId\022\033\n\023sampling_d" +
+      "uration_s\030\002 \001(\002\022\033\n\023sampling_interval_s\030\003" +
+      " \001(\002\"&\n\005KpiId\022\035\n\006kpi_id\030\001 \001(\0132\r.context." +
+      "Uuid\"d\n\003Kpi\022!\n\006kpi_id\030\001 \001(\0132\021.monitoring" +
+      ".KpiId\022\021\n\ttimestamp\030\002 \001(\t\022\'\n\tkpi_value\030\004" +
+      " \001(\0132\024.monitoring.KpiValue\"a\n\010KpiValue\022\020" +
+      "\n\006intVal\030\001 \001(\rH\000\022\022\n\010floatVal\030\002 \001(\002H\000\022\023\n\t" +
+      "stringVal\030\003 \001(\tH\000\022\021\n\007boolVal\030\004 \001(\010H\000B\007\n\005" +
+      "value\",\n\007KpiList\022!\n\010kpi_list\030\001 \003(\0132\017.mon" +
+      "itoring.Kpi2\363\002\n\021MonitoringService\022;\n\tCre" +
+      "ateKpi\022\031.monitoring.KpiDescriptor\032\021.moni" +
+      "toring.KpiId\"\000\022B\n\020GetKpiDescriptor\022\021.mon" +
+      "itoring.KpiId\032\031.monitoring.KpiDescriptor" +
+      "\"\000\022/\n\nIncludeKpi\022\017.monitoring.Kpi\032\016.cont" +
+      "ext.Empty\"\000\022=\n\nMonitorKpi\022\035.monitoring.M" +
+      "onitorKpiRequest\032\016.context.Empty\"\000\0226\n\014Ge" +
+      "tStreamKpi\022\021.monitoring.KpiId\032\017.monitori" +
+      "ng.Kpi\"\0000\001\0225\n\rGetInstantKpi\022\021.monitoring" +
+      ".KpiId\032\017.monitoring.Kpi\"\000b\006proto3"
+    };
+    descriptor = com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+          context.ContextOuterClass.getDescriptor(),
+          kpi_sample_types.KpiSampleTypes.getDescriptor(),
+        });
+    internal_static_monitoring_KpiDescriptor_descriptor =
+      getDescriptor().getMessageTypes().get(0);
+    internal_static_monitoring_KpiDescriptor_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_monitoring_KpiDescriptor_descriptor,
+        new java.lang.String[] { "KpiDescription", "KpiSampleType", "DeviceId", "EndpointId", "ServiceId", });
+    internal_static_monitoring_MonitorKpiRequest_descriptor =
+      getDescriptor().getMessageTypes().get(1);
+    internal_static_monitoring_MonitorKpiRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_monitoring_MonitorKpiRequest_descriptor,
+        new java.lang.String[] { "KpiId", "SamplingDurationS", "SamplingIntervalS", });
+    internal_static_monitoring_KpiId_descriptor =
+      getDescriptor().getMessageTypes().get(2);
+    internal_static_monitoring_KpiId_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_monitoring_KpiId_descriptor,
+        new java.lang.String[] { "KpiId", });
+    internal_static_monitoring_Kpi_descriptor =
+      getDescriptor().getMessageTypes().get(3);
+    internal_static_monitoring_Kpi_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_monitoring_Kpi_descriptor,
+        new java.lang.String[] { "KpiId", "Timestamp", "KpiValue", });
+    internal_static_monitoring_KpiValue_descriptor =
+      getDescriptor().getMessageTypes().get(4);
+    internal_static_monitoring_KpiValue_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_monitoring_KpiValue_descriptor,
+        new java.lang.String[] { "IntVal", "FloatVal", "StringVal", "BoolVal", "Value", });
+    internal_static_monitoring_KpiList_descriptor =
+      getDescriptor().getMessageTypes().get(5);
+    internal_static_monitoring_KpiList_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_monitoring_KpiList_descriptor,
+        new java.lang.String[] { "KpiList", });
+    context.ContextOuterClass.getDescriptor();
+    kpi_sample_types.KpiSampleTypes.getDescriptor();
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/src/automation/target/generated-sources/grpc/monitoring/MonitoringService.java b/src/automation/target/generated-sources/grpc/monitoring/MonitoringService.java
new file mode 100644
index 0000000000000000000000000000000000000000..480e193125e51851a72e18473c139d71190bab11
--- /dev/null
+++ b/src/automation/target/generated-sources/grpc/monitoring/MonitoringService.java
@@ -0,0 +1,26 @@
+package monitoring;
+
+import io.quarkus.grpc.runtime.MutinyService;
+
+@javax.annotation.Generated(
+value = "by Mutiny Grpc generator",
+comments = "Source: monitoring.proto")
+public interface MonitoringService extends MutinyService {
+
+    
+    io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiId> createKpi(monitoring.Monitoring.KpiDescriptor request);
+    
+    io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiDescriptor> getKpiDescriptor(monitoring.Monitoring.KpiId request);
+    
+    io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> includeKpi(monitoring.Monitoring.Kpi request);
+    
+    io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> monitorKpi(monitoring.Monitoring.MonitorKpiRequest request);
+    
+    io.smallrye.mutiny.Uni<monitoring.Monitoring.Kpi> getInstantKpi(monitoring.Monitoring.KpiId request);
+    
+    
+    io.smallrye.mutiny.Multi<monitoring.Monitoring.Kpi> getStreamKpi(monitoring.Monitoring.KpiId request);
+    
+    
+
+}
\ No newline at end of file
diff --git a/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceBean.java b/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceBean.java
new file mode 100644
index 0000000000000000000000000000000000000000..b0b2f5abd4144d8f6e41c2613a36c5b78051dd57
--- /dev/null
+++ b/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceBean.java
@@ -0,0 +1,68 @@
+package monitoring;
+
+import io.grpc.BindableService;
+import io.quarkus.grpc.GrpcService;
+import io.quarkus.grpc.runtime.MutinyBean;
+
+@javax.annotation.Generated(
+value = "by Mutiny Grpc generator",
+comments = "Source: monitoring.proto")
+public class MonitoringServiceBean extends MutinyMonitoringServiceGrpc.MonitoringServiceImplBase implements BindableService, MutinyBean {
+
+    private final MonitoringService delegate;
+
+    MonitoringServiceBean(@GrpcService MonitoringService delegate) {
+       this.delegate = delegate;
+    }
+
+    @Override
+    public io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiId> createKpi(monitoring.Monitoring.KpiDescriptor request) {
+       try {
+         return delegate.createKpi(request);
+       } catch (UnsupportedOperationException e) {
+          throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+       }
+    }
+    @Override
+    public io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiDescriptor> getKpiDescriptor(monitoring.Monitoring.KpiId request) {
+       try {
+         return delegate.getKpiDescriptor(request);
+       } catch (UnsupportedOperationException e) {
+          throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+       }
+    }
+    @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> includeKpi(monitoring.Monitoring.Kpi request) {
+       try {
+         return delegate.includeKpi(request);
+       } catch (UnsupportedOperationException e) {
+          throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+       }
+    }
+    @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> monitorKpi(monitoring.Monitoring.MonitorKpiRequest request) {
+       try {
+         return delegate.monitorKpi(request);
+       } catch (UnsupportedOperationException e) {
+          throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+       }
+    }
+    @Override
+    public io.smallrye.mutiny.Uni<monitoring.Monitoring.Kpi> getInstantKpi(monitoring.Monitoring.KpiId request) {
+       try {
+         return delegate.getInstantKpi(request);
+       } catch (UnsupportedOperationException e) {
+          throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+       }
+    }
+
+    @Override
+    public io.smallrye.mutiny.Multi<monitoring.Monitoring.Kpi> getStreamKpi(monitoring.Monitoring.KpiId request) {
+       try {
+         return delegate.getStreamKpi(request);
+       } catch (UnsupportedOperationException e) {
+          throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+       }
+    }
+
+}
\ No newline at end of file
diff --git a/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceClient.java b/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceClient.java
new file mode 100644
index 0000000000000000000000000000000000000000..293a7c418e6e027792e8007234e34225b8c1848a
--- /dev/null
+++ b/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceClient.java
@@ -0,0 +1,49 @@
+package monitoring;
+
+import java.util.function.BiFunction;
+
+import io.quarkus.grpc.runtime.MutinyClient;
+
+@javax.annotation.Generated(
+value = "by Mutiny Grpc generator",
+comments = "Source: monitoring.proto")
+public class MonitoringServiceClient implements MonitoringService, MutinyClient<MutinyMonitoringServiceGrpc.MutinyMonitoringServiceStub> {
+
+    private final MutinyMonitoringServiceGrpc.MutinyMonitoringServiceStub stub;
+
+    public MonitoringServiceClient(String name, io.grpc.Channel channel, BiFunction<String, MutinyMonitoringServiceGrpc.MutinyMonitoringServiceStub, MutinyMonitoringServiceGrpc.MutinyMonitoringServiceStub> stubConfigurator) {
+       this.stub = stubConfigurator.apply(name,MutinyMonitoringServiceGrpc.newMutinyStub(channel));
+    }
+
+    @Override
+    public MutinyMonitoringServiceGrpc.MutinyMonitoringServiceStub getStub() {
+       return stub;
+    }
+
+    @Override
+    public io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiId> createKpi(monitoring.Monitoring.KpiDescriptor request) {
+       return stub.createKpi(request);
+    }
+    @Override
+    public io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiDescriptor> getKpiDescriptor(monitoring.Monitoring.KpiId request) {
+       return stub.getKpiDescriptor(request);
+    }
+    @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> includeKpi(monitoring.Monitoring.Kpi request) {
+       return stub.includeKpi(request);
+    }
+    @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> monitorKpi(monitoring.Monitoring.MonitorKpiRequest request) {
+       return stub.monitorKpi(request);
+    }
+    @Override
+    public io.smallrye.mutiny.Uni<monitoring.Monitoring.Kpi> getInstantKpi(monitoring.Monitoring.KpiId request) {
+       return stub.getInstantKpi(request);
+    }
+
+    @Override
+    public io.smallrye.mutiny.Multi<monitoring.Monitoring.Kpi> getStreamKpi(monitoring.Monitoring.KpiId request) {
+       return stub.getStreamKpi(request);
+    }
+
+}
\ No newline at end of file
diff --git a/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceGrpc.java b/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceGrpc.java
new file mode 100644
index 0000000000000000000000000000000000000000..7749c322a714ed96bc523a6bb77da9d43e54dbca
--- /dev/null
+++ b/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceGrpc.java
@@ -0,0 +1,638 @@
+package monitoring;
+
+import static io.grpc.MethodDescriptor.generateFullMethodName;
+
+/**
+ */
+@javax.annotation.Generated(
+    value = "by gRPC proto compiler (version 1.38.1)",
+    comments = "Source: monitoring.proto")
+public final class MonitoringServiceGrpc {
+
+  private MonitoringServiceGrpc() {}
+
+  public static final String SERVICE_NAME = "monitoring.MonitoringService";
+
+  // Static method descriptors that strictly reflect the proto.
+  private static volatile io.grpc.MethodDescriptor<monitoring.Monitoring.KpiDescriptor,
+      monitoring.Monitoring.KpiId> getCreateKpiMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "CreateKpi",
+      requestType = monitoring.Monitoring.KpiDescriptor.class,
+      responseType = monitoring.Monitoring.KpiId.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<monitoring.Monitoring.KpiDescriptor,
+      monitoring.Monitoring.KpiId> getCreateKpiMethod() {
+    io.grpc.MethodDescriptor<monitoring.Monitoring.KpiDescriptor, monitoring.Monitoring.KpiId> getCreateKpiMethod;
+    if ((getCreateKpiMethod = MonitoringServiceGrpc.getCreateKpiMethod) == null) {
+      synchronized (MonitoringServiceGrpc.class) {
+        if ((getCreateKpiMethod = MonitoringServiceGrpc.getCreateKpiMethod) == null) {
+          MonitoringServiceGrpc.getCreateKpiMethod = getCreateKpiMethod =
+              io.grpc.MethodDescriptor.<monitoring.Monitoring.KpiDescriptor, monitoring.Monitoring.KpiId>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "CreateKpi"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  monitoring.Monitoring.KpiDescriptor.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  monitoring.Monitoring.KpiId.getDefaultInstance()))
+              .setSchemaDescriptor(new MonitoringServiceMethodDescriptorSupplier("CreateKpi"))
+              .build();
+        }
+      }
+    }
+    return getCreateKpiMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<monitoring.Monitoring.KpiId,
+      monitoring.Monitoring.KpiDescriptor> getGetKpiDescriptorMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "GetKpiDescriptor",
+      requestType = monitoring.Monitoring.KpiId.class,
+      responseType = monitoring.Monitoring.KpiDescriptor.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<monitoring.Monitoring.KpiId,
+      monitoring.Monitoring.KpiDescriptor> getGetKpiDescriptorMethod() {
+    io.grpc.MethodDescriptor<monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiDescriptor> getGetKpiDescriptorMethod;
+    if ((getGetKpiDescriptorMethod = MonitoringServiceGrpc.getGetKpiDescriptorMethod) == null) {
+      synchronized (MonitoringServiceGrpc.class) {
+        if ((getGetKpiDescriptorMethod = MonitoringServiceGrpc.getGetKpiDescriptorMethod) == null) {
+          MonitoringServiceGrpc.getGetKpiDescriptorMethod = getGetKpiDescriptorMethod =
+              io.grpc.MethodDescriptor.<monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiDescriptor>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetKpiDescriptor"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  monitoring.Monitoring.KpiId.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  monitoring.Monitoring.KpiDescriptor.getDefaultInstance()))
+              .setSchemaDescriptor(new MonitoringServiceMethodDescriptorSupplier("GetKpiDescriptor"))
+              .build();
+        }
+      }
+    }
+    return getGetKpiDescriptorMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<monitoring.Monitoring.Kpi,
+      context.ContextOuterClass.Empty> getIncludeKpiMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "IncludeKpi",
+      requestType = monitoring.Monitoring.Kpi.class,
+      responseType = context.ContextOuterClass.Empty.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<monitoring.Monitoring.Kpi,
+      context.ContextOuterClass.Empty> getIncludeKpiMethod() {
+    io.grpc.MethodDescriptor<monitoring.Monitoring.Kpi, context.ContextOuterClass.Empty> getIncludeKpiMethod;
+    if ((getIncludeKpiMethod = MonitoringServiceGrpc.getIncludeKpiMethod) == null) {
+      synchronized (MonitoringServiceGrpc.class) {
+        if ((getIncludeKpiMethod = MonitoringServiceGrpc.getIncludeKpiMethod) == null) {
+          MonitoringServiceGrpc.getIncludeKpiMethod = getIncludeKpiMethod =
+              io.grpc.MethodDescriptor.<monitoring.Monitoring.Kpi, context.ContextOuterClass.Empty>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "IncludeKpi"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  monitoring.Monitoring.Kpi.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  context.ContextOuterClass.Empty.getDefaultInstance()))
+              .setSchemaDescriptor(new MonitoringServiceMethodDescriptorSupplier("IncludeKpi"))
+              .build();
+        }
+      }
+    }
+    return getIncludeKpiMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<monitoring.Monitoring.MonitorKpiRequest,
+      context.ContextOuterClass.Empty> getMonitorKpiMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "MonitorKpi",
+      requestType = monitoring.Monitoring.MonitorKpiRequest.class,
+      responseType = context.ContextOuterClass.Empty.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<monitoring.Monitoring.MonitorKpiRequest,
+      context.ContextOuterClass.Empty> getMonitorKpiMethod() {
+    io.grpc.MethodDescriptor<monitoring.Monitoring.MonitorKpiRequest, context.ContextOuterClass.Empty> getMonitorKpiMethod;
+    if ((getMonitorKpiMethod = MonitoringServiceGrpc.getMonitorKpiMethod) == null) {
+      synchronized (MonitoringServiceGrpc.class) {
+        if ((getMonitorKpiMethod = MonitoringServiceGrpc.getMonitorKpiMethod) == null) {
+          MonitoringServiceGrpc.getMonitorKpiMethod = getMonitorKpiMethod =
+              io.grpc.MethodDescriptor.<monitoring.Monitoring.MonitorKpiRequest, context.ContextOuterClass.Empty>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "MonitorKpi"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  monitoring.Monitoring.MonitorKpiRequest.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  context.ContextOuterClass.Empty.getDefaultInstance()))
+              .setSchemaDescriptor(new MonitoringServiceMethodDescriptorSupplier("MonitorKpi"))
+              .build();
+        }
+      }
+    }
+    return getMonitorKpiMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<monitoring.Monitoring.KpiId,
+      monitoring.Monitoring.Kpi> getGetStreamKpiMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "GetStreamKpi",
+      requestType = monitoring.Monitoring.KpiId.class,
+      responseType = monitoring.Monitoring.Kpi.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.SERVER_STREAMING)
+  public static io.grpc.MethodDescriptor<monitoring.Monitoring.KpiId,
+      monitoring.Monitoring.Kpi> getGetStreamKpiMethod() {
+    io.grpc.MethodDescriptor<monitoring.Monitoring.KpiId, monitoring.Monitoring.Kpi> getGetStreamKpiMethod;
+    if ((getGetStreamKpiMethod = MonitoringServiceGrpc.getGetStreamKpiMethod) == null) {
+      synchronized (MonitoringServiceGrpc.class) {
+        if ((getGetStreamKpiMethod = MonitoringServiceGrpc.getGetStreamKpiMethod) == null) {
+          MonitoringServiceGrpc.getGetStreamKpiMethod = getGetStreamKpiMethod =
+              io.grpc.MethodDescriptor.<monitoring.Monitoring.KpiId, monitoring.Monitoring.Kpi>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.SERVER_STREAMING)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetStreamKpi"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  monitoring.Monitoring.KpiId.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  monitoring.Monitoring.Kpi.getDefaultInstance()))
+              .setSchemaDescriptor(new MonitoringServiceMethodDescriptorSupplier("GetStreamKpi"))
+              .build();
+        }
+      }
+    }
+    return getGetStreamKpiMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<monitoring.Monitoring.KpiId,
+      monitoring.Monitoring.Kpi> getGetInstantKpiMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "GetInstantKpi",
+      requestType = monitoring.Monitoring.KpiId.class,
+      responseType = monitoring.Monitoring.Kpi.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<monitoring.Monitoring.KpiId,
+      monitoring.Monitoring.Kpi> getGetInstantKpiMethod() {
+    io.grpc.MethodDescriptor<monitoring.Monitoring.KpiId, monitoring.Monitoring.Kpi> getGetInstantKpiMethod;
+    if ((getGetInstantKpiMethod = MonitoringServiceGrpc.getGetInstantKpiMethod) == null) {
+      synchronized (MonitoringServiceGrpc.class) {
+        if ((getGetInstantKpiMethod = MonitoringServiceGrpc.getGetInstantKpiMethod) == null) {
+          MonitoringServiceGrpc.getGetInstantKpiMethod = getGetInstantKpiMethod =
+              io.grpc.MethodDescriptor.<monitoring.Monitoring.KpiId, monitoring.Monitoring.Kpi>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetInstantKpi"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  monitoring.Monitoring.KpiId.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  monitoring.Monitoring.Kpi.getDefaultInstance()))
+              .setSchemaDescriptor(new MonitoringServiceMethodDescriptorSupplier("GetInstantKpi"))
+              .build();
+        }
+      }
+    }
+    return getGetInstantKpiMethod;
+  }
+
+  /**
+   * Creates a new async stub that supports all call types for the service
+   */
+  public static MonitoringServiceStub newStub(io.grpc.Channel channel) {
+    io.grpc.stub.AbstractStub.StubFactory<MonitoringServiceStub> factory =
+      new io.grpc.stub.AbstractStub.StubFactory<MonitoringServiceStub>() {
+        @java.lang.Override
+        public MonitoringServiceStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+          return new MonitoringServiceStub(channel, callOptions);
+        }
+      };
+    return MonitoringServiceStub.newStub(factory, channel);
+  }
+
+  /**
+   * Creates a new blocking-style stub that supports unary and streaming output calls on the service
+   */
+  public static MonitoringServiceBlockingStub newBlockingStub(
+      io.grpc.Channel channel) {
+    io.grpc.stub.AbstractStub.StubFactory<MonitoringServiceBlockingStub> factory =
+      new io.grpc.stub.AbstractStub.StubFactory<MonitoringServiceBlockingStub>() {
+        @java.lang.Override
+        public MonitoringServiceBlockingStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+          return new MonitoringServiceBlockingStub(channel, callOptions);
+        }
+      };
+    return MonitoringServiceBlockingStub.newStub(factory, channel);
+  }
+
+  /**
+   * Creates a new ListenableFuture-style stub that supports unary calls on the service
+   */
+  public static MonitoringServiceFutureStub newFutureStub(
+      io.grpc.Channel channel) {
+    io.grpc.stub.AbstractStub.StubFactory<MonitoringServiceFutureStub> factory =
+      new io.grpc.stub.AbstractStub.StubFactory<MonitoringServiceFutureStub>() {
+        @java.lang.Override
+        public MonitoringServiceFutureStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+          return new MonitoringServiceFutureStub(channel, callOptions);
+        }
+      };
+    return MonitoringServiceFutureStub.newStub(factory, channel);
+  }
+
+  /**
+   */
+  public static abstract class MonitoringServiceImplBase implements io.grpc.BindableService {
+
+    /**
+     */
+    public void createKpi(monitoring.Monitoring.KpiDescriptor request,
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiId> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getCreateKpiMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void getKpiDescriptor(monitoring.Monitoring.KpiId request,
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiDescriptor> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetKpiDescriptorMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void includeKpi(monitoring.Monitoring.Kpi request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.Empty> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getIncludeKpiMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void monitorKpi(monitoring.Monitoring.MonitorKpiRequest request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.Empty> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getMonitorKpiMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void getStreamKpi(monitoring.Monitoring.KpiId request,
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.Kpi> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetStreamKpiMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void getInstantKpi(monitoring.Monitoring.KpiId request,
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.Kpi> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetInstantKpiMethod(), responseObserver);
+    }
+
+    @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
+      return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
+          .addMethod(
+            getCreateKpiMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                monitoring.Monitoring.KpiDescriptor,
+                monitoring.Monitoring.KpiId>(
+                  this, METHODID_CREATE_KPI)))
+          .addMethod(
+            getGetKpiDescriptorMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                monitoring.Monitoring.KpiId,
+                monitoring.Monitoring.KpiDescriptor>(
+                  this, METHODID_GET_KPI_DESCRIPTOR)))
+          .addMethod(
+            getIncludeKpiMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                monitoring.Monitoring.Kpi,
+                context.ContextOuterClass.Empty>(
+                  this, METHODID_INCLUDE_KPI)))
+          .addMethod(
+            getMonitorKpiMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                monitoring.Monitoring.MonitorKpiRequest,
+                context.ContextOuterClass.Empty>(
+                  this, METHODID_MONITOR_KPI)))
+          .addMethod(
+            getGetStreamKpiMethod(),
+            io.grpc.stub.ServerCalls.asyncServerStreamingCall(
+              new MethodHandlers<
+                monitoring.Monitoring.KpiId,
+                monitoring.Monitoring.Kpi>(
+                  this, METHODID_GET_STREAM_KPI)))
+          .addMethod(
+            getGetInstantKpiMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                monitoring.Monitoring.KpiId,
+                monitoring.Monitoring.Kpi>(
+                  this, METHODID_GET_INSTANT_KPI)))
+          .build();
+    }
+  }
+
+  /**
+   */
+  public static final class MonitoringServiceStub extends io.grpc.stub.AbstractAsyncStub<MonitoringServiceStub> {
+    private MonitoringServiceStub(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected MonitoringServiceStub build(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      return new MonitoringServiceStub(channel, callOptions);
+    }
+
+    /**
+     */
+    public void createKpi(monitoring.Monitoring.KpiDescriptor request,
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiId> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getCreateKpiMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void getKpiDescriptor(monitoring.Monitoring.KpiId request,
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiDescriptor> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getGetKpiDescriptorMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void includeKpi(monitoring.Monitoring.Kpi request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.Empty> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getIncludeKpiMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void monitorKpi(monitoring.Monitoring.MonitorKpiRequest request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.Empty> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getMonitorKpiMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void getStreamKpi(monitoring.Monitoring.KpiId request,
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.Kpi> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncServerStreamingCall(
+          getChannel().newCall(getGetStreamKpiMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void getInstantKpi(monitoring.Monitoring.KpiId request,
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.Kpi> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getGetInstantKpiMethod(), getCallOptions()), request, responseObserver);
+    }
+  }
+
+  /**
+   */
+  public static final class MonitoringServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub<MonitoringServiceBlockingStub> {
+    private MonitoringServiceBlockingStub(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected MonitoringServiceBlockingStub build(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      return new MonitoringServiceBlockingStub(channel, callOptions);
+    }
+
+    /**
+     */
+    public monitoring.Monitoring.KpiId createKpi(monitoring.Monitoring.KpiDescriptor request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getCreateKpiMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public monitoring.Monitoring.KpiDescriptor getKpiDescriptor(monitoring.Monitoring.KpiId request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getGetKpiDescriptorMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public context.ContextOuterClass.Empty includeKpi(monitoring.Monitoring.Kpi request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getIncludeKpiMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public context.ContextOuterClass.Empty monitorKpi(monitoring.Monitoring.MonitorKpiRequest request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getMonitorKpiMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public java.util.Iterator<monitoring.Monitoring.Kpi> getStreamKpi(
+        monitoring.Monitoring.KpiId request) {
+      return io.grpc.stub.ClientCalls.blockingServerStreamingCall(
+          getChannel(), getGetStreamKpiMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public monitoring.Monitoring.Kpi getInstantKpi(monitoring.Monitoring.KpiId request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getGetInstantKpiMethod(), getCallOptions(), request);
+    }
+  }
+
+  /**
+   */
+  public static final class MonitoringServiceFutureStub extends io.grpc.stub.AbstractFutureStub<MonitoringServiceFutureStub> {
+    private MonitoringServiceFutureStub(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected MonitoringServiceFutureStub build(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      return new MonitoringServiceFutureStub(channel, callOptions);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<monitoring.Monitoring.KpiId> createKpi(
+        monitoring.Monitoring.KpiDescriptor request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getCreateKpiMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<monitoring.Monitoring.KpiDescriptor> getKpiDescriptor(
+        monitoring.Monitoring.KpiId request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getGetKpiDescriptorMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<context.ContextOuterClass.Empty> includeKpi(
+        monitoring.Monitoring.Kpi request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getIncludeKpiMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<context.ContextOuterClass.Empty> monitorKpi(
+        monitoring.Monitoring.MonitorKpiRequest request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getMonitorKpiMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<monitoring.Monitoring.Kpi> getInstantKpi(
+        monitoring.Monitoring.KpiId request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getGetInstantKpiMethod(), getCallOptions()), request);
+    }
+  }
+
+  private static final int METHODID_CREATE_KPI = 0;
+  private static final int METHODID_GET_KPI_DESCRIPTOR = 1;
+  private static final int METHODID_INCLUDE_KPI = 2;
+  private static final int METHODID_MONITOR_KPI = 3;
+  private static final int METHODID_GET_STREAM_KPI = 4;
+  private static final int METHODID_GET_INSTANT_KPI = 5;
+
+  private static final class MethodHandlers<Req, Resp> implements
+      io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
+      io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>,
+      io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>,
+      io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {
+    private final MonitoringServiceImplBase serviceImpl;
+    private final int methodId;
+
+    MethodHandlers(MonitoringServiceImplBase serviceImpl, int methodId) {
+      this.serviceImpl = serviceImpl;
+      this.methodId = methodId;
+    }
+
+    @java.lang.Override
+    @java.lang.SuppressWarnings("unchecked")
+    public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
+      switch (methodId) {
+        case METHODID_CREATE_KPI:
+          serviceImpl.createKpi((monitoring.Monitoring.KpiDescriptor) request,
+              (io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiId>) responseObserver);
+          break;
+        case METHODID_GET_KPI_DESCRIPTOR:
+          serviceImpl.getKpiDescriptor((monitoring.Monitoring.KpiId) request,
+              (io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiDescriptor>) responseObserver);
+          break;
+        case METHODID_INCLUDE_KPI:
+          serviceImpl.includeKpi((monitoring.Monitoring.Kpi) request,
+              (io.grpc.stub.StreamObserver<context.ContextOuterClass.Empty>) responseObserver);
+          break;
+        case METHODID_MONITOR_KPI:
+          serviceImpl.monitorKpi((monitoring.Monitoring.MonitorKpiRequest) request,
+              (io.grpc.stub.StreamObserver<context.ContextOuterClass.Empty>) responseObserver);
+          break;
+        case METHODID_GET_STREAM_KPI:
+          serviceImpl.getStreamKpi((monitoring.Monitoring.KpiId) request,
+              (io.grpc.stub.StreamObserver<monitoring.Monitoring.Kpi>) responseObserver);
+          break;
+        case METHODID_GET_INSTANT_KPI:
+          serviceImpl.getInstantKpi((monitoring.Monitoring.KpiId) request,
+              (io.grpc.stub.StreamObserver<monitoring.Monitoring.Kpi>) responseObserver);
+          break;
+        default:
+          throw new AssertionError();
+      }
+    }
+
+    @java.lang.Override
+    @java.lang.SuppressWarnings("unchecked")
+    public io.grpc.stub.StreamObserver<Req> invoke(
+        io.grpc.stub.StreamObserver<Resp> responseObserver) {
+      switch (methodId) {
+        default:
+          throw new AssertionError();
+      }
+    }
+  }
+
+  private static abstract class MonitoringServiceBaseDescriptorSupplier
+      implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
+    MonitoringServiceBaseDescriptorSupplier() {}
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.FileDescriptor getFileDescriptor() {
+      return monitoring.Monitoring.getDescriptor();
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.ServiceDescriptor getServiceDescriptor() {
+      return getFileDescriptor().findServiceByName("MonitoringService");
+    }
+  }
+
+  private static final class MonitoringServiceFileDescriptorSupplier
+      extends MonitoringServiceBaseDescriptorSupplier {
+    MonitoringServiceFileDescriptorSupplier() {}
+  }
+
+  private static final class MonitoringServiceMethodDescriptorSupplier
+      extends MonitoringServiceBaseDescriptorSupplier
+      implements io.grpc.protobuf.ProtoMethodDescriptorSupplier {
+    private final String methodName;
+
+    MonitoringServiceMethodDescriptorSupplier(String methodName) {
+      this.methodName = methodName;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.MethodDescriptor getMethodDescriptor() {
+      return getServiceDescriptor().findMethodByName(methodName);
+    }
+  }
+
+  private static volatile io.grpc.ServiceDescriptor serviceDescriptor;
+
+  public static io.grpc.ServiceDescriptor getServiceDescriptor() {
+    io.grpc.ServiceDescriptor result = serviceDescriptor;
+    if (result == null) {
+      synchronized (MonitoringServiceGrpc.class) {
+        result = serviceDescriptor;
+        if (result == null) {
+          serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)
+              .setSchemaDescriptor(new MonitoringServiceFileDescriptorSupplier())
+              .addMethod(getCreateKpiMethod())
+              .addMethod(getGetKpiDescriptorMethod())
+              .addMethod(getIncludeKpiMethod())
+              .addMethod(getMonitorKpiMethod())
+              .addMethod(getGetStreamKpiMethod())
+              .addMethod(getGetInstantKpiMethod())
+              .build();
+        }
+      }
+    }
+    return result;
+  }
+}
diff --git a/src/automation/target/generated-sources/grpc/monitoring/MutinyMonitoringServiceGrpc.java b/src/automation/target/generated-sources/grpc/monitoring/MutinyMonitoringServiceGrpc.java
new file mode 100644
index 0000000000000000000000000000000000000000..e5157378c1d8d4608d5da2ec0e429fbb2412c175
--- /dev/null
+++ b/src/automation/target/generated-sources/grpc/monitoring/MutinyMonitoringServiceGrpc.java
@@ -0,0 +1,240 @@
+package monitoring;
+
+import static monitoring.MonitoringServiceGrpc.getServiceDescriptor;
+import static io.grpc.stub.ServerCalls.asyncUnaryCall;
+import static io.grpc.stub.ServerCalls.asyncServerStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncClientStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncBidiStreamingCall;
+
+@javax.annotation.Generated(
+value = "by Mutiny Grpc generator",
+comments = "Source: monitoring.proto")
+public final class MutinyMonitoringServiceGrpc implements io.quarkus.grpc.runtime.MutinyGrpc {
+    private MutinyMonitoringServiceGrpc() {}
+
+    public static MutinyMonitoringServiceStub newMutinyStub(io.grpc.Channel channel) {
+        return new MutinyMonitoringServiceStub(channel);
+    }
+
+    
+    public static final class MutinyMonitoringServiceStub extends io.grpc.stub.AbstractStub<MutinyMonitoringServiceStub> implements io.quarkus.grpc.runtime.MutinyStub {
+        private MonitoringServiceGrpc.MonitoringServiceStub delegateStub;
+
+        private MutinyMonitoringServiceStub(io.grpc.Channel channel) {
+            super(channel);
+            delegateStub = MonitoringServiceGrpc.newStub(channel);
+        }
+
+        private MutinyMonitoringServiceStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+            super(channel, callOptions);
+            delegateStub = MonitoringServiceGrpc.newStub(channel).build(channel, callOptions);
+        }
+
+        @Override
+        protected MutinyMonitoringServiceStub build(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+            return new MutinyMonitoringServiceStub(channel, callOptions);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiId> createKpi(monitoring.Monitoring.KpiDescriptor request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::createKpi);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiDescriptor> getKpiDescriptor(monitoring.Monitoring.KpiId request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::getKpiDescriptor);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> includeKpi(monitoring.Monitoring.Kpi request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::includeKpi);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> monitorKpi(monitoring.Monitoring.MonitorKpiRequest request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::monitorKpi);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<monitoring.Monitoring.Kpi> getInstantKpi(monitoring.Monitoring.KpiId request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::getInstantKpi);
+        }
+
+        
+        public io.smallrye.mutiny.Multi<monitoring.Monitoring.Kpi> getStreamKpi(monitoring.Monitoring.KpiId request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToMany(request, delegateStub::getStreamKpi);
+        }
+
+    }
+
+    
+    public static abstract class MonitoringServiceImplBase implements io.grpc.BindableService {
+
+        private String compression;
+        /**
+        * Set whether the server will try to use a compressed response.
+        *
+        * @param compression the compression, e.g {@code gzip}
+        */
+        public MonitoringServiceImplBase withCompression(String compression) {
+        this.compression = compression;
+        return this;
+        }
+
+
+        
+        public io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiId> createKpi(monitoring.Monitoring.KpiDescriptor request) {
+            throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiDescriptor> getKpiDescriptor(monitoring.Monitoring.KpiId request) {
+            throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> includeKpi(monitoring.Monitoring.Kpi request) {
+            throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> monitorKpi(monitoring.Monitoring.MonitorKpiRequest request) {
+            throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+        }
+
+        
+        public io.smallrye.mutiny.Uni<monitoring.Monitoring.Kpi> getInstantKpi(monitoring.Monitoring.KpiId request) {
+            throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+        }
+
+        
+        public io.smallrye.mutiny.Multi<monitoring.Monitoring.Kpi> getStreamKpi(monitoring.Monitoring.KpiId request) {
+            throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+        }
+
+        @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
+            return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
+                    .addMethod(
+                            monitoring.MonitoringServiceGrpc.getCreateKpiMethod(),
+                            asyncUnaryCall(
+                                    new MethodHandlers<
+                                            monitoring.Monitoring.KpiDescriptor,
+                                            monitoring.Monitoring.KpiId>(
+                                            this, METHODID_CREATE_KPI, compression)))
+                    .addMethod(
+                            monitoring.MonitoringServiceGrpc.getGetKpiDescriptorMethod(),
+                            asyncUnaryCall(
+                                    new MethodHandlers<
+                                            monitoring.Monitoring.KpiId,
+                                            monitoring.Monitoring.KpiDescriptor>(
+                                            this, METHODID_GET_KPI_DESCRIPTOR, compression)))
+                    .addMethod(
+                            monitoring.MonitoringServiceGrpc.getIncludeKpiMethod(),
+                            asyncUnaryCall(
+                                    new MethodHandlers<
+                                            monitoring.Monitoring.Kpi,
+                                            context.ContextOuterClass.Empty>(
+                                            this, METHODID_INCLUDE_KPI, compression)))
+                    .addMethod(
+                            monitoring.MonitoringServiceGrpc.getMonitorKpiMethod(),
+                            asyncUnaryCall(
+                                    new MethodHandlers<
+                                            monitoring.Monitoring.MonitorKpiRequest,
+                                            context.ContextOuterClass.Empty>(
+                                            this, METHODID_MONITOR_KPI, compression)))
+                    .addMethod(
+                            monitoring.MonitoringServiceGrpc.getGetStreamKpiMethod(),
+                            asyncServerStreamingCall(
+                                    new MethodHandlers<
+                                            monitoring.Monitoring.KpiId,
+                                            monitoring.Monitoring.Kpi>(
+                                            this, METHODID_GET_STREAM_KPI, compression)))
+                    .addMethod(
+                            monitoring.MonitoringServiceGrpc.getGetInstantKpiMethod(),
+                            asyncUnaryCall(
+                                    new MethodHandlers<
+                                            monitoring.Monitoring.KpiId,
+                                            monitoring.Monitoring.Kpi>(
+                                            this, METHODID_GET_INSTANT_KPI, compression)))
+                    .build();
+        }
+    }
+
+    private static final int METHODID_CREATE_KPI = 0;
+    private static final int METHODID_GET_KPI_DESCRIPTOR = 1;
+    private static final int METHODID_INCLUDE_KPI = 2;
+    private static final int METHODID_MONITOR_KPI = 3;
+    private static final int METHODID_GET_STREAM_KPI = 4;
+    private static final int METHODID_GET_INSTANT_KPI = 5;
+
+    private static final class MethodHandlers<Req, Resp> implements
+            io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
+            io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>,
+            io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>,
+            io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {
+        private final MonitoringServiceImplBase serviceImpl;
+        private final int methodId;
+        private final String compression;
+
+        MethodHandlers(MonitoringServiceImplBase serviceImpl, int methodId, String compression) {
+            this.serviceImpl = serviceImpl;
+            this.methodId = methodId;
+            this.compression = compression;
+        }
+
+        @java.lang.Override
+        @java.lang.SuppressWarnings("unchecked")
+        public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
+            switch (methodId) {
+                case METHODID_CREATE_KPI:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((monitoring.Monitoring.KpiDescriptor) request,
+                            (io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiId>) responseObserver,
+                            compression,
+                            serviceImpl::createKpi);
+                    break;
+                case METHODID_GET_KPI_DESCRIPTOR:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((monitoring.Monitoring.KpiId) request,
+                            (io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiDescriptor>) responseObserver,
+                            compression,
+                            serviceImpl::getKpiDescriptor);
+                    break;
+                case METHODID_INCLUDE_KPI:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((monitoring.Monitoring.Kpi) request,
+                            (io.grpc.stub.StreamObserver<context.ContextOuterClass.Empty>) responseObserver,
+                            compression,
+                            serviceImpl::includeKpi);
+                    break;
+                case METHODID_MONITOR_KPI:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((monitoring.Monitoring.MonitorKpiRequest) request,
+                            (io.grpc.stub.StreamObserver<context.ContextOuterClass.Empty>) responseObserver,
+                            compression,
+                            serviceImpl::monitorKpi);
+                    break;
+                case METHODID_GET_STREAM_KPI:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToMany((monitoring.Monitoring.KpiId) request,
+                            (io.grpc.stub.StreamObserver<monitoring.Monitoring.Kpi>) responseObserver,
+                            compression,
+                            serviceImpl::getStreamKpi);
+                    break;
+                case METHODID_GET_INSTANT_KPI:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((monitoring.Monitoring.KpiId) request,
+                            (io.grpc.stub.StreamObserver<monitoring.Monitoring.Kpi>) responseObserver,
+                            compression,
+                            serviceImpl::getInstantKpi);
+                    break;
+                default:
+                    throw new java.lang.AssertionError();
+            }
+        }
+
+        @java.lang.Override
+        @java.lang.SuppressWarnings("unchecked")
+        public io.grpc.stub.StreamObserver<Req> invoke(io.grpc.stub.StreamObserver<Resp> responseObserver) {
+            switch (methodId) {
+                default:
+                    throw new java.lang.AssertionError();
+            }
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/src/automation/target/kubernetes/kubernetes.yml b/src/automation/target/kubernetes/kubernetes.yml
index 73d19dc1f9e0c6f12b7d660dde71927dda7c07cc..47b852adf6beb80c60488a298e9039cd2011469d 100644
--- a/src/automation/target/kubernetes/kubernetes.yml
+++ b/src/automation/target/kubernetes/kubernetes.yml
@@ -3,8 +3,8 @@ apiVersion: v1
 kind: Service
 metadata:
   annotations:
-    app.quarkus.io/commit-id: 6b96f471f66e6bb59357856c635f8d7e1ce98a5c
-    app.quarkus.io/build-timestamp: 2021-11-19 - 15:03:07 +0000
+    app.quarkus.io/commit-id: cb66db4bc415be2e94c17f4152e9805301b202b5
+    app.quarkus.io/build-timestamp: 2022-01-05 - 10:42:14 +0000
   labels:
     app.kubernetes.io/name: automationservice
     app.kubernetes.io/version: 0.0.1
@@ -12,12 +12,12 @@ metadata:
   name: automationservice
 spec:
   ports:
-    - name: http
-      port: 8080
-      targetPort: 8080
     - name: grpc-server
       port: 9999
       targetPort: 9999
+    - name: http
+      port: 8080
+      targetPort: 8080
   selector:
     app.kubernetes.io/name: automationservice
     app.kubernetes.io/version: 0.0.1
@@ -27,28 +27,28 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   annotations:
-    app.quarkus.io/commit-id: 6b96f471f66e6bb59357856c635f8d7e1ce98a5c
-    app.quarkus.io/build-timestamp: 2021-11-19 - 15:03:07 +0000
+    app.quarkus.io/commit-id: cb66db4bc415be2e94c17f4152e9805301b202b5
+    app.quarkus.io/build-timestamp: 2022-01-05 - 10:42:14 +0000
   labels:
     app: automationservice
-    app.kubernetes.io/name: automationservice
     app.kubernetes.io/version: 0.0.1
+    app.kubernetes.io/name: automationservice
   name: automationservice
 spec:
   replicas: 1
   selector:
     matchLabels:
-      app.kubernetes.io/name: automationservice
       app.kubernetes.io/version: 0.0.1
+      app.kubernetes.io/name: automationservice
   template:
     metadata:
       annotations:
-        app.quarkus.io/commit-id: 6b96f471f66e6bb59357856c635f8d7e1ce98a5c
-        app.quarkus.io/build-timestamp: 2021-11-19 - 15:03:07 +0000
+        app.quarkus.io/commit-id: cb66db4bc415be2e94c17f4152e9805301b202b5
+        app.quarkus.io/build-timestamp: 2022-01-05 - 10:42:14 +0000
       labels:
         app: automationservice
-        app.kubernetes.io/name: automationservice
         app.kubernetes.io/version: 0.0.1
+        app.kubernetes.io/name: automationservice
     spec:
       containers:
         - env:
@@ -74,12 +74,12 @@ spec:
             timeoutSeconds: 10
           name: automationservice
           ports:
-            - containerPort: 8080
-              name: http
-              protocol: TCP
             - containerPort: 9999
               name: grpc-server
               protocol: TCP
+            - containerPort: 8080
+              name: http
+              protocol: TCP
           readinessProbe:
             failureThreshold: 3
             httpGet: