7.7 prometheus relabel address替换源码解析
本节重点介绍 :
多实例探针型采集配置
- job_name: 'blackbox-http'
# metrics的path 注意不都是/metrics
metrics_path: /probe
# 传入的参数
params:
module: [http_2xx] # Look for a HTTP 200 response.
static_configs:
- targets:
- http://prometheus.io # Target to probe with http.
- https://www.baidu.com # Target to probe with https.
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9115 # The blackbox exporter's real hostname:port.
进行一下解读
- prometheus首先读取job中的targets,把target赋值给
__address__
标签 ,此标签代表采集的地址 - 将
__address__
标签 赋值给__param_target
标签,因为prometheus 访问blackbox需要传参,__param_target
代表target参数 - 将
__param_target
标签 赋值给instance标签,因为后面监控数据需要instance标签做 被探测实例的标记 - 将
__address__
标签 替换成真实的blackbox地址,因为prometheus是请求blackbox地址而不是 探测的目标地址
relabel源码阅读
位置在D:\go_path\pkg\mod\github.com\prometheus\prometheus\scrape\target.go+ 328
populateLabels函数 ,处理标签relabel流程
先设置job级别的 3个标签 job、__metrics_path__、 __scheme__
scrapeLabels := []labels.Label{
{Name: model.JobLabel, Value: cfg.JobName},
{Name: model.MetricsPathLabel, Value: cfg.MetricsPath},
{Name: model.SchemeLabel, Value: cfg.Scheme},
}
__param_
// 再根据job配置中的 params设置所有参数标签 `__param_`
for k, v := range cfg.Params {
if len(v) > 0 {
lb.Set(model.ParamLabelPrefix+k, v[0])
}
}
switch cfg.Action {
case Drop:
if cfg.Regex.MatchString(val) {
return nil
}
case Keep:
if !cfg.Regex.MatchString(val) {
return nil
}
case Replace:
lb.Set(string(target), string(res))
}
DefaultRelabelConfig = Config{
Action: Replace,
Separator: ";",
Regex: MustNewRegexp("(.*)"),
Replacement: "$1",
}
lb.Set(model.AddressLabel, addr)
for _, l := range lset {
if strings.HasPrefix(l.Name, model.MetaLabelPrefix) {
lb.Del(l.Name)
}
if v := lset.Get(model.InstanceLabel); v == "" {
lb.Set(model.InstanceLabel, addr)
}
__address__标签和target的关系
func (tg *Group) UnmarshalYAML(unmarshal func(interface{}) error) error {
g := struct {
Targets []string `yaml:"targets"`
Labels model.LabelSet `yaml:"labels"`
}{}
if err := unmarshal(&g); err != nil {
return err
}
tg.Targets = make([]model.LabelSet, 0, len(g.Targets))
for _, t := range g.Targets {
tg.Targets = append(tg.Targets, model.LabelSet{
model.AddressLabel: model.LabelValue(t),
})
}
tg.Labels = g.Labels
return nil
}
采集http请求时获取target最终参数
func (t *Target) URL() *url.URL {
params := url.Values{}
for k, v := range t.params {
params[k] = make([]string, len(v))
copy(params[k], v)
}
for _, l := range t.labels {
if !strings.HasPrefix(l.Name, model.ParamLabelPrefix) {
continue
}
ks := l.Name[len(model.ParamLabelPrefix):]
if len(params[ks]) > 0 {
params[ks][0] = l.Value
} else {
params[ks] = []string{l.Value}
}
}
return &url.URL{
Scheme: t.labels.Get(model.SchemeLabel),
Host: t.labels.Get(model.AddressLabel),
Path: t.labels.Get(model.MetricsPathLabel),
RawQuery: params.Encode(),
}
}
func (s *targetScraper) scrape(ctx context.Context, w io.Writer) (string, error) {
if s.req == nil {
req, err := http.NewRequest("GET", s.URL().String(), nil)
}
}
本节重点总结:
作者:福大大架构师每日一题