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;