Use C locale when running sadf (#2690)

fixes #1911
This commit is contained in:
Daniel Nelson 2017-04-21 10:55:54 -07:00 committed by GitHub
parent 1d4843bc8e
commit 8a1b070e2f
3 changed files with 30 additions and 0 deletions

View File

@ -110,6 +110,7 @@ be deprecated eventually.
- [#2671](https://github.com/influxdata/telegraf/issues/2671): The internal input plugin uses the wrong units for `heap_objects` - [#2671](https://github.com/influxdata/telegraf/issues/2671): The internal input plugin uses the wrong units for `heap_objects`
- [#2684](https://github.com/influxdata/telegraf/pull/2684): Fix ipmi_sensor config is shared between all plugin instances - [#2684](https://github.com/influxdata/telegraf/pull/2684): Fix ipmi_sensor config is shared between all plugin instances
- [#2450](https://github.com/influxdata/telegraf/issues/2450): Network statistics not collected when system has alias interfaces - [#2450](https://github.com/influxdata/telegraf/issues/2450): Network statistics not collected when system has alias interfaces
- [#1911](https://github.com/influxdata/telegraf/issues/1911): Sysstat plugin needs LANG=C or similar locale
## v1.2.1 [2017-02-01] ## v1.2.1 [2017-02-01]

View File

@ -210,11 +210,37 @@ func (s *Sysstat) collect() error {
return nil return nil
} }
func filterEnviron(env []string, prefix string) []string {
newenv := env[:0]
for _, envvar := range env {
if !strings.HasPrefix(envvar, prefix) {
newenv = append(newenv, envvar)
}
}
return newenv
}
// Return the Cmd with its environment configured to use the C locale
func withCLocale(cmd *exec.Cmd) *exec.Cmd {
var env []string
if cmd.Env != nil {
env = cmd.Env
} else {
env = os.Environ()
}
env = filterEnviron(env, "LANG")
env = filterEnviron(env, "LC_")
env = append(env, "LANG=C")
cmd.Env = env
return cmd
}
// parse runs Sadf on the previously saved tmpFile: // parse runs Sadf on the previously saved tmpFile:
// Sadf -p -- -p <option> tmpFile // Sadf -p -- -p <option> tmpFile
// and parses the output to add it to the telegraf.Accumulator acc. // and parses the output to add it to the telegraf.Accumulator acc.
func (s *Sysstat) parse(acc telegraf.Accumulator, option string, ts time.Time) error { func (s *Sysstat) parse(acc telegraf.Accumulator, option string, ts time.Time) error {
cmd := execCommand(s.Sadf, s.sadfOptions(option)...) cmd := execCommand(s.Sadf, s.sadfOptions(option)...)
cmd = withCLocale(cmd)
stdout, err := cmd.StdoutPipe() stdout, err := cmd.StdoutPipe()
if err != nil { if err != nil {
return err return err

View File

@ -15,6 +15,9 @@ import (
// run with -race option, because in that scenario interval between the two // run with -race option, because in that scenario interval between the two
// Gather calls is greater than wantedInterval. // Gather calls is greater than wantedInterval.
func TestInterval(t *testing.T) { func TestInterval(t *testing.T) {
if testing.Short() {
t.Skip("Skipping test with sleep in short mode.")
}
// overwriting exec commands with mock commands // overwriting exec commands with mock commands
execCommand = fakeExecCommand execCommand = fakeExecCommand
defer func() { execCommand = exec.Command }() defer func() { execCommand = exec.Command }()