Browse Source

Fix traces.

pull/751/head
Sebastian 4 years ago
parent
commit
7801d2fa22
  1. 23
      backend/extensions/Squidex.Extensions/APM/ApplicationInsights/ApplicationInsightsPlugin.cs
  2. 22
      backend/extensions/Squidex.Extensions/APM/Otlp/OtlpPlugin.cs
  3. 35
      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

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

@ -8,23 +8,38 @@
using Azure.Monitor.OpenTelemetry.Exporter;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry.Trace;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Plugins;
namespace Squidex.Extensions.APM.ApplicationInsights
{
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 =>
{
config.GetSection("logging:applicationInsights").Bind(options);
});
});
}
}
public void ConfigureServices(IServiceCollection services, IConfiguration config)
{
if (config.GetValue<bool>("logging:applicationInsights:enabled"))
{
services.AddSingleton<ITelemetryConfigurator,
Configurator>();
}
}
}

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

@ -9,17 +9,23 @@ using System;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry.Trace;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Plugins;
namespace Squidex.Extensions.APM.Datadog
{
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;
}
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);
@ -28,7 +34,15 @@ namespace Squidex.Extensions.APM.Datadog
{
config.GetSection("logging:otlp").Bind(options);
});
});
}
}
public void ConfigureServices(IServiceCollection services, IConfiguration config)
{
if (config.GetValue<bool>("logging:otlp:enabled"))
{
services.AddSingleton<ITelemetryConfigurator,
Configurator>();
}
}
}

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

@ -10,6 +10,7 @@ using Google.Cloud.Diagnostics.Common;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry.Trace;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Plugins;
using Squidex.Log;
@ -17,19 +18,33 @@ namespace Squidex.Extensions.APM.Stackdriver
{
public sealed class StackdriverPlugin : IPlugin
{
public void ConfigureServices(IServiceCollection services, IConfiguration config)
private class Configurator : ITelemetryConfigurator
{
var projectId = config.GetValue<string>("logging:stackdriver:projectId");
var projectName = config.GetValue<string>("logging:stackdriver:projectName") ?? "Squidex";
private readonly string projectId;
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");
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,
StackdriverSeverityLogAppender>();
@ -37,9 +52,11 @@ namespace Squidex.Extensions.APM.Stackdriver
services.AddSingleton<ILogAppender,
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="NodaTime" Version="3.0.5" />
<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.Extensions.Hosting" Version="1.0.0-rc7" />
<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="Newtonsoft.Json" Version="13.0.1" />
<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="Squidex.Assets" 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 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)
{

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

@ -5,27 +5,44 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using Squidex.Infrastructure;
namespace Squidex.Config.Domain
{
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(
ResourceBuilder.CreateDefault()
.AddService("Squidex", "Squidex",
.AddService(serviceName, "Squidex",
typeof(TelemetryServices).Assembly.GetName().Version!.ToString()));
builder.AddSource("Squidex");
builder.AddAspNetCoreInstrumentation();
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.AddSquidexStoreServices(config);
services.AddSquidexSubscriptions(config);
services.AddSquidexTelemetry();
services.AddSquidexTelemetry(config);
services.AddSquidexTranslation(config);
services.AddSquidexUsageTracking(config);
}

Loading…
Cancel
Save