in pkg/operator/apis/monitoring/v1/common_types.go [114:176]
func buildPrometheusScrapeConfig(jobName string, discoverCfgs discovery.Configs, httpCfg config.HTTPClientConfig, relabelCfgs []*relabel.Config, limits *ScrapeLimits, ep ScrapeEndpoint) (*promconfig.ScrapeConfig, error) {
interval, err := prommodel.ParseDuration(ep.Interval)
if err != nil {
return nil, fmt.Errorf("invalid scrape interval: %w", err)
}
timeout := interval
if ep.Timeout != "" {
timeout, err = prommodel.ParseDuration(ep.Timeout)
if err != nil {
return nil, fmt.Errorf("invalid scrape timeout: %w", err)
}
if timeout > interval {
return nil, fmt.Errorf("scrape timeout %v must not be greater than scrape interval %v", timeout, interval)
}
}
metricsPath := "/metrics"
if ep.Path != "" {
metricsPath = ep.Path
}
var metricRelabelCfgs []*relabel.Config
for _, r := range ep.MetricRelabeling {
rcfg, err := convertRelabelingRule(r)
if err != nil {
return nil, err
}
metricRelabelCfgs = append(metricRelabelCfgs, rcfg)
}
scrapeCfg := &promconfig.ScrapeConfig{
// Generate a job name to make it easy to track what generated the scrape configuration.
// The actual job label attached to its metrics is overwritten via relabeling.
JobName: jobName,
ServiceDiscoveryConfigs: discoverCfgs,
MetricsPath: metricsPath,
Scheme: ep.Scheme,
Params: ep.Params,
HTTPClientConfig: httpCfg,
ScrapeInterval: interval,
ScrapeTimeout: timeout,
RelabelConfigs: relabelCfgs,
MetricRelabelConfigs: metricRelabelCfgs,
}
if limits != nil {
scrapeCfg.SampleLimit = uint(limits.Samples)
scrapeCfg.LabelLimit = uint(limits.Labels)
scrapeCfg.LabelNameLengthLimit = uint(limits.LabelNameLength)
scrapeCfg.LabelValueLengthLimit = uint(limits.LabelValueLength)
}
// The Prometheus configuration structs do not generally have validation methods and embed their
// validation logic in the UnmarshalYAML methods. To keep things reasonable we don't re-validate
// everything and simply do a final marshal-unmarshal cycle at the end to run all validation
// upstream provides at the end of this method.
b, err := yaml.Marshal(scrapeCfg)
if err != nil {
return nil, fmt.Errorf("scrape config cannot be marshalled: %w", err)
}
var scrapeCfgCopy promconfig.ScrapeConfig
if err := yaml.Unmarshal(b, &scrapeCfgCopy); err != nil {
return nil, fmt.Errorf("invalid scrape configuration: %w", err)
}
return scrapeCfg, nil
}