Skip to content

Commit

Permalink
Fix missing startTimestamp for processes scraper. (#3461)
Browse files Browse the repository at this point in the history
* Fix missing startTimestamp for processes scraper.

- Wire boot timestamp through to processes scraper (matches all other host metrics receivers).
- Add a more verbose output on timestmap failure for easier diagnostics when making failing changes to these tests.
- Update tests to ensure starttime is set in resulting metrics.

* Fix bug with start time calculation.
  • Loading branch information
jsuereth committed Jun 21, 2021
1 parent 2a4a0f3 commit 528e3d7
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,13 @@ func (s *scraper) start(context.Context, component.Host) error {
if err != nil {
return err
}

s.startTime = pdata.Timestamp(bootTime)
// bootTime is seconds since 1970, timestamps are in nanoseconds.
s.startTime = pdata.Timestamp(bootTime * 1e9)
return nil
}

func (s *scraper) scrape(_ context.Context) (pdata.MetricSlice, error) {
metrics := pdata.NewMetricSlice()
err := appendSystemSpecificProcessesMetrics(metrics, 0, s.misc)
err := appendSystemSpecificProcessesMetrics(metrics, s.startTime, 0, s.misc)
return metrics, err
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,6 @@ import (

const unixSystemSpecificMetricsLen = 0

func appendUnixSystemSpecificProcessesMetrics(metrics pdata.MetricSlice, startIndex int, now pdata.Timestamp, misc *load.MiscStat) error {
func appendUnixSystemSpecificProcessesMetrics(metrics pdata.MetricSlice, startTime pdata.Timestamp, startIndex int, now pdata.Timestamp, misc *load.MiscStat) error {
return nil
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ package processesscraper

import "go.opentelemetry.io/collector/consumer/pdata"

func appendSystemSpecificProcessesMetrics(metrics pdata.MetricSlice, startIndex int, miscFunc getMiscStats) error {
func appendSystemSpecificProcessesMetrics(metrics pdata.MetricSlice, startTime pdata.Timestamp, startIndex int, miscFunc getMiscStats) error {
return nil
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,15 @@ import (

const unixSystemSpecificMetricsLen = 1

func appendUnixSystemSpecificProcessesMetrics(metrics pdata.MetricSlice, startIndex int, now pdata.Timestamp, misc *load.MiscStat) error {
initializeProcessesCreatedMetric(metrics.At(startIndex), now, misc)
func appendUnixSystemSpecificProcessesMetrics(metrics pdata.MetricSlice, startTime pdata.Timestamp, startIndex int, now pdata.Timestamp, misc *load.MiscStat) error {
initializeProcessesCreatedMetric(metrics.At(startIndex), startTime, now, misc)
return nil
}

func initializeProcessesCreatedMetric(metric pdata.Metric, now pdata.Timestamp, misc *load.MiscStat) {
func initializeProcessesCreatedMetric(metric pdata.Metric, startTime, now pdata.Timestamp, misc *load.MiscStat) {
metadata.Metrics.SystemProcessesCreated.Init(metric)
ddp := metric.IntSum().DataPoints().AppendEmpty()
ddp.SetStartTimestamp(startTime)
ddp.SetTimestamp(now)
ddp.SetValue(int64(misc.ProcsCreated))
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,10 @@ import (

func TestScrape(t *testing.T) {
type testCase struct {
name string
miscFunc func() (*load.MiscStat, error)
expectedErr string
name string
miscFunc func() (*load.MiscStat, error)
expectedStartTime pdata.Timestamp
expectedErr string
}

testCases := []testCase{
Expand All @@ -47,6 +48,10 @@ func TestScrape(t *testing.T) {
miscFunc: func() (*load.MiscStat, error) { return nil, errors.New("err1") },
expectedErr: "err1",
},
{
name: "Validate Start Time",
expectedStartTime: 100 * 1e9,
},
}

for _, test := range testCases {
Expand All @@ -61,6 +66,9 @@ func TestScrape(t *testing.T) {

err := scraper.start(context.Background(), componenttest.NewNopHost())
require.NoError(t, err, "Failed to initialize processes scraper: %v", err)
if test.expectedStartTime != 0 {
scraper.startTime = test.expectedStartTime
}

metrics, err := scraper.scrape(context.Background())

Expand Down Expand Up @@ -88,25 +96,31 @@ func TestScrape(t *testing.T) {
assert.Equal(t, expectedMetricCount, metrics.Len())

if expectProcessesCountMetric {
assertProcessesCountMetricValid(t, metrics.At(0))
assertProcessesCountMetricValid(t, metrics.At(0), test.expectedStartTime)
}
if expectProcessesCreatedMetric {
assertProcessesCreatedMetricValid(t, metrics.At(1))
assertProcessesCreatedMetricValid(t, metrics.At(1), test.expectedStartTime)
}

internal.AssertSameTimeStampForAllMetrics(t, metrics)
})
}
}

func assertProcessesCountMetricValid(t *testing.T, metric pdata.Metric) {
func assertProcessesCountMetricValid(t *testing.T, metric pdata.Metric, startTime pdata.Timestamp) {
internal.AssertDescriptorEqual(t, metadata.Metrics.SystemProcessesCount.New(), metric)
if startTime != 0 {
internal.AssertIntSumMetricStartTimeEquals(t, metric, startTime)
}
assert.Equal(t, 2, metric.IntSum().DataPoints().Len())
internal.AssertIntSumMetricLabelHasValue(t, metric, 0, "status", "running")
internal.AssertIntSumMetricLabelHasValue(t, metric, 1, "status", "blocked")
}

func assertProcessesCreatedMetricValid(t *testing.T, metric pdata.Metric) {
func assertProcessesCreatedMetricValid(t *testing.T, metric pdata.Metric, startTime pdata.Timestamp) {
if startTime != 0 {
internal.AssertIntSumMetricStartTimeEquals(t, metric, startTime)
}
internal.AssertDescriptorEqual(t, metadata.Metrics.SystemProcessesCreated.New(), metric)
assert.Equal(t, 1, metric.IntSum().DataPoints().Len())
assert.Equal(t, 0, metric.IntSum().DataPoints().At(0).LabelsMap().Len())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,30 +31,31 @@ const (
unixMetricsLen = standardUnixMetricsLen + unixSystemSpecificMetricsLen
)

func appendSystemSpecificProcessesMetrics(metrics pdata.MetricSlice, startIndex int, miscFunc getMiscStats) error {
func appendSystemSpecificProcessesMetrics(metrics pdata.MetricSlice, startTime pdata.Timestamp, startIndex int, miscFunc getMiscStats) error {
now := pdata.TimestampFromTime(time.Now())
misc, err := miscFunc()
if err != nil {
return scrapererror.NewPartialScrapeError(err, unixMetricsLen)
}

metrics.Resize(startIndex + unixMetricsLen)
initializeProcessesCountMetric(metrics.At(startIndex+0), now, misc)
return appendUnixSystemSpecificProcessesMetrics(metrics, startIndex+1, now, misc)
initializeProcessesCountMetric(metrics.At(startIndex+0), startTime, now, misc)
return appendUnixSystemSpecificProcessesMetrics(metrics, startTime, startIndex+1, now, misc)
}

func initializeProcessesCountMetric(metric pdata.Metric, now pdata.Timestamp, misc *load.MiscStat) {
func initializeProcessesCountMetric(metric pdata.Metric, startTime pdata.Timestamp, now pdata.Timestamp, misc *load.MiscStat) {
metadata.Metrics.SystemProcessesCount.Init(metric)

ddps := metric.IntSum().DataPoints()
ddps.Resize(2)
initializeProcessesCountDataPoint(ddps.At(0), now, metadata.LabelProcessesStatus.Running, int64(misc.ProcsRunning))
initializeProcessesCountDataPoint(ddps.At(1), now, metadata.LabelProcessesStatus.Blocked, int64(misc.ProcsBlocked))
initializeProcessesCountDataPoint(ddps.At(0), startTime, now, metadata.LabelProcessesStatus.Running, int64(misc.ProcsRunning))
initializeProcessesCountDataPoint(ddps.At(1), startTime, now, metadata.LabelProcessesStatus.Blocked, int64(misc.ProcsBlocked))
}

func initializeProcessesCountDataPoint(dataPoint pdata.IntDataPoint, now pdata.Timestamp, statusLabel string, value int64) {
func initializeProcessesCountDataPoint(dataPoint pdata.IntDataPoint, startTime pdata.Timestamp, now pdata.Timestamp, statusLabel string, value int64) {
labelsMap := dataPoint.LabelsMap()
labelsMap.Insert(metadata.Labels.ProcessesStatus, statusLabel)
dataPoint.SetStartTimestamp(startTime)
dataPoint.SetTimestamp(now)
dataPoint.SetValue(value)
}
2 changes: 1 addition & 1 deletion receiver/hostmetricsreceiver/internal/testutils.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ func AssertDoubleSumMetricLabelExists(t *testing.T, metric pdata.Metric, index i
func AssertIntSumMetricStartTimeEquals(t *testing.T, metric pdata.Metric, startTime pdata.Timestamp) {
idps := metric.IntSum().DataPoints()
for i := 0; i < idps.Len(); i++ {
require.Equal(t, startTime, idps.At(i).StartTimestamp())
require.Equal(t, startTime, idps.At(i).StartTimestamp(), "Start time %d not found in metric point: %q", startTime, idps.At(i))
}
}

Expand Down

0 comments on commit 528e3d7

Please sign in to comment.