Skip to content

Commit d25c3ca

Browse files
committed
Merge remote-tracking branch 'origin/v13/dev' into release/14.0
# Conflicts: # src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml # src/Umbraco.Infrastructure/BackgroundJobs/Jobs/ReportSiteJob.cs # tests/Umbraco.Tests.Integration/Umbraco.Core/Telemetry/TelemetryServiceTests.cs
2 parents 0993a61 + 096991a commit d25c3ca

File tree

7 files changed

+85
-16
lines changed

7 files changed

+85
-16
lines changed

src/Umbraco.Core/Constants-Telemetry.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,9 @@ public static class Telemetry
3131
public static string BackofficeExternalLoginProviderCount = "BackofficeExternalLoginProviderCount";
3232
public static string DeliverApiEnabled = "DeliverApiEnabled";
3333
public static string DeliveryApiPublicAccess = "DeliveryApiPublicAccess";
34+
public static string WebhookPrefix = "WebhookCount_";
35+
public static string WebhookTotal = $"{WebhookPrefix}Total";
36+
public static string WebhookCustomHeaders = $"{WebhookPrefix}CustomHeaders";
37+
public static string WebhookCustomEvent = $"{WebhookPrefix}CustomEvent";
3438
}
3539
}

src/Umbraco.Core/EmbeddedResources/Lang/en.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@
476476
<key alias="detailedLevelDescription"><![CDATA[We will send:
477477
<ul>
478478
<li>Anonymized site ID, Umbraco version, and packages installed.</li>
479-
<li>Number of: Root nodes, Content nodes, Macros, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, Backoffice external login providers, and Property Editors in use.</li>
479+
<li>Number of: Root nodes, Content nodes, Macros, Media, Document Types, Templates, Languages, Domains, User Group, Users, Members, Backoffice external login providers, Webhooks, and Property Editors in use.</li>
480480
<li>System information: Webserver, server OS, server framework, server OS language, and database provider.</li>
481481
<li>Configuration settings: Modelsbuilder mode, if custom Umbraco path exists, ASP environment, whether the delivery API is enabled, and allows public access, and if you are in debug mode.</li>
482482
</ul>

src/Umbraco.Infrastructure/BackgroundJobs/Jobs/ReportSiteJob.cs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,24 @@ namespace Umbraco.Cms.Infrastructure.BackgroundJobs.Jobs;
1010
public class ReportSiteJob : IRecurringBackgroundJob
1111
{
1212

13-
public TimeSpan Period { get => TimeSpan.FromDays(1); }
14-
public TimeSpan Delay { get => TimeSpan.FromMinutes(5); }
15-
public ServerRole[] ServerRoles { get => Enum.GetValues<ServerRole>(); }
13+
public TimeSpan Period => TimeSpan.FromDays(1);
1614

17-
// No-op event as the period never changes on this job
18-
public event EventHandler PeriodChanged { add { } remove { } }
15+
public TimeSpan Delay => TimeSpan.FromMinutes(5);
16+
17+
public ServerRole[] ServerRoles => Enum.GetValues<ServerRole>();
1918

19+
// No-op event as the period never changes on this job
20+
public event EventHandler PeriodChanged
21+
{
22+
add { } remove { }
23+
}
2024

2125
private static HttpClient _httpClient = new();
26+
2227
private readonly ILogger<ReportSiteJob> _logger;
23-
private readonly ITelemetryService _telemetryService;
24-
private readonly IJsonSerializer _jsonSerializer;
2528

29+
private readonly ITelemetryService _telemetryService;
30+
private readonly IJsonSerializer _jsonSerializer;
2631

2732
public ReportSiteJob(
2833
ILogger<ReportSiteJob> logger,
@@ -39,9 +44,8 @@ public ReportSiteJob(
3944
/// Runs the background task to send the anonymous ID
4045
/// to telemetry service
4146
/// </summary>
42-
public async Task RunJobAsync()
47+
public async Task RunJobAsync()
4348
{
44-
4549
if (_telemetryService.TryGetTelemetryReportData(out TelemetryReportData? telemetryReportData) is false)
4650
{
4751
_logger.LogWarning("No telemetry marker found");

src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.TelemetryProviders.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public static IUmbracoBuilder AddTelemetryProviders(this IUmbracoBuilder builder
1919
builder.Services.AddTransient<IDetailedTelemetryProvider, UserTelemetryProvider>();
2020
builder.Services.AddTransient<IDetailedTelemetryProvider, SystemTroubleshootingInformationTelemetryProvider>();
2121
builder.Services.AddTransient<IDetailedTelemetryProvider, DeliveryApiTelemetryProvider>();
22+
builder.Services.AddTransient<IDetailedTelemetryProvider, WebhookTelemetryProvider>();
2223
return builder;
2324
}
2425
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using Umbraco.Cms.Core;
2+
using Umbraco.Cms.Core.Models;
3+
using Umbraco.Cms.Core.Services;
4+
using Umbraco.Cms.Infrastructure.Telemetry.Interfaces;
5+
6+
namespace Umbraco.Cms.Infrastructure.Telemetry.Providers;
7+
8+
public class WebhookTelemetryProvider : IDetailedTelemetryProvider
9+
{
10+
private readonly IWebhookService _webhookService;
11+
12+
public WebhookTelemetryProvider(IWebhookService webhookService) => _webhookService = webhookService;
13+
14+
private readonly string[] _defaultEventTypes =
15+
[
16+
"Umbraco.ContentDelete",
17+
"Umbraco.ContentPublish",
18+
"Umbraco.ContentUnpublish",
19+
"Umbraco.MediaDelete",
20+
"Umbraco.MediaSave"
21+
];
22+
23+
public IEnumerable<UsageInformation> GetInformation()
24+
{
25+
IWebhook[] allWebhooks = _webhookService.GetAllAsync(0, int.MaxValue).GetAwaiter().GetResult().Items.ToArray();
26+
27+
yield return new UsageInformation(Constants.Telemetry.WebhookTotal, allWebhooks.Length);
28+
29+
foreach (var eventType in _defaultEventTypes)
30+
{
31+
IWebhook[] webhooks = allWebhooks.Where(x => x.Events.Contains(eventType)).ToArray();
32+
yield return new UsageInformation($"{Constants.Telemetry.WebhookPrefix}{eventType}", webhooks.Length);
33+
}
34+
35+
IEnumerable<IWebhook> customWebhooks = allWebhooks.Where(x => x.Events.Except(_defaultEventTypes).Any());
36+
yield return new UsageInformation(Constants.Telemetry.WebhookCustomEvent, customWebhooks.Count());
37+
38+
IEnumerable<IWebhook> customHeaderWebhooks = allWebhooks.Where(x => x.Headers.Any());
39+
yield return new UsageInformation(Constants.Telemetry.WebhookCustomHeaders, customHeaderWebhooks.Count());
40+
}
41+
}

tests/Umbraco.Tests.Integration/DependencyInjection/UmbracoBuilderExtensions.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,18 @@ private static ILocalizedTextService GetLocalizedTextService(IServiceProvider fa
120120

121121
var currFolder = new DirectoryInfo(srcFolder);
122122

123-
var uiProject = currFolder.GetDirectories("Umbraco.Web.UI", SearchOption.TopDirectoryOnly).First();
123+
if (!currFolder.Exists)
124+
{
125+
currFolder = new DirectoryInfo(Path.GetTempPath());
126+
}
127+
128+
var uiProject = currFolder.GetDirectories("Umbraco.Web.UI", SearchOption.TopDirectoryOnly).FirstOrDefault();
129+
if (uiProject == null)
130+
{
131+
uiProject = new DirectoryInfo(Path.Combine(Path.GetTempPath(), "Umbraco.Web.UI"));
132+
uiProject.Create();
133+
}
134+
124135
var mainLangFolder = new DirectoryInfo(Path.Combine(uiProject.FullName, globalSettings.Value.UmbracoPath.TrimStart("~/"), "config", "lang"));
125136

126137
return new LocalizedTextServiceFileSources(

tests/Umbraco.Tests.Integration/Umbraco.Core/Telemetry/TelemetryServiceTests.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
using System.Linq;
21
using Microsoft.Extensions.DependencyInjection;
32
using NUnit.Framework;
43
using Umbraco.Cms.Core;
54
using Umbraco.Cms.Core.Configuration.Models;
6-
using Umbraco.Cms.Core.DependencyInjection;
75
using Umbraco.Cms.Core.Models;
86
using Umbraco.Cms.Core.Services;
97
using Umbraco.Cms.Core.Telemetry;
8+
using Umbraco.Cms.Core.Webhooks;
109
using Umbraco.Cms.Tests.Common.Testing;
1110
using Umbraco.Cms.Tests.Integration.Testing;
1211

@@ -20,12 +19,15 @@ protected override void CustomTestSetup(IUmbracoBuilder builder) =>
2019
builder.Services.Configure<GlobalSettings>(options => options.Id = Guid.NewGuid().ToString());
2120

2221
private ITelemetryService TelemetryService => GetRequiredService<ITelemetryService>();
22+
2323
private IMetricsConsentService MetricsConsentService => GetRequiredService<IMetricsConsentService>();
2424

25+
private WebhookEventCollection WebhookEventCollection => GetRequiredService<WebhookEventCollection>();
26+
2527
[Test]
2628
public async Task Expected_Detailed_Telemetry_Exists()
2729
{
28-
var expectedData = new[]
30+
var expectedData = new List<string>
2931
{
3032
Constants.Telemetry.RootCount,
3133
Constants.Telemetry.DomainCount,
@@ -51,9 +53,15 @@ public async Task Expected_Detailed_Telemetry_Exists()
5153
Constants.Telemetry.BackofficeExternalLoginProviderCount,
5254
Constants.Telemetry.RuntimeMode,
5355
Constants.Telemetry.DeliverApiEnabled,
54-
Constants.Telemetry.DeliveryApiPublicAccess
56+
Constants.Telemetry.DeliveryApiPublicAccess,
57+
Constants.Telemetry.WebhookTotal,
58+
Constants.Telemetry.WebhookCustomHeaders,
59+
Constants.Telemetry.WebhookCustomEvent,
5560
};
5661

62+
// Add the default webhook events.
63+
expectedData.AddRange(WebhookEventCollection.Select(eventInfo => $"{Constants.Telemetry.WebhookPrefix}{eventInfo.Alias}"));
64+
5765
await MetricsConsentService.SetConsentLevelAsync(TelemetryLevel.Detailed);
5866
var success = TelemetryService.TryGetTelemetryReportData(out var telemetryReportData);
5967
var detailed = telemetryReportData.Detailed.ToArray();
@@ -62,7 +70,7 @@ public async Task Expected_Detailed_Telemetry_Exists()
6270
Assert.Multiple(() =>
6371
{
6472
Assert.IsNotNull(detailed);
65-
Assert.AreEqual(expectedData.Length, detailed.Length);
73+
Assert.AreEqual(expectedData.Count, detailed.Length);
6674

6775
foreach (var expectedInfo in expectedData)
6876
{

0 commit comments

Comments
 (0)