From 7ac9ad1df487a3c088121a711ceb42802843d6d6 Mon Sep 17 00:00:00 2001 From: Thomas Fan Date: Tue, 6 Feb 2018 13:55:41 -0500 Subject: [PATCH 1/2] Adds File SD Configuration Option --- Dockerfile | 2 +- docs/config.md | 7 +- prometheus/config.go | 67 +++++++- prometheus/config_test.go | 147 ++++++++++++++++ prometheus/types.go | 89 +++++++++- server/server.go | 28 +++- server/server_test.go | 341 ++++++++++++++++++++++++++++++++++++++ 7 files changed, 668 insertions(+), 13 deletions(-) diff --git a/Dockerfile b/Dockerfile index eb0cb01..26faeff 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ ADD . /src WORKDIR /src RUN go get -t github.com/stretchr/testify/suite RUN go get -d -v -t -RUN go test --cover ./... --run UnitTest +RUN go test --cover ./... --run UnitTest -p 1 RUN CGO_ENABLED=0 GOOS=linux go build -v -o docker-flow-monitor diff --git a/docs/config.md b/docs/config.md index 3e083c4..fb37eb9 100644 --- a/docs/config.md +++ b/docs/config.md @@ -103,8 +103,13 @@ curl `[IP_OF_ONE_OF_SWARM_NODES]:8080/v1/docker-flow-monitor/reconfigure?scrapeP Please consult [Prometheus Configuration](https://prometheus.io/docs/operating/configuration/) for more information about the available options. -## Scrapes +## Scrape Secret Configuration Additional scrapes can be added through files prefixed with `scrape_`. By default, all such files located in `/run/secrets` are automatically added to the `scrape_configs` section of the configuration. The directory can be changed by setting a different value to the environment variable `CONFIGS_DIR`. The simplest way to add scrape configs is to use Docker [secrets](https://docs.docker.com/engine/swarm/secrets/) or [configs](https://docs.docker.com/engine/swarm/configs/). + + +## Scrape Label Configuration + +When using a version of [Docker Flow Swarm Listener](https://github.com/vfarcic/docker-flow-swarm-listener), DFSL, newer than `18.02.06-31`, you can configure DFSL to send node node hostnames to `Docker Flow Monitor`, DFM. This can be done by setting `DF_INCLUDE_NODE_IP_INFO` to `true` in the DFSL environment. DFM will automatically display the node hostnames as a label for each prometheus target. The `DF_SCRAPE_TARGET_LABELS` env variable allows for additional labels to be displayed. For example, if a service has env variables `com.df.env=prod` and `com.df.domain=frontend`, you can set `DF_SCRAPE_TARGET_LABELS=env,domain` in DFM to display the `prod` and `frontend` labels in prometheus. diff --git a/prometheus/config.go b/prometheus/config.go index b53062b..251aec1 100644 --- a/prometheus/config.go +++ b/prometheus/config.go @@ -2,6 +2,7 @@ package prometheus import ( "bytes" + "encoding/json" "fmt" "net/url" "os" @@ -18,14 +19,17 @@ import ( // WriteConfig creates Prometheus configuration at configPath and writes alerts into /etc/prometheus/alert.rules func WriteConfig(configPath string, scrapes map[string]Scrape, alerts map[string]Alert) { c := &Config{} + fileSDDir := "/etc/prometheus/file_sd" + alertRulesPath := "/etc/prometheus/alert.rules" configDir := filepath.Dir(configPath) FS.MkdirAll(configDir, 0755) + FS.MkdirAll(fileSDDir, 0755) c.InsertScrapes(scrapes) if len(alerts) > 0 { logPrintf("Writing to alert.rules") - afero.WriteFile(FS, "/etc/prometheus/alert.rules", []byte(GetAlertConfig(alerts)), 0644) + afero.WriteFile(FS, alertRulesPath, []byte(GetAlertConfig(alerts)), 0644) c.RuleFiles = []string{"alert.rules"} } @@ -35,6 +39,7 @@ func WriteConfig(configPath string, scrapes map[string]Scrape, alerts map[string logPrintf("Unable to insert alertmanager url %s into prometheus config", alertmanagerURL) } } + c.CreateFileStaticConfig(scrapes, fileSDDir) for _, e := range os.Environ() { envSplit := strings.SplitN(e, "=", 2) @@ -98,6 +103,9 @@ func (c *Config) InsertScrapes(scrapes map[string]Scrape) { if len(metricsPath) == 0 { metricsPath = "/metrics" } + if s.NodeInfo != nil && len(*s.NodeInfo) > 0 { + continue + } if s.ScrapeType == "static_configs" { newScrape = &ScrapeConfig{ ServiceDiscoveryConfig: ServiceDiscoveryConfig{ @@ -152,6 +160,63 @@ func (c *Config) InsertScrapesFromDir(dir string) { } +// CreateFileStaticConfig creates static config files +func (c *Config) CreateFileStaticConfig(scrapes map[string]Scrape, fileSDDir string) { + + staticFiles := map[string]struct{}{} + for _, s := range scrapes { + fsc := FileStaticConfig{} + if s.NodeInfo == nil { + continue + } + for n := range *s.NodeInfo { + tg := TargetGroup{} + tg.Targets = []string{fmt.Sprintf("%s:%d", n.Addr, s.ScrapePort)} + tg.Labels = map[string]string{} + if s.ScrapeLabels != nil { + for k, v := range *s.ScrapeLabels { + tg.Labels[k] = v + } + } + tg.Labels["node"] = n.Name + tg.Labels["service"] = s.ServiceName + fsc = append(fsc, &tg) + } + + if len(fsc) == 0 { + continue + } + + fscBytes, err := json.Marshal(fsc) + if err != nil { + continue + } + filePath := fmt.Sprintf("%s/%s.json", fileSDDir, s.ServiceName) + afero.WriteFile(FS, filePath, fscBytes, 0644) + newScrape := &ScrapeConfig{ + ServiceDiscoveryConfig: ServiceDiscoveryConfig{ + FileSDConfigs: []*SDConfig{{ + Files: []string{filePath}, + }}, + }, + JobName: s.ServiceName, + } + c.ScrapeConfigs = append(c.ScrapeConfigs, newScrape) + staticFiles[filePath] = struct{}{} + } + + // Remove scrapes that are not in fileStaticServices + currentStaticFiles, err := afero.Glob(FS, fmt.Sprintf("%s/*.json", fileSDDir)) + if err != nil { + return + } + for _, file := range currentStaticFiles { + if _, ok := staticFiles[file]; !ok { + FS.Remove(file) + } + } +} + func normalizeScrapeFile(content []byte) []byte { spaceCnt := 0 for i, c := range content { diff --git a/prometheus/config_test.go b/prometheus/config_test.go index cdf5a70..ce522f4 100644 --- a/prometheus/config_test.go +++ b/prometheus/config_test.go @@ -1,6 +1,7 @@ package prometheus import ( + "encoding/json" "fmt" "os" "testing" @@ -532,6 +533,152 @@ func (s *ConfigTestSuite) Test_Writeconfig_WritesConfig() { s.Contains(actualConfig.ScrapeConfigs, c.ScrapeConfigs[1]) } +func (s *ConfigTestSuite) Test_Writeconfig_WithNodeInfo_WritesConfig() { + fsOrg := FS + defer func() { + FS = fsOrg + }() + FS = afero.NewMemMapFs() + + nodeInfo1 := NodeIPSet{} + nodeInfo1.Add("node-1", "1.0.1.1") + nodeInfo1.Add("node-2", "1.0.1.2") + serviceLabels1 := map[string]string{ + "env": "prod", + "domain": "frontend", + } + + nodeInfo2 := NodeIPSet{} + nodeInfo2.Add("node-1", "1.0.2.1") + nodeInfo2.Add("node-1", "1.0.2.2") + serviceLabels2 := map[string]string{ + "env": "dev", + "domain": "backend", + } + + scrapes := map[string]Scrape{ + "service-1": { + ServiceName: "service-1", + ScrapePort: 1234, + ScrapeLabels: &serviceLabels1, + NodeInfo: &nodeInfo1, + }, + "service-2": { + ServiceName: "service-2", + ScrapePort: 5678, + ScrapeLabels: &serviceLabels2, + NodeInfo: &nodeInfo2, + }, + "service-3": { + ServiceName: "service-3", + ScrapePort: 5432, + }, + } + alerts := map[string]Alert{} + + WriteConfig("/etc/prometheus/prometheus.yml", scrapes, alerts) + actual, err := afero.ReadFile(FS, "/etc/prometheus/prometheus.yml") + s.Require().NoError(err) + + actualConfig := Config{} + err = yaml.Unmarshal(actual, &actualConfig) + s.Require().NoError(err) + + s.Require().Len(actualConfig.ScrapeConfigs, 3) + + var service1ScrapeConfig *ScrapeConfig + var service2ScrapeConfig *ScrapeConfig + var service3ScrapeConfig *ScrapeConfig + + for _, sc := range actualConfig.ScrapeConfigs { + if sc.JobName == "service-1" { + service1ScrapeConfig = sc + } else if sc.JobName == "service-2" { + service2ScrapeConfig = sc + } else if sc.JobName == "service-3" { + service3ScrapeConfig = sc + } + } + s.Require().NotNil(service1ScrapeConfig) + s.Require().NotNil(service2ScrapeConfig) + s.Require().NotNil(service3ScrapeConfig) + + s.Require().Len(service1ScrapeConfig.ServiceDiscoveryConfig.FileSDConfigs, 1) + s.Require().Len(service2ScrapeConfig.ServiceDiscoveryConfig.FileSDConfigs, 1) + s.Require().Len(service3ScrapeConfig.ServiceDiscoveryConfig.DNSSDConfigs, 1) + + service1FileScrape := service1ScrapeConfig.ServiceDiscoveryConfig.FileSDConfigs[0] + service2FileScrape := service2ScrapeConfig.ServiceDiscoveryConfig.FileSDConfigs[0] + service3DNSScrape := service3ScrapeConfig.ServiceDiscoveryConfig.DNSSDConfigs[0] + + s.Equal("/etc/prometheus/file_sd/service-1.json", service1FileScrape.Files[0]) + s.Equal("/etc/prometheus/file_sd/service-2.json", service2FileScrape.Files[0]) + + s.Require().Len(service3DNSScrape.Names, 1) + s.Equal("tasks.service-3", service3DNSScrape.Names[0]) + s.Equal(5432, service3DNSScrape.Port) + s.Equal("A", service3DNSScrape.Type) + + actualSDService1Bytes, err := afero.ReadFile(FS, "/etc/prometheus/file_sd/service-1.json") + s.Require().NoError(err) + fsc1 := FileStaticConfig{} + err = json.Unmarshal(actualSDService1Bytes, &fsc1) + s.Require().NoError(err) + + actualSDService2Bytes, err := afero.ReadFile(FS, "/etc/prometheus/file_sd/service-2.json") + s.Require().NoError(err) + fsc2 := FileStaticConfig{} + err = json.Unmarshal(actualSDService2Bytes, &fsc2) + s.Require().NoError(err) + + var tgService1Node1 *TargetGroup + var tgService1Node2 *TargetGroup + var tgService2Node1 *TargetGroup + var tgService2Node2 *TargetGroup + + for _, tg := range fsc1 { + for _, target := range tg.Targets { + if target == "1.0.1.1:1234" { + tgService1Node1 = tg + break + } else if target == "1.0.1.2:1234" { + tgService1Node2 = tg + break + } + } + } + for _, tg := range fsc2 { + for _, target := range tg.Targets { + if target == "1.0.2.1:5678" { + tgService2Node1 = tg + break + } else if target == "1.0.2.2:5678" { + tgService2Node2 = tg + } + } + } + s.Require().NotNil(tgService1Node1) + s.Require().NotNil(tgService1Node2) + s.Require().NotNil(tgService2Node1) + s.Require().NotNil(tgService2Node2) + + s.Equal("prod", tgService1Node1.Labels["env"]) + s.Equal("frontend", tgService1Node1.Labels["domain"]) + s.Equal("service-1", tgService1Node1.Labels["service"]) + + s.Equal("prod", tgService1Node2.Labels["env"]) + s.Equal("frontend", tgService1Node2.Labels["domain"]) + s.Equal("service-1", tgService1Node2.Labels["service"]) + + s.Equal("dev", tgService2Node1.Labels["env"]) + s.Equal("backend", tgService2Node1.Labels["domain"]) + s.Equal("service-2", tgService2Node1.Labels["service"]) + + s.Equal("dev", tgService2Node2.Labels["env"]) + s.Equal("backend", tgService2Node2.Labels["domain"]) + s.Equal("service-2", tgService2Node2.Labels["service"]) +} + func (s *ConfigTestSuite) Test_WriteConfig_WriteAlerts() { fsOrig := FS defer func() { FS = fsOrig }() diff --git a/prometheus/types.go b/prometheus/types.go index b9d1749..0ae17cc 100644 --- a/prometheus/types.go +++ b/prometheus/types.go @@ -1,5 +1,7 @@ package prometheus +import "encoding/json" + // ScrapeConfig configures a scraping unit for Prometheus. type ScrapeConfig struct { // The job name to which the job label is set by default. @@ -78,12 +80,12 @@ type RemoteWriteConfig struct { 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 []string `yaml:"targets,omitempty"` + Targets []string `yaml:"targets,omitempty" json:"targets,omitempty"` // Labels is a set of labels that is common across all targets in the group. - Labels map[string]string `yaml:"labels,omitempty"` + Labels map[string]string `yaml:"labels,omitempty" json:"labels,omitempty"` // Source is an identifier that describes a group of targets. - Source string `yaml:"source,omitempty"` + Source string `yaml:"source,omitempty" json:"source,omitempty"` } // DNSSDConfig is the configuration for DNS based service discovery. @@ -94,12 +96,23 @@ type DNSSDConfig struct { Port int `yaml:"port"` // Ignored for SRV records } +// SDConfig is the configuration for file based discovery. +type SDConfig struct { + Files []string `yaml:"files"` + RefreshInterval string `yaml:"refresh_interval,omitempty"` +} + +// FileStaticConfig configures File-based service discovery +type FileStaticConfig []*TargetGroup + // ServiceDiscoveryConfig configures lists of different service discovery mechanisms. type ServiceDiscoveryConfig struct { // List of labeled target groups for this job. StaticConfigs []*TargetGroup `yaml:"static_configs,omitempty"` // List of DNS service discovery configurations. DNSSDConfigs []*DNSSDConfig `yaml:"dns_sd_configs,omitempty"` + // List of file service discovery configurations. + FileSDConfigs []*SDConfig `yaml:"file_sd_configs,omitempty"` } // BasicAuth contains basic HTTP authentication credentials. @@ -214,10 +227,72 @@ type Alert struct { Replicas int `json:"replicas"` } +// NodeIP defines a node/addr pair +type NodeIP struct { + Name string `json:"name"` + Addr string `json:"addr"` +} + +// NodeIPSet is a set of NodeIPs +type NodeIPSet map[NodeIP]struct{} + +// Add node to set +func (ns *NodeIPSet) Add(name, addr string) { + (*ns)[NodeIP{Name: name, Addr: addr}] = struct{}{} +} + +// Equal returns true when NodeIPSets contain the same elements +func (ns NodeIPSet) Equal(other NodeIPSet) bool { + + if ns.Cardinality() != other.Cardinality() { + return false + } + + for ip := range ns { + if _, ok := other[ip]; !ok { + return false + } + } + return true +} + +// Cardinality returns the size of set +func (ns NodeIPSet) Cardinality() int { + return len(ns) +} + +// MarshalJSON creates JSON array from NodeIPSet +func (ns NodeIPSet) MarshalJSON() ([]byte, error) { + items := make([][2]string, 0, ns.Cardinality()) + + for elem := range ns { + items = append(items, [2]string{elem.Name, elem.Addr}) + } + return json.Marshal(items) +} + +// UnmarshalJSON recreates NodeIPSet from a JSON array +func (ns *NodeIPSet) UnmarshalJSON(b []byte) error { + + items := [][2]string{} + err := json.Unmarshal(b, &items) + if err != nil { + return err + } + + for _, item := range items { + (*ns)[NodeIP{Name: item[0], Addr: item[1]}] = struct{}{} + } + + return nil +} + // Scrape defines data used to create scraping configuration snippet type Scrape struct { - MetricsPath string `json:"metricsPath,string,omitempty"` - ScrapePort int `json:"scrapePort,string,omitempty"` - ServiceName string `json:"serviceName"` - ScrapeType string `json:"scrapeType"` + MetricsPath string `json:"metricsPath,string,omitempty"` + ScrapePort int `json:"scrapePort,string,omitempty"` + ServiceName string `json:"serviceName"` + ScrapeType string `json:"scrapeType"` + ScrapeLabels *map[string]string `json:"scrapeLabels,omitempty"` + NodeInfo *NodeIPSet `json:"nodeInfo,omitempty"` } diff --git a/server/server.go b/server/server.go index 59dfdb2..0d4e89f 100644 --- a/server/server.go +++ b/server/server.go @@ -396,10 +396,32 @@ func (s *serve) getNameFormatted(name string) string { func (s *serve) getScrape(req *http.Request) prometheus.Scrape { scrape := prometheus.Scrape{} decoder.Decode(&scrape, req.Form) - if s.isValidScrape(&scrape) { - s.scrapes[scrape.ServiceName] = scrape - logPrintf("Adding scrape %s\n%v", scrape.ServiceName, scrape) + if !s.isValidScrape(&scrape) { + return scrape + } + + if nodeInfoStr := req.Form.Get("nodeInfo"); len(nodeInfoStr) > 0 { + nodeInfo := prometheus.NodeIPSet{} + json.Unmarshal([]byte(nodeInfoStr), &nodeInfo) + scrape.NodeInfo = &nodeInfo + } + + if scrape.NodeInfo != nil && len(*scrape.NodeInfo) > 0 { + scrape.ScrapeLabels = &map[string]string{} + if targetLabels := os.Getenv("DF_SCRAPE_TARGET_LABELS"); len(targetLabels) > 0 { + labels := strings.Split(targetLabels, ",") + for _, label := range labels { + value := req.Form.Get(label) + if len(value) > 0 { + (*scrape.ScrapeLabels)[label] = value + } + } + } } + + s.scrapes[scrape.ServiceName] = scrape + logPrintf("Adding scrape %s\n%v", scrape.ServiceName, scrape) + return scrape } diff --git a/server/server_test.go b/server/server_test.go index fbe8164..94d3a81 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -13,6 +13,7 @@ import ( "../prometheus" "github.com/spf13/afero" "github.com/stretchr/testify/suite" + yaml "gopkg.in/yaml.v2" ) type ServerTestSuite struct { @@ -464,6 +465,94 @@ func (s *ServerTestSuite) Test_ReconfigureHandler_AddsScrapeType() { s.Equal(expected, serve.scrapes[expected.ServiceName]) } +func (s *ServerTestSuite) Test_ReconfigureHandler_WithNodeInfo() { + defer func() { + os.Unsetenv("DF_SCRAPE_TARGET_LABELS") + }() + os.Setenv("DF_SCRAPE_TARGET_LABELS", "env,domain") + nodeInfo := prometheus.NodeIPSet{} + nodeInfo.Add("node-1", "1.0.1.1") + nodeInfo.Add("node-2", "1.0.1.2") + expected := prometheus.Scrape{ + ServiceName: "my-service", + ScrapePort: 1234, + ScrapeLabels: &map[string]string{ + "env": "prod", + "domain": "frontend", + }, + NodeInfo: &nodeInfo, + } + + nodeInfoBytes, err := json.Marshal(nodeInfo) + s.Require().NoError(err) + + rwMock := ResponseWriterMock{} + addr, err := url.Parse("/v1/docker-flow-monitor") + s.Require().NoError(err) + + q := addr.Query() + q.Add("serviceName", expected.ServiceName) + q.Add("scrapePort", fmt.Sprintf("%d", expected.ScrapePort)) + q.Add("env", (*expected.ScrapeLabels)["env"]) + q.Add("domain", (*expected.ScrapeLabels)["domain"]) + q.Add("extra", "system") + q.Add("nodeInfo", string(nodeInfoBytes)) + addr.RawQuery = q.Encode() + + req, _ := http.NewRequest("GET", addr.String(), nil) + serve := New() + serve.ReconfigureHandler(rwMock, req) + + targetScrape := serve.scrapes[expected.ServiceName] + s.Equal(expected.ServiceName, targetScrape.ServiceName) + s.Equal(expected.ScrapePort, targetScrape.ScrapePort) + s.Equal(expected.ScrapeLabels, targetScrape.ScrapeLabels) + s.Equal("", (*targetScrape.ScrapeLabels)["extra"]) + + s.Require().NotNil(targetScrape.NodeInfo) + s.True(expected.NodeInfo.Equal(*targetScrape.NodeInfo)) + +} + +func (s *ServerTestSuite) Test_ReconfigureHandler_WithNodeInfo_NoTargetLabelsDefined() { + nodeInfo := prometheus.NodeIPSet{} + nodeInfo.Add("node-1", "1.0.1.1") + nodeInfo.Add("node-2", "1.0.1.2") + expected := prometheus.Scrape{ + ServiceName: "my-service", + ScrapePort: 1234, + ScrapeLabels: &map[string]string{}, + NodeInfo: &nodeInfo, + } + + nodeInfoBytes, err := json.Marshal(nodeInfo) + s.Require().NoError(err) + + rwMock := ResponseWriterMock{} + addr, err := url.Parse("/v1/docker-flow-monitor") + s.Require().NoError(err) + + q := addr.Query() + q.Add("serviceName", expected.ServiceName) + q.Add("scrapePort", fmt.Sprintf("%d", expected.ScrapePort)) + q.Add("env", "dev") + q.Add("domain", "frontend") + q.Add("nodeInfo", string(nodeInfoBytes)) + addr.RawQuery = q.Encode() + + req, _ := http.NewRequest("GET", addr.String(), nil) + serve := New() + serve.ReconfigureHandler(rwMock, req) + + targetScrape := serve.scrapes[expected.ServiceName] + s.Equal(expected.ServiceName, targetScrape.ServiceName) + s.Equal(expected.ScrapePort, targetScrape.ScrapePort) + s.Equal(expected.ScrapeLabels, targetScrape.ScrapeLabels) + + s.Require().NotNil(targetScrape.NodeInfo) + s.True(expected.NodeInfo.Equal(*targetScrape.NodeInfo)) +} + func (s *ServerTestSuite) Test_ReconfigureHandler_DoesNotAddAlert_WhenAlertNameIsEmpty() { rwMock := ResponseWriterMock{} req, _ := http.NewRequest("GET", "/v1/docker-flow-monitor", nil) @@ -586,6 +675,107 @@ scrape_configs: s.Equal(expected, string(actual)) } +func (s *ServerTestSuite) Test_ReconfigureHandler_WithNodeInfo_CallsWriteConfig() { + fsOrig := prometheus.FS + defer func() { + os.Unsetenv("DF_SCRAPE_TARGET_LABELS") + prometheus.FS = fsOrig + }() + prometheus.FS = afero.NewMemMapFs() + os.Setenv("DF_SCRAPE_TARGET_LABELS", "env,domain") + expectedConfig := `global: + scrape_interval: 5s +alerting: + alertmanagers: + - static_configs: + - targets: + - alert-manager:9093 + scheme: http +rule_files: +- alert.rules +scrape_configs: +- job_name: my-service + file_sd_configs: + - files: + - /etc/prometheus/file_sd/my-service.json +` + nodeInfo := prometheus.NodeIPSet{} + nodeInfo.Add("node-1", "1.0.1.1") + nodeInfo.Add("node-2", "1.0.1.2") + expected := prometheus.Scrape{ + ServiceName: "my-service", + ScrapePort: 1234, + ScrapeLabels: &map[string]string{ + "env": "prod", + "domain": "frontend", + }, + NodeInfo: &nodeInfo, + } + + nodeInfoBytes, err := json.Marshal(nodeInfo) + s.Require().NoError(err) + + rwMock := ResponseWriterMock{} + addr, err := url.Parse("/v1/docker-flow-monitor") + s.Require().NoError(err) + + q := addr.Query() + q.Add("serviceName", expected.ServiceName) + q.Add("scrapePort", fmt.Sprintf("%d", expected.ScrapePort)) + q.Add("env", (*expected.ScrapeLabels)["env"]) + q.Add("domain", (*expected.ScrapeLabels)["domain"]) + q.Add("nodeInfo", string(nodeInfoBytes)) + q.Add("alertName", "my-alert") + q.Add("alertIf", "my-if") + q.Add("alertFor", "my-for") + addr.RawQuery = q.Encode() + + req, _ := http.NewRequest("GET", addr.String(), nil) + + serve := New() + serve.ReconfigureHandler(rwMock, req) + + actualPrometheusConfig, err := afero.ReadFile(prometheus.FS, "/etc/prometheus/prometheus.yml") + s.Require().NoError(err) + s.Equal(expectedConfig, string(actualPrometheusConfig)) + + fileSDConfigByte, err := afero.ReadFile(prometheus.FS, "/etc/prometheus/file_sd/my-service.json") + s.Require().NoError(err) + + fileSDconfig := prometheus.FileStaticConfig{} + err = json.Unmarshal(fileSDConfigByte, &fileSDconfig) + s.Require().NoError(err) + + s.Require().Len(fileSDconfig, 2) + + var targetGroup1 *prometheus.TargetGroup + var targetGroup2 *prometheus.TargetGroup + for _, tg := range fileSDconfig { + if tg == nil { + continue + } + for _, target := range tg.Targets { + if target == "1.0.1.1:1234" { + targetGroup1 = tg + break + } else if target == "1.0.1.2:1234" { + targetGroup2 = tg + break + } + } + } + + s.Require().NotNil(targetGroup1) + s.Require().NotNil(targetGroup2) + + s.Equal((*expected.ScrapeLabels)["env"], targetGroup1.Labels["env"]) + s.Equal((*expected.ScrapeLabels)["domain"], targetGroup1.Labels["domain"]) + s.Equal("node-1", targetGroup1.Labels["node"]) + + s.Equal((*expected.ScrapeLabels)["env"], targetGroup2.Labels["env"]) + s.Equal("node-2", targetGroup2.Labels["node"]) +} + func (s *ServerTestSuite) Test_ReconfigureHandler_SendsReloadRequestToPrometheus() { reloadOrig := prometheus.Reload defer func() { prometheus.Reload = reloadOrig }() @@ -806,6 +996,157 @@ alerting: s.Equal(expectedAfterDelete, string(actual)) } +func (s *ServerTestSuite) Test_RemoveHandler_WithNodeInfo_CallsWriteConfig() { + fsOrig := prometheus.FS + defer func() { + prometheus.FS = fsOrig + }() + prometheus.FS = afero.NewMemMapFs() + nodeInfo1 := prometheus.NodeIPSet{} + nodeInfo1.Add("node-1", "1.0.1.1") + nodeInfo1.Add("node-2", "1.0.1.2") + expected1 := prometheus.Scrape{ + ServiceName: "my-service1", + ScrapePort: 1234, + ScrapeLabels: &map[string]string{}, + NodeInfo: &nodeInfo1, + } + + nodeInfo2 := prometheus.NodeIPSet{} + nodeInfo2.Add("node-1", "1.0.2.1") + expected2 := prometheus.Scrape{ + ServiceName: "my-service2", + ScrapePort: 2341, + ScrapeLabels: &map[string]string{}, + NodeInfo: &nodeInfo2, + } + + nodeInfoBytes1, err := json.Marshal(nodeInfo1) + s.Require().NoError(err) + nodeInfoBytes2, err := json.Marshal(nodeInfo2) + s.Require().NoError(err) + + rwMock := ResponseWriterMock{} + addr, err := url.Parse("/v1/docker-flow-monitor") + s.Require().NoError(err) + + q1 := addr.Query() + q1.Add("serviceName", expected1.ServiceName) + q1.Add("scrapePort", fmt.Sprintf("%d", expected1.ScrapePort)) + q1.Add("nodeInfo", string(nodeInfoBytes1)) + + q2 := addr.Query() + q2.Add("serviceName", expected2.ServiceName) + q2.Add("scrapePort", fmt.Sprintf("%d", expected2.ScrapePort)) + q2.Add("nodeInfo", string(nodeInfoBytes2)) + + serve := New() + + addr.RawQuery = q1.Encode() + req1, _ := http.NewRequest("GET", addr.String(), nil) + serve.ReconfigureHandler(rwMock, req1) + + addr.RawQuery = q2.Encode() + req2, _ := http.NewRequest("GET", addr.String(), nil) + serve.ReconfigureHandler(rwMock, req2) + + actualPrometheusConfigBytes, err := afero.ReadFile(prometheus.FS, "/etc/prometheus/prometheus.yml") + s.Require().NoError(err) + + actualPrometheusConfig := prometheus.Config{} + err = yaml.Unmarshal(actualPrometheusConfigBytes, &actualPrometheusConfig) + s.Require().NoError(err) + s.Len(actualPrometheusConfig.ScrapeConfigs, 2) + + var sdConfig1 *prometheus.SDConfig + var sdConfig2 *prometheus.SDConfig + + for _, sc := range actualPrometheusConfig.ScrapeConfigs { + if sc.JobName == "my-service1" { + s.Require().Len(sc.ServiceDiscoveryConfig.FileSDConfigs, 1) + sdConfig1 = sc.ServiceDiscoveryConfig.FileSDConfigs[0] + } + if sc.JobName == "my-service2" { + s.Require().Len(sc.ServiceDiscoveryConfig.FileSDConfigs, 1) + sdConfig2 = sc.ServiceDiscoveryConfig.FileSDConfigs[0] + } + } + s.Require().NotNil(sdConfig1) + s.Require().NotNil(sdConfig2) + s.Len(sdConfig1.Files, 1) + s.Len(sdConfig2.Files, 1) + s.Equal("/etc/prometheus/file_sd/my-service1.json", sdConfig1.Files[0]) + s.Equal("/etc/prometheus/file_sd/my-service2.json", sdConfig2.Files[0]) + + // my-service1 has two servies + fileSDConfigService1Byte, err := afero.ReadFile(prometheus.FS, "/etc/prometheus/file_sd/my-service1.json") + s.Require().NoError(err) + fileSDconfig1 := prometheus.FileStaticConfig{} + err = json.Unmarshal(fileSDConfigService1Byte, &fileSDconfig1) + s.Require().NoError(err) + s.Require().Len(fileSDconfig1, 2) + + // my-service2 has one servies + fileSDConfigService2Byte, err := afero.ReadFile(prometheus.FS, "/etc/prometheus/file_sd/my-service2.json") + s.Require().NoError(err) + fileSDconfig2 := prometheus.FileStaticConfig{} + err = json.Unmarshal(fileSDConfigService2Byte, &fileSDconfig2) + s.Require().NoError(err) + s.Require().Len(fileSDconfig2, 1) + + // Delete my-service1 + addrDelete1 := "/v1/docker-flow-monitor?serviceName=my-service1" + reqDelete1, _ := http.NewRequest("DELETE", addrDelete1, nil) + + serve.RemoveHandler(rwMock, reqDelete1) + + actualConfigBytes, _ := afero.ReadFile(prometheus.FS, "/etc/prometheus/prometheus.yml") + // Config did not change since there is still a service being scraped + actualPrometheusConfigAfter := prometheus.Config{} + err = yaml.Unmarshal(actualConfigBytes, &actualPrometheusConfigAfter) + s.Require().NoError(err) + s.Len(actualPrometheusConfigAfter.ScrapeConfigs, 1) + + // my-service1 is gone + myService1Exists, err := afero.Exists(prometheus.FS, "/etc/prometheus/file_sd/my-service1.json") + s.Require().NoError(err) + s.False(myService1Exists) + + fileSDConfigService2Byte, err = afero.ReadFile(prometheus.FS, "/etc/prometheus/file_sd/my-service2.json") + s.Require().NoError(err) + fileSDconfig2After := prometheus.FileStaticConfig{} + err = json.Unmarshal(fileSDConfigService2Byte, &fileSDconfig2After) + s.Require().NoError(err) + + // my-service2 is still running running + s.Require().Len(fileSDconfig2After, 1) + + // Delete my-service2 + addrDelete2 := "/v1/docker-flow-monitor?serviceName=my-service2" + reqDelete2, _ := http.NewRequest("DELETE", addrDelete2, nil) + + serve.RemoveHandler(rwMock, reqDelete2) + + expectedConfigDelete := `global: + scrape_interval: 5s +alerting: + alertmanagers: + - static_configs: + - targets: + - alert-manager:9093 + scheme: http +` + + actualConfig, _ := afero.ReadFile(prometheus.FS, "/etc/prometheus/prometheus.yml") + // Config did not change since there is still a service being scraped + s.Equal(expectedConfigDelete, string(actualConfig)) + + // my-service2 is gone + myService2Exists, err := afero.Exists(prometheus.FS, "/etc/prometheus/file_sd/my-service2.json") + s.Require().NoError(err) + s.False(myService2Exists) +} + func (s *ServerTestSuite) Test_RemoveHandler_SendsReloadRequestToPrometheus() { called := false reloadOrig := prometheus.Reload From 48b5205fc8e720e52ebd0bd9e2e7a855917f710e Mon Sep 17 00:00:00 2001 From: Thomas Fan Date: Wed, 7 Feb 2018 11:13:02 -0500 Subject: [PATCH 2/2] Add docs --- docs/img/flexiable-labeling-targets-page.png | Bin 0 -> 127804 bytes docs/tutorial-flexible-labeling.md | 110 ++++++++++++++++++ mkdocs.yml | 1 + .../docker-flow-monitor-flexible-labels.yml | 38 ++++++ stacks/exporters-tutorial-flexible-labels.yml | 50 ++++++++ 5 files changed, 199 insertions(+) create mode 100644 docs/img/flexiable-labeling-targets-page.png create mode 100644 docs/tutorial-flexible-labeling.md create mode 100644 stacks/docker-flow-monitor-flexible-labels.yml create mode 100644 stacks/exporters-tutorial-flexible-labels.yml diff --git a/docs/img/flexiable-labeling-targets-page.png b/docs/img/flexiable-labeling-targets-page.png new file mode 100644 index 0000000000000000000000000000000000000000..2e5d50e3dfe8669c295d0afd1bdd234fbc4ed974 GIT binary patch literal 127804 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 NWrgSRm9iF){{cQ2iemr( literal 0 HcmV?d00001 diff --git a/docs/tutorial-flexible-labeling.md b/docs/tutorial-flexible-labeling.md new file mode 100644 index 0000000..ef1a035 --- /dev/null +++ b/docs/tutorial-flexible-labeling.md @@ -0,0 +1,110 @@ +# Flexible Labeling with Docker Flow Monitor + +*Docker Flow Monitor* and *Docker Flow Swarm Listener* can be configured to allow for more flexible labeling of exporters. Please read the [Running Docker Flow Monitor](tutorial.md) tutorial before reading this one. This tutorial focuses on configuring the stacks to allow for flexible labeling. + +## Setting Up A Cluster + +!!! info + Feel free to skip this section if you already have a Swarm cluster that can be used for this tutorial + +We'll create a Swarm cluster consisting of three nodes created with Docker Machine. + +```bash +git clone https://github.com/vfarcic/docker-flow-monitor.git + +cd docker-flow-monitor + +./scripts/dm-swarm.sh + +eval $(docker-machine env swarm-1) +``` + +## Deploying Docker Flow Monitor + +We will deploy [stacks/docker-flow-monitor-flexible-labels.yml](https://github.com/vfarcic/docker-flow-monitor/blob/master/stacks/docker-flow-monitor-flexible-labels.yml) stack that contains three services: `monitor`, `alert-manager` and `swarm-listener`. The `swarm-listener` service includes an additional environment variable: `DF_INCLUDE_NODE_IP_INFO=true`. This configures `swarm-listener` to send node and ip information to `mointor`. + +The `monitor` service includes the environment variable: `DF_SCRAPE_TARGET_LABELS=env,metricType`. This sets up flexible labeling for exporters. If an exporter defines a deploy label `com.df.env` or `com.df.metricType`, that label will be used by `monitor`. + +Let's deploy the `monitor` stack: + +```bash +docker network create -d overlay monitor + +docker stack deploy \ + -c stacks/docker-flow-monitor-flexible-labels.yml \ + monitor +``` + +## Collecting Metrics and Defining Alerts + +We will deploy exporters stack defined in [stacks/exporters-tutorial-flexible-labels.yml](https://github.com/vfarcic/docker-flow-monitor/blob/master/stacks/exporters-tutorial-flexible-labels.yml), two containing two services: `cadvisor` and `node-exporter`. + +The definition of the `cadvisor` service contains additional deploy labels: + +```yaml + cadvisor: + image: google/cadvisor + networks: + - monitor + ... + deploy: + mode: global + labels: + ... + - com.df.scrapeNetwork=monitor + - com.df.env=prod + - com.df.metricType=system +``` + +The `com.df.scrapeNetwork` deploy label tells `swarm-listener` to use `cadvisor`'s IP on the `monitor` network. This is important because the `monitor` service is using the `monitor` network to scrape `cadvisor`. The `com.df.env=prod` and `com.df.metricType=system` deploy labels configures flexible labeling for `cadvisor`. + +The second service, `node-exporter` is also configured with flexiable labels: + +```yaml + node-exporter: + image: basi/node-exporter + networks: + - monitor + ... + deploy: + mode: global + labels: + ... + - com.df.scrapeNetwork=monitor + - com.df.env=dev + - com.df.metricType=system +``` + +Let's deploy the `exporter` stack + +```bash +docker stack deploy \ + -c stacks/exporters-tutorial-flexible-labels.yml \ + exporter +``` + +Please wait until the service in the stack are up-and-running. You can check their status by executing `docker stack ps exporter`. + +Now we can open the *Prometheus* targets page from a browser. + +> If you're a Windows user, Git Bash might not be able to use the `open` command. If that's the case, replace the `open` command with `echo`. As a result, you'll get the full address that should be opened directly in your browser of choice. + +```bash +open "http://$(docker-machine ip swarm-1):9090/targets" +``` + +You should see a targets page similar to the following: + +![Flexiable Labeling Targets Page](img/flexiable-labeling-targets-page.png) + +Each service is labeled with its associated `com.df.env` or `com.df.metricType` deploy label. In addition, the `node` label is the hostname the service is running on. + +## What Now? + +*Docker Flow Monitors*'s flexible labeling feature provides more information about your services. Please consult the documentation for any additional information you might need. Feel free to open [an issue](https://github.com/vfarcic/docker-flow-monitor/issues) if you require additional info, if you find a bug, or if you have a feature request. + +Before you go, please remove the cluster we created and free those resources for something else. + +```bash +docker-machine rm -f swarm-1 swarm-2 swarm-3 +``` diff --git a/mkdocs.yml b/mkdocs.yml index c3aeb53..a0fccc8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -4,6 +4,7 @@ pages: - Tutorial: - Running Docker Flow Monitor: tutorial.md - Auto-Scaling Services Using Instrumented Metrics: auto-scaling.md + - Flexible Labeling with Docker Flow Monitor: tutorial-flexible-labeling.md - Configuration: config.md - Usage: usage.md - Migration Guide: migration.md diff --git a/stacks/docker-flow-monitor-flexible-labels.yml b/stacks/docker-flow-monitor-flexible-labels.yml new file mode 100644 index 0000000..fe8bcbd --- /dev/null +++ b/stacks/docker-flow-monitor-flexible-labels.yml @@ -0,0 +1,38 @@ +version: "3" + +services: + + monitor: + image: vfarcic/docker-flow-monitor:${TAG:-latest} + environment: + - LISTENER_ADDRESS=swarm-listener + - GLOBAL_SCRAPE_INTERVAL=10s + - ARG_ALERTMANAGER_URL=http://alert-manager:9093 + - DF_SCRAPE_TARGET_LABELS=env,metricType + networks: + - monitor + ports: + - 9090:9090 + + alert-manager: + image: vfarcic/alert-manager:slack + networks: + - monitor + + swarm-listener: + image: vfarcic/docker-flow-swarm-listener + networks: + - monitor + volumes: + - /var/run/docker.sock:/var/run/docker.sock + environment: + - DF_NOTIFY_CREATE_SERVICE_URL=http://monitor:8080/v1/docker-flow-monitor/reconfigure + - DF_NOTIFY_REMOVE_SERVICE_URL=http://monitor:8080/v1/docker-flow-monitor/remove + - DF_INCLUDE_NODE_IP_INFO=true + deploy: + placement: + constraints: [node.role == manager] + +networks: + monitor: + external: true diff --git a/stacks/exporters-tutorial-flexible-labels.yml b/stacks/exporters-tutorial-flexible-labels.yml new file mode 100644 index 0000000..2b91c6b --- /dev/null +++ b/stacks/exporters-tutorial-flexible-labels.yml @@ -0,0 +1,50 @@ +version: "3" + +services: + + cadvisor: + image: google/cadvisor + networks: + - monitor + volumes: + - /:/rootfs + - /var/run:/var/run + - /sys:/sys + - /var/lib/docker:/var/lib/docker + deploy: + mode: global + labels: + - com.df.notify=true + - com.df.scrapePort=8080 + - com.df.scrapeNetwork=monitor + - com.df.env=prod + - com.df.metricType=system + + node-exporter: + image: basi/node-exporter + networks: + - monitor + environment: + - HOST_HOSTNAME=/etc/host_hostname + volumes: + - /proc:/host/proc + - /sys:/host/sys + - /:/rootfs + - /etc/hostname:/etc/host_hostname + deploy: + mode: global + labels: + - com.df.notify=true + - com.df.scrapePort=9100 + - com.df.alertName.1=mem_load + - com.df.alertIf.1=(sum by (instance) (node_memory_MemTotal) - sum by (instance) (node_memory_MemFree + node_memory_Buffers + node_memory_Cached)) / sum by (instance) (node_memory_MemTotal) > 0.8 + - com.df.alertName.2=diskload + - com.df.alertIf.2=@node_fs_limit:0.8 + - com.df.scrapeNetwork=monitor + - com.df.env=dev + - com.df.metricType=system + command: '--path.procfs="/host/proc" --path.sysfs="/host/sys" --collector.filesystem.ignored-mount-points="^/(sys|proc|dev|host|etc)($$|/)" --collector.textfile.directory="/etc/node-exporter/" --collector.conntrack --collector.diskstats --collector.entropy --collector.filefd --collector.filesystem --collector.loadavg --collector.mdadm --collector.meminfo --collector.netdev --collector.netstat --collector.stat --collector.textfile --collector.time --collector.vmstat --collector.ipvs' + +networks: + monitor: + external: true