This is an automated email from the ASF dual-hosted git repository.

dataroaring pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 63a9a886f5 [enhance](S3) add s3 bvar metrics for all s3 operation 
(#22105)
63a9a886f5 is described below

commit 63a9a886f551b7b7baee11e73eb70194c7bdb949
Author: AlexYue <yj976240...@gmail.com>
AuthorDate: Sun Jul 30 21:09:17 2023 +0800

    [enhance](S3) add s3 bvar metrics for all s3 operation (#22105)
---
 be/src/io/fs/s3_file_reader.cpp |  2 ++
 be/src/io/fs/s3_file_system.cpp | 11 +++++++++++
 be/src/io/fs/s3_file_writer.cpp |  6 ++++++
 be/src/util/s3_util.cpp         | 13 +++++++++++++
 be/src/util/s3_util.h           | 16 ++++++++++++++++
 5 files changed, 48 insertions(+)

diff --git a/be/src/io/fs/s3_file_reader.cpp b/be/src/io/fs/s3_file_reader.cpp
index 2403b2497e..950f9cff17 100644
--- a/be/src/io/fs/s3_file_reader.cpp
+++ b/be/src/io/fs/s3_file_reader.cpp
@@ -33,6 +33,7 @@
 #include "common/compiler_util.h" // IWYU pragma: keep
 #include "io/fs/s3_common.h"
 #include "util/doris_metrics.h"
+#include "util/s3_util.h"
 
 namespace doris {
 namespace io {
@@ -95,6 +96,7 @@ Status S3FileReader::read_at_impl(size_t offset, Slice 
result, size_t* bytes_rea
         return Status::InternalError("init s3 client error");
     }
     auto outcome = client->GetObject(request);
+    s3_bvar::s3_get_total << 1;
     if (!outcome.IsSuccess()) {
         return Status::IOError("failed to read from {}: {}", _path.native(),
                                outcome.GetError().GetMessage());
diff --git a/be/src/io/fs/s3_file_system.cpp b/be/src/io/fs/s3_file_system.cpp
index ca4fd0bda8..8bde016aae 100644
--- a/be/src/io/fs/s3_file_system.cpp
+++ b/be/src/io/fs/s3_file_system.cpp
@@ -161,6 +161,7 @@ Status S3FileSystem::delete_file_impl(const Path& file) {
     request.WithBucket(_s3_conf.bucket).WithKey(key);
 
     auto outcome = client->DeleteObject(request);
+    s3_bvar::s3_delete_total << 1;
     if (outcome.IsSuccess() ||
         outcome.GetError().GetResponseCode() == 
Aws::Http::HttpResponseCode::NOT_FOUND) {
         return Status::OK();
@@ -184,6 +185,7 @@ Status S3FileSystem::delete_directory_impl(const Path& dir) 
{
     bool is_trucated = false;
     do {
         auto outcome = client->ListObjectsV2(request);
+        s3_bvar::s3_list_total << 1;
         if (!outcome.IsSuccess()) {
             return Status::IOError("failed to list objects when delete dir {}: 
{}", dir.native(),
                                    error_msg(prefix, outcome));
@@ -199,6 +201,7 @@ Status S3FileSystem::delete_directory_impl(const Path& dir) 
{
             del.WithObjects(std::move(objects)).SetQuiet(true);
             delete_request.SetDelete(std::move(del));
             auto delete_outcome = client->DeleteObjects(delete_request);
+            s3_bvar::s3_delete_total << 1;
             if (!delete_outcome.IsSuccess()) {
                 return Status::IOError("failed to delete dir {}: {}", 
dir.native(),
                                        error_msg(prefix, delete_outcome));
@@ -243,6 +246,7 @@ Status S3FileSystem::batch_delete_impl(const 
std::vector<Path>& remote_files) {
         del.WithObjects(std::move(objects)).SetQuiet(true);
         delete_request.SetDelete(std::move(del));
         auto delete_outcome = client->DeleteObjects(delete_request);
+        s3_bvar::s3_delete_total << 1;
         if (UNLIKELY(!delete_outcome.IsSuccess())) {
             return Status::IOError(
                     "failed to delete objects: {}",
@@ -268,6 +272,7 @@ Status S3FileSystem::exists_impl(const Path& path, bool* 
res) const {
     request.WithBucket(_s3_conf.bucket).WithKey(key);
 
     auto outcome = client->HeadObject(request);
+    s3_bvar::s3_head_total << 1;
     if (outcome.IsSuccess()) {
         *res = true;
     } else if (outcome.GetError().GetResponseCode() == 
Aws::Http::HttpResponseCode::NOT_FOUND) {
@@ -288,6 +293,7 @@ Status S3FileSystem::file_size_impl(const Path& file, 
int64_t* file_size) const
     request.WithBucket(_s3_conf.bucket).WithKey(key);
 
     auto outcome = client->HeadObject(request);
+    s3_bvar::s3_head_total << 1;
     if (outcome.IsSuccess()) {
         *file_size = outcome.GetResult().GetContentLength();
     } else {
@@ -314,6 +320,7 @@ Status S3FileSystem::list_impl(const Path& dir, bool 
only_file, std::vector<File
     bool is_trucated = false;
     do {
         auto outcome = client->ListObjectsV2(request);
+        s3_bvar::s3_list_total << 1;
         if (!outcome.IsSuccess()) {
             return Status::IOError("failed to list {}: {}", dir.native(),
                                    error_msg(prefix, outcome));
@@ -430,6 +437,7 @@ Status S3FileSystem::direct_upload_impl(const Path& 
remote_file, const std::stri
                                remote_file.native());
     }
     Aws::S3::Model::PutObjectOutcome response = _client->PutObject(request);
+    s3_bvar::s3_put_total << 1;
     if (response.IsSuccess()) {
         return Status::OK();
     } else {
@@ -450,6 +458,7 @@ Status S3FileSystem::download_impl(const Path& remote_file, 
const Path& local_fi
     Aws::S3::Model::GetObjectRequest request;
     request.WithBucket(_s3_conf.bucket).WithKey(key);
     Aws::S3::Model::GetObjectOutcome response = _client->GetObject(request);
+    s3_bvar::s3_get_total << 1;
     if (response.IsSuccess()) {
         Aws::OFStream local_file_s;
         local_file_s.open(local_file, std::ios::out | std::ios::binary);
@@ -473,6 +482,7 @@ Status S3FileSystem::direct_download_impl(const Path& 
remote, std::string* conte
     GET_KEY(key, remote);
     request.WithBucket(_s3_conf.bucket).WithKey(key);
     Aws::S3::Model::GetObjectOutcome response = _client->GetObject(request);
+    s3_bvar::s3_get_total << 1;
     if (response.IsSuccess()) {
         std::stringstream ss;
         ss << response.GetResult().GetBody().rdbuf();
@@ -493,6 +503,7 @@ Status S3FileSystem::copy(const Path& src, const Path& dst) 
{
             .WithKey(dst_key)
             .WithBucket(_s3_conf.bucket);
     Aws::S3::Model::CopyObjectOutcome response = _client->CopyObject(request);
+    s3_bvar::s3_copy_object_total << 1;
     if (response.IsSuccess()) {
         return Status::OK();
     } else {
diff --git a/be/src/io/fs/s3_file_writer.cpp b/be/src/io/fs/s3_file_writer.cpp
index 4b70aaf344..6b7bd6ad8e 100644
--- a/be/src/io/fs/s3_file_writer.cpp
+++ b/be/src/io/fs/s3_file_writer.cpp
@@ -50,6 +50,7 @@
 #include "util/defer_op.h"
 #include "util/doris_metrics.h"
 #include "util/runtime_profile.h"
+#include "util/s3_util.h"
 
 namespace Aws {
 namespace S3 {
@@ -112,6 +113,7 @@ Status S3FileWriter::_create_multi_upload_request() {
     create_request.SetContentType("application/octet-stream");
 
     auto outcome = _client->CreateMultipartUpload(create_request);
+    s3_bvar::s3_multi_part_upload_total << 1;
 
     if (outcome.IsSuccess()) {
         _upload_id = outcome.GetResult().GetUploadId();
@@ -151,6 +153,7 @@ Status S3FileWriter::abort() {
     AbortMultipartUploadRequest request;
     request.WithBucket(_bucket).WithKey(_key).WithUploadId(_upload_id);
     auto outcome = _client->AbortMultipartUpload(request);
+    s3_bvar::s3_multi_part_upload_total << 1;
     if (outcome.IsSuccess() ||
         outcome.GetError().GetErrorType() == Aws::S3::S3Errors::NO_SUCH_UPLOAD 
||
         outcome.GetError().GetResponseCode() == 
Aws::Http::HttpResponseCode::NOT_FOUND) {
@@ -267,6 +270,7 @@ void S3FileWriter::_upload_one_part(int64_t part_num, 
S3FileBuffer& buf) {
     upload_request.SetContentType("application/octet-stream");
 
     auto upload_part_callable = _client->UploadPartCallable(upload_request);
+    s3_bvar::s3_multi_part_upload_total << 1;
 
     UploadPartOutcome upload_part_outcome = upload_part_callable.get();
     if (!upload_part_outcome.IsSuccess()) {
@@ -317,6 +321,7 @@ Status S3FileWriter::_complete() {
     complete_request.WithMultipartUpload(completed_upload);
 
     auto compute_outcome = _client->CompleteMultipartUpload(complete_request);
+    s3_bvar::s3_multi_part_upload_total << 1;
 
     if (!compute_outcome.IsSuccess()) {
         auto s = Status::IOError(
@@ -356,6 +361,7 @@ void S3FileWriter::_put_object(S3FileBuffer& buf) {
     request.SetContentLength(buf.get_size());
     request.SetContentType("application/octet-stream");
     auto response = _client->PutObject(request);
+    s3_bvar::s3_put_total << 1;
     if (!response.IsSuccess()) {
         _st = Status::InternalError("Error: [{}:{}, responseCode:{}]",
                                     response.GetError().GetExceptionName(),
diff --git a/be/src/util/s3_util.cpp b/be/src/util/s3_util.cpp
index 9c93832209..07a6a72768 100644
--- a/be/src/util/s3_util.cpp
+++ b/be/src/util/s3_util.cpp
@@ -23,6 +23,7 @@
 #include <aws/core/utils/logging/LogSystemInterface.h>
 #include <aws/core/utils/memory/stl/AWSStringStream.h>
 #include <aws/s3/S3Client.h>
+#include <bvar/reducer.h>
 #include <util/string_util.h>
 
 #include <atomic>
@@ -37,6 +38,18 @@
 
 namespace doris {
 
+namespace s3_bvar {
+bvar::Adder<uint64_t> s3_get_total("s3_get", "total_num");
+bvar::Adder<uint64_t> s3_put_total("s3_put", "total_num");
+bvar::Adder<uint64_t> s3_delete_total("s3_delete", "total_num");
+bvar::Adder<uint64_t> s3_head_total("s3_head", "total_num");
+bvar::Adder<uint64_t> s3_multi_part_upload_total("s3_multi_part_upload", 
"total_num");
+bvar::Adder<uint64_t> s3_list_total("s3_list", "total_num");
+bvar::Adder<uint64_t> s3_list_object_versions_total("s3_list_object_versions", 
"total_num");
+bvar::Adder<uint64_t> s3_get_bucket_version_total("s3_get_bucket_version", 
"total_num");
+bvar::Adder<uint64_t> s3_copy_object_total("s3_copy_object", "total_num");
+}; // namespace s3_bvar
+
 class DorisAWSLogger final : public Aws::Utils::Logging::LogSystemInterface {
 public:
     DorisAWSLogger() : _log_level(Aws::Utils::Logging::LogLevel::Info) {}
diff --git a/be/src/util/s3_util.h b/be/src/util/s3_util.h
index 9611026ecc..1f00a82aa9 100644
--- a/be/src/util/s3_util.h
+++ b/be/src/util/s3_util.h
@@ -36,9 +36,25 @@ namespace S3 {
 class S3Client;
 } // namespace S3
 } // namespace Aws
+namespace bvar {
+template <typename T>
+class Adder;
+}
 
 namespace doris {
 
+namespace s3_bvar {
+extern bvar::Adder<uint64_t> s3_get_total;
+extern bvar::Adder<uint64_t> s3_put_total;
+extern bvar::Adder<uint64_t> s3_delete_total;
+extern bvar::Adder<uint64_t> s3_head_total;
+extern bvar::Adder<uint64_t> s3_multi_part_upload_total;
+extern bvar::Adder<uint64_t> s3_list_total;
+extern bvar::Adder<uint64_t> s3_list_object_versions_total;
+extern bvar::Adder<uint64_t> s3_get_bucket_version_total;
+extern bvar::Adder<uint64_t> s3_copy_object_total;
+}; // namespace s3_bvar
+
 class S3URI;
 
 const static std::string S3_AK = "AWS_ACCESS_KEY";


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to