Skip to content

Commit

Permalink
Expose link between organization and billing-entity as a Prometheus m…
Browse files Browse the repository at this point in the history
…etric (#104)
  • Loading branch information
bastjan authored Feb 23, 2023
1 parent 122ec44 commit 57168d3
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 0 deletions.
6 changes: 6 additions & 0 deletions controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/healthz"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
"sigs.k8s.io/controller-runtime/pkg/metrics"
"sigs.k8s.io/controller-runtime/pkg/webhook"

"github.com/spf13/cobra"
Expand Down Expand Up @@ -107,6 +108,11 @@ func setupManager(usernamePrefix, rolePrefix string, memberRoles []string, beRef
return nil, err
}

metrics.Registry.MustRegister(
&controllers.OrgBillingRefLinkMetric{
Client: mgr.GetClient(),
})

ur := &controllers.UserReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Expand Down
53 changes: 53 additions & 0 deletions controllers/org_billing_ref_link_metric.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package controllers

import (
"context"

"github.com/prometheus/client_golang/prometheus"
"sigs.k8s.io/controller-runtime/pkg/client"

orgv1 "github.com/appuio/control-api/apis/organization/v1"
)

//+kubebuilder:rbac:groups="rbac.appuio.io",resources=organizations,verbs=get;list;watch
//+kubebuilder:rbac:groups="organization.appuio.io",resources=organizations,verbs=get;list;watch

var desc = prometheus.NewDesc(
"control_api_organization_billing_entity_ref",
"Link between an organization and a billing entity",
[]string{"organization", "billing_entity"},
nil,
)

// OrgBillingRefLinkMetric is a Prometheus collector that exposes the link between an organization and a billing entity.
type OrgBillingRefLinkMetric struct {
client.Client
}

var _ prometheus.Collector = &OrgBillingRefLinkMetric{}

// Describe implements prometheus.Collector.
// Sends the static description of the metric to the provided channel.
func (o *OrgBillingRefLinkMetric) Describe(ch chan<- *prometheus.Desc) {
ch <- desc
}

// Collect implements prometheus.Collector.
// Sends a metric for each organization and its billing entity to the provided channel.
func (o *OrgBillingRefLinkMetric) Collect(ch chan<- prometheus.Metric) {
orgs := &orgv1.OrganizationList{}
if err := o.List(context.Background(), orgs); err != nil {
ch <- prometheus.NewInvalidMetric(desc, err)
return
}

for _, org := range orgs.Items {
ch <- prometheus.MustNewConstMetric(
desc,
prometheus.GaugeValue,
1,
org.Name,
org.Spec.BillingEntityRef,
)
}
}
41 changes: 41 additions & 0 deletions controllers/org_billing_ref_link_metric_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package controllers_test

import (
"strings"
"testing"

"github.com/prometheus/client_golang/prometheus/testutil"
"github.com/stretchr/testify/require"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

orgv1 "github.com/appuio/control-api/apis/organization/v1"
"github.com/appuio/control-api/controllers"
)

func TestOrgBillingRefLinkMetric(t *testing.T) {
c := prepareTest(t, &orgv1.Organization{
ObjectMeta: metav1.ObjectMeta{
Name: "test-org",
},
Spec: orgv1.OrganizationSpec{
BillingEntityRef: "test-billing-entity",
},
}, &orgv1.Organization{
ObjectMeta: metav1.ObjectMeta{
Name: "blub-org",
},
Spec: orgv1.OrganizationSpec{
BillingEntityRef: "be-1734",
},
})

require.NoError(t,
testutil.CollectAndCompare(&controllers.OrgBillingRefLinkMetric{c}, strings.NewReader(`
# HELP control_api_organization_billing_entity_ref Link between an organization and a billing entity
# TYPE control_api_organization_billing_entity_ref gauge
control_api_organization_billing_entity_ref{billing_entity="be-1734",organization="blub-org"} 1
control_api_organization_billing_entity_ref{billing_entity="test-billing-entity",organization="test-org"} 1
`),
"control_api_organization_billing_entity_ref"),
)
}

0 comments on commit 57168d3

Please sign in to comment.