Skip to content

Commit

Permalink
chore: update custom metric label type (#1234)
Browse files Browse the repository at this point in the history
* chore: update custom metric label type

* chore: fix lint
  • Loading branch information
yashmehrotra authored Aug 25, 2023
1 parent 7615b35 commit c09058c
Show file tree
Hide file tree
Showing 47 changed files with 1,945 additions and 511 deletions.
24 changes: 20 additions & 4 deletions api/external/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,24 @@ package external

// +kubebuilder:object:generate=true
type Metrics struct {
Name string `json:"name,omitempty" yaml:"name,omitempty"`
Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"`
Type string `json:"type,omitempty" yaml:"type,omitempty"`
Value string `json:"value,omitempty" yaml:"value,omitempty"`
Name string `json:"name,omitempty" yaml:"name,omitempty"`
Labels MetricLabels `json:"labels,omitempty" yaml:"labels,omitempty"`
Type string `json:"type,omitempty" yaml:"type,omitempty"`
Value string `json:"value,omitempty" yaml:"value,omitempty"`
}

type MetricLabels []MetricLabel

type MetricLabel struct {
Name string `json:"name"`
Value string `json:"value,omitempty"`
ValueExpr string `json:"valueExpr,omitempty"`
}

func (labels MetricLabels) Names() []string {
var names []string
for _, k := range labels {
names = append(names, k.Name)
}
return names
}
6 changes: 2 additions & 4 deletions api/external/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

48 changes: 16 additions & 32 deletions checks/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package checks

import (
"encoding/json"
"sort"
"strconv"

"github.com/flanksource/canary-checker/api/context"
Expand All @@ -14,41 +13,23 @@ import (

var collectorMap = make(map[string]prometheus.Collector)

func promLabelsOrderedKeys(labels map[string]string) []string {
var keys []string
for k := range labels {
keys = append(keys, k)
}
sort.Strings(keys)
return keys
}

func promLabelsOrderedVals(labels map[string]string) []string {
var vals []string
keys := promLabelsOrderedKeys(labels)
for _, k := range keys {
vals = append(vals, labels[k])
}
return vals
}

func addPrometheusMetric(name, metricType string, labels map[string]string) prometheus.Collector {
func addPrometheusMetric(name, metricType string, labelNames []string) prometheus.Collector {
var collector prometheus.Collector
switch metricType {
case "histogram":
collector = prometheus.NewHistogramVec(
prometheus.HistogramOpts{Name: name},
promLabelsOrderedKeys(labels),
labelNames,
)
case "counter":
collector = prometheus.NewCounterVec(
prometheus.CounterOpts{Name: name},
promLabelsOrderedKeys(labels),
labelNames,
)
case "gauge":
collector = prometheus.NewGaugeVec(
prometheus.GaugeOpts{Name: name},
promLabelsOrderedKeys(labels),
labelNames,
)
default:
return nil
Expand All @@ -73,7 +54,7 @@ func exportCheckMetrics(ctx *context.Context, results pkg.Results) {
var collector prometheus.Collector
var exists bool
if collector, exists = collectorMap[spec.Name]; !exists {
collector = addPrometheusMetric(spec.Name, spec.Type, spec.Labels)
collector = addPrometheusMetric(spec.Name, spec.Type, spec.Labels.Names())
if collector == nil {
logger.Errorf("Invalid type for check.metrics %s for check[%s]", spec.Type, r.Check.GetName())
continue
Expand Down Expand Up @@ -114,16 +95,19 @@ func exportCheckMetrics(ctx *context.Context, results pkg.Results) {
logger.Errorf("Error converting value %s to float for check.metrics template %s for check[%s]: %v", valRaw, spec.Value, r.Check.GetName(), err)
continue
}
tplLabels := make(map[string]string)
for labelKey, labelVal := range spec.Labels {
label, err := template(ctx.New(templateInput), v1.Template{Expression: labelVal})
if err != nil {
logger.Errorf("Error templating label %s:%s for check.metrics for check[%s]: %v", labelKey, labelVal, r.Check.GetName(), err)
continue

var orderedLabelVals []string
for _, label := range spec.Labels {
val := label.Value
if label.ValueExpr != "" {
var err error
val, err = template(ctx.New(templateInput), v1.Template{Expression: label.ValueExpr})
if err != nil {
logger.Errorf("Error templating label %s:%s for check.metrics for check[%s]: %v", label.Name, label.ValueExpr, r.Check.GetName(), err)
}
}
tplLabels[labelKey] = label
orderedLabelVals = append(orderedLabelVals, val)
}
orderedLabelVals := promLabelsOrderedVals(tplLabels)

switch collector := collector.(type) {
case *prometheus.HistogramVec:
Expand Down
Loading

0 comments on commit c09058c

Please sign in to comment.