github.com/grafana/pyroscope@v1.18.0/pkg/validation/recording_rules_test.go (about) 1 package validation 2 3 import ( 4 "bytes" 5 "testing" 6 7 "github.com/stretchr/testify/assert" 8 "github.com/stretchr/testify/require" 9 10 settingsv1 "github.com/grafana/pyroscope/api/gen/proto/go/settings/v1" 11 typesv1 "github.com/grafana/pyroscope/api/gen/proto/go/types/v1" 12 ) 13 14 const recordingRulesOverrideConfig = ` 15 overrides: 16 empty-overrides: {} 17 empty-rules: 18 recording_rules: [] 19 some-rules: 20 recording_rules: 21 - metric_name: 'profiles_recorded_any_name' 22 matchers: ['{__profile_type__="any-profile-type", foo="bar"}'] 23 group_by: ['any_group_by'] 24 external_labels: 25 - name: 'any_label_name' 26 value: 'any-label-value' 27 ` 28 29 func Test_RecordingRules(t *testing.T) { 30 rc, err := LoadRuntimeConfig(bytes.NewReader([]byte(recordingRulesOverrideConfig))) 31 require.NoError(t, err) 32 33 o, err := newOverrides(rc) 34 require.NoError(t, err) 35 36 rules := o.RecordingRules("no-overrides") 37 assert.Equal(t, 0, len(rules)) 38 39 rules = o.RecordingRules("empty-overrides") 40 assert.Equal(t, 0, len(rules)) 41 42 rules = o.RecordingRules("empty-rules") 43 assert.Equal(t, 0, len(rules)) 44 45 rules = o.RecordingRules("some-rules") 46 assert.Equal(t, []*settingsv1.RecordingRule{ 47 { 48 MetricName: "profiles_recorded_any_name", 49 Matchers: []string{"{__profile_type__=\"any-profile-type\", foo=\"bar\"}"}, 50 GroupBy: []string{"any_group_by"}, 51 ExternalLabels: []*typesv1.LabelPair{{Name: "any_label_name", Value: "any-label-value"}}, 52 }, 53 }, rules) 54 55 _, err = LoadRuntimeConfig(bytes.NewReader([]byte(` 56 overrides: 57 wrong_name: 58 recording_rules: 59 - metric_name: "" 60 `))) 61 require.ErrorContains(t, err, "invalid metric name: ") 62 63 _, err = LoadRuntimeConfig(bytes.NewReader([]byte(` 64 overrides: 65 wrong_name: 66 recording_rules: 67 - metric_name: "metric_name_without_preffix" 68 `))) 69 require.ErrorContains(t, err, "metric name must start with profiles_recorded_") 70 71 _, err = LoadRuntimeConfig(bytes.NewReader([]byte(` 72 overrides: 73 malformed_matchers: 74 recording_rules: 75 - metric_name: 'profiles_recorded_any_name' 76 matchers: ['{foo="bar}'] 77 `))) 78 require.ErrorContains(t, err, "failed to parse matchers") 79 80 _, err = LoadRuntimeConfig(bytes.NewReader([]byte(` 81 overrides: 82 missing_profile_type: 83 recording_rules: 84 - metric_name: 'profiles_recorded_any_name' 85 matchers: ['{foo="bar"}'] 86 `))) 87 require.ErrorContains(t, err, "no __profile_type__ matcher present") 88 }