Skip to content

Commit

Permalink
[sdk-metrics] Simplify the state built when an instrument is published (
Browse files Browse the repository at this point in the history
  • Loading branch information
CodeBlanch authored Feb 20, 2024
1 parent bbce7ef commit af2b551
Show file tree
Hide file tree
Showing 6 changed files with 179 additions and 435 deletions.
115 changes: 13 additions & 102 deletions src/OpenTelemetry/Metrics/CompositeMetricReaderExt.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,126 +11,37 @@ namespace OpenTelemetry.Metrics;
/// </summary>
internal sealed partial class CompositeMetricReader
{
internal List<Metric?> AddMetricsWithNoViews(Instrument instrument)
internal override List<Metric> AddMetricWithNoViews(Instrument instrument)
{
var metrics = new List<Metric?>(this.count);
var metrics = new List<Metric>(this.count);

for (var cur = this.Head; cur != null; cur = cur.Next)
{
metrics.Add(cur.Value.AddMetricWithNoViews(instrument));
}

return metrics;
}

internal void RecordSingleStreamLongMeasurements(List<Metric?> metrics, long value, ReadOnlySpan<KeyValuePair<string, object?>> tags)
{
Debug.Assert(metrics.Count == this.count, "The count of metrics to be updated for a CompositeReader must match the number of individual readers.");

int index = 0;
for (var cur = this.Head; cur != null; cur = cur.Next)
{
var metric = metrics[index];
if (metric != null)
var innerMetrics = cur.Value.AddMetricWithNoViews(instrument);
if (innerMetrics.Count > 0)
{
cur.Value.RecordSingleStreamLongMeasurement(metric, value, tags);
}

index++;
}
}

internal void RecordSingleStreamDoubleMeasurements(List<Metric?> metrics, double value, ReadOnlySpan<KeyValuePair<string, object?>> tags)
{
Debug.Assert(metrics.Count == this.count, "The count of metrics to be updated for a CompositeReader must match the number of individual readers.");
Debug.Assert(innerMetrics.Count == 1, "Multiple metrics returned without view configuration");

int index = 0;
for (var cur = this.Head; cur != null; cur = cur.Next)
{
var metric = metrics[index];
if (metric != null)
{
cur.Value.RecordSingleStreamDoubleMeasurement(metric, value, tags);
metrics.AddRange(innerMetrics);
}

index++;
}
}

internal List<List<Metric>> AddMetricsSuperListWithViews(Instrument instrument, List<MetricStreamConfiguration?> metricStreamConfigs)
{
var metricsSuperList = new List<List<Metric>>(this.count);
for (var cur = this.Head; cur != null; cur = cur.Next)
{
var metrics = cur.Value.AddMetricsListWithViews(instrument, metricStreamConfigs);
metricsSuperList.Add(metrics);
}

return metricsSuperList;
}

internal void RecordLongMeasurements(List<List<Metric>> metricsSuperList, long value, ReadOnlySpan<KeyValuePair<string, object?>> tags)
{
Debug.Assert(metricsSuperList.Count == this.count, "The count of metrics to be updated for a CompositeReader must match the number of individual readers.");

int index = 0;
for (var cur = this.Head; cur != null; cur = cur.Next)
{
if (metricsSuperList[index].Count > 0)
{
cur.Value.RecordLongMeasurement(metricsSuperList[index], value, tags);
}

index++;
}
return metrics;
}

internal void RecordDoubleMeasurements(List<List<Metric>> metricsSuperList, double value, ReadOnlySpan<KeyValuePair<string, object?>> tags)
internal override List<Metric> AddMetricWithViews(Instrument instrument, List<MetricStreamConfiguration?> metricStreamConfigs)
{
Debug.Assert(metricsSuperList.Count == this.count, "The count of metrics to be updated for a CompositeReader must match the number of individual readers.");

int index = 0;
for (var cur = this.Head; cur != null; cur = cur.Next)
{
if (metricsSuperList[index].Count > 0)
{
cur.Value.RecordDoubleMeasurement(metricsSuperList[index], value, tags);
}

index++;
}
}
Debug.Assert(metricStreamConfigs != null, "metricStreamConfigs was null");

internal void CompleteSingleStreamMeasurements(List<Metric?> metrics)
{
Debug.Assert(metrics.Count == this.count, "The count of metrics to be updated for a CompositeReader must match the number of individual readers.");
var metrics = new List<Metric>(this.count * metricStreamConfigs!.Count);

int index = 0;
for (var cur = this.Head; cur != null; cur = cur.Next)
{
var metric = metrics[index];
if (metric != null)
{
cur.Value.CompleteSingleStreamMeasurement(metric);
}
var innerMetrics = cur.Value.AddMetricWithViews(instrument, metricStreamConfigs);

index++;
metrics.AddRange(innerMetrics);
}
}

internal void CompleteMeasurements(List<List<Metric>> metricsSuperList)
{
Debug.Assert(metricsSuperList.Count == this.count, "The count of metrics to be updated for a CompositeReader must match the number of individual readers.");

int index = 0;
for (var cur = this.Head; cur != null; cur = cur.Next)
{
if (metricsSuperList[index].Count > 0)
{
cur.Value.CompleteMeasurement(metricsSuperList[index]);
}

index++;
}
return metrics;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,15 @@ public MeasurementHandlers GetMeasurementHandlers()
return new MeasurementHandlers()
{
ByteHandler = (instrument, value, tags, state)
=> this.MeasurementRecordedLong(instrument, value, tags, state),
=> MeterProviderSdk.MeasurementRecordedLong(instrument, value, tags, state),
ShortHandler = (instrument, value, tags, state)
=> this.MeasurementRecordedLong(instrument, value, tags, state),
=> MeterProviderSdk.MeasurementRecordedLong(instrument, value, tags, state),
IntHandler = (instrument, value, tags, state)
=> this.MeasurementRecordedLong(instrument, value, tags, state),
LongHandler = this.MeasurementRecordedLong,
=> MeterProviderSdk.MeasurementRecordedLong(instrument, value, tags, state),
LongHandler = MeterProviderSdk.MeasurementRecordedLong,
FloatHandler = (instrument, value, tags, state)
=> this.MeasurementRecordedDouble(instrument, value, tags, state),
DoubleHandler = this.MeasurementRecordedDouble,
=> MeterProviderSdk.MeasurementRecordedDouble(instrument, value, tags, state),
DoubleHandler = MeterProviderSdk.MeasurementRecordedDouble,
};
}

Expand All @@ -55,16 +55,7 @@ public bool InstrumentPublished(Instrument instrument, out object? userState)

public void MeasurementsCompleted(Instrument instrument, object? userState)
{
var meterProvider = this.meterProviderSdk;

if (meterProvider.ViewCount > 0)
{
meterProvider.MeasurementsCompleted(instrument, userState);
}
else
{
meterProvider.MeasurementsCompletedSingleStream(instrument, userState);
}
MeterProviderSdk.MeasurementsCompleted(instrument, userState);
}

public void Initialize(IObservableInstrumentsSource source)
Expand All @@ -76,32 +67,4 @@ private void OnCollectObservableInstruments()
{
this.observableInstrumentsSource?.RecordObservableInstruments();
}

private void MeasurementRecordedDouble(Instrument instrument, double value, ReadOnlySpan<KeyValuePair<string, object?>> tagsRos, object? userState)
{
var meterProvider = this.meterProviderSdk;

if (meterProvider.ViewCount > 0)
{
meterProvider.MeasurementRecordedDouble(instrument, value, tagsRos, userState);
}
else
{
meterProvider.MeasurementRecordedDoubleSingleStream(instrument, value, tagsRos, userState);
}
}

private void MeasurementRecordedLong(Instrument instrument, long value, ReadOnlySpan<KeyValuePair<string, object?>> tagsRos, object? userState)
{
var meterProvider = this.meterProviderSdk;

if (meterProvider.ViewCount > 0)
{
meterProvider.MeasurementRecordedLong(instrument, value, tagsRos, userState);
}
else
{
meterProvider.MeasurementRecordedLongSingleStream(instrument, value, tagsRos, userState);
}
}
}
Loading

0 comments on commit af2b551

Please sign in to comment.