blob: e56187edfcfe31849a68e3c25d7ce4e9eb48e024 [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
#include "iceberg/metrics/commit_report.h"
#include "iceberg/snapshot.h"
#include "iceberg/util/string_util.h"
namespace iceberg {
std::unique_ptr<CommitMetrics> CommitMetrics::Make(MetricsContext& context) {
auto m = std::unique_ptr<CommitMetrics>(new CommitMetrics());
m->total_duration = context.GetTimer("total-duration", TimerUnit::kNanoseconds);
m->attempts = context.GetCounter("attempts");
return m;
}
std::unique_ptr<CommitMetrics> CommitMetrics::Noop() {
return CommitMetrics::Make(*MetricsContext::Noop());
}
CommitMetricsResult CommitMetrics::ToResult() const {
CommitMetricsResult result;
if (total_duration && !total_duration->IsNoop()) {
result.total_duration =
TimerResult{.unit = std::string(total_duration->Unit()),
.count = total_duration->Count(),
.total_duration = total_duration->TotalDuration()};
}
if (attempts && !attempts->IsNoop()) {
result.attempts = CounterResult{.unit = attempts->unit(), .value = attempts->value()};
}
return result;
}
CommitMetricsResult CommitMetricsResult::From(
const CommitMetrics& live_metrics,
const std::unordered_map<std::string, std::string>& snapshot_summary) {
auto result = live_metrics.ToResult();
auto count_field =
[&snapshot_summary](const std::string& key) -> std::optional<CounterResult> {
auto it = snapshot_summary.find(key);
if (it == snapshot_summary.end()) return std::nullopt;
auto parsed = StringUtils::ParseNumber<int64_t>(it->second);
if (!parsed.has_value()) return std::nullopt;
return CounterResult{.unit = CounterUnit::kCount, .value = parsed.value()};
};
auto bytes_field =
[&snapshot_summary](const std::string& key) -> std::optional<CounterResult> {
auto it = snapshot_summary.find(key);
if (it == snapshot_summary.end()) return std::nullopt;
auto parsed = StringUtils::ParseNumber<int64_t>(it->second);
if (!parsed.has_value()) return std::nullopt;
return CounterResult{.unit = CounterUnit::kBytes, .value = parsed.value()};
};
result.added_data_files = count_field(SnapshotSummaryFields::kAddedDataFiles);
result.removed_data_files = count_field(SnapshotSummaryFields::kDeletedDataFiles);
result.total_data_files = count_field(SnapshotSummaryFields::kTotalDataFiles);
result.added_delete_files = count_field(SnapshotSummaryFields::kAddedDeleteFiles);
result.added_equality_delete_files =
count_field(SnapshotSummaryFields::kAddedEqDeleteFiles);
result.added_positional_delete_files =
count_field(SnapshotSummaryFields::kAddedPosDeleteFiles);
result.added_dvs = count_field(SnapshotSummaryFields::kAddedDVs);
result.removed_delete_files = count_field(SnapshotSummaryFields::kRemovedDeleteFiles);
result.removed_positional_delete_files =
count_field(SnapshotSummaryFields::kRemovedPosDeleteFiles);
result.removed_dvs = count_field(SnapshotSummaryFields::kRemovedDVs);
result.removed_equality_delete_files =
count_field(SnapshotSummaryFields::kRemovedEqDeleteFiles);
result.total_delete_files = count_field(SnapshotSummaryFields::kTotalDeleteFiles);
result.added_records = count_field(SnapshotSummaryFields::kAddedRecords);
result.removed_records = count_field(SnapshotSummaryFields::kDeletedRecords);
result.total_records = count_field(SnapshotSummaryFields::kTotalRecords);
result.added_files_size_bytes = bytes_field(SnapshotSummaryFields::kAddedFileSize);
result.removed_files_size_bytes = bytes_field(SnapshotSummaryFields::kRemovedFileSize);
result.total_files_size_bytes = bytes_field(SnapshotSummaryFields::kTotalFileSize);
result.added_positional_deletes = count_field(SnapshotSummaryFields::kAddedPosDeletes);
result.removed_positional_deletes =
count_field(SnapshotSummaryFields::kRemovedPosDeletes);
result.total_positional_deletes = count_field(SnapshotSummaryFields::kTotalPosDeletes);
result.added_equality_deletes = count_field(SnapshotSummaryFields::kAddedEqDeletes);
result.removed_equality_deletes = count_field(SnapshotSummaryFields::kRemovedEqDeletes);
result.total_equality_deletes = count_field(SnapshotSummaryFields::kTotalEqDeletes);
result.kept_manifest_count = count_field(SnapshotSummaryFields::kManifestsKept);
result.created_manifest_count = count_field(SnapshotSummaryFields::kManifestsCreated);
result.replaced_manifest_count = count_field(SnapshotSummaryFields::kManifestsReplaced);
result.processed_manifest_entries_count =
count_field(SnapshotSummaryFields::kEntriesProcessed);
return result;
}
} // namespace iceberg