func()

in cmd/collector/config/config.go [511:633]


func (c *Config) Validate() error {
	if c.Exporters != nil {
		if err := c.Exporters.Validate(); err != nil {
			return err
		}
	}

	tlsCertEmpty := c.TLSCertFile == ""
	tlsKeyEmpty := c.TLSKeyFile == ""
	if tlsCertEmpty != tlsKeyEmpty {
		return errors.New("tls-cert-file and tls-key-file must both be set or both be empty")
	}

	for _, v := range c.LiftLabels {
		if v.Name == "" {
			return errors.New("lift-labels.name must be set")
		}
		if v.ColumnName != "" {
			if !validColumnName.MatchString(v.ColumnName) {
				return fmt.Errorf("lift-labels.column-name `%s` contains invalid characters", v.ColumnName)
			}
		}
	}

	for _, v := range c.LiftResources {
		if v.Name == "" {
			return errors.New("lift-resources.name must be set")
		}
		if v.ColumnName != "" {
			if !validColumnName.MatchString(v.ColumnName) {
				return fmt.Errorf("lift-resources.column-name `%s` contains invalid characters", v.ColumnName)
			}
		}
	}

	existingPaths := make(map[string]struct{})
	for _, v := range c.PrometheusRemoteWrite {
		if err := v.Validate(); err != nil {
			return err
		}

		if _, ok := existingPaths[v.Path]; ok {
			return fmt.Errorf("prometheus-remote-write.path %s is already defined", v.Path)
		}
		existingPaths[v.Path] = struct{}{}

		for _, exporterName := range v.Exporters {
			if !HasMetricsExporter(exporterName, c.Exporters) {
				return fmt.Errorf("prometheus-remote-write.exporters %q not found", exporterName)
			}
		}
	}

	if c.OtelLog != nil {
		if err := c.OtelLog.Validate(); err != nil {
			return err
		}

		for _, exporterName := range c.OtelLog.Exporters {
			if !HasLogsExporter(exporterName, c.Exporters) {
				return fmt.Errorf("otel-log.exporters %q not found", exporterName)
			}
		}
	}

	tailScrapingFromKube := false
	for i, v := range c.HostLog {
		if err := v.Validate(); err != nil {
			return err
		}
		if !v.DisableKubeDiscovery {
			if tailScrapingFromKube {
				return fmt.Errorf("host-log[%d].disable-kube-discovery not set for more than one HostLog configuration", i)
			}
			tailScrapingFromKube = true
		}

		for _, exporterName := range v.Exporters {
			if !HasLogsExporter(exporterName, c.Exporters) {
				return fmt.Errorf("host-log[%d].exporters %q not found", i, exporterName)
			}
		}
	}

	for i, v := range c.OtelMetric {
		if err := v.Validate(); err != nil {
			return err
		}

		if v.Path != "" {
			if _, ok := existingPaths[v.Path]; ok {
				return fmt.Errorf("otel-metric[%d].path %s is already defined", i, v.Path)
			}
			existingPaths[v.Path] = struct{}{}
		}

		for _, exporterName := range v.Exporters {
			if !HasMetricsExporter(exporterName, c.Exporters) {
				return fmt.Errorf("otel-metric[%d].exporters %q not found", i, exporterName)
			}
		}
	}

	if c.PrometheusScrape != nil {
		if err := c.PrometheusScrape.Validate(); err != nil {
			return err
		}

		for _, exporterName := range c.PrometheusScrape.Exporters {
			if !HasMetricsExporter(exporterName, c.Exporters) {
				return fmt.Errorf("prometheus-scrape.exporters %q not found", exporterName)
			}
		}
	}

	if c.WALFlushIntervalMilliSeconds == 0 {
		c.WALFlushIntervalMilliSeconds = DefaultConfig.WALFlushIntervalMilliSeconds
	} else if c.WALFlushIntervalMilliSeconds < 0 {
		return errors.New("wal-flush-interval must be greater than 0")
	}

	return nil
}