2018-07-11 23:43:49 +00:00
|
|
|
// +build !windows
|
|
|
|
|
|
|
|
package processes
|
2016-03-06 06:04:54 +00:00
|
|
|
|
|
|
|
import (
|
2016-03-08 10:42:31 +00:00
|
|
|
"fmt"
|
|
|
|
"runtime"
|
2016-03-06 06:04:54 +00:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/influxdata/telegraf/testutil"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestProcesses(t *testing.T) {
|
2016-03-08 10:42:31 +00:00
|
|
|
processes := &Processes{
|
|
|
|
execPS: execPS,
|
|
|
|
readProcFile: readProcFile,
|
|
|
|
}
|
2016-03-06 06:04:54 +00:00
|
|
|
var acc testutil.Accumulator
|
|
|
|
|
|
|
|
err := processes.Gather(&acc)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
2017-05-16 22:25:30 +00:00
|
|
|
assert.True(t, acc.HasInt64Field("processes", "running"))
|
|
|
|
assert.True(t, acc.HasInt64Field("processes", "sleeping"))
|
|
|
|
assert.True(t, acc.HasInt64Field("processes", "stopped"))
|
|
|
|
assert.True(t, acc.HasInt64Field("processes", "total"))
|
2016-03-08 10:42:31 +00:00
|
|
|
total, ok := acc.Get("processes")
|
|
|
|
require.True(t, ok)
|
|
|
|
assert.True(t, total.Fields["total"].(int64) > 0)
|
2016-03-06 06:04:54 +00:00
|
|
|
}
|
2016-03-08 10:42:31 +00:00
|
|
|
|
|
|
|
func TestFromPS(t *testing.T) {
|
|
|
|
processes := &Processes{
|
|
|
|
execPS: testExecPS,
|
|
|
|
forcePS: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
var acc testutil.Accumulator
|
|
|
|
err := processes.Gather(&acc)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
fields := getEmptyFields()
|
2016-03-09 21:55:26 +00:00
|
|
|
fields["blocked"] = int64(4)
|
|
|
|
fields["zombies"] = int64(1)
|
2016-03-08 10:42:31 +00:00
|
|
|
fields["running"] = int64(4)
|
|
|
|
fields["sleeping"] = int64(34)
|
2017-12-11 23:33:44 +00:00
|
|
|
fields["idle"] = int64(2)
|
|
|
|
fields["total"] = int64(45)
|
2016-03-08 10:42:31 +00:00
|
|
|
|
|
|
|
acc.AssertContainsTaggedFields(t, "processes", fields, map[string]string{})
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestFromPSError(t *testing.T) {
|
|
|
|
processes := &Processes{
|
|
|
|
execPS: testExecPSError,
|
|
|
|
forcePS: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
var acc testutil.Accumulator
|
|
|
|
err := processes.Gather(&acc)
|
|
|
|
require.Error(t, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestFromProcFiles(t *testing.T) {
|
|
|
|
if runtime.GOOS != "linux" {
|
|
|
|
t.Skip("This test only runs on linux")
|
|
|
|
}
|
|
|
|
tester := tester{}
|
|
|
|
processes := &Processes{
|
|
|
|
readProcFile: tester.testProcFile,
|
|
|
|
forceProc: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
var acc testutil.Accumulator
|
|
|
|
err := processes.Gather(&acc)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
fields := getEmptyFields()
|
|
|
|
fields["sleeping"] = tester.calls
|
|
|
|
fields["total_threads"] = tester.calls * 2
|
|
|
|
fields["total"] = tester.calls
|
|
|
|
|
|
|
|
acc.AssertContainsTaggedFields(t, "processes", fields, map[string]string{})
|
|
|
|
}
|
|
|
|
|
2016-04-05 16:21:57 +00:00
|
|
|
func TestFromProcFilesWithSpaceInCmd(t *testing.T) {
|
|
|
|
if runtime.GOOS != "linux" {
|
|
|
|
t.Skip("This test only runs on linux")
|
|
|
|
}
|
|
|
|
tester := tester{}
|
|
|
|
processes := &Processes{
|
|
|
|
readProcFile: tester.testProcFile2,
|
|
|
|
forceProc: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
var acc testutil.Accumulator
|
|
|
|
err := processes.Gather(&acc)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
fields := getEmptyFields()
|
|
|
|
fields["sleeping"] = tester.calls
|
|
|
|
fields["total_threads"] = tester.calls * 2
|
|
|
|
fields["total"] = tester.calls
|
|
|
|
|
|
|
|
acc.AssertContainsTaggedFields(t, "processes", fields, map[string]string{})
|
|
|
|
}
|
|
|
|
|
2016-03-08 10:42:31 +00:00
|
|
|
func testExecPS() ([]byte, error) {
|
|
|
|
return []byte(testPSOut), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// struct for counting calls to testProcFile
|
|
|
|
type tester struct {
|
|
|
|
calls int64
|
|
|
|
}
|
|
|
|
|
|
|
|
func (t *tester) testProcFile(_ string) ([]byte, error) {
|
|
|
|
t.calls++
|
|
|
|
return []byte(fmt.Sprintf(testProcStat, "S", "2")), nil
|
|
|
|
}
|
|
|
|
|
2016-04-05 16:21:57 +00:00
|
|
|
func (t *tester) testProcFile2(_ string) ([]byte, error) {
|
|
|
|
t.calls++
|
|
|
|
return []byte(fmt.Sprintf(testProcStat2, "S", "2")), nil
|
|
|
|
}
|
|
|
|
|
2016-03-08 10:42:31 +00:00
|
|
|
func testExecPSError() ([]byte, error) {
|
|
|
|
return []byte(testPSOut), fmt.Errorf("ERROR!")
|
|
|
|
}
|
|
|
|
|
|
|
|
const testPSOut = `
|
|
|
|
STAT
|
|
|
|
S
|
|
|
|
S
|
|
|
|
S
|
|
|
|
S
|
|
|
|
R
|
|
|
|
R
|
|
|
|
S
|
|
|
|
S
|
|
|
|
Ss
|
|
|
|
Ss
|
|
|
|
S
|
|
|
|
SNs
|
|
|
|
Ss
|
|
|
|
Ss
|
|
|
|
S
|
|
|
|
R+
|
|
|
|
S
|
|
|
|
U
|
|
|
|
S
|
|
|
|
S
|
|
|
|
S
|
|
|
|
S
|
|
|
|
Ss
|
|
|
|
S+
|
|
|
|
Ss
|
|
|
|
S
|
|
|
|
S+
|
|
|
|
S+
|
|
|
|
Ss
|
|
|
|
S+
|
|
|
|
Ss
|
|
|
|
S
|
|
|
|
R+
|
|
|
|
Ss
|
|
|
|
S
|
|
|
|
S+
|
|
|
|
S+
|
|
|
|
Ss
|
2016-03-09 21:55:26 +00:00
|
|
|
L
|
|
|
|
U
|
|
|
|
Z
|
|
|
|
D
|
2016-03-08 10:42:31 +00:00
|
|
|
S+
|
2017-12-11 23:33:44 +00:00
|
|
|
I
|
|
|
|
I
|
2016-03-08 10:42:31 +00:00
|
|
|
`
|
|
|
|
|
|
|
|
const testProcStat = `10 (rcuob/0) %s 2 0 0 0 -1 2129984 0 0 0 0 0 0 0 0 20 0 %s 0 11 0 0 18446744073709551615 0 0 0 0 0 0 0 2147483647 0 18446744073709551615 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
|
|
|
`
|
2016-04-05 16:21:57 +00:00
|
|
|
|
|
|
|
const testProcStat2 = `10 (rcuob 0) %s 2 0 0 0 -1 2129984 0 0 0 0 0 0 0 0 20 0 %s 0 11 0 0 18446744073709551615 0 0 0 0 0 0 0 2147483647 0 18446744073709551615 0 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
|
|
|
`
|