From 20e33c0a2109e3a248f01a7ae83584c2d87f5444 Mon Sep 17 00:00:00 2001 From: Nick Ethier Date: Wed, 14 Nov 2018 11:13:52 -0500 Subject: [PATCH 1/5] nomad: add flag to disable publishing of job_summary metrics for dispatched jobs --- command/agent/agent.go | 1 + command/agent/command.go | 9 +++ command/agent/config.go | 35 +++++++++ command/agent/config_parse.go | 2 + command/agent/config_test.go | 44 +++++++++++ nomad/config.go | 4 + nomad/leader.go | 73 ++++++++++--------- nomad/state/state_store.go | 8 +- nomad/structs/structs.go | 17 +++-- .../agent/configuration/telemetry.html.md | 19 +++++ 10 files changed, 169 insertions(+), 43 deletions(-) diff --git a/command/agent/agent.go b/command/agent/agent.go index b9bd554b9dc..22e4f26a2da 100644 --- a/command/agent/agent.go +++ b/command/agent/agent.go @@ -298,6 +298,7 @@ func convertServerConfig(agentConfig *Config, logOutput io.Writer) (*nomad.Confi // Setup telemetry related config conf.StatsCollectionInterval = agentConfig.Telemetry.collectionInterval conf.DisableTaggedMetrics = agentConfig.Telemetry.DisableTaggedMetrics + conf.DisableDispatchedJobSummaryMetrics = agentConfig.Telemetry.DisableDispatchedJobSummaryMetrics conf.BackwardsCompatibleMetrics = agentConfig.Telemetry.BackwardsCompatibleMetrics return conf, nil diff --git a/command/agent/command.go b/command/agent/command.go index 15bbb10704b..8a19b096d83 100644 --- a/command/agent/command.go +++ b/command/agent/command.go @@ -812,6 +812,14 @@ func (c *Command) setupTelemetry(config *Config) (*metrics.InmemSink, error) { metricsConf.EnableHostname = true } + allowedPrefixes, blockedPrefixes, err := telConfig.PrefixFilters() + if err != nil { + return inm, err + } + + metricsConf.AllowedPrefixes = allowedPrefixes + metricsConf.BlockedPrefixes = blockedPrefixes + // Configure the statsite sink var fanout metrics.FanoutSink if telConfig.StatsiteAddr != "" { @@ -895,6 +903,7 @@ func (c *Command) setupTelemetry(config *Config) (*metrics.InmemSink, error) { metricsConf.EnableHostname = false metrics.NewGlobal(metricsConf, inm) } + return inm, nil } diff --git a/command/agent/config.go b/command/agent/config.go index 8bf1e7aa1f2..67b286d0f28 100644 --- a/command/agent/config.go +++ b/command/agent/config.go @@ -434,6 +434,15 @@ type Telemetry struct { // key/value structure as done in older versions of Nomad BackwardsCompatibleMetrics bool `mapstructure:"backwards_compatible_metrics"` + // PrefixFilter allows for filtering out metrics from being collected + PrefixFilter []string `mapstructure:"prefix_filter"` + + // DisableDispatchedJobSummaryMetrics allows for ignore dispatched jobs when + // publishing Job summary metrics. This is useful in environment that produce + // high numbers of single count dispatch jobs as the metrics for each take up + // a small memory overhead. + DisableDispatchedJobSummaryMetrics bool `mapstructure:"disable_dispatched_job_summary_metrics"` + // Circonus: see https://github.com/circonus-labs/circonus-gometrics // for more details on the various configuration options. // Valid configuration combinations: @@ -506,6 +515,24 @@ type Telemetry struct { CirconusBrokerSelectTag string `mapstructure:"circonus_broker_select_tag"` } +// PrefixFilters parses the PrefixFilter field and returns a list of allowed and blocked filters +func (t *Telemetry) PrefixFilters() (allowed, blocked []string, err error) { + for _, rule := range t.PrefixFilter { + if rule == "" { + continue + } + switch rule[0] { + case '+': + allowed = append(allowed, rule[1:]) + case '-': + blocked = append(blocked, rule[1:]) + default: + return nil, nil, fmt.Errorf("Filter rule must begin with either '+' or '-': %q", rule) + } + } + return allowed, blocked, nil +} + // Ports encapsulates the various ports we bind to for network services. If any // are not specified then the defaults are used instead. type Ports struct { @@ -1323,6 +1350,14 @@ func (a *Telemetry) Merge(b *Telemetry) *Telemetry { result.BackwardsCompatibleMetrics = b.BackwardsCompatibleMetrics } + if b.PrefixFilter != nil { + result.PrefixFilter = b.PrefixFilter + } + + if b.DisableDispatchedJobSummaryMetrics { + result.DisableDispatchedJobSummaryMetrics = b.DisableDispatchedJobSummaryMetrics + } + return &result } diff --git a/command/agent/config_parse.go b/command/agent/config_parse.go index 66f704f6ca0..6727163996f 100644 --- a/command/agent/config_parse.go +++ b/command/agent/config_parse.go @@ -724,6 +724,8 @@ func parseTelemetry(result **Telemetry, list *ast.ObjectList) error { "circonus_broker_select_tag", "disable_tagged_metrics", "backwards_compatible_metrics", + "prefix_filter", + "disable_dispatched_job_summary_metrics", } if err := helper.CheckHCLKeys(listVal, valid); err != nil { return err diff --git a/command/agent/config_test.go b/command/agent/config_test.go index 9df011ba851..cb90c024fd2 100644 --- a/command/agent/config_test.go +++ b/command/agent/config_test.go @@ -76,6 +76,7 @@ func TestConfig_Merge(t *testing.T) { CirconusCheckTags: "cat1:tag1,cat2:tag2", CirconusBrokerID: "0", CirconusBrokerSelectTag: "dc:dc1", + PrefixFilter: []string{"filter1", "filter2"}, }, Client: &ClientConfig{ Enabled: false, @@ -215,6 +216,7 @@ func TestConfig_Merge(t *testing.T) { CirconusCheckTags: "cat1:tag1,cat2:tag2", CirconusBrokerID: "1", CirconusBrokerSelectTag: "dc:dc2", + PrefixFilter: []string{"prefix1", "prefix2"}, }, Client: &ClientConfig{ Enabled: true, @@ -1013,3 +1015,45 @@ func TestMergeServerJoin(t *testing.T) { require.Equal(result.RetryInterval, retryInterval) } } + +func TestTelemetry_PrefixFilters(t *testing.T) { + t.Parallel() + cases := []struct { + in []string + expAllow []string + expBlock []string + expErr bool + }{ + { + in: []string{"+foo"}, + expAllow: []string{"foo"}, + }, + { + in: []string{"-foo"}, + expBlock: []string{"foo"}, + }, + { + in: []string{"+a.b.c", "-x.y.z"}, + expAllow: []string{"a.b.c"}, + expBlock: []string{"x.y.z"}, + }, + { + in: []string{"+foo", "bad", "-bar"}, + expErr: true, + }, + } + + for i, c := range cases { + t.Run(fmt.Sprintf("PrefixCase%d", i), func(t *testing.T) { + require := require.New(t) + tel := &Telemetry{ + PrefixFilter: c.in, + } + + allow, block, err := tel.PrefixFilters() + require.Exactly(c.expAllow, allow) + require.Exactly(c.expBlock, block) + require.Equal(c.expErr, err != nil) + }) + } +} diff --git a/nomad/config.go b/nomad/config.go index e7aa945a28c..b0c2a952ffd 100644 --- a/nomad/config.go +++ b/nomad/config.go @@ -274,6 +274,10 @@ type Config struct { // key/value/tag format, or simply a key/value format DisableTaggedMetrics bool + // DisableDispatchedJobSummaryMetrics allows for ignore dispatched jobs when + // publishing Job summary metrics + DisableDispatchedJobSummaryMetrics bool + // BackwardsCompatibleMetrics determines whether to show methods of // displaying metrics for older versions, or to only show the new format BackwardsCompatibleMetrics bool diff --git a/nomad/leader.go b/nomad/leader.go index 119e72ebfdd..e1d72999819 100644 --- a/nomad/leader.go +++ b/nomad/leader.go @@ -613,45 +613,52 @@ func (s *Server) publishJobSummaryMetrics(stopCh chan struct{}) { break } summary := raw.(*structs.JobSummary) - for name, tgSummary := range summary.Summary { - if !s.config.DisableTaggedMetrics { - labels := []metrics.Label{ - { - Name: "job", - Value: summary.JobID, - }, - { - Name: "task_group", - Value: name, - }, - } - metrics.SetGaugeWithLabels([]string{"nomad", "job_summary", "queued"}, - float32(tgSummary.Queued), labels) - metrics.SetGaugeWithLabels([]string{"nomad", "job_summary", "complete"}, - float32(tgSummary.Complete), labels) - metrics.SetGaugeWithLabels([]string{"nomad", "job_summary", "failed"}, - float32(tgSummary.Failed), labels) - metrics.SetGaugeWithLabels([]string{"nomad", "job_summary", "running"}, - float32(tgSummary.Running), labels) - metrics.SetGaugeWithLabels([]string{"nomad", "job_summary", "starting"}, - float32(tgSummary.Starting), labels) - metrics.SetGaugeWithLabels([]string{"nomad", "job_summary", "lost"}, - float32(tgSummary.Lost), labels) - } - if s.config.BackwardsCompatibleMetrics { - metrics.SetGauge([]string{"nomad", "job_summary", summary.JobID, name, "queued"}, float32(tgSummary.Queued)) - metrics.SetGauge([]string{"nomad", "job_summary", summary.JobID, name, "complete"}, float32(tgSummary.Complete)) - metrics.SetGauge([]string{"nomad", "job_summary", summary.JobID, name, "failed"}, float32(tgSummary.Failed)) - metrics.SetGauge([]string{"nomad", "job_summary", summary.JobID, name, "running"}, float32(tgSummary.Running)) - metrics.SetGauge([]string{"nomad", "job_summary", summary.JobID, name, "starting"}, float32(tgSummary.Starting)) - metrics.SetGauge([]string{"nomad", "job_summary", summary.JobID, name, "lost"}, float32(tgSummary.Lost)) - } + if s.config.DisableDispatchedJobSummaryMetrics && summary.Dispatched { + continue } + s.iterateJobSummaryMetrics(summary) } } } } +func (s *Server) iterateJobSummaryMetrics(summary *structs.JobSummary) { + for name, tgSummary := range summary.Summary { + if !s.config.DisableTaggedMetrics { + labels := []metrics.Label{ + { + Name: "job", + Value: summary.JobID, + }, + { + Name: "task_group", + Value: name, + }, + } + metrics.SetGaugeWithLabels([]string{"nomad", "job_summary", "queued"}, + float32(tgSummary.Queued), labels) + metrics.SetGaugeWithLabels([]string{"nomad", "job_summary", "complete"}, + float32(tgSummary.Complete), labels) + metrics.SetGaugeWithLabels([]string{"nomad", "job_summary", "failed"}, + float32(tgSummary.Failed), labels) + metrics.SetGaugeWithLabels([]string{"nomad", "job_summary", "running"}, + float32(tgSummary.Running), labels) + metrics.SetGaugeWithLabels([]string{"nomad", "job_summary", "starting"}, + float32(tgSummary.Starting), labels) + metrics.SetGaugeWithLabels([]string{"nomad", "job_summary", "lost"}, + float32(tgSummary.Lost), labels) + } + if s.config.BackwardsCompatibleMetrics { + metrics.SetGauge([]string{"nomad", "job_summary", summary.JobID, name, "queued"}, float32(tgSummary.Queued)) + metrics.SetGauge([]string{"nomad", "job_summary", summary.JobID, name, "complete"}, float32(tgSummary.Complete)) + metrics.SetGauge([]string{"nomad", "job_summary", summary.JobID, name, "failed"}, float32(tgSummary.Failed)) + metrics.SetGauge([]string{"nomad", "job_summary", summary.JobID, name, "running"}, float32(tgSummary.Running)) + metrics.SetGauge([]string{"nomad", "job_summary", summary.JobID, name, "starting"}, float32(tgSummary.Starting)) + metrics.SetGauge([]string{"nomad", "job_summary", summary.JobID, name, "lost"}, float32(tgSummary.Lost)) + } + } +} + // revokeLeadership is invoked once we step down as leader. // This is used to cleanup any state that may be specific to a leader. func (s *Server) revokeLeadership() error { diff --git a/nomad/state/state_store.go b/nomad/state/state_store.go index 5812bf406ef..181726e8b0f 100644 --- a/nomad/state/state_store.go +++ b/nomad/state/state_store.go @@ -3022,9 +3022,10 @@ func (s *StateStore) ReconcileJobSummaries(index uint64) error { // Create a job summary for the job summary := &structs.JobSummary{ - JobID: job.ID, - Namespace: job.Namespace, - Summary: make(map[string]structs.TaskGroupSummary), + JobID: job.ID, + Namespace: job.Namespace, + Summary: make(map[string]structs.TaskGroupSummary), + Dispatched: job.Dispatched, } for _, tg := range job.TaskGroups { summary.Summary[tg.Name] = structs.TaskGroupSummary{} @@ -3321,6 +3322,7 @@ func (s *StateStore) updateSummaryWithJob(index uint64, job *structs.Job, Summary: make(map[string]structs.TaskGroupSummary), Children: new(structs.JobChildrenSummary), CreateIndex: index, + Dispatched: job.Dispatched, } hasSummaryChanged = true } diff --git a/nomad/structs/structs.go b/nomad/structs/structs.go index 6e67b4e384e..3444b94f29c 100644 --- a/nomad/structs/structs.go +++ b/nomad/structs/structs.go @@ -1574,13 +1574,13 @@ func (n *Node) Stub() *NodeListStub { addr, _, _ := net.SplitHostPort(n.HTTPAddr) return &NodeListStub{ - Address: addr, - ID: n.ID, - Datacenter: n.Datacenter, - Name: n.Name, - NodeClass: n.NodeClass, - Version: n.Attributes["nomad.version"], - Drain: n.Drain, + Address: addr, + ID: n.ID, + Datacenter: n.Datacenter, + Name: n.Name, + NodeClass: n.NodeClass, + Version: n.Attributes["nomad.version"], + Drain: n.Drain, SchedulingEligibility: n.SchedulingEligibility, Status: n.Status, StatusDescription: n.StatusDescription, @@ -2482,6 +2482,9 @@ type JobSummary struct { // Children contains a summary for the children of this job. Children *JobChildrenSummary + // Dispatched is true if this job is dispatched from a parameterized job + Dispatched bool + // Raft Indexes CreateIndex uint64 ModifyIndex uint64 diff --git a/website/source/docs/agent/configuration/telemetry.html.md b/website/source/docs/agent/configuration/telemetry.html.md index bf5b486e3a2..79e2d8ce78a 100644 --- a/website/source/docs/agent/configuration/telemetry.html.md +++ b/website/source/docs/agent/configuration/telemetry.html.md @@ -70,7 +70,26 @@ The following options are available on all telemetry configurations. 0.7. Note that this option is used to transition monitoring to tagged metrics and will eventually be deprecated. +- `prefix_filter` `(list: [])` - This is a list of filter rules to apply for + allowing/blocking metrics by prefix. A leading "+" will enable any + metrics with the given prefix, and a leading "-" will block them. If + there is overlap between two rules, the more specific rule will take + precedence. Blocking will take priority if the same prefix is listed multiple + times. + +```javascript + [ + "-nomad.raft", + "+nomad.raft.apply", + "-nomad.memberlist", + ] +``` +- `disable_dispatched_job_summary_metrics` `(bool: false)` - Specifies if Nomad + should ignore jobs dispatched from a parameterized job when publishing job + summary statistics. Since each job has a small memory overhead for tracking + summary statistics, it is sometimes desired to trade these statistics for + more memory when dispatching high volumes of jobs. ### `statsite` From 10db31c896d0ebc292d7b73420512822325cab69 Mon Sep 17 00:00:00 2001 From: Nick Ethier Date: Wed, 14 Nov 2018 15:02:49 -0500 Subject: [PATCH 2/5] agent: suppose filter_default telemetry option --- command/agent/command.go | 4 ++++ command/agent/config.go | 8 ++++++++ command/agent/config_parse.go | 1 + website/source/docs/agent/configuration/telemetry.html.md | 6 +++++- 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/command/agent/command.go b/command/agent/command.go index 8a19b096d83..e9115599e3a 100644 --- a/command/agent/command.go +++ b/command/agent/command.go @@ -820,6 +820,10 @@ func (c *Command) setupTelemetry(config *Config) (*metrics.InmemSink, error) { metricsConf.AllowedPrefixes = allowedPrefixes metricsConf.BlockedPrefixes = blockedPrefixes + if telConfig.FilterDefault != nil { + metricsConf.FilterDefault = *telConfig.FilterDefault + } + // Configure the statsite sink var fanout metrics.FanoutSink if telConfig.StatsiteAddr != "" { diff --git a/command/agent/config.go b/command/agent/config.go index 67b286d0f28..417048eb9b8 100644 --- a/command/agent/config.go +++ b/command/agent/config.go @@ -437,6 +437,10 @@ type Telemetry struct { // PrefixFilter allows for filtering out metrics from being collected PrefixFilter []string `mapstructure:"prefix_filter"` + // FilterDefault controls whether to allow metrics that have not been specified + // by the filter + FilterDefault *bool `mapstructure:"filter_default"` + // DisableDispatchedJobSummaryMetrics allows for ignore dispatched jobs when // publishing Job summary metrics. This is useful in environment that produce // high numbers of single count dispatch jobs as the metrics for each take up @@ -1354,6 +1358,10 @@ func (a *Telemetry) Merge(b *Telemetry) *Telemetry { result.PrefixFilter = b.PrefixFilter } + if b.FilterDefault != nil { + result.FilterDefault = b.FilterDefault + } + if b.DisableDispatchedJobSummaryMetrics { result.DisableDispatchedJobSummaryMetrics = b.DisableDispatchedJobSummaryMetrics } diff --git a/command/agent/config_parse.go b/command/agent/config_parse.go index 6727163996f..e965ea5e6db 100644 --- a/command/agent/config_parse.go +++ b/command/agent/config_parse.go @@ -725,6 +725,7 @@ func parseTelemetry(result **Telemetry, list *ast.ObjectList) error { "disable_tagged_metrics", "backwards_compatible_metrics", "prefix_filter", + "filter_default", "disable_dispatched_job_summary_metrics", } if err := helper.CheckHCLKeys(listVal, valid); err != nil { diff --git a/website/source/docs/agent/configuration/telemetry.html.md b/website/source/docs/agent/configuration/telemetry.html.md index 79e2d8ce78a..552a309fd08 100644 --- a/website/source/docs/agent/configuration/telemetry.html.md +++ b/website/source/docs/agent/configuration/telemetry.html.md @@ -64,12 +64,16 @@ The following options are available on all telemetry configurations. only be added to tagged metrics. Note that this option is used to transition monitoring to tagged metrics and will eventually be deprecated. - - `disable_tagged_metrics` `(bool: false)` - Specifies if Nomad should not emit tagged metrics and only emit metrics compatible with versions below Nomad 0.7. Note that this option is used to transition monitoring to tagged metrics and will eventually be deprecated. +- `filter_default` `(bool: true)` - This controls whether to allow metrics that + have not been specified by the filter. Defaults to true, which will allow all + metrics when no filters are provided. When set to false with no filters, no + metrics will be sent. + - `prefix_filter` `(list: [])` - This is a list of filter rules to apply for allowing/blocking metrics by prefix. A leading "+" will enable any metrics with the given prefix, and a leading "-" will block them. If From 696b04a06d4cc68bc436037886800487edfd4f7b Mon Sep 17 00:00:00 2001 From: Nick Ethier Date: Wed, 14 Nov 2018 15:42:35 -0500 Subject: [PATCH 3/5] nomad: lookup job instead of adding Dispatched to summary --- nomad/leader.go | 6 +++++- nomad/state/state_store.go | 8 +++----- nomad/structs/structs.go | 3 --- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/nomad/leader.go b/nomad/leader.go index e1d72999819..f19d72721ee 100644 --- a/nomad/leader.go +++ b/nomad/leader.go @@ -613,7 +613,11 @@ func (s *Server) publishJobSummaryMetrics(stopCh chan struct{}) { break } summary := raw.(*structs.JobSummary) - if s.config.DisableDispatchedJobSummaryMetrics && summary.Dispatched { + job, err := state.JobByID(ws, summary.Namespace, summary.JobID) + if err != nil { + s.logger.Printf("[ERR] nomad: failed to lookup job for summary: %v", err) + } + if s.config.DisableDispatchedJobSummaryMetrics && job.Dispatched { continue } s.iterateJobSummaryMetrics(summary) diff --git a/nomad/state/state_store.go b/nomad/state/state_store.go index 181726e8b0f..5812bf406ef 100644 --- a/nomad/state/state_store.go +++ b/nomad/state/state_store.go @@ -3022,10 +3022,9 @@ func (s *StateStore) ReconcileJobSummaries(index uint64) error { // Create a job summary for the job summary := &structs.JobSummary{ - JobID: job.ID, - Namespace: job.Namespace, - Summary: make(map[string]structs.TaskGroupSummary), - Dispatched: job.Dispatched, + JobID: job.ID, + Namespace: job.Namespace, + Summary: make(map[string]structs.TaskGroupSummary), } for _, tg := range job.TaskGroups { summary.Summary[tg.Name] = structs.TaskGroupSummary{} @@ -3322,7 +3321,6 @@ func (s *StateStore) updateSummaryWithJob(index uint64, job *structs.Job, Summary: make(map[string]structs.TaskGroupSummary), Children: new(structs.JobChildrenSummary), CreateIndex: index, - Dispatched: job.Dispatched, } hasSummaryChanged = true } diff --git a/nomad/structs/structs.go b/nomad/structs/structs.go index 3444b94f29c..f22aca17af8 100644 --- a/nomad/structs/structs.go +++ b/nomad/structs/structs.go @@ -2482,9 +2482,6 @@ type JobSummary struct { // Children contains a summary for the children of this job. Children *JobChildrenSummary - // Dispatched is true if this job is dispatched from a parameterized job - Dispatched bool - // Raft Indexes CreateIndex uint64 ModifyIndex uint64 From 5f7f56b8ec3d647b05e4b908ff30cec827adcaf4 Mon Sep 17 00:00:00 2001 From: Nick Ethier Date: Wed, 14 Nov 2018 16:04:03 -0500 Subject: [PATCH 4/5] nomad: only lookup job is disable_dispatched_job_summary_metrics is set --- nomad/leader.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/nomad/leader.go b/nomad/leader.go index f19d72721ee..f3ef875948e 100644 --- a/nomad/leader.go +++ b/nomad/leader.go @@ -613,12 +613,15 @@ func (s *Server) publishJobSummaryMetrics(stopCh chan struct{}) { break } summary := raw.(*structs.JobSummary) - job, err := state.JobByID(ws, summary.Namespace, summary.JobID) - if err != nil { - s.logger.Printf("[ERR] nomad: failed to lookup job for summary: %v", err) - } - if s.config.DisableDispatchedJobSummaryMetrics && job.Dispatched { - continue + if s.config.DisableDispatchedJobSummaryMetrics { + job, err := state.JobByID(ws, summary.Namespace, summary.JobID) + if err != nil { + s.logger.Printf("[ERR] nomad: failed to lookup job for summary: %v", err) + continue + } + if job.Dispatched { + continue + } } s.iterateJobSummaryMetrics(summary) } From b99d089811869837eb4ccf313a5acad7b14630a4 Mon Sep 17 00:00:00 2001 From: Nick Ethier Date: Wed, 14 Nov 2018 16:04:33 -0500 Subject: [PATCH 5/5] command/agent: additional tests for telemetry config parsing --- command/agent/config_test.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/command/agent/config_test.go b/command/agent/config_test.go index cb90c024fd2..f24a48b6dee 100644 --- a/command/agent/config_test.go +++ b/command/agent/config_test.go @@ -217,6 +217,8 @@ func TestConfig_Merge(t *testing.T) { CirconusBrokerID: "1", CirconusBrokerSelectTag: "dc:dc2", PrefixFilter: []string{"prefix1", "prefix2"}, + DisableDispatchedJobSummaryMetrics: true, + FilterDefault: helper.BoolToPtr(false), }, Client: &ClientConfig{ Enabled: true, @@ -1057,3 +1059,26 @@ func TestTelemetry_PrefixFilters(t *testing.T) { }) } } + +func TestTelemetry_Parse(t *testing.T) { + require := require.New(t) + dir, err := ioutil.TempDir("", "nomad") + require.NoError(err) + defer os.RemoveAll(dir) + + file1 := filepath.Join(dir, "config1.hcl") + err = ioutil.WriteFile(file1, []byte(`telemetry{ + prefix_filter = ["+nomad.raft"] + filter_default = false + disable_dispatched_job_summary_metrics = true + }`), 0600) + require.NoError(err) + + // Works on config dir + config, err := LoadConfig(dir) + require.NoError(err) + + require.False(*config.Telemetry.FilterDefault) + require.Exactly([]string{"+nomad.raft"}, config.Telemetry.PrefixFilter) + require.True(config.Telemetry.DisableDispatchedJobSummaryMetrics) +}