Browse Source

Fix traces.

pull/751/head
Sebastian 4 years ago
parent
commit
7801d2fa22
  1. 29
      backend/extensions/Squidex.Extensions/APM/ApplicationInsights/ApplicationInsightsPlugin.cs
  2. 34
      backend/extensions/Squidex.Extensions/APM/Otlp/OtlpPlugin.cs
  3. 43
      backend/extensions/Squidex.Extensions/APM/Stackdriver/StackdriverPlugin.cs
  4. 1
      backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj
  5. 18
      backend/src/Squidex.Infrastructure/ITelemetryConfigurator.cs
  6. 1
      backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj
  7. 2
      backend/src/Squidex.Infrastructure/Telemetry.cs
  8. 23
      backend/src/Squidex/Config/Domain/TelemetryServices.cs
  9. 2
      backend/src/Squidex/Startup.cs

29
backend/extensions/Squidex.Extensions/APM/ApplicationInsights/ApplicationInsightsPlugin.cs

@ -8,24 +8,39 @@
using Azure.Monitor.OpenTelemetry.Exporter; using Azure.Monitor.OpenTelemetry.Exporter;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry.Trace;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Plugins; using Squidex.Infrastructure.Plugins;
namespace Squidex.Extensions.APM.ApplicationInsights namespace Squidex.Extensions.APM.ApplicationInsights
{ {
public sealed class ApplicationInsightsPlugin : IPlugin public sealed class ApplicationInsightsPlugin : IPlugin
{ {
public void ConfigureServices(IServiceCollection services, IConfiguration config) private class Configurator : ITelemetryConfigurator
{ {
if (config.GetValue<bool>("logging:applicationInsights:enabled")) private readonly IConfiguration config;
public Configurator(IConfiguration config)
{ {
services.AddOpenTelemetryTracing(builder => this.config = config;
}
public void Configure(TracerProviderBuilder builder)
{
builder.AddAzureMonitorTraceExporter(options =>
{ {
builder.AddAzureMonitorTraceExporter(options => config.GetSection("logging:applicationInsights").Bind(options);
{
config.GetSection("logging:applicationInsights").Bind(options);
});
}); });
} }
} }
public void ConfigureServices(IServiceCollection services, IConfiguration config)
{
if (config.GetValue<bool>("logging:applicationInsights:enabled"))
{
services.AddSingleton<ITelemetryConfigurator,
Configurator>();
}
}
} }
} }

34
backend/extensions/Squidex.Extensions/APM/Otlp/OtlpPlugin.cs

@ -9,27 +9,41 @@ using System;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry.Trace; using OpenTelemetry.Trace;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Plugins; using Squidex.Infrastructure.Plugins;
namespace Squidex.Extensions.APM.Datadog namespace Squidex.Extensions.APM.Datadog
{ {
public sealed class OtlpPlugin : IPlugin public sealed class OtlpPlugin : IPlugin
{ {
public void ConfigureServices(IServiceCollection services, IConfiguration config) private class Configurator : ITelemetryConfigurator
{ {
if (config.GetValue<bool>("logging:otlp:enabled")) private readonly IConfiguration config;
public Configurator(IConfiguration config)
{ {
services.AddOpenTelemetryTracing(builder => this.config = config;
{ }
// See: https://docs.microsoft.com/aspnet/core/grpc/troubleshoot#call-insecure-grpc-services-with-net-core-client
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); public void Configure(TracerProviderBuilder builder)
{
// See: https://docs.microsoft.com/aspnet/core/grpc/troubleshoot#call-insecure-grpc-services-with-net-core-client
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
builder.AddOtlpExporter(options => builder.AddOtlpExporter(options =>
{ {
config.GetSection("logging:otlp").Bind(options); config.GetSection("logging:otlp").Bind(options);
});
}); });
} }
} }
public void ConfigureServices(IServiceCollection services, IConfiguration config)
{
if (config.GetValue<bool>("logging:otlp:enabled"))
{
services.AddSingleton<ITelemetryConfigurator,
Configurator>();
}
}
} }
} }

43
backend/extensions/Squidex.Extensions/APM/Stackdriver/StackdriverPlugin.cs

@ -10,6 +10,7 @@ using Google.Cloud.Diagnostics.Common;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry.Trace; using OpenTelemetry.Trace;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Plugins; using Squidex.Infrastructure.Plugins;
using Squidex.Log; using Squidex.Log;
@ -17,29 +18,45 @@ namespace Squidex.Extensions.APM.Stackdriver
{ {
public sealed class StackdriverPlugin : IPlugin public sealed class StackdriverPlugin : IPlugin
{ {
public void ConfigureServices(IServiceCollection services, IConfiguration config) private class Configurator : ITelemetryConfigurator
{ {
var projectId = config.GetValue<string>("logging:stackdriver:projectId"); private readonly string projectId;
var projectName = config.GetValue<string>("logging:stackdriver:projectName") ?? "Squidex";
public Configurator(string projectId)
{
this.projectId = projectId;
}
public void Configure(TracerProviderBuilder builder)
{
builder.UseStackdriverExporter(projectId);
}
}
public void ConfigureServices(IServiceCollection services, IConfiguration config)
{
var isEnabled = config.GetValue<bool>("logging:stackdriver:enabled"); var isEnabled = config.GetValue<bool>("logging:stackdriver:enabled");
if (isEnabled && !string.IsNullOrWhiteSpace(projectId)) if (isEnabled)
{ {
services.AddOpenTelemetryTracing(builder => var projectId = config.GetValue<string>("logging:stackdriver:projectId");
if (!string.IsNullOrWhiteSpace(projectId))
{ {
builder.UseStackdriverExporter(projectId); services.AddSingleton<ITelemetryConfigurator>(
}); new Configurator(projectId));
services.AddSingleton<ILogAppender, services.AddSingleton<ILogAppender,
StackdriverSeverityLogAppender>(); StackdriverSeverityLogAppender>();
services.AddSingleton<ILogAppender, services.AddSingleton<ILogAppender,
StackdriverExceptionHandler>(); StackdriverExceptionHandler>();
var version = Assembly.GetEntryAssembly().GetName().Version?.ToString(); var serviceName = config.GetValue<string>("logging:name") ?? "Squidex";
var serviceVersion = Assembly.GetEntryAssembly().GetName().Version?.ToString();
services.AddSingleton(c => ContextExceptionLogger.Create(projectId, projectName, version, null)); services.AddSingleton(c => ContextExceptionLogger.Create(projectId, serviceVersion, serviceVersion, null));
}
} }
} }
} }

1
backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj

@ -23,6 +23,7 @@
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="NodaTime" Version="3.0.5" /> <PackageReference Include="NodaTime" Version="3.0.5" />
<PackageReference Include="Azure.Monitor.OpenTelemetry.Exporter" Version="1.0.0-beta.2" /> <PackageReference Include="Azure.Monitor.OpenTelemetry.Exporter" Version="1.0.0-beta.2" />
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.1.0" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.2.0-alpha1" /> <PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.2.0-alpha1" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.0.0-rc7" /> <PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.0.0-rc7" />
<PackageReference Include="RefactoringEssentials" Version="5.6.0" PrivateAssets="all" /> <PackageReference Include="RefactoringEssentials" Version="5.6.0" PrivateAssets="all" />

18
backend/src/Squidex.Infrastructure/ITelemetryConfigurator.cs

@ -0,0 +1,18 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using OpenTelemetry.Trace;
namespace Squidex.Infrastructure
{
public interface ITelemetryConfigurator
{
void Configure(TracerProviderBuilder builder)
{
}
}
}

1
backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj

@ -24,6 +24,7 @@
<PackageReference Include="Microsoft.Orleans.OrleansRuntime" Version="3.4.3" /> <PackageReference Include="Microsoft.Orleans.OrleansRuntime" Version="3.4.3" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="NJsonSchema" Version="10.5.2" /> <PackageReference Include="NJsonSchema" Version="10.5.2" />
<PackageReference Include="OpenTelemetry.Api" Version="1.1.0" />
<PackageReference Include="RefactoringEssentials" Version="5.6.0" PrivateAssets="all" /> <PackageReference Include="RefactoringEssentials" Version="5.6.0" PrivateAssets="all" />
<PackageReference Include="Squidex.Assets" Version="1.8.0" /> <PackageReference Include="Squidex.Assets" Version="1.8.0" />
<PackageReference Include="Squidex.Caching" Version="1.8.0" /> <PackageReference Include="Squidex.Caching" Version="1.8.0" />

2
backend/src/Squidex.Infrastructure/Telemetry.cs

@ -13,7 +13,7 @@ namespace Squidex.Infrastructure
{ {
public static class Telemetry public static class Telemetry
{ {
public static readonly ActivitySource Activities = new ActivitySource("Notifo"); public static readonly ActivitySource Activities = new ActivitySource("Squidex");
public static Activity? StartMethod(this ActivitySource activity, Type type, [CallerMemberName] string? memberName = null) public static Activity? StartMethod(this ActivitySource activity, Type type, [CallerMemberName] string? memberName = null)
{ {

23
backend/src/Squidex/Config/Domain/TelemetryServices.cs

@ -5,27 +5,44 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry;
using OpenTelemetry.Resources; using OpenTelemetry.Resources;
using OpenTelemetry.Trace; using OpenTelemetry.Trace;
using Squidex.Infrastructure;
namespace Squidex.Config.Domain namespace Squidex.Config.Domain
{ {
public static class TelemetryServices public static class TelemetryServices
{ {
public static void AddSquidexTelemetry(this IServiceCollection services) public static void AddSquidexTelemetry(this IServiceCollection services, IConfiguration config)
{ {
services.AddOpenTelemetryTracing(builder => services.AddOpenTelemetryTracing();
services.AddSingleton(serviceProvider =>
{ {
var builder = Sdk.CreateTracerProviderBuilder();
var serviceName = config.GetValue<string>("logging:name") ?? "Squidex";
builder.SetResourceBuilder( builder.SetResourceBuilder(
ResourceBuilder.CreateDefault() ResourceBuilder.CreateDefault()
.AddService("Squidex", "Squidex", .AddService(serviceName, "Squidex",
typeof(TelemetryServices).Assembly.GetName().Version!.ToString())); typeof(TelemetryServices).Assembly.GetName().Version!.ToString()));
builder.AddSource("Squidex"); builder.AddSource("Squidex");
builder.AddAspNetCoreInstrumentation(); builder.AddAspNetCoreInstrumentation();
builder.AddHttpClientInstrumentation(); builder.AddHttpClientInstrumentation();
foreach (var configurator in serviceProvider.GetRequiredService<IEnumerable<ITelemetryConfigurator>>())
{
configurator.Configure(builder);
}
return builder.Build();
}); });
} }
} }

2
backend/src/Squidex/Startup.cs

@ -68,7 +68,7 @@ namespace Squidex
services.AddSquidexSerializers(); services.AddSquidexSerializers();
services.AddSquidexStoreServices(config); services.AddSquidexStoreServices(config);
services.AddSquidexSubscriptions(config); services.AddSquidexSubscriptions(config);
services.AddSquidexTelemetry(); services.AddSquidexTelemetry(config);
services.AddSquidexTranslation(config); services.AddSquidexTranslation(config);
services.AddSquidexUsageTracking(config); services.AddSquidexUsageTracking(config);
} }

Loading…
Cancel
Save