From 5ca10ac5fe1eb5dab6b23e9d7a07d9e77d8efa71 Mon Sep 17 00:00:00 2001 From: Jimena Cabrera Notari Date: Tue, 3 Oct 2017 01:38:51 +0100 Subject: [PATCH] Add extra wired tiger cache metrics to mongodb input (#3281) --- plugins/inputs/mongodb/mongodb_data.go | 21 ++++++++-- plugins/inputs/mongodb/mongodb_data_test.go | 18 +++++++-- plugins/inputs/mongodb/mongostat.go | 43 +++++++++++++++++++-- 3 files changed, 72 insertions(+), 10 deletions(-) diff --git a/plugins/inputs/mongodb/mongodb_data.go b/plugins/inputs/mongodb/mongodb_data.go index 47f35f199..36eabc90c 100644 --- a/plugins/inputs/mongodb/mongodb_data.go +++ b/plugins/inputs/mongodb/mongodb_data.go @@ -77,6 +77,21 @@ var WiredTigerStats = map[string]string{ "percent_cache_used": "CacheUsedPercent", } +var WiredTigerExtStats = map[string]string{ + "wtcache_tracked_dirty_bytes": "TrackedDirtyBytes", + "wtcache_current_bytes": "CurrentCachedBytes", + "wtcache_max_bytes_configured": "MaxBytesConfigured", + "wtcache_app_threads_page_read_count": "AppThreadsPageReadCount", + "wtcache_app_threads_page_read_time": "AppThreadsPageReadTime", + "wtcache_app_threads_page_write_count": "AppThreadsPageWriteCount", + "wtcache_bytes_written_from": "BytesWrittenFrom", + "wtcache_bytes_read_into": "BytesReadInto", + "wtcache_pages_evicted_by_app_thread": "PagesEvictedByAppThread", + "wtcache_pages_queued_for_eviction": "PagesQueuedForEviction", + "wtcache_server_evicting_pages": "ServerEvictingPages", + "wtcache_worker_thread_evictingpages": "WorkerThreadEvictingPages", +} + var DbDataStats = map[string]string{ "collections": "Collections", "objects": "Objects", @@ -121,13 +136,11 @@ func (d *MongodbData) AddDefaultStats() { floatVal, _ := strconv.ParseFloat(percentVal, 64) d.add(key, floatVal) } + d.addStat(statLine, WiredTigerExtStats) } } -func (d *MongodbData) addStat( - statLine reflect.Value, - stats map[string]string, -) { +func (d *MongodbData) addStat(statLine reflect.Value, stats map[string]string) { for key, value := range stats { val := statLine.FieldByName(value).Interface() d.add(key, val) diff --git a/plugins/inputs/mongodb/mongodb_data_test.go b/plugins/inputs/mongodb/mongodb_data_test.go index e2ecac49b..9082061d3 100644 --- a/plugins/inputs/mongodb/mongodb_data_test.go +++ b/plugins/inputs/mongodb/mongodb_data_test.go @@ -70,9 +70,21 @@ func TestAddReplStats(t *testing.T) { func TestAddWiredTigerStats(t *testing.T) { d := NewMongodbData( &StatLine{ - StorageEngine: "wiredTiger", - CacheDirtyPercent: 0, - CacheUsedPercent: 0, + StorageEngine: "wiredTiger", + CacheDirtyPercent: 0, + CacheUsedPercent: 0, + TrackedDirtyBytes: 0, + CurrentCachedBytes: 0, + MaxBytesConfigured: 0, + AppThreadsPageReadCount: 0, + AppThreadsPageReadTime: 0, + AppThreadsPageWriteCount: 0, + BytesWrittenFrom: 0, + BytesReadInto: 0, + PagesEvictedByAppThread: 0, + PagesQueuedForEviction: 0, + ServerEvictingPages: 0, + WorkerThreadEvictingPages: 0, }, tags, ) diff --git a/plugins/inputs/mongodb/mongostat.go b/plugins/inputs/mongodb/mongostat.go index bddd3fda9..cb7710798 100644 --- a/plugins/inputs/mongodb/mongostat.go +++ b/plugins/inputs/mongodb/mongostat.go @@ -127,9 +127,19 @@ type ConcurrentTransStats struct { // CacheStats stores cache statistics for WiredTiger. type CacheStats struct { - TrackedDirtyBytes int64 `bson:"tracked dirty bytes in the cache"` - CurrentCachedBytes int64 `bson:"bytes currently in the cache"` - MaxBytesConfigured int64 `bson:"maximum bytes configured"` + TrackedDirtyBytes int64 `bson:"tracked dirty bytes in the cache"` + CurrentCachedBytes int64 `bson:"bytes currently in the cache"` + MaxBytesConfigured int64 `bson:"maximum bytes configured"` + AppThreadsPageReadCount int64 `bson:"application threads page read from disk to cache count"` + AppThreadsPageReadTime int64 `bson:"application threads page read from disk to cache time (usecs)"` + AppThreadsPageWriteCount int64 `bson:"application threads page write from cache to disk count"` + AppThreadsPageWriteTime int64 `bson:"application threads page write from cache to disk time (usecs)"` + BytesWrittenFrom int64 `bson:"bytes written from cache"` + BytesReadInto int64 `bson:"bytes read into cache"` + PagesEvictedByAppThread int64 `bson:"pages evicted by application threads"` + PagesQueuedForEviction int64 `bson:"pages queued for eviction"` + ServerEvictingPages int64 `bson:"eviction server evicting pages"` + WorkerThreadEvictingPages int64 `bson:"eviction worker thread evicting pages"` } // TransactionStats stores transaction checkpoints in WiredTiger. @@ -406,6 +416,20 @@ type StatLine struct { CacheDirtyPercent float64 CacheUsedPercent float64 + // Cache ultilization extended (wiredtiger only) + TrackedDirtyBytes int64 + CurrentCachedBytes int64 + MaxBytesConfigured int64 + AppThreadsPageReadCount int64 + AppThreadsPageReadTime int64 + AppThreadsPageWriteCount int64 + BytesWrittenFrom int64 + BytesReadInto int64 + PagesEvictedByAppThread int64 + PagesQueuedForEviction int64 + ServerEvictingPages int64 + WorkerThreadEvictingPages int64 + // Replicated Opcounter fields InsertR, QueryR, UpdateR, DeleteR, GetMoreR, CommandR int64 ReplLag int64 @@ -534,6 +558,19 @@ func NewStatLine(oldMongo, newMongo MongoStatus, key string, all bool, sampleSec returnVal.Flushes = newStat.WiredTiger.Transaction.TransCheckpoints - oldStat.WiredTiger.Transaction.TransCheckpoints returnVal.CacheDirtyPercent = float64(newStat.WiredTiger.Cache.TrackedDirtyBytes) / float64(newStat.WiredTiger.Cache.MaxBytesConfigured) returnVal.CacheUsedPercent = float64(newStat.WiredTiger.Cache.CurrentCachedBytes) / float64(newStat.WiredTiger.Cache.MaxBytesConfigured) + + returnVal.TrackedDirtyBytes = newStat.WiredTiger.Cache.TrackedDirtyBytes + returnVal.CurrentCachedBytes = newStat.WiredTiger.Cache.CurrentCachedBytes + returnVal.MaxBytesConfigured = newStat.WiredTiger.Cache.MaxBytesConfigured + returnVal.AppThreadsPageReadCount = newStat.WiredTiger.Cache.AppThreadsPageReadCount + returnVal.AppThreadsPageReadTime = newStat.WiredTiger.Cache.AppThreadsPageReadTime + returnVal.AppThreadsPageWriteCount = newStat.WiredTiger.Cache.AppThreadsPageWriteCount + returnVal.BytesWrittenFrom = newStat.WiredTiger.Cache.BytesWrittenFrom + returnVal.BytesReadInto = newStat.WiredTiger.Cache.BytesReadInto + returnVal.PagesEvictedByAppThread = newStat.WiredTiger.Cache.PagesEvictedByAppThread + returnVal.PagesQueuedForEviction = newStat.WiredTiger.Cache.PagesQueuedForEviction + returnVal.ServerEvictingPages = newStat.WiredTiger.Cache.ServerEvictingPages + returnVal.WorkerThreadEvictingPages = newStat.WiredTiger.Cache.WorkerThreadEvictingPages } else if newStat.BackgroundFlushing != nil && oldStat.BackgroundFlushing != nil { returnVal.Flushes = newStat.BackgroundFlushing.Flushes - oldStat.BackgroundFlushing.Flushes }