Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[receiver/dockerstats] Combine and simplify multiple blockio metrics by making "operation" an attribute #13445

Merged
57 changes: 9 additions & 48 deletions receiver/dockerstatsreceiver/documentation.md

Large diffs are not rendered by default.

3,410 changes: 389 additions & 3,021 deletions receiver/dockerstatsreceiver/internal/metadata/generated_metrics.go

Large diffs are not rendered by default.

67 changes: 19 additions & 48 deletions receiver/dockerstatsreceiver/metadata.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ attributes:
interface:
description: "Network interface."
type: string
operation:
description: "Type of BlockIO operation."
type: string

metrics:
# CPU
Expand Down Expand Up @@ -368,7 +371,7 @@ metrics:


# BlockIO
container.blockio.io_merged_recursive.read: &merged
container.blockio.io_merged_recursive:
enabled: true
description: "Number of bios/requests merged into requests belonging to this cgroup and its descendant cgroups."
extended_documentation: "[More docs](https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt)."
Expand All @@ -380,13 +383,9 @@ metrics:
attributes:
- device_major
- device_minor
container.blockio.io_merged_recursive.write: *merged
container.blockio.io_merged_recursive.sync: *merged
container.blockio.io_merged_recursive.async: *merged
container.blockio.io_merged_recursive.discard: *merged
container.blockio.io_merged_recursive.total: *merged
- operation

container.blockio.io_queued_recursive.read: &queued
container.blockio.io_queued_recursive:
enabled: true
description: "Number of requests queued up for this cgroup and its descendant cgroups."
extended_documentation: "[More docs](https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt)."
Expand All @@ -398,13 +397,9 @@ metrics:
attributes:
- device_major
- device_minor
container.blockio.io_queued_recursive.write: *queued
container.blockio.io_queued_recursive.sync: *queued
container.blockio.io_queued_recursive.async: *queued
container.blockio.io_queued_recursive.discard: *queued
container.blockio.io_queued_recursive.total: *queued
- operation

container.blockio.io_service_bytes_recursive.read: &service_bytes
container.blockio.io_service_bytes_recursive:
enabled: true
description: "Number of bytes transferred to/from the disk by the group and descendant groups."
extended_documentation: "[More docs](https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt)."
Expand All @@ -416,13 +411,9 @@ metrics:
attributes:
- device_major
- device_minor
container.blockio.io_service_bytes_recursive.write: *service_bytes
container.blockio.io_service_bytes_recursive.async: *service_bytes
container.blockio.io_service_bytes_recursive.sync: *service_bytes
container.blockio.io_service_bytes_recursive.discard: *service_bytes
container.blockio.io_service_bytes_recursive.total: *service_bytes
- operation

container.blockio.io_service_time_recursive.read: &service_time
container.blockio.io_service_time_recursive:
enabled: true
description: "Total amount of time in nanoseconds between request dispatch and request completion for the IOs done by this cgroup and descendant cgroups."
extended_documentation: "[More docs](https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt)."
Expand All @@ -434,13 +425,9 @@ metrics:
attributes:
- device_major
- device_minor
container.blockio.io_service_time_recursive.write: *service_time
container.blockio.io_service_time_recursive.async: *service_time
container.blockio.io_service_time_recursive.sync: *service_time
container.blockio.io_service_time_recursive.discard: *service_time
container.blockio.io_service_time_recursive.total: *service_time
- operation

container.blockio.io_serviced_recursive.read: &serviced
container.blockio.io_serviced_recursive:
enabled: true
description: "Number of IOs (bio) issued to the disk by the group and descendant groups."
extended_documentation: "[More docs](https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt)."
Expand All @@ -452,13 +439,9 @@ metrics:
attributes:
- device_major
- device_minor
container.blockio.io_serviced_recursive.write: *serviced
container.blockio.io_serviced_recursive.async: *serviced
container.blockio.io_serviced_recursive.sync: *serviced
container.blockio.io_serviced_recursive.discard: *serviced
container.blockio.io_serviced_recursive.total: *serviced
- operation

container.blockio.io_time_recursive.read: &time
container.blockio.io_time_recursive:
enabled: true
description: "Disk time allocated to cgroup (and descendant cgroups) per device in milliseconds."
extended_documentation: "[More docs](https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt)."
Expand All @@ -470,13 +453,9 @@ metrics:
attributes:
- device_major
- device_minor
container.blockio.io_time_recursive.write: *time
container.blockio.io_time_recursive.async: *time
container.blockio.io_time_recursive.sync: *time
container.blockio.io_time_recursive.discard: *time
container.blockio.io_time_recursive.total: *time
- operation

container.blockio.io_wait_time_recursive.read: &wait_time
container.blockio.io_wait_time_recursive:
enabled: true
description: "Total amount of time the IOs for this cgroup (and descendant cgroups) spent waiting in the scheduler queues for service."
extended_documentation: "[More docs](https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt)."
Expand All @@ -488,13 +467,9 @@ metrics:
attributes:
- device_major
- device_minor
container.blockio.io_wait_time_recursive.write: *wait_time
container.blockio.io_wait_time_recursive.async: *wait_time
container.blockio.io_wait_time_recursive.sync: *wait_time
container.blockio.io_wait_time_recursive.discard: *wait_time
container.blockio.io_wait_time_recursive.total: *wait_time
- operation

container.blockio.sectors_recursive.read: &sectors
container.blockio.sectors_recursive:
enabled: true
description: "Number of sectors transferred to/from disk by the group and descendant groups."
extended_documentation: "[More docs](https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt)."
Expand All @@ -506,11 +481,7 @@ metrics:
attributes:
- device_major
- device_minor
container.blockio.sectors_recursive.write: *sectors
container.blockio.sectors_recursive.sync: *sectors
container.blockio.sectors_recursive.async: *sectors
container.blockio.sectors_recursive.discard: *sectors
container.blockio.sectors_recursive.total: *sectors
- operation

# Network
container.network.io.usage.rx_bytes:
Expand Down
100 changes: 18 additions & 82 deletions receiver/dockerstatsreceiver/receiver_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ import (
"go.opentelemetry.io/collector/pdata/pmetric"
"go.opentelemetry.io/collector/receiver/scrapererror"
"go.uber.org/multierr"
"go.uber.org/zap"

"github.com/open-telemetry/opentelemetry-collector-contrib/internal/docker"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver/internal/metadata"
Expand Down Expand Up @@ -168,90 +167,27 @@ func (r *receiver) recordMemoryMetrics(now pcommon.Timestamp, memoryStats *dtype
}
}

type blkioRecorder func(now pcommon.Timestamp, val int64, devMaj string, devMin string)

type blkioMapper struct {
opToRecorderMap map[string]blkioRecorder
entries []dtypes.BlkioStatEntry
}
type blkioRecorder func(now pcommon.Timestamp, val int64, devMaj string, devMin string, operation string)

func (r *receiver) recordBlkioMetrics(now pcommon.Timestamp, blkioStats *dtypes.BlkioStats) {
// These maps can be avoided once the operation is changed to an attribute instead of being in the metric name
for _, blkioRecorder := range []blkioMapper{
{entries: blkioStats.IoMergedRecursive, opToRecorderMap: map[string]blkioRecorder{
"read": r.mb.RecordContainerBlockioIoMergedRecursiveReadDataPoint,
"write": r.mb.RecordContainerBlockioIoMergedRecursiveWriteDataPoint,
"sync": r.mb.RecordContainerBlockioIoMergedRecursiveSyncDataPoint,
"async": r.mb.RecordContainerBlockioIoMergedRecursiveAsyncDataPoint,
"discard": r.mb.RecordContainerBlockioIoMergedRecursiveDiscardDataPoint,
"total": r.mb.RecordContainerBlockioIoMergedRecursiveTotalDataPoint,
}},
{entries: blkioStats.IoQueuedRecursive, opToRecorderMap: map[string]blkioRecorder{
"read": r.mb.RecordContainerBlockioIoQueuedRecursiveReadDataPoint,
"write": r.mb.RecordContainerBlockioIoQueuedRecursiveWriteDataPoint,
"sync": r.mb.RecordContainerBlockioIoQueuedRecursiveSyncDataPoint,
"async": r.mb.RecordContainerBlockioIoQueuedRecursiveAsyncDataPoint,
"discard": r.mb.RecordContainerBlockioIoQueuedRecursiveDiscardDataPoint,
"total": r.mb.RecordContainerBlockioIoQueuedRecursiveTotalDataPoint,
}},
{entries: blkioStats.IoServiceBytesRecursive, opToRecorderMap: map[string]blkioRecorder{
"read": r.mb.RecordContainerBlockioIoServiceBytesRecursiveReadDataPoint,
"write": r.mb.RecordContainerBlockioIoServiceBytesRecursiveWriteDataPoint,
"sync": r.mb.RecordContainerBlockioIoServiceBytesRecursiveSyncDataPoint,
"async": r.mb.RecordContainerBlockioIoServiceBytesRecursiveAsyncDataPoint,
"discard": r.mb.RecordContainerBlockioIoServiceBytesRecursiveDiscardDataPoint,
"total": r.mb.RecordContainerBlockioIoServiceBytesRecursiveTotalDataPoint,
}},
{entries: blkioStats.IoServiceTimeRecursive, opToRecorderMap: map[string]blkioRecorder{
"read": r.mb.RecordContainerBlockioIoServiceTimeRecursiveReadDataPoint,
"write": r.mb.RecordContainerBlockioIoServiceTimeRecursiveWriteDataPoint,
"sync": r.mb.RecordContainerBlockioIoServiceTimeRecursiveSyncDataPoint,
"async": r.mb.RecordContainerBlockioIoServiceTimeRecursiveAsyncDataPoint,
"discard": r.mb.RecordContainerBlockioIoServiceTimeRecursiveDiscardDataPoint,
"total": r.mb.RecordContainerBlockioIoServiceTimeRecursiveTotalDataPoint,
}},
{entries: blkioStats.IoServicedRecursive, opToRecorderMap: map[string]blkioRecorder{
"read": r.mb.RecordContainerBlockioIoServicedRecursiveReadDataPoint,
"write": r.mb.RecordContainerBlockioIoServicedRecursiveWriteDataPoint,
"sync": r.mb.RecordContainerBlockioIoServicedRecursiveSyncDataPoint,
"async": r.mb.RecordContainerBlockioIoServicedRecursiveAsyncDataPoint,
"discard": r.mb.RecordContainerBlockioIoServicedRecursiveDiscardDataPoint,
"total": r.mb.RecordContainerBlockioIoServicedRecursiveTotalDataPoint,
}},
{entries: blkioStats.IoTimeRecursive, opToRecorderMap: map[string]blkioRecorder{
"read": r.mb.RecordContainerBlockioIoTimeRecursiveReadDataPoint,
"write": r.mb.RecordContainerBlockioIoTimeRecursiveWriteDataPoint,
"sync": r.mb.RecordContainerBlockioIoTimeRecursiveSyncDataPoint,
"async": r.mb.RecordContainerBlockioIoTimeRecursiveAsyncDataPoint,
"discard": r.mb.RecordContainerBlockioIoTimeRecursiveDiscardDataPoint,
"total": r.mb.RecordContainerBlockioIoTimeRecursiveTotalDataPoint,
}},
{entries: blkioStats.IoWaitTimeRecursive, opToRecorderMap: map[string]blkioRecorder{
"read": r.mb.RecordContainerBlockioIoWaitTimeRecursiveReadDataPoint,
"write": r.mb.RecordContainerBlockioIoWaitTimeRecursiveWriteDataPoint,
"sync": r.mb.RecordContainerBlockioIoWaitTimeRecursiveSyncDataPoint,
"async": r.mb.RecordContainerBlockioIoWaitTimeRecursiveAsyncDataPoint,
"discard": r.mb.RecordContainerBlockioIoWaitTimeRecursiveDiscardDataPoint,
"total": r.mb.RecordContainerBlockioIoWaitTimeRecursiveTotalDataPoint,
}},
{entries: blkioStats.SectorsRecursive, opToRecorderMap: map[string]blkioRecorder{
"read": r.mb.RecordContainerBlockioSectorsRecursiveReadDataPoint,
"write": r.mb.RecordContainerBlockioSectorsRecursiveWriteDataPoint,
"sync": r.mb.RecordContainerBlockioSectorsRecursiveSyncDataPoint,
"async": r.mb.RecordContainerBlockioSectorsRecursiveAsyncDataPoint,
"discard": r.mb.RecordContainerBlockioSectorsRecursiveDiscardDataPoint,
"total": r.mb.RecordContainerBlockioSectorsRecursiveTotalDataPoint,
}},
} {
for _, entry := range blkioRecorder.entries {
recorder, ok := blkioRecorder.opToRecorderMap[strings.ToLower(entry.Op)]
if !ok {
r.settings.Logger.Debug("Unknown operation in blockIO stats.", zap.String("operation", entry.Op))
continue
}
recorder(now, int64(entry.Value), strconv.FormatUint(entry.Major, 10), strconv.FormatUint(entry.Minor, 10))
}
recordSingleBlkioStat(now, blkioStats.IoMergedRecursive, r.mb.RecordContainerBlockioIoMergedRecursiveDataPoint)
recordSingleBlkioStat(now, blkioStats.IoQueuedRecursive, r.mb.RecordContainerBlockioIoQueuedRecursiveDataPoint)
recordSingleBlkioStat(now, blkioStats.IoServiceBytesRecursive, r.mb.RecordContainerBlockioIoServiceBytesRecursiveDataPoint)
recordSingleBlkioStat(now, blkioStats.IoServiceTimeRecursive, r.mb.RecordContainerBlockioIoServiceTimeRecursiveDataPoint)
recordSingleBlkioStat(now, blkioStats.IoServicedRecursive, r.mb.RecordContainerBlockioIoServicedRecursiveDataPoint)
recordSingleBlkioStat(now, blkioStats.IoTimeRecursive, r.mb.RecordContainerBlockioIoTimeRecursiveDataPoint)
recordSingleBlkioStat(now, blkioStats.IoWaitTimeRecursive, r.mb.RecordContainerBlockioIoWaitTimeRecursiveDataPoint)
recordSingleBlkioStat(now, blkioStats.SectorsRecursive, r.mb.RecordContainerBlockioSectorsRecursiveDataPoint)
}

func recordSingleBlkioStat(now pcommon.Timestamp, statEntries []dtypes.BlkioStatEntry, recorder blkioRecorder) {
for _, stat := range statEntries {
recorder(
now,
int64(stat.Value),
strconv.FormatUint(stat.Major, 10),
strconv.FormatUint(stat.Minor, 10),
strings.ToLower(stat.Op))
}
}

Expand Down
Loading