Skip to content

Commit 01a3b4e

Browse files
committed
Add --description-as-label flag for filesystem and generate
1 parent d1f18dd commit 01a3b4e

9 files changed

+323
-56
lines changed

filesystem.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ Objectives:
8989
return objectives
9090
}
9191

92-
func cmdFilesystem(logger log.Logger, reg *prometheus.Registry, promClient api.Client, configFiles, prometheusFolder string, genericRules bool) int {
92+
func cmdFilesystem(logger log.Logger, reg *prometheus.Registry, promClient api.Client, configFiles, prometheusFolder string, genericRules, descriptionAsLabel bool) int {
9393
reconcilesTotal := prometheus.NewCounter(prometheus.CounterOpts{
9494
Name: "pyrra_filesystem_reconciles_total",
9595
Help: "The total amount of reconciles.",
@@ -179,7 +179,7 @@ func cmdFilesystem(logger log.Logger, reg *prometheus.Registry, promClient api.C
179179
level.Debug(logger).Log("msg", "processing", "file", f)
180180
reconcilesTotal.Inc()
181181

182-
err := writeRuleFile(logger, f, prometheusFolder, genericRules, false)
182+
err := writeRuleFile(logger, f, prometheusFolder, genericRules, false, descriptionAsLabel)
183183
if err != nil {
184184
reconcilesErrors.Inc()
185185
level.Error(logger).Log("msg", "error creating rule file", "file", f, "err", err)
@@ -301,7 +301,7 @@ func (s *FilesystemObjectiveServer) List(_ context.Context, req *connect.Request
301301
}), nil
302302
}
303303

304-
func writeRuleFile(logger log.Logger, file, prometheusFolder string, genericRules, operatorRule bool) error {
304+
func writeRuleFile(logger log.Logger, file, prometheusFolder string, genericRules, operatorRule, descriptionAsLabel bool) error {
305305
kubeObjective, objective, err := objectiveFromFile(file)
306306
if err != nil {
307307
return fmt.Errorf("failed to get objective: %w", err)
@@ -336,7 +336,7 @@ func writeRuleFile(logger log.Logger, file, prometheusFolder string, genericRule
336336
}
337337

338338
if genericRules {
339-
rules, err := objective.GenericRules()
339+
rules, err := objective.GenericRules(descriptionAsLabel)
340340
if err == nil {
341341
rule.Groups = append(rule.Groups, rules)
342342
} else {

generate.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@ import (
2020
"github.com/go-kit/log/level"
2121
)
2222

23-
func cmdGenerate(logger log.Logger, configFiles, prometheusFolder string, genericRules, operatorRule bool) int {
23+
func cmdGenerate(logger log.Logger, configFiles, prometheusFolder string, genericRules, operatorRule, descriptionAsLabel bool) int {
2424
filenames, err := filepath.Glob(configFiles)
2525
if err != nil {
2626
level.Error(logger).Log("msg", "getting file names", "err", err)
2727
return 1
2828
}
2929

3030
for _, file := range filenames {
31-
err := writeRuleFile(logger, file, prometheusFolder, genericRules, operatorRule)
31+
err := writeRuleFile(logger, file, prometheusFolder, genericRules, operatorRule, descriptionAsLabel)
3232
if err != nil {
3333
level.Error(logger).Log("msg", "generating rule files", "err", err)
3434
return 1

kubernetes/api/v1alpha1/servicelevelobjective_types.go

+8-7
Original file line numberDiff line numberDiff line change
@@ -566,13 +566,14 @@ func (in *ServiceLevelObjective) Internal() (slo.Objective, error) {
566566
}
567567

568568
return slo.Objective{
569-
Labels: ls,
570-
Annotations: in.Annotations,
571-
Description: in.Spec.Description,
572-
Target: target / 100,
573-
Window: window,
574-
Config: string(config),
575-
Alerting: alerting,
569+
Labels: ls,
570+
Annotations: in.Annotations,
571+
Description: in.Spec.Description,
572+
DescriptionAsLabel: false,
573+
Target: target / 100,
574+
Window: window,
575+
Config: string(config),
576+
Alerting: alerting,
576577
Indicator: slo.Indicator{
577578
Ratio: ratio,
578579
Latency: latency,

kubernetes/controllers/servicelevelobjective.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ func makeConfigMap(name string, kubeObjective pyrrav1alpha1.ServiceLevelObjectiv
239239
}
240240

241241
if genericRules {
242-
rules, err := objective.GenericRules()
242+
rules, err := objective.GenericRules(false)
243243
if err != nil {
244244
if err != slo.ErrGroupingUnsupported {
245245
return nil, fmt.Errorf("failed to get generic rules: %w", err)
@@ -307,7 +307,7 @@ func makeMimirRuleGroup(kubeObjective pyrrav1alpha1.ServiceLevelObjective, gener
307307

308308
genericMimirRules := []rulefmt.RuleNode{}
309309
if genericRules {
310-
rules, err := objective.GenericRules()
310+
rules, err := objective.GenericRules(false)
311311
if err != nil {
312312
if err != slo.ErrGroupingUnsupported {
313313
return nil, fmt.Errorf("failed to get generic rules: %w", err)
@@ -399,7 +399,7 @@ func makePrometheusRule(kubeObjective pyrrav1alpha1.ServiceLevelObjective, gener
399399
}
400400

401401
if genericRules {
402-
rules, err := objective.GenericRules()
402+
rules, err := objective.GenericRules(false)
403403
if err != nil {
404404
if err != slo.ErrGroupingUnsupported {
405405
return nil, fmt.Errorf("failed to get generic rules: %w", err)

main.go

+12-8
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,11 @@ var CLI struct {
6767
TLSClientCAFile string `default:"" help:"File containing the CA certificate for the client"`
6868
} `cmd:"" help:"Runs Pyrra's API and UI."`
6969
Filesystem struct {
70-
ConfigFiles string `default:"/etc/pyrra/*.yaml" help:"The folder where Pyrra finds the config files to use. Any non yaml files will be ignored."`
71-
PrometheusURL *url.URL `default:"http://localhost:9090" help:"The URL to the Prometheus to query."`
72-
PrometheusFolder string `default:"/etc/prometheus/pyrra/" help:"The folder where Pyrra writes the generates Prometheus rules and alerts."`
73-
GenericRules bool `default:"false" help:"Enabled generic recording rules generation to make it easier for tools like Grafana."`
70+
ConfigFiles string `default:"/etc/pyrra/*.yaml" help:"The folder where Pyrra finds the config files to use. Any non yaml files will be ignored."`
71+
PrometheusURL *url.URL `default:"http://localhost:9090" help:"The URL to the Prometheus to query."`
72+
PrometheusFolder string `default:"/etc/prometheus/pyrra/" help:"The folder where Pyrra writes the generates Prometheus rules and alerts."`
73+
GenericRules bool `default:"false" help:"Enabled generic recording rules generation to make it easier for tools like Grafana."`
74+
DescriptionAsLabel bool `default:"false" help:"Enable description of objective to be added as label."`
7475
} `cmd:"" help:"Runs Pyrra's filesystem operator and backend for the API."`
7576
Kubernetes struct {
7677
MetricsAddr string `default:":8080" help:"The address the metric endpoint binds to."`
@@ -86,10 +87,11 @@ var CLI struct {
8687
MimirWriteAlertingRules bool `default:"false" help:"If alerting rules should be provisioned to the Mimir Ruler."`
8788
} `cmd:"" help:"Runs Pyrra's Kubernetes operator and backend for the API."`
8889
Generate struct {
89-
ConfigFiles string `default:"/etc/pyrra/*.yaml" help:"The folder where Pyrra finds the config files to use."`
90-
PrometheusFolder string `default:"/etc/prometheus/pyrra/" help:"The folder where Pyrra writes the generated Prometheus rules and alerts."`
91-
GenericRules bool `default:"false" help:"Enabled generic recording rules generation to make it easier for tools like Grafana."`
92-
OperatorRule bool `default:"false" help:"Generate rule files as prometheus-operator PrometheusRule: https://prometheus-operator.dev/docs/operator/api/#monitoring.coreos.com/v1.PrometheusRule."`
90+
ConfigFiles string `default:"/etc/pyrra/*.yaml" help:"The folder where Pyrra finds the config files to use."`
91+
PrometheusFolder string `default:"/etc/prometheus/pyrra/" help:"The folder where Pyrra writes the generated Prometheus rules and alerts."`
92+
GenericRules bool `default:"false" help:"Enabled generic recording rules generation to make it easier for tools like Grafana."`
93+
OperatorRule bool `default:"false" help:"Generate rule files as prometheus-operator PrometheusRule: https://prometheus-operator.dev/docs/operator/api/#monitoring.coreos.com/v1.PrometheusRule."`
94+
DescriptionAsLabel bool `default:"false" help:"Enable description of objective to be added as label."`
9395
} `cmd:"" help:"Read SLO config files and rewrites them as Prometheus rules and alerts."`
9496
}
9597

@@ -198,6 +200,7 @@ func main() {
198200
CLI.Filesystem.ConfigFiles,
199201
CLI.Filesystem.PrometheusFolder,
200202
CLI.Filesystem.GenericRules,
203+
CLI.Filesystem.DescriptionAsLabel,
201204
)
202205
case "kubernetes":
203206
code = cmdKubernetes(
@@ -218,6 +221,7 @@ func main() {
218221
CLI.Generate.PrometheusFolder,
219222
CLI.Generate.GenericRules,
220223
CLI.Generate.OperatorRule,
224+
CLI.Generate.DescriptionAsLabel,
221225
)
222226
}
223227
os.Exit(code)

slo/promql_test.go

+25-19
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@ import (
1414
var (
1515
objectiveHTTPRatio = func() Objective {
1616
return Objective{
17-
Labels: labels.FromStrings(labels.MetricName, "monitoring-http-errors"),
18-
Target: 0.99,
19-
Window: model.Duration(28 * 24 * time.Hour),
17+
Labels: labels.FromStrings(labels.MetricName, "monitoring-http-errors"),
18+
Description: "HTTP Ratio",
19+
Target: 0.99,
20+
Window: model.Duration(28 * 24 * time.Hour),
2021
Alerting: Alerting{
2122
Burnrates: true,
2223
Absent: true,
@@ -61,7 +62,7 @@ var (
6162
objectiveGRPCRatio = func() Objective {
6263
return Objective{
6364
Labels: labels.FromStrings(labels.MetricName, "monitoring-grpc-errors"),
64-
Description: "",
65+
Description: "GRPC Ratio",
6566
Target: 0.999,
6667
Window: model.Duration(28 * 24 * time.Hour),
6768
Alerting: Alerting{
@@ -100,9 +101,10 @@ var (
100101
}
101102
objectiveHTTPLatency = func() Objective {
102103
return Objective{
103-
Labels: labels.FromStrings(labels.MetricName, "monitoring-http-latency"),
104-
Target: 0.995,
105-
Window: model.Duration(28 * 24 * time.Hour),
104+
Labels: labels.FromStrings(labels.MetricName, "monitoring-http-latency"),
105+
Description: "HTTP Latency",
106+
Target: 0.995,
107+
Window: model.Duration(28 * 24 * time.Hour),
106108
Alerting: Alerting{
107109
Burnrates: true,
108110
Absent: true,
@@ -165,9 +167,10 @@ var (
165167
}
166168
objectiveGRPCLatency = func() Objective {
167169
return Objective{
168-
Labels: labels.FromStrings(labels.MetricName, "monitoring-grpc-latency"),
169-
Target: 0.995,
170-
Window: model.Duration(7 * 24 * time.Hour),
170+
Labels: labels.FromStrings(labels.MetricName, "monitoring-grpc-latency"),
171+
Description: "GRPC Latency",
172+
Target: 0.995,
173+
Window: model.Duration(7 * 24 * time.Hour),
171174
Alerting: Alerting{
172175
Burnrates: true,
173176
Absent: true,
@@ -204,9 +207,10 @@ var (
204207
}
205208
objectiveOperator = func() Objective {
206209
return Objective{
207-
Labels: labels.FromStrings(labels.MetricName, "monitoring-prometheus-operator-errors"),
208-
Target: 0.99,
209-
Window: model.Duration(14 * 24 * time.Hour),
210+
Labels: labels.FromStrings(labels.MetricName, "monitoring-prometheus-operator-errors"),
211+
Description: "Operator",
212+
Target: 0.99,
213+
Window: model.Duration(14 * 24 * time.Hour),
210214
Alerting: Alerting{
211215
Burnrates: true,
212216
Absent: true,
@@ -236,9 +240,10 @@ var (
236240
}
237241
objectiveAPIServerRatio = func() Objective {
238242
return Objective{
239-
Labels: labels.FromStrings(labels.MetricName, "apiserver-write-response-errors"),
240-
Target: 0.99,
241-
Window: model.Duration(14 * 24 * time.Hour),
243+
Labels: labels.FromStrings(labels.MetricName, "apiserver-write-response-errors"),
244+
Description: "API Server Ratio",
245+
Target: 0.99,
246+
Window: model.Duration(14 * 24 * time.Hour),
242247
Alerting: Alerting{
243248
Name: "APIServerErrorBudgetBurn",
244249
AbsentName: "APIServerMetricAbsent",
@@ -328,9 +333,10 @@ var (
328333
}
329334
objectiveUpTargets = func() Objective {
330335
return Objective{
331-
Labels: labels.FromStrings(labels.MetricName, "up-targets"),
332-
Target: 0.99,
333-
Window: model.Duration(28 * 24 * time.Hour),
336+
Labels: labels.FromStrings(labels.MetricName, "up-targets"),
337+
Description: "Up targets",
338+
Target: 0.99,
339+
Window: model.Duration(28 * 24 * time.Hour),
334340
Alerting: Alerting{
335341
Burnrates: true,
336342
Absent: true,

slo/rules.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -1147,12 +1147,16 @@ func burnratesFromWindows(ws []Window) []time.Duration {
11471147

11481148
var ErrGroupingUnsupported = errors.New("objective with grouping not supported in generic rules")
11491149

1150-
func (o Objective) GenericRules() (monitoringv1.RuleGroup, error) {
1150+
func (o Objective) GenericRules(descriptionAsLabel bool) (monitoringv1.RuleGroup, error) {
11511151
sloName := o.Labels.Get(labels.MetricName)
11521152
var rules []monitoringv1.Rule
11531153

11541154
ruleLabels := o.commonRuleLabels(sloName)
11551155

1156+
if descriptionAsLabel {
1157+
ruleLabels["description"] = o.Description
1158+
}
1159+
11561160
rules = append(rules, monitoringv1.Rule{
11571161
Record: "pyrra_objective",
11581162
Expr: intstr.FromString(strconv.FormatFloat(o.Target, 'f', -1, 64)),

0 commit comments

Comments
 (0)