blob: 240d9134572e9223f697c3116c77ca536278118e [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 "paimon/core/operation/metrics/commit_metrics.h"
#include <cstdint>
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "gtest/gtest.h"
#include "paimon/common/data/binary_row_writer.h"
#include "paimon/common/metrics/metrics_impl.h"
#include "paimon/core/io/data_file_meta.h"
#include "paimon/core/manifest/file_kind.h"
#include "paimon/core/manifest/manifest_entry.h"
#include "paimon/core/operation/metrics/commit_stats.h"
#include "paimon/core/stats/simple_stats.h"
#include "paimon/data/timestamp.h"
#include "paimon/testing/utils/testharness.h"
namespace paimon::test {
namespace {
BinaryRow CreateIntRow(int32_t value) {
BinaryRow row(1);
BinaryRowWriter writer(&row, 20, GetDefaultPool().get());
writer.WriteInt(0, value);
writer.Complete();
return row;
}
ManifestEntry CreateEntry(const FileKind& kind, int32_t partition, int32_t bucket,
int64_t row_count, int64_t file_size, const std::string& file_name) {
BinaryRow part = CreateIntRow(partition);
auto file_meta = std::make_shared<DataFileMeta>(
file_name, file_size, row_count, DataFileMeta::EmptyMinKey(), DataFileMeta::EmptyMaxKey(),
SimpleStats::EmptyStats(), SimpleStats::EmptyStats(),
/*min_sequence_number=*/0, /*max_sequence_number=*/0,
/*schema_id=*/1, /*level=*/0,
/*extra_files=*/std::vector<std::optional<std::string>>(),
/*creation_time=*/Timestamp(0, 0),
/*delete_row_count=*/std::nullopt,
/*embedded_index=*/nullptr, FileSource::Append(),
/*value_stats_cols=*/std::nullopt,
/*external_path=*/std::nullopt,
/*first_row_id=*/std::nullopt,
/*write_cols=*/std::nullopt);
return ManifestEntry(kind, part, bucket, /*total_buckets=*/10, file_meta);
}
} // namespace
TEST(CommitMetricsTest, TestSimple) {
auto commit_metrics = std::make_shared<MetricsImpl>();
commit_metrics->SetCounter("some_metric", 100);
commit_metrics->SetCounter(CommitMetrics::LAST_COMMIT_ATTEMPTS, 30);
ASSERT_OK_AND_ASSIGN(uint64_t counter,
commit_metrics->GetCounter(CommitMetrics::LAST_COMMIT_ATTEMPTS));
ASSERT_EQ(30, counter);
ASSERT_OK_AND_ASSIGN(counter, commit_metrics->GetCounter("some_metric"));
ASSERT_EQ(100, counter);
auto other = std::make_shared<MetricsImpl>();
other->SetCounter("some_metric_2", 200);
other->SetCounter(CommitMetrics::LAST_COMMIT_ATTEMPTS, 50);
commit_metrics->Merge(other);
ASSERT_OK_AND_ASSIGN(counter, commit_metrics->GetCounter(CommitMetrics::LAST_COMMIT_ATTEMPTS));
ASSERT_EQ(80, counter);
ASSERT_OK_AND_ASSIGN(counter, commit_metrics->GetCounter("some_metric"));
ASSERT_EQ(100, counter);
ASSERT_OK_AND_ASSIGN(counter, commit_metrics->GetCounter("some_metric_2"));
ASSERT_EQ(200, counter);
}
TEST(CommitMetricsTest, TestReportCommitFromStats) {
auto metrics = std::make_shared<MetricsImpl>();
std::vector<ManifestEntry> append_table_files;
append_table_files.push_back(CreateEntry(FileKind::Add(), 1, 1, 201, 1001, "a1"));
append_table_files.push_back(CreateEntry(FileKind::Delete(), 2, 3, 302, 1002, "a2"));
std::vector<ManifestEntry> append_changelog_files;
append_changelog_files.push_back(CreateEntry(FileKind::Add(), 1, 1, 202, 2001, "c1"));
append_changelog_files.push_back(CreateEntry(FileKind::Add(), 2, 3, 301, 2002, "c2"));
std::vector<ManifestEntry> compact_table_files;
compact_table_files.push_back(CreateEntry(FileKind::Add(), 1, 1, 203, 3001, "k1"));
compact_table_files.push_back(CreateEntry(FileKind::Delete(), 3, 5, 106, 3002, "k2"));
std::vector<ManifestEntry> compact_changelog_files;
compact_changelog_files.push_back(CreateEntry(FileKind::Add(), 1, 1, 205, 4001, "ck1"));
compact_changelog_files.push_back(CreateEntry(FileKind::Add(), 2, 3, 307, 4002, "ck2"));
CommitStats stats(append_table_files, append_changelog_files, compact_table_files,
compact_changelog_files,
/*commit_duration=*/3000, /*generated_snapshots=*/2, /*attempts=*/4,
/*last_committed_snapshot_id=*/10);
CommitMetrics::ReportCommit(metrics, stats);
ASSERT_OK_AND_ASSIGN(auto last_commit_duration,
metrics->GetCounter(CommitMetrics::LAST_COMMIT_DURATION));
EXPECT_EQ(3000, last_commit_duration);
ASSERT_OK_AND_ASSIGN(auto last_commit_attempts,
metrics->GetCounter(CommitMetrics::LAST_COMMIT_ATTEMPTS));
EXPECT_EQ(4, last_commit_attempts);
ASSERT_OK_AND_ASSIGN(auto last_table_files_added,
metrics->GetCounter(CommitMetrics::LAST_TABLE_FILES_ADDED));
EXPECT_EQ(2, last_table_files_added);
ASSERT_OK_AND_ASSIGN(auto last_table_files_deleted,
metrics->GetCounter(CommitMetrics::LAST_TABLE_FILES_DELETED));
EXPECT_EQ(2, last_table_files_deleted);
ASSERT_OK_AND_ASSIGN(auto last_table_files_appended,
metrics->GetCounter(CommitMetrics::LAST_TABLE_FILES_APPENDED));
EXPECT_EQ(2, last_table_files_appended);
ASSERT_OK_AND_ASSIGN(auto last_table_files_compacted,
metrics->GetCounter(CommitMetrics::LAST_TABLE_FILES_COMMIT_COMPACTED));
EXPECT_EQ(2, last_table_files_compacted);
ASSERT_OK_AND_ASSIGN(auto last_changelog_files_appended,
metrics->GetCounter(CommitMetrics::LAST_CHANGELOG_FILES_APPENDED));
EXPECT_EQ(2, last_changelog_files_appended);
ASSERT_OK_AND_ASSIGN(auto last_changelog_files_compacted,
metrics->GetCounter(CommitMetrics::LAST_CHANGELOG_FILES_COMMIT_COMPACTED));
EXPECT_EQ(2, last_changelog_files_compacted);
ASSERT_OK_AND_ASSIGN(auto last_generated_snapshots,
metrics->GetCounter(CommitMetrics::LAST_GENERATED_SNAPSHOTS));
EXPECT_EQ(2, last_generated_snapshots);
ASSERT_OK_AND_ASSIGN(auto last_delta_records_appended,
metrics->GetCounter(CommitMetrics::LAST_DELTA_RECORDS_APPENDED));
EXPECT_EQ(503, last_delta_records_appended);
ASSERT_OK_AND_ASSIGN(auto last_changelog_records_appended,
metrics->GetCounter(CommitMetrics::LAST_CHANGELOG_RECORDS_APPENDED));
EXPECT_EQ(503, last_changelog_records_appended);
ASSERT_OK_AND_ASSIGN(auto last_delta_records_compacted,
metrics->GetCounter(CommitMetrics::LAST_DELTA_RECORDS_COMMIT_COMPACTED));
EXPECT_EQ(309, last_delta_records_compacted);
ASSERT_OK_AND_ASSIGN(
auto last_changelog_records_compacted,
metrics->GetCounter(CommitMetrics::LAST_CHANGELOG_RECORDS_COMMIT_COMPACTED));
EXPECT_EQ(512, last_changelog_records_compacted);
ASSERT_OK_AND_ASSIGN(auto last_partitions_written,
metrics->GetCounter(CommitMetrics::LAST_PARTITIONS_WRITTEN));
EXPECT_EQ(3, last_partitions_written);
ASSERT_OK_AND_ASSIGN(auto last_buckets_written,
metrics->GetCounter(CommitMetrics::LAST_BUCKETS_WRITTEN));
EXPECT_EQ(3, last_buckets_written);
ASSERT_OK_AND_ASSIGN(auto last_compaction_input_file_size,
metrics->GetCounter(CommitMetrics::LAST_COMPACTION_INPUT_FILE_SIZE));
EXPECT_EQ(3002, last_compaction_input_file_size);
ASSERT_OK_AND_ASSIGN(auto last_compaction_output_file_size,
metrics->GetCounter(CommitMetrics::LAST_COMPACTION_OUTPUT_FILE_SIZE));
EXPECT_EQ(3001, last_compaction_output_file_size);
ASSERT_OK_AND_ASSIGN(auto last_committed_snapshot_id,
metrics->GetCounter(CommitMetrics::LAST_COMMITTED_SNAPSHOT_ID));
EXPECT_EQ(10, last_committed_snapshot_id);
}
} // namespace paimon::test