Skip to content

Commit

Permalink
Add tests and unshipped api
Browse files Browse the repository at this point in the history
  • Loading branch information
robertcoltheart committed Nov 27, 2023
1 parent 665537c commit 676b700
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ Microsoft.AspNetCore.Builder.PrometheusExporterApplicationBuilderExtensions
Microsoft.AspNetCore.Builder.PrometheusExporterEndpointRouteBuilderExtensions
OpenTelemetry.Exporter.PrometheusAspNetCoreOptions
OpenTelemetry.Exporter.PrometheusAspNetCoreOptions.PrometheusAspNetCoreOptions() -> void
OpenTelemetry.Exporter.PrometheusAspNetCoreOptions.ScopeInfoEnabled.get -> bool
OpenTelemetry.Exporter.PrometheusAspNetCoreOptions.ScopeInfoEnabled.set -> void
OpenTelemetry.Exporter.PrometheusAspNetCoreOptions.ScrapeEndpointPath.get -> string
OpenTelemetry.Exporter.PrometheusAspNetCoreOptions.ScrapeEndpointPath.set -> void
OpenTelemetry.Exporter.PrometheusAspNetCoreOptions.ScrapeResponseCacheDurationMilliseconds.get -> int
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public static bool CanWriteMetric(Metric metric)
return true;
}

public static int WriteMetric(byte[] buffer, int cursor, Metric metric, PrometheusMetric prometheusMetric, bool scopeInfoEnabled)
public static int WriteMetric(byte[] buffer, int cursor, Metric metric, PrometheusMetric prometheusMetric, bool scopeInfoEnabled = true)
{
cursor = WriteTypeMetadata(buffer, cursor, prometheusMetric);
cursor = WriteUnitMetadata(buffer, cursor, prometheusMetric);
Expand Down Expand Up @@ -126,6 +126,18 @@ public static int WriteMetric(byte[] buffer, int cursor, Metric metric, Promethe
cursor = WriteMetricName(buffer, cursor, prometheusMetric);
cursor = WriteAsciiStringNoEscape(buffer, cursor, "_bucket{");

if (scopeInfoEnabled)
{
cursor = WriteLabel(buffer, cursor, "otel_scope_name", metric.MeterName);
buffer[cursor++] = unchecked((byte)',');

if (!string.IsNullOrEmpty(metric.MeterVersion))
{
cursor = WriteLabel(buffer, cursor, "otel_scope_version", metric.MeterVersion);
buffer[cursor++] = unchecked((byte)',');
}
}

foreach (var tag in tags)
{
cursor = WriteLabel(buffer, cursor, tag.Key, tag.Value);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,15 @@ public async Task PrometheusExporterMiddlewareIntegration_MapEndpoint_WithMeterP
registerMeterProvider: false);
}

[Fact]
public async Task PrometheusExporterMiddlewareIntegration_DisableExportScopeInfo()
{
await RunPrometheusExporterMiddlewareIntegrationTest(
"/metrics",
app => app.UseOpenTelemetryPrometheusScrapingEndpoint(),
configureOptions: o => o.ScopeInfoEnabled = false);
}

private static async Task RunPrometheusExporterMiddlewareIntegrationTest(
string path,
Action<IApplicationBuilder> configure,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -512,8 +512,95 @@ public void ExponentialHistogramIsIgnoredForNow()
Assert.False(PrometheusSerializer.CanWriteMetric(metrics[0]));
}

private static int WriteMetric(byte[] buffer, int cursor, Metric metric)
[Fact]
public void ScopeInfo()
{
var buffer = new byte[85000];

var cursor = PrometheusSerializer.WriteScopeInfo(buffer, 0, "test_meter");

Assert.Matches(
("^"
+ "# TYPE otel_scope_info info\n"
+ "# HELP otel_scope_info Scope metadata\n"
+ "otel_scope_info{otel_scope_name='test_meter'} 1\n"
+ "$").Replace('\'', '"'),
Encoding.UTF8.GetString(buffer, 0, cursor));
}

[Fact]
public void SumWithScopeInfo()
{
var buffer = new byte[85000];
var metrics = new List<Metric>();

using var meter = new Meter("meter_name", "meter_version");
using var provider = Sdk.CreateMeterProviderBuilder()
.AddMeter(meter.Name)
.AddInMemoryExporter(metrics)
.Build();

var counter = meter.CreateUpDownCounter<double>("test_updown_counter");
counter.Add(10);
counter.Add(-11);

provider.ForceFlush();

var cursor = WriteMetric(buffer, 0, metrics[0], true);
Assert.Matches(
("^"
+ "# TYPE test_updown_counter gauge\n"
+ "test_updown_counter{otel_scope_name='meter_name',otel_scope_version='meter_version'} -1 \\d+\n"
+ "$").Replace('\'', '"'),
Encoding.UTF8.GetString(buffer, 0, cursor));
}

[Fact]
public void HistogramOneDimensionWithScopeInfo()
{
var buffer = new byte[85000];
var metrics = new List<Metric>();

using var meter = new Meter("meter_name", "meter_version");
using var provider = Sdk.CreateMeterProviderBuilder()
.AddMeter(meter.Name)
.AddInMemoryExporter(metrics)
.Build();

var histogram = meter.CreateHistogram<double>("test_histogram");
histogram.Record(18, new KeyValuePair<string, object>("x", "1"));
histogram.Record(100, new KeyValuePair<string, object>("x", "1"));

provider.ForceFlush();

var cursor = WriteMetric(buffer, 0, metrics[0], true);
Assert.Matches(
("^"
+ "# TYPE test_histogram histogram\n"
+ "test_histogram_bucket{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1',le='0'} 0 \\d+\n"
+ "test_histogram_bucket{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1',le='5'} 0 \\d+\n"
+ "test_histogram_bucket{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1',le='10'} 0 \\d+\n"
+ "test_histogram_bucket{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1',le='25'} 1 \\d+\n"
+ "test_histogram_bucket{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1',le='50'} 1 \\d+\n"
+ "test_histogram_bucket{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1',le='75'} 1 \\d+\n"
+ "test_histogram_bucket{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1',le='100'} 2 \\d+\n"
+ "test_histogram_bucket{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1',le='250'} 2 \\d+\n"
+ "test_histogram_bucket{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1',le='500'} 2 \\d+\n"
+ "test_histogram_bucket{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1',le='750'} 2 \\d+\n"
+ "test_histogram_bucket{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1',le='1000'} 2 \\d+\n"
+ "test_histogram_bucket{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1',le='2500'} 2 \\d+\n"
+ "test_histogram_bucket{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1',le='5000'} 2 \\d+\n"
+ "test_histogram_bucket{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1',le='7500'} 2 \\d+\n"
+ "test_histogram_bucket{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1',le='10000'} 2 \\d+\n"
+ "test_histogram_bucket{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1',le='\\+Inf'} 2 \\d+\n"
+ "test_histogram_sum{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1'} 118 \\d+\n"
+ "test_histogram_count{otel_scope_name='meter_name',otel_scope_version='meter_version',x='1'} 2 \\d+\n"
+ "$").Replace('\'', '"'),
Encoding.UTF8.GetString(buffer, 0, cursor));
}

private static int WriteMetric(byte[] buffer, int cursor, Metric metric, bool scopeInfoEnabled = false)
{
return PrometheusSerializer.WriteMetric(buffer, cursor, metric, PrometheusMetric.Create(metric));
return PrometheusSerializer.WriteMetric(buffer, cursor, metric, PrometheusMetric.Create(metric), scopeInfoEnabled);
}
}

0 comments on commit 676b700

Please sign in to comment.