Browse Source

feat: Add OpenTelemetry Quartz Instrumentation

pull/1412/head
colin 3 months ago
parent
commit
d8fe1a3e30
  1. 22
      Directory.Packages.props
  2. 20
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Program.cs
  3. 72
      aspnet-core/aspire/LINGYUN.Abp.MicroService.ServiceDefaults/ConfigurationExtensions.cs
  4. 71
      aspnet-core/aspire/LINGYUN.Abp.MicroService.ServiceDefaults/Extensions.cs
  5. 1
      aspnet-core/aspire/LINGYUN.Abp.MicroService.ServiceDefaults/LINGYUN.Abp.MicroService.ServiceDefaults.csproj

22
Directory.Packages.props

@ -263,6 +263,19 @@
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" /> <PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
<PackageVersion Include="Serilog.Sinks.OpenTelemetry" Version="4.0.0-dev-00313" /> <PackageVersion Include="Serilog.Sinks.OpenTelemetry" Version="4.0.0-dev-00313" />
</ItemGroup> </ItemGroup>
<!-- OpenTelemetry -->
<ItemGroup>
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Exporter.Console" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Exporter.Zipkin" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.14.0-beta.2" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Quartz" Version="1.14.0-beta.2" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.SqlClient" Version="1.14.0-beta.1" />
</ItemGroup>
<!-- Test --> <!-- Test -->
<ItemGroup> <ItemGroup>
<PackageVersion Include="coverlet.collector" Version="6.0.4" /> <PackageVersion Include="coverlet.collector" Version="6.0.4" />
@ -323,15 +336,6 @@
<PackageVersion Include="Ocelot.Provider.Polly" Version="20.0.0" /> <PackageVersion Include="Ocelot.Provider.Polly" Version="20.0.0" />
<PackageVersion Include="OpenIddict.Server.DataProtection" Version="6.4.0" /> <PackageVersion Include="OpenIddict.Server.DataProtection" Version="6.4.0" />
<PackageVersion Include="OpenIddict.Validation.DataProtection" Version="6.4.0" /> <PackageVersion Include="OpenIddict.Validation.DataProtection" Version="6.4.0" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Exporter.Console" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Exporter.Zipkin" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.14.0-beta.2" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.SqlClient" Version="1.14.0-beta.1" />
<PackageVersion Include="Polly" Version="8.5.2" /> <PackageVersion Include="Polly" Version="8.5.2" />
<PackageVersion Include="QRCoder" Version="1.5.1" /> <PackageVersion Include="QRCoder" Version="1.5.1" />
<PackageVersion Include="Quartz.Serialization.Json" Version="3.14.0" /> <PackageVersion Include="Quartz.Serialization.Json" Version="3.14.0" />

20
aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Program.cs

@ -26,26 +26,6 @@ try
builder.AddServiceDefaults(); builder.AddServiceDefaults();
void LogConfig(IConfiguration config, int index = 0)
{
var prefix = "";
for (var i = 0; i < index; i++)
{
prefix = "-" + prefix;
}
var children = config.GetChildren();
if (children.Any())
{
foreach (var childrenConfig in children)
{
Log.Logger.Information("{prefix}Config: {key}, Value: {value}", prefix, childrenConfig.Key, childrenConfig.Value);
LogConfig(childrenConfig, index + 1);
}
}
}
LogConfig(builder.Configuration);
await builder.AddApplicationAsync<AdminServiceModule>(options => await builder.AddApplicationAsync<AdminServiceModule>(options =>
{ {
var applicationName = Environment.GetEnvironmentVariable("APPLICATION_NAME") ?? "AdminService"; var applicationName = Environment.GetEnvironmentVariable("APPLICATION_NAME") ?? "AdminService";

72
aspnet-core/aspire/LINGYUN.Abp.MicroService.ServiceDefaults/ConfigurationExtensions.cs

@ -0,0 +1,72 @@
using Microsoft.Extensions.Configuration;
namespace Microsoft.Extensions.Hosting;
public static class ConfigurationExtensions
{
public static TBuilder MapDefaultConfiguration<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
{
builder.AddRedisClient("redis");
builder.AddRabbitMQClient("rabbitmq");
builder.AddElasticsearchClient("elasticsearch");
// CAP PostgreSql
builder.Configuration["CAP:PostgreSql:ConnectionString"] = builder.Configuration.GetConnectionString("Default");
// CAP RabbitMQ
builder.Configuration["CAP:RabbitMQ:HostName"] = builder.Configuration["RABBITMQ_HOST"];
builder.Configuration["CAP:RabbitMQ:UserName"] = builder.Configuration["RABBITMQ_USERNAME"];
builder.Configuration["CAP:RabbitMQ:Password"] = builder.Configuration["RABBITMQ_PASSWORD"];
builder.Configuration["CAP:RabbitMQ:Port"] = builder.Configuration["RABBITMQ_PORT"];
// Abp RabbitMQ
builder.Configuration["RabbitMQ:Default:HostName"] = builder.Configuration["RABBITMQ_HOST"];
builder.Configuration["RabbitMQ:Default:UserName"] = builder.Configuration["RABBITMQ_USERNAME"];
builder.Configuration["RabbitMQ:Default:Password"] = builder.Configuration["RABBITMQ_PASSWORD"];
builder.Configuration["RabbitMQ:Default:Port"] = builder.Configuration["RABBITMQ_PORT"];
// Elsa RabbitMQ
builder.Configuration["Elsa:Rebus:RabbitMQ:Connection"] = builder.Configuration.GetConnectionString("RabbitMQ");
// Redis
var redisConnectionString = builder.Configuration.GetConnectionString("Redis");
builder.Configuration["Redis:Configuration"] = $"{redisConnectionString},defaultDatabase=10";
// DistributedLock
builder.Configuration["DistributedLock:Redis:Configuration"] = $"{redisConnectionString},defaultDatabase=11";
// Features
builder.Configuration["Features:Validation:Redis:Configuration"] = $"{redisConnectionString},defaultDatabase=12";
// SignalR
builder.Configuration["SignalR:Redis:Configuration"] = $"{redisConnectionString},defaultDatabase=13,channelPrefix=abp-realtime-channel";
// Elasticsearch
var elasticSearchUrl = builder.Configuration.GetConnectionString("Elasticsearch");
var serialogEsConfig = builder.Configuration.GetSection("Serilog:WriteTo");
void ReplaceElasticsearchLogging(IConfiguration configuration)
{
foreach (var config in configuration.GetChildren())
{
if (string.Equals(config["Name"], "Async", StringComparison.InvariantCultureIgnoreCase))
{
var configureArgs = config.GetSection("Args:configure");
ReplaceElasticsearchLogging(configureArgs);
}
if (string.Equals(config["Name"], "Elasticsearch", StringComparison.InvariantCultureIgnoreCase))
{
config["Args:nodeUris"] = elasticSearchUrl;
}
}
}
if (serialogEsConfig.Exists())
{
ReplaceElasticsearchLogging(serialogEsConfig);
}
builder.Configuration["Elasticsearch:NodeUris"] = elasticSearchUrl;
return builder;
}
}

71
aspnet-core/aspire/LINGYUN.Abp.MicroService.ServiceDefaults/Extensions.cs

@ -1,13 +1,11 @@
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Diagnostics.HealthChecks; using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks; using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using OpenTelemetry; using OpenTelemetry;
using OpenTelemetry.Metrics; using OpenTelemetry.Metrics;
using OpenTelemetry.Trace; using OpenTelemetry.Trace;
using System;
namespace Microsoft.Extensions.Hosting; namespace Microsoft.Extensions.Hosting;
@ -23,7 +21,7 @@ public static class Extensions
{ {
builder.ConfigureOpenTelemetry(); builder.ConfigureOpenTelemetry();
builder.ReplaceDefaultConfiguration(); builder.MapDefaultConfiguration();
builder.AddDefaultHealthChecks(); builder.AddDefaultHealthChecks();
@ -76,6 +74,7 @@ public static class Extensions
//.AddGrpcClientInstrumentation() //.AddGrpcClientInstrumentation()
.AddHttpClientInstrumentation() .AddHttpClientInstrumentation()
.AddCapInstrumentation() .AddCapInstrumentation()
.AddQuartzInstrumentation()
.AddEntityFrameworkCoreInstrumentation(); .AddEntityFrameworkCoreInstrumentation();
}); });
@ -84,72 +83,6 @@ public static class Extensions
return builder; return builder;
} }
public static TBuilder ReplaceDefaultConfiguration<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
{
builder.AddRedisClient("redis");
builder.AddRabbitMQClient("rabbitmq");
builder.AddElasticsearchClient("elasticsearch");
// CAP PostgreSql
builder.Configuration["CAP:PostgreSql:ConnectionString"] = builder.Configuration.GetConnectionString("Default");
// CAP RabbitMQ
builder.Configuration["CAP:RabbitMQ:HostName"] = builder.Configuration["RABBITMQ_HOST"];
builder.Configuration["CAP:RabbitMQ:UserName"] = builder.Configuration["RABBITMQ_USERNAME"];
builder.Configuration["CAP:RabbitMQ:Password"] = builder.Configuration["RABBITMQ_PASSWORD"];
builder.Configuration["CAP:RabbitMQ:Port"] = builder.Configuration["RABBITMQ_PORT"];
// Abp RabbitMQ
builder.Configuration["RabbitMQ:Default:HostName"] = builder.Configuration["RABBITMQ_HOST"];
builder.Configuration["RabbitMQ:Default:UserName"] = builder.Configuration["RABBITMQ_USERNAME"];
builder.Configuration["RabbitMQ:Default:Password"] = builder.Configuration["RABBITMQ_PASSWORD"];
builder.Configuration["RabbitMQ:Default:Port"] = builder.Configuration["RABBITMQ_PORT"];
// Elsa RabbitMQ
builder.Configuration["Elsa:Rebus:RabbitMQ:Connection"] = builder.Configuration.GetConnectionString("RabbitMQ");
// Redis
var redisConnectionString = builder.Configuration.GetConnectionString("Redis");
builder.Configuration["Redis:Configuration"] = $"{redisConnectionString},defaultDatabase=10";
// DistributedLock
builder.Configuration["DistributedLock:Redis:Configuration"] = $"{redisConnectionString},defaultDatabase=11";
// Features
builder.Configuration["Features:Validation:Redis:Configuration"] = $"{redisConnectionString},defaultDatabase=12";
// SignalR
builder.Configuration["SignalR:Redis:Configuration"] = $"{redisConnectionString},defaultDatabase=13,channelPrefix=abp-realtime-channel";
// Elasticsearch
var elasticSearchUrl = builder.Configuration.GetConnectionString("Elasticsearch");
var serialogEsConfig = builder.Configuration.GetSection("Serilog:WriteTo");
void ReplaceElasticsearchLogging(IConfiguration configuration)
{
foreach (var config in configuration.GetChildren())
{
if (string.Equals(config["Name"], "Async", StringComparison.InvariantCultureIgnoreCase))
{
var configureArgs = config.GetSection("Args:configure");
ReplaceElasticsearchLogging(configureArgs);
}
if (string.Equals(config["Name"], "Elasticsearch", StringComparison.InvariantCultureIgnoreCase))
{
config["Args:nodeUris"] = elasticSearchUrl;
}
}
}
if (serialogEsConfig.Exists())
{
ReplaceElasticsearchLogging(serialogEsConfig);
}
builder.Configuration["Elasticsearch:NodeUris"] = elasticSearchUrl;
return builder;
}
private static TBuilder AddOpenTelemetryExporters<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder private static TBuilder AddOpenTelemetryExporters<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
{ {
var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]); var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]);

1
aspnet-core/aspire/LINGYUN.Abp.MicroService.ServiceDefaults/LINGYUN.Abp.MicroService.ServiceDefaults.csproj

@ -21,6 +21,7 @@
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" /> <PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" /> <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" /> <PackageReference Include="OpenTelemetry.Instrumentation.Http" />
<PackageReference Include="OpenTelemetry.Instrumentation.Quartz" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" /> <PackageReference Include="OpenTelemetry.Instrumentation.Runtime" />
<PackageReference Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" /> <PackageReference Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" />
</ItemGroup> </ItemGroup>

Loading…
Cancel
Save