@@ -23,6 +23,7 @@ import (
23
23
"strings"
24
24
25
25
"github.com/prometheus/common/model"
26
+ "google.golang.org/protobuf/types/known/timestamppb"
26
27
27
28
dto "github.com/prometheus/client_model/go"
28
29
)
@@ -152,6 +153,7 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int
152
153
return
153
154
}
154
155
156
+ var createdBytesWritten int
155
157
// Finally the samples, one line for each.
156
158
for _ , metric := range in .Metric {
157
159
switch metricType {
@@ -169,6 +171,10 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int
169
171
metric .Counter .GetValue (), 0 , false ,
170
172
metric .Counter .Exemplar ,
171
173
)
174
+ if metric .Counter .CreatedTimestamp != nil {
175
+ createdBytesWritten , err = writeOpenMetricsCreated (w , name , "_total" , metric , "" , 0 , metric .Counter .GetCreatedTimestamp ())
176
+ n += createdBytesWritten
177
+ }
172
178
case dto .MetricType_GAUGE :
173
179
if metric .Gauge == nil {
174
180
return written , fmt .Errorf (
@@ -223,6 +229,10 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int
223
229
0 , metric .Summary .GetSampleCount (), true ,
224
230
nil ,
225
231
)
232
+ if metric .Summary .CreatedTimestamp != nil {
233
+ createdBytesWritten , err = writeOpenMetricsCreated (w , name , "" , metric , "" , 0 , metric .Summary .GetCreatedTimestamp ())
234
+ n += createdBytesWritten
235
+ }
226
236
case dto .MetricType_HISTOGRAM :
227
237
if metric .Histogram == nil {
228
238
return written , fmt .Errorf (
@@ -271,6 +281,10 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int
271
281
0 , metric .Histogram .GetSampleCount (), true ,
272
282
nil ,
273
283
)
284
+ if metric .Histogram .CreatedTimestamp != nil {
285
+ createdBytesWritten , err = writeOpenMetricsCreated (w , name , "" , metric , "" , 0 , metric .Histogram .GetCreatedTimestamp ())
286
+ n += createdBytesWritten
287
+ }
274
288
default :
275
289
return written , fmt .Errorf (
276
290
"unexpected type in metric %s %s" , name , metric ,
@@ -442,6 +456,62 @@ func writeOpenMetricsLabelPairs(
442
456
return written , nil
443
457
}
444
458
459
+ // writeOpenMetricsCreated writes the created timestamp for a single time series
460
+ // following OpenMetrics text format to w, given the metric name, the metric proto
461
+ // message itself, optionally a suffix to be removed, e.g. '_total' for counters,
462
+ // an additional label name with a float64 value (use empty string as label name if
463
+ // not required) and the timestamp that represents the created timestamp.
464
+ // The function returns the number of bytes written and any error encountered.
465
+ func writeOpenMetricsCreated (w enhancedWriter ,
466
+ name , suffixToTrim string , metric * dto.Metric ,
467
+ additionalLabelName string , additionalLabelValue float64 ,
468
+ createdTimestamp * timestamppb.Timestamp ,
469
+ ) (int , error ) {
470
+ written := 0
471
+ n , err := w .WriteString (strings .TrimSuffix (name , suffixToTrim ))
472
+ written += n
473
+ if err != nil {
474
+ return written , err
475
+ }
476
+
477
+ n , err = w .WriteString ("_created" )
478
+ written += n
479
+ if err != nil {
480
+ return written , err
481
+ }
482
+
483
+ n , err = writeOpenMetricsLabelPairs (
484
+ w , metric .Label , additionalLabelName , additionalLabelValue ,
485
+ )
486
+ written += n
487
+ if err != nil {
488
+ return written , err
489
+ }
490
+
491
+ err = w .WriteByte (' ' )
492
+ written ++
493
+ if err != nil {
494
+ return written , err
495
+ }
496
+
497
+ ts := createdTimestamp .AsTime ()
498
+ // TODO(beorn7): Format this directly from components of ts to
499
+ // avoid overflow/underflow and precision issues of the float
500
+ // conversion.
501
+ n , err = writeOpenMetricsFloat (w , float64 (ts .UnixNano ())/ 1e9 )
502
+ written += n
503
+ if err != nil {
504
+ return written , err
505
+ }
506
+
507
+ err = w .WriteByte ('\n' )
508
+ written ++
509
+ if err != nil {
510
+ return written , err
511
+ }
512
+ return written , nil
513
+ }
514
+
445
515
// writeExemplar writes the provided exemplar in OpenMetrics format to w. The
446
516
// function returns the number of bytes written and any error encountered.
447
517
func writeExemplar (w enhancedWriter , e * dto.Exemplar ) (int , error ) {
0 commit comments