| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | package config | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	"io/ioutil" | 
					
						
							| 
									
										
										
										
											2013-05-01 02:20:14 +08:00
										 |  |  | 	"regexp" | 
					
						
							| 
									
										
										
										
											2015-04-20 18:24:25 +08:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2014-12-11 00:46:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	"gopkg.in/yaml.v2" | 
					
						
							| 
									
										
										
										
											2013-08-13 22:14:18 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	clientmodel "github.com/prometheus/client_golang/model" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/prometheus/prometheus/utility" | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | var jobNameRE = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_-]*$") | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // Load parses the YAML input s into a Config.
 | 
					
						
							|  |  |  | func Load(s string) (*Config, error) { | 
					
						
							|  |  |  | 	cfg := &Config{ | 
					
						
							|  |  |  | 		original: s, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	err := yaml.Unmarshal([]byte(s), cfg) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return cfg, nil | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // LoadFromFile parses the given YAML file into a Config.
 | 
					
						
							|  |  |  | func LoadFromFile(filename string) (*Config, error) { | 
					
						
							|  |  |  | 	content, err := ioutil.ReadFile(filename) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return Load(string(content)) | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // The defaults applied before parsing the respective config sections.
 | 
					
						
							|  |  |  | var ( | 
					
						
							|  |  |  | 	// The default top-level configuration.
 | 
					
						
							|  |  |  | 	DefaultConfig = DefaultedConfig{ | 
					
						
							|  |  |  | 		GlobalConfig: &GlobalConfig{DefaultGlobalConfig}, | 
					
						
							| 
									
										
										
										
											2013-05-01 02:20:14 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// The default global configuration.
 | 
					
						
							|  |  |  | 	DefaultGlobalConfig = DefaultedGlobalConfig{ | 
					
						
							|  |  |  | 		ScrapeInterval:     Duration(10 * time.Second), | 
					
						
							|  |  |  | 		ScrapeTimeout:      Duration(10 * time.Second), | 
					
						
							|  |  |  | 		EvaluationInterval: Duration(1 * time.Minute), | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	// Te default scrape configuration.
 | 
					
						
							|  |  |  | 	DefaultScrapeConfig = DefaultedScrapeConfig{ | 
					
						
							|  |  |  | 		// ScrapeTimeout and ScrapeInterval default to the
 | 
					
						
							|  |  |  | 		// configured globals.
 | 
					
						
							|  |  |  | 		MetricsPath: "/metrics", | 
					
						
							|  |  |  | 		Scheme:      "http", | 
					
						
							| 
									
										
										
										
											2015-04-20 18:24:25 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// The default Relabel configuration.
 | 
					
						
							|  |  |  | 	DefaultRelabelConfig = DefaultedRelabelConfig{ | 
					
						
							|  |  |  | 		Action:    RelabelReplace, | 
					
						
							|  |  |  | 		Separator: ";", | 
					
						
							| 
									
										
										
										
											2015-04-20 18:24:25 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	// The default DNS SD configuration.
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | 	DefaultDNSSDConfig = DefaultedDNSSDConfig{ | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 		RefreshInterval: Duration(30 * time.Second), | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Config is the top-level configuration for Prometheus's config files.
 | 
					
						
							|  |  |  | type Config struct { | 
					
						
							|  |  |  | 	// DefaultedConfig contains the actual fields of Config.
 | 
					
						
							|  |  |  | 	DefaultedConfig `yaml:",inline"` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// original is the input from which the config was parsed.
 | 
					
						
							|  |  |  | 	original string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | func (c Config) String() string { | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	if c.original != "" { | 
					
						
							|  |  |  | 		return c.original | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	b, err := yaml.Marshal(c) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return fmt.Sprintf("<error creating config string: %s>", err) | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	return string(b) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2013-05-01 02:20:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // UnmarshalYAML implements the yaml.Unmarshaller interface.
 | 
					
						
							|  |  |  | func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error { | 
					
						
							|  |  |  | 	c.DefaultedConfig = DefaultConfig | 
					
						
							|  |  |  | 	if err := unmarshal(&c.DefaultedConfig); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	// Do global overrides and validate unique names.
 | 
					
						
							| 
									
										
										
										
											2015-04-25 18:59:05 +08:00
										 |  |  | 	jobNames := map[string]struct{}{} | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	for _, scfg := range c.ScrapeConfigs { | 
					
						
							|  |  |  | 		if scfg.ScrapeInterval == 0 { | 
					
						
							|  |  |  | 			scfg.ScrapeInterval = c.GlobalConfig.ScrapeInterval | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if scfg.ScrapeTimeout == 0 { | 
					
						
							|  |  |  | 			scfg.ScrapeTimeout = c.GlobalConfig.ScrapeTimeout | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 		if _, ok := jobNames[scfg.JobName]; ok { | 
					
						
							|  |  |  | 			return fmt.Errorf("found multiple scrape configs with job name %q", scfg.JobName) | 
					
						
							| 
									
										
										
										
											2013-02-23 04:07:35 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 		jobNames[scfg.JobName] = struct{}{} | 
					
						
							| 
									
										
										
										
											2013-02-23 04:07:35 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-05-16 13:38:31 +08:00
										 |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2013-02-23 04:07:35 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // DefaultedConfig is a proxy type for Config.
 | 
					
						
							|  |  |  | type DefaultedConfig struct { | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | 	GlobalConfig  *GlobalConfig   `yaml:"global"` | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	RuleFiles     []string        `yaml:"rule_files,omitempty"` | 
					
						
							|  |  |  | 	ScrapeConfigs []*ScrapeConfig `yaml:"scrape_configs,omitempty"` | 
					
						
							| 
									
										
										
										
											2013-08-13 22:14:18 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | // GlobalConfig configures values that are used across other configuration
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // objects.
 | 
					
						
							|  |  |  | type GlobalConfig struct { | 
					
						
							|  |  |  | 	// DefaultedGlobalConfig contains the actual fields for GlobalConfig.
 | 
					
						
							|  |  |  | 	DefaultedGlobalConfig `yaml:",inline"` | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // UnmarshalYAML implements the yaml.Unmarshaller interface.
 | 
					
						
							|  |  |  | func (c *GlobalConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { | 
					
						
							|  |  |  | 	c.DefaultedGlobalConfig = DefaultGlobalConfig | 
					
						
							|  |  |  | 	if err := unmarshal(&c.DefaultedGlobalConfig); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // DefaultedGlobalConfig is a proxy type for GlobalConfig.
 | 
					
						
							|  |  |  | type DefaultedGlobalConfig struct { | 
					
						
							|  |  |  | 	// How frequently to scrape targets by default.
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | 	ScrapeInterval Duration `yaml:"scrape_interval,omitempty"` | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	// The default timeout when scraping targets.
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | 	ScrapeTimeout Duration `yaml:"scrape_timeout,omitempty"` | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	// How frequently to evaluate rules by default.
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | 	EvaluationInterval Duration `yaml:"evaluation_interval,omitempty"` | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// The labels to add to any timeseries that this Prometheus instance scrapes.
 | 
					
						
							|  |  |  | 	Labels clientmodel.LabelSet `yaml:"labels,omitempty"` | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // ScrapeConfig configures a scraping unit for Prometheus.
 | 
					
						
							| 
									
										
										
										
											2015-04-25 18:59:05 +08:00
										 |  |  | type ScrapeConfig struct { | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	// DefaultedScrapeConfig contains the actual fields for ScrapeConfig.
 | 
					
						
							|  |  |  | 	DefaultedScrapeConfig `yaml:",inline"` | 
					
						
							| 
									
										
										
										
											2015-04-20 18:24:25 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // UnmarshalYAML implements the yaml.Unmarshaller interface.
 | 
					
						
							|  |  |  | func (c *ScrapeConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { | 
					
						
							|  |  |  | 	c.DefaultedScrapeConfig = DefaultScrapeConfig | 
					
						
							|  |  |  | 	err := unmarshal(&c.DefaultedScrapeConfig) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if !jobNameRE.MatchString(c.JobName) { | 
					
						
							|  |  |  | 		return fmt.Errorf("%q is not a valid job name", c.JobName) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2013-01-08 06:24:26 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2013-08-17 00:17:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // DefaultedScrapeConfig is a proxy type for ScrapeConfig.
 | 
					
						
							|  |  |  | type DefaultedScrapeConfig struct { | 
					
						
							|  |  |  | 	// The job name to which the job label is set by default.
 | 
					
						
							|  |  |  | 	JobName string `yaml:"job_name"` | 
					
						
							|  |  |  | 	// How frequently to scrape the targets of this scrape config.
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | 	ScrapeInterval Duration `yaml:"scrape_interval,omitempty"` | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	// The timeout for scraping targets of this config.
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | 	ScrapeTimeout Duration `yaml:"scrape_timeout,omitempty"` | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	// The HTTP resource path on which to fetch metrics from targets.
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | 	MetricsPath string `yaml:"metrics_path,omitempty"` | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	// The URL scheme with which to fetch metrics from targets.
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | 	Scheme string `yaml:"scheme,omitempty"` | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// List of labeled target groups for this job.
 | 
					
						
							|  |  |  | 	TargetGroups []*TargetGroup `yaml:"target_groups,omitempty"` | 
					
						
							|  |  |  | 	// List of DNS service discovery configurations.
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | 	DNSSDConfigs []*DNSSDConfig `yaml:"dns_sd_configs,omitempty"` | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	// List of relabel configurations.
 | 
					
						
							|  |  |  | 	RelabelConfigs []*RelabelConfig `yaml:"relabel_configs,omitempty"` | 
					
						
							| 
									
										
										
										
											2013-08-17 00:17:48 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-04-20 18:24:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // A labeled group of targets to scrape for a job.
 | 
					
						
							|  |  |  | type TargetGroup struct { | 
					
						
							|  |  |  | 	// Targets is a list of targets identified by a label set. Each target is
 | 
					
						
							|  |  |  | 	// uniquely identifiable in the group by its address label.
 | 
					
						
							|  |  |  | 	Targets []clientmodel.LabelSet `yaml:"targets,omitempty" json:"targets,omitempty"` | 
					
						
							|  |  |  | 	// Labels is a set of labels that is common across all targets in the group.
 | 
					
						
							|  |  |  | 	Labels clientmodel.LabelSet `yaml:"labels,omitempty" json:"labels,omitempty"` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Source is an identifier that describes a group of targets.
 | 
					
						
							|  |  |  | 	Source string `yaml:"-", json:"-"` | 
					
						
							| 
									
										
										
										
											2015-04-25 18:59:05 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | func (tg TargetGroup) String() string { | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	return tg.Source | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-04-25 18:59:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // UnmarshalYAML implements the yaml.Unmarshaller interface.
 | 
					
						
							|  |  |  | func (tg *TargetGroup) UnmarshalYAML(unmarshal func(interface{}) error) error { | 
					
						
							|  |  |  | 	g := struct { | 
					
						
							|  |  |  | 		Targets []string             `yaml:"targets"` | 
					
						
							|  |  |  | 		Labels  clientmodel.LabelSet `yaml:"labels"` | 
					
						
							|  |  |  | 	}{} | 
					
						
							|  |  |  | 	if err := unmarshal(&g); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							| 
									
										
										
										
											2015-04-25 18:59:05 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	tg.Targets = make([]clientmodel.LabelSet, 0, len(g.Targets)) | 
					
						
							|  |  |  | 	for _, t := range g.Targets { | 
					
						
							|  |  |  | 		if strings.Contains(t, "/") { | 
					
						
							|  |  |  | 			return fmt.Errorf("%q is not a valid hostname", t) | 
					
						
							| 
									
										
										
										
											2015-04-25 18:59:05 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 		tg.Targets = append(tg.Targets, clientmodel.LabelSet{ | 
					
						
							|  |  |  | 			clientmodel.AddressLabel: clientmodel.LabelValue(t), | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2015-04-25 18:59:05 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	tg.Labels = g.Labels | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | // MarshalYAML implements the yaml.Marshaller interface.
 | 
					
						
							|  |  |  | func (tg TargetGroup) MarshalYAML() (interface{}, error) { | 
					
						
							|  |  |  | 	g := &struct { | 
					
						
							|  |  |  | 		Targets []string             `yaml:"targets"` | 
					
						
							|  |  |  | 		Labels  clientmodel.LabelSet `yaml:"labels,omitempty"` | 
					
						
							|  |  |  | 	}{ | 
					
						
							|  |  |  | 		Targets: make([]string, 0, len(tg.Targets)), | 
					
						
							|  |  |  | 		Labels:  tg.Labels, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	for _, t := range tg.Targets { | 
					
						
							|  |  |  | 		g.Targets = append(g.Targets, string(t[clientmodel.AddressLabel])) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return g, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // DNSSDConfig is the configuration for DNS based service discovery.
 | 
					
						
							|  |  |  | type DNSSDConfig struct { | 
					
						
							|  |  |  | 	// DefaultedDNSSDConfig contains the actual fields for DNSSDConfig.
 | 
					
						
							|  |  |  | 	DefaultedDNSSDConfig `yaml:",inline"` | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // UnmarshalYAML implements the yaml.Unmarshaller interface.
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | func (c *DNSSDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { | 
					
						
							|  |  |  | 	c.DefaultedDNSSDConfig = DefaultDNSSDConfig | 
					
						
							|  |  |  | 	err := unmarshal(&c.DefaultedDNSSDConfig) | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							| 
									
										
										
										
											2015-04-25 18:59:05 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	if len(c.Names) == 0 { | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | 		return fmt.Errorf("DNS config must contain at least one SRV record name") | 
					
						
							| 
									
										
										
										
											2015-04-29 06:08:58 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-04-25 18:59:05 +08:00
										 |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | // DefaultedDNSSDConfig is a proxy type for DNSSDConfig.
 | 
					
						
							|  |  |  | type DefaultedDNSSDConfig struct { | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	Names           []string `yaml:"names"` | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | 	RefreshInterval Duration `yaml:"refresh_interval,omitempty"` | 
					
						
							| 
									
										
										
										
											2015-04-25 18:59:05 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // RelabelAction is the action to be performed on relabeling.
 | 
					
						
							|  |  |  | type RelabelAction string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							|  |  |  | 	// Performs a regex replacement.
 | 
					
						
							|  |  |  | 	RelabelReplace RelabelAction = "replace" | 
					
						
							|  |  |  | 	// Drops targets for which the input does not match the regex.
 | 
					
						
							|  |  |  | 	RelabelKeep = "keep" | 
					
						
							|  |  |  | 	// Drops targets for which the input does match the regex.
 | 
					
						
							|  |  |  | 	RelabelDrop = "drop" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // UnmarshalYAML implements the yaml.Unmarshaller interface.
 | 
					
						
							|  |  |  | func (a *RelabelAction) UnmarshalYAML(unmarshal func(interface{}) error) error { | 
					
						
							|  |  |  | 	var s string | 
					
						
							|  |  |  | 	if err := unmarshal(&s); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	switch act := RelabelAction(strings.ToLower(s)); act { | 
					
						
							|  |  |  | 	case RelabelReplace, RelabelKeep, RelabelDrop: | 
					
						
							|  |  |  | 		*a = act | 
					
						
							|  |  |  | 		return nil | 
					
						
							| 
									
										
										
										
											2015-04-29 06:08:58 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	return fmt.Errorf("unknown relabel action %q", s) | 
					
						
							| 
									
										
										
										
											2015-04-29 06:08:58 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // RelabelConfig is the configuration for relabeling of target label sets.
 | 
					
						
							|  |  |  | type RelabelConfig struct { | 
					
						
							|  |  |  | 	// DefaultedRelabelConfig contains the actual fields for RelabelConfig.
 | 
					
						
							|  |  |  | 	DefaultedRelabelConfig `yaml:",inline"` | 
					
						
							| 
									
										
										
										
											2015-04-25 18:59:05 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // UnmarshalYAML implements the yaml.Unmarshaller interface.
 | 
					
						
							|  |  |  | func (c *RelabelConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { | 
					
						
							|  |  |  | 	c.DefaultedRelabelConfig = DefaultRelabelConfig | 
					
						
							|  |  |  | 	return unmarshal(&c.DefaultedRelabelConfig) | 
					
						
							| 
									
										
										
										
											2015-04-25 18:59:05 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // DefaultedRelabelConfig is a proxy type for RelabelConfig.
 | 
					
						
							|  |  |  | type DefaultedRelabelConfig struct { | 
					
						
							|  |  |  | 	// A list of labels from which values are taken and concatenated
 | 
					
						
							|  |  |  | 	// with the configured separator in order.
 | 
					
						
							|  |  |  | 	SourceLabels clientmodel.LabelNames `yaml:"source_labels,flow"` | 
					
						
							|  |  |  | 	// Separator is the string between concatenated values from the source labels.
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | 	Separator string `yaml:"separator,omitempty"` | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	// Regex against which the concatenation is matched.
 | 
					
						
							|  |  |  | 	Regex *Regexp `yaml:"regex"` | 
					
						
							|  |  |  | 	// The label to which the resulting string is written in a replacement.
 | 
					
						
							|  |  |  | 	TargetLabel clientmodel.LabelName `yaml:"target_label,omitempty"` | 
					
						
							|  |  |  | 	// Replacement is the regex replacement pattern to be used.
 | 
					
						
							|  |  |  | 	Replacement string `yaml:"replacement,omitempty"` | 
					
						
							|  |  |  | 	// Action is the action to be performed for the relabeling.
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | 	Action RelabelAction `yaml:"action,omitempty"` | 
					
						
							| 
									
										
										
										
											2015-04-25 18:59:05 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // Regexp encapsulates a regexp.Regexp and makes it YAML marshallable.
 | 
					
						
							|  |  |  | type Regexp struct { | 
					
						
							|  |  |  | 	regexp.Regexp | 
					
						
							| 
									
										
										
										
											2015-04-29 06:08:58 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // UnmarshalYAML implements the yaml.Unmarshaller interface.
 | 
					
						
							|  |  |  | func (re *Regexp) UnmarshalYAML(unmarshal func(interface{}) error) error { | 
					
						
							|  |  |  | 	var s string | 
					
						
							|  |  |  | 	if err := unmarshal(&s); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	regex, err := regexp.Compile(s) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							| 
									
										
										
										
											2015-04-29 06:08:58 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	re.Regexp = *regex | 
					
						
							| 
									
										
										
										
											2015-04-29 06:08:58 +08:00
										 |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // MarshalYAML implements the yaml.Marshaller interface.
 | 
					
						
							| 
									
										
										
										
											2015-05-07 22:47:18 +08:00
										 |  |  | func (re Regexp) MarshalYAML() (interface{}, error) { | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | 	return re.String(), nil | 
					
						
							| 
									
										
										
										
											2015-04-20 18:24:25 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-07 16:55:03 +08:00
										 |  |  | // Duration encapsulates a time.Duration and makes it YAML marshallable.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // TODO(fabxc): Since we have custom types for most things, including timestamps,
 | 
					
						
							|  |  |  | // we might want to move this into our model as well, eventually.
 | 
					
						
							|  |  |  | type Duration time.Duration | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // UnmarshalYAML implements the yaml.Unmarshaller interface.
 | 
					
						
							|  |  |  | func (d *Duration) UnmarshalYAML(unmarshal func(interface{}) error) error { | 
					
						
							|  |  |  | 	var s string | 
					
						
							|  |  |  | 	if err := unmarshal(&s); err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	dur, err := utility.StringToDuration(s) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	*d = Duration(dur) | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // MarshalYAML implements the yaml.Marshaller interface.
 | 
					
						
							|  |  |  | func (d Duration) MarshalYAML() (interface{}, error) { | 
					
						
							|  |  |  | 	return utility.DurationToString(time.Duration(d)), nil | 
					
						
							| 
									
										
										
										
											2015-04-20 18:24:25 +08:00
										 |  |  | } |