2017-08-23 22:14:32 +00:00
|
|
|
// +build linux
|
|
|
|
|
2017-04-07 22:39:43 +00:00
|
|
|
package dmcache
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/influxdata/telegraf/testutil"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
measurement = "dmcache"
|
|
|
|
badFormatOutput = []string{"cs-1: 0 4883791872 cache 8 1018/1501122 512 7/464962 139 352643 "}
|
|
|
|
good2DevicesFormatOutput = []string{
|
|
|
|
"cs-1: 0 4883791872 cache 8 1018/1501122 512 7/464962 139 352643 15 46 0 7 0 1 writeback 2 migration_threshold 2048 mq 10 random_threshold 4 sequential_threshold 512 discard_promote_adjustment 1 read_promote_adjustment 4 write_promote_adjustment 8",
|
|
|
|
"cs-2: 0 4294967296 cache 8 72352/1310720 128 26/24327168 2409 286 265 524682 0 0 0 1 writethrough 2 migration_threshold 2048 mq 10 random_threshold 4 sequential_threshold 512 discard_promote_adjustment 1 read_promote_adjustment 4 write_promote_adjustment 8",
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestPerDeviceGoodOutput(t *testing.T) {
|
|
|
|
var acc testutil.Accumulator
|
|
|
|
var plugin = &DMCache{
|
|
|
|
PerDevice: true,
|
|
|
|
getCurrentStatus: func() ([]string, error) {
|
|
|
|
return good2DevicesFormatOutput, nil
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
err := plugin.Gather(&acc)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
tags1 := map[string]string{
|
|
|
|
"device": "cs-1",
|
|
|
|
}
|
|
|
|
fields1 := map[string]interface{}{
|
|
|
|
"length": 4883791872,
|
|
|
|
"metadata_blocksize": 8,
|
|
|
|
"metadata_used": 1018,
|
|
|
|
"metadata_total": 1501122,
|
|
|
|
"cache_blocksize": 512,
|
|
|
|
"cache_used": 7,
|
|
|
|
"cache_total": 464962,
|
|
|
|
"read_hits": 139,
|
|
|
|
"read_misses": 352643,
|
|
|
|
"write_hits": 15,
|
|
|
|
"write_misses": 46,
|
|
|
|
"demotions": 0,
|
|
|
|
"promotions": 7,
|
|
|
|
"dirty": 0,
|
|
|
|
}
|
|
|
|
acc.AssertContainsTaggedFields(t, measurement, fields1, tags1)
|
|
|
|
|
|
|
|
tags2 := map[string]string{
|
|
|
|
"device": "cs-2",
|
|
|
|
}
|
|
|
|
fields2 := map[string]interface{}{
|
|
|
|
"length": 4294967296,
|
|
|
|
"metadata_blocksize": 8,
|
|
|
|
"metadata_used": 72352,
|
|
|
|
"metadata_total": 1310720,
|
|
|
|
"cache_blocksize": 128,
|
|
|
|
"cache_used": 26,
|
|
|
|
"cache_total": 24327168,
|
|
|
|
"read_hits": 2409,
|
|
|
|
"read_misses": 286,
|
|
|
|
"write_hits": 265,
|
|
|
|
"write_misses": 524682,
|
|
|
|
"demotions": 0,
|
|
|
|
"promotions": 0,
|
|
|
|
"dirty": 0,
|
|
|
|
}
|
|
|
|
acc.AssertContainsTaggedFields(t, measurement, fields2, tags2)
|
|
|
|
|
|
|
|
tags3 := map[string]string{
|
|
|
|
"device": "all",
|
|
|
|
}
|
|
|
|
|
|
|
|
fields3 := map[string]interface{}{
|
|
|
|
"length": 9178759168,
|
|
|
|
"metadata_blocksize": 16,
|
|
|
|
"metadata_used": 73370,
|
|
|
|
"metadata_total": 2811842,
|
|
|
|
"cache_blocksize": 640,
|
|
|
|
"cache_used": 33,
|
|
|
|
"cache_total": 24792130,
|
|
|
|
"read_hits": 2548,
|
|
|
|
"read_misses": 352929,
|
|
|
|
"write_hits": 280,
|
|
|
|
"write_misses": 524728,
|
|
|
|
"demotions": 0,
|
|
|
|
"promotions": 7,
|
|
|
|
"dirty": 0,
|
|
|
|
}
|
|
|
|
acc.AssertContainsTaggedFields(t, measurement, fields3, tags3)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestNotPerDeviceGoodOutput(t *testing.T) {
|
|
|
|
var acc testutil.Accumulator
|
|
|
|
var plugin = &DMCache{
|
|
|
|
PerDevice: false,
|
|
|
|
getCurrentStatus: func() ([]string, error) {
|
|
|
|
return good2DevicesFormatOutput, nil
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
err := plugin.Gather(&acc)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
tags := map[string]string{
|
|
|
|
"device": "all",
|
|
|
|
}
|
|
|
|
|
|
|
|
fields := map[string]interface{}{
|
|
|
|
"length": 9178759168,
|
|
|
|
"metadata_blocksize": 16,
|
|
|
|
"metadata_used": 73370,
|
|
|
|
"metadata_total": 2811842,
|
|
|
|
"cache_blocksize": 640,
|
|
|
|
"cache_used": 33,
|
|
|
|
"cache_total": 24792130,
|
|
|
|
"read_hits": 2548,
|
|
|
|
"read_misses": 352929,
|
|
|
|
"write_hits": 280,
|
|
|
|
"write_misses": 524728,
|
|
|
|
"demotions": 0,
|
|
|
|
"promotions": 7,
|
|
|
|
"dirty": 0,
|
|
|
|
}
|
|
|
|
acc.AssertContainsTaggedFields(t, measurement, fields, tags)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestNoDevicesOutput(t *testing.T) {
|
|
|
|
var acc testutil.Accumulator
|
|
|
|
var plugin = &DMCache{
|
|
|
|
PerDevice: true,
|
|
|
|
getCurrentStatus: func() ([]string, error) {
|
|
|
|
return []string{}, nil
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
err := plugin.Gather(&acc)
|
|
|
|
require.NoError(t, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestErrorDuringGettingStatus(t *testing.T) {
|
|
|
|
var acc testutil.Accumulator
|
|
|
|
var plugin = &DMCache{
|
|
|
|
PerDevice: true,
|
|
|
|
getCurrentStatus: func() ([]string, error) {
|
|
|
|
return nil, errors.New("dmsetup doesn't exist")
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
err := plugin.Gather(&acc)
|
|
|
|
require.Error(t, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestBadFormatOfStatus(t *testing.T) {
|
|
|
|
var acc testutil.Accumulator
|
|
|
|
var plugin = &DMCache{
|
|
|
|
PerDevice: true,
|
|
|
|
getCurrentStatus: func() ([]string, error) {
|
|
|
|
return badFormatOutput, nil
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
err := plugin.Gather(&acc)
|
|
|
|
require.Error(t, err)
|
|
|
|
}
|