diff --git a/config/system-stats-monitor.json b/config/system-stats-monitor.json index 8b6cf1913..56e480f66 100644 --- a/config/system-stats-monitor.json +++ b/config/system-stats-monitor.json @@ -44,6 +44,9 @@ "disk/bytes_used": { "displayName": "disk/bytes_used" }, + "disk/percent_used": { + "displayName": "disk/percent_used" + }, "disk/io_time": { "displayName": "disk/io_time" }, @@ -88,6 +91,9 @@ }, "memory/unevictable_used": { "displayName": "memory/unevictable_used" + }, + "memory/percent_used": { + "displayName": "memory/percent_used" } } }, diff --git a/config/windows-system-stats-monitor.json b/config/windows-system-stats-monitor.json index 854860768..2e2a9b51c 100644 --- a/config/windows-system-stats-monitor.json +++ b/config/windows-system-stats-monitor.json @@ -44,6 +44,9 @@ "disk/bytes_used": { "displayName": "disk/bytes_used" }, + "disk/percent_used": { + "displayName": "disk/percent_used" + }, "disk/io_time": { "displayName": "disk/io_time" }, @@ -88,6 +91,9 @@ }, "memory/unevictable_used": { "displayName": "memory/unevictable_used" + }, + "memory/percent_used": { + "displayName": "memory/percent_used" } } } diff --git a/pkg/exporters/stackdriver/stackdriver_exporter.go b/pkg/exporters/stackdriver/stackdriver_exporter.go index e65180d68..e333eb656 100644 --- a/pkg/exporters/stackdriver/stackdriver_exporter.go +++ b/pkg/exporters/stackdriver/stackdriver_exporter.go @@ -54,6 +54,7 @@ var NPDMetricToSDMetric = map[metrics.MetricID]string{ metrics.CPULoad15m: "compute.googleapis.com/guest/cpu/load_15m", metrics.DiskAvgQueueLenID: "compute.googleapis.com/guest/disk/queue_length", metrics.DiskBytesUsedID: "compute.googleapis.com/guest/disk/bytes_used", + metrics.DiskPercentUsedID: "custom.googleapis.com/guest/disk/percent_used", metrics.DiskIOTimeID: "compute.googleapis.com/guest/disk/io_time", metrics.DiskMergedOpsCountID: "compute.googleapis.com/guest/disk/merged_operation_count", metrics.DiskOpsBytesID: "compute.googleapis.com/guest/disk/operation_bytes_count", @@ -66,6 +67,7 @@ var NPDMetricToSDMetric = map[metrics.MetricID]string{ metrics.MemoryDirtyUsedID: "compute.googleapis.com/guest/memory/dirty_used", metrics.MemoryPageCacheUsedID: "compute.googleapis.com/guest/memory/page_cache_used", metrics.MemoryUnevictableUsedID: "compute.googleapis.com/guest/memory/unevictable_used", + metrics.MemoryPercentUsedID: "custom.googleapis.com/guest/memory/percent_used", metrics.ProblemCounterID: "compute.googleapis.com/guest/system/problem_count", metrics.ProblemGaugeID: "compute.googleapis.com/guest/system/problem_state", metrics.OSFeatureID: "compute.googleapis.com/guest/system/os_feature_enabled", diff --git a/pkg/systemstatsmonitor/disk_collector.go b/pkg/systemstatsmonitor/disk_collector.go index 57b38996c..b3b55f8a5 100644 --- a/pkg/systemstatsmonitor/disk_collector.go +++ b/pkg/systemstatsmonitor/disk_collector.go @@ -38,6 +38,7 @@ type diskCollector struct { mOpsBytes *metrics.Int64Metric mOpsTime *metrics.Int64Metric mBytesUsed *metrics.Int64Metric + mPercentUsed *metrics.Float64Metric config *ssmtypes.DiskStatsConfig @@ -150,6 +151,17 @@ func NewDiskCollectorOrDie(diskConfig *ssmtypes.DiskStatsConfig) *diskCollector klog.Fatalf("Error initializing metric for %q: %v", metrics.DiskBytesUsedID, err) } + dc.mPercentUsed, err = metrics.NewFloat64Metric( + metrics.DiskPercentUsedID, + diskConfig.MetricsConfigs[string(metrics.DiskPercentUsedID)].DisplayName, + "Disk usage in percentage of total space", + "%", + metrics.LastValue, + []string{deviceNameLabel}) + if err != nil { + klog.Fatalf("Error initializing metric for %q: %v", metrics.DiskPercentUsedID, err) + } + dc.lastIOTime = make(map[string]uint64) dc.lastWeightedIO = make(map[string]uint64) dc.lastReadCount = make(map[string]uint64) @@ -291,6 +303,9 @@ func (dc *diskCollector) collect() { opttypes := strings.Join(partition.Opts, ",") dc.mBytesUsed.Record(map[string]string{deviceNameLabel: deviceName, fsTypeLabel: fstype, mountOptionLabel: opttypes, stateLabel: "free"}, int64(usageStat.Free)) dc.mBytesUsed.Record(map[string]string{deviceNameLabel: deviceName, fsTypeLabel: fstype, mountOptionLabel: opttypes, stateLabel: "used"}, int64(usageStat.Used)) + if dc.mPercentUsed != nil { + dc.mPercentUsed.Record(map[string]string{deviceNameLabel: deviceName, fsTypeLabel: fstype, mountOptionLabel: opttypes, stateLabel: "used"}, float64(usageStat.UsedPercent)) + } } } diff --git a/pkg/systemstatsmonitor/memory_collector.go b/pkg/systemstatsmonitor/memory_collector.go index f3ed29213..418ad3f1a 100644 --- a/pkg/systemstatsmonitor/memory_collector.go +++ b/pkg/systemstatsmonitor/memory_collector.go @@ -25,6 +25,7 @@ import ( type memoryCollector struct { mBytesUsed *metrics.Int64Metric + mPercentUsed *metrics.Float64Metric mAnonymousUsed *metrics.Int64Metric mPageCacheUsed *metrics.Int64Metric mUnevictableUsed *metrics.Int64Metric @@ -49,6 +50,17 @@ func NewMemoryCollectorOrDie(memoryConfig *ssmtypes.MemoryStatsConfig) *memoryCo klog.Fatalf("Error initializing metric for %q: %v", metrics.MemoryBytesUsedID, err) } + mc.mPercentUsed, err = metrics.NewFloat64Metric( + metrics.MemoryPercentUsedID, + memoryConfig.MetricsConfigs[string(metrics.MemoryPercentUsedID)].DisplayName, + "Memory usage in percentage of total memory.", + "%", + metrics.LastValue, + []string{stateLabel}) + if err != nil { + klog.Fatalf("Error initializing metric for %q: %v", metrics.MemoryPercentUsedID, err) + } + mc.mAnonymousUsed, err = metrics.NewInt64Metric( metrics.MemoryAnonymousUsedID, memoryConfig.MetricsConfigs[string(metrics.MemoryAnonymousUsedID)].DisplayName, diff --git a/pkg/systemstatsmonitor/memory_collector_unix.go b/pkg/systemstatsmonitor/memory_collector_unix.go index 69b1aa07f..6343b1034 100644 --- a/pkg/systemstatsmonitor/memory_collector_unix.go +++ b/pkg/systemstatsmonitor/memory_collector_unix.go @@ -58,6 +58,12 @@ func (mc *memoryCollector) collect() { } } + if mc.mPercentUsed != nil && meminfo.MemTotal != nil && *meminfo.MemTotal > 0 && + meminfo.MemFree != nil && meminfo.Buffers != nil && meminfo.Cached != nil && meminfo.Slab != nil { + ratio := float64(*meminfo.MemTotal - *meminfo.MemFree - *meminfo.Buffers - *meminfo.Cached - *meminfo.Slab) / float64(*meminfo.MemTotal) + mc.mPercentUsed.Record(map[string]string{stateLabel: "used"}, float64(ratio*100.0)) + } + if mc.mDirtyUsed != nil { if meminfo.Dirty != nil { mc.mDirtyUsed.Record(map[string]string{stateLabel: "dirty"}, int64(*meminfo.Dirty)*1024) diff --git a/pkg/systemstatsmonitor/memory_collector_windows.go b/pkg/systemstatsmonitor/memory_collector_windows.go index 4ce29ac5f..f5889a789 100644 --- a/pkg/systemstatsmonitor/memory_collector_windows.go +++ b/pkg/systemstatsmonitor/memory_collector_windows.go @@ -37,4 +37,8 @@ func (mc *memoryCollector) collect() { mc.mBytesUsed.Record(map[string]string{stateLabel: "free"}, int64(meminfo.Available)*1024) mc.mBytesUsed.Record(map[string]string{stateLabel: "used"}, int64(meminfo.Used)*1024) } + + if mc.mPercentUsed != nil { + mc.mPercentUsed.Record(map[string]string{stateLabel: "used"}, float64(meminfo.UsedPercent)) + } } diff --git a/pkg/util/metrics/metric.go b/pkg/util/metrics/metric.go index d3044cd5c..d1122817f 100644 --- a/pkg/util/metrics/metric.go +++ b/pkg/util/metrics/metric.go @@ -35,12 +35,14 @@ const ( DiskOpsBytesID MetricID = "disk/operation_bytes_count" DiskOpsTimeID MetricID = "disk/operation_time" DiskBytesUsedID MetricID = "disk/bytes_used" + DiskPercentUsedID MetricID = "disk/percent_used" HostUptimeID MetricID = "host/uptime" MemoryBytesUsedID MetricID = "memory/bytes_used" MemoryAnonymousUsedID MetricID = "memory/anonymous_used" MemoryPageCacheUsedID MetricID = "memory/page_cache_used" MemoryUnevictableUsedID MetricID = "memory/unevictable_used" MemoryDirtyUsedID MetricID = "memory/dirty_used" + MemoryPercentUsedID MetricID = "memory/percent_used" OSFeatureID MetricID = "system/os_feature" SystemProcessesTotal MetricID = "system/processes_total" SystemProcsRunning MetricID = "system/procs_running" diff --git a/test/e2e/metriconly/metrics_test.go b/test/e2e/metriconly/metrics_test.go index 0758e7341..5d57a5852 100644 --- a/test/e2e/metriconly/metrics_test.go +++ b/test/e2e/metriconly/metrics_test.go @@ -85,6 +85,7 @@ var _ = ginkgo.Describe("NPD should export Prometheus metrics.", func() { assertMetricExist(gotMetrics, "disk_operation_bytes_count", map[string]string{}, false) assertMetricExist(gotMetrics, "disk_operation_time", map[string]string{}, false) assertMetricExist(gotMetrics, "disk_bytes_used", map[string]string{}, false) + assertMetricExist(gotMetrics, "disk_percent_used", map[string]string{}, false) assertMetricExist(gotMetrics, "disk_io_time", map[string]string{}, false) assertMetricExist(gotMetrics, "disk_weighted_io", map[string]string{}, false) assertMetricExist(gotMetrics, "memory_bytes_used", map[string]string{}, false) @@ -92,6 +93,7 @@ var _ = ginkgo.Describe("NPD should export Prometheus metrics.", func() { assertMetricExist(gotMetrics, "memory_page_cache_used", map[string]string{}, false) assertMetricExist(gotMetrics, "memory_unevictable_used", map[string]string{}, true) assertMetricExist(gotMetrics, "memory_dirty_used", map[string]string{}, false) + assertMetricExist(gotMetrics, "memory_percent_used", map[string]string{}, false) assertMetricExist(gotMetrics, "host_uptime", map[string]string{}, false) assertMetricExist(gotMetrics, "system_os_feature", map[string]string{}, false) })