mirror of
https://github.com/prometheus/prometheus.git
synced 2024-12-27 22:49:40 -08:00
0cb6b9962e
Switched to testing by way of the static_configs rather than dns_sd_config parameter. Verified that the revised test both passes without network access, and also still catches the bug it's supposed to cover.
209 lines
5.5 KiB
Go
209 lines
5.5 KiB
Go
// Copyright 2013 The Prometheus Authors
|
|
// 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.
|
|
|
|
package retrieval
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
|
|
"golang.org/x/net/context"
|
|
"gopkg.in/yaml.v2"
|
|
|
|
"github.com/prometheus/common/model"
|
|
"github.com/prometheus/prometheus/config"
|
|
"github.com/prometheus/prometheus/storage/local"
|
|
)
|
|
|
|
func TestTargetSetRecreatesTargetGroupsEveryRun(t *testing.T) {
|
|
|
|
verifyPresence := func(tgroups map[string][]*Target, name string, present bool) {
|
|
if _, ok := tgroups[name]; ok != present {
|
|
msg := ""
|
|
if !present {
|
|
msg = "not "
|
|
}
|
|
t.Fatalf("'%s' should %sbe present in TargetSet.tgroups: %s", name, msg, tgroups)
|
|
}
|
|
|
|
}
|
|
|
|
scrapeConfig := &config.ScrapeConfig{}
|
|
|
|
sOne := `
|
|
job_name: "foo"
|
|
static_configs:
|
|
- targets: ["foo:9090"]
|
|
- targets: ["bar:9090"]
|
|
`
|
|
if err := yaml.Unmarshal([]byte(sOne), scrapeConfig); err != nil {
|
|
t.Fatalf("Unable to load YAML config sOne: %s", err)
|
|
}
|
|
|
|
// Not properly setting it up, but that seems okay
|
|
mss := &local.MemorySeriesStorage{}
|
|
|
|
ts := newTargetSet(scrapeConfig, mss)
|
|
|
|
ts.runProviders(context.Background(), providersFromConfig(scrapeConfig))
|
|
|
|
verifyPresence(ts.tgroups, "static/0/0", true)
|
|
verifyPresence(ts.tgroups, "static/0/1", true)
|
|
|
|
sTwo := `
|
|
job_name: "foo"
|
|
static_configs:
|
|
- targets: ["foo:9090"]
|
|
`
|
|
if err := yaml.Unmarshal([]byte(sTwo), scrapeConfig); err != nil {
|
|
t.Fatalf("Unable to load YAML config sTwo: %s", err)
|
|
}
|
|
|
|
ts.runProviders(context.Background(), providersFromConfig(scrapeConfig))
|
|
|
|
verifyPresence(ts.tgroups, "static/0/0", true)
|
|
verifyPresence(ts.tgroups, "static/0/1", false)
|
|
}
|
|
|
|
func mustNewRegexp(s string) config.Regexp {
|
|
re, err := config.NewRegexp(s)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return re
|
|
}
|
|
|
|
func TestPopulateLabels(t *testing.T) {
|
|
cases := []struct {
|
|
in model.LabelSet
|
|
cfg *config.ScrapeConfig
|
|
res model.LabelSet
|
|
resOrig model.LabelSet
|
|
}{
|
|
// Regular population of scrape config options.
|
|
{
|
|
in: model.LabelSet{
|
|
model.AddressLabel: "1.2.3.4:1000",
|
|
"custom": "value",
|
|
},
|
|
cfg: &config.ScrapeConfig{
|
|
Scheme: "https",
|
|
MetricsPath: "/metrics",
|
|
JobName: "job",
|
|
},
|
|
res: model.LabelSet{
|
|
model.AddressLabel: "1.2.3.4:1000",
|
|
model.InstanceLabel: "1.2.3.4:1000",
|
|
model.SchemeLabel: "https",
|
|
model.MetricsPathLabel: "/metrics",
|
|
model.JobLabel: "job",
|
|
"custom": "value",
|
|
},
|
|
resOrig: model.LabelSet{
|
|
model.AddressLabel: "1.2.3.4:1000",
|
|
model.SchemeLabel: "https",
|
|
model.MetricsPathLabel: "/metrics",
|
|
model.JobLabel: "job",
|
|
"custom": "value",
|
|
},
|
|
},
|
|
// Pre-define/overwrite scrape config labels.
|
|
// Leave out port and expect it to be defaulted to scheme.
|
|
{
|
|
in: model.LabelSet{
|
|
model.AddressLabel: "1.2.3.4",
|
|
model.SchemeLabel: "http",
|
|
model.MetricsPathLabel: "/custom",
|
|
model.JobLabel: "custom-job",
|
|
},
|
|
cfg: &config.ScrapeConfig{
|
|
Scheme: "https",
|
|
MetricsPath: "/metrics",
|
|
JobName: "job",
|
|
},
|
|
res: model.LabelSet{
|
|
model.AddressLabel: "1.2.3.4:80",
|
|
model.InstanceLabel: "1.2.3.4:80",
|
|
model.SchemeLabel: "http",
|
|
model.MetricsPathLabel: "/custom",
|
|
model.JobLabel: "custom-job",
|
|
},
|
|
resOrig: model.LabelSet{
|
|
model.AddressLabel: "1.2.3.4",
|
|
model.SchemeLabel: "http",
|
|
model.MetricsPathLabel: "/custom",
|
|
model.JobLabel: "custom-job",
|
|
},
|
|
},
|
|
// Provide instance label. HTTPS port default for IPv6.
|
|
{
|
|
in: model.LabelSet{
|
|
model.AddressLabel: "[::1]",
|
|
model.InstanceLabel: "custom-instance",
|
|
},
|
|
cfg: &config.ScrapeConfig{
|
|
Scheme: "https",
|
|
MetricsPath: "/metrics",
|
|
JobName: "job",
|
|
},
|
|
res: model.LabelSet{
|
|
model.AddressLabel: "[::1]:443",
|
|
model.InstanceLabel: "custom-instance",
|
|
model.SchemeLabel: "https",
|
|
model.MetricsPathLabel: "/metrics",
|
|
model.JobLabel: "job",
|
|
},
|
|
resOrig: model.LabelSet{
|
|
model.AddressLabel: "[::1]",
|
|
model.InstanceLabel: "custom-instance",
|
|
model.SchemeLabel: "https",
|
|
model.MetricsPathLabel: "/metrics",
|
|
model.JobLabel: "job",
|
|
},
|
|
},
|
|
// Apply relabeling.
|
|
{
|
|
in: model.LabelSet{
|
|
model.AddressLabel: "1.2.3.4:1000",
|
|
"custom": "value",
|
|
},
|
|
cfg: &config.ScrapeConfig{
|
|
Scheme: "https",
|
|
MetricsPath: "/metrics",
|
|
JobName: "job",
|
|
RelabelConfigs: []*config.RelabelConfig{
|
|
{
|
|
Action: config.RelabelDrop,
|
|
Regex: mustNewRegexp(".*"),
|
|
SourceLabels: model.LabelNames{"job"},
|
|
},
|
|
},
|
|
},
|
|
res: nil,
|
|
resOrig: nil,
|
|
},
|
|
}
|
|
for i, c := range cases {
|
|
res, orig, err := populateLabels(c.in, c.cfg)
|
|
if err != nil {
|
|
t.Fatalf("case %d: %s", i, err)
|
|
}
|
|
if !reflect.DeepEqual(res, c.res) {
|
|
t.Errorf("case %d: expected res\n\t%+v\n got\n\t%+v", i, c.res, res)
|
|
}
|
|
if !reflect.DeepEqual(orig, c.resOrig) {
|
|
t.Errorf("case %d: expected resOrig\n\t%+v\n got\n\t%+v", i, c.resOrig, orig)
|
|
}
|
|
}
|
|
}
|