diff --git a/receiver/hostmetricsreceiver/internal/metadata/generated_metrics.go b/receiver/hostmetricsreceiver/internal/metadata/generated_metrics.go index 1848f0f7af0..479dcea18f4 100644 --- a/receiver/hostmetricsreceiver/internal/metadata/generated_metrics.go +++ b/receiver/hostmetricsreceiver/internal/metadata/generated_metrics.go @@ -55,6 +55,10 @@ func (m *metricImpl) Init(metric pdata.Metric) { } type metricStruct struct { + ProcessCPUTime MetricIntf + ProcessDiskIo MetricIntf + ProcessMemoryPhysicalUsage MetricIntf + ProcessMemoryVirtualUsage MetricIntf SystemCPULoadAverage15m MetricIntf SystemCPULoadAverage1m MetricIntf SystemCPULoadAverage5m MetricIntf @@ -84,6 +88,10 @@ type metricStruct struct { // Names returns a list of all the metric name strings. func (m *metricStruct) Names() []string { return []string{ + "process.cpu.time", + "process.disk.io", + "process.memory.physical_usage", + "process.memory.virtual_usage", "system.cpu.load_average.15m", "system.cpu.load_average.1m", "system.cpu.load_average.5m", @@ -112,6 +120,10 @@ func (m *metricStruct) Names() []string { } var metricsByName = map[string]MetricIntf{ + "process.cpu.time": Metrics.ProcessCPUTime, + "process.disk.io": Metrics.ProcessDiskIo, + "process.memory.physical_usage": Metrics.ProcessMemoryPhysicalUsage, + "process.memory.virtual_usage": Metrics.ProcessMemoryVirtualUsage, "system.cpu.load_average.15m": Metrics.SystemCPULoadAverage15m, "system.cpu.load_average.1m": Metrics.SystemCPULoadAverage1m, "system.cpu.load_average.5m": Metrics.SystemCPULoadAverage5m, @@ -144,6 +156,10 @@ func (m *metricStruct) ByName(n string) MetricIntf { func (m *metricStruct) FactoriesByName() map[string]func() pdata.Metric { return map[string]func() pdata.Metric{ + Metrics.ProcessCPUTime.Name(): Metrics.ProcessCPUTime.New, + Metrics.ProcessDiskIo.Name(): Metrics.ProcessDiskIo.New, + Metrics.ProcessMemoryPhysicalUsage.Name(): Metrics.ProcessMemoryPhysicalUsage.New, + Metrics.ProcessMemoryVirtualUsage.Name(): Metrics.ProcessMemoryVirtualUsage.New, Metrics.SystemCPULoadAverage15m.Name(): Metrics.SystemCPULoadAverage15m.New, Metrics.SystemCPULoadAverage1m.Name(): Metrics.SystemCPULoadAverage1m.New, Metrics.SystemCPULoadAverage5m.Name(): Metrics.SystemCPULoadAverage5m.New, @@ -174,6 +190,50 @@ func (m *metricStruct) FactoriesByName() map[string]func() pdata.Metric { // Metrics contains a set of methods for each metric that help with // manipulating those metrics. var Metrics = &metricStruct{ + &metricImpl{ + "process.cpu.time", + func(metric pdata.Metric) { + metric.SetName("process.cpu.time") + metric.SetDescription("Total CPU seconds broken down by different states.") + metric.SetUnit("s") + metric.SetDataType(pdata.MetricDataTypeDoubleSum) + metric.DoubleSum().SetIsMonotonic(true) + metric.DoubleSum().SetAggregationTemporality(pdata.AggregationTemporalityCumulative) + }, + }, + &metricImpl{ + "process.disk.io", + func(metric pdata.Metric) { + metric.SetName("process.disk.io") + metric.SetDescription("Disk bytes transferred.") + metric.SetUnit("By") + metric.SetDataType(pdata.MetricDataTypeIntSum) + metric.IntSum().SetIsMonotonic(true) + metric.IntSum().SetAggregationTemporality(pdata.AggregationTemporalityCumulative) + }, + }, + &metricImpl{ + "process.memory.physical_usage", + func(metric pdata.Metric) { + metric.SetName("process.memory.physical_usage") + metric.SetDescription("The amount of physical memory in use.") + metric.SetUnit("By") + metric.SetDataType(pdata.MetricDataTypeIntSum) + metric.IntSum().SetIsMonotonic(false) + metric.IntSum().SetAggregationTemporality(pdata.AggregationTemporalityCumulative) + }, + }, + &metricImpl{ + "process.memory.virtual_usage", + func(metric pdata.Metric) { + metric.SetName("process.memory.virtual_usage") + metric.SetDescription("Virtual memory size.") + metric.SetUnit("By") + metric.SetDataType(pdata.MetricDataTypeIntSum) + metric.IntSum().SetIsMonotonic(false) + metric.IntSum().SetAggregationTemporality(pdata.AggregationTemporalityCumulative) + }, + }, &metricImpl{ "system.cpu.load_average.15m", func(metric pdata.Metric) { @@ -476,6 +536,10 @@ var Labels = struct { PagingState string // PagingType (Type of fault.) PagingType string + // ProcessDirection (Direction of flow of bytes (read or write).) + ProcessDirection string + // ProcessState (Breakdown of CPU usage by type.) + ProcessState string // ProcessesStatus (Breakdown status of the processes.) ProcessesStatus string }{ @@ -497,6 +561,8 @@ var Labels = struct { "direction", "state", "type", + "direction", + "state", "status", } @@ -609,6 +675,26 @@ var LabelPagingType = struct { "minor", } +// LabelProcessDirection are the possible values that the label "process.direction" can have. +var LabelProcessDirection = struct { + Read string + Write string +}{ + "read", + "write", +} + +// LabelProcessState are the possible values that the label "process.state" can have. +var LabelProcessState = struct { + System string + User string + Wait string +}{ + "system", + "user", + "wait", +} + // LabelProcessesStatus are the possible values that the label "processes.status" can have. var LabelProcessesStatus = struct { Blocked string diff --git a/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_metadata.go b/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_metadata.go deleted file mode 100644 index 449f05e2a56..00000000000 --- a/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_metadata.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright The OpenTelemetry Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package processscraper - -import ( - "go.opentelemetry.io/collector/consumer/pdata" -) - -// labels - -const ( - directionLabelName = "direction" - stateLabelName = "state" -) - -// direction label values - -const ( - readDirectionLabelValue = "read" - writeDirectionLabelValue = "write" -) - -// state label values - -const ( - userStateLabelValue = "user" - systemStateLabelValue = "system" - waitStateLabelValue = "wait" -) - -// descriptors - -var cpuTimeDescriptor = func() pdata.Metric { - metric := pdata.NewMetric() - metric.SetName("process.cpu.time") - metric.SetDescription("Total CPU seconds broken down by different states.") - metric.SetUnit("s") - metric.SetDataType(pdata.MetricDataTypeDoubleSum) - sum := metric.DoubleSum() - sum.SetIsMonotonic(true) - sum.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) - return metric -}() - -var physicalMemoryUsageDescriptor = func() pdata.Metric { - metric := pdata.NewMetric() - metric.SetName("process.memory.physical_usage") - metric.SetDescription("The amount of physical memory in use.") - metric.SetUnit("bytes") - metric.SetDataType(pdata.MetricDataTypeIntSum) - sum := metric.IntSum() - sum.SetIsMonotonic(false) - sum.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) - return metric -}() - -var virtualMemoryUsageDescriptor = func() pdata.Metric { - metric := pdata.NewMetric() - metric.SetName("process.memory.virtual_usage") - metric.SetDescription("Virtual memory size.") - metric.SetUnit("bytes") - metric.SetDataType(pdata.MetricDataTypeIntSum) - sum := metric.IntSum() - sum.SetIsMonotonic(false) - sum.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) - return metric -}() - -var diskIODescriptor = func() pdata.Metric { - metric := pdata.NewMetric() - metric.SetName("process.disk.io") - metric.SetDescription("Disk bytes transferred.") - metric.SetUnit("bytes") - metric.SetDataType(pdata.MetricDataTypeIntSum) - sum := metric.IntSum() - sum.SetIsMonotonic(true) - sum.SetAggregationTemporality(pdata.AggregationTemporalityCumulative) - return metric -}() diff --git a/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper.go b/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper.go index 8588b6c75c1..8c73d2bafa8 100644 --- a/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper.go +++ b/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper.go @@ -28,6 +28,7 @@ import ( "go.opentelemetry.io/collector/consumer/pdata" "go.opentelemetry.io/collector/internal/processor/filterset" "go.opentelemetry.io/collector/receiver/hostmetricsreceiver/internal" + "go.opentelemetry.io/collector/receiver/hostmetricsreceiver/internal/metadata" "go.opentelemetry.io/collector/receiver/scraperhelper" ) @@ -190,7 +191,7 @@ func scrapeAndAppendCPUTimeMetric(metrics pdata.MetricSlice, startTime, now pdat } func initializeCPUTimeMetric(metric pdata.Metric, startTime, now pdata.TimestampUnixNano, times *cpu.TimesStat) { - cpuTimeDescriptor.CopyTo(metric) + metadata.Metrics.ProcessCPUTime.Init(metric) ddps := metric.DoubleSum().DataPoints() ddps.Resize(cpuStatesLen) @@ -205,8 +206,8 @@ func scrapeAndAppendMemoryUsageMetrics(metrics pdata.MetricSlice, now pdata.Time startIdx := metrics.Len() metrics.Resize(startIdx + memoryMetricsLen) - initializeMemoryUsageMetric(metrics.At(startIdx+0), physicalMemoryUsageDescriptor, now, int64(mem.RSS)) - initializeMemoryUsageMetric(metrics.At(startIdx+1), virtualMemoryUsageDescriptor, now, int64(mem.VMS)) + initializeMemoryUsageMetric(metrics.At(startIdx+0), metadata.Metrics.ProcessMemoryPhysicalUsage.New(), now, int64(mem.RSS)) + initializeMemoryUsageMetric(metrics.At(startIdx+1), metadata.Metrics.ProcessMemoryVirtualUsage.New(), now, int64(mem.VMS)) return nil } @@ -236,17 +237,17 @@ func scrapeAndAppendDiskIOMetric(metrics pdata.MetricSlice, startTime, now pdata } func initializeDiskIOMetric(metric pdata.Metric, startTime, now pdata.TimestampUnixNano, io *process.IOCountersStat) { - diskIODescriptor.CopyTo(metric) + metadata.Metrics.ProcessDiskIo.Init(metric) idps := metric.IntSum().DataPoints() idps.Resize(2) - initializeDiskIODataPoint(idps.At(0), startTime, now, int64(io.ReadBytes), readDirectionLabelValue) - initializeDiskIODataPoint(idps.At(1), startTime, now, int64(io.WriteBytes), writeDirectionLabelValue) + initializeDiskIODataPoint(idps.At(0), startTime, now, int64(io.ReadBytes), metadata.LabelProcessDirection.Read) + initializeDiskIODataPoint(idps.At(1), startTime, now, int64(io.WriteBytes), metadata.LabelProcessDirection.Write) } func initializeDiskIODataPoint(dataPoint pdata.IntDataPoint, startTime, now pdata.TimestampUnixNano, value int64, directionLabel string) { labelsMap := dataPoint.LabelsMap() - labelsMap.Insert(directionLabelName, directionLabel) + labelsMap.Insert(metadata.Labels.ProcessDirection, directionLabel) dataPoint.SetStartTime(startTime) dataPoint.SetTimestamp(now) dataPoint.SetValue(value) diff --git a/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper_linux.go b/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper_linux.go index 62dc40cde23..cb115287100 100644 --- a/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper_linux.go +++ b/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper_linux.go @@ -20,19 +20,20 @@ import ( "github.com/shirou/gopsutil/cpu" "go.opentelemetry.io/collector/consumer/pdata" + "go.opentelemetry.io/collector/receiver/hostmetricsreceiver/internal/metadata" ) const cpuStatesLen = 3 func appendCPUTimeStateDataPoints(ddps pdata.DoubleDataPointSlice, startTime, now pdata.TimestampUnixNano, cpuTime *cpu.TimesStat) { - initializeCPUTimeDataPoint(ddps.At(0), startTime, now, cpuTime.User, userStateLabelValue) - initializeCPUTimeDataPoint(ddps.At(1), startTime, now, cpuTime.System, systemStateLabelValue) - initializeCPUTimeDataPoint(ddps.At(2), startTime, now, cpuTime.Iowait, waitStateLabelValue) + initializeCPUTimeDataPoint(ddps.At(0), startTime, now, cpuTime.User, metadata.LabelProcessState.User) + initializeCPUTimeDataPoint(ddps.At(1), startTime, now, cpuTime.System, metadata.LabelProcessState.System) + initializeCPUTimeDataPoint(ddps.At(2), startTime, now, cpuTime.Iowait, metadata.LabelProcessState.Wait) } func initializeCPUTimeDataPoint(dataPoint pdata.DoubleDataPoint, startTime, now pdata.TimestampUnixNano, value float64, stateLabel string) { labelsMap := dataPoint.LabelsMap() - labelsMap.Insert(stateLabelName, stateLabel) + labelsMap.Insert(metadata.Labels.ProcessState, stateLabel) dataPoint.SetStartTime(startTime) dataPoint.SetTimestamp(now) dataPoint.SetValue(value) diff --git a/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper_test.go b/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper_test.go index bb836907ec2..4cb387cb864 100644 --- a/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper_test.go +++ b/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper_test.go @@ -32,6 +32,7 @@ import ( "go.opentelemetry.io/collector/consumer/pdata" "go.opentelemetry.io/collector/internal/processor/filterset" "go.opentelemetry.io/collector/receiver/hostmetricsreceiver/internal" + "go.opentelemetry.io/collector/receiver/hostmetricsreceiver/internal/metadata" "go.opentelemetry.io/collector/translator/conventions" ) @@ -72,8 +73,8 @@ func TestScrape(t *testing.T) { require.Greater(t, resourceMetrics.Len(), 1) assertProcessResourceAttributesExist(t, resourceMetrics) assertCPUTimeMetricValid(t, resourceMetrics, expectedStartTime) - assertMemoryUsageMetricValid(t, physicalMemoryUsageDescriptor, resourceMetrics) - assertMemoryUsageMetricValid(t, virtualMemoryUsageDescriptor, resourceMetrics) + assertMemoryUsageMetricValid(t, metadata.Metrics.ProcessMemoryPhysicalUsage.New(), resourceMetrics) + assertMemoryUsageMetricValid(t, metadata.Metrics.ProcessMemoryVirtualUsage.New(), resourceMetrics) assertDiskIOMetricValid(t, resourceMetrics, expectedStartTime) assertSameTimeStampForAllMetricsWithinResource(t, resourceMetrics) } @@ -91,15 +92,15 @@ func assertProcessResourceAttributesExist(t *testing.T, resourceMetrics pdata.Re } func assertCPUTimeMetricValid(t *testing.T, resourceMetrics pdata.ResourceMetricsSlice, startTime pdata.TimestampUnixNano) { - cpuTimeMetric := getMetric(t, cpuTimeDescriptor, resourceMetrics) - internal.AssertDescriptorEqual(t, cpuTimeDescriptor, cpuTimeMetric) + cpuTimeMetric := getMetric(t, metadata.Metrics.ProcessCPUTime.New(), resourceMetrics) + internal.AssertDescriptorEqual(t, metadata.Metrics.ProcessCPUTime.New(), cpuTimeMetric) if startTime != 0 { internal.AssertDoubleSumMetricStartTimeEquals(t, cpuTimeMetric, startTime) } - internal.AssertDoubleSumMetricLabelHasValue(t, cpuTimeMetric, 0, stateLabelName, userStateLabelValue) - internal.AssertDoubleSumMetricLabelHasValue(t, cpuTimeMetric, 1, stateLabelName, systemStateLabelValue) + internal.AssertDoubleSumMetricLabelHasValue(t, cpuTimeMetric, 0, "state", "user") + internal.AssertDoubleSumMetricLabelHasValue(t, cpuTimeMetric, 1, "state", "system") if runtime.GOOS == "linux" { - internal.AssertDoubleSumMetricLabelHasValue(t, cpuTimeMetric, 2, stateLabelName, waitStateLabelValue) + internal.AssertDoubleSumMetricLabelHasValue(t, cpuTimeMetric, 2, "state", "wait") } } @@ -109,13 +110,13 @@ func assertMemoryUsageMetricValid(t *testing.T, descriptor pdata.Metric, resourc } func assertDiskIOMetricValid(t *testing.T, resourceMetrics pdata.ResourceMetricsSlice, startTime pdata.TimestampUnixNano) { - diskIOMetric := getMetric(t, diskIODescriptor, resourceMetrics) - internal.AssertDescriptorEqual(t, diskIODescriptor, diskIOMetric) + diskIOMetric := getMetric(t, metadata.Metrics.ProcessDiskIo.New(), resourceMetrics) + internal.AssertDescriptorEqual(t, metadata.Metrics.ProcessDiskIo.New(), diskIOMetric) if startTime != 0 { internal.AssertIntSumMetricStartTimeEquals(t, diskIOMetric, startTime) } - internal.AssertIntSumMetricLabelHasValue(t, diskIOMetric, 0, directionLabelName, readDirectionLabelValue) - internal.AssertIntSumMetricLabelHasValue(t, diskIOMetric, 1, directionLabelName, writeDirectionLabelValue) + internal.AssertIntSumMetricLabelHasValue(t, diskIOMetric, 0, "direction", "read") + internal.AssertIntSumMetricLabelHasValue(t, diskIOMetric, 1, "direction", "write") } func assertSameTimeStampForAllMetricsWithinResource(t *testing.T, resourceMetrics pdata.ResourceMetricsSlice) { diff --git a/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper_windows.go b/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper_windows.go index 45d0dfd345c..49b49db165a 100644 --- a/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper_windows.go +++ b/receiver/hostmetricsreceiver/internal/scraper/processscraper/process_scraper_windows.go @@ -23,18 +23,19 @@ import ( "github.com/shirou/gopsutil/cpu" "go.opentelemetry.io/collector/consumer/pdata" + "go.opentelemetry.io/collector/receiver/hostmetricsreceiver/internal/metadata" ) const cpuStatesLen = 2 func appendCPUTimeStateDataPoints(ddps pdata.DoubleDataPointSlice, startTime, now pdata.TimestampUnixNano, cpuTime *cpu.TimesStat) { - initializeCPUTimeDataPoint(ddps.At(0), startTime, now, cpuTime.User, userStateLabelValue) - initializeCPUTimeDataPoint(ddps.At(1), startTime, now, cpuTime.System, systemStateLabelValue) + initializeCPUTimeDataPoint(ddps.At(0), startTime, now, cpuTime.User, metadata.LabelProcessState.User) + initializeCPUTimeDataPoint(ddps.At(1), startTime, now, cpuTime.System, metadata.LabelProcessState.System) } func initializeCPUTimeDataPoint(dataPoint pdata.DoubleDataPoint, startTime, now pdata.TimestampUnixNano, value float64, stateLabel string) { labelsMap := dataPoint.LabelsMap() - labelsMap.Insert(stateLabelName, stateLabel) + labelsMap.Insert(metadata.Labels.ProcessState, stateLabel) dataPoint.SetStartTime(startTime) dataPoint.SetTimestamp(now) dataPoint.SetValue(value) diff --git a/receiver/hostmetricsreceiver/metadata.yaml b/receiver/hostmetricsreceiver/metadata.yaml index db47021ab14..d53890fbd66 100644 --- a/receiver/hostmetricsreceiver/metadata.yaml +++ b/receiver/hostmetricsreceiver/metadata.yaml @@ -81,12 +81,54 @@ labels: description: Type of fault. enum: [major, minor] + process.direction: + value: direction + description: Direction of flow of bytes (read or write). + enum: [read, write] + + process.state: + value: state + description: Breakdown of CPU usage by type. + enum: [system, user, wait] + processes.status: value: status description: Breakdown status of the processes. enum: [blocked, running] metrics: + process.cpu.time: + description: Total CPU seconds broken down by different states. + unit: s + data: + type: double sum + aggregation: cumulative + monotonic: true + + process.memory.physical_usage: + description: The amount of physical memory in use. + unit: By + data: + type: int sum + aggregation: cumulative + monotonic: false + + process.memory.virtual_usage: + description: Virtual memory size. + unit: By + data: + type: int sum + aggregation: cumulative + monotonic: false + + process.disk.io: + description: Disk bytes transferred. + unit: By + data: + type: int sum + aggregation: cumulative + monotonic: true + system.cpu.time: description: Total CPU seconds broken down by different states. unit: s