Skip to content

Commit

Permalink
feat(api): Replace Elastic APM with Open Telemetry
Browse files Browse the repository at this point in the history
  • Loading branch information
VMelnalksnis committed Mar 25, 2023
1 parent de5d5f7 commit f53ddf9
Show file tree
Hide file tree
Showing 24 changed files with 932 additions and 1,796 deletions.
17 changes: 9 additions & 8 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,6 @@
<PackageVersion Include="dbup-sqlite" Version="5.0.8"/>
<PackageVersion Include="DotNet.ReproducibleBuilds" Version="1.1.1"/>
<PackageVersion Include="DotNet.ReproducibleBuilds.Isolated" Version="1.1.1"/>
<PackageVersion Include="Elastic.Apm.AspNetCore" Version="1.20.0"/>
<PackageVersion Include="Elastic.Apm.Elasticsearch" Version="1.20.0"/>
<PackageVersion Include="Elastic.Apm.EntityFrameworkCore" Version="1.20.0"/>
<PackageVersion Include="Elastic.Apm.SerilogEnricher" Version="1.5.3"/>
<PackageVersion Include="Elastic.CommonSchema.Serilog" Version="1.5.3"/>
<PackageVersion Include="FluentAssertions" Version="6.10.0"/>
<PackageVersion Include="FluentAssertions.NodaTime" Version="2.0.1"/>
<PackageVersion Include="FuzzySharp" Version="2.0.2"/>
Expand Down Expand Up @@ -64,17 +59,23 @@
<PackageVersion Include="Npgsql.DependencyInjection" Version="7.0.2"/>
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.3"/>
<PackageVersion Include="Npgsql.NodaTime" Version="7.0.2"/>
<PackageVersion Include="Npgsql.OpenTelemetry" Version="7.0.2"/>
<PackageVersion Include="NUnit" Version="3.13.3"/>
<PackageVersion Include="NUnit3TestAdapter" Version="4.4.2"/>
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol.Logs" Version="1.4.0-rc.4"/>
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.4.0"/>
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.4.0"/>
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.0.0-rc9.14"/>
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.0.0-rc9.14"/>
<PackageVersion Include="OpenTelemetry.Instrumentation.Process" Version="0.5.0-beta.2"/>
<PackageVersion Include="OpenTelemetry.Instrumentation.SqlClient" Version="1.0.0-rc9.13"/>
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.1.0-rc.2"/>
<PackageVersion Include="PropertyChanged.SourceGenerator" Version="1.0.8"/>
<PackageVersion Include="Serilog" Version="2.12.0"/>
<PackageVersion Include="Serilog.AspNetCore" Version="6.1.0"/>
<PackageVersion Include="Serilog.Extensions.Hosting" Version="5.0.1"/>
<PackageVersion Include="Serilog.Settings.Configuration" Version="3.4.0"/>
<PackageVersion Include="Serilog.Sinks.Console" Version="4.1.0"/>
<PackageVersion Include="Serilog.Sinks.Elasticsearch" Version="9.0.0"/>
<PackageVersion Include="Serilog.Sinks.File" Version="5.0.0"/>
<PackageVersion Include="Serilog.Sinks.NUnit" Version="1.0.3"/>
<PackageVersion Include="Serilog.Sinks.Trace" Version="3.0.0"/>
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.5.0"/>
<PackageVersion Include="Swashbuckle.AspNetCore.Annotations" Version="6.5.0"/>
Expand Down
1 change: 1 addition & 0 deletions Gnomeshade.sln.DotSettings
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
<s:Boolean x:Key="/Default/UserDictionary/Words/=inheritdoc/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Lockbox/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Nordigen/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Otlp/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Ownable/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Rimi/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Servicer/@EntryIndexedValue">True</s:Boolean>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@
<ItemGroup>
<PackageReference Include="dbup-postgresql" />
<PackageReference Include="Npgsql.DependencyInjection" />
<PackageReference Include="Npgsql.NodaTime" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" />
<PackageReference Include="Npgsql.NodaTime" />
<PackageReference Include="Npgsql.OpenTelemetry"/>
</ItemGroup>

<ItemGroup>
Expand Down
36 changes: 34 additions & 2 deletions source/Gnomeshade.Data.PostgreSQL/packages.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,16 @@
"Npgsql": "7.0.2"
}
},
"Npgsql.OpenTelemetry": {
"type": "Direct",
"requested": "[7.0.2, )",
"resolved": "7.0.2",
"contentHash": "ZHXJYk3vkLPmBdh1MeKDWtqobHXW+nLxRMbrGBAEvUZEdHoVj/8iwHIjb+FqvDM2tOMgtLJZ689v69qIgBGAKQ==",
"dependencies": {
"Npgsql": "7.0.2",
"OpenTelemetry.API": "1.3.1"
}
},
"StyleCop.Analyzers": {
"type": "Direct",
"requested": "[1.2.0-beta.406, )",
Expand Down Expand Up @@ -257,6 +267,15 @@
"Microsoft.Extensions.Logging.Abstractions": "6.0.0"
}
},
"OpenTelemetry.Api": {
"type": "Transitive",
"resolved": "1.3.1",
"contentHash": "p4ufCQ+afYMEYh1pF8K5huhJ4PnYVvKvje+GjhiDPRrQTmwto5nl8spjeK9N1OXg2HFmGuMXQvc8y90RoNLekg==",
"dependencies": {
"System.Diagnostics.DiagnosticSource": "[6.0.0, 8.0.0)",
"System.Reflection.Emit.Lightweight": "4.7.0"
}
},
"runtime.native.System": {
"type": "Transitive",
"resolved": "4.3.0",
Expand Down Expand Up @@ -291,6 +310,14 @@
"System.Runtime": "4.3.0"
}
},
"System.Diagnostics.DiagnosticSource": {
"type": "Transitive",
"resolved": "6.0.0",
"contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==",
"dependencies": {
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
}
},
"System.Diagnostics.TraceSource": {
"type": "Transitive",
"resolved": "4.3.0",
Expand Down Expand Up @@ -341,6 +368,11 @@
"System.Runtime": "4.3.0"
}
},
"System.Reflection.Emit.Lightweight": {
"type": "Transitive",
"resolved": "4.7.0",
"contentHash": "a4OLB4IITxAXJeV74MDx49Oq2+PsF6Sml54XAFv+2RyWwtDBcabzoxiiJRhdhx+gaohLh4hEGCLQyBozXoQPqA=="
},
"System.Reflection.Primitives": {
"type": "Transitive",
"resolved": "4.3.0",
Expand Down Expand Up @@ -374,8 +406,8 @@
},
"System.Runtime.CompilerServices.Unsafe": {
"type": "Transitive",
"resolved": "4.7.1",
"contentHash": "zOHkQmzPCn5zm/BH+cxC1XbUS3P4Yoi3xzW7eRgVpDR2tPGSzyMZ17Ig1iRkfJuY0nhxkQQde8pgePNiA7z7TQ=="
"resolved": "6.0.0",
"contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg=="
},
"System.Runtime.Extensions": {
"type": "Transitive",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// Copyright 2021 Valters Melnalksnis
// Licensed under the GNU Affero General Public License v3.0 or later.
// See LICENSE.txt file in the project root for full license information.

using Gnomeshade.WebApi.Configuration.Options;

using Microsoft.Extensions.Options;

using OpenTelemetry.Exporter;

namespace Gnomeshade.WebApi.Configuration;

internal sealed class ConfigureOtlpExporterOptions : IConfigureOptions<OtlpExporterOptions>
{
private readonly IOptionsMonitor<OpenTelemetryOptions> _optionsMonitor;

public ConfigureOtlpExporterOptions(IOptionsMonitor<OpenTelemetryOptions> optionsMonitor)
{
_optionsMonitor = optionsMonitor;
}

/// <inheritdoc />
public void Configure(OtlpExporterOptions options)
{
var telemetryOptions = _optionsMonitor.CurrentValue;

options.Endpoint = telemetryOptions.ExporterEndpoint;
options.Protocol = OtlpExportProtocol.Grpc;
}
}
83 changes: 83 additions & 0 deletions source/Gnomeshade.WebApi/Configuration/OpenTelemetryExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
// Copyright 2021 Valters Melnalksnis
// Licensed under the GNU Affero General Public License v3.0 or later.
// See LICENSE.txt file in the project root for full license information.

using System.Collections.Generic;

using Gnomeshade.WebApi.Configuration.Options;

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;

using Npgsql;

using OpenTelemetry.Exporter;
using OpenTelemetry.Logs;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;

namespace Gnomeshade.WebApi.Configuration;

internal static class OpenTelemetryExtensions
{
internal static IServiceCollection AddGnomeshadeOpenTelemetry(
this IServiceCollection services,
IConfiguration configuration)
{
var telemetryOptions = configuration.GetValid<OpenTelemetryOptions>();
if (!telemetryOptions.Enabled)
{
return services;
}

var serviceName = telemetryOptions.ServiceName;
var serviceVersion = telemetryOptions.ServiceVersion;
var environment = configuration.GetValue<string>("environment") ?? "Development";

var resourceBuilder = ResourceBuilder
.CreateEmpty()
.AddTelemetrySdk()
.AddService(serviceName, serviceVersion: serviceVersion)
.AddAttributes(new Dictionary<string, object> { { "deployment.environment", environment } });

services
.AddSingleton<IConfigureOptions<OtlpExporterOptions>, ConfigureOtlpExporterOptions>()
.AddOpenTelemetry()
.WithTracing(builder =>
{
builder.AddOtlpExporter();
builder.SetResourceBuilder(resourceBuilder);
builder.AddSource(serviceName);

builder
.AddHttpClientInstrumentation(options => options.RecordException = true)
.AddAspNetCoreInstrumentation(options => options.RecordException = true)
.AddNpgsql();
})
.WithMetrics(builder =>
{
builder.AddOtlpExporter();
builder.SetResourceBuilder(resourceBuilder);

builder
.AddProcessInstrumentation()
.AddHttpClientInstrumentation()
.AddAspNetCoreInstrumentation()
.AddRuntimeInstrumentation();
});

services.AddLogging(builder => builder.AddOpenTelemetry(options =>
{
options.AddOtlpExporter();
options.SetResourceBuilder(resourceBuilder);
options.IncludeScopes = true;
options.IncludeFormattedMessage = true;
options.ParseStateValues = true;
}));

return services;
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// Copyright 2021 Valters Melnalksnis
// Licensed under the GNU Affero General Public License v3.0 or later.
// See LICENSE.txt file in the project root for full license information.

using System;
using System.ComponentModel.DataAnnotations;
using System.Reflection;

namespace Gnomeshade.WebApi.Configuration.Options;

/// <summary>Options for configuring Open Telemetry.</summary>
public sealed class OpenTelemetryOptions
{
internal const string SectionName = "OpenTelemetry";

/// <summary>Gets a value indicating whether to enable Open Telemetry.</summary>
public bool Enabled { get; init; } = true;

/// <summary>Gets the name of the service.</summary>
[Required]
public string ServiceName { get; init; } = "Gnomeshade";

/// <summary>Gets the version of the service. Defaults to the assembly version.</summary>
[Required]
public string ServiceVersion { get; init; } = Assembly.GetExecutingAssembly().GetName().Version?.ToString()!;

/// <summary>Gets the endpoint to which to send the telemetry. Defaults to localhost.</summary>
[Required]
public Uri ExporterEndpoint { get; init; } = new("http://localhost:4317");
}
Loading

0 comments on commit f53ddf9

Please sign in to comment.