in otelcollector/shared/configmap/mp/prometheus-config-merger.go [137:205]
func AppendMetricRelabelConfig(yamlConfigFile, keepListRegex string) error {
fmt.Printf("Starting to append keep list regex or minimal ingestion regex to %s\n", yamlConfigFile)
content, err := os.ReadFile(yamlConfigFile)
if err != nil {
return fmt.Errorf("error reading config file %s: %v. The keep list regex will not be used", yamlConfigFile, err)
}
var config map[string]interface{}
if err := yaml.Unmarshal(content, &config); err != nil {
return fmt.Errorf("error unmarshalling YAML for %s: %v. The keep list regex will not be used", yamlConfigFile, err)
}
keepListMetricRelabelConfig := map[string]interface{}{
"source_labels": []interface{}{"__name__"},
"action": "keep",
"regex": keepListRegex,
}
if scrapeConfigs, ok := config["scrape_configs"].([]interface{}); ok {
for i, scfg := range scrapeConfigs {
// Ensure scfg is a map with string keys
if scfgMap, ok := scfg.(map[interface{}]interface{}); ok {
// Convert to map[string]interface{}
stringScfgMap := make(map[string]interface{})
for k, v := range scfgMap {
if key, ok := k.(string); ok {
stringScfgMap[key] = v
} else {
return fmt.Errorf("encountered non-string key in scrape config map: %v", k)
}
}
// Update or add metric_relabel_configs
if metricRelabelCfgs, ok := stringScfgMap["metric_relabel_configs"].([]interface{}); ok {
stringScfgMap["metric_relabel_configs"] = append(metricRelabelCfgs, keepListMetricRelabelConfig)
} else {
stringScfgMap["metric_relabel_configs"] = []interface{}{keepListMetricRelabelConfig}
}
// Convert back to map[interface{}]interface{} for YAML marshalling
interfaceScfgMap := make(map[interface{}]interface{})
for k, v := range stringScfgMap {
interfaceScfgMap[k] = v
}
// Update the scrape_configs list
scrapeConfigs[i] = interfaceScfgMap
}
}
// Write updated scrape_configs back to config
config["scrape_configs"] = scrapeConfigs
} else {
fmt.Println("No 'scrape_configs' found in the YAML. Skipping updates.")
return nil
}
cfgYamlWithMetricRelabelConfig, err := yaml.Marshal(config)
if err != nil {
return fmt.Errorf("error marshalling YAML for %s: %v. The keep list regex will not be used", yamlConfigFile, err)
}
if err := os.WriteFile(yamlConfigFile, cfgYamlWithMetricRelabelConfig, os.ModePerm); err != nil {
return fmt.Errorf("error writing to file %s: %v. The keep list regex will not be used", yamlConfigFile, err)
}
return nil
}