Skip to content
Draft
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using OpenTelemetry.Exporter.Prometheus.Serialization;
using OpenTelemetry.Metrics;

namespace OpenTelemetry.Exporter.Prometheus;
Expand Down Expand Up @@ -348,21 +349,22 @@ private bool TryWriteResponse(PrometheusProtocol protocol, PrometheusProtocolSta
{
try
{
var cursor = this.WriteTargetInfo(protocol, state);
var metricStates = this.GetMetricStates(metrics, protocol.IsOpenMetrics);
var serializer = TextFormatSerializer.GetSerializer(protocol);

var cursor = this.WriteTargetInfo(serializer, state);
var metricStates = this.GetMetricStates(serializer, metrics);
Comment thread
martincostello marked this conversation as resolved.

foreach (var metricState in metricStates)
{
while (true)
{
try
{
cursor = PrometheusSerializer.WriteMetric(
cursor = serializer.WriteMetric(
state.Buffer,
cursor,
metricState.Metric,
metricState.PrometheusMetric,
protocol.IsOpenMetrics,
metricState.WriteType,
metricState.WriteUnit,
metricState.WriteHelp,
Expand All @@ -385,7 +387,7 @@ private bool TryWriteResponse(PrometheusProtocol protocol, PrometheusProtocolSta
{
try
{
cursor = PrometheusSerializer.WriteEof(state.Buffer, cursor);
cursor = TextFormatSerializer.WriteEof(state.Buffer, cursor);
break;
}
catch (Exception ex) when (ex is IndexOutOfRangeException or ArgumentException)
Expand Down Expand Up @@ -469,13 +471,13 @@ state.GeneratedAtElapsed is { } generatedAtElapsed &&
private PrometheusProtocolState GetProtocolState(PrometheusProtocol protocol)
=> this.protocolStates.GetOrAdd(protocol, static _ => new());

private int WriteTargetInfo(PrometheusProtocol protocol, PrometheusProtocolState state)
private int WriteTargetInfo(TextFormatSerializer serializer, PrometheusProtocolState state)
{
while (true)
{
try
{
return PrometheusSerializer.WriteTargetInfo(state.Buffer, 0, this.exporter.Resource, protocol.IsOpenMetrics);
return serializer.WriteTargetInfo(state.Buffer, 0, this.exporter.Resource);
}
catch (Exception ex) when (ex is IndexOutOfRangeException or ArgumentException)
{
Expand Down Expand Up @@ -505,21 +507,21 @@ private PrometheusMetric GetPrometheusMetric(Metric metric)
return prometheusMetric;
}

private List<MetricState> GetMetricStates(in Batch<Metric> metrics, bool openMetricsRequested)
private List<MetricState> GetMetricStates(TextFormatSerializer serializer, in Batch<Metric> metrics)
{
var precomputedMetricStates = new List<PrecomputedMetricState>();
var metadataStates = new Dictionary<string, MetadataState>(StringComparer.Ordinal);
HashSet<string>? droppedMetricNames = null;

foreach (var metric in metrics)
{
if (!PrometheusSerializer.CanWriteMetric(metric))
if (!TextFormatSerializer.CanWriteMetric(metric))
{
continue;
}

var prometheusMetric = this.GetPrometheusMetric(metric);
var metadataName = openMetricsRequested ? prometheusMetric.OpenMetricsMetadataName : prometheusMetric.Name;
var metadataName = serializer.GetMetadataName(prometheusMetric);
precomputedMetricStates.Add(new PrecomputedMetricState(metric, prometheusMetric, metadataName));

if (!metadataStates.TryGetValue(metadataName, out var metadataState))
Expand Down
Loading