renaming plugins -> inputs
This commit is contained in:
227
plugins/inputs/zfs/README.md
Normal file
227
plugins/inputs/zfs/README.md
Normal file
@@ -0,0 +1,227 @@
|
||||
# Telegraf plugin: zfs
|
||||
|
||||
Get ZFS stat from /proc/spl/kstat/zfs
|
||||
|
||||
# Measurements
|
||||
|
||||
Meta:
|
||||
|
||||
- tags: `pools=POOL1::POOL2`
|
||||
|
||||
Measurement names:
|
||||
|
||||
- arcstats_hits
|
||||
- arcstats_misses
|
||||
- arcstats_demand_data_hits
|
||||
- arcstats_demand_data_misses
|
||||
- arcstats_demand_metadata_hits
|
||||
- arcstats_demand_metadata_misses
|
||||
- arcstats_prefetch_data_hits
|
||||
- arcstats_prefetch_data_misses
|
||||
- arcstats_prefetch_metadata_hits
|
||||
- arcstats_prefetch_metadata_misses
|
||||
- arcstats_mru_hits
|
||||
- arcstats_mru_ghost_hits
|
||||
- arcstats_mfu_hits
|
||||
- arcstats_mfu_ghost_hits
|
||||
- arcstats_deleted
|
||||
- arcstats_recycle_miss
|
||||
- arcstats_mutex_miss
|
||||
- arcstats_evict_skip
|
||||
- arcstats_evict_l2_cached
|
||||
- arcstats_evict_l2_eligible
|
||||
- arcstats_evict_l2_ineligible
|
||||
- arcstats_hash_elements
|
||||
- arcstats_hash_elements_max
|
||||
- arcstats_hash_collisions
|
||||
- arcstats_hash_chains
|
||||
- arcstats_hash_chain_max
|
||||
- arcstats_p
|
||||
- arcstats_c
|
||||
- arcstats_c_min
|
||||
- arcstats_c_max
|
||||
- arcstats_size
|
||||
- arcstats_hdr_size
|
||||
- arcstats_data_size
|
||||
- arcstats_meta_size
|
||||
- arcstats_other_size
|
||||
- arcstats_anon_size
|
||||
- arcstats_anon_evict_data
|
||||
- arcstats_anon_evict_metadata
|
||||
- arcstats_mru_size
|
||||
- arcstats_mru_evict_data
|
||||
- arcstats_mru_evict_metadata
|
||||
- arcstats_mru_ghost_size
|
||||
- arcstats_mru_ghost_evict_data
|
||||
- arcstats_mru_ghost_evict_metadata
|
||||
- arcstats_mfu_size
|
||||
- arcstats_mfu_evict_data
|
||||
- arcstats_mfu_evict_metadata
|
||||
- arcstats_mfu_ghost_size
|
||||
- arcstats_mfu_ghost_evict_data
|
||||
- arcstats_mfu_ghost_evict_metadata
|
||||
- arcstats_l2_hits
|
||||
- arcstats_l2_misses
|
||||
- arcstats_l2_feeds
|
||||
- arcstats_l2_rw_clash
|
||||
- arcstats_l2_read_bytes
|
||||
- arcstats_l2_write_bytes
|
||||
- arcstats_l2_writes_sent
|
||||
- arcstats_l2_writes_done
|
||||
- arcstats_l2_writes_error
|
||||
- arcstats_l2_writes_hdr_miss
|
||||
- arcstats_l2_evict_lock_retry
|
||||
- arcstats_l2_evict_reading
|
||||
- arcstats_l2_free_on_write
|
||||
- arcstats_l2_cdata_free_on_write
|
||||
- arcstats_l2_abort_lowmem
|
||||
- arcstats_l2_cksum_bad
|
||||
- arcstats_l2_io_error
|
||||
- arcstats_l2_size
|
||||
- arcstats_l2_asize
|
||||
- arcstats_l2_hdr_size
|
||||
- arcstats_l2_compress_successes
|
||||
- arcstats_l2_compress_zeros
|
||||
- arcstats_l2_compress_failures
|
||||
- arcstats_memory_throttle_count
|
||||
- arcstats_duplicate_buffers
|
||||
- arcstats_duplicate_buffers_size
|
||||
- arcstats_duplicate_reads
|
||||
- arcstats_memory_direct_count
|
||||
- arcstats_memory_indirect_count
|
||||
- arcstats_arc_no_grow
|
||||
- arcstats_arc_tempreserve
|
||||
- arcstats_arc_loaned_bytes
|
||||
- arcstats_arc_prune
|
||||
- arcstats_arc_meta_used
|
||||
- arcstats_arc_meta_limit
|
||||
- arcstats_arc_meta_max
|
||||
- zfetchstats_hits
|
||||
- zfetchstats_misses
|
||||
- zfetchstats_colinear_hits
|
||||
- zfetchstats_colinear_misses
|
||||
- zfetchstats_stride_hits
|
||||
- zfetchstats_stride_misses
|
||||
- zfetchstats_reclaim_successes
|
||||
- zfetchstats_reclaim_failures
|
||||
- zfetchstats_streams_resets
|
||||
- zfetchstats_streams_noresets
|
||||
- zfetchstats_bogus_streams
|
||||
- vdev_cache_stats_delegations
|
||||
- vdev_cache_stats_hits
|
||||
- vdev_cache_stats_misses
|
||||
|
||||
### Description
|
||||
|
||||
```
|
||||
arcstats_hits
|
||||
Total amount of cache hits in the arc.
|
||||
|
||||
arcstats_misses
|
||||
Total amount of cache misses in the arc.
|
||||
|
||||
arcstats_demand_data_hits
|
||||
Amount of cache hits for demand data, this is what matters (is good) for your application/share.
|
||||
|
||||
arcstats_demand_data_misses
|
||||
Amount of cache misses for demand data, this is what matters (is bad) for your application/share.
|
||||
|
||||
arcstats_demand_metadata_hits
|
||||
Ammount of cache hits for demand metadata, this matters (is good) for getting filesystem data (ls,find,…)
|
||||
|
||||
arcstats_demand_metadata_misses
|
||||
Ammount of cache misses for demand metadata, this matters (is bad) for getting filesystem data (ls,find,…)
|
||||
|
||||
arcstats_prefetch_data_hits
|
||||
The zfs prefetcher tried to prefetch somethin, but it was allready cached (boring)
|
||||
|
||||
arcstats_prefetch_data_misses
|
||||
The zfs prefetcher prefetched something which was not in the cache (good job, could become a demand hit in the future)
|
||||
|
||||
arcstats_prefetch_metadata_hits
|
||||
Same as above, but for metadata
|
||||
|
||||
arcstats_prefetch_metadata_misses
|
||||
Same as above, but for metadata
|
||||
|
||||
arcstats_mru_hits
|
||||
Cache hit in the “most recently used cache”, we move this to the mfu cache.
|
||||
|
||||
arcstats_mru_ghost_hits
|
||||
Cache hit in the “most recently used ghost list” we had this item in the cache, but evicted it, maybe we should increase the mru cache size.
|
||||
|
||||
arcstats_mfu_hits
|
||||
Cache hit in the “most freqently used cache” we move this to the begining of the mfu cache.
|
||||
|
||||
arcstats_mfu_ghost_hits
|
||||
Cache hit in the “most frequently used ghost list” we had this item in the cache, but evicted it, maybe we should increase the mfu cache size.
|
||||
|
||||
arcstats_allocated
|
||||
New data is written to the cache.
|
||||
|
||||
arcstats_deleted
|
||||
Old data is evicted (deleted) from the cache.
|
||||
|
||||
arcstats_evict_l2_cached
|
||||
We evicted something from the arc, but its still cached in the l2 if we need it.
|
||||
|
||||
arcstats_evict_l2_eligible
|
||||
We evicted something from the arc, and it’s not in the l2 this is sad. (maybe we hadn’t had enough time to store it there)
|
||||
|
||||
arcstats_evict_l2_ineligible
|
||||
We evicted something which cannot be stored in the l2.
|
||||
Reasons could be:
|
||||
We have multiple pools, we evicted something from a pool whithot an l2 device.
|
||||
The zfs property secondarycache.
|
||||
|
||||
arcstats_c
|
||||
Arc target size, this is the size the system thinks the arc should have.
|
||||
|
||||
arcstats_size
|
||||
Total size of the arc.
|
||||
|
||||
arcstats_l2_hits
|
||||
Hits to the L2 cache. (It was not in the arc, but in the l2 cache)
|
||||
|
||||
arcstats_l2_misses
|
||||
Miss to the L2 cache. (It was not in the arc, and not in the l2 cache)
|
||||
|
||||
arcstats_l2_size
|
||||
Size of the l2 cache.
|
||||
|
||||
arcstats_l2_hdr_size
|
||||
Size of the metadata in the arc (ram) used to manage (lookup if someting is in the l2) the l2 cache.
|
||||
|
||||
|
||||
|
||||
zfetchstats_hits
|
||||
Counts the number of cache hits, to items wich are in the cache because of the prefetcher.
|
||||
|
||||
zfetchstats_colinear_hits
|
||||
Counts the number of cache hits, to items wich are in the cache because of the prefetcher (prefetched linear reads)
|
||||
|
||||
zfetchstats_stride_hits
|
||||
Counts the number of cache hits, to items wich are in the cache because of the prefetcher (prefetched stride reads)
|
||||
|
||||
|
||||
|
||||
vdev_cache_stats_hits
|
||||
Hits to the vdev (device level) cache.
|
||||
|
||||
vdev_cache_stats_misses
|
||||
Misses to the vdev (device level) cache.
|
||||
```
|
||||
|
||||
# Default config
|
||||
|
||||
```
|
||||
[zfs]
|
||||
# ZFS kstat path
|
||||
# If not specified, then default is:
|
||||
# kstatPath = "/proc/spl/kstat/zfs"
|
||||
#
|
||||
# By default, telegraf gather all zfs stats
|
||||
# If not specified, then default is:
|
||||
# kstatMetrics = ["arcstats", "zfetchstats", "vdev_cache_stats"]
|
||||
```
|
||||
|
||||
155
plugins/inputs/zfs/zfs.go
Normal file
155
plugins/inputs/zfs/zfs.go
Normal file
@@ -0,0 +1,155 @@
|
||||
package zfs
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/influxdb/telegraf/internal"
|
||||
"github.com/influxdb/telegraf/plugins/inputs"
|
||||
)
|
||||
|
||||
type Zfs struct {
|
||||
KstatPath string
|
||||
KstatMetrics []string
|
||||
PoolMetrics bool
|
||||
}
|
||||
|
||||
type poolInfo struct {
|
||||
name string
|
||||
ioFilename string
|
||||
}
|
||||
|
||||
var sampleConfig = `
|
||||
# ZFS kstat path
|
||||
# If not specified, then default is:
|
||||
# kstatPath = "/proc/spl/kstat/zfs"
|
||||
#
|
||||
# By default, telegraf gather all zfs stats
|
||||
# If not specified, then default is:
|
||||
# kstatMetrics = ["arcstats", "zfetchstats", "vdev_cache_stats"]
|
||||
#
|
||||
# By default, don't gather zpool stats
|
||||
# poolMetrics = false
|
||||
`
|
||||
|
||||
func (z *Zfs) SampleConfig() string {
|
||||
return sampleConfig
|
||||
}
|
||||
|
||||
func (z *Zfs) Description() string {
|
||||
return "Read metrics of ZFS from arcstats, zfetchstats and vdev_cache_stats"
|
||||
}
|
||||
|
||||
func getPools(kstatPath string) []poolInfo {
|
||||
pools := make([]poolInfo, 0)
|
||||
poolsDirs, _ := filepath.Glob(kstatPath + "/*/io")
|
||||
|
||||
for _, poolDir := range poolsDirs {
|
||||
poolDirSplit := strings.Split(poolDir, "/")
|
||||
pool := poolDirSplit[len(poolDirSplit)-2]
|
||||
pools = append(pools, poolInfo{name: pool, ioFilename: poolDir})
|
||||
}
|
||||
|
||||
return pools
|
||||
}
|
||||
|
||||
func getTags(pools []poolInfo) map[string]string {
|
||||
var poolNames string
|
||||
|
||||
for _, pool := range pools {
|
||||
if len(poolNames) != 0 {
|
||||
poolNames += "::"
|
||||
}
|
||||
poolNames += pool.name
|
||||
}
|
||||
|
||||
return map[string]string{"pools": poolNames}
|
||||
}
|
||||
|
||||
func gatherPoolStats(pool poolInfo, acc inputs.Accumulator) error {
|
||||
lines, err := internal.ReadLines(pool.ioFilename)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(lines) != 3 {
|
||||
return err
|
||||
}
|
||||
|
||||
keys := strings.Fields(lines[1])
|
||||
values := strings.Fields(lines[2])
|
||||
|
||||
keyCount := len(keys)
|
||||
|
||||
if keyCount != len(values) {
|
||||
return fmt.Errorf("Key and value count don't match Keys:%v Values:%v", keys, values)
|
||||
}
|
||||
|
||||
tag := map[string]string{"pool": pool.name}
|
||||
fields := make(map[string]interface{})
|
||||
for i := 0; i < keyCount; i++ {
|
||||
value, err := strconv.ParseInt(values[i], 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fields[keys[i]] = value
|
||||
}
|
||||
acc.AddFields("zfs_pool", fields, tag)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (z *Zfs) Gather(acc inputs.Accumulator) error {
|
||||
kstatMetrics := z.KstatMetrics
|
||||
if len(kstatMetrics) == 0 {
|
||||
kstatMetrics = []string{"arcstats", "zfetchstats", "vdev_cache_stats"}
|
||||
}
|
||||
|
||||
kstatPath := z.KstatPath
|
||||
if len(kstatPath) == 0 {
|
||||
kstatPath = "/proc/spl/kstat/zfs"
|
||||
}
|
||||
|
||||
pools := getPools(kstatPath)
|
||||
tags := getTags(pools)
|
||||
|
||||
if z.PoolMetrics {
|
||||
for _, pool := range pools {
|
||||
err := gatherPoolStats(pool, acc)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fields := make(map[string]interface{})
|
||||
for _, metric := range kstatMetrics {
|
||||
lines, err := internal.ReadLines(kstatPath + "/" + metric)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for i, line := range lines {
|
||||
if i == 0 || i == 1 {
|
||||
continue
|
||||
}
|
||||
if len(line) < 1 {
|
||||
continue
|
||||
}
|
||||
rawData := strings.Split(line, " ")
|
||||
key := metric + "_" + rawData[0]
|
||||
rawValue := rawData[len(rawData)-1]
|
||||
value, _ := strconv.ParseInt(rawValue, 10, 64)
|
||||
fields[key] = value
|
||||
}
|
||||
}
|
||||
acc.AddFields("zfs", fields, tags)
|
||||
return nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
inputs.Add("zfs", func() inputs.Input {
|
||||
return &Zfs{}
|
||||
})
|
||||
}
|
||||
366
plugins/inputs/zfs/zfs_test.go
Normal file
366
plugins/inputs/zfs/zfs_test.go
Normal file
@@ -0,0 +1,366 @@
|
||||
package zfs
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/influxdb/telegraf/testutil"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
const arcstatsContents = `5 1 0x01 86 4128 23617128247 12081618582809582
|
||||
name type data
|
||||
hits 4 5968846374
|
||||
misses 4 1659178751
|
||||
demand_data_hits 4 4860247322
|
||||
demand_data_misses 4 501499535
|
||||
demand_metadata_hits 4 708608325
|
||||
demand_metadata_misses 4 156591375
|
||||
prefetch_data_hits 4 367047144
|
||||
prefetch_data_misses 4 974529898
|
||||
prefetch_metadata_hits 4 32943583
|
||||
prefetch_metadata_misses 4 26557943
|
||||
mru_hits 4 301176811
|
||||
mru_ghost_hits 4 47066067
|
||||
mfu_hits 4 5520612438
|
||||
mfu_ghost_hits 4 45784009
|
||||
deleted 4 1718937704
|
||||
recycle_miss 4 481222994
|
||||
mutex_miss 4 20575623
|
||||
evict_skip 4 14655903906543
|
||||
evict_l2_cached 4 145310202998272
|
||||
evict_l2_eligible 4 16345402777088
|
||||
evict_l2_ineligible 4 7437226893312
|
||||
hash_elements 4 36617980
|
||||
hash_elements_max 4 36618318
|
||||
hash_collisions 4 554145157
|
||||
hash_chains 4 4187651
|
||||
hash_chain_max 4 26
|
||||
p 4 13963222064
|
||||
c 4 16381258376
|
||||
c_min 4 4194304
|
||||
c_max 4 16884125696
|
||||
size 4 16319887096
|
||||
hdr_size 4 42567864
|
||||
data_size 4 60066304
|
||||
meta_size 4 1701534208
|
||||
other_size 4 1661543168
|
||||
anon_size 4 94720
|
||||
anon_evict_data 4 0
|
||||
anon_evict_metadata 4 0
|
||||
mru_size 4 973099008
|
||||
mru_evict_data 4 9175040
|
||||
mru_evict_metadata 4 32768
|
||||
mru_ghost_size 4 32768
|
||||
mru_ghost_evict_data 4 0
|
||||
mru_ghost_evict_metadata 4 32768
|
||||
mfu_size 4 788406784
|
||||
mfu_evict_data 4 50881024
|
||||
mfu_evict_metadata 4 81920
|
||||
mfu_ghost_size 4 0
|
||||
mfu_ghost_evict_data 4 0
|
||||
mfu_ghost_evict_metadata 4 0
|
||||
l2_hits 4 573868618
|
||||
l2_misses 4 1085309718
|
||||
l2_feeds 4 12182087
|
||||
l2_rw_clash 4 9610
|
||||
l2_read_bytes 4 32695938336768
|
||||
l2_write_bytes 4 2826774778880
|
||||
l2_writes_sent 4 4267687
|
||||
l2_writes_done 4 4267687
|
||||
l2_writes_error 4 0
|
||||
l2_writes_hdr_miss 4 164
|
||||
l2_evict_lock_retry 4 5
|
||||
l2_evict_reading 4 0
|
||||
l2_free_on_write 4 1606914
|
||||
l2_cdata_free_on_write 4 1775
|
||||
l2_abort_lowmem 4 83462
|
||||
l2_cksum_bad 4 393860640
|
||||
l2_io_error 4 53881460
|
||||
l2_size 4 2471466648576
|
||||
l2_asize 4 2461690072064
|
||||
l2_hdr_size 4 12854175552
|
||||
l2_compress_successes 4 12184849
|
||||
l2_compress_zeros 4 0
|
||||
l2_compress_failures 4 0
|
||||
memory_throttle_count 4 0
|
||||
duplicate_buffers 4 0
|
||||
duplicate_buffers_size 4 0
|
||||
duplicate_reads 4 0
|
||||
memory_direct_count 4 5159942
|
||||
memory_indirect_count 4 3034640
|
||||
arc_no_grow 4 0
|
||||
arc_tempreserve 4 0
|
||||
arc_loaned_bytes 4 0
|
||||
arc_prune 4 114554259559
|
||||
arc_meta_used 4 16259820792
|
||||
arc_meta_limit 4 12663094272
|
||||
arc_meta_max 4 18327165696
|
||||
`
|
||||
|
||||
const zfetchstatsContents = `3 1 0x01 11 528 23607270446 12081656848148208
|
||||
name type data
|
||||
hits 4 7812959060
|
||||
misses 4 4154484207
|
||||
colinear_hits 4 1366368
|
||||
colinear_misses 4 4153117839
|
||||
stride_hits 4 7309776732
|
||||
stride_misses 4 222766182
|
||||
reclaim_successes 4 107788388
|
||||
reclaim_failures 4 4045329451
|
||||
streams_resets 4 20989756
|
||||
streams_noresets 4 503182328
|
||||
bogus_streams 4 0
|
||||
`
|
||||
const vdev_cache_statsContents = `7 1 0x01 3 144 23617323692 12081684236238879
|
||||
name type data
|
||||
delegations 4 0
|
||||
hits 4 0
|
||||
misses 4 0
|
||||
`
|
||||
const pool_ioContents = `11 3 0x00 1 80 2225326830828 32953476980628
|
||||
nread nwritten reads writes wtime wlentime wupdate rtime rlentime rupdate wcnt rcnt
|
||||
1884160 6450688 22 978 272187126 2850519036 2263669418655 424226814 2850519036 2263669871823 0 0
|
||||
`
|
||||
|
||||
var testKstatPath = os.TempDir() + "/telegraf/proc/spl/kstat/zfs"
|
||||
|
||||
func TestZfsPoolMetrics(t *testing.T) {
|
||||
err := os.MkdirAll(testKstatPath, 0755)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = os.MkdirAll(testKstatPath+"/HOME", 0755)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = ioutil.WriteFile(testKstatPath+"/HOME/io", []byte(pool_ioContents), 0644)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = ioutil.WriteFile(testKstatPath+"/arcstats", []byte(arcstatsContents), 0644)
|
||||
require.NoError(t, err)
|
||||
|
||||
poolMetrics := getPoolMetrics()
|
||||
|
||||
var acc testutil.Accumulator
|
||||
|
||||
z := &Zfs{KstatPath: testKstatPath, KstatMetrics: []string{"arcstats"}}
|
||||
err = z.Gather(&acc)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.False(t, acc.HasMeasurement("zfs_pool"))
|
||||
acc.Points = nil
|
||||
|
||||
z = &Zfs{KstatPath: testKstatPath, KstatMetrics: []string{"arcstats"}, PoolMetrics: true}
|
||||
err = z.Gather(&acc)
|
||||
require.NoError(t, err)
|
||||
|
||||
//one pool, all metrics
|
||||
tags := map[string]string{
|
||||
"pool": "HOME",
|
||||
}
|
||||
|
||||
acc.AssertContainsTaggedFields(t, "zfs_pool", poolMetrics, tags)
|
||||
|
||||
err = os.RemoveAll(os.TempDir() + "/telegraf")
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestZfsGeneratesMetrics(t *testing.T) {
|
||||
err := os.MkdirAll(testKstatPath, 0755)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = os.MkdirAll(testKstatPath+"/HOME", 0755)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = ioutil.WriteFile(testKstatPath+"/HOME/io", []byte(""), 0644)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = ioutil.WriteFile(testKstatPath+"/arcstats", []byte(arcstatsContents), 0644)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = ioutil.WriteFile(testKstatPath+"/zfetchstats", []byte(zfetchstatsContents), 0644)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = ioutil.WriteFile(testKstatPath+"/vdev_cache_stats", []byte(vdev_cache_statsContents), 0644)
|
||||
require.NoError(t, err)
|
||||
|
||||
intMetrics := getKstatMetricsAll()
|
||||
|
||||
var acc testutil.Accumulator
|
||||
|
||||
//one pool, all metrics
|
||||
tags := map[string]string{
|
||||
"pools": "HOME",
|
||||
}
|
||||
|
||||
z := &Zfs{KstatPath: testKstatPath}
|
||||
err = z.Gather(&acc)
|
||||
require.NoError(t, err)
|
||||
|
||||
acc.AssertContainsTaggedFields(t, "zfs", intMetrics, tags)
|
||||
acc.Points = nil
|
||||
|
||||
//two pools, all metrics
|
||||
err = os.MkdirAll(testKstatPath+"/STORAGE", 0755)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = ioutil.WriteFile(testKstatPath+"/STORAGE/io", []byte(""), 0644)
|
||||
require.NoError(t, err)
|
||||
|
||||
tags = map[string]string{
|
||||
"pools": "HOME::STORAGE",
|
||||
}
|
||||
|
||||
z = &Zfs{KstatPath: testKstatPath}
|
||||
acc = testutil.Accumulator{}
|
||||
err = z.Gather(&acc)
|
||||
require.NoError(t, err)
|
||||
|
||||
acc.AssertContainsTaggedFields(t, "zfs", intMetrics, tags)
|
||||
acc.Points = nil
|
||||
|
||||
intMetrics = getKstatMetricsArcOnly()
|
||||
|
||||
//two pools, one metric
|
||||
z = &Zfs{KstatPath: testKstatPath, KstatMetrics: []string{"arcstats"}}
|
||||
acc = testutil.Accumulator{}
|
||||
err = z.Gather(&acc)
|
||||
require.NoError(t, err)
|
||||
|
||||
acc.AssertContainsTaggedFields(t, "zfs", intMetrics, tags)
|
||||
|
||||
err = os.RemoveAll(os.TempDir() + "/telegraf")
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func getKstatMetricsArcOnly() map[string]interface{} {
|
||||
return map[string]interface{}{
|
||||
"arcstats_hits": int64(5968846374),
|
||||
"arcstats_misses": int64(1659178751),
|
||||
"arcstats_demand_data_hits": int64(4860247322),
|
||||
"arcstats_demand_data_misses": int64(501499535),
|
||||
"arcstats_demand_metadata_hits": int64(708608325),
|
||||
"arcstats_demand_metadata_misses": int64(156591375),
|
||||
"arcstats_prefetch_data_hits": int64(367047144),
|
||||
"arcstats_prefetch_data_misses": int64(974529898),
|
||||
"arcstats_prefetch_metadata_hits": int64(32943583),
|
||||
"arcstats_prefetch_metadata_misses": int64(26557943),
|
||||
"arcstats_mru_hits": int64(301176811),
|
||||
"arcstats_mru_ghost_hits": int64(47066067),
|
||||
"arcstats_mfu_hits": int64(5520612438),
|
||||
"arcstats_mfu_ghost_hits": int64(45784009),
|
||||
"arcstats_deleted": int64(1718937704),
|
||||
"arcstats_recycle_miss": int64(481222994),
|
||||
"arcstats_mutex_miss": int64(20575623),
|
||||
"arcstats_evict_skip": int64(14655903906543),
|
||||
"arcstats_evict_l2_cached": int64(145310202998272),
|
||||
"arcstats_evict_l2_eligible": int64(16345402777088),
|
||||
"arcstats_evict_l2_ineligible": int64(7437226893312),
|
||||
"arcstats_hash_elements": int64(36617980),
|
||||
"arcstats_hash_elements_max": int64(36618318),
|
||||
"arcstats_hash_collisions": int64(554145157),
|
||||
"arcstats_hash_chains": int64(4187651),
|
||||
"arcstats_hash_chain_max": int64(26),
|
||||
"arcstats_p": int64(13963222064),
|
||||
"arcstats_c": int64(16381258376),
|
||||
"arcstats_c_min": int64(4194304),
|
||||
"arcstats_c_max": int64(16884125696),
|
||||
"arcstats_size": int64(16319887096),
|
||||
"arcstats_hdr_size": int64(42567864),
|
||||
"arcstats_data_size": int64(60066304),
|
||||
"arcstats_meta_size": int64(1701534208),
|
||||
"arcstats_other_size": int64(1661543168),
|
||||
"arcstats_anon_size": int64(94720),
|
||||
"arcstats_anon_evict_data": int64(0),
|
||||
"arcstats_anon_evict_metadata": int64(0),
|
||||
"arcstats_mru_size": int64(973099008),
|
||||
"arcstats_mru_evict_data": int64(9175040),
|
||||
"arcstats_mru_evict_metadata": int64(32768),
|
||||
"arcstats_mru_ghost_size": int64(32768),
|
||||
"arcstats_mru_ghost_evict_data": int64(0),
|
||||
"arcstats_mru_ghost_evict_metadata": int64(32768),
|
||||
"arcstats_mfu_size": int64(788406784),
|
||||
"arcstats_mfu_evict_data": int64(50881024),
|
||||
"arcstats_mfu_evict_metadata": int64(81920),
|
||||
"arcstats_mfu_ghost_size": int64(0),
|
||||
"arcstats_mfu_ghost_evict_data": int64(0),
|
||||
"arcstats_mfu_ghost_evict_metadata": int64(0),
|
||||
"arcstats_l2_hits": int64(573868618),
|
||||
"arcstats_l2_misses": int64(1085309718),
|
||||
"arcstats_l2_feeds": int64(12182087),
|
||||
"arcstats_l2_rw_clash": int64(9610),
|
||||
"arcstats_l2_read_bytes": int64(32695938336768),
|
||||
"arcstats_l2_write_bytes": int64(2826774778880),
|
||||
"arcstats_l2_writes_sent": int64(4267687),
|
||||
"arcstats_l2_writes_done": int64(4267687),
|
||||
"arcstats_l2_writes_error": int64(0),
|
||||
"arcstats_l2_writes_hdr_miss": int64(164),
|
||||
"arcstats_l2_evict_lock_retry": int64(5),
|
||||
"arcstats_l2_evict_reading": int64(0),
|
||||
"arcstats_l2_free_on_write": int64(1606914),
|
||||
"arcstats_l2_cdata_free_on_write": int64(1775),
|
||||
"arcstats_l2_abort_lowmem": int64(83462),
|
||||
"arcstats_l2_cksum_bad": int64(393860640),
|
||||
"arcstats_l2_io_error": int64(53881460),
|
||||
"arcstats_l2_size": int64(2471466648576),
|
||||
"arcstats_l2_asize": int64(2461690072064),
|
||||
"arcstats_l2_hdr_size": int64(12854175552),
|
||||
"arcstats_l2_compress_successes": int64(12184849),
|
||||
"arcstats_l2_compress_zeros": int64(0),
|
||||
"arcstats_l2_compress_failures": int64(0),
|
||||
"arcstats_memory_throttle_count": int64(0),
|
||||
"arcstats_duplicate_buffers": int64(0),
|
||||
"arcstats_duplicate_buffers_size": int64(0),
|
||||
"arcstats_duplicate_reads": int64(0),
|
||||
"arcstats_memory_direct_count": int64(5159942),
|
||||
"arcstats_memory_indirect_count": int64(3034640),
|
||||
"arcstats_arc_no_grow": int64(0),
|
||||
"arcstats_arc_tempreserve": int64(0),
|
||||
"arcstats_arc_loaned_bytes": int64(0),
|
||||
"arcstats_arc_prune": int64(114554259559),
|
||||
"arcstats_arc_meta_used": int64(16259820792),
|
||||
"arcstats_arc_meta_limit": int64(12663094272),
|
||||
"arcstats_arc_meta_max": int64(18327165696),
|
||||
}
|
||||
}
|
||||
|
||||
func getKstatMetricsAll() map[string]interface{} {
|
||||
otherMetrics := map[string]interface{}{
|
||||
"zfetchstats_hits": int64(7812959060),
|
||||
"zfetchstats_misses": int64(4154484207),
|
||||
"zfetchstats_colinear_hits": int64(1366368),
|
||||
"zfetchstats_colinear_misses": int64(4153117839),
|
||||
"zfetchstats_stride_hits": int64(7309776732),
|
||||
"zfetchstats_stride_misses": int64(222766182),
|
||||
"zfetchstats_reclaim_successes": int64(107788388),
|
||||
"zfetchstats_reclaim_failures": int64(4045329451),
|
||||
"zfetchstats_streams_resets": int64(20989756),
|
||||
"zfetchstats_streams_noresets": int64(503182328),
|
||||
"zfetchstats_bogus_streams": int64(0),
|
||||
"vdev_cache_stats_delegations": int64(0),
|
||||
"vdev_cache_stats_hits": int64(0),
|
||||
"vdev_cache_stats_misses": int64(0),
|
||||
}
|
||||
arcMetrics := getKstatMetricsArcOnly()
|
||||
for k, v := range otherMetrics {
|
||||
arcMetrics[k] = v
|
||||
}
|
||||
return arcMetrics
|
||||
}
|
||||
|
||||
func getPoolMetrics() map[string]interface{} {
|
||||
return map[string]interface{}{
|
||||
"nread": int64(1884160),
|
||||
"nwritten": int64(6450688),
|
||||
"reads": int64(22),
|
||||
"writes": int64(978),
|
||||
"wtime": int64(272187126),
|
||||
"wlentime": int64(2850519036),
|
||||
"wupdate": int64(2263669418655),
|
||||
"rtime": int64(424226814),
|
||||
"rlentime": int64(2850519036),
|
||||
"rupdate": int64(2263669871823),
|
||||
"wcnt": int64(0),
|
||||
"rcnt": int64(0),
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user