func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error {
	*c = DefaultConfig
	// We want to set c to the defaults and then overwrite it with the input.
	// To make unmarshal fill the plain data struct rather than calling UnmarshalYAML
	// again, we have to hide it using a type indirection.
	type plain Config
	if err := unmarshal((*plain)(c)); err != nil {
		return err
	}

	// If a global block was open but empty the default global config is overwritten.
	// We have to restore it here.
	if c.GlobalConfig.isZero() {
		c.GlobalConfig = DefaultGlobalConfig
	}

	for _, rf := range c.RuleFiles {
		if !patRulePath.MatchString(rf) {
			return errors.Errorf("invalid rule file path %q", rf)
		}
	}
	// Do global overrides and validate unique names.
	jobNames := map[string]struct{}{}
	for _, scfg := range c.ScrapeConfigs {
		if scfg == nil {
			return errors.New("empty or null scrape config section")
		}
		// First set the correct scrape interval, then check that the timeout
		// (inferred or explicit) is not greater than that.
		if scfg.ScrapeInterval == 0 {
			scfg.ScrapeInterval = c.GlobalConfig.ScrapeInterval
		}
		if scfg.ScrapeTimeout > scfg.ScrapeInterval {
			return errors.Errorf("scrape timeout greater than scrape interval for scrape config with job name %q", scfg.JobName)
		}
		if scfg.ScrapeTimeout == 0 {
			if c.GlobalConfig.ScrapeTimeout > scfg.ScrapeInterval {
				scfg.ScrapeTimeout = scfg.ScrapeInterval
			} else {
				scfg.ScrapeTimeout = c.GlobalConfig.ScrapeTimeout
			}
		}

		if _, ok := jobNames[scfg.JobName]; ok {
			return errors.Errorf("found multiple scrape configs with job name %q", scfg.JobName)
		}
		jobNames[scfg.JobName] = struct{}{}
	}
	for _, rwcfg := range c.RemoteWriteConfigs {
		if rwcfg == nil {
			return errors.New("empty or null remote write config section")
		}
	}
	for _, rrcfg := range c.RemoteReadConfigs {
		if rrcfg == nil {
			return errors.New("empty or null remote read config section")
		}
	}
	return nil
}
func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error {
	*c = DefaultConfig
	
	
	
	type plain Config
	if err := unmarshal((*plain)(c)); err != nil {
		return err
	}

	
	
	if c.GlobalConfig.isZero() {
		c.GlobalConfig = DefaultGlobalConfig
	}

	for _, rf := range c.RuleFiles {
		if !patRulePath.MatchString(rf) {
			return errors.Errorf("invalid rule file path %q", rf)
		}
	}
	
	jobNames := map[string]struct{}{}
	for _, scfg := range c.ScrapeConfigs {
		if scfg == nil {
			return errors.New("empty or null scrape config section")
		}
		
		
		if scfg.ScrapeInterval == 0 {
			scfg.ScrapeInterval = c.GlobalConfig.ScrapeInterval
		}
		if scfg.ScrapeTimeout > scfg.ScrapeInterval {
			return errors.Errorf("scrape timeout greater than scrape interval for scrape config with job name %q", scfg.JobName)
		}
		if scfg.ScrapeTimeout == 0 {
			if c.GlobalConfig.ScrapeTimeout > scfg.ScrapeInterval {
				scfg.ScrapeTimeout = scfg.ScrapeInterval
			} else {
				scfg.ScrapeTimeout = c.GlobalConfig.ScrapeTimeout
			}
		}

		if _, ok := jobNames[scfg.JobName]; ok {
			return errors.Errorf("found multiple scrape configs with job name %q", scfg.JobName)
		}
		jobNames[scfg.JobName] = struct{}{}
	}
	for _, rwcfg := range c.RemoteWriteConfigs {
		if rwcfg == nil {
			return errors.New("empty or null remote write config section")
		}
	}
	for _, rrcfg := range c.RemoteReadConfigs {
		if rrcfg == nil {
			return errors.New("empty or null remote read config section")
		}
	}
	return nil
}
func ( c * Config ) UnmarshalYAML ( unmarshal func ( interface { } ) error ) error { * c = DefaultConfig // We want to set c to the defaults and then overwrite it with the input. // To make unmarshal fill the plain data struct rather than calling UnmarshalYAML // again, we have to hide it using a type indirection. type plain Config if err := unmarshal ( ( * plain ) ( c ) ) ; err != nil { return err } // If a global block was open but empty the default global config is overwritten. // We have to restore it here. if c . GlobalConfig . isZero ( ) { c . GlobalConfig = DefaultGlobalConfig } for _ , rf := range c . RuleFiles { if ! patRulePath . MatchString ( rf ) { return errors . Errorf ( " " , rf ) } } // Do global overrides and validate unique names. jobNames := map [ string ] struct { } { } for _ , scfg := range c . ScrapeConfigs { if scfg == nil { return errors . New ( " " ) } // First set the correct scrape interval, then check that the timeout // (inferred or explicit) is not greater than that. if scfg . ScrapeInterval == 0 { scfg . ScrapeInterval = c . GlobalConfig . ScrapeInterval } if scfg . ScrapeTimeout > scfg . ScrapeInterval { return errors . Errorf ( " " , scfg . JobName ) } if scfg . ScrapeTimeout == 0 { if c . GlobalConfig . ScrapeTimeout > scfg . ScrapeInterval { scfg . ScrapeTimeout = scfg . ScrapeInterval } else { scfg . ScrapeTimeout = c . GlobalConfig . ScrapeTimeout } } if _ , ok := jobNames [ scfg . JobName ] ; ok { return errors . Errorf ( " " , scfg . JobName ) } jobNames [ scfg . JobName ] = struct { } { } } for _ , rwcfg := range c . RemoteWriteConfigs { if rwcfg == nil { return errors . New ( " " ) } } for _ , rrcfg := range c . RemoteReadConfigs { if rrcfg == nil { return errors . New ( " " ) } } return nil }
// UnmarshalYAML implements the yaml.Unmarshaler interface.
UnmarshalYAML implements the yaml . Unmarshaler interface .