otel simple

This commit is contained in:
xiaolipro 2025-09-04 16:43:07 +08:00
parent 577f5aec95
commit 198b24ba64
4 changed files with 93 additions and 7 deletions

View File

@ -5,10 +5,14 @@ using Fake.Autofac;
using Fake.Modularity;
using FluentValidation.AspNetCore;
using Hangfire;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using TrackCenter.Application;
using TrackCenter.Application.Hangfire;
using TrackCenter.Domain.Extensions;
using TrackCenter.Repository;
using TrackCenter.Repository.Otel;
using TrackCenter.Repository.Otel.Options;
namespace TrackCenter.Api;
@ -38,7 +42,51 @@ public class TrackCenterApiModule : FakeModule
.AddFakeUnitOfWorkActionFilter();
services.AddFakeSwaggerGen();
context.Services.AddFluentValidationAutoValidation().AddFluentValidationClientsideAdapters();
services.AddFluentValidationAutoValidation().AddFluentValidationClientsideAdapters();
var otelOptions = new OTelOptions()
{
EnableAspNetCore = true,
EnableHttpClient = true,
EnableSql = true
};
configuration.GetSection("OTel").Bind(otelOptions);
ActivityHelper.InitActivitySource(otelOptions);
services.AddOpenTelemetry()
.ConfigureResource(resource => resource.AddService(otelOptions.ServiceName))
.WithTracing(tracing =>
{
switch (otelOptions.SamplerType)
{
case SamplerType.AlwaysOn:
tracing.SetSampler(new AlwaysOnSampler());
break;
case SamplerType.AlwaysOff:
tracing.SetSampler(new AlwaysOffSampler());
break;
case SamplerType.ParentBasedSampler:
{
Sampler childSampler = otelOptions.ChildBasedSampler switch
{
SamplerType.AlwaysOn => new AlwaysOnSampler(),
SamplerType.AlwaysOff => new AlwaysOffSampler(),
SamplerType.TraceIdRatio =>
new TraceIdRatioBasedSampler(otelOptions.SamplerProbability),
_ => new AlwaysOnSampler(),
};
tracing.SetSampler(new ParentBasedSampler(childSampler));
}
break;
case SamplerType.TraceIdRatio:
tracing.SetSampler(new TraceIdRatioBasedSampler(otelOptions.SamplerProbability));
break;
default:
tracing.SetSampler(new AlwaysOnSampler());
break;
}
tracing.AddSource(otelOptions.ServiceName);
});
services.AddCors(options =>
{

View File

@ -157,5 +157,23 @@
"PushTrackInterfaceCode": "A051",
"TrackUpdateInterfaceCode": "A0400",
"OrderPodPullInterfaceCode": "A059"
},
"OTel": {
"ExporterUrl": "",
"ExporterTimeoutSeconds":10, //导出超时时间(秒) 默认 10秒
"ServiceName": "TrackCenter.Api.Test",//服务名称
"ServiceVersion": "1.0.0",//服务版本
"SamplerType":"AlwaysOn",// 采样类型 默认 AlwaysOn
//枚举
//0 AlwaysOn 总是采样
//1 AlwaysOff 从不采样
//2 TraceIdRatio 概率采样 与SamplerProbability 字段结合使用
//3 ParentBasedSampler 与ChildBasedSampler 结合使用
"SamplerProbability":0.5,// 采样率 10%上报采样
"EnableStaticWeav":true,//启动静态编织 默认 true
"EnableAspNetCore": true,//启动AspNetCore 默认 true
"EnableHttpClient": true,//启用HTTP请求 默认 true
"EnableSql": true,//启动SQL 默认 true
"EnableSqlParameters": true //启动SQL参数,默认 false
}
}

View File

@ -17,6 +17,8 @@
<PackageReference Include="FeishuNetSdk" Version="2.4.6" />
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.18" />
<PackageReference Include="Hangfire.Redis.StackExchange" Version="1.9.4" />
<PackageReference Include="OpenTelemetry.Api" Version="1.12.0" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.12.0" />
<PackageReference Include="Savorboard.CAP.InMemoryMessageQueue" Version="8.2.1"/>
<PackageReference Include="DotNetCore.CAP" Version="8.2.0"/>
<PackageReference Include="DotNetCore.CAP.Dashboard" Version="8.2.0"/>
@ -29,8 +31,4 @@
<ProjectReference Include="..\TrackCenter.Domain\TrackCenter.Domain.csproj" />
<ProjectReference Include="..\TrackCenter.Repository\TrackCenter.Repository.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Remove="Validations\Forewarning\FactorItemDtoValidator.cs" />
</ItemGroup>
</Project>

View File

@ -1,4 +1,9 @@
namespace TrackCenter.Repository.Otel.Options
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Unicode;
namespace TrackCenter.Repository.Otel.Options
{
/// <summary>
/// OTel options
@ -125,10 +130,27 @@
/// <para>用于定义tags/events等名称</para>
/// </summary>
public KeyNames KeyNames { get; set; }
/// <summary>
/// 序列化参数和返回值时使用的函数
/// </summary>
public Func<object, string> Serializer { get; set; }
public Func<object, string> Serializer { get; set; } = obj =>
{
try
{
JsonSerializerOptions options = new JsonSerializerOptions()
{
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),
ReferenceHandler = ReferenceHandler.Preserve,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
};
return JsonSerializer.Serialize<object>(obj, options);
}
catch (Exception ex)
{
return obj?.ToString();
}
};
/// <summary>
/// 是否启用静态weaving
/// <para>默认启用,如果设置为false,则不会对静态方法进行weaving</para>