1
1
package validation
2
2
3
3
import (
4
+ "flag"
5
+ "strings"
4
6
"testing"
7
+ "time"
5
8
6
9
"github.com/prometheus/client_golang/prometheus/testutil"
7
10
"github.com/stretchr/testify/assert"
11
+ "github.com/stretchr/testify/require"
8
12
)
9
13
10
14
func TestOverridesExporter_noConfig (t * testing.T ) {
@@ -21,10 +25,162 @@ func TestOverridesExporter_withConfig(t *testing.T) {
21
25
MaxQueriersPerTenant : 5 ,
22
26
},
23
27
}
28
+ tenantLimits ["tenant-a" ].RegisterFlags (flag .CommandLine )
24
29
25
30
exporter := NewOverridesExporter (newMockTenantLimits (tenantLimits ))
26
31
27
32
// There should be at least a few metrics generated by receiving an override configuration map
28
33
count := testutil .CollectAndCount (exporter , "cortex_overrides" )
29
34
assert .Greater (t , count , 0 )
35
+ require .NoError (t , testutil .CollectAndCompare (exporter , strings .NewReader (`
36
+ # HELP cortex_overrides Resource limit overrides applied to tenants
37
+ # TYPE cortex_overrides gauge
38
+ cortex_overrides{limit_name="accept_ha_samples",user="tenant-a"} 0
39
+ cortex_overrides{limit_name="accept_mixed_ha_samples",user="tenant-a"} 0
40
+ cortex_overrides{limit_name="alertmanager_max_alerts_count",user="tenant-a"} 0
41
+ cortex_overrides{limit_name="alertmanager_max_alerts_size_bytes",user="tenant-a"} 0
42
+ cortex_overrides{limit_name="alertmanager_max_config_size_bytes",user="tenant-a"} 0
43
+ cortex_overrides{limit_name="alertmanager_max_dispatcher_aggregation_groups",user="tenant-a"} 0
44
+ cortex_overrides{limit_name="alertmanager_max_silences_count",user="tenant-a"} 0
45
+ cortex_overrides{limit_name="alertmanager_max_silences_size_bytes",user="tenant-a"} 0
46
+ cortex_overrides{limit_name="alertmanager_max_template_size_bytes",user="tenant-a"} 0
47
+ cortex_overrides{limit_name="alertmanager_max_templates_count",user="tenant-a"} 0
48
+ cortex_overrides{limit_name="alertmanager_notification_rate_limit",user="tenant-a"} 0
49
+ cortex_overrides{limit_name="alertmanager_receivers_firewall_block_private_addresses",user="tenant-a"} 0
50
+ cortex_overrides{limit_name="compactor_blocks_retention_period",user="tenant-a"} 0
51
+ cortex_overrides{limit_name="compactor_partition_index_size_bytes",user="tenant-a"} 6.8719476736e+10
52
+ cortex_overrides{limit_name="compactor_partition_series_count",user="tenant-a"} 0
53
+ cortex_overrides{limit_name="compactor_tenant_shard_size",user="tenant-a"} 0
54
+ cortex_overrides{limit_name="creation_grace_period",user="tenant-a"} 600
55
+ cortex_overrides{limit_name="enable_native_histograms",user="tenant-a"} 0
56
+ cortex_overrides{limit_name="enforce_metadata_metric_name",user="tenant-a"} 1
57
+ cortex_overrides{limit_name="enforce_metric_name",user="tenant-a"} 1
58
+ cortex_overrides{limit_name="ha_max_clusters",user="tenant-a"} 0
59
+ cortex_overrides{limit_name="ingestion_burst_size",user="tenant-a"} 50000
60
+ cortex_overrides{limit_name="ingestion_rate",user="tenant-a"} 25000
61
+ cortex_overrides{limit_name="ingestion_tenant_shard_size",user="tenant-a"} 0
62
+ cortex_overrides{limit_name="max_cache_freshness",user="tenant-a"} 60
63
+ cortex_overrides{limit_name="max_downloaded_bytes_per_request",user="tenant-a"} 0
64
+ cortex_overrides{limit_name="max_exemplars",user="tenant-a"} 0
65
+ cortex_overrides{limit_name="max_fetched_chunk_bytes_per_query",user="tenant-a"} 0
66
+ cortex_overrides{limit_name="max_fetched_chunks_per_query",user="tenant-a"} 2e+06
67
+ cortex_overrides{limit_name="max_fetched_data_bytes_per_query",user="tenant-a"} 0
68
+ cortex_overrides{limit_name="max_fetched_series_per_query",user="tenant-a"} 0
69
+ cortex_overrides{limit_name="max_global_metadata_per_metric",user="tenant-a"} 0
70
+ cortex_overrides{limit_name="max_global_metadata_per_user",user="tenant-a"} 0
71
+ cortex_overrides{limit_name="max_global_native_histogram_series_per_user",user="tenant-a"} 0
72
+ cortex_overrides{limit_name="max_global_series_per_metric",user="tenant-a"} 0
73
+ cortex_overrides{limit_name="max_global_series_per_user",user="tenant-a"} 0
74
+ cortex_overrides{limit_name="max_label_name_length",user="tenant-a"} 1024
75
+ cortex_overrides{limit_name="max_label_names_per_series",user="tenant-a"} 30
76
+ cortex_overrides{limit_name="max_label_value_length",user="tenant-a"} 2048
77
+ cortex_overrides{limit_name="max_labels_size_bytes",user="tenant-a"} 0
78
+ cortex_overrides{limit_name="max_metadata_length",user="tenant-a"} 1024
79
+ cortex_overrides{limit_name="max_metadata_per_metric",user="tenant-a"} 10
80
+ cortex_overrides{limit_name="max_metadata_per_user",user="tenant-a"} 8000
81
+ cortex_overrides{limit_name="max_native_histogram_buckets",user="tenant-a"} 0
82
+ cortex_overrides{limit_name="max_native_histogram_sample_size_bytes",user="tenant-a"} 0
83
+ cortex_overrides{limit_name="max_native_histogram_series_per_user",user="tenant-a"} 0
84
+ cortex_overrides{limit_name="max_outstanding_requests_per_tenant",user="tenant-a"} 100
85
+ cortex_overrides{limit_name="max_queriers_per_tenant",user="tenant-a"} 0
86
+ cortex_overrides{limit_name="max_query_length",user="tenant-a"} 0
87
+ cortex_overrides{limit_name="max_query_lookback",user="tenant-a"} 0
88
+ cortex_overrides{limit_name="max_query_parallelism",user="tenant-a"} 14
89
+ cortex_overrides{limit_name="max_query_response_size",user="tenant-a"} 0
90
+ cortex_overrides{limit_name="max_series_per_metric",user="tenant-a"} 50000
91
+ cortex_overrides{limit_name="max_series_per_user",user="tenant-a"} 5e+06
92
+ cortex_overrides{limit_name="native_histogram_ingestion_burst_size",user="tenant-a"} 0
93
+ cortex_overrides{limit_name="native_histogram_ingestion_rate",user="tenant-a"} 1.7976931348623157e+308
94
+ cortex_overrides{limit_name="out_of_order_time_window",user="tenant-a"} 0
95
+ cortex_overrides{limit_name="parquet_converter_enabled",user="tenant-a"} 0
96
+ cortex_overrides{limit_name="parquet_converter_tenant_shard_size",user="tenant-a"} 0
97
+ cortex_overrides{limit_name="parquet_max_fetched_chunk_bytes",user="tenant-a"} 0
98
+ cortex_overrides{limit_name="parquet_max_fetched_data_bytes",user="tenant-a"} 0
99
+ cortex_overrides{limit_name="parquet_max_fetched_row_count",user="tenant-a"} 0
100
+ cortex_overrides{limit_name="query_partial_data",user="tenant-a"} 0
101
+ cortex_overrides{limit_name="query_vertical_shard_size",user="tenant-a"} 0
102
+ cortex_overrides{limit_name="reject_old_samples",user="tenant-a"} 0
103
+ cortex_overrides{limit_name="reject_old_samples_max_age",user="tenant-a"} 1.2096e+06
104
+ cortex_overrides{limit_name="ruler_evaluation_delay_duration",user="tenant-a"} 0
105
+ cortex_overrides{limit_name="ruler_max_rule_groups_per_tenant",user="tenant-a"} 0
106
+ cortex_overrides{limit_name="ruler_max_rules_per_rule_group",user="tenant-a"} 0
107
+ cortex_overrides{limit_name="ruler_query_offset",user="tenant-a"} 0
108
+ cortex_overrides{limit_name="ruler_tenant_shard_size",user="tenant-a"} 0
109
+ cortex_overrides{limit_name="rules_partial_data",user="tenant-a"} 0
110
+ cortex_overrides{limit_name="store_gateway_tenant_shard_size",user="tenant-a"} 0
111
+ ` ), "cortex_overrides" ))
112
+ }
113
+
114
+ func TestGetFieldNames (t * testing.T ) {
115
+ limits := Limits {}
116
+ limits .RegisterFlags (flag .CommandLine )
117
+ extracted := ExtractNumericalValues (& limits )
118
+ t .Run ("float64 should be converted" , func (t * testing.T ) {
119
+ require .Equal (t , limits .IngestionRate , extracted ["ingestion_rate" ])
120
+ })
121
+ t .Run ("int should be converted" , func (t * testing.T ) {
122
+ require .Equal (t , float64 (limits .IngestionBurstSize ), extracted ["ingestion_burst_size" ])
123
+ })
124
+ t .Run ("int64 should be converted" , func (t * testing.T ) {
125
+ require .Equal (t , float64 (limits .MaxQueryResponseSize ), extracted ["max_query_response_size" ])
126
+ })
127
+ t .Run ("string shouldn't be converted" , func (t * testing.T ) {
128
+ _ , ok := extracted ["ingestion_rate_strategy" ]
129
+ require .False (t , ok , "string should be not converted" )
130
+ })
131
+ t .Run ("bool should be converted, default value false converted to 0" , func (t * testing.T ) {
132
+ val , ok := extracted ["accept_ha_samples" ]
133
+ require .True (t , ok )
134
+ require .Equal (t , 0.0 , val )
135
+ })
136
+ t .Run ("bool should be converted, default value true converted to 1" , func (t * testing.T ) {
137
+ val , ok := extracted ["enforce_metric_name" ]
138
+ require .True (t , ok )
139
+ require .Equal (t , 1.0 , val )
140
+ })
141
+ t .Run ("flagext.StringSlice shouldn't be converted" , func (t * testing.T ) {
142
+ _ , ok := extracted ["drop_labels" ]
143
+ require .False (t , ok )
144
+ })
145
+ t .Run ("model.Duration should be converted" , func (t * testing.T ) {
146
+ val , ok := extracted ["reject_old_samples_max_age" ]
147
+ require .True (t , ok )
148
+ require .Equal (t , time .Duration (limits .RejectOldSamplesMaxAge ).Seconds (), val )
149
+ })
150
+ t .Run ("[]*relabel.Config shouldn't be converted" , func (t * testing.T ) {
151
+ _ , ok := extracted ["metric_relabel_configs" ]
152
+ require .False (t , ok )
153
+ })
154
+ t .Run ("[]string shouldn't be converted" , func (t * testing.T ) {
155
+ _ , ok := extracted ["promote_resource_attributes" ]
156
+ require .False (t , ok )
157
+ })
158
+ t .Run ("[]LimitsPerLabelSet shouldn't be converted" , func (t * testing.T ) {
159
+ _ , ok := extracted ["limits_per_label_set" ]
160
+ require .False (t , ok )
161
+ })
162
+ t .Run ("QueryPriority shouldn't be converted" , func (t * testing.T ) {
163
+ _ , ok := extracted ["query_priority" ]
164
+ require .False (t , ok )
165
+ })
166
+ t .Run ("QueryRejection shouldn't be converted" , func (t * testing.T ) {
167
+ _ , ok := extracted ["query_rejection" ]
168
+ require .False (t , ok )
169
+ })
170
+ t .Run ("labels.Labels shouldn't be converted" , func (t * testing.T ) {
171
+ _ , ok := extracted ["ruler_external_labels" ]
172
+ require .False (t , ok )
173
+ })
174
+ t .Run ("flagext.CIDRSliceCSV shouldn't be converted" , func (t * testing.T ) {
175
+ _ , ok := extracted ["alertmanager_receivers_firewall_block_cidr_networks" ]
176
+ require .False (t , ok )
177
+ })
178
+ t .Run ("NotificationRateLimitMap shouldn't be converted" , func (t * testing.T ) {
179
+ _ , ok := extracted ["alertmanager_notification_rate_limit_per_integration" ]
180
+ require .False (t , ok )
181
+ })
182
+ t .Run ("DisabledRuleGroups shouldn't be converted" , func (t * testing.T ) {
183
+ _ , ok := extracted ["disabled_rule_groups" ]
184
+ require .False (t , ok )
185
+ })
30
186
}
0 commit comments