diff --git a/receiver/hostmetricsreceiver/hostmetrics_receiver_test.go b/receiver/hostmetricsreceiver/hostmetrics_receiver_test.go index 66a17b6b812..942c322d2e1 100644 --- a/receiver/hostmetricsreceiver/hostmetrics_receiver_test.go +++ b/receiver/hostmetricsreceiver/hostmetrics_receiver_test.go @@ -62,7 +62,8 @@ var standardMetrics = []string{ var resourceMetrics = []string{ "process.cpu.time", - "process.memory.usage", + "process.memory.physical_usage", + "process.memory.virtual_usage", "process.disk.io", } diff --git a/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_metadata.go b/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_metadata.go index a68a07dea05..69aae236594 100644 --- a/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_metadata.go +++ b/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_metadata.go @@ -56,11 +56,21 @@ var cpuTimeDescriptor = func() pdata.MetricDescriptor { return descriptor }() -var memoryUsageDescriptor = func() pdata.MetricDescriptor { +var physicalMemoryUsageDescriptor = func() pdata.MetricDescriptor { descriptor := pdata.NewMetricDescriptor() descriptor.InitEmpty() - descriptor.SetName("process.memory.usage") - descriptor.SetDescription("Bytes of memory in use.") + descriptor.SetName("process.memory.physical_usage") + descriptor.SetDescription("The amount of physical memory in use.") + descriptor.SetUnit("bytes") + descriptor.SetType(pdata.MetricTypeInt64) + return descriptor +}() + +var virtualMemoryUsageDescriptor = func() pdata.MetricDescriptor { + descriptor := pdata.NewMetricDescriptor() + descriptor.InitEmpty() + descriptor.SetName("process.memory.virtual_usage") + descriptor.SetDescription("Virtual memory size.") descriptor.SetUnit("bytes") descriptor.SetType(pdata.MetricTypeInt64) return descriptor diff --git a/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper.go b/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper.go index eb39a7e41f5..8a807eeabe1 100644 --- a/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper.go +++ b/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper.go @@ -102,7 +102,7 @@ func (s *scraper) ScrapeMetrics(_ context.Context) (pdata.ResourceMetricsSlice, errs = append(errs, errors.Wrapf(err, "error reading cpu times for process %q (pid %v)", md.executable.name, md.pid)) } - if err = scrapeAndAppendMemoryUsageMetric(metrics, md.handle); err != nil { + if err = scrapeAndAppendMemoryUsageMetrics(metrics, md.handle); err != nil { errs = append(errs, errors.Wrapf(err, "error reading memory info for process %q (pid %v)", md.executable.name, md.pid)) } @@ -194,29 +194,30 @@ func initializeCPUTimeMetric(metric pdata.Metric, startTime pdata.TimestampUnixN appendCPUTimeStateDataPoints(ddps, startTime, times) } -func scrapeAndAppendMemoryUsageMetric(metrics pdata.MetricSlice, handle processHandle) error { +func scrapeAndAppendMemoryUsageMetrics(metrics pdata.MetricSlice, handle processHandle) error { mem, err := handle.MemoryInfo() if err != nil { return err } startIdx := metrics.Len() - metrics.Resize(startIdx + 1) - initializeMemoryUsageMetric(metrics.At(startIdx), mem) + metrics.Resize(startIdx + 2) + initializeMemoryUsageMetric(metrics.At(startIdx+0), physicalMemoryUsageDescriptor, int64(mem.RSS)) + initializeMemoryUsageMetric(metrics.At(startIdx+1), virtualMemoryUsageDescriptor, int64(mem.VMS)) return nil } -func initializeMemoryUsageMetric(metric pdata.Metric, mem *process.MemoryInfoStat) { - memoryUsageDescriptor.CopyTo(metric.MetricDescriptor()) +func initializeMemoryUsageMetric(metric pdata.Metric, descriptor pdata.MetricDescriptor, usage int64) { + descriptor.CopyTo(metric.MetricDescriptor()) idps := metric.Int64DataPoints() idps.Resize(1) - initializeMemoryUsageDataPoint(idps.At(0), int64(mem.RSS)) + initializeMemoryUsageDataPoint(idps.At(0), usage) } -func initializeMemoryUsageDataPoint(dataPoint pdata.Int64DataPoint, value int64) { +func initializeMemoryUsageDataPoint(dataPoint pdata.Int64DataPoint, usage int64) { dataPoint.SetTimestamp(pdata.TimestampUnixNano(uint64(time.Now().UnixNano()))) - dataPoint.SetValue(value) + dataPoint.SetValue(usage) } func scrapeAndAppendDiskIOMetric(metrics pdata.MetricSlice, startTime pdata.TimestampUnixNano, handle processHandle) error { diff --git a/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper_test.go b/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper_test.go index e954f9aaf6e..0424e020e54 100644 --- a/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper_test.go +++ b/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper_test.go @@ -71,7 +71,8 @@ func TestScrapeMetrics(t *testing.T) { require.Greater(t, resourceMetrics.Len(), 1) assertResourceAttributes(t, resourceMetrics) assertCPUTimeMetricValid(t, resourceMetrics, expectedStartTime) - assertMemoryUsageMetricValid(t, resourceMetrics) + assertMemoryUsageMetricValid(t, physicalMemoryUsageDescriptor, resourceMetrics) + assertMemoryUsageMetricValid(t, virtualMemoryUsageDescriptor, resourceMetrics) assertDiskIOMetricValid(t, resourceMetrics, expectedStartTime) } @@ -100,9 +101,9 @@ func assertCPUTimeMetricValid(t *testing.T, resourceMetrics pdata.ResourceMetric } } -func assertMemoryUsageMetricValid(t *testing.T, resourceMetrics pdata.ResourceMetricsSlice) { - memoryUsageMetric := getMetric(t, memoryUsageDescriptor, resourceMetrics) - internal.AssertDescriptorEqual(t, memoryUsageDescriptor, memoryUsageMetric.MetricDescriptor()) +func assertMemoryUsageMetricValid(t *testing.T, descriptor pdata.MetricDescriptor, resourceMetrics pdata.ResourceMetricsSlice) { + memoryUsageMetric := getMetric(t, descriptor, resourceMetrics) + internal.AssertDescriptorEqual(t, descriptor, memoryUsageMetric.MetricDescriptor()) } func assertDiskIOMetricValid(t *testing.T, resourceMetrics pdata.ResourceMetricsSlice, startTime pdata.TimestampUnixNano) { @@ -443,12 +444,16 @@ func TestScrapeMetrics_ProcessErrors(t *testing.T) { } } -func getExpectedLengthOfReturnedMetrics(expectedErrors ...error) int { +func getExpectedLengthOfReturnedMetrics(timeError, memError, diskError error) int { expectedLen := 0 - for _, expectedErr := range expectedErrors { - if expectedErr == nil { - expectedLen++ - } + if timeError == nil { + expectedLen++ + } + if memError == nil { + expectedLen += 2 + } + if diskError == nil { + expectedLen++ } return expectedLen }