PDLC ACM CR bug on Gathering

Description

The CODECO application CR (codecoapp) does not use the avgServiceFailure value that PDLC tries to gather.

Traceback (most recent call last):
  File "/app/server.py", line 57, in <module>
    cluster_sample = get_sample()
                     ^^^^^^^^^^^^
  File "/app/k8s_calling/sample.py", line 365, in get_sample
    cluster_sample = get_acm_information(cluster_sample)          # Get the ACM information
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/k8s_calling/sample.py", line 110, in get_acm_information
    pod_obj["pod_failure"] = pod["avgServiceFailure"]
                             ~~~^^^^^^^^^^^^^^^^^^^^^
KeyError: 'avgServiceFailure'

Example of CODECO Application CR as JSON:

{'apiVersion': 'codeco.he-codeco.eu/v1alpha1', 'items': [{'apiVersion': 'codeco.he-codeco.eu/v1alpha1', 'kind': 'CodecoApp', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{"apiVersion":"codeco.he-codeco.eu/v1alpha1","kind":"CodecoApp","metadata":{"annotations":{},"generation":1,"name":"codecoappinstance3","namespace":"he-codeco-acm","resourceVersion":"1456","uid":"5c948d7e-43d6-425b-b0b2-76402b606e07"},"spec":{"appEnergyLimit":"20","appFailureTolerance":"","appName":"acm-swm-app","codecoapp-msspec":[{"nwbandwidth":"1.2","nwlatency":"3","podspec":{"containers":[{"image":"quay.io/skupper/hello-world-backend:latest","name":"skupper-backend","ports":[{"containerPort":8080,"name":"skupper-backend","protocol":"TCP"}],"resources":{"limits":{"cpu":"2","memory":"4Gi"}}}]},"serviceChannels":[{"advancedChannelSettings":{"frameSize":"100","maxDelay":"1","minBandwidth":"5","sendInterval":"10"},"channelName":"frontend","otherService":{"appName":"acm-swm-app","port":9090,"serviceName":"front-end"}}],"serviceName":"backend"},{"nwbandwidth":"1.2","nwlatency":"3","podspec":{"containers":[{"image":"quay.io/dekelly/frontend-app:v0.0.2","name":"front-end","ports":[{"containerPort":8080,"protocol":"TCP"}]}]},"serviceChannels":[{"advancedChannelSettings":{"frameSize":"100","maxDelay":"1","minBandwidth":"5","sendInterval":"10"},"channelName":"backend","otherService":{"appName":"acm-swm-app","port":8080,"serviceName":"backend"}}],"serviceName":"front-end"}],"complianceClass":"High","qosClass":"Gold","securityClass":"Good"}}\n'}, 'creationTimestamp': '2024-10-16T07:51:05Z', 'generation': 1, 'managedFields': [{'apiVersion': 'codeco.he-codeco.eu/v1alpha1', 'fieldsType': 'FieldsV1', 'fieldsV1': {'f:metadata': {'f:annotations': {'.': {}, 'f:kubectl.kubernetes.io/last-applied-configuration': {}}}, 'f:spec': {'.': {}, 'f:appEnergyLimit': {}, 'f:appFailureTolerance': {}, 'f:appName': {}, 'f:codecoapp-msspec': {}, 'f:complianceClass': {}, 'f:qosClass': {}, 'f:securityClass': {}}}, 'manager': 'kubectl-client-side-apply', 'operation': 'Update', 'time': '2024-10-16T07:51:05Z'}, {'apiVersion': 'codeco.he-codeco.eu/v1alpha1', 'fieldsType': 'FieldsV1', 'fieldsV1': {'f:status': {'.': {}, 'f:appMetrics': {'.': {}, 'f:numPods': {}, 'f:serviceMetrics': {}}, 'f:nodeMetrics': {}}}, 'manager': 'manager', 'operation': 'Update', 'subresource': 'status', 'time': '2024-10-16T08:49:08Z'}], 'name': 'codecoappinstance3', 'namespace': 'he-codeco-acm', 'resourceVersion': '19821', 'uid': 'db063007-e505-473b-a068-32ab5db586a4'}, 'spec': {'appEnergyLimit': '20', 'appFailureTolerance': '', 'appName': 'acm-swm-app', 'codecoapp-msspec': [{'nwbandwidth': '1.2', 'nwlatency': '3', 'podspec': {'containers': [{'image': 'quay.io/skupper/hello-world-backend:latest', 'name': 'skupper-backend', 'ports': [{'containerPort': 8080, 'name': 'skupper-backend', 'protocol': 'TCP'}], 'resources': {'limits': {'cpu': '2', 'memory': '4Gi'}}}]}, 'serviceChannels': [{'advancedChannelSettings': {'frameSize': '100', 'maxDelay': '1', 'minBandwidth': '5', 'sendInterval': '10'}, 'channelName': 'frontend', 'otherService': {'appName': 'acm-swm-app', 'port': 9090, 'serviceName': 'front-end'}}], 'serviceName': 'backend'}, {'nwbandwidth': '1.2', 'nwlatency': '3', 'podspec': {'containers': [{'image': 'quay.io/dekelly/frontend-app:v0.0.2', 'name': 'front-end', 'ports': [{'containerPort': 8080, 'protocol': 'TCP'}]}]}, 'serviceChannels': [{'advancedChannelSettings': {'frameSize': '100', 'maxDelay': '1', 'minBandwidth': '5', 'sendInterval': '10'}, 'channelName': 'backend', 'otherService': {'appName': 'acm-swm-app', 'port': 8080, 'serviceName': 'backend'}}], 'serviceName': 'front-end'}], 'complianceClass': 'High', 'qosClass': 'Gold', 'securityClass': 'Good'}, 'status': {'appMetrics': {'numPods': 2, 'serviceMetrics': [{'avgServiceCpu': '0.002035', 'avgServiceMemory': '20209664.000000', 'clusterName': 'codeco-cluster-1', 'nodeName': 'kind-control-plane', 'podName': 'acm-swm-app-front-end', 'serviceName': 'backend'}, {'avgServiceCpu': '0.001203', 'avgServiceMemory': '17732949.333333', 'clusterName': 'codeco-cluster-1', 'nodeName': 'kind-control-plane', 'podName': 'acm-swm-app-backend', 'serviceName': 'front-end'}]}, 'nodeMetrics': [{'avgNodeCpu': '0.148639', 'avgNodeMemory': '130049856512.000000', 'nodeName': 'kind-control-plane'}, {'avgNodeCpu': '0.146958', 'avgNodeMemory': '130047940608.000000', 'nodeName': 'c2'}, {'avgNodeCpu': '0.150347', 'avgNodeMemory': '129995383808.000000', 'nodeName': 'c1'}]}}], 'kind': 'CodecoAppList', 'metadata': {'continue': '', 'resourceVersion': '19872'}}

Example of CODECO Application CR as YAML:

apiVersion: codeco.he-codeco.eu/v1alpha1
kind: CodecoApp
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"codeco.he-codeco.eu/v1alpha1","kind":"CodecoApp","metadata":{"annotations":{},"generation":1,"name":"codecoappinstance3","namespace":"he-codeco-acm","resourceVersion":"1456","uid":"5c948d7e-43d6-425b-b0b2-76402b606e07"},"spec":{"appEnergyLimit":"20","appFailureTolerance":"","appName":"acm-swm-app","codecoapp-msspec":[{"nwbandwidth":"1.2","nwlatency":"3","podspec":{"containers":[{"image":"quay.io/skupper/hello-world-backend:latest","name":"skupper-backend","ports":[{"containerPort":8080,"name":"skupper-backend","protocol":"TCP"}],"resources":{"limits":{"cpu":"2","memory":"4Gi"}}}]},"serviceChannels":[{"advancedChannelSettings":{"frameSize":"100","maxDelay":"1","minBandwidth":"5","sendInterval":"10"},"channelName":"frontend","otherService":{"appName":"acm-swm-app","port":9090,"serviceName":"front-end"}}],"serviceName":"backend"},{"nwbandwidth":"1.2","nwlatency":"3","podspec":{"containers":[{"image":"quay.io/dekelly/frontend-app:v0.0.2","name":"front-end","ports":[{"containerPort":8080,"protocol":"TCP"}]}]},"serviceChannels":[{"advancedChannelSettings":{"frameSize":"100","maxDelay":"1","minBandwidth":"5","sendInterval":"10"},"channelName":"backend","otherService":{"appName":"acm-swm-app","port":8080,"serviceName":"backend"}}],"serviceName":"front-end"}],"complianceClass":"High","qosClass":"Gold","securityClass":"Good"}}
  creationTimestamp: "2024-10-16T07:51:05Z"
  generation: 1
  managedFields:
  - apiVersion: codeco.he-codeco.eu/v1alpha1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:kubectl.kubernetes.io/last-applied-configuration: {}
      f:spec:
        .: {}
        f:appEnergyLimit: {}
        f:appFailureTolerance: {}
        f:appName: {}
        f:codecoapp-msspec: {}
        f:complianceClass: {}
        f:qosClass: {}
        f:securityClass: {}
    manager: kubectl-client-side-apply
    operation: Update
    time: "2024-10-16T07:51:05Z"
  - apiVersion: codeco.he-codeco.eu/v1alpha1
    fieldsType: FieldsV1
    fieldsV1:
      f:status:
        .: {}
        f:appMetrics:
          .: {}
          f:numPods: {}
          f:serviceMetrics: {}
        f:nodeMetrics: {}
    manager: manager
    operation: Update
    subresource: status
    time: "2024-10-16T09:08:25Z"
  name: codecoappinstance3
  namespace: he-codeco-acm
  resourceVersion: "23770"
  uid: db063007-e505-473b-a068-32ab5db586a4
spec:
  appEnergyLimit: "20"
  appFailureTolerance: ""
  appName: acm-swm-app
  codecoapp-msspec:
  - nwbandwidth: "1.2"
    nwlatency: "3"
    podspec:
      containers:
      - image: quay.io/skupper/hello-world-backend:latest
        name: skupper-backend
        ports:
        - containerPort: 8080
          name: skupper-backend
          protocol: TCP
        resources:
          limits:
            cpu: "2"
            memory: 4Gi
    serviceChannels:
    - advancedChannelSettings:
        frameSize: "100"
        maxDelay: "1"
        minBandwidth: "5"
        sendInterval: "10"
      channelName: frontend
      otherService:
        appName: acm-swm-app
        port: 9090
        serviceName: front-end
    serviceName: backend
  - nwbandwidth: "1.2"
    nwlatency: "3"
    podspec:
      containers:
      - image: quay.io/dekelly/frontend-app:v0.0.2
        name: front-end
        ports:
        - containerPort: 8080
          protocol: TCP
    serviceChannels:
    - advancedChannelSettings:
        frameSize: "100"
        maxDelay: "1"
        minBandwidth: "5"
        sendInterval: "10"
      channelName: backend
      otherService:
        appName: acm-swm-app
        port: 8080
        serviceName: backend
    serviceName: front-end
  complianceClass: High
  qosClass: Gold
  securityClass: Good
status:
  appMetrics:
    numPods: 2
    serviceMetrics:
    - avgServiceCpu: "0.001424"
      avgServiceMemory: "20209664.000000"
      clusterName: codeco-cluster-1
      nodeName: kind-control-plane
      podName: acm-swm-app-front-end
      serviceName: backend
    - avgServiceCpu: "0.001437"
      avgServiceMemory: "17732949.333333"
      clusterName: codeco-cluster-1
      nodeName: kind-control-plane
      podName: acm-swm-app-backend
      serviceName: front-end
  nodeMetrics:
  - avgNodeCpu: "0.149440"
    avgNodeMemory: "130114941952.000000"
    nodeName: kind-control-plane
  - avgNodeCpu: "0.149463"
    avgNodeMemory: "130070980608.000000"
    nodeName: c2
  - avgNodeCpu: "0.150088"
    avgNodeMemory: "130128721920.000000"
    nodeName: c1

Possible Solution

Check if the metric is used by PDLC; if not, remove it from the gathering or give it a default value (PDLC could also try to gather it itself—not recommended)

Edited by Panagiotis Karamolegkos