From 0b9a28f39c02f8e56e0a68f6f31a0276e14ed998 Mon Sep 17 00:00:00 2001
From: Katopodisv <vkatopodis@ubitech.eu>
Date: Fri, 31 Mar 2023 17:17:21 +0300
Subject: [PATCH] feat(automation/policy): Enabling metrics collection

---
 manifests/automationservice.yaml              | 126 ++++++++++++++++-
 manifests/policyservice.yaml                  | 130 +++++++++++++++++-
 manifests/servicemonitors.yaml                |  58 ++++++++
 src/automation/pom.xml                        |   5 +
 .../automation/AutomationGatewayImpl.java     |  16 +++
 .../target/kubernetes/kubernetes.yml          |  33 ++++-
 src/policy/pom.xml                            |   5 +
 .../eu/teraflow/policy/PolicyGatewayImpl.java |  19 +++
 src/policy/target/kubernetes/kubernetes.yml   |  54 ++++++--
 9 files changed, 427 insertions(+), 19 deletions(-)
 mode change 120000 => 100644 manifests/automationservice.yaml
 mode change 120000 => 100644 manifests/policyservice.yaml

diff --git a/manifests/automationservice.yaml b/manifests/automationservice.yaml
deleted file mode 120000
index 5e8d3c1c8..000000000
--- a/manifests/automationservice.yaml
+++ /dev/null
@@ -1 +0,0 @@
-../src/automation/target/kubernetes/kubernetes.yml
\ No newline at end of file
diff --git a/manifests/automationservice.yaml b/manifests/automationservice.yaml
new file mode 100644
index 000000000..73e6b1d7b
--- /dev/null
+++ b/manifests/automationservice.yaml
@@ -0,0 +1,125 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+  annotations:
+    app.quarkus.io/build-timestamp: 2022-09-19 - 10:48:18 +0000
+  labels:
+    app.kubernetes.io/name: automationservice
+    app: automationservice
+  name: automationservice
+spec:
+  ports:
+    - name: grpc
+      port: 5050
+      targetPort: 5050
+    - name: metrics
+      protocol: TCP
+      port: 9192
+      targetPort: 8080
+  selector:
+    app.kubernetes.io/name: automationservice
+  type: ClusterIP
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  annotations:
+    app.quarkus.io/build-timestamp: 2022-09-19 - 10:48:18 +0000
+  labels:
+    app: automationservice
+    app.kubernetes.io/name: automationservice
+  name: automationservice
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app.kubernetes.io/name: automationservice
+  template:
+    metadata:
+      annotations:
+        app.quarkus.io/build-timestamp: 2022-09-19 - 10:48:18 +0000
+      labels:
+        app: automationservice
+        app.kubernetes.io/name: automationservice
+    spec:
+      containers:
+        - env:
+            - name: KUBERNETES_NAMESPACE
+              valueFrom:
+                fieldRef:
+                  fieldPath: metadata.namespace
+            - name: CONTEXT_SERVICE_HOST
+              value: contextservice
+            - name: DEVICE_SERVICE_HOST
+              value: deviceservice
+          image: labs.etsi.org:5050/tfs/controller/automation:0.2.0
+          imagePullPolicy: Always
+          livenessProbe:
+            failureThreshold: 3
+            httpGet:
+              path: /q/health/live
+              port: 8080
+              scheme: HTTP
+            initialDelaySeconds: 2
+            periodSeconds: 10
+            successThreshold: 1
+            timeoutSeconds: 10
+          name: automationservice
+          ports:
+            - containerPort: 5050
+              name: grpc
+              protocol: TCP
+            - containerPort: 8080
+              name: metrics
+              protocol: TCP
+          readinessProbe:
+            failureThreshold: 3
+            httpGet:
+              path: /q/health/ready
+              port: 8080
+              scheme: HTTP
+            initialDelaySeconds: 2
+            periodSeconds: 10
+            successThreshold: 1
+            timeoutSeconds: 10
+          resources:
+            requests:
+              cpu: 50m
+              memory: 512Mi
+            limits:
+              cpu: 500m
+              memory: 2048Mi
+---
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+  name: automationservice-hpa
+spec:
+  scaleTargetRef:
+    apiVersion: apps/v1
+    kind: Deployment
+    name: automationservice
+  minReplicas: 1
+  maxReplicas: 10
+  metrics:
+  - type: Resource
+    resource:
+      name: cpu
+      target:
+        type: Utilization
+        averageUtilization: 80
diff --git a/manifests/policyservice.yaml b/manifests/policyservice.yaml
deleted file mode 120000
index bb28f6e2c..000000000
--- a/manifests/policyservice.yaml
+++ /dev/null
@@ -1 +0,0 @@
-../src/policy/target/kubernetes/kubernetes.yml
\ No newline at end of file
diff --git a/manifests/policyservice.yaml b/manifests/policyservice.yaml
new file mode 100644
index 000000000..72da09eca
--- /dev/null
+++ b/manifests/policyservice.yaml
@@ -0,0 +1,129 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+  annotations:
+    app.quarkus.io/commit-id: 8065cee75be759e14af792737179537096de5e11
+    app.quarkus.io/build-timestamp: 2023-03-30 - 13:49:59 +0000
+  labels:
+    app.kubernetes.io/name: policyservice
+    app: policyservice
+  name: policyservice
+spec:
+  ports:
+    - name: metrics
+      port: 9192
+      targetPort: 8080
+    - name: grpc
+      port: 6060
+      targetPort: 6060
+  selector:
+    app.kubernetes.io/name: policyservice
+  type: ClusterIP
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  annotations:
+    app.quarkus.io/commit-id: 8065cee75be759e14af792737179537096de5e11
+    app.quarkus.io/build-timestamp: 2023-03-30 - 13:49:59 +0000
+  labels:
+    app: policyservice
+    app.kubernetes.io/name: policyservice
+  name: policyservice
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app.kubernetes.io/name: policyservice
+  template:
+    metadata:
+      annotations:
+        app.quarkus.io/commit-id: 8065cee75be759e14af792737179537096de5e11
+        app.quarkus.io/build-timestamp: 2023-03-30 - 13:49:59 +0000
+      labels:
+        app: policyservice
+        app.kubernetes.io/name: policyservice
+    spec:
+      containers:
+        - env:
+            - name: KUBERNETES_NAMESPACE
+              valueFrom:
+                fieldRef:
+                  fieldPath: metadata.namespace
+            - name: SERVICE_SERVICE_HOST
+              value: serviceservice
+            - name: CONTEXT_SERVICE_HOST
+              value: contextservice
+            - name: MONITORING_SERVICE_HOST
+              value: monitoringservice
+          image: labs.etsi.org:5050/tfs/controller/policy:0.1.0
+          imagePullPolicy: Always
+          livenessProbe:
+            failureThreshold: 3
+            httpGet:
+              path: /q/health/live
+              port: 8080
+              scheme: HTTP
+            initialDelaySeconds: 2
+            periodSeconds: 10
+            successThreshold: 1
+            timeoutSeconds: 10
+          name: policyservice
+          ports:
+            - containerPort: 8080
+              name: metrics
+              protocol: TCP
+            - containerPort: 6060
+              name: grpc-server
+              protocol: TCP
+          readinessProbe:
+            failureThreshold: 3
+            httpGet:
+              path: /q/health/ready
+              port: 8080
+              scheme: HTTP
+            initialDelaySeconds: 2
+            periodSeconds: 10
+            successThreshold: 1
+            timeoutSeconds: 10
+          resources:
+            requests:
+              cpu: 50m
+              memory: 512Mi
+            limits:
+              cpu: 500m
+              memory: 2048Mi
+---
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+  name: policyservice-hpa
+spec:
+  scaleTargetRef:
+    apiVersion: apps/v1
+    kind: Deployment
+    name: policyservice
+  minReplicas: 1
+  maxReplicas: 10
+  metrics:
+  - type: Resource
+    resource:
+      name: cpu
+      target:
+        type: Utilization
+        averageUtilization: 80
\ No newline at end of file
diff --git a/manifests/servicemonitors.yaml b/manifests/servicemonitors.yaml
index 06c3390f4..3d38d5960 100644
--- a/manifests/servicemonitors.yaml
+++ b/manifests/servicemonitors.yaml
@@ -243,3 +243,61 @@ spec:
     any: false
     matchNames:
     - tfs # namespace where the app is running
+---
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  namespace: monitoring # namespace where prometheus is running
+  name: tfs-policyservice-metric
+  labels:
+    app: policyservice
+    #release: prometheus
+    #release: prom  # name of the release 
+    # ( VERY IMPORTANT: You need to know the correct release name by viewing 
+    #   the servicemonitor of Prometheus itself: Without the correct name, 
+    #   Prometheus cannot identify the metrics of the Flask app as the target.)
+spec:
+  selector:
+    matchLabels:
+      # Target app service
+      #namespace: tfs
+      app: policyservice # same as above
+      #release: prometheus # same as above
+  endpoints:
+  - port: metrics # named port in target app
+    scheme: http
+    path: /q/metrics # path to scrape
+    interval: 5s # scrape interval
+  namespaceSelector:
+    any: false
+    matchNames:
+    - tfs # namespace where the app is running
+---
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  namespace: monitoring # namespace where prometheus is running
+  name: tfs-automationservice-metric
+  labels:
+    app: automationservice
+    #release: prometheus
+    #release: prom  # name of the release 
+    # ( VERY IMPORTANT: You need to know the correct release name by viewing 
+    #   the servicemonitor of Prometheus itself: Without the correct name, 
+    #   Prometheus cannot identify the metrics of the Flask app as the target.)
+spec:
+  selector:
+    matchLabels:
+      # Target app service
+      #namespace: tfs
+      app: automationservice # same as above
+      #release: prometheus # same as above
+  endpoints:
+  - port: metrics # named port in target app
+    scheme: http
+    path: /q/metrics # path to scrape
+    interval: 5s # scrape interval
+  namespaceSelector:
+    any: false
+    matchNames:
+    - tfs # namespace where the app is running
diff --git a/src/automation/pom.xml b/src/automation/pom.xml
index 2fd5fd263..7dfc3dac4 100644
--- a/src/automation/pom.xml
+++ b/src/automation/pom.xml
@@ -174,6 +174,11 @@
       <scope>test</scope>
     </dependency>
 
+    <dependency>
+      <groupId>io.quarkus</groupId>
+      <artifactId>quarkus-smallrye-metrics</artifactId>
+  </dependency>
+
   </dependencies>
 
   <build>
diff --git a/src/automation/src/main/java/eu/teraflow/automation/AutomationGatewayImpl.java b/src/automation/src/main/java/eu/teraflow/automation/AutomationGatewayImpl.java
index 51857bb3d..2f9054cd8 100644
--- a/src/automation/src/main/java/eu/teraflow/automation/AutomationGatewayImpl.java
+++ b/src/automation/src/main/java/eu/teraflow/automation/AutomationGatewayImpl.java
@@ -27,6 +27,10 @@ import io.quarkus.grpc.GrpcService;
 import io.smallrye.mutiny.Uni;
 import javax.inject.Inject;
 
+import org.eclipse.microprofile.metrics.MetricUnits;
+import org.eclipse.microprofile.metrics.annotation.Counted;
+import org.eclipse.microprofile.metrics.annotation.Timed;
+
 @GrpcService
 public class AutomationGatewayImpl implements AutomationGateway {
 
@@ -40,18 +44,24 @@ public class AutomationGatewayImpl implements AutomationGateway {
     }
 
     @Override
+    @Counted(name = "automation_ztpGetDeviceRole_counter")
+    @Timed(name = "automation_ztpGetDeviceRole_histogram", unit = MetricUnits.MILLISECONDS)
     public Uni<Automation.DeviceRole> ztpGetDeviceRole(Automation.DeviceRoleId request) {
         return Uni.createFrom()
                 .item(() -> Automation.DeviceRole.newBuilder().setDevRoleId(request).build());
     }
 
     @Override
+    @Counted(name = "automation_ztpGetDeviceRolesByDeviceId_counter")
+    @Timed(name = "automation_ztpGetDeviceRolesByDeviceId_histogram", unit = MetricUnits.MILLISECONDS)
     public Uni<Automation.DeviceRoleList> ztpGetDeviceRolesByDeviceId(
             ContextOuterClass.DeviceId request) {
         return Uni.createFrom().item(() -> Automation.DeviceRoleList.newBuilder().build());
     }
 
     @Override
+    @Counted(name = "automation_ztpAdd_counter")
+    @Timed(name = "automation_ztpAdd_histogram", unit = MetricUnits.MILLISECONDS)
     public Uni<Automation.DeviceRoleState> ztpAdd(Automation.DeviceRole request) {
         final var devRoleId = request.getDevRoleId().getDevRoleId().getUuid();
         final var deviceId = serializer.deserialize(request.getDevRoleId().getDevId());
@@ -63,6 +73,8 @@ public class AutomationGatewayImpl implements AutomationGateway {
     }
 
     @Override
+    @Counted(name = "automation_ztpUpdate_counter")
+    @Timed(name = "automation_ztpUpdate_histogram", unit = MetricUnits.MILLISECONDS)
     public Uni<DeviceRoleState> ztpUpdate(DeviceRoleConfig request) {
         final var devRoleId = request.getDevRole().getDevRoleId().getDevRoleId().getUuid();
         final var deviceId = serializer.deserialize(request.getDevRole().getDevRoleId().getDevId());
@@ -75,6 +87,8 @@ public class AutomationGatewayImpl implements AutomationGateway {
     }
 
     @Override
+    @Counted(name = "automation_ztpDelete_counter")
+    @Timed(name = "automation_ztpDelete_histogram", unit = MetricUnits.MILLISECONDS)
     public Uni<Automation.DeviceRoleState> ztpDelete(Automation.DeviceRole request) {
         final var devRoleId = request.getDevRoleId().getDevRoleId().getUuid();
         return automationService
@@ -84,6 +98,8 @@ public class AutomationGatewayImpl implements AutomationGateway {
     }
 
     @Override
+    @Counted(name = "automation_ztpDeleteAll_counter")
+    @Timed(name = "automation_ztpDeleteAll_histogram", unit = MetricUnits.MILLISECONDS)
     public Uni<Automation.DeviceDeletionResult> ztpDeleteAll(ContextOuterClass.Empty empty) {
         return Uni.createFrom().item(() -> Automation.DeviceDeletionResult.newBuilder().build());
     }
diff --git a/src/automation/target/kubernetes/kubernetes.yml b/src/automation/target/kubernetes/kubernetes.yml
index 4dacf3998..73e6b1d7b 100644
--- a/src/automation/target/kubernetes/kubernetes.yml
+++ b/src/automation/target/kubernetes/kubernetes.yml
@@ -27,8 +27,9 @@ spec:
     - name: grpc
       port: 5050
       targetPort: 5050
-    - name: http
-      port: 8080
+    - name: metrics
+      protocol: TCP
+      port: 9192
       targetPort: 8080
   selector:
     app.kubernetes.io/name: automationservice
@@ -84,7 +85,7 @@ spec:
               name: grpc
               protocol: TCP
             - containerPort: 8080
-              name: http
+              name: metrics
               protocol: TCP
           readinessProbe:
             failureThreshold: 3
@@ -96,3 +97,29 @@ spec:
             periodSeconds: 10
             successThreshold: 1
             timeoutSeconds: 10
+          resources:
+            requests:
+              cpu: 50m
+              memory: 512Mi
+            limits:
+              cpu: 500m
+              memory: 2048Mi
+---
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+  name: automationservice-hpa
+spec:
+  scaleTargetRef:
+    apiVersion: apps/v1
+    kind: Deployment
+    name: automationservice
+  minReplicas: 1
+  maxReplicas: 10
+  metrics:
+  - type: Resource
+    resource:
+      name: cpu
+      target:
+        type: Utilization
+        averageUtilization: 80
diff --git a/src/policy/pom.xml b/src/policy/pom.xml
index 6ea28421a..267006311 100644
--- a/src/policy/pom.xml
+++ b/src/policy/pom.xml
@@ -179,6 +179,11 @@
             <scope>test</scope>
         </dependency>
 
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-smallrye-metrics</artifactId>
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/src/policy/src/main/java/eu/teraflow/policy/PolicyGatewayImpl.java b/src/policy/src/main/java/eu/teraflow/policy/PolicyGatewayImpl.java
index c10e5dc8b..30e888d9f 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/PolicyGatewayImpl.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/PolicyGatewayImpl.java
@@ -20,6 +20,9 @@ import context.ContextOuterClass.ServiceId;
 import io.quarkus.grpc.GrpcService;
 import io.smallrye.mutiny.Uni;
 import javax.inject.Inject;
+import org.eclipse.microprofile.metrics.MetricUnits;
+import org.eclipse.microprofile.metrics.annotation.Counted;
+import org.eclipse.microprofile.metrics.annotation.Timed;
 import policy.Policy;
 import policy.Policy.PolicyRuleBasic;
 import policy.Policy.PolicyRuleDevice;
@@ -41,6 +44,8 @@ public class PolicyGatewayImpl implements PolicyGateway {
     }
 
     @Override
+    @Counted(name = "policy_policyAddService_counter")
+    @Timed(name = "policy_policyAddService_histogram", unit = MetricUnits.MILLISECONDS)
     public Uni<PolicyRuleState> policyAddService(PolicyRuleService request) {
         final var policyRuleService = serializer.deserialize(request);
 
@@ -51,6 +56,8 @@ public class PolicyGatewayImpl implements PolicyGateway {
     }
 
     @Override
+    @Counted(name = "policy_policyUpdateService_counter")
+    @Timed(name = "policy_policyUpdateService_histogram", unit = MetricUnits.MILLISECONDS)
     public Uni<PolicyRuleState> policyUpdateService(PolicyRuleService request) {
         final var policyRuleService = serializer.deserialize(request);
 
@@ -61,6 +68,8 @@ public class PolicyGatewayImpl implements PolicyGateway {
     }
 
     @Override
+    @Counted(name = "policy_policyAddDevice_counter")
+    @Timed(name = "policy_policyAddDevice_histogram", unit = MetricUnits.MILLISECONDS)
     public Uni<PolicyRuleState> policyAddDevice(PolicyRuleDevice request) {
         final var policyRuleDevice = serializer.deserialize(request);
 
@@ -71,6 +80,8 @@ public class PolicyGatewayImpl implements PolicyGateway {
     }
 
     @Override
+    @Counted(name = "policy_policyUpdateDevice_counter")
+    @Timed(name = "policy_policyUpdateDevice_histogram", unit = MetricUnits.MILLISECONDS)
     public Uni<PolicyRuleState> policyUpdateDevice(PolicyRuleDevice request) {
         final var policyRuleDevice = serializer.deserialize(request);
 
@@ -81,6 +92,8 @@ public class PolicyGatewayImpl implements PolicyGateway {
     }
 
     @Override
+    @Counted(name = "policy_policyDelete_counter")
+    @Timed(name = "policy_policyDelete_histogram", unit = MetricUnits.MILLISECONDS)
     public Uni<PolicyRuleState> policyDelete(PolicyRuleId request) {
         final var policyRuleId = serializer.deserialize(request);
 
@@ -88,6 +101,8 @@ public class PolicyGatewayImpl implements PolicyGateway {
     }
 
     @Override
+    @Counted(name = "policy_getPolicyService_counter")
+    @Timed(name = "policy_getPolicyService_histogram", unit = MetricUnits.MILLISECONDS)
     public Uni<PolicyRuleService> getPolicyService(PolicyRuleId request) {
         final var policyRuleBasic = PolicyRuleBasic.newBuilder().setPolicyRuleId(request).build();
 
@@ -96,6 +111,8 @@ public class PolicyGatewayImpl implements PolicyGateway {
     }
 
     @Override
+    @Counted(name = "policy_getPolicyDevice_counter")
+    @Timed(name = "policy_getPolicyDevice_histogram", unit = MetricUnits.MILLISECONDS)
     public Uni<PolicyRuleDevice> getPolicyDevice(PolicyRuleId request) {
         final var policyRuleBasic = PolicyRuleBasic.newBuilder().setPolicyRuleId(request).build();
 
@@ -104,6 +121,8 @@ public class PolicyGatewayImpl implements PolicyGateway {
     }
 
     @Override
+    @Counted(name = "policy_getPolicyByServiceId_counter")
+    @Timed(name = "policy_getPolicyByServiceId_histogram", unit = MetricUnits.MILLISECONDS)
     public Uni<PolicyRuleServiceList> getPolicyByServiceId(ServiceId request) {
         return Uni.createFrom().item(() -> Policy.PolicyRuleServiceList.newBuilder().build());
     }
diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml
index 40516e5cc..72da09eca 100644
--- a/src/policy/target/kubernetes/kubernetes.yml
+++ b/src/policy/target/kubernetes/kubernetes.yml
@@ -17,16 +17,16 @@ apiVersion: v1
 kind: Service
 metadata:
   annotations:
-    app.quarkus.io/commit-id: e369fc6b4de63303f91e1fd3de0b6a591a86c0f5
-    app.quarkus.io/build-timestamp: 2022-11-18 - 12:56:37 +0000
+    app.quarkus.io/commit-id: 8065cee75be759e14af792737179537096de5e11
+    app.quarkus.io/build-timestamp: 2023-03-30 - 13:49:59 +0000
   labels:
     app.kubernetes.io/name: policyservice
     app: policyservice
   name: policyservice
 spec:
   ports:
-    - name: http
-      port: 8080
+    - name: metrics
+      port: 9192
       targetPort: 8080
     - name: grpc
       port: 6060
@@ -39,8 +39,8 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   annotations:
-    app.quarkus.io/commit-id: e369fc6b4de63303f91e1fd3de0b6a591a86c0f5
-    app.quarkus.io/build-timestamp: 2022-11-22 - 14:10:01 +0000
+    app.quarkus.io/commit-id: 8065cee75be759e14af792737179537096de5e11
+    app.quarkus.io/build-timestamp: 2023-03-30 - 13:49:59 +0000
   labels:
     app: policyservice
     app.kubernetes.io/name: policyservice
@@ -53,8 +53,8 @@ spec:
   template:
     metadata:
       annotations:
-        app.quarkus.io/commit-id: e369fc6b4de63303f91e1fd3de0b6a591a86c0f5
-        app.quarkus.io/build-timestamp: 2022-11-22 - 14:10:01 +0000
+        app.quarkus.io/commit-id: 8065cee75be759e14af792737179537096de5e11
+        app.quarkus.io/build-timestamp: 2023-03-30 - 13:49:59 +0000
       labels:
         app: policyservice
         app.kubernetes.io/name: policyservice
@@ -65,12 +65,12 @@ spec:
               valueFrom:
                 fieldRef:
                   fieldPath: metadata.namespace
-            - name: MONITORING_SERVICE_HOST
-              value: monitoringservice
-            - name: CONTEXT_SERVICE_HOST
-              value: contextservice
             - name: SERVICE_SERVICE_HOST
               value: serviceservice
+            - name: CONTEXT_SERVICE_HOST
+              value: contextservice
+            - name: MONITORING_SERVICE_HOST
+              value: monitoringservice
           image: labs.etsi.org:5050/tfs/controller/policy:0.1.0
           imagePullPolicy: Always
           livenessProbe:
@@ -86,10 +86,10 @@ spec:
           name: policyservice
           ports:
             - containerPort: 8080
-              name: http
+              name: metrics
               protocol: TCP
             - containerPort: 6060
-              name: grpc
+              name: grpc-server
               protocol: TCP
           readinessProbe:
             failureThreshold: 3
@@ -101,3 +101,29 @@ spec:
             periodSeconds: 10
             successThreshold: 1
             timeoutSeconds: 10
+          resources:
+            requests:
+              cpu: 50m
+              memory: 512Mi
+            limits:
+              cpu: 500m
+              memory: 2048Mi
+---
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+  name: policyservice-hpa
+spec:
+  scaleTargetRef:
+    apiVersion: apps/v1
+    kind: Deployment
+    name: policyservice
+  minReplicas: 1
+  maxReplicas: 10
+  metrics:
+  - type: Resource
+    resource:
+      name: cpu
+      target:
+        type: Utilization
+        averageUtilization: 80
\ No newline at end of file
-- 
GitLab