Skip to content

Commit

Permalink
Merge pull request #183 from appuio/feat/info-metric
Browse files Browse the repository at this point in the history
Add appuio_control_organization_info metric
  • Loading branch information
HappyTetrahedron authored Dec 8, 2023
2 parents 5c79acf + 1f808f7 commit 1f9af43
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 0 deletions.
4 changes: 4 additions & 0 deletions controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,10 @@ func setupManager(
&controllers.OrgBillingRefLinkMetric{
Client: mgr.GetClient(),
})
metrics.Registry.MustRegister(
&controllers.OrgInfoMetric{
Client: mgr.GetClient(),
})
metrics.Registry.MustRegister(
&controllers.EmailPendingMetric{
Client: mgr.GetClient(),
Expand Down
54 changes: 54 additions & 0 deletions controllers/org_info_metric.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
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 orgInfoMetricDesc = prometheus.NewDesc(
"appuio_control_organization_info",
"Information about APPUiO Cloud organizations",
[]string{"organization", "billing_entity", "sales_order"},
nil,
)

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

var _ prometheus.Collector = &OrgInfoMetric{}

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

// Collect implements prometheus.Collector.
// Sends a metric for each organization and its billing entity to the provided channel.
func (o *OrgInfoMetric) 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(
orgInfoMetricDesc,
prometheus.GaugeValue,
1,
org.Name,
org.Spec.BillingEntityRef,
org.Status.SaleOrderName,
)
}
}
52 changes: 52 additions & 0 deletions controllers/org_info_metric_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
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 TestOrgInfoMetric(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",
},
}, &orgv1.Organization{
ObjectMeta: metav1.ObjectMeta{
Name: "foo-org",
},
Spec: orgv1.OrganizationSpec{
BillingEntityRef: "be-234",
},
Status: orgv1.OrganizationStatus{
SaleOrderName: "SO9999",
},
})

require.NoError(t,
testutil.CollectAndCompare(&controllers.OrgInfoMetric{c}, strings.NewReader(`
# HELP appuio_control_organization_info Information about APPUiO Cloud organizations
# TYPE appuio_control_organization_info gauge
appuio_control_organization_info{billing_entity="be-1734",organization="blub-org",sales_order=""} 1
appuio_control_organization_info{billing_entity="be-234",organization="foo-org",sales_order="SO9999"} 1
appuio_control_organization_info{billing_entity="test-billing-entity",organization="test-org",sales_order=""} 1
`),
"appuio_control_organization_info"),
)
}

0 comments on commit 1f9af43

Please sign in to comment.