Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -176,9 +176,10 @@ private void writeCounter(Writer writer, CounterSnapshot snapshot, EscapingSchem
MetricMetadata metadata = snapshot.getMetadata();
// OM2: use the original name, no _total or unit suffix appending.
String counterName = getOriginalMetadataName(metadata, scheme);
boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(counterName);
writeMetadataWithName(writer, counterName, "counter", metadata);
for (CounterSnapshot.CounterDataPointSnapshot data : snapshot.getDataPoints()) {
writeNameAndLabels(writer, counterName, null, data.getLabels(), scheme);
writeNameAndLabels(writer, counterName, null, data.getLabels(), scheme, nameValidLegacy);
writeDouble(writer, data.getValue());
if (data.hasScrapeTimestamp()) {
writer.write(' ');
Expand All @@ -197,9 +198,10 @@ private void writeGauge(Writer writer, GaugeSnapshot snapshot, EscapingScheme sc
throws IOException {
MetricMetadata metadata = snapshot.getMetadata();
String name = getOriginalMetadataName(metadata, scheme);
boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(name);
writeMetadataWithName(writer, name, "gauge", metadata);
for (GaugeSnapshot.GaugeDataPointSnapshot data : snapshot.getDataPoints()) {
writeNameAndLabels(writer, name, null, data.getLabels(), scheme);
writeNameAndLabels(writer, name, null, data.getLabels(), scheme, nameValidLegacy);
writeDouble(writer, data.getValue());
if (exemplarsOnAllMetricTypesEnabled) {
writeScrapeTimestampAndExemplar(writer, data, data.getExemplar(), scheme);
Expand All @@ -215,40 +217,51 @@ private void writeHistogram(Writer writer, HistogramSnapshot snapshot, EscapingS
openMetrics2Properties.getCompositeValues() || openMetrics2Properties.getNativeHistograms();
MetricMetadata metadata = snapshot.getMetadata();
String name = getOriginalMetadataName(metadata, scheme);
boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(name);
if (!compositeHistogram && !openMetrics2Properties.getExemplarCompliance()) {
writeClassicHistogram(writer, name, snapshot, scheme);
writeClassicHistogram(writer, name, snapshot, scheme, nameValidLegacy);
return;
}
if (snapshot.isGaugeHistogram()) {
writeMetadataWithName(writer, name, "gaugehistogram", metadata);
for (HistogramSnapshot.HistogramDataPointSnapshot data : snapshot.getDataPoints()) {
if (openMetrics2Properties.getNativeHistograms() && data.hasNativeHistogramData()) {
writeNativeHistogramDataPoint(writer, name, "gcount", "gsum", data, scheme, false);
writeNativeHistogramDataPoint(
writer, name, "gcount", "gsum", data, scheme, false, nameValidLegacy);
} else {
writeCompositeHistogramDataPoint(writer, name, "gcount", "gsum", data, scheme, false);
writeCompositeHistogramDataPoint(
writer, name, "gcount", "gsum", data, scheme, false, nameValidLegacy);
}
}
} else {
writeMetadataWithName(writer, name, "histogram", metadata);
for (HistogramSnapshot.HistogramDataPointSnapshot data : snapshot.getDataPoints()) {
if (openMetrics2Properties.getNativeHistograms() && data.hasNativeHistogramData()) {
writeNativeHistogramDataPoint(writer, name, "count", "sum", data, scheme, true);
writeNativeHistogramDataPoint(
writer, name, "count", "sum", data, scheme, true, nameValidLegacy);
} else {
writeCompositeHistogramDataPoint(writer, name, "count", "sum", data, scheme, true);
writeCompositeHistogramDataPoint(
writer, name, "count", "sum", data, scheme, true, nameValidLegacy);
}
}
}
}

private void writeClassicHistogram(
Writer writer, String name, HistogramSnapshot snapshot, EscapingScheme scheme)
Writer writer,
String name,
HistogramSnapshot snapshot,
EscapingScheme scheme,
boolean nameValidLegacy)
throws IOException {
if (snapshot.isGaugeHistogram()) {
writeMetadataWithName(writer, name, "gaugehistogram", snapshot.getMetadata());
writeClassicHistogramDataPoints(writer, name, "_gcount", "_gsum", snapshot, scheme);
writeClassicHistogramDataPoints(
writer, name, "_gcount", "_gsum", snapshot, scheme, nameValidLegacy);
} else {
writeMetadataWithName(writer, name, "histogram", snapshot.getMetadata());
writeClassicHistogramDataPoints(writer, name, "_count", "_sum", snapshot, scheme);
writeClassicHistogramDataPoints(
writer, name, "_count", "_sum", snapshot, scheme, nameValidLegacy);
}
}

Expand All @@ -258,7 +271,8 @@ private void writeClassicHistogramDataPoints(
String countSuffix,
String sumSuffix,
HistogramSnapshot snapshot,
EscapingScheme scheme)
EscapingScheme scheme,
boolean nameValidLegacy)
throws IOException {
String bucketName = name + "_bucket";
for (HistogramSnapshot.HistogramDataPointSnapshot data : snapshot.getDataPoints()) {
Expand All @@ -268,7 +282,14 @@ private void writeClassicHistogramDataPoints(
for (int i = 0; i < buckets.size(); i++) {
cumulativeCount += buckets.getCount(i);
writeNameAndLabels(
writer, bucketName, null, data.getLabels(), scheme, "le", buckets.getUpperBound(i));
writer,
bucketName,
null,
data.getLabels(),
scheme,
"le",
buckets.getUpperBound(i),
nameValidLegacy);
writeLong(writer, cumulativeCount);
Exemplar exemplar;
if (i == 0) {
Expand All @@ -279,9 +300,10 @@ private void writeClassicHistogramDataPoints(
writeScrapeTimestampAndExemplar(writer, data, exemplar, scheme);
}
if (data.hasCount() && data.hasSum()) {
writeClassicCountAndSum(writer, name, data, countSuffix, sumSuffix, exemplars, scheme);
writeClassicCountAndSum(
writer, name, data, countSuffix, sumSuffix, exemplars, scheme, nameValidLegacy);
}
writeClassicCreated(writer, name, data, scheme);
writeClassicCreated(writer, name, data, scheme, nameValidLegacy);
}
}

Expand All @@ -292,16 +314,17 @@ private void writeClassicCountAndSum(
String countSuffix,
String sumSuffix,
Exemplars exemplars,
EscapingScheme scheme)
EscapingScheme scheme,
boolean nameValidLegacy)
throws IOException {
writeNameAndLabels(writer, name, countSuffix, data.getLabels(), scheme);
writeNameAndLabels(writer, name, countSuffix, data.getLabels(), scheme, nameValidLegacy);
writeLong(writer, data.getCount());
if (exemplarsOnAllMetricTypesEnabled) {
writeScrapeTimestampAndExemplar(writer, data, exemplars.getLatest(), scheme);
} else {
writeScrapeTimestampAndExemplar(writer, data, null, scheme);
}
writeNameAndLabels(writer, name, sumSuffix, data.getLabels(), scheme);
writeNameAndLabels(writer, name, sumSuffix, data.getLabels(), scheme, nameValidLegacy);
writeDouble(writer, data.getSum());
writeScrapeTimestampAndExemplar(writer, data, null, scheme);
}
Expand All @@ -310,10 +333,11 @@ private void writeClassicCreated(
Writer writer,
String name,
HistogramSnapshot.HistogramDataPointSnapshot data,
EscapingScheme scheme)
EscapingScheme scheme,
boolean nameValidLegacy)
throws IOException {
if (createdTimestampsEnabled && data.hasCreatedTimestamp()) {
writeNameAndLabels(writer, name, "_created", data.getLabels(), scheme);
writeNameAndLabels(writer, name, "_created", data.getLabels(), scheme, nameValidLegacy);
writeOpenMetricsTimestamp(writer, data.getCreatedTimestampMillis());
if (data.hasScrapeTimestamp()) {
writer.write(' ');
Expand All @@ -330,9 +354,10 @@ private void writeCompositeHistogramDataPoint(
String sumKey,
HistogramSnapshot.HistogramDataPointSnapshot data,
EscapingScheme scheme,
boolean includeStartTimestamp)
boolean includeStartTimestamp,
boolean nameValidLegacy)
throws IOException {
writeNameAndLabels(writer, name, null, data.getLabels(), scheme);
writeNameAndLabels(writer, name, null, data.getLabels(), scheme, nameValidLegacy);
writer.write('{');
writer.write(countKey);
writer.write(':');
Expand Down Expand Up @@ -362,9 +387,10 @@ private void writeNativeHistogramDataPoint(
String sumKey,
HistogramSnapshot.HistogramDataPointSnapshot data,
EscapingScheme scheme,
boolean includeStartTimestamp)
boolean includeStartTimestamp,
boolean nameValidLegacy)
throws IOException {
writeNameAndLabels(writer, name, null, data.getLabels(), scheme);
writeNameAndLabels(writer, name, null, data.getLabels(), scheme, nameValidLegacy);
writer.write('{');
writer.write(countKey);
writer.write(':');
Expand Down Expand Up @@ -486,6 +512,7 @@ private void writeSummary(Writer writer, SummarySnapshot snapshot, EscapingSchem
boolean metadataWritten = false;
MetricMetadata metadata = snapshot.getMetadata();
String name = getOriginalMetadataName(metadata, scheme);
boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(name);
for (SummarySnapshot.SummaryDataPointSnapshot data : snapshot.getDataPoints()) {
if (data.getQuantiles().size() == 0 && !data.hasCount() && !data.hasSum()) {
continue;
Expand All @@ -494,17 +521,18 @@ private void writeSummary(Writer writer, SummarySnapshot snapshot, EscapingSchem
writeMetadataWithName(writer, name, "summary", metadata);
metadataWritten = true;
}
writeCompositeSummaryDataPoint(writer, name, data, scheme);
writeCompositeSummaryDataPoint(writer, name, data, scheme, nameValidLegacy);
}
}

private void writeCompositeSummaryDataPoint(
Writer writer,
String name,
SummarySnapshot.SummaryDataPointSnapshot data,
EscapingScheme scheme)
EscapingScheme scheme,
boolean nameValidLegacy)
throws IOException {
writeNameAndLabels(writer, name, null, data.getLabels(), scheme);
writeNameAndLabels(writer, name, null, data.getLabels(), scheme, nameValidLegacy);
writer.write('{');
boolean first = true;
if (data.hasCount()) {
Expand Down Expand Up @@ -553,9 +581,10 @@ private void writeInfo(Writer writer, InfoSnapshot snapshot, EscapingScheme sche
// OM2 spec: Info MetricFamily name MUST end in _info.
// In OM2, TYPE/HELP use the same name as the data lines.
String infoName = ensureSuffix(getOriginalMetadataName(metadata, scheme), "_info");
boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(infoName);
writeMetadataWithName(writer, infoName, "info", metadata);
for (InfoSnapshot.InfoDataPointSnapshot data : snapshot.getDataPoints()) {
writeNameAndLabels(writer, infoName, null, data.getLabels(), scheme);
writeNameAndLabels(writer, infoName, null, data.getLabels(), scheme, nameValidLegacy);
writer.write("1");
writeScrapeTimestampAndExemplar(writer, data, null, scheme);
}
Expand Down Expand Up @@ -601,9 +630,10 @@ private void writeUnknown(Writer writer, UnknownSnapshot snapshot, EscapingSchem
throws IOException {
MetricMetadata metadata = snapshot.getMetadata();
String name = getOriginalMetadataName(metadata, scheme);
boolean nameValidLegacy = PrometheusNaming.isValidLegacyMetricName(name);
writeMetadataWithName(writer, name, "unknown", metadata);
for (UnknownSnapshot.UnknownDataPointSnapshot data : snapshot.getDataPoints()) {
writeNameAndLabels(writer, name, null, data.getLabels(), scheme);
writeNameAndLabels(writer, name, null, data.getLabels(), scheme, nameValidLegacy);
writeDouble(writer, data.getValue());
if (exemplarsOnAllMetricTypesEnabled) {
writeScrapeTimestampAndExemplar(writer, data, data.getExemplar(), scheme);
Expand All @@ -618,9 +648,10 @@ private void writeNameAndLabels(
String name,
@Nullable String suffix,
Labels labels,
EscapingScheme escapingScheme)
EscapingScheme escapingScheme,
boolean nameValidLegacy)
throws IOException {
writeNameAndLabels(writer, name, suffix, labels, escapingScheme, null, 0.0);
writeNameAndLabels(writer, name, suffix, labels, escapingScheme, null, 0.0, nameValidLegacy);
}

private void writeNameAndLabels(
Expand All @@ -630,16 +661,19 @@ private void writeNameAndLabels(
Labels labels,
EscapingScheme escapingScheme,
@Nullable String additionalLabelName,
double additionalLabelValue)
double additionalLabelValue,
boolean nameValidLegacy)
throws IOException {
boolean metricInsideBraces = false;
// If the name does not pass the legacy validity check, we must put the
// metric name inside the braces.
if (!PrometheusNaming.isValidLegacyMetricName(name)) {
// If the name does not pass the legacy validity check, we must put the metric name inside the
// braces. Validity is scanned once per family by the caller (the metric name is constant across
// all data points), not re-scanned for every series. A suffix built from legacy characters
// (_total, _bucket, ...) does not change legacy validity, so the base-name check applies here.
if (!nameValidLegacy) {
metricInsideBraces = true;
writer.write('{');
}
writeName(writer, suffix != null ? name + suffix : name, NameType.Metric);
writeName(writer, suffix != null ? name + suffix : name, NameType.Metric, nameValidLegacy);
if (!labels.isEmpty() || additionalLabelName != null) {
writeLabels(
writer,
Expand Down
Loading