diff --git a/class/defaults.yml b/class/defaults.yml
index a59d744..c213459 100644
--- a/class/defaults.yml
+++ b/class/defaults.yml
@@ -385,7 +385,7 @@ parameters:
               cloud_provider: xelon
               role: app
               vshn_service_level: zero
-        instance_id_pattern: 'ocp-vcpu-%(cluster_id)s'
+        instance_id_pattern: 'ocp-vcpu-%(cluster_id)s-%(role)s'
         item_group_description_pattern: 'APPUiO Managed OpenShift - Cluster: %(cluster_id)s'
         unit_id: 'uom_uom_49_440b0fa7' #vCPU-Hour
         query_pattern: |
@@ -393,11 +393,11 @@ parameters:
           # Max values over one hour.
           max_over_time(
             # Sum the vCPUs by cluster
-            sum by(cluster_id) (
+            sum by(cluster_id, role) (
                 # Get the node vCPUs
                 node_cpu_info
                 # Limit to worker nodes only
-                * on (cluster_id, instance) group_left() (
+                * on (cluster_id, instance) group_left(role) (
                     # node_cpu_info and kube_node_role use different labels to identify the node.
                     label_join(kube_node_role{role="%(role)s"}, "instance", "", "node")
                 )
diff --git a/tests/golden/defaults/appuio-reporting/appuio-reporting/11_backfill.yaml b/tests/golden/defaults/appuio-reporting/appuio-reporting/11_backfill.yaml
index 7e41988..f4b3d5e 100644
--- a/tests/golden/defaults/appuio-reporting/appuio-reporting/11_backfill.yaml
+++ b/tests/golden/defaults/appuio-reporting/appuio-reporting/11_backfill.yaml
@@ -1418,11 +1418,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="storage"}, "instance", "", "node")
                           )
@@ -1434,7 +1434,7 @@ spec:
                         vshn_service_level="best_effort",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -1521,11 +1521,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="storage"}, "instance", "", "node")
                           )
@@ -1537,7 +1537,7 @@ spec:
                         vshn_service_level="guaranteed_availability",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -1624,11 +1624,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="storage"}, "instance", "", "node")
                           )
@@ -1640,7 +1640,7 @@ spec:
                         vshn_service_level="premium",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -1727,11 +1727,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="storage"}, "instance", "", "node")
                           )
@@ -1743,7 +1743,7 @@ spec:
                         vshn_service_level="professional",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -1830,11 +1830,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="storage"}, "instance", "", "node")
                           )
@@ -1846,7 +1846,7 @@ spec:
                         vshn_service_level="standard",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -1933,11 +1933,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -1949,7 +1949,7 @@ spec:
                         vshn_service_level="best_effort",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -2036,11 +2036,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -2052,7 +2052,7 @@ spec:
                         vshn_service_level="guaranteed_availability",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -2139,11 +2139,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -2155,7 +2155,7 @@ spec:
                         vshn_service_level="premium",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -2242,11 +2242,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -2258,7 +2258,7 @@ spec:
                         vshn_service_level="professional",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -2345,11 +2345,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -2361,7 +2361,7 @@ spec:
                         vshn_service_level="standard",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -2448,11 +2448,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -2464,7 +2464,7 @@ spec:
                         vshn_service_level="zero",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -2551,11 +2551,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="storage"}, "instance", "", "node")
                           )
@@ -2567,7 +2567,7 @@ spec:
                         vshn_service_level="best_effort",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -2654,11 +2654,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="storage"}, "instance", "", "node")
                           )
@@ -2670,7 +2670,7 @@ spec:
                         vshn_service_level="guaranteed_availability",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -2757,11 +2757,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="storage"}, "instance", "", "node")
                           )
@@ -2773,7 +2773,7 @@ spec:
                         vshn_service_level="premium",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -2860,11 +2860,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="storage"}, "instance", "", "node")
                           )
@@ -2876,7 +2876,7 @@ spec:
                         vshn_service_level="professional",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -2963,11 +2963,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="storage"}, "instance", "", "node")
                           )
@@ -2979,7 +2979,7 @@ spec:
                         vshn_service_level="standard",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -3066,11 +3066,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -3082,7 +3082,7 @@ spec:
                         vshn_service_level="best_effort",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -3169,11 +3169,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -3185,7 +3185,7 @@ spec:
                         vshn_service_level="guaranteed_availability",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -3272,11 +3272,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -3288,7 +3288,7 @@ spec:
                         vshn_service_level="premium",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -3375,11 +3375,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -3391,7 +3391,7 @@ spec:
                         vshn_service_level="professional",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -3478,11 +3478,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -3494,7 +3494,7 @@ spec:
                         vshn_service_level="standard",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -3581,11 +3581,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -3597,7 +3597,7 @@ spec:
                         vshn_service_level="zero",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -3684,11 +3684,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -3700,7 +3700,7 @@ spec:
                         vshn_service_level="best_effort",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -3787,11 +3787,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -3803,7 +3803,7 @@ spec:
                         vshn_service_level="guaranteed_availability",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -3890,11 +3890,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -3906,7 +3906,7 @@ spec:
                         vshn_service_level="premium",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -3993,11 +3993,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -4009,7 +4009,7 @@ spec:
                         vshn_service_level="professional",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -4096,11 +4096,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -4112,7 +4112,7 @@ spec:
                         vshn_service_level="standard",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -4199,11 +4199,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -4215,7 +4215,7 @@ spec:
                         vshn_service_level="zero",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -4302,11 +4302,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -4318,7 +4318,7 @@ spec:
                         vshn_service_level="best_effort",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -4405,11 +4405,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -4421,7 +4421,7 @@ spec:
                         vshn_service_level="guaranteed_availability",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -4508,11 +4508,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -4524,7 +4524,7 @@ spec:
                         vshn_service_level="premium",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -4611,11 +4611,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -4627,7 +4627,7 @@ spec:
                         vshn_service_level="professional",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -4714,11 +4714,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -4730,7 +4730,7 @@ spec:
                         vshn_service_level="standard",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -4817,11 +4817,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -4833,7 +4833,7 @@ spec:
                         vshn_service_level="zero",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -4920,11 +4920,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -4936,7 +4936,7 @@ spec:
                         vshn_service_level="best_effort",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -5023,11 +5023,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -5039,7 +5039,7 @@ spec:
                         vshn_service_level="guaranteed_availability",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -5126,11 +5126,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -5142,7 +5142,7 @@ spec:
                         vshn_service_level="premium",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -5229,11 +5229,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -5245,7 +5245,7 @@ spec:
                         vshn_service_level="professional",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -5332,11 +5332,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -5348,7 +5348,7 @@ spec:
                         vshn_service_level="standard",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -5435,11 +5435,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -5451,7 +5451,7 @@ spec:
                         vshn_service_level="zero",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -5538,11 +5538,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -5554,7 +5554,7 @@ spec:
                         vshn_service_level="best_effort",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -5641,11 +5641,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -5657,7 +5657,7 @@ spec:
                         vshn_service_level="guaranteed_availability",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -5744,11 +5744,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -5760,7 +5760,7 @@ spec:
                         vshn_service_level="premium",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -5847,11 +5847,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -5863,7 +5863,7 @@ spec:
                         vshn_service_level="professional",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -5950,11 +5950,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -5966,7 +5966,7 @@ spec:
                         vshn_service_level="standard",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -6053,11 +6053,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -6069,7 +6069,7 @@ spec:
                         vshn_service_level="zero",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -6156,11 +6156,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -6172,7 +6172,7 @@ spec:
                         vshn_service_level="best_effort",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -6259,11 +6259,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -6275,7 +6275,7 @@ spec:
                         vshn_service_level="guaranteed_availability",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -6362,11 +6362,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -6378,7 +6378,7 @@ spec:
                         vshn_service_level="premium",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -6465,11 +6465,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -6481,7 +6481,7 @@ spec:
                         vshn_service_level="professional",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -6568,11 +6568,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -6584,7 +6584,7 @@ spec:
                         vshn_service_level="standard",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift
@@ -6671,11 +6671,11 @@ spec:
                     # Max values over one hour.
                     max_over_time(
                       # Sum the vCPUs by cluster
-                      sum by(cluster_id) (
+                      sum by(cluster_id, role) (
                           # Get the node vCPUs
                           node_cpu_info
                           # Limit to worker nodes only
-                          * on (cluster_id, instance) group_left() (
+                          * on (cluster_id, instance) group_left(role) (
                               # node_cpu_info and kube_node_role use different labels to identify the node.
                               label_join(kube_node_role{role="app"}, "instance", "", "node")
                           )
@@ -6687,7 +6687,7 @@ spec:
                         vshn_service_level="zero",
                     }
                 - name: AR_INSTANCE_JSONNET
-                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s"
+                  value: local labels = std.extVar("labels"); "ocp-vcpu-%(cluster_id)s-%(role)s"
                     % labels
                 - name: AR_ITEM_GROUP_DESCRIPTION_JSONNET
                   value: 'local labels = std.extVar("labels"); "APPUiO Managed OpenShift