Skip to content

Commit

Permalink
fix(elasticstack): make apm works with IHostApplicationBuilder
Browse files Browse the repository at this point in the history
  • Loading branch information
SonicGD committed Feb 7, 2024
1 parent c6d0ca8 commit d1c209b
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 70 deletions.
144 changes: 75 additions & 69 deletions src/Sitko.Core.ElasticStack/ElasticStackModule.cs
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
using System.Globalization;
using Elastic.Apm.Config;
using Elastic.Apm.NetCoreAll;
using Elastic.Apm.SerilogEnricher;
using Elastic.CommonSchema.Serilog;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Events;
using Serilog.Sinks.Elasticsearch;
using Sitko.Core.App;
using Sitko.Core.App.Web;

namespace Sitko.Core.ElasticStack;

public class ElasticStackModule : BaseApplicationModule<ElasticStackModuleOptions>,
IHostBuilderModule<ElasticStackModuleOptions>, ILoggingModule<ElasticStackModuleOptions>,
IWebApplicationModule<ElasticStackModuleOptions>
IConfigurationModule<ElasticStackModuleOptions>
{
public override string OptionsKey => "ElasticApm";

Expand All @@ -24,66 +23,7 @@ public void ConfigureHostBuilder(IApplicationContext context, IHostApplicationBu
{
if (startupOptions.ApmEnabled)
{
Environment.SetEnvironmentVariable("ELASTIC_APM_SERVICE_NAME", context.Name);
Environment.SetEnvironmentVariable("ELASTIC_APM_SERVICE_VERSION", context.Version);
Environment.SetEnvironmentVariable("ELASTIC_APM_TRANSACTION_SAMPLE_RATE",
startupOptions.ApmTransactionSampleRate.ToString(CultureInfo.InvariantCulture));
Environment.SetEnvironmentVariable("ElasticApm:TransactionMaxSpans",
startupOptions.ApmTransactionMaxSpans.ToString(CultureInfo.InvariantCulture));
Environment.SetEnvironmentVariable("ElasticApm:CentralConfig",
startupOptions.ApmCentralConfig.ToString(CultureInfo.InvariantCulture));
Environment.SetEnvironmentVariable("ElasticApm:SanitizeFieldNames",
startupOptions.ApmCentralConfig.ToString(CultureInfo.InvariantCulture));
if (startupOptions.ApmSanitizeFieldNames != null && startupOptions.ApmSanitizeFieldNames.Count != 0)
{
Environment.SetEnvironmentVariable("ElasticApm:SanitizeFieldNames",
string.Join(", ", startupOptions.ApmSanitizeFieldNames));
}

if (startupOptions.ApmGlobalLabels.Count != 0)
{
Environment.SetEnvironmentVariable("ElasticApm:GlobalLabels",
string.Join(",", startupOptions.ApmGlobalLabels.Select(kv => $"{kv.Key}={kv.Value}")));
}

Environment.SetEnvironmentVariable("ElasticApm:ServerUrls",
string.Join(",", startupOptions.ApmServerUrls));

Environment.SetEnvironmentVariable("ElasticApm:SecretToken", startupOptions.ApmSecretToken);
Environment.SetEnvironmentVariable("ElasticApm:ApiKey", startupOptions.ApmApiKey);
Environment.SetEnvironmentVariable("ElasticApm:VerifyServerCert",
startupOptions.ApmVerifyServerCert.ToString());
Environment.SetEnvironmentVariable("ElasticApm:FlushInterval",
$"{TimeSpan.FromSeconds(startupOptions.ApmFlushIntervalInSeconds).TotalSeconds}s");
Environment.SetEnvironmentVariable("ElasticApm:MaxBatchEventCount",
startupOptions.ApmMaxBatchEventCount.ToString(CultureInfo.InvariantCulture));
Environment.SetEnvironmentVariable("ElasticApm:MaxQueueEventCount",
startupOptions.ApmMaxQueueEventCount.ToString(CultureInfo.InvariantCulture));
Environment.SetEnvironmentVariable("ElasticApm:MetricsInterval",
$"{TimeSpan.FromSeconds(startupOptions.ApmMetricsIntervalInSeconds).TotalSeconds}s");
if (startupOptions.ApmDisableMetrics != null && startupOptions.ApmDisableMetrics.Count != 0)
{
Environment.SetEnvironmentVariable("ElasticApm:DisableMetrics",
string.Join(",", startupOptions.ApmDisableMetrics));
}

Environment.SetEnvironmentVariable("ElasticApm:CaptureBody", startupOptions.ApmCaptureBody);
if (startupOptions.ApmCaptureBodyContentTypes != null &&
startupOptions.ApmCaptureBodyContentTypes.Count != 0)
{
Environment.SetEnvironmentVariable("ElasticApm:CaptureBodyContentTypes",
string.Join(",", startupOptions.ApmCaptureBodyContentTypes));
}

Environment.SetEnvironmentVariable("ElasticApm:CaptureHeaders",
startupOptions.ApmCaptureHeaders.ToString(CultureInfo.InvariantCulture));
Environment.SetEnvironmentVariable("ElasticApm:UseElasticTraceparentHeader",
startupOptions.ApmUseElasticTraceparentHeader.ToString(CultureInfo.InvariantCulture));
Environment.SetEnvironmentVariable("ElasticApm:StackTraceLimit",
startupOptions.ApmStackTraceLimit.ToString(CultureInfo.InvariantCulture));
Environment.SetEnvironmentVariable("ElasticApm:SpanFramesMinDuration",
$"{TimeSpan.FromSeconds(startupOptions.ApmSpanFramesMinDurationInSeconds).TotalMilliseconds}ms");
Environment.SetEnvironmentVariable("ElasticApm:ApmLogLevel", startupOptions.ApmLogLevel);
hostBuilder.ToHostBuilder().UseAllElasticApm();
}
}

Expand Down Expand Up @@ -138,13 +78,79 @@ public LoggerConfiguration ConfigureLogging(IApplicationContext context, Elastic
return loggerConfiguration;
}

public void ConfigureEndpoints(IApplicationContext applicationContext,
IApplicationBuilder appBuilder, IEndpointRouteBuilder endpoints)
public void ConfigureAppConfiguration(IApplicationContext context,
IConfigurationBuilder configurationBuilder,
ElasticStackModuleOptions startupOptions)
{
var options = GetOptions(appBuilder.ApplicationServices);
if (options.ApmEnabled)
if (startupOptions.ApmEnabled)
{
appBuilder.UseAllElasticApm();
var apmOptions = new Dictionary<string, string?>();
AddOption(apmOptions, ConfigurationOption.ServiceName, context.Name);
AddOption(apmOptions, ConfigurationOption.ServiceVersion, context.Version);
AddOption(apmOptions, ConfigurationOption.TransactionSampleRate,
startupOptions.ApmTransactionSampleRate.ToString(CultureInfo.InvariantCulture));
AddOption(apmOptions, ConfigurationOption.TransactionMaxSpans,
startupOptions.ApmTransactionMaxSpans.ToString(CultureInfo.InvariantCulture));
AddOption(apmOptions, ConfigurationOption.CentralConfig,
startupOptions.ApmCentralConfig.ToString(CultureInfo.InvariantCulture));
AddOption(apmOptions, ConfigurationOption.SecretToken, startupOptions.ApmSecretToken);
AddOption(apmOptions, ConfigurationOption.ApiKey, startupOptions.ApmApiKey);
AddOption(apmOptions, ConfigurationOption.VerifyServerCert, startupOptions.ApmVerifyServerCert.ToString());
AddOption(apmOptions, ConfigurationOption.FlushInterval,
$"{TimeSpan.FromSeconds(startupOptions.ApmFlushIntervalInSeconds).TotalSeconds}s");
AddOption(apmOptions, ConfigurationOption.MaxBatchEventCount,
startupOptions.ApmMaxBatchEventCount.ToString(CultureInfo.InvariantCulture));
AddOption(apmOptions, ConfigurationOption.MaxQueueEventCount,
startupOptions.ApmMaxQueueEventCount.ToString(CultureInfo.InvariantCulture));
AddOption(apmOptions, ConfigurationOption.MetricsInterval,
$"{TimeSpan.FromSeconds(startupOptions.ApmMetricsIntervalInSeconds).TotalSeconds}s");
AddOption(apmOptions, ConfigurationOption.CaptureBody, startupOptions.ApmCaptureBody);
AddOption(apmOptions, ConfigurationOption.CaptureHeaders,
startupOptions.ApmCaptureHeaders.ToString(CultureInfo.InvariantCulture));
AddOption(apmOptions, ConfigurationOption.UseElasticTraceparentHeader,
startupOptions.ApmUseElasticTraceparentHeader.ToString(CultureInfo.InvariantCulture));
AddOption(apmOptions, ConfigurationOption.StackTraceLimit,
startupOptions.ApmStackTraceLimit.ToString(CultureInfo.InvariantCulture));
AddOption(apmOptions, ConfigurationOption.SpanStackTraceMinDuration,
$"{TimeSpan.FromSeconds(startupOptions.ApmSpanFramesMinDurationInSeconds).TotalMilliseconds}ms");
AddOption(apmOptions, ConfigurationOption.LogLevel, startupOptions.ApmLogLevel);
AddOption(apmOptions, ConfigurationOption.ServerUrl,
startupOptions.ApmServerUrls.OrderBy(_ => Guid.NewGuid()).First().ToString());

if (startupOptions.ApmSanitizeFieldNames != null && startupOptions.ApmSanitizeFieldNames.Count != 0)
{
AddOption(apmOptions, ConfigurationOption.SanitizeFieldNames,
string.Join(", ", startupOptions.ApmSanitizeFieldNames));
}

if (startupOptions.ApmGlobalLabels.Count != 0)
{
AddOption(apmOptions, ConfigurationOption.GlobalLabels,
string.Join(",", startupOptions.ApmGlobalLabels.Select(kv => $"{kv.Key}={kv.Value}")));
}

if (startupOptions.ApmDisableMetrics != null && startupOptions.ApmDisableMetrics.Count != 0)
{
AddOption(apmOptions, ConfigurationOption.DisableMetrics,
string.Join(",", startupOptions.ApmDisableMetrics));
}

if (startupOptions.ApmCaptureBodyContentTypes != null &&
startupOptions.ApmCaptureBodyContentTypes.Count != 0)
{
AddOption(apmOptions, ConfigurationOption.CaptureBodyContentTypes,
string.Join(",", startupOptions.ApmCaptureBodyContentTypes));
}

configurationBuilder.AddInMemoryCollection(apmOptions);
}
}

private static void AddOption(IDictionary<string, string?> options, ConfigurationOption option, string? value) =>
options[$"ElasticApm:{Enum.GetName(typeof(CompareOptions), option)}"] = value;

public void CheckConfiguration(IApplicationContext context, IServiceProvider serviceProvider)
{
// do nothing
}
}
2 changes: 1 addition & 1 deletion src/Sitko.Core.ElasticStack/Sitko.Core.ElasticStack.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@
<PackageReference Include="Serilog.Sinks.Elasticsearch"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Sitko.Core.App.Web\Sitko.Core.App.Web.csproj"/>
<ProjectReference Include="..\Sitko.Core.App\Sitko.Core.App.csproj"/>
</ItemGroup>
</Project>

0 comments on commit d1c209b

Please sign in to comment.