316 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			316 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Go
		
	
	
	
| // +build linux
 | |
| 
 | |
| package kernel_vmstat
 | |
| 
 | |
| import (
 | |
| 	"io/ioutil"
 | |
| 	"os"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/influxdata/telegraf/testutil"
 | |
| 
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| )
 | |
| 
 | |
| func TestFullVmStatProcFile(t *testing.T) {
 | |
| 	tmpfile := makeFakeVmStatFile([]byte(vmStatFile_Full))
 | |
| 	defer os.Remove(tmpfile)
 | |
| 
 | |
| 	k := KernelVmstat{
 | |
| 		statFile: tmpfile,
 | |
| 	}
 | |
| 
 | |
| 	acc := testutil.Accumulator{}
 | |
| 	err := k.Gather(&acc)
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	fields := map[string]interface{}{
 | |
| 		"nr_free_pages":                 int64(78730),
 | |
| 		"nr_inactive_anon":              int64(426259),
 | |
| 		"nr_active_anon":                int64(2515657),
 | |
| 		"nr_inactive_file":              int64(2366791),
 | |
| 		"nr_active_file":                int64(2244914),
 | |
| 		"nr_unevictable":                int64(0),
 | |
| 		"nr_mlock":                      int64(0),
 | |
| 		"nr_anon_pages":                 int64(1358675),
 | |
| 		"nr_mapped":                     int64(558821),
 | |
| 		"nr_file_pages":                 int64(5153546),
 | |
| 		"nr_dirty":                      int64(5690),
 | |
| 		"nr_writeback":                  int64(0),
 | |
| 		"nr_slab_reclaimable":           int64(459806),
 | |
| 		"nr_slab_unreclaimable":         int64(47859),
 | |
| 		"nr_page_table_pages":           int64(11115),
 | |
| 		"nr_kernel_stack":               int64(579),
 | |
| 		"nr_unstable":                   int64(0),
 | |
| 		"nr_bounce":                     int64(0),
 | |
| 		"nr_vmscan_write":               int64(6206),
 | |
| 		"nr_writeback_temp":             int64(0),
 | |
| 		"nr_isolated_anon":              int64(0),
 | |
| 		"nr_isolated_file":              int64(0),
 | |
| 		"nr_shmem":                      int64(541689),
 | |
| 		"numa_hit":                      int64(6690743595),
 | |
| 		"numa_miss":                     int64(0),
 | |
| 		"numa_foreign":                  int64(0),
 | |
| 		"numa_interleave":               int64(35793),
 | |
| 		"numa_local":                    int64(5113399878),
 | |
| 		"numa_other":                    int64(0),
 | |
| 		"nr_anon_transparent_hugepages": int64(2034),
 | |
| 		"pgpgin":                        int64(219717626),
 | |
| 		"pgpgout":                       int64(3495885510),
 | |
| 		"pswpin":                        int64(2092),
 | |
| 		"pswpout":                       int64(6206),
 | |
| 		"pgalloc_dma":                   int64(0),
 | |
| 		"pgalloc_dma32":                 int64(122480220),
 | |
| 		"pgalloc_normal":                int64(5233176719),
 | |
| 		"pgalloc_movable":               int64(0),
 | |
| 		"pgfree":                        int64(5359765021),
 | |
| 		"pgactivate":                    int64(375664931),
 | |
| 		"pgdeactivate":                  int64(122735906),
 | |
| 		"pgfault":                       int64(8699921410),
 | |
| 		"pgmajfault":                    int64(122210),
 | |
| 		"pgrefill_dma":                  int64(0),
 | |
| 		"pgrefill_dma32":                int64(1180010),
 | |
| 		"pgrefill_normal":               int64(119866676),
 | |
| 		"pgrefill_movable":              int64(0),
 | |
| 		"pgsteal_dma":                   int64(0),
 | |
| 		"pgsteal_dma32":                 int64(4466436),
 | |
| 		"pgsteal_normal":                int64(318463755),
 | |
| 		"pgsteal_movable":               int64(0),
 | |
| 		"pgscan_kswapd_dma":             int64(0),
 | |
| 		"pgscan_kswapd_dma32":           int64(4480608),
 | |
| 		"pgscan_kswapd_normal":          int64(287857984),
 | |
| 		"pgscan_kswapd_movable":         int64(0),
 | |
| 		"pgscan_direct_dma":             int64(0),
 | |
| 		"pgscan_direct_dma32":           int64(12256),
 | |
| 		"pgscan_direct_normal":          int64(31501600),
 | |
| 		"pgscan_direct_movable":         int64(0),
 | |
| 		"zone_reclaim_failed":           int64(0),
 | |
| 		"pginodesteal":                  int64(9188431),
 | |
| 		"slabs_scanned":                 int64(93775616),
 | |
| 		"kswapd_steal":                  int64(291534428),
 | |
| 		"kswapd_inodesteal":             int64(29770874),
 | |
| 		"kswapd_low_wmark_hit_quickly":  int64(8756),
 | |
| 		"kswapd_high_wmark_hit_quickly": int64(25439),
 | |
| 		"kswapd_skip_congestion_wait":   int64(0),
 | |
| 		"pageoutrun":                    int64(505006),
 | |
| 		"allocstall":                    int64(81496),
 | |
| 		"pgrotated":                     int64(60620),
 | |
| 		"compact_blocks_moved":          int64(238196),
 | |
| 		"compact_pages_moved":           int64(6370588),
 | |
| 		"compact_pagemigrate_failed":    int64(0),
 | |
| 		"compact_stall":                 int64(142092),
 | |
| 		"compact_fail":                  int64(135220),
 | |
| 		"compact_success":               int64(6872),
 | |
| 		"htlb_buddy_alloc_success":      int64(0),
 | |
| 		"htlb_buddy_alloc_fail":         int64(0),
 | |
| 		"unevictable_pgs_culled":        int64(1531),
 | |
| 		"unevictable_pgs_scanned":       int64(0),
 | |
| 		"unevictable_pgs_rescued":       int64(5426),
 | |
| 		"unevictable_pgs_mlocked":       int64(6988),
 | |
| 		"unevictable_pgs_munlocked":     int64(6988),
 | |
| 		"unevictable_pgs_cleared":       int64(0),
 | |
| 		"unevictable_pgs_stranded":      int64(0),
 | |
| 		"unevictable_pgs_mlockfreed":    int64(0),
 | |
| 		"thp_fault_alloc":               int64(346219),
 | |
| 		"thp_fault_fallback":            int64(895453),
 | |
| 		"thp_collapse_alloc":            int64(24857),
 | |
| 		"thp_collapse_alloc_failed":     int64(102214),
 | |
| 		"thp_split":                     int64(9817),
 | |
| 	}
 | |
| 	acc.AssertContainsFields(t, "kernel_vmstat", fields)
 | |
| }
 | |
| 
 | |
| func TestPartialVmStatProcFile(t *testing.T) {
 | |
| 	tmpfile := makeFakeVmStatFile([]byte(vmStatFile_Partial))
 | |
| 	defer os.Remove(tmpfile)
 | |
| 
 | |
| 	k := KernelVmstat{
 | |
| 		statFile: tmpfile,
 | |
| 	}
 | |
| 
 | |
| 	acc := testutil.Accumulator{}
 | |
| 	err := k.Gather(&acc)
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	fields := map[string]interface{}{
 | |
| 		"unevictable_pgs_culled":     int64(1531),
 | |
| 		"unevictable_pgs_scanned":    int64(0),
 | |
| 		"unevictable_pgs_rescued":    int64(5426),
 | |
| 		"unevictable_pgs_mlocked":    int64(6988),
 | |
| 		"unevictable_pgs_munlocked":  int64(6988),
 | |
| 		"unevictable_pgs_cleared":    int64(0),
 | |
| 		"unevictable_pgs_stranded":   int64(0),
 | |
| 		"unevictable_pgs_mlockfreed": int64(0),
 | |
| 		"thp_fault_alloc":            int64(346219),
 | |
| 		"thp_fault_fallback":         int64(895453),
 | |
| 		"thp_collapse_alloc":         int64(24857),
 | |
| 		"thp_collapse_alloc_failed":  int64(102214),
 | |
| 		"thp_split":                  int64(9817),
 | |
| 	}
 | |
| 	acc.AssertContainsFields(t, "kernel_vmstat", fields)
 | |
| }
 | |
| 
 | |
| func TestInvalidVmStatProcFile1(t *testing.T) {
 | |
| 	tmpfile := makeFakeVmStatFile([]byte(vmStatFile_Invalid))
 | |
| 	defer os.Remove(tmpfile)
 | |
| 
 | |
| 	k := KernelVmstat{
 | |
| 		statFile: tmpfile,
 | |
| 	}
 | |
| 
 | |
| 	acc := testutil.Accumulator{}
 | |
| 	err := k.Gather(&acc)
 | |
| 	assert.Error(t, err)
 | |
| }
 | |
| 
 | |
| func TestNoVmStatProcFile(t *testing.T) {
 | |
| 	tmpfile := makeFakeVmStatFile([]byte(vmStatFile_Invalid))
 | |
| 	os.Remove(tmpfile)
 | |
| 
 | |
| 	k := KernelVmstat{
 | |
| 		statFile: tmpfile,
 | |
| 	}
 | |
| 
 | |
| 	acc := testutil.Accumulator{}
 | |
| 	err := k.Gather(&acc)
 | |
| 	assert.Error(t, err)
 | |
| 	assert.Contains(t, err.Error(), "does not exist")
 | |
| }
 | |
| 
 | |
| const vmStatFile_Full = `nr_free_pages 78730
 | |
| nr_inactive_anon 426259
 | |
| nr_active_anon 2515657
 | |
| nr_inactive_file 2366791
 | |
| nr_active_file 2244914
 | |
| nr_unevictable 0
 | |
| nr_mlock 0
 | |
| nr_anon_pages 1358675
 | |
| nr_mapped 558821
 | |
| nr_file_pages 5153546
 | |
| nr_dirty 5690
 | |
| nr_writeback 0
 | |
| nr_slab_reclaimable 459806
 | |
| nr_slab_unreclaimable 47859
 | |
| nr_page_table_pages 11115
 | |
| nr_kernel_stack 579
 | |
| nr_unstable 0
 | |
| nr_bounce 0
 | |
| nr_vmscan_write 6206
 | |
| nr_writeback_temp 0
 | |
| nr_isolated_anon 0
 | |
| nr_isolated_file 0
 | |
| nr_shmem 541689
 | |
| numa_hit 6690743595
 | |
| numa_miss 0
 | |
| numa_foreign 0
 | |
| numa_interleave 35793
 | |
| numa_local 5113399878
 | |
| numa_other 0
 | |
| nr_anon_transparent_hugepages 2034
 | |
| pgpgin 219717626
 | |
| pgpgout 3495885510
 | |
| pswpin 2092
 | |
| pswpout 6206
 | |
| pgalloc_dma 0
 | |
| pgalloc_dma32 122480220
 | |
| pgalloc_normal 5233176719
 | |
| pgalloc_movable 0
 | |
| pgfree 5359765021
 | |
| pgactivate 375664931
 | |
| pgdeactivate 122735906
 | |
| pgfault 8699921410
 | |
| pgmajfault 122210
 | |
| pgrefill_dma 0
 | |
| pgrefill_dma32 1180010
 | |
| pgrefill_normal 119866676
 | |
| pgrefill_movable 0
 | |
| pgsteal_dma 0
 | |
| pgsteal_dma32 4466436
 | |
| pgsteal_normal 318463755
 | |
| pgsteal_movable 0
 | |
| pgscan_kswapd_dma 0
 | |
| pgscan_kswapd_dma32 4480608
 | |
| pgscan_kswapd_normal 287857984
 | |
| pgscan_kswapd_movable 0
 | |
| pgscan_direct_dma 0
 | |
| pgscan_direct_dma32 12256
 | |
| pgscan_direct_normal 31501600
 | |
| pgscan_direct_movable 0
 | |
| zone_reclaim_failed 0
 | |
| pginodesteal 9188431
 | |
| slabs_scanned 93775616
 | |
| kswapd_steal 291534428
 | |
| kswapd_inodesteal 29770874
 | |
| kswapd_low_wmark_hit_quickly 8756
 | |
| kswapd_high_wmark_hit_quickly 25439
 | |
| kswapd_skip_congestion_wait 0
 | |
| pageoutrun 505006
 | |
| allocstall 81496
 | |
| pgrotated 60620
 | |
| compact_blocks_moved 238196
 | |
| compact_pages_moved 6370588
 | |
| compact_pagemigrate_failed 0
 | |
| compact_stall 142092
 | |
| compact_fail 135220
 | |
| compact_success 6872
 | |
| htlb_buddy_alloc_success 0
 | |
| htlb_buddy_alloc_fail 0
 | |
| unevictable_pgs_culled 1531
 | |
| unevictable_pgs_scanned 0
 | |
| unevictable_pgs_rescued 5426
 | |
| unevictable_pgs_mlocked 6988
 | |
| unevictable_pgs_munlocked 6988
 | |
| unevictable_pgs_cleared 0
 | |
| unevictable_pgs_stranded 0
 | |
| unevictable_pgs_mlockfreed 0
 | |
| thp_fault_alloc 346219
 | |
| thp_fault_fallback 895453
 | |
| thp_collapse_alloc 24857
 | |
| thp_collapse_alloc_failed 102214
 | |
| thp_split 9817`
 | |
| 
 | |
| const vmStatFile_Partial = `unevictable_pgs_culled 1531
 | |
| unevictable_pgs_scanned 0
 | |
| unevictable_pgs_rescued 5426
 | |
| unevictable_pgs_mlocked 6988
 | |
| unevictable_pgs_munlocked 6988
 | |
| unevictable_pgs_cleared 0
 | |
| unevictable_pgs_stranded 0
 | |
| unevictable_pgs_mlockfreed 0
 | |
| thp_fault_alloc 346219
 | |
| thp_fault_fallback 895453
 | |
| thp_collapse_alloc 24857
 | |
| thp_collapse_alloc_failed 102214
 | |
| thp_split 9817`
 | |
| 
 | |
| // invalid thp_split measurement
 | |
| const vmStatFile_Invalid = `unevictable_pgs_culled 1531
 | |
| unevictable_pgs_scanned 0
 | |
| unevictable_pgs_rescued 5426
 | |
| unevictable_pgs_mlocked 6988
 | |
| unevictable_pgs_munlocked 6988
 | |
| unevictable_pgs_cleared 0
 | |
| unevictable_pgs_stranded 0
 | |
| unevictable_pgs_mlockfreed 0
 | |
| thp_fault_alloc 346219
 | |
| thp_fault_fallback 895453
 | |
| thp_collapse_alloc 24857
 | |
| thp_collapse_alloc_failed 102214
 | |
| thp_split abcd`
 | |
| 
 | |
| func makeFakeVmStatFile(content []byte) string {
 | |
| 	tmpfile, err := ioutil.TempFile("", "kernel_vmstat_test")
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 
 | |
| 	if _, err := tmpfile.Write(content); err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 	if err := tmpfile.Close(); err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 
 | |
| 	return tmpfile.Name()
 | |
| }
 |