Skip to content

Commit debbd92

Browse files
authored
Merge pull request #23343 from abpframework/data-collection-rel-9-3
ABP Telemetry Collection
2 parents a81d31b + 039a928 commit debbd92

File tree

67 files changed

+3231
-2
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+3231
-2
lines changed

Directory.Packages.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,5 +185,6 @@
185185
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
186186
<PackageVersion Include="ConfigureAwait.Fody" Version="3.3.2" />
187187
<PackageVersion Include="Fody" Version="6.9.2" />
188+
<PackageVersion Include="System.Management" Version="9.0.1"/>
188189
</ItemGroup>
189190
</Project>
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using Volo.Abp.Application.Services;
4+
using Volo.Abp.DependencyInjection;
5+
using System.Linq;
6+
using Microsoft.AspNetCore.Mvc;
7+
using Volo.Abp.Internal.Telemetry.Activity;
8+
using Volo.Abp.Internal.Telemetry.Activity.Contracts;
9+
using Volo.Abp.Internal.Telemetry.Activity.Providers;
10+
using Volo.Abp.Internal.Telemetry.Constants;
11+
using Volo.Abp.Internal.Telemetry.Constants.Enums;
12+
using Volo.Abp.Reflection;
13+
14+
namespace Volo.Abp.AspNetCore.Mvc;
15+
16+
[ExposeServices(typeof(ITelemetryActivityEventEnricher), typeof(IHasParentTelemetryActivityEventEnricher<TelemetryApplicationInfoEnricher>))]
17+
public sealed class TelemetryApplicationMetricsEnricher : TelemetryActivityEventEnricher, IHasParentTelemetryActivityEventEnricher<TelemetryApplicationInfoEnricher>
18+
{
19+
private readonly ITypeFinder _typeFinder;
20+
public TelemetryApplicationMetricsEnricher(ITypeFinder typeFinder, IServiceProvider serviceProvider) : base(serviceProvider)
21+
{
22+
_typeFinder = typeFinder;
23+
}
24+
25+
protected override Task<bool> CanExecuteAsync(ActivityContext context)
26+
{
27+
return Task.FromResult(context.SessionType == SessionType.ApplicationRuntime);
28+
}
29+
30+
protected override Task ExecuteAsync(ActivityContext context)
31+
{
32+
var appServiceCount = _typeFinder.Types.Count(t =>
33+
typeof(IApplicationService).IsAssignableFrom(t) &&
34+
t is { IsAbstract: false, IsInterface: false } &&
35+
!t.AssemblyQualifiedName!.StartsWith(TelemetryConsts.VoloNameSpaceFilter));
36+
37+
var controllerCount = _typeFinder.Types.Count(t =>
38+
typeof(ControllerBase).IsAssignableFrom(t) &&
39+
!t.IsAbstract &&
40+
!t.AssemblyQualifiedName!.StartsWith(TelemetryConsts.VoloNameSpaceFilter));
41+
42+
43+
context.Current[ActivityPropertyNames.AppServiceCount] = appServiceCount;
44+
context.Current[ActivityPropertyNames.ControllerCount] = controllerCount;
45+
return Task.CompletedTask;
46+
}
47+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System.Reflection;
2+
using System.Runtime.CompilerServices;
3+
using System.Runtime.InteropServices;
4+
5+
// General Information about an assembly is controlled through the following
6+
// set of attributes. Change these attribute values to modify the information
7+
// associated with an assembly.
8+
[assembly: AssemblyConfiguration("")]
9+
[assembly: AssemblyCompany("")]
10+
[assembly: AssemblyProduct("Volo.Abp.Authorization.Abstractions")]
11+
[assembly: AssemblyTrademark("")]
12+
[assembly: InternalsVisibleTo("Volo.Abp.Authorization")]
13+
14+
// Setting ComVisible to false makes the types in this assembly not visible
15+
// to COM components. If you need to access a type in this assembly from
16+
// COM, set the ComVisible attribute to true on that type.
17+
[assembly: ComVisible(false)]
18+
19+
// The following GUID is for the ID of the typelib if this project is exposed to COM
20+
[assembly: Guid("83632bec-2f60-4c2b-b964-30e8b37fa9d8")]

framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinition.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ public virtual PermissionDefinition AddChild(
108108
Parent = this
109109
};
110110

111+
child[PermissionDefinitionContext.KnownPropertyNames.CurrentProviderName] = this[PermissionDefinitionContext.KnownPropertyNames.CurrentProviderName];
112+
111113
_children.Add(child);
112114

113115
return child;

framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionDefinitionContext.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@ public class PermissionDefinitionContext : IPermissionDefinitionContext
1111

1212
public Dictionary<string, PermissionGroupDefinition> Groups { get; }
1313

14+
internal IPermissionDefinitionProvider? CurrentProvider { get; set; }
15+
16+
public static class KnownPropertyNames
17+
{
18+
public const string CurrentProviderName = "_CurrentProviderName";
19+
}
20+
1421
public PermissionDefinitionContext(IServiceProvider serviceProvider)
1522
{
1623
ServiceProvider = serviceProvider;
@@ -28,7 +35,16 @@ public virtual PermissionGroupDefinition AddGroup(
2835
throw new AbpException($"There is already an existing permission group with name: {name}");
2936
}
3037

31-
return Groups[name] = new PermissionGroupDefinition(name, displayName);
38+
var group = new PermissionGroupDefinition(name, displayName);
39+
40+
if (CurrentProvider != null)
41+
{
42+
group[KnownPropertyNames.CurrentProviderName] = CurrentProvider.GetType().FullName;
43+
}
44+
45+
Groups[name] = group;
46+
47+
return group;
3248
}
3349

3450
[NotNull]

framework/src/Volo.Abp.Authorization.Abstractions/Volo/Abp/Authorization/Permissions/PermissionGroupDefinition.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ public virtual PermissionDefinition AddPermission(
6161
isEnabled
6262
);
6363

64+
permission[PermissionDefinitionContext.KnownPropertyNames.CurrentProviderName] = this[PermissionDefinitionContext.KnownPropertyNames.CurrentProviderName];
65+
6466
_permissions.Add(permission);
6567

6668
return permission;

framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/StaticPermissionDefinitionStore.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,18 +84,23 @@ protected virtual Dictionary<string, PermissionGroupDefinition> CreatePermission
8484

8585
foreach (var provider in providers)
8686
{
87+
context.CurrentProvider = provider;
8788
provider.PreDefine(context);
8889
}
8990

9091
foreach (var provider in providers)
9192
{
93+
context.CurrentProvider = provider;
9294
provider.Define(context);
9395
}
9496

9597
foreach (var provider in providers)
9698
{
99+
context.CurrentProvider = provider;
97100
provider.PostDefine(context);
98101
}
102+
103+
context.CurrentProvider = null;
99104

100105
return context.Groups;
101106
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System;
2+
using System.Linq;
3+
using System.Threading.Tasks;
4+
using Volo.Abp.DependencyInjection;
5+
using Volo.Abp.Internal.Telemetry.Activity;
6+
using Volo.Abp.Internal.Telemetry.Activity.Contracts;
7+
using Volo.Abp.Internal.Telemetry.Activity.Providers;
8+
using Volo.Abp.Internal.Telemetry.Constants;
9+
10+
namespace Volo.Abp.Authorization.Permissions;
11+
12+
[ExposeServices(typeof(ITelemetryActivityEventEnricher), typeof(IHasParentTelemetryActivityEventEnricher<TelemetryApplicationInfoEnricher>))]
13+
public sealed class TelemetryPermissionInfoEnricher : TelemetryActivityEventEnricher, IHasParentTelemetryActivityEventEnricher<TelemetryApplicationInfoEnricher>
14+
{
15+
private readonly IPermissionDefinitionManager _permissionDefinitionManager;
16+
17+
public TelemetryPermissionInfoEnricher(IPermissionDefinitionManager permissionDefinitionManager,
18+
IServiceProvider serviceProvider) : base(serviceProvider)
19+
{
20+
_permissionDefinitionManager = permissionDefinitionManager;
21+
}
22+
23+
protected override Task<bool> CanExecuteAsync(ActivityContext context)
24+
{
25+
return Task.FromResult(context.ProjectId.HasValue);
26+
}
27+
28+
protected async override Task ExecuteAsync(ActivityContext context)
29+
{
30+
var permissions = await _permissionDefinitionManager.GetPermissionsAsync();
31+
32+
var userDefinedPermissionsCount = permissions.Count(IsUserDefinedPermission);
33+
34+
context.Current[ActivityPropertyNames.PermissionCount] = userDefinedPermissionsCount;
35+
}
36+
37+
private static bool IsUserDefinedPermission(PermissionDefinition permission)
38+
{
39+
return permission.Properties.TryGetValue(PermissionDefinitionContext.KnownPropertyNames.CurrentProviderName, out var providerName) &&
40+
providerName is string &&
41+
!providerName.ToString()!.StartsWith(TelemetryConsts.VoloNameSpaceFilter);
42+
}
43+
44+
45+
}

framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" />
2323
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" />
2424
<PackageReference Include="Microsoft.Extensions.Options" />
25+
<PackageReference Include="System.Management" />
2526
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" />
2627
<PackageReference Include="Microsoft.Extensions.Logging" />
2728
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" />

framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
using System.Reflection;
55
using System.Threading.Tasks;
66
using JetBrains.Annotations;
7+
using Microsoft.Extensions.Configuration;
78
using Microsoft.Extensions.DependencyInjection;
89
using Microsoft.Extensions.Hosting;
910
using Microsoft.Extensions.Logging;
1011
using Volo.Abp.DependencyInjection;
1112
using Volo.Abp.Internal;
13+
using Volo.Abp.Internal.Telemetry;
14+
using Volo.Abp.Internal.Telemetry.Constants;
1215
using Volo.Abp.Logging;
1316
using Volo.Abp.Modularity;
17+
using Volo.Abp.Threading;
1418

1519
namespace Volo.Abp;
1620

@@ -149,6 +153,56 @@ protected virtual IReadOnlyList<IAbpModuleDescriptor> LoadModules(IServiceCollec
149153
options.PlugInSources
150154
);
151155
}
156+
protected void SetupTelemetryTracking()
157+
{
158+
if (!ShouldSendTelemetryData())
159+
{
160+
return;
161+
}
162+
163+
AsyncHelper.RunSync(InitializeTelemetryTracking);
164+
}
165+
166+
protected async Task SetupTelemetryTrackingAsync()
167+
{
168+
if (!ShouldSendTelemetryData())
169+
{
170+
return;
171+
}
172+
173+
await InitializeTelemetryTracking();
174+
}
175+
176+
private async Task InitializeTelemetryTracking()
177+
{
178+
try
179+
{
180+
using var scope = ServiceProvider.CreateScope();
181+
var telemetryService = scope.ServiceProvider.GetRequiredService<ITelemetryService>();
182+
await telemetryService.AddActivityAsync(ActivityNameConsts.ApplicationRun);
183+
}
184+
catch (Exception ex)
185+
{
186+
try
187+
{
188+
using var scope = ServiceProvider.CreateScope();
189+
var logger = scope.ServiceProvider.GetRequiredService<ILogger<AbpApplicationBase>>();
190+
logger.LogException(ex, LogLevel.Trace);
191+
}
192+
catch
193+
{
194+
/* ignored */
195+
}
196+
}
197+
}
198+
199+
private bool ShouldSendTelemetryData()
200+
{
201+
using var scope = ServiceProvider.CreateScope();
202+
var abpHostEnvironment = scope.ServiceProvider.GetRequiredService<IAbpHostEnvironment>();
203+
var configuration = scope.ServiceProvider.GetRequiredService<IConfiguration>();
204+
return abpHostEnvironment.IsDevelopment() && configuration.GetValue<bool?>("Abp:Telemetry:IsEnabled") == true;
205+
}
152206

153207
//TODO: We can extract a new class for this
154208
public virtual async Task ConfigureServicesAsync()

0 commit comments

Comments
 (0)