otelcollector/shared/configmap/mp/tomlparser-scrape-interval.go (113 lines of code) (raw):
package configmapsettings
import (
"fmt"
"os"
"regexp"
"strings"
"io/fs"
"github.com/pelletier/go-toml"
"github.com/prometheus-collector/shared"
"gopkg.in/yaml.v2"
)
const (
defaultScrapeInterval = "30s"
)
var (
MATCHER = regexp.MustCompile(`^((([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?|0)$`)
)
func parseConfigMapForScrapeSettings() *toml.Tree {
config, err := toml.LoadFile(configMapScrapeIntervalMountPath)
if err != nil {
fmt.Printf("Error parsing config map: %v\n", err)
return nil
}
return config
}
func checkDuration(duration string) string {
if !MATCHER.MatchString(duration) || duration == "" {
return defaultScrapeInterval
}
return duration
}
func getConfigStringValue(configMapSettings *toml.Tree, key string) string {
if configMapSettings == nil {
return ""
}
valueInterface := configMapSettings.Get(key)
if valueInterface == nil {
return ""
}
value, ok := valueInterface.(string)
if !ok {
return ""
}
return value
}
func processConfigMap() map[string]string {
configSchemaVersion := os.Getenv("AZMON_AGENT_CFG_SCHEMA_VERSION")
intervalHash := make(map[string]string)
if configSchemaVersion != "" && strings.TrimSpace(configSchemaVersion) == "v1" {
configMapSettings := parseConfigMapForScrapeSettings()
if configMapSettings != nil {
intervalHash["KUBELET_SCRAPE_INTERVAL"] = checkDuration(getConfigStringValue(configMapSettings, "kubelet"))
intervalHash["COREDNS_SCRAPE_INTERVAL"] = checkDuration(getConfigStringValue(configMapSettings, "coredns"))
intervalHash["CADVISOR_SCRAPE_INTERVAL"] = checkDuration(getConfigStringValue(configMapSettings, "cadvisor"))
intervalHash["KUBEPROXY_SCRAPE_INTERVAL"] = checkDuration(getConfigStringValue(configMapSettings, "kubeproxy"))
intervalHash["APISERVER_SCRAPE_INTERVAL"] = checkDuration(getConfigStringValue(configMapSettings, "apiserver"))
intervalHash["KUBESTATE_SCRAPE_INTERVAL"] = checkDuration(getConfigStringValue(configMapSettings, "kubestate"))
intervalHash["NODEEXPORTER_SCRAPE_INTERVAL"] = checkDuration(getConfigStringValue(configMapSettings, "nodeexporter"))
intervalHash["WINDOWSEXPORTER_SCRAPE_INTERVAL"] = checkDuration(getConfigStringValue(configMapSettings, "windowsexporter"))
intervalHash["WINDOWSKUBEPROXY_SCRAPE_INTERVAL"] = checkDuration(getConfigStringValue(configMapSettings, "windowskubeproxy"))
intervalHash["PROMETHEUS_COLLECTOR_HEALTH_SCRAPE_INTERVAL"] = checkDuration(getConfigStringValue(configMapSettings, "prometheuscollectorhealth"))
intervalHash["POD_ANNOTATION_SCRAPE_INTERVAL"] = checkDuration(getConfigStringValue(configMapSettings, "podannotations"))
intervalHash["KAPPIEBASIC_SCRAPE_INTERVAL"] = checkDuration(getConfigStringValue(configMapSettings, "kappiebasic"))
intervalHash["NETWORKOBSERVABILITYRETINA_SCRAPE_INTERVAL"] = checkDuration(getConfigStringValue(configMapSettings, "networkobservabilityRetina"))
intervalHash["NETWORKOBSERVABILITYHUBBLE_SCRAPE_INTERVAL"] = checkDuration(getConfigStringValue(configMapSettings, "networkobservabilityHubble"))
intervalHash["NETWORKOBSERVABILITYCILIUM_SCRAPE_INTERVAL"] = checkDuration(getConfigStringValue(configMapSettings, "networkobservabilityCilium"))
intervalHash["ACSTORCAPACITYPROVISIONER_SCRAPE_INTERVAL"] = checkDuration(getConfigStringValue(configMapSettings, "acstor-capacity-provisioner"))
intervalHash["ACSTORMETRICSEXPORTER_SCRAPE_INTERVAL"] = checkDuration(getConfigStringValue(configMapSettings, "acstor-metrics-exporter"))
return intervalHash
} else {
fmt.Printf("Error parsing config map, scrape interval settings is empty. Using default scrape interval settings\n")
}
}
if _, err := os.Stat(configMapScrapeIntervalMountPath); os.IsNotExist(err) {
fmt.Printf("configmap prometheus-collector-configmap for default-targets-scrape-interval-settings not mounted, using defaults")
}
// Set each value in intervalHash to "30s"
keys := []string{
"KUBELET_SCRAPE_INTERVAL", "COREDNS_SCRAPE_INTERVAL", "CADVISOR_SCRAPE_INTERVAL",
"KUBEPROXY_SCRAPE_INTERVAL", "APISERVER_SCRAPE_INTERVAL", "KUBESTATE_SCRAPE_INTERVAL",
"NODEEXPORTER_SCRAPE_INTERVAL", "WINDOWSEXPORTER_SCRAPE_INTERVAL",
"WINDOWSKUBEPROXY_SCRAPE_INTERVAL", "PROMETHEUS_COLLECTOR_HEALTH_SCRAPE_INTERVAL",
"POD_ANNOTATION_SCRAPE_INTERVAL", "KAPPIEBASIC_SCRAPE_INTERVAL",
"NETWORKOBSERVABILITYRETINA_SCRAPE_INTERVAL", "NETWORKOBSERVABILITYHUBBLE_SCRAPE_INTERVAL",
"NETWORKOBSERVABILITYCILIUM_SCRAPE_INTERVAL", "ACSTORCAPACITYPROVISIONER_SCRAPE_INTERVAL",
"ACSTORMETRICSEXPORTER_SCRAPE_INTERVAL",
}
fmt.Printf("Setting default scrape interval (%s) for all jobs as no config map is present \n", defaultScrapeInterval)
for _, key := range keys {
intervalHash[key] = defaultScrapeInterval
}
return intervalHash
}
func writeIntervalHashToFile(intervalHash map[string]string, filePath string) error {
out, err := yaml.Marshal(intervalHash)
if err != nil {
return err
}
err = os.WriteFile(filePath, []byte(out), fs.FileMode(0644))
if err != nil {
return err
}
return nil
}
func tomlparserScrapeInterval() {
shared.EchoSectionDivider("Start Processing - tomlparserScrapeInterval")
intervalHash := processConfigMap()
err := writeIntervalHashToFile(intervalHash, scrapeIntervalEnvVarPath)
if err != nil {
fmt.Printf("Error writing to file: %v\n", err)
return
}
shared.EchoSectionDivider("End Processing - tomlparserScrapeInterval")
}