func remapFilesystemMetrics()

in remappers/hostmetrics/filesystem.go [43:106]


func remapFilesystemMetrics(
	src, out pmetric.MetricSlice,
	_ pcommon.Resource,
	mutator func(pmetric.NumberDataPoint),
) error {
	var timestamp pcommon.Timestamp
	deviceMetricsMap := make(map[deviceKey]*deviceMetrics)
	for i := 0; i < src.Len(); i++ {
		metric := src.At(i)
		switch metric.Name() {
		case "system.filesystem.usage", "system.filesystem.inodes.usage":
			dataPoints := metric.Sum().DataPoints()
			for j := 0; j < dataPoints.Len(); j++ {
				dp := dataPoints.At(j)
				value := dp.IntValue()
				timestamp = dp.Timestamp()
				key, ok := getDeviceKey(dp)
				if !ok {
					continue
				}
				if _, exists := deviceMetricsMap[key]; !exists {
					deviceMetricsMap[key] = &deviceMetrics{}
				}
				dmetrics := deviceMetricsMap[key]
				if state, ok := dp.Attributes().Get("state"); ok {
					switch state.Str() {
					case "used":
						if metric.Name() == "system.filesystem.usage" {
							dmetrics.totalUsage += value
							dmetrics.usedBytes += value
							addFileSystemMetrics(out, timestamp, mutator, "system.filesystem.used.bytes", key.device, key.mpoint, key.fstype, value)
						} else {
							dmetrics.totalInodeUsage += value
						}
					case "free":
						if metric.Name() == "system.filesystem.usage" {
							dmetrics.totalUsage += value
							addFileSystemMetrics(out, timestamp, mutator, "system.filesystem.free", key.device, key.mpoint, key.fstype, value)
							addFileSystemMetrics(out, timestamp, mutator, "system.filesystem.available", key.device, key.mpoint, key.fstype, value)
						} else {
							dmetrics.totalInodeUsage += value
							addFileSystemMetrics(out, timestamp, mutator, "system.filesystem.free_files", key.device, key.mpoint, key.fstype, value)
						}
					}
				}
			}

		}
	}

	for key, dmetrics := range deviceMetricsMap {
		device, mpoint, fstype := key.device, key.mpoint, key.fstype
		if dmetrics.totalUsage > 0 {
			addFileSystemMetrics(out, timestamp, mutator, "system.filesystem.total", device, mpoint, fstype, dmetrics.totalUsage)
			usedPercentage := float64(dmetrics.usedBytes) / float64(dmetrics.totalUsage)
			addFileSystemMetrics(out, timestamp, mutator, "system.filesystem.used.pct", device, mpoint, fstype, usedPercentage)
		}
		if dmetrics.totalInodeUsage > 0 {
			addFileSystemMetrics(out, timestamp, mutator, "system.filesystem.files", device, mpoint, fstype, dmetrics.totalInodeUsage)
		}

	}
	return nil
}