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  }