| /* |
| * 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 |