| 
									
										
										
										
											2015-01-22 03:07:45 +08:00
										 |  |  | // Copyright 2013 The Prometheus Authors
 | 
					
						
							| 
									
										
										
										
											2013-02-25 09:52:52 +08:00
										 |  |  | // Licensed under the Apache License, Version 2.0 (the "License");
 | 
					
						
							|  |  |  | // you may not use this file except in compliance with the License.
 | 
					
						
							|  |  |  | // You may obtain a copy of the License at
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Unless required by applicable law or agreed to in writing, software
 | 
					
						
							|  |  |  | // distributed under the License is distributed on an "AS IS" BASIS,
 | 
					
						
							|  |  |  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					
						
							|  |  |  | // See the License for the specific language governing permissions and
 | 
					
						
							|  |  |  | // limitations under the License.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-01 17:55:07 +08:00
										 |  |  | package scrape | 
					
						
							| 
									
										
										
										
											2013-02-25 09:52:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 	"crypto/tls" | 
					
						
							|  |  |  | 	"crypto/x509" | 
					
						
							| 
									
										
										
										
											2015-08-22 15:47:57 +08:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2013-04-26 23:26:52 +08:00
										 |  |  | 	"net/http" | 
					
						
							|  |  |  | 	"net/http/httptest" | 
					
						
							| 
									
										
										
										
											2016-03-01 21:49:57 +08:00
										 |  |  | 	"net/url" | 
					
						
							| 
									
										
										
										
											2022-04-27 17:24:36 +08:00
										 |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2024-05-13 23:36:19 +08:00
										 |  |  | 	"strconv" | 
					
						
							| 
									
										
										
										
											2015-04-20 18:24:25 +08:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2013-02-25 09:52:52 +08:00
										 |  |  | 	"testing" | 
					
						
							|  |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2013-06-25 20:02:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-22 17:00:08 +08:00
										 |  |  | 	config_util "github.com/prometheus/common/config" | 
					
						
							| 
									
										
										
										
											2015-08-20 23:18:46 +08:00
										 |  |  | 	"github.com/prometheus/common/model" | 
					
						
							| 
									
										
										
										
											2020-10-29 17:43:23 +08:00
										 |  |  | 	"github.com/stretchr/testify/require" | 
					
						
							| 
									
										
										
										
											2013-06-25 20:02:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 05:50:59 +08:00
										 |  |  | 	"github.com/prometheus/prometheus/config" | 
					
						
							|  |  |  | 	"github.com/prometheus/prometheus/discovery/targetgroup" | 
					
						
							| 
									
										
										
										
											2023-04-25 01:41:04 +08:00
										 |  |  | 	"github.com/prometheus/prometheus/model/histogram" | 
					
						
							| 
									
										
										
										
											2021-11-08 22:23:17 +08:00
										 |  |  | 	"github.com/prometheus/prometheus/model/labels" | 
					
						
							| 
									
										
										
										
											2013-02-25 09:52:52 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-27 05:24:49 +08:00
										 |  |  | const ( | 
					
						
							| 
									
										
										
										
											2016-05-27 05:39:44 +08:00
										 |  |  | 	caCertPath = "testdata/ca.cer" | 
					
						
							| 
									
										
										
										
											2016-05-27 05:24:49 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-15 17:31:38 +08:00
										 |  |  | func TestTargetLabels(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2016-12-29 16:27:30 +08:00
										 |  |  | 	target := newTestTarget("example.com:80", 0, labels.FromStrings("job", "some_job", "foo", "bar")) | 
					
						
							|  |  |  | 	want := labels.FromStrings(model.JobLabel, "some_job", "foo", "bar") | 
					
						
							| 
									
										
										
										
											2024-12-21 21:33:08 +08:00
										 |  |  | 	b := labels.NewBuilder(labels.EmptyLabels()) | 
					
						
							|  |  |  | 	got := target.Labels(b) | 
					
						
							| 
									
										
										
										
											2020-10-29 17:43:23 +08:00
										 |  |  | 	require.Equal(t, want, got) | 
					
						
							| 
									
										
										
										
											2023-03-08 01:10:15 +08:00
										 |  |  | 	i := 0 | 
					
						
							|  |  |  | 	target.LabelsRange(func(l labels.Label) { | 
					
						
							|  |  |  | 		switch i { | 
					
						
							|  |  |  | 		case 0: | 
					
						
							|  |  |  | 			require.Equal(t, labels.Label{Name: "foo", Value: "bar"}, l) | 
					
						
							|  |  |  | 		case 1: | 
					
						
							|  |  |  | 			require.Equal(t, labels.Label{Name: model.JobLabel, Value: "some_job"}, l) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		i++ | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	require.Equal(t, 2, i) | 
					
						
							| 
									
										
										
										
											2015-03-19 01:53:43 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-15 22:22:57 +08:00
										 |  |  | func TestTargetOffset(t *testing.T) { | 
					
						
							|  |  |  | 	interval := 10 * time.Second | 
					
						
							| 
									
										
										
										
											2023-05-25 17:49:43 +08:00
										 |  |  | 	offsetSeed := uint64(0) | 
					
						
							| 
									
										
										
										
											2016-02-15 22:22:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	offsets := make([]time.Duration, 10000) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Calculate offsets for 10000 different targets.
 | 
					
						
							|  |  |  | 	for i := range offsets { | 
					
						
							| 
									
										
										
										
											2016-12-29 16:27:30 +08:00
										 |  |  | 		target := newTestTarget("example.com:80", 0, labels.FromStrings( | 
					
						
							| 
									
										
										
										
											2024-05-13 23:36:19 +08:00
										 |  |  | 			"label", strconv.Itoa(i), | 
					
						
							| 
									
										
										
										
											2016-12-29 16:27:30 +08:00
										 |  |  | 		)) | 
					
						
							| 
									
										
										
										
											2023-05-25 17:49:43 +08:00
										 |  |  | 		offsets[i] = target.offset(interval, offsetSeed) | 
					
						
							| 
									
										
										
										
											2016-02-15 22:22:57 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Put the offsets into buckets and validate that they are all
 | 
					
						
							|  |  |  | 	// within bounds.
 | 
					
						
							|  |  |  | 	bucketSize := 1 * time.Second | 
					
						
							|  |  |  | 	buckets := make([]int, interval/bucketSize) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, offset := range offsets { | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 		require.InDelta(t, time.Duration(0), offset, float64(interval), "Offset %v out of bounds.", offset) | 
					
						
							| 
									
										
										
										
											2016-02-15 22:22:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		bucket := offset / bucketSize | 
					
						
							|  |  |  | 		buckets[bucket]++ | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	t.Log(buckets) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-21 09:41:02 +08:00
										 |  |  | 	// Calculate whether the number of targets per bucket
 | 
					
						
							| 
									
										
										
										
											2016-02-15 22:22:57 +08:00
										 |  |  | 	// does not differ more than a given tolerance.
 | 
					
						
							|  |  |  | 	avg := len(offsets) / len(buckets) | 
					
						
							|  |  |  | 	tolerance := 0.15 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, bucket := range buckets { | 
					
						
							|  |  |  | 		diff := bucket - avg | 
					
						
							|  |  |  | 		if diff < 0 { | 
					
						
							|  |  |  | 			diff = -diff | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 		require.LessOrEqual(t, float64(diff)/float64(avg), tolerance, "Bucket out of tolerance bounds.") | 
					
						
							| 
									
										
										
										
											2016-02-15 22:22:57 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-01 21:49:57 +08:00
										 |  |  | func TestTargetURL(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2024-12-21 21:33:08 +08:00
										 |  |  | 	scrapeConfig := &config.ScrapeConfig{ | 
					
						
							|  |  |  | 		Params: url.Values{ | 
					
						
							|  |  |  | 			"abc": []string{"foo", "bar", "baz"}, | 
					
						
							|  |  |  | 			"xyz": []string{"hoo"}, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2016-03-01 21:49:57 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-12-29 16:27:30 +08:00
										 |  |  | 	labels := labels.FromMap(map[string]string{ | 
					
						
							| 
									
										
										
										
											2016-03-01 21:49:57 +08:00
										 |  |  | 		model.AddressLabel:     "example.com:1234", | 
					
						
							|  |  |  | 		model.SchemeLabel:      "https", | 
					
						
							|  |  |  | 		model.MetricsPathLabel: "/metricz", | 
					
						
							|  |  |  | 		"__param_abc":          "overwrite", | 
					
						
							|  |  |  | 		"__param_cde":          "huu", | 
					
						
							| 
									
										
										
										
											2016-12-29 16:27:30 +08:00
										 |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2024-12-21 21:33:08 +08:00
										 |  |  | 	target := NewTarget(labels, scrapeConfig, nil, nil) | 
					
						
							| 
									
										
										
										
											2016-03-01 21:49:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// The reserved labels are concatenated into a full URL. The first value for each
 | 
					
						
							|  |  |  | 	// URL query parameter can be set/modified via labels as well.
 | 
					
						
							|  |  |  | 	expectedParams := url.Values{ | 
					
						
							|  |  |  | 		"abc": []string{"overwrite", "bar", "baz"}, | 
					
						
							|  |  |  | 		"cde": []string{"huu"}, | 
					
						
							|  |  |  | 		"xyz": []string{"hoo"}, | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-10-22 17:00:08 +08:00
										 |  |  | 	expectedURL := &url.URL{ | 
					
						
							| 
									
										
										
										
											2016-03-01 21:49:57 +08:00
										 |  |  | 		Scheme:   "https", | 
					
						
							|  |  |  | 		Host:     "example.com:1234", | 
					
						
							|  |  |  | 		Path:     "/metricz", | 
					
						
							|  |  |  | 		RawQuery: expectedParams.Encode(), | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-29 17:43:23 +08:00
										 |  |  | 	require.Equal(t, expectedURL, target.URL()) | 
					
						
							| 
									
										
										
										
											2016-03-01 21:49:57 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-07-06 03:25:45 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-12 19:05:41 +08:00
										 |  |  | func newTestTarget(targetURL string, _ time.Duration, lbls labels.Labels) *Target { | 
					
						
							| 
									
										
										
										
											2016-12-29 16:27:30 +08:00
										 |  |  | 	lb := labels.NewBuilder(lbls) | 
					
						
							|  |  |  | 	lb.Set(model.SchemeLabel, "http") | 
					
						
							| 
									
										
										
										
											2017-10-09 23:57:05 +08:00
										 |  |  | 	lb.Set(model.AddressLabel, strings.TrimPrefix(targetURL, "http://")) | 
					
						
							| 
									
										
										
										
											2016-12-29 16:27:30 +08:00
										 |  |  | 	lb.Set(model.MetricsPathLabel, "/metrics") | 
					
						
							| 
									
										
										
										
											2016-02-12 22:43:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-21 21:33:08 +08:00
										 |  |  | 	return &Target{labels: lb.Labels(), scrapeConfig: &config.ScrapeConfig{}} | 
					
						
							| 
									
										
										
										
											2015-04-20 18:24:25 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestNewHTTPBearerToken(t *testing.T) { | 
					
						
							|  |  |  | 	server := httptest.NewServer( | 
					
						
							|  |  |  | 		http.HandlerFunc( | 
					
						
							| 
									
										
										
										
											2025-02-10 15:06:58 +08:00
										 |  |  | 			func(_ http.ResponseWriter, r *http.Request) { | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 				expected := "Bearer 1234" | 
					
						
							|  |  |  | 				received := r.Header.Get("Authorization") | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 				require.Equal(t, expected, received, "Authorization header was not set correctly.") | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 		), | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | 	defer server.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Refactor SD configuration to remove `config` dependency (#3629)
* refactor: move targetGroup struct and CheckOverflow() to their own package
* refactor: move auth and security related structs to a utility package, fix import error in utility package
* refactor: Azure SD, remove SD struct from config
* refactor: DNS SD, remove SD struct from config into dns package
* refactor: ec2 SD, move SD struct from config into the ec2 package
* refactor: file SD, move SD struct from config to file discovery package
* refactor: gce, move SD struct from config to gce discovery package
* refactor: move HTTPClientConfig and URL into util/config, fix import error in httputil
* refactor: consul, move SD struct from config into consul discovery package
* refactor: marathon, move SD struct from config into marathon discovery package
* refactor: triton, move SD struct from config to triton discovery package, fix test
* refactor: zookeeper, move SD structs from config to zookeeper discovery package
* refactor: openstack, remove SD struct from config, move into openstack discovery package
* refactor: kubernetes, move SD struct from config into kubernetes discovery package
* refactor: notifier, use targetgroup package instead of config
* refactor: tests for file, marathon, triton SD - use targetgroup package instead of config.TargetGroup
* refactor: retrieval, use targetgroup package instead of config.TargetGroup
* refactor: storage, use config util package
* refactor: discovery manager, use targetgroup package instead of config.TargetGroup
* refactor: use HTTPClient and TLS config from configUtil instead of config
* refactor: tests, use targetgroup package instead of config.TargetGroup
* refactor: fix tagetgroup.Group pointers that were removed by mistake
* refactor: openstack, kubernetes: drop prefixes
* refactor: remove import aliases forced due to vscode bug
* refactor: move main SD struct out of config into discovery/config
* refactor: rename configUtil to config_util
* refactor: rename yamlUtil to yaml_config
* refactor: kubernetes, remove prefixes
* refactor: move the TargetGroup package to discovery/
* refactor: fix order of imports
											
										 
											2017-12-30 04:01:34 +08:00
										 |  |  | 	cfg := config_util.HTTPClientConfig{ | 
					
						
							| 
									
										
										
										
											2016-11-23 19:41:19 +08:00
										 |  |  | 		BearerToken: "1234", | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-09-27 05:16:12 +08:00
										 |  |  | 	c, err := config_util.NewClientFromConfig(cfg, "test") | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 	_, err = c.Get(server.URL) | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestNewHTTPBearerTokenFile(t *testing.T) { | 
					
						
							|  |  |  | 	server := httptest.NewServer( | 
					
						
							|  |  |  | 		http.HandlerFunc( | 
					
						
							| 
									
										
										
										
											2025-02-10 15:06:58 +08:00
										 |  |  | 			func(_ http.ResponseWriter, r *http.Request) { | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 				expected := "Bearer 12345" | 
					
						
							|  |  |  | 				received := r.Header.Get("Authorization") | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 				require.Equal(t, expected, received, "Authorization header was not set correctly.") | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 		), | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | 	defer server.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Refactor SD configuration to remove `config` dependency (#3629)
* refactor: move targetGroup struct and CheckOverflow() to their own package
* refactor: move auth and security related structs to a utility package, fix import error in utility package
* refactor: Azure SD, remove SD struct from config
* refactor: DNS SD, remove SD struct from config into dns package
* refactor: ec2 SD, move SD struct from config into the ec2 package
* refactor: file SD, move SD struct from config to file discovery package
* refactor: gce, move SD struct from config to gce discovery package
* refactor: move HTTPClientConfig and URL into util/config, fix import error in httputil
* refactor: consul, move SD struct from config into consul discovery package
* refactor: marathon, move SD struct from config into marathon discovery package
* refactor: triton, move SD struct from config to triton discovery package, fix test
* refactor: zookeeper, move SD structs from config to zookeeper discovery package
* refactor: openstack, remove SD struct from config, move into openstack discovery package
* refactor: kubernetes, move SD struct from config into kubernetes discovery package
* refactor: notifier, use targetgroup package instead of config
* refactor: tests for file, marathon, triton SD - use targetgroup package instead of config.TargetGroup
* refactor: retrieval, use targetgroup package instead of config.TargetGroup
* refactor: storage, use config util package
* refactor: discovery manager, use targetgroup package instead of config.TargetGroup
* refactor: use HTTPClient and TLS config from configUtil instead of config
* refactor: tests, use targetgroup package instead of config.TargetGroup
* refactor: fix tagetgroup.Group pointers that were removed by mistake
* refactor: openstack, kubernetes: drop prefixes
* refactor: remove import aliases forced due to vscode bug
* refactor: move main SD struct out of config into discovery/config
* refactor: rename configUtil to config_util
* refactor: rename yamlUtil to yaml_config
* refactor: kubernetes, remove prefixes
* refactor: move the TargetGroup package to discovery/
* refactor: fix order of imports
											
										 
											2017-12-30 04:01:34 +08:00
										 |  |  | 	cfg := config_util.HTTPClientConfig{ | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 		BearerTokenFile: "testdata/bearertoken.txt", | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-09-27 05:16:12 +08:00
										 |  |  | 	c, err := config_util.NewClientFromConfig(cfg, "test") | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 	_, err = c.Get(server.URL) | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-19 05:23:58 +08:00
										 |  |  | func TestNewHTTPBasicAuth(t *testing.T) { | 
					
						
							|  |  |  | 	server := httptest.NewServer( | 
					
						
							|  |  |  | 		http.HandlerFunc( | 
					
						
							| 
									
										
										
										
											2025-02-10 15:06:58 +08:00
										 |  |  | 			func(_ http.ResponseWriter, r *http.Request) { | 
					
						
							| 
									
										
										
										
											2015-07-19 05:23:58 +08:00
										 |  |  | 				username, password, ok := r.BasicAuth() | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 				require.True(t, ok, "Basic authorization header was not set correctly.") | 
					
						
							|  |  |  | 				require.Equal(t, "user", username) | 
					
						
							|  |  |  | 				require.Equal(t, "password123", password) | 
					
						
							| 
									
										
										
										
											2015-07-19 05:23:58 +08:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 		), | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | 	defer server.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Refactor SD configuration to remove `config` dependency (#3629)
* refactor: move targetGroup struct and CheckOverflow() to their own package
* refactor: move auth and security related structs to a utility package, fix import error in utility package
* refactor: Azure SD, remove SD struct from config
* refactor: DNS SD, remove SD struct from config into dns package
* refactor: ec2 SD, move SD struct from config into the ec2 package
* refactor: file SD, move SD struct from config to file discovery package
* refactor: gce, move SD struct from config to gce discovery package
* refactor: move HTTPClientConfig and URL into util/config, fix import error in httputil
* refactor: consul, move SD struct from config into consul discovery package
* refactor: marathon, move SD struct from config into marathon discovery package
* refactor: triton, move SD struct from config to triton discovery package, fix test
* refactor: zookeeper, move SD structs from config to zookeeper discovery package
* refactor: openstack, remove SD struct from config, move into openstack discovery package
* refactor: kubernetes, move SD struct from config into kubernetes discovery package
* refactor: notifier, use targetgroup package instead of config
* refactor: tests for file, marathon, triton SD - use targetgroup package instead of config.TargetGroup
* refactor: retrieval, use targetgroup package instead of config.TargetGroup
* refactor: storage, use config util package
* refactor: discovery manager, use targetgroup package instead of config.TargetGroup
* refactor: use HTTPClient and TLS config from configUtil instead of config
* refactor: tests, use targetgroup package instead of config.TargetGroup
* refactor: fix tagetgroup.Group pointers that were removed by mistake
* refactor: openstack, kubernetes: drop prefixes
* refactor: remove import aliases forced due to vscode bug
* refactor: move main SD struct out of config into discovery/config
* refactor: rename configUtil to config_util
* refactor: rename yamlUtil to yaml_config
* refactor: kubernetes, remove prefixes
* refactor: move the TargetGroup package to discovery/
* refactor: fix order of imports
											
										 
											2017-12-30 04:01:34 +08:00
										 |  |  | 	cfg := config_util.HTTPClientConfig{ | 
					
						
							|  |  |  | 		BasicAuth: &config_util.BasicAuth{ | 
					
						
							| 
									
										
										
										
											2015-07-19 05:23:58 +08:00
										 |  |  | 			Username: "user", | 
					
						
							|  |  |  | 			Password: "password123", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-09-27 05:16:12 +08:00
										 |  |  | 	c, err := config_util.NewClientFromConfig(cfg, "test") | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2015-07-19 05:23:58 +08:00
										 |  |  | 	_, err = c.Get(server.URL) | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2015-07-19 05:23:58 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | func TestNewHTTPCACert(t *testing.T) { | 
					
						
							|  |  |  | 	server := httptest.NewUnstartedServer( | 
					
						
							|  |  |  | 		http.HandlerFunc( | 
					
						
							| 
									
										
										
										
											2025-02-10 15:06:58 +08:00
										 |  |  | 			func(w http.ResponseWriter, _ *http.Request) { | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 				w.Header().Set("Content-Type", `text/plain; version=0.0.4`) | 
					
						
							|  |  |  | 				w.Write([]byte{}) | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		), | 
					
						
							|  |  |  | 	) | 
					
						
							| 
									
										
										
										
											2016-05-27 05:24:49 +08:00
										 |  |  | 	server.TLS = newTLSConfig("server", t) | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 	server.StartTLS() | 
					
						
							|  |  |  | 	defer server.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Refactor SD configuration to remove `config` dependency (#3629)
* refactor: move targetGroup struct and CheckOverflow() to their own package
* refactor: move auth and security related structs to a utility package, fix import error in utility package
* refactor: Azure SD, remove SD struct from config
* refactor: DNS SD, remove SD struct from config into dns package
* refactor: ec2 SD, move SD struct from config into the ec2 package
* refactor: file SD, move SD struct from config to file discovery package
* refactor: gce, move SD struct from config to gce discovery package
* refactor: move HTTPClientConfig and URL into util/config, fix import error in httputil
* refactor: consul, move SD struct from config into consul discovery package
* refactor: marathon, move SD struct from config into marathon discovery package
* refactor: triton, move SD struct from config to triton discovery package, fix test
* refactor: zookeeper, move SD structs from config to zookeeper discovery package
* refactor: openstack, remove SD struct from config, move into openstack discovery package
* refactor: kubernetes, move SD struct from config into kubernetes discovery package
* refactor: notifier, use targetgroup package instead of config
* refactor: tests for file, marathon, triton SD - use targetgroup package instead of config.TargetGroup
* refactor: retrieval, use targetgroup package instead of config.TargetGroup
* refactor: storage, use config util package
* refactor: discovery manager, use targetgroup package instead of config.TargetGroup
* refactor: use HTTPClient and TLS config from configUtil instead of config
* refactor: tests, use targetgroup package instead of config.TargetGroup
* refactor: fix tagetgroup.Group pointers that were removed by mistake
* refactor: openstack, kubernetes: drop prefixes
* refactor: remove import aliases forced due to vscode bug
* refactor: move main SD struct out of config into discovery/config
* refactor: rename configUtil to config_util
* refactor: rename yamlUtil to yaml_config
* refactor: kubernetes, remove prefixes
* refactor: move the TargetGroup package to discovery/
* refactor: fix order of imports
											
										 
											2017-12-30 04:01:34 +08:00
										 |  |  | 	cfg := config_util.HTTPClientConfig{ | 
					
						
							|  |  |  | 		TLSConfig: config_util.TLSConfig{ | 
					
						
							| 
									
										
										
										
											2016-05-27 05:39:44 +08:00
										 |  |  | 			CAFile: caCertPath, | 
					
						
							| 
									
										
										
										
											2015-09-07 07:07:44 +08:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-09-27 05:16:12 +08:00
										 |  |  | 	c, err := config_util.NewClientFromConfig(cfg, "test") | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 	_, err = c.Get(server.URL) | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestNewHTTPClientCert(t *testing.T) { | 
					
						
							|  |  |  | 	server := httptest.NewUnstartedServer( | 
					
						
							|  |  |  | 		http.HandlerFunc( | 
					
						
							| 
									
										
										
										
											2025-02-10 15:06:58 +08:00
										 |  |  | 			func(w http.ResponseWriter, _ *http.Request) { | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 				w.Header().Set("Content-Type", `text/plain; version=0.0.4`) | 
					
						
							|  |  |  | 				w.Write([]byte{}) | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		), | 
					
						
							|  |  |  | 	) | 
					
						
							| 
									
										
										
										
											2016-05-27 05:24:49 +08:00
										 |  |  | 	tlsConfig := newTLSConfig("server", t) | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 	tlsConfig.ClientAuth = tls.RequireAndVerifyClientCert | 
					
						
							|  |  |  | 	tlsConfig.ClientCAs = tlsConfig.RootCAs | 
					
						
							|  |  |  | 	server.TLS = tlsConfig | 
					
						
							|  |  |  | 	server.StartTLS() | 
					
						
							|  |  |  | 	defer server.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Refactor SD configuration to remove `config` dependency (#3629)
* refactor: move targetGroup struct and CheckOverflow() to their own package
* refactor: move auth and security related structs to a utility package, fix import error in utility package
* refactor: Azure SD, remove SD struct from config
* refactor: DNS SD, remove SD struct from config into dns package
* refactor: ec2 SD, move SD struct from config into the ec2 package
* refactor: file SD, move SD struct from config to file discovery package
* refactor: gce, move SD struct from config to gce discovery package
* refactor: move HTTPClientConfig and URL into util/config, fix import error in httputil
* refactor: consul, move SD struct from config into consul discovery package
* refactor: marathon, move SD struct from config into marathon discovery package
* refactor: triton, move SD struct from config to triton discovery package, fix test
* refactor: zookeeper, move SD structs from config to zookeeper discovery package
* refactor: openstack, remove SD struct from config, move into openstack discovery package
* refactor: kubernetes, move SD struct from config into kubernetes discovery package
* refactor: notifier, use targetgroup package instead of config
* refactor: tests for file, marathon, triton SD - use targetgroup package instead of config.TargetGroup
* refactor: retrieval, use targetgroup package instead of config.TargetGroup
* refactor: storage, use config util package
* refactor: discovery manager, use targetgroup package instead of config.TargetGroup
* refactor: use HTTPClient and TLS config from configUtil instead of config
* refactor: tests, use targetgroup package instead of config.TargetGroup
* refactor: fix tagetgroup.Group pointers that were removed by mistake
* refactor: openstack, kubernetes: drop prefixes
* refactor: remove import aliases forced due to vscode bug
* refactor: move main SD struct out of config into discovery/config
* refactor: rename configUtil to config_util
* refactor: rename yamlUtil to yaml_config
* refactor: kubernetes, remove prefixes
* refactor: move the TargetGroup package to discovery/
* refactor: fix order of imports
											
										 
											2017-12-30 04:01:34 +08:00
										 |  |  | 	cfg := config_util.HTTPClientConfig{ | 
					
						
							|  |  |  | 		TLSConfig: config_util.TLSConfig{ | 
					
						
							| 
									
										
										
										
											2016-05-27 05:39:44 +08:00
										 |  |  | 			CAFile:   caCertPath, | 
					
						
							| 
									
										
										
										
											2015-09-07 07:07:44 +08:00
										 |  |  | 			CertFile: "testdata/client.cer", | 
					
						
							|  |  |  | 			KeyFile:  "testdata/client.key", | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-09-27 05:16:12 +08:00
										 |  |  | 	c, err := config_util.NewClientFromConfig(cfg, "test") | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 	_, err = c.Get(server.URL) | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-27 05:24:49 +08:00
										 |  |  | func TestNewHTTPWithServerName(t *testing.T) { | 
					
						
							|  |  |  | 	server := httptest.NewUnstartedServer( | 
					
						
							|  |  |  | 		http.HandlerFunc( | 
					
						
							| 
									
										
										
										
											2025-02-10 15:06:58 +08:00
										 |  |  | 			func(w http.ResponseWriter, _ *http.Request) { | 
					
						
							| 
									
										
										
										
											2016-05-27 05:24:49 +08:00
										 |  |  | 				w.Header().Set("Content-Type", `text/plain; version=0.0.4`) | 
					
						
							|  |  |  | 				w.Write([]byte{}) | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		), | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | 	server.TLS = newTLSConfig("servername", t) | 
					
						
							|  |  |  | 	server.StartTLS() | 
					
						
							|  |  |  | 	defer server.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Refactor SD configuration to remove `config` dependency (#3629)
* refactor: move targetGroup struct and CheckOverflow() to their own package
* refactor: move auth and security related structs to a utility package, fix import error in utility package
* refactor: Azure SD, remove SD struct from config
* refactor: DNS SD, remove SD struct from config into dns package
* refactor: ec2 SD, move SD struct from config into the ec2 package
* refactor: file SD, move SD struct from config to file discovery package
* refactor: gce, move SD struct from config to gce discovery package
* refactor: move HTTPClientConfig and URL into util/config, fix import error in httputil
* refactor: consul, move SD struct from config into consul discovery package
* refactor: marathon, move SD struct from config into marathon discovery package
* refactor: triton, move SD struct from config to triton discovery package, fix test
* refactor: zookeeper, move SD structs from config to zookeeper discovery package
* refactor: openstack, remove SD struct from config, move into openstack discovery package
* refactor: kubernetes, move SD struct from config into kubernetes discovery package
* refactor: notifier, use targetgroup package instead of config
* refactor: tests for file, marathon, triton SD - use targetgroup package instead of config.TargetGroup
* refactor: retrieval, use targetgroup package instead of config.TargetGroup
* refactor: storage, use config util package
* refactor: discovery manager, use targetgroup package instead of config.TargetGroup
* refactor: use HTTPClient and TLS config from configUtil instead of config
* refactor: tests, use targetgroup package instead of config.TargetGroup
* refactor: fix tagetgroup.Group pointers that were removed by mistake
* refactor: openstack, kubernetes: drop prefixes
* refactor: remove import aliases forced due to vscode bug
* refactor: move main SD struct out of config into discovery/config
* refactor: rename configUtil to config_util
* refactor: rename yamlUtil to yaml_config
* refactor: kubernetes, remove prefixes
* refactor: move the TargetGroup package to discovery/
* refactor: fix order of imports
											
										 
											2017-12-30 04:01:34 +08:00
										 |  |  | 	cfg := config_util.HTTPClientConfig{ | 
					
						
							|  |  |  | 		TLSConfig: config_util.TLSConfig{ | 
					
						
							| 
									
										
										
										
											2016-05-27 05:39:44 +08:00
										 |  |  | 			CAFile:     caCertPath, | 
					
						
							| 
									
										
										
										
											2016-05-27 05:24:49 +08:00
										 |  |  | 			ServerName: "prometheus.rocks", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-09-27 05:16:12 +08:00
										 |  |  | 	c, err := config_util.NewClientFromConfig(cfg, "test") | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2016-05-27 05:24:49 +08:00
										 |  |  | 	_, err = c.Get(server.URL) | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2016-05-27 05:24:49 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestNewHTTPWithBadServerName(t *testing.T) { | 
					
						
							|  |  |  | 	server := httptest.NewUnstartedServer( | 
					
						
							|  |  |  | 		http.HandlerFunc( | 
					
						
							| 
									
										
										
										
											2025-02-10 15:06:58 +08:00
										 |  |  | 			func(w http.ResponseWriter, _ *http.Request) { | 
					
						
							| 
									
										
										
										
											2016-05-27 05:24:49 +08:00
										 |  |  | 				w.Header().Set("Content-Type", `text/plain; version=0.0.4`) | 
					
						
							|  |  |  | 				w.Write([]byte{}) | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		), | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | 	server.TLS = newTLSConfig("servername", t) | 
					
						
							|  |  |  | 	server.StartTLS() | 
					
						
							|  |  |  | 	defer server.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Refactor SD configuration to remove `config` dependency (#3629)
* refactor: move targetGroup struct and CheckOverflow() to their own package
* refactor: move auth and security related structs to a utility package, fix import error in utility package
* refactor: Azure SD, remove SD struct from config
* refactor: DNS SD, remove SD struct from config into dns package
* refactor: ec2 SD, move SD struct from config into the ec2 package
* refactor: file SD, move SD struct from config to file discovery package
* refactor: gce, move SD struct from config to gce discovery package
* refactor: move HTTPClientConfig and URL into util/config, fix import error in httputil
* refactor: consul, move SD struct from config into consul discovery package
* refactor: marathon, move SD struct from config into marathon discovery package
* refactor: triton, move SD struct from config to triton discovery package, fix test
* refactor: zookeeper, move SD structs from config to zookeeper discovery package
* refactor: openstack, remove SD struct from config, move into openstack discovery package
* refactor: kubernetes, move SD struct from config into kubernetes discovery package
* refactor: notifier, use targetgroup package instead of config
* refactor: tests for file, marathon, triton SD - use targetgroup package instead of config.TargetGroup
* refactor: retrieval, use targetgroup package instead of config.TargetGroup
* refactor: storage, use config util package
* refactor: discovery manager, use targetgroup package instead of config.TargetGroup
* refactor: use HTTPClient and TLS config from configUtil instead of config
* refactor: tests, use targetgroup package instead of config.TargetGroup
* refactor: fix tagetgroup.Group pointers that were removed by mistake
* refactor: openstack, kubernetes: drop prefixes
* refactor: remove import aliases forced due to vscode bug
* refactor: move main SD struct out of config into discovery/config
* refactor: rename configUtil to config_util
* refactor: rename yamlUtil to yaml_config
* refactor: kubernetes, remove prefixes
* refactor: move the TargetGroup package to discovery/
* refactor: fix order of imports
											
										 
											2017-12-30 04:01:34 +08:00
										 |  |  | 	cfg := config_util.HTTPClientConfig{ | 
					
						
							|  |  |  | 		TLSConfig: config_util.TLSConfig{ | 
					
						
							| 
									
										
										
										
											2016-05-27 05:39:44 +08:00
										 |  |  | 			CAFile:     caCertPath, | 
					
						
							| 
									
										
										
										
											2016-05-27 05:24:49 +08:00
										 |  |  | 			ServerName: "badname", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-09-27 05:16:12 +08:00
										 |  |  | 	c, err := config_util.NewClientFromConfig(cfg, "test") | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.NoError(t, err) | 
					
						
							| 
									
										
										
										
											2016-05-27 05:24:49 +08:00
										 |  |  | 	_, err = c.Get(server.URL) | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.Error(t, err) | 
					
						
							| 
									
										
										
										
											2016-05-27 05:24:49 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func newTLSConfig(certName string, t *testing.T) *tls.Config { | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 	tlsConfig := &tls.Config{} | 
					
						
							|  |  |  | 	caCertPool := x509.NewCertPool() | 
					
						
							| 
									
										
										
										
											2022-04-27 17:24:36 +08:00
										 |  |  | 	caCert, err := os.ReadFile(caCertPath) | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.NoError(t, err, "Couldn't read CA cert.") | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 	caCertPool.AppendCertsFromPEM(caCert) | 
					
						
							|  |  |  | 	tlsConfig.RootCAs = caCertPool | 
					
						
							|  |  |  | 	tlsConfig.ServerName = "127.0.0.1" | 
					
						
							| 
									
										
										
										
											2016-05-27 05:24:49 +08:00
										 |  |  | 	certPath := fmt.Sprintf("testdata/%s.cer", certName) | 
					
						
							|  |  |  | 	keyPath := fmt.Sprintf("testdata/%s.key", certName) | 
					
						
							|  |  |  | 	cert, err := tls.LoadX509KeyPair(certPath, keyPath) | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.NoError(t, err, "Unable to use specified server cert (%s) & key (%v).", certPath, keyPath) | 
					
						
							| 
									
										
										
										
											2015-07-22 23:48:22 +08:00
										 |  |  | 	tlsConfig.Certificates = []tls.Certificate{cert} | 
					
						
							|  |  |  | 	return tlsConfig | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-02-09 04:26:00 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-29 02:21:50 +08:00
										 |  |  | func TestNewClientWithBadTLSConfig(t *testing.T) { | 
					
						
							| 
									
										
											  
											
												Refactor SD configuration to remove `config` dependency (#3629)
* refactor: move targetGroup struct and CheckOverflow() to their own package
* refactor: move auth and security related structs to a utility package, fix import error in utility package
* refactor: Azure SD, remove SD struct from config
* refactor: DNS SD, remove SD struct from config into dns package
* refactor: ec2 SD, move SD struct from config into the ec2 package
* refactor: file SD, move SD struct from config to file discovery package
* refactor: gce, move SD struct from config to gce discovery package
* refactor: move HTTPClientConfig and URL into util/config, fix import error in httputil
* refactor: consul, move SD struct from config into consul discovery package
* refactor: marathon, move SD struct from config into marathon discovery package
* refactor: triton, move SD struct from config to triton discovery package, fix test
* refactor: zookeeper, move SD structs from config to zookeeper discovery package
* refactor: openstack, remove SD struct from config, move into openstack discovery package
* refactor: kubernetes, move SD struct from config into kubernetes discovery package
* refactor: notifier, use targetgroup package instead of config
* refactor: tests for file, marathon, triton SD - use targetgroup package instead of config.TargetGroup
* refactor: retrieval, use targetgroup package instead of config.TargetGroup
* refactor: storage, use config util package
* refactor: discovery manager, use targetgroup package instead of config.TargetGroup
* refactor: use HTTPClient and TLS config from configUtil instead of config
* refactor: tests, use targetgroup package instead of config.TargetGroup
* refactor: fix tagetgroup.Group pointers that were removed by mistake
* refactor: openstack, kubernetes: drop prefixes
* refactor: remove import aliases forced due to vscode bug
* refactor: move main SD struct out of config into discovery/config
* refactor: rename configUtil to config_util
* refactor: rename yamlUtil to yaml_config
* refactor: kubernetes, remove prefixes
* refactor: move the TargetGroup package to discovery/
* refactor: fix order of imports
											
										 
											2017-12-30 04:01:34 +08:00
										 |  |  | 	cfg := config_util.HTTPClientConfig{ | 
					
						
							|  |  |  | 		TLSConfig: config_util.TLSConfig{ | 
					
						
							| 
									
										
										
										
											2016-02-09 04:26:00 +08:00
										 |  |  | 			CAFile:   "testdata/nonexistent_ca.cer", | 
					
						
							|  |  |  | 			CertFile: "testdata/nonexistent_client.cer", | 
					
						
							|  |  |  | 			KeyFile:  "testdata/nonexistent_client.key", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-09-27 05:16:12 +08:00
										 |  |  | 	_, err := config_util.NewClientFromConfig(cfg, "test") | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.Error(t, err) | 
					
						
							| 
									
										
										
										
											2016-02-09 04:26:00 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2021-05-29 05:50:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestTargetsFromGroup(t *testing.T) { | 
					
						
							|  |  |  | 	expectedError := "instance 0 in group : no address" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-16 20:28:46 +08:00
										 |  |  | 	cfg := config.ScrapeConfig{ | 
					
						
							|  |  |  | 		ScrapeTimeout:  model.Duration(10 * time.Second), | 
					
						
							|  |  |  | 		ScrapeInterval: model.Duration(1 * time.Minute), | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-03-07 17:23:34 +08:00
										 |  |  | 	lb := labels.NewBuilder(labels.EmptyLabels()) | 
					
						
							| 
									
										
										
										
											2024-09-15 02:04:33 +08:00
										 |  |  | 	targets, failures := TargetsFromGroup(&targetgroup.Group{Targets: []model.LabelSet{{}, {model.AddressLabel: "localhost:9090"}}}, &cfg, nil, lb) | 
					
						
							| 
									
										
										
										
											2021-09-04 20:35:03 +08:00
										 |  |  | 	require.Len(t, targets, 1) | 
					
						
							|  |  |  | 	require.Len(t, failures, 1) | 
					
						
							|  |  |  | 	require.EqualError(t, failures[0], expectedError) | 
					
						
							| 
									
										
										
										
											2021-05-29 05:50:59 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2023-03-01 00:12:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-04 00:40:18 +08:00
										 |  |  | // TestTargetsFromGroupWithLabelKeepDrop aims to demonstrate and reinforce the current behavior: relabeling's "labelkeep" and "labeldrop"
 | 
					
						
							|  |  |  | // are applied to all labels of a target, including internal ones (labels starting with "__" such as "__address__").
 | 
					
						
							|  |  |  | // This will be helpful for cases like https://github.com/prometheus/prometheus/issues/12355.
 | 
					
						
							|  |  |  | func TestTargetsFromGroupWithLabelKeepDrop(t *testing.T) { | 
					
						
							|  |  |  | 	tests := []struct { | 
					
						
							|  |  |  | 		name             string | 
					
						
							|  |  |  | 		cfgText          string | 
					
						
							|  |  |  | 		targets          []model.LabelSet | 
					
						
							|  |  |  | 		shouldDropTarget bool | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			name: "no relabeling", | 
					
						
							|  |  |  | 			cfgText: ` | 
					
						
							|  |  |  | global: | 
					
						
							|  |  |  |   metric_name_validation_scheme: legacy | 
					
						
							|  |  |  | scrape_configs: | 
					
						
							|  |  |  |   - job_name: job1 | 
					
						
							|  |  |  |     static_configs: | 
					
						
							|  |  |  |       - targets: ["localhost:9090"] | 
					
						
							|  |  |  | `, | 
					
						
							|  |  |  | 			targets: []model.LabelSet{{model.AddressLabel: "localhost:9090"}}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			name: "labelkeep", | 
					
						
							|  |  |  | 			cfgText: ` | 
					
						
							|  |  |  | global: | 
					
						
							|  |  |  |   metric_name_validation_scheme: legacy | 
					
						
							|  |  |  | scrape_configs: | 
					
						
							|  |  |  |   - job_name: job1 | 
					
						
							|  |  |  |     static_configs: | 
					
						
							|  |  |  |       - targets: ["localhost:9090"] | 
					
						
							|  |  |  |     relabel_configs: | 
					
						
							|  |  |  |       - regex: 'foo' | 
					
						
							|  |  |  |         action: labelkeep | 
					
						
							|  |  |  | `, | 
					
						
							|  |  |  | 			targets:          []model.LabelSet{{model.AddressLabel: "localhost:9090"}}, | 
					
						
							|  |  |  | 			shouldDropTarget: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			name: "labeldrop", | 
					
						
							|  |  |  | 			cfgText: ` | 
					
						
							|  |  |  | global: | 
					
						
							|  |  |  |   metric_name_validation_scheme: legacy | 
					
						
							|  |  |  | scrape_configs: | 
					
						
							|  |  |  |   - job_name: job1 | 
					
						
							|  |  |  |     static_configs: | 
					
						
							|  |  |  |       - targets: ["localhost:9090"] | 
					
						
							|  |  |  |     relabel_configs: | 
					
						
							|  |  |  |       - regex: '__address__' | 
					
						
							|  |  |  |         action: labeldrop | 
					
						
							|  |  |  | `, | 
					
						
							|  |  |  | 			targets:          []model.LabelSet{{model.AddressLabel: "localhost:9090"}}, | 
					
						
							|  |  |  | 			shouldDropTarget: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, tt := range tests { | 
					
						
							|  |  |  | 		t.Run(tt.name, func(t *testing.T) { | 
					
						
							|  |  |  | 			config := loadConfiguration(t, tt.cfgText) | 
					
						
							|  |  |  | 			lb := labels.NewBuilder(labels.EmptyLabels()) | 
					
						
							|  |  |  | 			targets, failures := TargetsFromGroup(&targetgroup.Group{Targets: tt.targets}, config.ScrapeConfigs[0], nil, lb) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if tt.shouldDropTarget { | 
					
						
							|  |  |  | 				require.Len(t, failures, 1) | 
					
						
							|  |  |  | 				require.EqualError(t, failures[0], "instance 0 in group : no address") | 
					
						
							|  |  |  | 				require.Empty(t, targets) | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				require.Empty(t, failures) | 
					
						
							|  |  |  | 				require.Len(t, targets, 1) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-01 00:12:27 +08:00
										 |  |  | func BenchmarkTargetsFromGroup(b *testing.B) { | 
					
						
							|  |  |  | 	// Simulate Kubernetes service-discovery and use subset of rules from typical Prometheus config.
 | 
					
						
							|  |  |  | 	cfgText := ` | 
					
						
							|  |  |  | scrape_configs: | 
					
						
							|  |  |  |   - job_name: job1 | 
					
						
							|  |  |  |     scrape_interval: 15s | 
					
						
							|  |  |  |     scrape_timeout: 10s | 
					
						
							|  |  |  |     relabel_configs: | 
					
						
							|  |  |  |     - source_labels: [__meta_kubernetes_pod_container_port_name] | 
					
						
							|  |  |  |       separator: ; | 
					
						
							|  |  |  |       regex: .*-metrics | 
					
						
							|  |  |  |       replacement: $1 | 
					
						
							|  |  |  |       action: keep | 
					
						
							|  |  |  |     - source_labels: [__meta_kubernetes_pod_phase] | 
					
						
							|  |  |  |       separator: ; | 
					
						
							|  |  |  |       regex: Succeeded|Failed | 
					
						
							|  |  |  |       replacement: $1 | 
					
						
							|  |  |  |       action: drop | 
					
						
							|  |  |  |     - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_pod_label_name] | 
					
						
							|  |  |  |       separator: / | 
					
						
							|  |  |  |       regex: (.*) | 
					
						
							|  |  |  |       target_label: job | 
					
						
							|  |  |  |       replacement: $1 | 
					
						
							|  |  |  |       action: replace | 
					
						
							|  |  |  |     - source_labels: [__meta_kubernetes_namespace] | 
					
						
							|  |  |  |       separator: ; | 
					
						
							|  |  |  |       regex: (.*) | 
					
						
							|  |  |  |       target_label: namespace | 
					
						
							|  |  |  |       replacement: $1 | 
					
						
							|  |  |  |       action: replace | 
					
						
							|  |  |  |     - source_labels: [__meta_kubernetes_pod_name] | 
					
						
							|  |  |  |       separator: ; | 
					
						
							|  |  |  |       regex: (.*) | 
					
						
							|  |  |  |       target_label: pod | 
					
						
							|  |  |  |       replacement: $1 | 
					
						
							|  |  |  |       action: replace | 
					
						
							|  |  |  |     - source_labels: [__meta_kubernetes_pod_container_name] | 
					
						
							|  |  |  |       separator: ; | 
					
						
							|  |  |  |       regex: (.*) | 
					
						
							|  |  |  |       target_label: container | 
					
						
							|  |  |  |       replacement: $1 | 
					
						
							|  |  |  |       action: replace | 
					
						
							|  |  |  |     - source_labels: [__meta_kubernetes_pod_name, __meta_kubernetes_pod_container_name, | 
					
						
							|  |  |  |         __meta_kubernetes_pod_container_port_name] | 
					
						
							|  |  |  |       separator: ':' | 
					
						
							|  |  |  |       regex: (.*) | 
					
						
							|  |  |  |       target_label: instance | 
					
						
							|  |  |  |       replacement: $1 | 
					
						
							|  |  |  |       action: replace | 
					
						
							|  |  |  |     - separator: ; | 
					
						
							|  |  |  |       regex: (.*) | 
					
						
							|  |  |  |       target_label: cluster | 
					
						
							|  |  |  |       replacement: dev-us-central-0 | 
					
						
							|  |  |  |       action: replace | 
					
						
							|  |  |  | ` | 
					
						
							|  |  |  | 	config := loadConfiguration(b, cfgText) | 
					
						
							|  |  |  | 	for _, nTargets := range []int{1, 10, 100} { | 
					
						
							|  |  |  | 		b.Run(fmt.Sprintf("%d_targets", nTargets), func(b *testing.B) { | 
					
						
							|  |  |  | 			targets := []model.LabelSet{} | 
					
						
							|  |  |  | 			for i := 0; i < nTargets; i++ { | 
					
						
							|  |  |  | 				labels := model.LabelSet{ | 
					
						
							|  |  |  | 					model.AddressLabel:                            model.LabelValue(fmt.Sprintf("localhost:%d", i)), | 
					
						
							|  |  |  | 					"__meta_kubernetes_namespace":                 "some_namespace", | 
					
						
							|  |  |  | 					"__meta_kubernetes_pod_container_name":        "some_container", | 
					
						
							|  |  |  | 					"__meta_kubernetes_pod_container_port_name":   "http-metrics", | 
					
						
							|  |  |  | 					"__meta_kubernetes_pod_container_port_number": "80", | 
					
						
							|  |  |  | 					"__meta_kubernetes_pod_label_name":            "some_name", | 
					
						
							|  |  |  | 					"__meta_kubernetes_pod_name":                  "some_pod", | 
					
						
							|  |  |  | 					"__meta_kubernetes_pod_phase":                 "Running", | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				// Add some more labels, because Kubernetes SD generates a lot
 | 
					
						
							|  |  |  | 				for i := 0; i < 10; i++ { | 
					
						
							|  |  |  | 					labels[model.LabelName(fmt.Sprintf("__meta_kubernetes_pod_label_extra%d", i))] = "a_label_abcdefgh" | 
					
						
							|  |  |  | 					labels[model.LabelName(fmt.Sprintf("__meta_kubernetes_pod_labelpresent_extra%d", i))] = "true" | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				targets = append(targets, labels) | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2023-03-07 17:23:34 +08:00
										 |  |  | 			var tgets []*Target | 
					
						
							|  |  |  | 			lb := labels.NewBuilder(labels.EmptyLabels()) | 
					
						
							| 
									
										
										
										
											2023-03-01 00:12:27 +08:00
										 |  |  | 			group := &targetgroup.Group{Targets: targets} | 
					
						
							|  |  |  | 			for i := 0; i < b.N; i++ { | 
					
						
							| 
									
										
										
										
											2024-09-15 02:04:33 +08:00
										 |  |  | 				tgets, _ = TargetsFromGroup(group, config.ScrapeConfigs[0], tgets, lb) | 
					
						
							| 
									
										
										
										
											2023-03-01 00:12:27 +08:00
										 |  |  | 				if len(targets) != nTargets { | 
					
						
							|  |  |  | 					b.Fatalf("Expected %d targets, got %d", nTargets, len(targets)) | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-04-25 01:41:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestBucketLimitAppender(t *testing.T) { | 
					
						
							|  |  |  | 	example := histogram.Histogram{ | 
					
						
							|  |  |  | 		Schema:        0, | 
					
						
							|  |  |  | 		Count:         21, | 
					
						
							|  |  |  | 		Sum:           33, | 
					
						
							|  |  |  | 		ZeroThreshold: 0.001, | 
					
						
							|  |  |  | 		ZeroCount:     3, | 
					
						
							|  |  |  | 		PositiveSpans: []histogram.Span{ | 
					
						
							|  |  |  | 			{Offset: 0, Length: 3}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		PositiveBuckets: []int64{3, 0, 0}, | 
					
						
							|  |  |  | 		NegativeSpans: []histogram.Span{ | 
					
						
							|  |  |  | 			{Offset: 0, Length: 3}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		NegativeBuckets: []int64{3, 0, 0}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-26 22:17:37 +08:00
										 |  |  | 	bigGap := histogram.Histogram{ | 
					
						
							|  |  |  | 		Schema:        0, | 
					
						
							|  |  |  | 		Count:         21, | 
					
						
							|  |  |  | 		Sum:           33, | 
					
						
							|  |  |  | 		ZeroThreshold: 0.001, | 
					
						
							|  |  |  | 		ZeroCount:     3, | 
					
						
							|  |  |  | 		PositiveSpans: []histogram.Span{ | 
					
						
							|  |  |  | 			{Offset: 1, Length: 1}, // in (1, 2]
 | 
					
						
							|  |  |  | 			{Offset: 2, Length: 1}, // in (8, 16]
 | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		PositiveBuckets: []int64{1, 0}, // 1, 1
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-28 21:06:43 +08:00
										 |  |  | 	customBuckets := histogram.Histogram{ | 
					
						
							|  |  |  | 		Schema: histogram.CustomBucketsSchema, | 
					
						
							|  |  |  | 		Count:  9, | 
					
						
							|  |  |  | 		Sum:    33, | 
					
						
							|  |  |  | 		PositiveSpans: []histogram.Span{ | 
					
						
							|  |  |  | 			{Offset: 0, Length: 3}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		PositiveBuckets: []int64{3, 0, 0}, | 
					
						
							| 
									
										
										
										
											2024-03-22 21:36:39 +08:00
										 |  |  | 		CustomValues:    []float64{1, 2, 3}, | 
					
						
							| 
									
										
										
										
											2024-02-28 21:06:43 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-25 01:41:04 +08:00
										 |  |  | 	cases := []struct { | 
					
						
							| 
									
										
										
										
											2023-11-16 13:00:11 +08:00
										 |  |  | 		h                 histogram.Histogram | 
					
						
							|  |  |  | 		limit             int | 
					
						
							|  |  |  | 		expectError       bool | 
					
						
							|  |  |  | 		expectBucketCount int | 
					
						
							|  |  |  | 		expectSchema      int32 | 
					
						
							| 
									
										
										
										
											2023-04-25 01:41:04 +08:00
										 |  |  | 	}{ | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			h:           example, | 
					
						
							|  |  |  | 			limit:       3, | 
					
						
							|  |  |  | 			expectError: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2023-11-11 22:24:47 +08:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2023-11-16 13:00:11 +08:00
										 |  |  | 			h:                 example, | 
					
						
							|  |  |  | 			limit:             4, | 
					
						
							|  |  |  | 			expectError:       false, | 
					
						
							|  |  |  | 			expectBucketCount: 4, | 
					
						
							|  |  |  | 			expectSchema:      -1, | 
					
						
							| 
									
										
										
										
											2023-11-11 22:24:47 +08:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2023-04-25 01:41:04 +08:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2023-11-16 13:00:11 +08:00
										 |  |  | 			h:                 example, | 
					
						
							|  |  |  | 			limit:             10, | 
					
						
							|  |  |  | 			expectError:       false, | 
					
						
							|  |  |  | 			expectBucketCount: 6, | 
					
						
							|  |  |  | 			expectSchema:      0, | 
					
						
							| 
									
										
										
										
											2023-04-25 01:41:04 +08:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2023-11-26 22:17:37 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			h:                 bigGap, | 
					
						
							|  |  |  | 			limit:             1, | 
					
						
							|  |  |  | 			expectError:       false, | 
					
						
							|  |  |  | 			expectBucketCount: 1, | 
					
						
							|  |  |  | 			expectSchema:      -2, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2024-02-28 21:06:43 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			h:           customBuckets, | 
					
						
							|  |  |  | 			limit:       2, | 
					
						
							|  |  |  | 			expectError: true, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			h:                 customBuckets, | 
					
						
							|  |  |  | 			limit:             3, | 
					
						
							|  |  |  | 			expectError:       false, | 
					
						
							|  |  |  | 			expectBucketCount: 3, | 
					
						
							|  |  |  | 			expectSchema:      histogram.CustomBucketsSchema, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2023-04-25 01:41:04 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	resApp := &collectResultAppender{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, c := range cases { | 
					
						
							|  |  |  | 		for _, floatHisto := range []bool{true, false} { | 
					
						
							|  |  |  | 			t.Run(fmt.Sprintf("floatHistogram=%t", floatHisto), func(t *testing.T) { | 
					
						
							|  |  |  | 				app := &bucketLimitAppender{Appender: resApp, limit: c.limit} | 
					
						
							|  |  |  | 				ts := int64(10 * time.Minute / time.Millisecond) | 
					
						
							|  |  |  | 				lbls := labels.FromStrings("__name__", "sparse_histogram_series") | 
					
						
							|  |  |  | 				var err error | 
					
						
							|  |  |  | 				if floatHisto { | 
					
						
							| 
									
										
										
										
											2023-11-29 22:15:57 +08:00
										 |  |  | 					fh := c.h.Copy().ToFloat(nil) | 
					
						
							| 
									
										
										
										
											2023-11-16 13:00:11 +08:00
										 |  |  | 					_, err = app.AppendHistogram(0, lbls, ts, nil, fh) | 
					
						
							|  |  |  | 					if c.expectError { | 
					
						
							|  |  |  | 						require.Error(t, err) | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						require.Equal(t, c.expectSchema, fh.Schema) | 
					
						
							|  |  |  | 						require.Equal(t, c.expectBucketCount, len(fh.NegativeBuckets)+len(fh.PositiveBuckets)) | 
					
						
							|  |  |  | 						require.NoError(t, err) | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2023-04-25 01:41:04 +08:00
										 |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2023-11-16 13:00:11 +08:00
										 |  |  | 					h := c.h.Copy() | 
					
						
							|  |  |  | 					_, err = app.AppendHistogram(0, lbls, ts, h, nil) | 
					
						
							|  |  |  | 					if c.expectError { | 
					
						
							|  |  |  | 						require.Error(t, err) | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						require.Equal(t, c.expectSchema, h.Schema) | 
					
						
							|  |  |  | 						require.Equal(t, c.expectBucketCount, len(h.NegativeBuckets)+len(h.PositiveBuckets)) | 
					
						
							|  |  |  | 						require.NoError(t, err) | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2023-04-25 01:41:04 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				require.NoError(t, app.Commit()) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-01-17 23:58:54 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestMaxSchemaAppender(t *testing.T) { | 
					
						
							|  |  |  | 	example := histogram.Histogram{ | 
					
						
							|  |  |  | 		Schema:        0, | 
					
						
							|  |  |  | 		Count:         21, | 
					
						
							|  |  |  | 		Sum:           33, | 
					
						
							|  |  |  | 		ZeroThreshold: 0.001, | 
					
						
							|  |  |  | 		ZeroCount:     3, | 
					
						
							|  |  |  | 		PositiveSpans: []histogram.Span{ | 
					
						
							|  |  |  | 			{Offset: 0, Length: 3}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		PositiveBuckets: []int64{3, 0, 0}, | 
					
						
							|  |  |  | 		NegativeSpans: []histogram.Span{ | 
					
						
							|  |  |  | 			{Offset: 0, Length: 3}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		NegativeBuckets: []int64{3, 0, 0}, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-28 21:06:43 +08:00
										 |  |  | 	customBuckets := histogram.Histogram{ | 
					
						
							|  |  |  | 		Schema: histogram.CustomBucketsSchema, | 
					
						
							|  |  |  | 		Count:  9, | 
					
						
							|  |  |  | 		Sum:    33, | 
					
						
							|  |  |  | 		PositiveSpans: []histogram.Span{ | 
					
						
							|  |  |  | 			{Offset: 0, Length: 3}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		PositiveBuckets: []int64{3, 0, 0}, | 
					
						
							| 
									
										
										
										
											2024-03-22 21:36:39 +08:00
										 |  |  | 		CustomValues:    []float64{1, 2, 3}, | 
					
						
							| 
									
										
										
										
											2024-02-28 21:06:43 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-17 23:58:54 +08:00
										 |  |  | 	cases := []struct { | 
					
						
							|  |  |  | 		h            histogram.Histogram | 
					
						
							|  |  |  | 		maxSchema    int32 | 
					
						
							|  |  |  | 		expectSchema int32 | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			h:            example, | 
					
						
							|  |  |  | 			maxSchema:    -1, | 
					
						
							|  |  |  | 			expectSchema: -1, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			h:            example, | 
					
						
							|  |  |  | 			maxSchema:    0, | 
					
						
							|  |  |  | 			expectSchema: 0, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2024-02-28 21:06:43 +08:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			h:            customBuckets, | 
					
						
							|  |  |  | 			maxSchema:    -1, | 
					
						
							|  |  |  | 			expectSchema: histogram.CustomBucketsSchema, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2024-01-17 23:58:54 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	resApp := &collectResultAppender{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, c := range cases { | 
					
						
							|  |  |  | 		for _, floatHisto := range []bool{true, false} { | 
					
						
							|  |  |  | 			t.Run(fmt.Sprintf("floatHistogram=%t", floatHisto), func(t *testing.T) { | 
					
						
							|  |  |  | 				app := &maxSchemaAppender{Appender: resApp, maxSchema: c.maxSchema} | 
					
						
							|  |  |  | 				ts := int64(10 * time.Minute / time.Millisecond) | 
					
						
							|  |  |  | 				lbls := labels.FromStrings("__name__", "sparse_histogram_series") | 
					
						
							|  |  |  | 				var err error | 
					
						
							|  |  |  | 				if floatHisto { | 
					
						
							|  |  |  | 					fh := c.h.Copy().ToFloat(nil) | 
					
						
							|  |  |  | 					_, err = app.AppendHistogram(0, lbls, ts, nil, fh) | 
					
						
							|  |  |  | 					require.Equal(t, c.expectSchema, fh.Schema) | 
					
						
							|  |  |  | 					require.NoError(t, err) | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					h := c.h.Copy() | 
					
						
							|  |  |  | 					_, err = app.AppendHistogram(0, lbls, ts, h, nil) | 
					
						
							|  |  |  | 					require.Equal(t, c.expectSchema, h.Schema) | 
					
						
							|  |  |  | 					require.NoError(t, err) | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				require.NoError(t, app.Commit()) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |