Skip to content

Commit

Permalink
Separate process physical & virtual memory stats (#1403)
Browse files Browse the repository at this point in the history
  • Loading branch information
james-bebbington authored Jul 22, 2020
1 parent 2c3bca6 commit c4a97db
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 22 deletions.
3 changes: 2 additions & 1 deletion receiver/hostmetricsreceiver/hostmetrics_receiver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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",
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}

Expand Down Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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
}

0 comments on commit c4a97db

Please sign in to comment.