18
18
// TODO: the following dependencies should be removed
19
19
#include " protobuf/sls/LogGroupSerializer.h"
20
20
21
+ #include " rapidjson/writer.h"
22
+ #include " rapidjson/stringbuffer.h"
23
+
21
24
using namespace std ;
22
25
23
26
namespace logtail {
24
27
25
- const string JSON_KEY_TIME = " __time__" ;
28
+
29
+ const char * JSON_KEY_TIME = " __time__" ;
30
+
31
+ // Helper function to serialize common fields (tags and time)
32
+ template <typename WriterType>
33
+ void SerializeCommonFields (const SizedMap& tags, uint64_t timestamp, WriterType& writer) {
34
+ // Serialize tags
35
+ for (const auto & tag : tags.mInner ) {
36
+ writer.Key (tag.first .to_string ().c_str ());
37
+ writer.String (tag.second .to_string ().c_str ());
38
+ }
39
+ // Serialize time
40
+ writer.Key (JSON_KEY_TIME);
41
+ writer.Uint64 (timestamp);
42
+ }
26
43
27
44
bool JsonEventGroupSerializer::Serialize (BatchedEvents&& group, string& res, string& errorMsg) {
28
45
if (group.mEvents .empty ()) {
@@ -37,29 +54,31 @@ bool JsonEventGroupSerializer::Serialize(BatchedEvents&& group, string& res, str
37
54
return false ;
38
55
}
39
56
40
- Json::Value groupTags;
41
- for (const auto & tag : group.mTags .mInner ) {
42
- groupTags[tag.first .to_string ()] = tag.second .to_string ();
43
- }
57
+ // Create reusable StringBuffer and Writer
58
+ rapidjson::StringBuffer jsonBuffer;
59
+ rapidjson::Writer<rapidjson::StringBuffer> writer (jsonBuffer);
60
+ auto resetBuffer = [&jsonBuffer, &writer]() {
61
+ jsonBuffer.Clear (); // Clear the buffer for reuse
62
+ writer.Reset (jsonBuffer);
63
+ };
44
64
45
65
// TODO: should support nano second
46
- ostringstream oss;
47
66
switch (eventType) {
48
67
case PipelineEvent::Type::LOG:
49
68
for (const auto & item : group.mEvents ) {
50
69
const auto & e = item.Cast <LogEvent>();
51
- Json::Value eventJson;
52
- // tags
53
- eventJson.copy (groupTags);
54
- // time
55
- eventJson[JSON_KEY_TIME] = e.GetTimestamp ();
70
+ resetBuffer ();
71
+
72
+ writer.StartObject ();
73
+ SerializeCommonFields (group.mTags , e.GetTimestamp (), writer);
56
74
// contents
57
75
for (const auto & kv : e) {
58
- eventJson[kv.first .to_string ()] = kv.second .to_string ();
76
+ writer.Key (kv.first .to_string ().c_str ());
77
+ writer.String (kv.second .to_string ().c_str ());
59
78
}
60
- Json::StreamWriterBuilder writer;
61
- writer[ " indentation " ] = " " ;
62
- oss << Json::writeString (writer, eventJson) << endl ;
79
+ writer. EndObject () ;
80
+ res. append (jsonBuffer. GetString ()) ;
81
+ res. append ( " \n " ) ;
63
82
}
64
83
break ;
65
84
case PipelineEvent::Type::METRIC:
@@ -69,34 +88,38 @@ bool JsonEventGroupSerializer::Serialize(BatchedEvents&& group, string& res, str
69
88
if (e.Is <std::monostate>()) {
70
89
continue ;
71
90
}
72
- Json::Value eventJson;
73
- // tags
74
- eventJson.copy (groupTags);
75
- // time
76
- eventJson[JSON_KEY_TIME] = e.GetTimestamp ();
91
+ resetBuffer ();
92
+
93
+ writer.StartObject ();
94
+ SerializeCommonFields (group.mTags , e.GetTimestamp (), writer);
77
95
// __labels__
78
- eventJson[ METRIC_RESERVED_KEY_LABELS] = Json::objectValue ;
79
- auto & labels = eventJson[METRIC_RESERVED_KEY_LABELS] ;
96
+ writer. Key ( METRIC_RESERVED_KEY_LABELS. c_str ()) ;
97
+ writer. StartObject () ;
80
98
for (auto tag = e.TagsBegin (); tag != e.TagsEnd (); tag++) {
81
- labels[tag->first .to_string ()] = tag->second .to_string ();
99
+ writer.Key (tag->first .to_string ().c_str ());
100
+ writer.String (tag->second .to_string ().c_str ());
82
101
}
102
+ writer.EndObject ();
83
103
// __name__
84
- eventJson[METRIC_RESERVED_KEY_NAME] = e.GetName ().to_string ();
104
+ writer.Key (METRIC_RESERVED_KEY_NAME.c_str ());
105
+ writer.String (e.GetName ().to_string ().c_str ());
85
106
// __value__
107
+ writer.Key (METRIC_RESERVED_KEY_VALUE.c_str ());
86
108
if (e.Is <UntypedSingleValue>()) {
87
- eventJson[METRIC_RESERVED_KEY_VALUE] = e.GetValue <UntypedSingleValue>()->mValue ;
109
+ writer. Double ( e.GetValue <UntypedSingleValue>()->mValue ) ;
88
110
} else if (e.Is <UntypedMultiDoubleValues>()) {
89
- eventJson[METRIC_RESERVED_KEY_VALUE] = Json::objectValue;
90
- auto & values = eventJson[METRIC_RESERVED_KEY_VALUE];
111
+ writer.StartObject ();
91
112
for (auto value = e.GetValue <UntypedMultiDoubleValues>()->ValuesBegin ();
92
113
value != e.GetValue <UntypedMultiDoubleValues>()->ValuesEnd ();
93
114
value++) {
94
- values[value->first .to_string ()] = value->second .Value ;
115
+ writer.Key (value->first .to_string ().c_str ());
116
+ writer.Double (value->second .Value );
95
117
}
118
+ writer.EndObject ();
96
119
}
97
- Json::StreamWriterBuilder writer;
98
- writer[ " indentation " ] = " " ;
99
- oss << Json::writeString (writer, eventJson) << endl ;
120
+ writer. EndObject () ;
121
+ res. append (jsonBuffer. GetString ()) ;
122
+ res. append ( " \n " ) ;
100
123
}
101
124
break ;
102
125
case PipelineEvent::Type::SPAN:
@@ -108,22 +131,21 @@ bool JsonEventGroupSerializer::Serialize(BatchedEvents&& group, string& res, str
108
131
case PipelineEvent::Type::RAW:
109
132
for (const auto & item : group.mEvents ) {
110
133
const auto & e = item.Cast <RawEvent>();
111
- Json::Value eventJson;
112
- // tags
113
- eventJson.copy (groupTags);
114
- // time
115
- eventJson[JSON_KEY_TIME] = e.GetTimestamp ();
134
+ resetBuffer ();
135
+
136
+ writer.StartObject ();
137
+ SerializeCommonFields (group.mTags , e.GetTimestamp (), writer);
116
138
// content
117
- eventJson[DEFAULT_CONTENT_KEY] = e.GetContent ().to_string ();
118
- Json::StreamWriterBuilder writer;
119
- writer[" indentation" ] = " " ;
120
- oss << Json::writeString (writer, eventJson) << endl;
139
+ writer.Key (DEFAULT_CONTENT_KEY.c_str ());
140
+ writer.String (e.GetContent ().to_string ().c_str ());
141
+ writer.EndObject ();
142
+ res.append (jsonBuffer.GetString ());
143
+ res.append (" \n " );
121
144
}
122
145
break ;
123
146
default :
124
147
break ;
125
148
}
126
- res = oss.str ();
127
149
return true ;
128
150
}
129
151
0 commit comments