Skip to content

Commit

Permalink
Merge pull request #463 from sapcc/add-used-and-or-committed-metric
Browse files Browse the repository at this point in the history
add limes_project_used_and_or_committed_by_az metric
  • Loading branch information
majewsky committed May 17, 2024
2 parents 95b8a7c + b160d90 commit e210649
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 2 deletions.
20 changes: 20 additions & 0 deletions internal/collector/fixtures/scrape_metrics.prom
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,26 @@ limes_project_usage_per_az{availability_zone="az-two",domain="germany",domain_id
limes_project_usage_per_az{availability_zone="az-two",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="capacity",service="unittest",service_name="generic-unittest"} 0
limes_project_usage_per_az{availability_zone="az-two",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="capacity_portion",service="unittest",service_name="generic-unittest"} 0
limes_project_usage_per_az{availability_zone="az-two",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="things",service="unittest",service_name="generic-unittest"} 3
# HELP limes_project_used_and_or_committed_per_az The maximum of limes_project_usage_per_az and limes_project_committed_per_az{state="active"}.
# TYPE limes_project_used_and_or_committed_per_az gauge
limes_project_used_and_or_committed_per_az{availability_zone="any",domain="germany",domain_id="uuid-for-germany",project="berlin",project_id="uuid-for-berlin",resource="capacity",service="unittest",service_name="generic-unittest"} 0
limes_project_used_and_or_committed_per_az{availability_zone="any",domain="germany",domain_id="uuid-for-germany",project="berlin",project_id="uuid-for-berlin",resource="capacity_portion",service="unittest",service_name="generic-unittest"} 0
limes_project_used_and_or_committed_per_az{availability_zone="any",domain="germany",domain_id="uuid-for-germany",project="berlin",project_id="uuid-for-berlin",resource="things",service="unittest",service_name="generic-unittest"} 0
limes_project_used_and_or_committed_per_az{availability_zone="any",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="capacity",service="unittest",service_name="generic-unittest"} 0
limes_project_used_and_or_committed_per_az{availability_zone="any",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="capacity_portion",service="unittest",service_name="generic-unittest"} 0
limes_project_used_and_or_committed_per_az{availability_zone="any",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="things",service="unittest",service_name="generic-unittest"} 0
limes_project_used_and_or_committed_per_az{availability_zone="az-one",domain="germany",domain_id="uuid-for-germany",project="berlin",project_id="uuid-for-berlin",resource="capacity",service="unittest",service_name="generic-unittest"} 20
limes_project_used_and_or_committed_per_az{availability_zone="az-one",domain="germany",domain_id="uuid-for-germany",project="berlin",project_id="uuid-for-berlin",resource="capacity_portion",service="unittest",service_name="generic-unittest"} 5
limes_project_used_and_or_committed_per_az{availability_zone="az-one",domain="germany",domain_id="uuid-for-germany",project="berlin",project_id="uuid-for-berlin",resource="things",service="unittest",service_name="generic-unittest"} 2
limes_project_used_and_or_committed_per_az{availability_zone="az-one",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="capacity",service="unittest",service_name="generic-unittest"} 20
limes_project_used_and_or_committed_per_az{availability_zone="az-one",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="capacity_portion",service="unittest",service_name="generic-unittest"} 5
limes_project_used_and_or_committed_per_az{availability_zone="az-one",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="things",service="unittest",service_name="generic-unittest"} 2
limes_project_used_and_or_committed_per_az{availability_zone="az-two",domain="germany",domain_id="uuid-for-germany",project="berlin",project_id="uuid-for-berlin",resource="capacity",service="unittest",service_name="generic-unittest"} 0
limes_project_used_and_or_committed_per_az{availability_zone="az-two",domain="germany",domain_id="uuid-for-germany",project="berlin",project_id="uuid-for-berlin",resource="capacity_portion",service="unittest",service_name="generic-unittest"} 0
limes_project_used_and_or_committed_per_az{availability_zone="az-two",domain="germany",domain_id="uuid-for-germany",project="berlin",project_id="uuid-for-berlin",resource="things",service="unittest",service_name="generic-unittest"} 3
limes_project_used_and_or_committed_per_az{availability_zone="az-two",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="capacity",service="unittest",service_name="generic-unittest"} 0
limes_project_used_and_or_committed_per_az{availability_zone="az-two",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="capacity_portion",service="unittest",service_name="generic-unittest"} 0
limes_project_used_and_or_committed_per_az{availability_zone="az-two",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="things",service="unittest",service_name="generic-unittest"} 3
# HELP limes_unit_multiplier Conversion factor that a value of this resource must be multiplied with to obtain the base unit (e.g. bytes). For use with Grafana when only the base unit can be configured because of templating.
# TYPE limes_unit_multiplier gauge
limes_unit_multiplier{resource="capacity",service="unittest",service_name="generic-unittest"} 1
Expand Down
10 changes: 10 additions & 0 deletions internal/collector/fixtures/scrape_metrics_skipzero.prom
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,16 @@ limes_project_usage_per_az{availability_zone="az-one",domain="germany",domain_id
limes_project_usage_per_az{availability_zone="az-one",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="things",service="unittest",service_name="generic-unittest"} 2
limes_project_usage_per_az{availability_zone="az-two",domain="germany",domain_id="uuid-for-germany",project="berlin",project_id="uuid-for-berlin",resource="things",service="unittest",service_name="generic-unittest"} 3
limes_project_usage_per_az{availability_zone="az-two",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="things",service="unittest",service_name="generic-unittest"} 3
# HELP limes_project_used_and_or_committed_per_az The maximum of limes_project_usage_per_az and limes_project_committed_per_az{state="active"}.
# TYPE limes_project_used_and_or_committed_per_az gauge
limes_project_used_and_or_committed_per_az{availability_zone="az-one",domain="germany",domain_id="uuid-for-germany",project="berlin",project_id="uuid-for-berlin",resource="capacity",service="unittest",service_name="generic-unittest"} 20
limes_project_used_and_or_committed_per_az{availability_zone="az-one",domain="germany",domain_id="uuid-for-germany",project="berlin",project_id="uuid-for-berlin",resource="capacity_portion",service="unittest",service_name="generic-unittest"} 5
limes_project_used_and_or_committed_per_az{availability_zone="az-one",domain="germany",domain_id="uuid-for-germany",project="berlin",project_id="uuid-for-berlin",resource="things",service="unittest",service_name="generic-unittest"} 2
limes_project_used_and_or_committed_per_az{availability_zone="az-one",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="capacity",service="unittest",service_name="generic-unittest"} 20
limes_project_used_and_or_committed_per_az{availability_zone="az-one",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="capacity_portion",service="unittest",service_name="generic-unittest"} 5
limes_project_used_and_or_committed_per_az{availability_zone="az-one",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="things",service="unittest",service_name="generic-unittest"} 2
limes_project_used_and_or_committed_per_az{availability_zone="az-two",domain="germany",domain_id="uuid-for-germany",project="berlin",project_id="uuid-for-berlin",resource="things",service="unittest",service_name="generic-unittest"} 3
limes_project_used_and_or_committed_per_az{availability_zone="az-two",domain="germany",domain_id="uuid-for-germany",project="dresden",project_id="uuid-for-dresden",resource="things",service="unittest",service_name="generic-unittest"} 3
# HELP limes_unit_multiplier Conversion factor that a value of this resource must be multiplied with to obtain the base unit (e.g. bytes). For use with Grafana when only the base unit can be configured because of templating.
# TYPE limes_unit_multiplier gauge
limes_unit_multiplier{resource="capacity",service="unittest",service_name="generic-unittest"} 1
Expand Down
35 changes: 33 additions & 2 deletions internal/collector/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import (
"github.com/sapcc/go-bits/sqlext"

"github.com/sapcc/limes/internal/core"
"github.com/sapcc/limes/internal/db"
)

////////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -435,6 +436,17 @@ var projectCommittedPerAZGauge = prometheus.NewGaugeVec(
[]string{"availability_zone", "domain", "domain_id", "project", "project_id", "service", "service_name", "resource", "state"},
)

// This metric might appear to be redundant because it could be computed in PromQL.
// But `max(limes_project_usage_per_az, limes_project_committed_per_az{state="active"})` will not yield all necessary results
// if zero metrics are not emitted (as is the recommended configuration).
var projectUsedAndOrCommittedPerAZGauge = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: "limes_project_used_and_or_committed_per_az",
Help: `The maximum of limes_project_usage_per_az and limes_project_committed_per_az{state="active"}.`,
},
[]string{"availability_zone", "domain", "domain_id", "project", "project_id", "service", "service_name", "resource"},
)

var projectRateUsageGauge = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: "limes_project_rate_usage",
Expand Down Expand Up @@ -481,6 +493,7 @@ func (c *DataMetricsCollector) Describe(ch chan<- *prometheus.Desc) {
projectPhysicalUsageGauge.Describe(ch)
projectUsagePerAZGauge.Describe(ch)
projectCommittedPerAZGauge.Describe(ch)
projectUsedAndOrCommittedPerAZGauge.Describe(ch)
projectRateUsageGauge.Describe(ch)
unitConversionGauge.Describe(ch)
autogrowGrowthMultiplierGauge.Describe(ch)
Expand Down Expand Up @@ -580,6 +593,8 @@ func (c *DataMetricsCollector) Collect(ch chan<- prometheus.Metric) {
projectUsagePerAZDesc := <-descCh
projectCommittedPerAZGauge.Describe(descCh)
projectCommittedPerAZDesc := <-descCh
projectUsedAndOrCommittedPerAZGauge.Describe(descCh)
projectUsedAndOrCommittedPerAZDesc := <-descCh
projectRateUsageGauge.Describe(descCh)
projectRateUsageDesc := <-descCh
unitConversionGauge.Describe(descCh)
Expand Down Expand Up @@ -847,12 +862,14 @@ func (c *DataMetricsCollector) Collect(ch chan<- prometheus.Metric) {
uniqueResourceName.For(resourceName),
)
}
committed := uint64(0)
if amountByStateJSON != nil {
var amountByState map[string]uint64
var amountByState map[db.CommitmentState]uint64
err = json.Unmarshal([]byte(*amountByStateJSON), &amountByState)
if err != nil {
return fmt.Errorf("while unmarshalling amount_by_state: %w (input was %q)", err, *amountByStateJSON)
}
committed = amountByState[db.CommitmentStateActive]
for state, amount := range amountByState {
ch <- prometheus.MustNewConstMetric(
projectCommittedPerAZDesc,
Expand All @@ -865,10 +882,24 @@ func (c *DataMetricsCollector) Collect(ch chan<- prometheus.Metric) {
uniqueServiceType.For(serviceType),
serviceNameByType[serviceType],
uniqueResourceName.For(resourceName),
state,
string(state),
)
}
}
if c.ReportZeroes || max(usage, committed) != 0 {
ch <- prometheus.MustNewConstMetric(
projectUsedAndOrCommittedPerAZDesc,
prometheus.GaugeValue, float64(max(usage, committed)),
uniqueAvailabilityZone.For(az),
uniqueDomainName.For(domainName),
uniqueDomainUUID.For(domainUUID),
uniqueProjectName.For(projectName),
uniqueProjectUUID.For(projectUUID),
uniqueServiceType.For(serviceType),
serviceNameByType[serviceType],
uniqueResourceName.For(resourceName),
)
}
return nil
})
if err != nil {
Expand Down

0 comments on commit e210649

Please sign in to comment.