Skip to content

Commit

Permalink
Split objective and rules file creation
Browse files Browse the repository at this point in the history
Signed-off-by: ArthurSens <arthursens2005@gmail.com>
  • Loading branch information
ArthurSens committed Jul 13, 2022
1 parent 4af10af commit 61953bf
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 23 deletions.
58 changes: 36 additions & 22 deletions filesystem.go
Original file line number Diff line number Diff line change
Expand Up @@ -170,10 +170,16 @@ func cmdFilesystem(logger log.Logger, reg *prometheus.Registry, promClient api.C
level.Debug(logger).Log("msg", "reading", "file", f)
reconcilesTotal.Inc()

objective, err := objectiveAsRuleFile(f, prometheusFolder)
err := writeRuleFile(f, prometheusFolder)
if err != nil {
reconcilesErrors.Inc()
return fmt.Errorf("failed to create rule file %q: %w", f, err)
return fmt.Errorf("creating rule file %q: %w", f, err)
}

objective, err := objectiveFromFile(f)
if err != nil {
reconcilesErrors.Inc()
return fmt.Errorf("creating objective from file %q: %w", f, err)
}
objectives.Set(objective)

Expand Down Expand Up @@ -312,47 +318,55 @@ func (f FilesystemObjectiveServer) GetREDErrors(ctx context.Context, expr, group
return openapiserver.ImplResponse{}, errEndpointNotImplemented
}

// objectiveAsRuleFile reads a ServiceLevelObjective YAML manifest and outputs the corresponding
// writeRuleFile reads a ServiceLevelObjective YAML manifest and outputs the corresponding
// Prometheus rules as a file in the desired directory.
func objectiveAsRuleFile(file, prometheusFolder string) (slo.Objective, error) {
bytes, err := ioutil.ReadFile(file)
func writeRuleFile(file, prometheusFolder string) error {
objective, err := objectiveFromFile(file)
if err != nil {
return slo.Objective{}, fmt.Errorf("failed to read file %q: %w", file, err)
}

var config v1alpha1.ServiceLevelObjective
if err := yaml.UnmarshalStrict(bytes, &config); err != nil {
return slo.Objective{}, fmt.Errorf("failed to unmarshal objective %q: %w", file, err)
return fmt.Errorf("failed to get objective: %w", err)
}

objective, err := config.Internal()
if err != nil {
return slo.Objective{}, fmt.Errorf("failed to get objective: %w", err)
}
increases, err := objective.IncreaseRules()
if err != nil {
return slo.Objective{}, fmt.Errorf("failed to get increase rules: %w", err)
return fmt.Errorf("failed to get increase rules: %w", err)
}
burnrates, err := objective.Burnrates()
if err != nil {
return slo.Objective{}, fmt.Errorf("failed to get burn rate rules: %w", err)
return fmt.Errorf("failed to get burn rate rules: %w", err)
}

rule := monitoringv1.PrometheusRuleSpec{
rules := monitoringv1.PrometheusRuleSpec{
Groups: []monitoringv1.RuleGroup{increases, burnrates},
}
if err != nil {
return fmt.Errorf("failed to get recording rules: %w", err)
}

bytes, err = yaml.Marshal(rule)
bytes, err := yaml.Marshal(rules)
if err != nil {
return slo.Objective{}, fmt.Errorf("failed to marshal recording rules: %w", err)
return fmt.Errorf("failed to marshal recording rules: %w", err)
}

_, f := filepath.Split(file)
path := filepath.Join(prometheusFolder, f)

if err := ioutil.WriteFile(path, bytes, 0o644); err != nil {
return slo.Objective{}, fmt.Errorf("failed to write file %q: %w", path, err)
return fmt.Errorf("failed to write file %q: %w", path, err)
}

return nil
}

func objectiveFromFile(file string) (slo.Objective, error) {
bytes, err := ioutil.ReadFile(file)
if err != nil {
return slo.Objective{}, fmt.Errorf("failed to read file %q: %w", file, err)
}

var config v1alpha1.ServiceLevelObjective
if err := yaml.UnmarshalStrict(bytes, &config); err != nil {
return slo.Objective{}, fmt.Errorf("failed to unmarshal objective %q: %w", file, err)
}

return objective, nil
return config.Internal()
}
2 changes: 1 addition & 1 deletion generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func cmdGenerate(logger log.Logger, configFiles, prometheusFolder string) int {
}

for _, file := range filenames {
_, err := objectiveAsRuleFile(file, prometheusFolder)
err := writeRuleFile(file, prometheusFolder)
if err != nil {
level.Error(logger).Log("msg", "generating rule files", "err", err)
return 1
Expand Down

0 comments on commit 61953bf

Please sign in to comment.