blob: 3113dd13b98eff3df4bbf3a26d6b392dbd201f78 [file] [log] [blame] [edit]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/storage/blobfs/read-metrics.h"
#include "src/storage/blobfs/compression-settings.h"
namespace blobfs {
ReadMetrics::ReadMetrics(inspect::Node* read_metrics_node)
: uncompressed_metrics_(read_metrics_node->CreateChild("uncompressed")),
lz4_metrics_(read_metrics_node->CreateChild("lz4")),
zstd_metrics_(read_metrics_node->CreateChild("zstd")),
zstd_seekable_metrics_(read_metrics_node->CreateChild("zstd_seekable")),
chunked_metrics_(read_metrics_node->CreateChild("chunked")),
remote_decompressions_node_(
read_metrics_node->CreateUint("remote_decompressions", remote_decompressions_)) {}
ReadMetrics::PerCompressionMetrics::PerCompressionMetrics(inspect::Node node)
: parent_node(std::move(node)),
read_ticks_node(parent_node.CreateInt("read_ticks", read_ticks.get())),
read_bytes_node(parent_node.CreateUint("read_bytes", read_bytes)),
decompress_ticks_node(parent_node.CreateInt("decompress_ticks", decompress_ticks.get())),
decompress_bytes_node(parent_node.CreateUint("decompress_bytes", decompress_bytes)) {}
ReadMetrics::PerCompressionMetrics* ReadMetrics::GetMetrics(CompressionAlgorithm algorithm) {
switch (algorithm) {
case CompressionAlgorithm::UNCOMPRESSED:
return &uncompressed_metrics_;
case CompressionAlgorithm::LZ4:
return &lz4_metrics_;
case CompressionAlgorithm::ZSTD:
return &zstd_metrics_;
case CompressionAlgorithm::CHUNKED:
return &chunked_metrics_;
case CompressionAlgorithm::ZSTD_SEEKABLE:
return &zstd_seekable_metrics_;
}
}
void ReadMetrics::IncrementDiskRead(CompressionAlgorithm algorithm, uint64_t read_size,
fs::Duration read_duration) {
auto metrics = GetMetrics(algorithm);
metrics->read_ticks += read_duration;
metrics->read_bytes += read_size;
metrics->read_ticks_node.Add(read_duration.get());
metrics->read_bytes_node.Add(read_size);
}
void ReadMetrics::IncrementDecompression(CompressionAlgorithm algorithm, uint64_t decompressed_size,
fs::Duration decompress_duration, bool remote) {
auto metrics = GetMetrics(algorithm);
metrics->decompress_ticks += decompress_duration;
metrics->decompress_bytes += decompressed_size;
metrics->decompress_ticks_node.Add(decompress_duration.get());
metrics->decompress_bytes_node.Add(decompressed_size);
if (remote) {
remote_decompressions_++;
remote_decompressions_node_.Add(1);
}
}
ReadMetrics::PerCompressionSnapshot ReadMetrics::GetSnapshot(CompressionAlgorithm algorithm) {
auto metrics = GetMetrics(algorithm);
return PerCompressionSnapshot{
.read_ticks = metrics->read_ticks.get(),
.read_bytes = metrics->read_bytes,
.decompress_ticks = metrics->decompress_ticks.get(),
.decompress_bytes = metrics->decompress_bytes,
};
}
} // namespace blobfs