Skip to content

ManagedMetric value does not reflect number of resources in multi-version API scenarioΒ #91

@christophrj

Description

@christophrj

What happened:

The ManagedMetric value does not reflect the correct number of resources when monitoring multi-version APIs without targeting a specific version. See the following scenario where we use provider-kubernetes to create a couple of ConfigMaps, two with API version v1alpha2 and one with API version v1alpha1.

NAME         KIND        PROVIDERCONFIG        SYNCED   READY   AGE
bar-alpha1   ConfigMap   kubernetes-provider   True     True    9m29s
bar-alpha2   ConfigMap   kubernetes-provider   True     True    9m29s
foo-alpha2   ConfigMap   kubernetes-provider   True     True    9m29s

Now we define 3 ManagedMetrics that target kubernetes objects, two of them fully qualified with GVK and one with GK only, leaving out the version:

NAME                          READY   VALUE   OBSERVED
kubernetes-objects            True    6       5s
kubernetes-objects-v1alpha1   True    3       5s
kubernetes-objects-v1alpha2   True    3       5s

Right now the actual number of objects gets multiplied by the number of servable versions instead of grouping them by GK in the unqualified version case.

What you expected to happen:

Since both versions are servable by the API server, all three metrics should report 3 kubernetes objects:

NAME                          READY   VALUE   OBSERVED
kubernetes-objects            True    3       5s
kubernetes-objects-v1alpha1   True    3       5s
kubernetes-objects-v1alpha2   True    3       5s

How to reproduce it (as minimally and precisely as possible):

apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-kubernetes
spec:
  package: xpkg.upbound.io/upbound/provider-kubernetes:v0.16.0
---
apiVersion: kubernetes.crossplane.io/v1alpha1
kind: ProviderConfig
metadata:
  name: kubernetes-provider
  namespace: default
spec:
  credentials:
    source: InjectedIdentity
---
apiVersion: kubernetes.crossplane.io/v1alpha2
kind: Object
metadata:
  name: foo-alpha2
  namespace: default
spec:
  forProvider:
    manifest:
      apiVersion: v1
      kind: ConfigMap
      metadata:
        namespace: default
  providerConfigRef:
    name: kubernetes-provider
---
apiVersion: kubernetes.crossplane.io/v1alpha2
kind: Object
metadata:
  name: bar-alpha2
  namespace: default
spec:
  forProvider:
    manifest:
      apiVersion: v1
      kind: ConfigMap
      metadata:
        namespace: default
  providerConfigRef:
    name: kubernetes-provider
---
---
apiVersion: kubernetes.crossplane.io/v1alpha1
kind: Object
metadata:
  name: bar-alpha1
  namespace: default
spec:
  forProvider:
    manifest:
      apiVersion: v1
      kind: ConfigMap
      metadata:
        namespace: default
  providerConfigRef:
    name: kubernetes-provider
---
apiVersion: metrics.openmcp.cloud/v1alpha1
kind: ManagedMetric
metadata:
  name: kubernetes-objects
spec:
  name: kubernetes-objects
  target:
    kind: Object
    group: kubernetes.crossplane.io
  interval: "15s"
---
apiVersion: metrics.openmcp.cloud/v1alpha1
kind: ManagedMetric
metadata:
  name: kubernetes-objects-v1alpha1
spec:
  name: kubernetes-objects-v1alpha1
  target:
    kind: Object
    group: kubernetes.crossplane.io
    version: v1alpha1
  interval: "15s"
---
apiVersion: metrics.openmcp.cloud/v1alpha1
kind: ManagedMetric
metadata:
  name: kubernetes-objects-v1alpha2
spec:
  name: kubernetes-objects-v1alpha2
  target:
    kind: Object
    group: kubernetes.crossplane.io
    version: v1alpha2
  interval: "15s"

Anything else we need to know:

Environment:

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions