This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push: new 9236c2efc9 [improvement] Show detail status code string for be http api (#9771) 9236c2efc9 is described below commit 9236c2efc972d0a6838f624c70cc7f36424e70cc Author: jacktengg <18241664+jackte...@users.noreply.github.com> AuthorDate: Thu May 26 15:09:21 2022 +0800 [improvement] Show detail status code string for be http api (#9771) 1. move to_json method to common/status 2. modify related usage in http folder --- be/src/common/status.cpp | 28 +++++++++ be/src/common/status.h | 3 + be/src/http/action/compaction_action.cpp | 6 +- be/src/http/action/meta_action.cpp | 2 +- be/src/http/action/mini_load.cpp | 2 +- be/src/http/action/restore_tablet_action.cpp | 2 +- be/src/http/action/stream_load_2pc.cpp | 8 +-- be/src/http/action/tablet_migration_action.cpp | 6 +- be/src/http/action/tablets_distribution_action.cpp | 4 +- be/src/util/CMakeLists.txt | 1 - be/src/util/json_util.cpp | 51 ---------------- be/src/util/json_util.h | 2 - be/test/CMakeLists.txt | 1 - be/test/util/json_util_test.cpp | 70 ---------------------- 14 files changed, 46 insertions(+), 140 deletions(-) diff --git a/be/src/common/status.cpp b/be/src/common/status.cpp index a9ebd84da1..4f5c992a8f 100644 --- a/be/src/common/status.cpp +++ b/be/src/common/status.cpp @@ -5,6 +5,8 @@ #include "common/status.h" #include <glog/logging.h> +#include <rapidjson/prettywriter.h> +#include <rapidjson/stringbuffer.h> #include <boost/stacktrace.hpp> @@ -220,4 +222,30 @@ Status Status::clone_and_append(const Slice& msg) const { return Status(code(), message(), precise_code(), msg); } +std::string Status::to_json() const { + rapidjson::StringBuffer s; + rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(s); + + writer.StartObject(); + // status + writer.Key("status"); + writer.String(code_as_string().c_str()); + // msg + writer.Key("msg"); + if (ok()) { + writer.String("OK"); + } else { + auto err_msg = get_error_msg(); + int16_t posix = precise_code(); + if (posix != 1) { + char buf[64]; + snprintf(buf, sizeof(buf), " (error %d)", posix); + err_msg.append(buf); + } + writer.String(err_msg.c_str()); + } + writer.EndObject(); + return s.GetString(); +} + } // namespace doris \ No newline at end of file diff --git a/be/src/common/status.h b/be/src/common/status.h index c58df454ef..cca2383670 100644 --- a/be/src/common/status.h +++ b/be/src/common/status.h @@ -439,6 +439,9 @@ public: /// Returns the string "OK" for success. std::string to_string() const; + /// @return A json representation of this status. + std::string to_json() const; + /// @return A string representation of the status code, without the message /// text or sub code information. std::string code_as_string() const; diff --git a/be/src/http/action/compaction_action.cpp b/be/src/http/action/compaction_action.cpp index fe86f530f9..87fbae2d8b 100644 --- a/be/src/http/action/compaction_action.cpp +++ b/be/src/http/action/compaction_action.cpp @@ -249,7 +249,7 @@ void CompactionAction::handle(HttpRequest* req) { std::string json_result; Status st = _handle_show_compaction(req, &json_result); if (!st.ok()) { - HttpChannel::send_reply(req, HttpStatus::OK, to_json(st)); + HttpChannel::send_reply(req, HttpStatus::OK, st.to_json()); } else { HttpChannel::send_reply(req, HttpStatus::OK, json_result); } @@ -257,7 +257,7 @@ void CompactionAction::handle(HttpRequest* req) { std::string json_result; Status st = _handle_run_compaction(req, &json_result); if (!st.ok()) { - HttpChannel::send_reply(req, HttpStatus::OK, to_json(st)); + HttpChannel::send_reply(req, HttpStatus::OK, st.to_json()); } else { HttpChannel::send_reply(req, HttpStatus::OK, json_result); } @@ -265,7 +265,7 @@ void CompactionAction::handle(HttpRequest* req) { std::string json_result; Status st = _handle_run_status_compaction(req, &json_result); if (!st.ok()) { - HttpChannel::send_reply(req, HttpStatus::OK, to_json(st)); + HttpChannel::send_reply(req, HttpStatus::OK, st.to_json()); } else { HttpChannel::send_reply(req, HttpStatus::OK, json_result); } diff --git a/be/src/http/action/meta_action.cpp b/be/src/http/action/meta_action.cpp index e31ef14aa9..4855ef7cf6 100644 --- a/be/src/http/action/meta_action.cpp +++ b/be/src/http/action/meta_action.cpp @@ -73,7 +73,7 @@ void MetaAction::handle(HttpRequest* req) { if (_meta_type == META_TYPE::HEADER) { std::string json_meta; Status status = _handle_header(req, &json_meta); - std::string status_result = to_json(status); + std::string status_result = status.to_json(); LOG(INFO) << "handle request result:" << status_result; if (status.ok()) { HttpChannel::send_reply(req, HttpStatus::OK, json_meta); diff --git a/be/src/http/action/mini_load.cpp b/be/src/http/action/mini_load.cpp index f7ef79ad07..b841b21add 100644 --- a/be/src/http/action/mini_load.cpp +++ b/be/src/http/action/mini_load.cpp @@ -667,7 +667,7 @@ void MiniLoadAction::_handle(HttpRequest* http_req) { } auto st = _load(http_req, ctx->file_path, ctx->load_check_req.user, ctx->load_check_req.cluster, ctx->bytes_written); - std::string str = to_json(st); + std::string str = st.to_json(); HttpChannel::send_reply(http_req, str); } diff --git a/be/src/http/action/restore_tablet_action.cpp b/be/src/http/action/restore_tablet_action.cpp index 94109f704d..2ec5ad05e7 100644 --- a/be/src/http/action/restore_tablet_action.cpp +++ b/be/src/http/action/restore_tablet_action.cpp @@ -53,7 +53,7 @@ void RestoreTabletAction::handle(HttpRequest* req) { // add tid to cgroup in order to limit read bandwidth CgroupsMgr::apply_system_cgroup(); Status status = _handle(req); - std::string result = to_json(status); + std::string result = status.to_json(); LOG(INFO) << "handle request result:" << result; if (status.ok()) { HttpChannel::send_reply(req, HttpStatus::OK, result); diff --git a/be/src/http/action/stream_load_2pc.cpp b/be/src/http/action/stream_load_2pc.cpp index cd71bb5e95..7aa5655e52 100644 --- a/be/src/http/action/stream_load_2pc.cpp +++ b/be/src/http/action/stream_load_2pc.cpp @@ -42,7 +42,7 @@ void StreamLoad2PCAction::handle(HttpRequest* req) { if (config::disable_stream_load_2pc) { status = Status::InternalError("Two phase commit (2PC) for stream load was disabled"); - status_result = to_json(status); + status_result = status.to_json(); HttpChannel::send_reply(req, HttpStatus::OK, status_result); return; } @@ -56,14 +56,14 @@ void StreamLoad2PCAction::handle(HttpRequest* req) { ctx->txn_id = std::stoull(req_txn_id); } catch (const std::exception& e) { status = Status::InternalError("convert txn_id [" + req_txn_id + "] failed"); - status_result = to_json(status); + status_result = status.to_json(); HttpChannel::send_reply(req, HttpStatus::OK, status_result); return; } ctx->txn_operation = req->header(HTTP_TXN_OPERATION_KEY); if (ctx->txn_operation.compare("commit") != 0 && ctx->txn_operation.compare("abort") != 0) { status = Status::InternalError("transaction operation should be \'commit\' or \'abort\'"); - status_result = to_json(status); + status_result = status.to_json(); HttpChannel::send_reply(req, HttpStatus::OK, status_result); return; } @@ -76,7 +76,7 @@ void StreamLoad2PCAction::handle(HttpRequest* req) { status = _exec_env->stream_load_executor()->operate_txn_2pc(ctx); if (!status.ok()) { - status_result = to_json(status); + status_result = status.to_json(); } else { status_result = get_success_info(req_txn_id, ctx->txn_operation); } diff --git a/be/src/http/action/tablet_migration_action.cpp b/be/src/http/action/tablet_migration_action.cpp index dd5203838f..5f7a9e218e 100644 --- a/be/src/http/action/tablet_migration_action.cpp +++ b/be/src/http/action/tablet_migration_action.cpp @@ -109,7 +109,7 @@ void TabletMigrationAction::handle(HttpRequest* req) { } std::string status_result; if (!status.ok()) { - status_result = to_json(status); + status_result = status.to_json(); } else { status_result = "{\"status\": \"Success\", \"msg\": \"migration task is successfully " @@ -152,13 +152,13 @@ void TabletMigrationAction::handle(HttpRequest* req) { } } while (0); if (!status.ok()) { - status_result = to_json(status); + status_result = status.to_json(); } req->add_output_header(HttpHeaders::CONTENT_TYPE, HEADER_JSON.c_str()); HttpChannel::send_reply(req, HttpStatus::OK, status_result); } } else { - std::string status_result = to_json(status); + std::string status_result = status.to_json(); req->add_output_header(HttpHeaders::CONTENT_TYPE, HEADER_JSON.c_str()); HttpChannel::send_reply(req, HttpStatus::OK, status_result); } diff --git a/be/src/http/action/tablets_distribution_action.cpp b/be/src/http/action/tablets_distribution_action.cpp index 8eb672a5e0..30254665ea 100644 --- a/be/src/http/action/tablets_distribution_action.cpp +++ b/be/src/http/action/tablets_distribution_action.cpp @@ -52,7 +52,7 @@ void TabletsDistributionAction::handle(HttpRequest* req) { LOG(WARNING) << "invalid argument. partition_id:" << req_partition_id; Status status = Status::InternalError( strings::Substitute("invalid argument: partition_id")); - std::string status_result = to_json(status); + std::string status_result = status.to_json(); HttpChannel::send_reply(req, HttpStatus::INTERNAL_SERVER_ERROR, status_result); return; } @@ -64,7 +64,7 @@ void TabletsDistributionAction::handle(HttpRequest* req) { } LOG(WARNING) << "invalid argument. group_by:" << req_group_method; Status status = Status::InternalError(strings::Substitute("invalid argument: group_by")); - std::string status_result = to_json(status); + std::string status_result = status.to_json(); HttpChannel::send_reply(req, HttpStatus::INTERNAL_SERVER_ERROR, status_result); } diff --git a/be/src/util/CMakeLists.txt b/be/src/util/CMakeLists.txt index 98abb3ba6d..2bb19b81dc 100644 --- a/be/src/util/CMakeLists.txt +++ b/be/src/util/CMakeLists.txt @@ -39,7 +39,6 @@ set(UTIL_FILES errno.cpp hash_util.hpp histogram.cpp - json_util.cpp doris_metrics.cpp mem_info.cpp metrics.cpp diff --git a/be/src/util/json_util.cpp b/be/src/util/json_util.cpp deleted file mode 100644 index 5d8cf1acd7..0000000000 --- a/be/src/util/json_util.cpp +++ /dev/null @@ -1,51 +0,0 @@ -// 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. -// This file is copied from -// https://github.com/apache/impala/blob/branch-2.9.0/be/src/util/json-util.cc -// and modified by Doris - -#include "util/json_util.h" - -#include <rapidjson/prettywriter.h> -#include <rapidjson/stringbuffer.h> - -namespace doris { - -std::string to_json(const Status& status) { - rapidjson::StringBuffer s; - rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(s); - - writer.StartObject(); - // status - writer.Key("status"); - if (status.ok()) { - writer.String("Success"); - } else { - writer.String("Fail"); - } - // msg - writer.Key("msg"); - if (status.ok()) { - writer.String("OK"); - } else { - writer.String(status.get_error_msg().c_str()); - } - writer.EndObject(); - return s.GetString(); -} - -} // namespace doris diff --git a/be/src/util/json_util.h b/be/src/util/json_util.h index dd9233d043..a2aba38c59 100644 --- a/be/src/util/json_util.h +++ b/be/src/util/json_util.h @@ -25,7 +25,6 @@ #include <string> -#include "common/status.h" #include "util/pretty_printer.h" namespace doris { @@ -62,5 +61,4 @@ typename boost::enable_if_c<boost::is_arithmetic<T>::value, void>::type ToJsonVa } } -std::string to_json(const Status& status); } // namespace doris diff --git a/be/test/CMakeLists.txt b/be/test/CMakeLists.txt index 38700a4bc2..810fbd5279 100644 --- a/be/test/CMakeLists.txt +++ b/be/test/CMakeLists.txt @@ -281,7 +281,6 @@ set(UTIL_TEST_FILES util/string_util_test.cpp util/string_parser_test.cpp util/core_local_test.cpp - util/json_util_test.cpp util/byte_buffer2_test.cpp util/uid_util_test.cpp util/encryption_util_test.cpp diff --git a/be/test/util/json_util_test.cpp b/be/test/util/json_util_test.cpp deleted file mode 100644 index 94b370377d..0000000000 --- a/be/test/util/json_util_test.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// 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 "util/json_util.h" - -#include <gtest/gtest.h> - -#include "common/logging.h" - -namespace doris { - -class JsonUtilTest : public testing::Test { -public: - JsonUtilTest() {} - virtual ~JsonUtilTest() {} -}; - -TEST_F(JsonUtilTest, success) { - Status status; - - auto str = to_json(status); - - const char* result = - "{\n" - " \"status\": \"Success\",\n" - " \"msg\": \"OK\"\n}"; - EXPECT_STREQ(result, str.c_str()); -} - -TEST_F(JsonUtilTest, normal_fail) { - Status status = Status::InternalError("so bad"); - - auto str = to_json(status); - - const char* result = - "{\n" - " \"status\": \"Fail\",\n" - " \"msg\": \"so bad\"\n}"; - EXPECT_STREQ(result, str.c_str()); -} - -TEST_F(JsonUtilTest, normal_fail_str) { - Status status = Status::InternalError("\"so bad\""); - - auto str = to_json(status); - - // "msg": "\"so bad\"" - const char* result = - "{\n" - " \"status\": \"Fail\",\n" - " \"msg\": \"\\\"so bad\\\"\"\n}"; - LOG(INFO) << "str: " << str; - EXPECT_STREQ(result, str.c_str()); -} - -} // namespace doris --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org