11#include " prometheus/text_serializer.h"
22
3+ #include < algorithm>
34#include < chrono>
45#include < cmath>
56#include < limits>
@@ -76,87 +77,81 @@ void WriteHead(std::ostream& out, const MetricFamily& family,
7677}
7778
7879// 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) {
8181 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 ();
8985 }
9086 out << " \n " ;
9187}
9288
9389void SerializeCounter (std::ostream& out, const MetricFamily& family,
94- const ClientMetric& metric, const bool open_metrics ) {
90+ const ClientMetric& metric) {
9591 WriteHead (out, family, metric, " _total" );
9692 WriteValue (out, metric.counter .value );
97- WriteTail (out, metric, open_metrics );
93+ WriteTail (out, metric);
9894}
9995
10096void SerializeGauge (std::ostream& out, const MetricFamily& family,
101- const ClientMetric& metric, const bool open_metrics ) {
97+ const ClientMetric& metric) {
10298 WriteHead (out, family, metric);
10399 WriteValue (out, metric.gauge .value );
104- WriteTail (out, metric, open_metrics );
100+ WriteTail (out, metric);
105101}
106102
107103void SerializeSummary (std::ostream& out, const MetricFamily& family,
108- const ClientMetric& metric, const bool open_metrics ) {
104+ const ClientMetric& metric) {
109105 auto & sum = metric.summary ;
110106 WriteHead (out, family, metric, " _count" );
111107 out << sum.sample_count ;
112- WriteTail (out, metric, open_metrics );
108+ WriteTail (out, metric);
113109
114110 WriteHead (out, family, metric, " _sum" );
115111 WriteValue (out, sum.sample_sum );
116- WriteTail (out, metric, open_metrics );
112+ WriteTail (out, metric);
117113
118114 for (auto & q : sum.quantile ) {
119115 WriteHead (out, family, metric, " " , " quantile" , q.quantile );
120116 WriteValue (out, q.value );
121- WriteTail (out, metric, open_metrics );
117+ WriteTail (out, metric);
122118 }
123119}
124120
125121void SerializeUntyped (std::ostream& out, const MetricFamily& family,
126- const ClientMetric& metric, const bool open_metrics ) {
122+ const ClientMetric& metric) {
127123 WriteHead (out, family, metric);
128124 WriteValue (out, metric.untyped .value );
129- WriteTail (out, metric, open_metrics );
125+ WriteTail (out, metric);
130126}
131127
132128void SerializeHistogram (std::ostream& out, const MetricFamily& family,
133- const ClientMetric& metric, const bool open_metrics ) {
129+ const ClientMetric& metric) {
134130 auto & hist = metric.histogram ;
135131 WriteHead (out, family, metric, " _count" );
136132 out << hist.sample_count ;
137- WriteTail (out, metric, open_metrics );
133+ WriteTail (out, metric);
138134
139135 WriteHead (out, family, metric, " _sum" );
140136 WriteValue (out, hist.sample_sum );
141- WriteTail (out, metric, open_metrics );
137+ WriteTail (out, metric);
142138
143139 double last = -std::numeric_limits<double >::infinity ();
144140 for (auto & b : hist.bucket ) {
145141 WriteHead (out, family, metric, " _bucket" , " le" , b.upper_bound );
146142 last = b.upper_bound ;
147143 out << b.cumulative_count ;
148- WriteTail (out, metric, open_metrics );
144+ WriteTail (out, metric);
149145 }
150146
151147 if (last != std::numeric_limits<double >::infinity ()) {
152148 WriteHead (out, family, metric, " _bucket" , " le" , " +Inf" );
153149 out << hist.sample_count ;
154- WriteTail (out, metric, open_metrics );
150+ WriteTail (out, metric);
155151 }
156152}
157153
158- void SerializeFamily (std::ostream& out, const MetricFamily& family,
159- const bool open_metrics) {
154+ void SerializeFamily (std::ostream& out, const MetricFamily& family) {
160155 const auto ends_with = [](const std::string& value,
161156 const std::string& ending) -> bool {
162157 if (ending.size () > value.size ()) {
@@ -181,105 +176,66 @@ void SerializeFamily(std::ostream& out, const MetricFamily& family,
181176 std::stable_sort (sorted_family.metric .begin (), sorted_family.metric .end (),
182177 compare_metrics);
183178
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+
184187 switch (sorted_family.type ) {
185188 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 " ;
199190 for (const auto & metric : sorted_family.metric ) {
200- SerializeCounter (out, sorted_family, metric, open_metrics );
191+ SerializeCounter (out, sorted_family, metric);
201192 }
202193 break ;
203194 }
204195 case MetricType::Gauge:
205196 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- }
210197 for (auto & metric : sorted_family.metric ) {
211- SerializeGauge (out, sorted_family, metric, open_metrics );
198+ SerializeGauge (out, sorted_family, metric);
212199 }
213200 break ;
214201 case MetricType::Summary:
215202 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- }
220203 for (auto & metric : sorted_family.metric ) {
221- SerializeSummary (out, sorted_family, metric, open_metrics );
204+ SerializeSummary (out, sorted_family, metric);
222205 }
223206 break ;
224207 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 " ;
235209 for (auto & metric : sorted_family.metric ) {
236- SerializeUntyped (out, sorted_family, metric, open_metrics );
210+ SerializeUntyped (out, sorted_family, metric);
237211 }
238212 break ;
239213 case MetricType::Histogram:
240214 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- }
245215 for (auto & metric : sorted_family.metric ) {
246- SerializeHistogram (out, sorted_family, metric, open_metrics );
216+ SerializeHistogram (out, sorted_family, metric);
247217 }
248218 break ;
249219 }
250220}
251221} // namespace
252222
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-
260223void TextSerializer::Serialize (std::ostream& out,
261224 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 {
268225 auto saved_locale = out.getloc ();
269226 auto saved_precision = out.precision ();
270227
271228 out.imbue (std::locale::classic ());
272229 out.precision (std::numeric_limits<double >::max_digits10 - 1 );
273230
274231 for (auto & family : metrics) {
275- SerializeFamily (out, family, open_metrics );
232+ SerializeFamily (out, family);
276233 }
277234
278- if (open_metrics) {
279- out << " # EOF\n " ;
280- }
235+ out << " # EOF\n " ;
281236
282237 out.imbue (saved_locale);
283238 out.precision (saved_precision);
284239}
240+
285241} // namespace prometheus
0 commit comments