diff --git a/src/brpc/policy/discovery_naming_service.cpp b/src/brpc/policy/discovery_naming_service.cpp index 7519f83a9ca126cba9d597daa764648dffbd51af..5ea1b01ec562e93029bc5bdf32da1ffd050b684c 100644 --- a/src/brpc/policy/discovery_naming_service.cpp +++ b/src/brpc/policy/discovery_naming_service.cpp @@ -16,6 +16,8 @@ #include <gflags/gflags.h> #include "butil/third_party/rapidjson/document.h" +#include "butil/third_party/rapidjson/stringbuffer.h" +#include "butil/third_party/rapidjson/writer.h" #include "butil/string_printf.h" #include "butil/fast_rand.h" #include "bthread/bthread.h" @@ -163,6 +165,16 @@ int ParseFetchsResult(const butil::IOBuf& buf, } for (BUTIL_RAPIDJSON_NAMESPACE::SizeType i = 0; i < instances.Size(); ++i) { + std::string metadata; + // convert metadata in object to string + auto itr_metadata = instances[i].FindMember("metadata"); + if (itr_metadata != instances[i].MemberEnd()) { + BUTIL_RAPIDJSON_NAMESPACE::StringBuffer buffer; + BUTIL_RAPIDJSON_NAMESPACE::Writer<BUTIL_RAPIDJSON_NAMESPACE::StringBuffer> writer(buffer); + itr_metadata->value.Accept(writer); + metadata = buffer.GetString(); + } + auto itr = instances[i].FindMember("addrs"); if (itr == instances[i].MemberEnd() || !itr->value.IsArray()) { LOG(ERROR) << "Fail to find addrs or addrs is not an array"; @@ -186,6 +198,7 @@ int ParseFetchsResult(const butil::IOBuf& buf, addr.remove_prefix(pos + 3); } ServerNode node; + node.tag = metadata; // Variable addr contains data from addrs[j].GetString(), it is a // null-terminated string, so it is safe to pass addr.data() as the // first parameter to str2endpoint. diff --git a/test/brpc_naming_service_unittest.cpp b/test/brpc_naming_service_unittest.cpp index 478aec4561f5e955df05c722306c1f55485ab9a6..efbdb66090eaf60c1cf1b0196b9c9a9874f31dbd 100644 --- a/test/brpc_naming_service_unittest.cpp +++ b/test/brpc_naming_service_unittest.cpp @@ -448,7 +448,8 @@ static const std::string s_fetchs_result = R"({ "rpc":"", "version":"123", "metadata":{ - + "weight": "10", + "cluster": "" }, "addrs":[ "http://127.0.0.1:8999", @@ -475,7 +476,8 @@ static const std::string s_fetchs_result = R"({ "rpc":"", "version":"123", "metadata":{ - + "weight": "10", + "cluster": "" }, "addrs":[ "http://127.0.0.1:8999", @@ -525,6 +527,7 @@ TEST(NamingServiceTest, discovery_parse_function) { buf.append(s_fetchs_result); ASSERT_EQ(0, brpc::policy::ParseFetchsResult(buf, "admin.test", &servers)); ASSERT_EQ((size_t)1, servers.size()); + ASSERT_EQ(servers[0].tag, "{\"weight\":\"10\",\"cluster\":\"\"}"); buf.clear(); buf.append(s_nodes_result); std::string server;