1
1
#include " prometheus/text_serializer.h"
2
2
3
+ #include < algorithm>
3
4
#include < chrono>
4
5
#include < cmath>
5
6
#include < limits>
@@ -76,87 +77,81 @@ void WriteHead(std::ostream& out, const MetricFamily& family,
76
77
}
77
78
78
79
// Write a line trailer: timestamp
79
- void WriteTail (std::ostream& out, const ClientMetric& metric,
80
- const bool open_metrics) {
80
+ void WriteTail (std::ostream& out, const ClientMetric& metric) {
81
81
if (metric.timestamp != std::chrono::seconds::zero ()) {
82
- out << " " ;
83
- if (open_metrics) {
84
- using FloatSeconds = std::chrono::duration<double >;
85
- out << std::chrono::duration_cast<FloatSeconds>(metric.timestamp ).count ();
86
- } else {
87
- out << metric.timestamp .count ();
88
- }
82
+ using FloatSeconds = std::chrono::duration<double >;
83
+ out << " "
84
+ << std::chrono::duration_cast<FloatSeconds>(metric.timestamp ).count ();
89
85
}
90
86
out << " \n " ;
91
87
}
92
88
93
89
void SerializeCounter (std::ostream& out, const MetricFamily& family,
94
- const ClientMetric& metric, const bool open_metrics ) {
90
+ const ClientMetric& metric) {
95
91
WriteHead (out, family, metric, " _total" );
96
92
WriteValue (out, metric.counter .value );
97
- WriteTail (out, metric, open_metrics );
93
+ WriteTail (out, metric);
98
94
}
99
95
100
96
void SerializeGauge (std::ostream& out, const MetricFamily& family,
101
- const ClientMetric& metric, const bool open_metrics ) {
97
+ const ClientMetric& metric) {
102
98
WriteHead (out, family, metric);
103
99
WriteValue (out, metric.gauge .value );
104
- WriteTail (out, metric, open_metrics );
100
+ WriteTail (out, metric);
105
101
}
106
102
107
103
void SerializeSummary (std::ostream& out, const MetricFamily& family,
108
- const ClientMetric& metric, const bool open_metrics ) {
104
+ const ClientMetric& metric) {
109
105
auto & sum = metric.summary ;
110
106
WriteHead (out, family, metric, " _count" );
111
107
out << sum.sample_count ;
112
- WriteTail (out, metric, open_metrics );
108
+ WriteTail (out, metric);
113
109
114
110
WriteHead (out, family, metric, " _sum" );
115
111
WriteValue (out, sum.sample_sum );
116
- WriteTail (out, metric, open_metrics );
112
+ WriteTail (out, metric);
117
113
118
114
for (auto & q : sum.quantile ) {
119
115
WriteHead (out, family, metric, " " , " quantile" , q.quantile );
120
116
WriteValue (out, q.value );
121
- WriteTail (out, metric, open_metrics );
117
+ WriteTail (out, metric);
122
118
}
123
119
}
124
120
125
121
void SerializeUntyped (std::ostream& out, const MetricFamily& family,
126
- const ClientMetric& metric, const bool open_metrics ) {
122
+ const ClientMetric& metric) {
127
123
WriteHead (out, family, metric);
128
124
WriteValue (out, metric.untyped .value );
129
- WriteTail (out, metric, open_metrics );
125
+ WriteTail (out, metric);
130
126
}
131
127
132
128
void SerializeHistogram (std::ostream& out, const MetricFamily& family,
133
- const ClientMetric& metric, const bool open_metrics ) {
129
+ const ClientMetric& metric) {
134
130
auto & hist = metric.histogram ;
135
131
WriteHead (out, family, metric, " _count" );
136
132
out << hist.sample_count ;
137
- WriteTail (out, metric, open_metrics );
133
+ WriteTail (out, metric);
138
134
139
135
WriteHead (out, family, metric, " _sum" );
140
136
WriteValue (out, hist.sample_sum );
141
- WriteTail (out, metric, open_metrics );
137
+ WriteTail (out, metric);
142
138
143
139
double last = -std::numeric_limits<double >::infinity ();
144
140
for (auto & b : hist.bucket ) {
145
141
WriteHead (out, family, metric, " _bucket" , " le" , b.upper_bound );
146
142
last = b.upper_bound ;
147
143
out << b.cumulative_count ;
148
- WriteTail (out, metric, open_metrics );
144
+ WriteTail (out, metric);
149
145
}
150
146
151
147
if (last != std::numeric_limits<double >::infinity ()) {
152
148
WriteHead (out, family, metric, " _bucket" , " le" , " +Inf" );
153
149
out << hist.sample_count ;
154
- WriteTail (out, metric, open_metrics );
150
+ WriteTail (out, metric);
155
151
}
156
152
}
157
153
158
- void SerializeFamily (std::ostream& out, const MetricFamily& family,
159
- const bool open_metrics) {
154
+ void SerializeFamily (std::ostream& out, const MetricFamily& family) {
160
155
const auto ends_with = [](const std::string& value,
161
156
const std::string& ending) -> bool {
162
157
if (ending.size () > value.size ()) {
@@ -181,105 +176,66 @@ void SerializeFamily(std::ostream& out, const MetricFamily& family,
181
176
std::stable_sort (sorted_family.metric .begin (), sorted_family.metric .end (),
182
177
compare_metrics);
183
178
179
+ if (sorted_family.type == MetricType::Counter) {
180
+ remove_suffix (sorted_family.name , " _total" );
181
+ }
182
+
183
+ if (!sorted_family.help .empty ()) {
184
+ out << " # HELP " << sorted_family.name << " " << sorted_family.help << " \n " ;
185
+ }
186
+
184
187
switch (sorted_family.type ) {
185
188
case MetricType::Counter: {
186
- remove_suffix (sorted_family.name , " _total" );
187
- out << " # TYPE " << sorted_family.name ;
188
- if (!open_metrics) {
189
- out << " _total" ;
190
- }
191
- out << " counter\n " ;
192
- if (!sorted_family.help .empty ()) {
193
- out << " # HELP " << sorted_family.name ;
194
- if (!open_metrics) {
195
- out << " _total" ;
196
- }
197
- out << " " << sorted_family.help << " \n " ;
198
- }
189
+ out << " # TYPE " << sorted_family.name << " counter\n " ;
199
190
for (const auto & metric : sorted_family.metric ) {
200
- SerializeCounter (out, sorted_family, metric, open_metrics );
191
+ SerializeCounter (out, sorted_family, metric);
201
192
}
202
193
break ;
203
194
}
204
195
case MetricType::Gauge:
205
196
out << " # TYPE " << sorted_family.name << " gauge\n " ;
206
- if (!sorted_family.help .empty ()) {
207
- out << " # HELP " << sorted_family.name << " " << sorted_family.help
208
- << " \n " ;
209
- }
210
197
for (auto & metric : sorted_family.metric ) {
211
- SerializeGauge (out, sorted_family, metric, open_metrics );
198
+ SerializeGauge (out, sorted_family, metric);
212
199
}
213
200
break ;
214
201
case MetricType::Summary:
215
202
out << " # TYPE " << sorted_family.name << " summary\n " ;
216
- if (!sorted_family.help .empty ()) {
217
- out << " # HELP " << sorted_family.name << " " << sorted_family.help
218
- << " \n " ;
219
- }
220
203
for (auto & metric : sorted_family.metric ) {
221
- SerializeSummary (out, sorted_family, metric, open_metrics );
204
+ SerializeSummary (out, sorted_family, metric);
222
205
}
223
206
break ;
224
207
case MetricType::Untyped:
225
- out << " # TYPE " << sorted_family.name ;
226
- if (open_metrics) {
227
- out << " unknown\n " ;
228
- } else {
229
- out << " untyped\n " ;
230
- }
231
- if (!sorted_family.help .empty ()) {
232
- out << " # HELP " << sorted_family.name << " " << sorted_family.help
233
- << " \n " ;
234
- }
208
+ out << " # TYPE " << sorted_family.name << " unknown\n " ;
235
209
for (auto & metric : sorted_family.metric ) {
236
- SerializeUntyped (out, sorted_family, metric, open_metrics );
210
+ SerializeUntyped (out, sorted_family, metric);
237
211
}
238
212
break ;
239
213
case MetricType::Histogram:
240
214
out << " # TYPE " << sorted_family.name << " histogram\n " ;
241
- if (!sorted_family.help .empty ()) {
242
- out << " # HELP " << sorted_family.name << " " << sorted_family.help
243
- << " \n " ;
244
- }
245
215
for (auto & metric : sorted_family.metric ) {
246
- SerializeHistogram (out, sorted_family, metric, open_metrics );
216
+ SerializeHistogram (out, sorted_family, metric);
247
217
}
248
218
break ;
249
219
}
250
220
}
251
221
} // namespace
252
222
253
- std::string TextSerializer::Serialize (const std::vector<MetricFamily>& metrics,
254
- const bool open_metrics) const {
255
- std::ostringstream ss;
256
- Serialize (ss, metrics, open_metrics);
257
- return ss.str ();
258
- }
259
-
260
223
void TextSerializer::Serialize (std::ostream& out,
261
224
const std::vector<MetricFamily>& metrics) const {
262
- Serialize (out, metrics, false );
263
- }
264
-
265
- void TextSerializer::Serialize (std::ostream& out,
266
- const std::vector<MetricFamily>& metrics,
267
- const bool open_metrics) const {
268
225
auto saved_locale = out.getloc ();
269
226
auto saved_precision = out.precision ();
270
227
271
228
out.imbue (std::locale::classic ());
272
229
out.precision (std::numeric_limits<double >::max_digits10 - 1 );
273
230
274
231
for (auto & family : metrics) {
275
- SerializeFamily (out, family, open_metrics );
232
+ SerializeFamily (out, family);
276
233
}
277
234
278
- if (open_metrics) {
279
- out << " # EOF\n " ;
280
- }
235
+ out << " # EOF\n " ;
281
236
282
237
out.imbue (saved_locale);
283
238
out.precision (saved_precision);
284
239
}
240
+
285
241
} // namespace prometheus
0 commit comments