Skip to content

Commit ee3b27b

Browse files
author
Arthur Silva Sens
committed
expfmt/openmetrics: Write created timestamps for counters, summaries and histograms
Signed-off-by: Arthur Silva Sens <[email protected]>
1 parent 93155e4 commit ee3b27b

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

expfmt/openmetrics_create.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"strings"
2424

2525
"github.com/prometheus/common/model"
26+
"google.golang.org/protobuf/types/known/timestamppb"
2627

2728
dto "github.com/prometheus/client_model/go"
2829
)
@@ -152,6 +153,7 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int
152153
return
153154
}
154155

156+
var createdBytesWritten int
155157
// Finally the samples, one line for each.
156158
for _, metric := range in.Metric {
157159
switch metricType {
@@ -169,6 +171,10 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int
169171
metric.Counter.GetValue(), 0, false,
170172
metric.Counter.Exemplar,
171173
)
174+
if metric.Counter.CreatedTimestamp != nil {
175+
createdBytesWritten, err = writeOpenMetricsCreated(w, name, "_total", metric, "", 0, metric.Counter.GetCreatedTimestamp())
176+
n += createdBytesWritten
177+
}
172178
case dto.MetricType_GAUGE:
173179
if metric.Gauge == nil {
174180
return written, fmt.Errorf(
@@ -223,6 +229,10 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int
223229
0, metric.Summary.GetSampleCount(), true,
224230
nil,
225231
)
232+
if metric.Summary.CreatedTimestamp != nil {
233+
createdBytesWritten, err = writeOpenMetricsCreated(w, name, "", metric, "", 0, metric.Summary.GetCreatedTimestamp())
234+
n += createdBytesWritten
235+
}
226236
case dto.MetricType_HISTOGRAM:
227237
if metric.Histogram == nil {
228238
return written, fmt.Errorf(
@@ -271,6 +281,10 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int
271281
0, metric.Histogram.GetSampleCount(), true,
272282
nil,
273283
)
284+
if metric.Histogram.CreatedTimestamp != nil {
285+
createdBytesWritten, err = writeOpenMetricsCreated(w, name, "", metric, "", 0, metric.Histogram.GetCreatedTimestamp())
286+
n += createdBytesWritten
287+
}
274288
default:
275289
return written, fmt.Errorf(
276290
"unexpected type in metric %s %s", name, metric,
@@ -442,6 +456,62 @@ func writeOpenMetricsLabelPairs(
442456
return written, nil
443457
}
444458

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+
445515
// writeExemplar writes the provided exemplar in OpenMetrics format to w. The
446516
// function returns the number of bytes written and any error encountered.
447517
func writeExemplar(w enhancedWriter, e *dto.Exemplar) (int, error) {

0 commit comments

Comments
 (0)