@ -3838,3 +3838,161 @@ scrape_configs:
require . Equal ( t , expectedSchema , h . Schema )
}
}
func TestTargetScrapeConfigWithLabels ( t * testing . T ) {
const (
configTimeout = 1500 * time . Millisecond
expectedTimeout = "1.5"
expectedTimeoutLabel = "1s500ms"
secondTimeout = 500 * time . Millisecond
secondTimeoutLabel = "500ms"
expectedParam = "value1"
secondParam = "value2"
expectedPath = "/metric-ok"
secondPath = "/metric-nok"
httpScheme = "http"
paramLabel = "__param_param"
jobName = "test"
)
createTestServer := func ( t * testing . T , done chan struct { } ) * url . URL {
server := httptest . NewServer (
http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
defer close ( done )
require . Equal ( t , expectedTimeout , r . Header . Get ( "X-Prometheus-Scrape-Timeout-Seconds" ) )
require . Equal ( t , expectedParam , r . URL . Query ( ) . Get ( "param" ) )
require . Equal ( t , expectedPath , r . URL . Path )
w . Header ( ) . Set ( "Content-Type" , ` text/plain; version=0.0.4 ` )
w . Write ( [ ] byte ( "metric_a 1\nmetric_b 2\n" ) )
} ) ,
)
t . Cleanup ( server . Close )
serverURL , err := url . Parse ( server . URL )
require . NoError ( t , err )
return serverURL
}
run := func ( t * testing . T , cfg * config . ScrapeConfig , targets [ ] * targetgroup . Group ) chan struct { } {
done := make ( chan struct { } )
srvURL := createTestServer ( t , done )
// Update target addresses to use the dynamically created server URL.
for _ , target := range targets {
for i := range target . Targets {
target . Targets [ i ] [ model . AddressLabel ] = model . LabelValue ( srvURL . Host )
}
}
sp , err := newScrapePool ( cfg , & nopAppendable { } , 0 , nil , nil , & Options { } , newTestScrapeMetrics ( t ) )
require . NoError ( t , err )
t . Cleanup ( sp . stop )
sp . Sync ( targets )
return done
}
cases := [ ] struct {
name string
cfg * config . ScrapeConfig
targets [ ] * targetgroup . Group
} {
{
name : "Everything in scrape config" ,
cfg : & config . ScrapeConfig {
ScrapeInterval : model . Duration ( 2 * time . Second ) ,
ScrapeTimeout : model . Duration ( configTimeout ) ,
Params : url . Values { "param" : [ ] string { expectedParam } } ,
JobName : jobName ,
Scheme : httpScheme ,
MetricsPath : expectedPath ,
} ,
targets : [ ] * targetgroup . Group {
{
Targets : [ ] model . LabelSet {
{ model . AddressLabel : model . LabelValue ( "" ) } ,
} ,
} ,
} ,
} ,
{
name : "Overridden in target" ,
cfg : & config . ScrapeConfig {
ScrapeInterval : model . Duration ( 2 * time . Second ) ,
ScrapeTimeout : model . Duration ( secondTimeout ) ,
JobName : jobName ,
Scheme : httpScheme ,
MetricsPath : secondPath ,
Params : url . Values { "param" : [ ] string { secondParam } } ,
} ,
targets : [ ] * targetgroup . Group {
{
Targets : [ ] model . LabelSet {
{
model . AddressLabel : model . LabelValue ( "" ) ,
model . ScrapeTimeoutLabel : expectedTimeoutLabel ,
model . MetricsPathLabel : expectedPath ,
paramLabel : expectedParam ,
} ,
} ,
} ,
} ,
} ,
{
name : "Overridden in relabel_config" ,
cfg : & config . ScrapeConfig {
ScrapeInterval : model . Duration ( 2 * time . Second ) ,
ScrapeTimeout : model . Duration ( secondTimeout ) ,
JobName : jobName ,
Scheme : httpScheme ,
MetricsPath : secondPath ,
Params : url . Values { "param" : [ ] string { secondParam } } ,
RelabelConfigs : [ ] * relabel . Config {
{
Action : relabel . DefaultRelabelConfig . Action ,
Regex : relabel . DefaultRelabelConfig . Regex ,
SourceLabels : relabel . DefaultRelabelConfig . SourceLabels ,
TargetLabel : model . ScrapeTimeoutLabel ,
Replacement : expectedTimeoutLabel ,
} ,
{
Action : relabel . DefaultRelabelConfig . Action ,
Regex : relabel . DefaultRelabelConfig . Regex ,
SourceLabels : relabel . DefaultRelabelConfig . SourceLabels ,
TargetLabel : paramLabel ,
Replacement : expectedParam ,
} ,
{
Action : relabel . DefaultRelabelConfig . Action ,
Regex : relabel . DefaultRelabelConfig . Regex ,
SourceLabels : relabel . DefaultRelabelConfig . SourceLabels ,
TargetLabel : model . MetricsPathLabel ,
Replacement : expectedPath ,
} ,
} ,
} ,
targets : [ ] * targetgroup . Group {
{
Targets : [ ] model . LabelSet {
{
model . AddressLabel : model . LabelValue ( "" ) ,
model . ScrapeTimeoutLabel : secondTimeoutLabel ,
model . MetricsPathLabel : secondPath ,
paramLabel : secondParam ,
} ,
} ,
} ,
} ,
} ,
}
for _ , c := range cases {
t . Run ( c . name , func ( t * testing . T ) {
select {
case <- run ( t , c . cfg , c . targets ) :
case <- time . After ( 10 * time . Second ) :
t . Fatal ( "timeout after 10 seconds" )
}
} )
}
}