From 8ac0122e203d6e473900b1d66e44518a3105b71c Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Fri, 23 Oct 2020 15:52:40 +0100 Subject: [PATCH 01/23] Add migration to marker file & background reporter component to POST to telemetry service --- src/Umbraco.Core/IO/SystemFiles.cs | 2 + .../Migrations/Upgrade/UmbracoPlan.cs | 6 +- .../V_8_10_0/SetupAnonInstallTracker.cs | 49 ++++++++ src/Umbraco.Core/Umbraco.Core.csproj | 1 + src/Umbraco.Web/Telemetry/ReportSiteTask.cs | 109 ++++++++++++++++++ .../Telemetry/TelemetryComponent.cs | 35 ++++++ .../Telemetry/TelemetryComposer.cs | 10 ++ src/Umbraco.Web/Umbraco.Web.csproj | 3 + 8 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Core/Migrations/Upgrade/V_8_10_0/SetupAnonInstallTracker.cs create mode 100644 src/Umbraco.Web/Telemetry/ReportSiteTask.cs create mode 100644 src/Umbraco.Web/Telemetry/TelemetryComponent.cs create mode 100644 src/Umbraco.Web/Telemetry/TelemetryComposer.cs diff --git a/src/Umbraco.Core/IO/SystemFiles.cs b/src/Umbraco.Core/IO/SystemFiles.cs index 12e3f57d99..5e38737dd2 100644 --- a/src/Umbraco.Core/IO/SystemFiles.cs +++ b/src/Umbraco.Core/IO/SystemFiles.cs @@ -7,6 +7,8 @@ namespace Umbraco.Core.IO { public static string TinyMceConfig => SystemDirectories.Config + "/tinyMceConfig.config"; + public static string TelemetricsIdentifier => SystemDirectories.Umbraco + "/telemetrics-id.umb"; + // TODO: Kill this off we don't have umbraco.config XML cache we now have NuCache public static string GetContentCacheXml(IGlobalSettings globalSettings) { diff --git a/src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs b/src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs index 723675ca1a..f97fcda49c 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs @@ -6,6 +6,7 @@ using Umbraco.Core.Migrations.Upgrade.Common; using Umbraco.Core.Migrations.Upgrade.V_8_0_0; using Umbraco.Core.Migrations.Upgrade.V_8_0_1; using Umbraco.Core.Migrations.Upgrade.V_8_1_0; +using Umbraco.Core.Migrations.Upgrade.V_8_10_0; using Umbraco.Core.Migrations.Upgrade.V_8_6_0; using Umbraco.Core.Migrations.Upgrade.V_8_8_0; @@ -197,7 +198,10 @@ namespace Umbraco.Core.Migrations.Upgrade // to 8.8.0 To("{B5838FF5-1D22-4F6C-BCEB-F83ACB14B575}"); - + + // to 8.10.0 + To("{DCBA2C6A-01B3-411E-9CDE-0AB9C69EFF33}"); + //FINAL } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_10_0/SetupAnonInstallTracker.cs b/src/Umbraco.Core/Migrations/Upgrade/V_8_10_0/SetupAnonInstallTracker.cs new file mode 100644 index 0000000000..6eded30312 --- /dev/null +++ b/src/Umbraco.Core/Migrations/Upgrade/V_8_10_0/SetupAnonInstallTracker.cs @@ -0,0 +1,49 @@ +using System; +using System.IO; +using Umbraco.Core.IO; +using Umbraco.Core.Logging; + + +namespace Umbraco.Core.Migrations.Upgrade.V_8_10_0 +{ + + public class SetupAnonInstallTracker : MigrationBase + { + public SetupAnonInstallTracker(IMigrationContext context) + : base(context) + { + } + + /// + /// Adds a new file 'telemetrics-id.umb' at /umbraco + /// Which will add a GUID inside the file as JSON + /// + public override void Migrate() + { + var telemetricsFilePath = IOHelper.MapPath(SystemFiles.TelemetricsIdentifier); + + // Verify file does not exist already + if (File.Exists(telemetricsFilePath)) + { + Logger.Warn("When migrating to 8.10.0 the anonymous telemetry file already existsed on disk at {filePath}", telemetricsFilePath); + return; + } + + // Generate GUID + var telemetrySiteIdentifier = Guid.NewGuid(); + + // Write file contents + try + { + File.WriteAllText(telemetricsFilePath, telemetrySiteIdentifier.ToString()); + } + catch (Exception ex) + { + Logger.Error(ex, "Unable to create telemetry file at {filePath}", telemetricsFilePath); + } + + Logger.Info("This site has been identified with an anynomous id {telemetrySiteId} for telemetrics and written to {filePath}", telemetrySiteIdentifier, telemetricsFilePath); + + } + } +} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 71b2a7be4a..821ddb3dc9 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -132,6 +132,7 @@ + diff --git a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs new file mode 100644 index 0000000000..8d777b73db --- /dev/null +++ b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs @@ -0,0 +1,109 @@ +using System; +using System.IO; +using System.Net.Http; +using System.Net.Http.Formatting; +using System.Threading; +using System.Threading.Tasks; +using Umbraco.Core; +using Umbraco.Core.Configuration; +using Umbraco.Core.IO; +using Umbraco.Core.Logging; +using Umbraco.Web.Scheduling; + +namespace Umbraco.Web.Telemetry +{ + public class ReportSiteTask : RecurringTaskBase + { + private IRuntimeState _runtime; + private IProfilingLogger _logger; + private static HttpClient _httpClient; + + public ReportSiteTask(IBackgroundTaskRunner runner, int delayBeforeWeStart, int howOftenWeRepeat, IRuntimeState runtime, IProfilingLogger logger) + : base(runner, delayBeforeWeStart, howOftenWeRepeat) + { + _runtime = runtime; + _logger = logger; + + if (_httpClient == null) + _httpClient = new HttpClient(); + } + + /// + /// Runs the background task to send the anynomous ID + /// to telemetry service + /// + /// A value indicating whether to repeat the task. + public override async Task PerformRunAsync(CancellationToken token) + { + // Try & find file at '/umbraco/telemetrics-id.umb' + var telemetricsFilePath = IOHelper.MapPath(SystemFiles.TelemetricsIdentifier); + + if (File.Exists(telemetricsFilePath) == false) + { + // Some users may have decided to not be tracked by deleting/removing the marker file + _logger.Warn("No telemetry marker file found at '{filePath}' and will not report site to telemetry service", telemetricsFilePath); + + // Stop repeating this task (no need to keep checking) + // The only time it will recheck when the site is recycled + return false; + } + + + var telemetricsFileContents = string.Empty; + try + { + // Open file & read its contents + // It may throw due to file permissions or file locking + telemetricsFileContents = File.ReadAllText(telemetricsFilePath); + } + catch (Exception ex) + { + // Silently swallow ex - but lets log it (ReadAllText throws a ton of different types of ex) + // Hence the use of general exception type + _logger.Error(ex, "Error in reading file contents of telemetry marker file found at '{filePath}'", telemetricsFilePath); + } + + + // Parse as a GUID & verify its a GUID and not some random string + // In case of users may have messed or decided to empty the file contents or put in something random + if (Guid.TryParse(telemetricsFileContents, out var telemetrySiteIdentifier) == false) + { + // Some users may have decided to mess with file contents + _logger.Warn("The telemetry marker file found at '{filePath}' with '{telemetrySiteId}' is not a valid identifier for the telemetry service", telemetricsFilePath, telemetrySiteIdentifier); + + // Stop repeating this task (no need to keep checking) + // The only time it will recheck when the site is recycled + return false; + } + + + try + { + // Make a HTTP Post to telemetry service + // https://telemetry.umbraco.com/installs + // Fire & Forget, do not need to know if its a 200, 500 etc + var postData = new TelemetryReportData { Id = telemetrySiteIdentifier, Version = UmbracoVersion.SemanticVersion.ToSemanticString() }; + var result = await _httpClient.PostAsync("https://webhook.site/9c38527a-eca4-4ad6-9847-202f2b37c07d", postData, new JsonMediaTypeFormatter()); + } + catch (Exception ex) + { + // Silently swallow + // The user does need logs being polluted if our service has fallen over or is down etc + } + + // Keep recurring this task & pinging the telemetry service + return true; + } + + public override bool IsAsync => true; + + + private class TelemetryReportData + { + public Guid Id { get; set; } + + public string Version { get; set; } + } + } +} + diff --git a/src/Umbraco.Web/Telemetry/TelemetryComponent.cs b/src/Umbraco.Web/Telemetry/TelemetryComponent.cs new file mode 100644 index 0000000000..c8113df58b --- /dev/null +++ b/src/Umbraco.Web/Telemetry/TelemetryComponent.cs @@ -0,0 +1,35 @@ +using Umbraco.Core; +using Umbraco.Core.Composing; +using Umbraco.Core.Logging; +using Umbraco.Web.Scheduling; + +namespace Umbraco.Web.Telemetry +{ + public class TelemetryComponent : IComponent + { + private IProfilingLogger _logger; + private IRuntimeState _runtime; + private BackgroundTaskRunner _telemetryReporterRunner; + + public TelemetryComponent(IProfilingLogger logger, IRuntimeState runtime) + { + _logger = logger; + _runtime = runtime; + _telemetryReporterRunner = new BackgroundTaskRunner("TelemetryReporter", _logger); + } + + public void Initialize() + { + int delayBeforeWeStart = 60 * 1000; // 60 * 1000ms = 1min (60,000) + int howOftenWeRepeat = 60 * 1000 * 60 * 24; // 60 * 1000 * 60 * 24 = 24hrs (86400000) + + // As soon as we add our task to the runner it will start to run (after its delay period) + var task = new ReportSiteTask(_telemetryReporterRunner, delayBeforeWeStart, howOftenWeRepeat, _runtime, _logger); + _telemetryReporterRunner.TryAdd(task); + } + + public void Terminate() + { + } + } +} diff --git a/src/Umbraco.Web/Telemetry/TelemetryComposer.cs b/src/Umbraco.Web/Telemetry/TelemetryComposer.cs new file mode 100644 index 0000000000..933b302e1c --- /dev/null +++ b/src/Umbraco.Web/Telemetry/TelemetryComposer.cs @@ -0,0 +1,10 @@ +using Umbraco.Core; +using Umbraco.Core.Composing; + +namespace Umbraco.Web.Telemetry +{ + + [RuntimeLevel(MinLevel = RuntimeLevel.Run)] + public class TelemetryComposer : ComponentComposer, ICoreComposer + { } +} diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 1b48b9ca0d..90088fe552 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -296,6 +296,9 @@ + + + From c93a5a5cd1a455908a4a498feb271e5d25fd95ad Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Wed, 4 Nov 2020 14:07:56 +0000 Subject: [PATCH 02/23] Remove as an upgrade migration step as new installs will never get the marker file --- .../Migrations/Upgrade/UmbracoPlan.cs | 4 -- .../V_8_10_0/SetupAnonInstallTracker.cs | 49 ------------------- src/Umbraco.Core/Umbraco.Core.csproj | 1 - 3 files changed, 54 deletions(-) delete mode 100644 src/Umbraco.Core/Migrations/Upgrade/V_8_10_0/SetupAnonInstallTracker.cs diff --git a/src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs b/src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs index f97fcda49c..ef1f038f04 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/UmbracoPlan.cs @@ -6,7 +6,6 @@ using Umbraco.Core.Migrations.Upgrade.Common; using Umbraco.Core.Migrations.Upgrade.V_8_0_0; using Umbraco.Core.Migrations.Upgrade.V_8_0_1; using Umbraco.Core.Migrations.Upgrade.V_8_1_0; -using Umbraco.Core.Migrations.Upgrade.V_8_10_0; using Umbraco.Core.Migrations.Upgrade.V_8_6_0; using Umbraco.Core.Migrations.Upgrade.V_8_8_0; @@ -199,9 +198,6 @@ namespace Umbraco.Core.Migrations.Upgrade // to 8.8.0 To("{B5838FF5-1D22-4F6C-BCEB-F83ACB14B575}"); - // to 8.10.0 - To("{DCBA2C6A-01B3-411E-9CDE-0AB9C69EFF33}"); - //FINAL } } diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_10_0/SetupAnonInstallTracker.cs b/src/Umbraco.Core/Migrations/Upgrade/V_8_10_0/SetupAnonInstallTracker.cs deleted file mode 100644 index 6eded30312..0000000000 --- a/src/Umbraco.Core/Migrations/Upgrade/V_8_10_0/SetupAnonInstallTracker.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.IO; -using Umbraco.Core.IO; -using Umbraco.Core.Logging; - - -namespace Umbraco.Core.Migrations.Upgrade.V_8_10_0 -{ - - public class SetupAnonInstallTracker : MigrationBase - { - public SetupAnonInstallTracker(IMigrationContext context) - : base(context) - { - } - - /// - /// Adds a new file 'telemetrics-id.umb' at /umbraco - /// Which will add a GUID inside the file as JSON - /// - public override void Migrate() - { - var telemetricsFilePath = IOHelper.MapPath(SystemFiles.TelemetricsIdentifier); - - // Verify file does not exist already - if (File.Exists(telemetricsFilePath)) - { - Logger.Warn("When migrating to 8.10.0 the anonymous telemetry file already existsed on disk at {filePath}", telemetricsFilePath); - return; - } - - // Generate GUID - var telemetrySiteIdentifier = Guid.NewGuid(); - - // Write file contents - try - { - File.WriteAllText(telemetricsFilePath, telemetrySiteIdentifier.ToString()); - } - catch (Exception ex) - { - Logger.Error(ex, "Unable to create telemetry file at {filePath}", telemetricsFilePath); - } - - Logger.Info("This site has been identified with an anynomous id {telemetrySiteId} for telemetrics and written to {filePath}", telemetrySiteIdentifier, telemetricsFilePath); - - } - } -} diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 821ddb3dc9..71b2a7be4a 100755 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -132,7 +132,6 @@ - From 17249d226f3e1ed55085279cb312353cb4db1261 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Wed, 4 Nov 2020 14:24:48 +0000 Subject: [PATCH 03/23] Add new composer/component to add marker file only when clean install or an upgrade runtime state --- .../Telemetry/TelemetryMarkerComponent.cs | 52 +++++++++++++++++++ .../Telemetry/TelemetryMarkerComposer.cs | 9 ++++ src/Umbraco.Web/Umbraco.Web.csproj | 2 + 3 files changed, 63 insertions(+) create mode 100644 src/Umbraco.Web/Telemetry/TelemetryMarkerComponent.cs create mode 100644 src/Umbraco.Web/Telemetry/TelemetryMarkerComposer.cs diff --git a/src/Umbraco.Web/Telemetry/TelemetryMarkerComponent.cs b/src/Umbraco.Web/Telemetry/TelemetryMarkerComponent.cs new file mode 100644 index 0000000000..0426fe777e --- /dev/null +++ b/src/Umbraco.Web/Telemetry/TelemetryMarkerComponent.cs @@ -0,0 +1,52 @@ +using System; +using System.IO; +using Umbraco.Core; +using Umbraco.Core.Composing; +using Umbraco.Core.IO; +using Umbraco.Core.Logging; + +namespace Umbraco.Web.Telemetry +{ + public class TelemetryMarkerComponent : IComponent + { + private IProfilingLogger _logger; + private IRuntimeState _runtime; + + public TelemetryMarkerComponent(IProfilingLogger logger, IRuntimeState runtime) + { + _logger = logger; + _runtime = runtime; + } + + public void Initialize() + { + var telemetricsFilePath = IOHelper.MapPath(SystemFiles.TelemetricsIdentifier); + + // Verify file does not exist already + // If the site is upgraded and the file was removed it would re-create one + if (File.Exists(telemetricsFilePath)) + { + _logger.Warn("When installing or upgrading the anonymous telemetry file already existsed on disk at {filePath} with the runtime state {runtimeStateLevel}", telemetricsFilePath, _runtime.Level); + return; + } + + // Generate GUID + var telemetrySiteIdentifier = Guid.NewGuid(); + + // Write file contents + try + { + File.WriteAllText(telemetricsFilePath, telemetrySiteIdentifier.ToString()); + } + catch (Exception ex) + { + _logger.Error(ex, "Unable to create telemetry file at {filePath}", telemetricsFilePath); + } + + } + + public void Terminate() + { + } + } +} diff --git a/src/Umbraco.Web/Telemetry/TelemetryMarkerComposer.cs b/src/Umbraco.Web/Telemetry/TelemetryMarkerComposer.cs new file mode 100644 index 0000000000..e01b4a7f10 --- /dev/null +++ b/src/Umbraco.Web/Telemetry/TelemetryMarkerComposer.cs @@ -0,0 +1,9 @@ +using Umbraco.Core; +using Umbraco.Core.Composing; + +namespace Umbraco.Web.Telemetry +{ + [RuntimeLevel(MinLevel = RuntimeLevel.Install, MaxLevel = RuntimeLevel.Upgrade)] + public class TelemetryMarkerComposer : ComponentComposer, ICoreComposer + { } +} diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 90088fe552..1f7158b2b1 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -297,8 +297,10 @@ + + From b1051a882d8196d5f9b15b0b363e4eb8d64a80dd Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Thu, 5 Nov 2020 11:52:50 +0000 Subject: [PATCH 04/23] git ignore telemetry file when doing local dev --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index eee2a46a44..3ae099a82f 100644 --- a/.gitignore +++ b/.gitignore @@ -175,3 +175,4 @@ cypress.env.json /src/Umbraco.Tests.AcceptanceTest/package-lock.json /src/Umbraco.Tests.AcceptanceTest/cypress/videos/ /src/Umbraco.Tests.AcceptanceTest/cypress/screenshots/ +src/Umbraco.Web.UI/Umbraco/telemetrics-id.umb From a28f3475eb7032772cec9ddc3a1ca5649f1d98ab Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Thu, 5 Nov 2020 11:55:18 +0000 Subject: [PATCH 05/23] Only add something to the log when upgrading that the file is missing - during install it would loop over this component serveral times --- src/Umbraco.Web/Telemetry/TelemetryMarkerComponent.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web/Telemetry/TelemetryMarkerComponent.cs b/src/Umbraco.Web/Telemetry/TelemetryMarkerComponent.cs index 0426fe777e..660ed18fba 100644 --- a/src/Umbraco.Web/Telemetry/TelemetryMarkerComponent.cs +++ b/src/Umbraco.Web/Telemetry/TelemetryMarkerComponent.cs @@ -22,14 +22,17 @@ namespace Umbraco.Web.Telemetry { var telemetricsFilePath = IOHelper.MapPath(SystemFiles.TelemetricsIdentifier); - // Verify file does not exist already + // Verify file does not exist already (if we are upgrading) + // In a clean install we know it would not exist // If the site is upgraded and the file was removed it would re-create one - if (File.Exists(telemetricsFilePath)) + // NOTE: If user removed the marker file to opt out it would re-create a new guid marker file & potentially skew + if (_runtime.Level == RuntimeLevel.Upgrade && File.Exists(telemetricsFilePath)) { - _logger.Warn("When installing or upgrading the anonymous telemetry file already existsed on disk at {filePath} with the runtime state {runtimeStateLevel}", telemetricsFilePath, _runtime.Level); + _logger.Warn("When upgrading the anonymous telemetry file already existsed on disk at {filePath}", telemetricsFilePath); return; } + // We are a clean install or an upgrade without the marker file // Generate GUID var telemetrySiteIdentifier = Guid.NewGuid(); From 918529748494461e0ebb0d20054ad2b3d48a19ed Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Thu, 5 Nov 2020 11:55:30 +0000 Subject: [PATCH 06/23] Post to dev env --- src/Umbraco.Web/Telemetry/ReportSiteTask.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs index 8d777b73db..a3f9e0991d 100644 --- a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs +++ b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs @@ -83,7 +83,7 @@ namespace Umbraco.Web.Telemetry // https://telemetry.umbraco.com/installs // Fire & Forget, do not need to know if its a 200, 500 etc var postData = new TelemetryReportData { Id = telemetrySiteIdentifier, Version = UmbracoVersion.SemanticVersion.ToSemanticString() }; - var result = await _httpClient.PostAsync("https://webhook.site/9c38527a-eca4-4ad6-9847-202f2b37c07d", postData, new JsonMediaTypeFormatter()); + var result = await _httpClient.PostAsync("https://telemetry.rainbowsrock.net/installs", postData, new JsonMediaTypeFormatter()); } catch (Exception ex) { From 69b3feb0ea575a184e49843b35c1561a122d9fc9 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Thu, 5 Nov 2020 12:17:46 +0000 Subject: [PATCH 07/23] Correct dev URL note the trailing slash --- src/Umbraco.Web/Telemetry/ReportSiteTask.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs index a3f9e0991d..df0bed0830 100644 --- a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs +++ b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs @@ -83,7 +83,7 @@ namespace Umbraco.Web.Telemetry // https://telemetry.umbraco.com/installs // Fire & Forget, do not need to know if its a 200, 500 etc var postData = new TelemetryReportData { Id = telemetrySiteIdentifier, Version = UmbracoVersion.SemanticVersion.ToSemanticString() }; - var result = await _httpClient.PostAsync("https://telemetry.rainbowsrock.net/installs", postData, new JsonMediaTypeFormatter()); + var result = await _httpClient.PostAsync("https://telemetry.rainbowsrock.net/installs/", postData, new JsonMediaTypeFormatter()); } catch (Exception ex) { From 191d86e27cd258aca12d0e7b641a88dc34b4e48e Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Tue, 10 Nov 2020 08:25:32 +0000 Subject: [PATCH 08/23] Do not log that marker file exists already during the serval install boot cycles --- src/Umbraco.Web/Telemetry/TelemetryMarkerComponent.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Umbraco.Web/Telemetry/TelemetryMarkerComponent.cs b/src/Umbraco.Web/Telemetry/TelemetryMarkerComponent.cs index 660ed18fba..36cae322ce 100644 --- a/src/Umbraco.Web/Telemetry/TelemetryMarkerComponent.cs +++ b/src/Umbraco.Web/Telemetry/TelemetryMarkerComponent.cs @@ -31,6 +31,11 @@ namespace Umbraco.Web.Telemetry _logger.Warn("When upgrading the anonymous telemetry file already existsed on disk at {filePath}", telemetricsFilePath); return; } + else if (_runtime.Level == RuntimeLevel.Install && File.Exists(telemetricsFilePath)) + { + // No need to log for when level is install if file exists (As this component hit several times during install process) + return; + } // We are a clean install or an upgrade without the marker file // Generate GUID From 59a03115ea808f0fd4730f53ccfc7d803433201b Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Tue, 10 Nov 2020 09:58:15 +0000 Subject: [PATCH 09/23] Posting to service needed lowercase properties --- src/Umbraco.Web/Telemetry/ReportSiteTask.cs | 29 ++++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs index df0bed0830..1905e51540 100644 --- a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs +++ b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs @@ -1,7 +1,8 @@ -using System; +using Newtonsoft.Json; +using System; using System.IO; using System.Net.Http; -using System.Net.Http.Formatting; +using System.Text; using System.Threading; using System.Threading.Tasks; using Umbraco.Core; @@ -76,14 +77,26 @@ namespace Umbraco.Web.Telemetry return false; } - try { - // Make a HTTP Post to telemetry service - // https://telemetry.umbraco.com/installs - // Fire & Forget, do not need to know if its a 200, 500 etc + // Send data to LIVE telemetry + _httpClient.BaseAddress = new Uri("https://telemetry.umbraco.com/"); + +//#if DEBUG +// // Send data to DEBUG telemetry service +// _httpClient.BaseAddress = new Uri("https://telemetry.rainbowsrock.net/"); +//#endif + + _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); var postData = new TelemetryReportData { Id = telemetrySiteIdentifier, Version = UmbracoVersion.SemanticVersion.ToSemanticString() }; - var result = await _httpClient.PostAsync("https://telemetry.rainbowsrock.net/installs/", postData, new JsonMediaTypeFormatter()); + var request = new HttpRequestMessage(HttpMethod.Post, "installs/"); + request.Content = new StringContent(JsonConvert.SerializeObject(postData), Encoding.UTF8, "application/json"); //CONTENT-TYPE header + + // Make a HTTP Post to telemetry service + // https://telemetry.umbraco.com/installs/ + // Fire & Forget, do not need to know if its a 200, 500 etc + var result = await _httpClient.SendAsync(request); + } catch (Exception ex) { @@ -100,8 +113,10 @@ namespace Umbraco.Web.Telemetry private class TelemetryReportData { + [JsonProperty("id")] public Guid Id { get; set; } + [JsonProperty("version")] public string Version { get; set; } } } From 8a6db7f71f930f423f76baeefaead17ca5d2990d Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Mon, 30 Nov 2020 09:05:03 +0000 Subject: [PATCH 10/23] Uncomment out the DEBUG lines --- src/Umbraco.Web/Telemetry/ReportSiteTask.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs index 1905e51540..074322e126 100644 --- a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs +++ b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs @@ -83,8 +83,8 @@ namespace Umbraco.Web.Telemetry _httpClient.BaseAddress = new Uri("https://telemetry.umbraco.com/"); //#if DEBUG -// // Send data to DEBUG telemetry service -// _httpClient.BaseAddress = new Uri("https://telemetry.rainbowsrock.net/"); + // Send data to DEBUG telemetry service + _httpClient.BaseAddress = new Uri("https://telemetry.rainbowsrock.net/"); //#endif _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); From 36cd06b952e12d7fc6cc79501c50314b27102b2d Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Mon, 30 Nov 2020 09:05:38 +0000 Subject: [PATCH 11/23] Add Debug logging and dont set type for ex as we are not using it --- src/Umbraco.Web/Telemetry/ReportSiteTask.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs index 074322e126..373a1765c8 100644 --- a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs +++ b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs @@ -92,16 +92,19 @@ namespace Umbraco.Web.Telemetry var request = new HttpRequestMessage(HttpMethod.Post, "installs/"); request.Content = new StringContent(JsonConvert.SerializeObject(postData), Encoding.UTF8, "application/json"); //CONTENT-TYPE header + // Make a HTTP Post to telemetry service // https://telemetry.umbraco.com/installs/ // Fire & Forget, do not need to know if its a 200, 500 etc var result = await _httpClient.SendAsync(request); } - catch (Exception ex) + catch { // Silently swallow - // The user does need logs being polluted if our service has fallen over or is down etc + // The user does not need the logs being polluted if our service has fallen over or is down etc + // Hence only loggigng this at a more verbose level (Which users should not be using in prod) + _logger.Debug("There was a problem sending a request to the Umbraco telemetry service"); } // Keep recurring this task & pinging the telemetry service From c5afcf1c9c394c156e791cb7b6d03ea37ac571f3 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Mon, 30 Nov 2020 09:08:24 +0000 Subject: [PATCH 12/23] Move marker file into App_Data a folder that can never be served --- src/Umbraco.Core/IO/SystemFiles.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Core/IO/SystemFiles.cs b/src/Umbraco.Core/IO/SystemFiles.cs index 5e38737dd2..d33e9dfdfc 100644 --- a/src/Umbraco.Core/IO/SystemFiles.cs +++ b/src/Umbraco.Core/IO/SystemFiles.cs @@ -7,7 +7,7 @@ namespace Umbraco.Core.IO { public static string TinyMceConfig => SystemDirectories.Config + "/tinyMceConfig.config"; - public static string TelemetricsIdentifier => SystemDirectories.Umbraco + "/telemetrics-id.umb"; + public static string TelemetricsIdentifier => SystemDirectories.Data + "/telemetrics-id.umb"; // TODO: Kill this off we don't have umbraco.config XML cache we now have NuCache public static string GetContentCacheXml(IGlobalSettings globalSettings) From 5dcb488d2cc5bb6214936d53548f163cf6a68995 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Mon, 30 Nov 2020 09:12:27 +0000 Subject: [PATCH 13/23] Update src/Umbraco.Web/Telemetry/ReportSiteTask.cs Co-authored-by: Bjarke Berg --- src/Umbraco.Web/Telemetry/ReportSiteTask.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs index 373a1765c8..0613e37bab 100644 --- a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs +++ b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs @@ -114,14 +114,14 @@ namespace Umbraco.Web.Telemetry public override bool IsAsync => true; + [DataContract] private class TelemetryReportData { - [JsonProperty("id")] + [DataMember(Name = "id")] public Guid Id { get; set; } - [JsonProperty("version")] + [DataMember(Name = "version")] public string Version { get; set; } } } } - From f747e2a2dcc3a2a91083034de7e10973b98fa273 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Mon, 30 Nov 2020 09:17:39 +0000 Subject: [PATCH 14/23] Missing namespace from Bjarkes suggestion to move to DataMember --- src/Umbraco.Web/Telemetry/ReportSiteTask.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs index 0613e37bab..7c2913a465 100644 --- a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs +++ b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs @@ -2,6 +2,7 @@ using System; using System.IO; using System.Net.Http; +using System.Runtime.Serialization; using System.Text; using System.Threading; using System.Threading.Tasks; From 1394387d4360452de29f154320f0c0555538fbad Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Mon, 30 Nov 2020 09:18:13 +0000 Subject: [PATCH 15/23] Move the backgroundtask runner into Initialize method to follow same practise as SchedulerComponent --- src/Umbraco.Web/Telemetry/TelemetryComponent.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web/Telemetry/TelemetryComponent.cs b/src/Umbraco.Web/Telemetry/TelemetryComponent.cs index c8113df58b..bb26ae5f8d 100644 --- a/src/Umbraco.Web/Telemetry/TelemetryComponent.cs +++ b/src/Umbraco.Web/Telemetry/TelemetryComponent.cs @@ -15,11 +15,13 @@ namespace Umbraco.Web.Telemetry { _logger = logger; _runtime = runtime; - _telemetryReporterRunner = new BackgroundTaskRunner("TelemetryReporter", _logger); } public void Initialize() { + // backgrounds runners are web aware, if the app domain dies, these tasks will wind down correctly + _telemetryReporterRunner = new BackgroundTaskRunner("TelemetryReporter", _logger); + int delayBeforeWeStart = 60 * 1000; // 60 * 1000ms = 1min (60,000) int howOftenWeRepeat = 60 * 1000 * 60 * 24; // 60 * 1000 * 60 * 24 = 24hrs (86400000) From b29ed4c9c36e6e8ac6acc99a6002ddd11a7a82f2 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Mon, 30 Nov 2020 10:04:21 +0000 Subject: [PATCH 16/23] Set a low 1 second timeout, no need to be a BIG timeout on this request --- src/Umbraco.Web/Telemetry/ReportSiteTask.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs index 7c2913a465..5f3dbcb70c 100644 --- a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs +++ b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs @@ -93,6 +93,8 @@ namespace Umbraco.Web.Telemetry var request = new HttpRequestMessage(HttpMethod.Post, "installs/"); request.Content = new StringContent(JsonConvert.SerializeObject(postData), Encoding.UTF8, "application/json"); //CONTENT-TYPE header + // Set a low timeout - no need to use a larger default timeout for this POST request + _httpClient.Timeout = new TimeSpan(0,0,1); // Make a HTTP Post to telemetry service // https://telemetry.umbraco.com/installs/ From 53282686450418d55b0c26f6e985b20c06d64628 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Mon, 30 Nov 2020 10:08:48 +0000 Subject: [PATCH 17/23] Uncomment #ifdef --- src/Umbraco.Web/Telemetry/ReportSiteTask.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs index 5f3dbcb70c..34c5932081 100644 --- a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs +++ b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs @@ -83,10 +83,10 @@ namespace Umbraco.Web.Telemetry // Send data to LIVE telemetry _httpClient.BaseAddress = new Uri("https://telemetry.umbraco.com/"); -//#if DEBUG +#if DEBUG // Send data to DEBUG telemetry service _httpClient.BaseAddress = new Uri("https://telemetry.rainbowsrock.net/"); -//#endif +#endif _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); var postData = new TelemetryReportData { Id = telemetrySiteIdentifier, Version = UmbracoVersion.SemanticVersion.ToSemanticString() }; From fc2ff2525d23dbd2bbe6b4977dc5a1eafd405c84 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Mon, 30 Nov 2020 10:15:06 +0000 Subject: [PATCH 18/23] No need for the if null check as it will always be null in the ctor --- src/Umbraco.Web/Telemetry/ReportSiteTask.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs index 34c5932081..a9c6ea7bde 100644 --- a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs +++ b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs @@ -25,9 +25,7 @@ namespace Umbraco.Web.Telemetry { _runtime = runtime; _logger = logger; - - if (_httpClient == null) - _httpClient = new HttpClient(); + _httpClient = new HttpClient(); } /// From 3e6830e1736a68d2b0a71a21eaf84e6726170424 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Mon, 30 Nov 2020 10:18:11 +0000 Subject: [PATCH 19/23] Exit out of function but set to repeat if we are unable to read the file (perhaps a file lock) --- src/Umbraco.Web/Telemetry/ReportSiteTask.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs index a9c6ea7bde..2f6c348414 100644 --- a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs +++ b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs @@ -61,6 +61,9 @@ namespace Umbraco.Web.Telemetry // Silently swallow ex - but lets log it (ReadAllText throws a ton of different types of ex) // Hence the use of general exception type _logger.Error(ex, "Error in reading file contents of telemetry marker file found at '{filePath}'", telemetricsFilePath); + + // Exit out early, but mark this task to be repeated in case its a file lock so it can be rechecked the next time round + return true; } From 4de3c05e83aa4cbb0f877a691039828bc05c39e7 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Mon, 30 Nov 2020 10:33:07 +0000 Subject: [PATCH 20/23] Wrap use of httpClient in a usings due to it being IDisposable --- src/Umbraco.Web/Telemetry/ReportSiteTask.cs | 24 +++++++++++---------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs index 2f6c348414..725f0e431f 100644 --- a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs +++ b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs @@ -89,19 +89,21 @@ namespace Umbraco.Web.Telemetry _httpClient.BaseAddress = new Uri("https://telemetry.rainbowsrock.net/"); #endif - _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); - var postData = new TelemetryReportData { Id = telemetrySiteIdentifier, Version = UmbracoVersion.SemanticVersion.ToSemanticString() }; - var request = new HttpRequestMessage(HttpMethod.Post, "installs/"); - request.Content = new StringContent(JsonConvert.SerializeObject(postData), Encoding.UTF8, "application/json"); //CONTENT-TYPE header + using (_httpClient) + { + _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); + var postData = new TelemetryReportData { Id = telemetrySiteIdentifier, Version = UmbracoVersion.SemanticVersion.ToSemanticString() }; + var request = new HttpRequestMessage(HttpMethod.Post, "installs/"); + request.Content = new StringContent(JsonConvert.SerializeObject(postData), Encoding.UTF8, "application/json"); //CONTENT-TYPE header - // Set a low timeout - no need to use a larger default timeout for this POST request - _httpClient.Timeout = new TimeSpan(0,0,1); - - // Make a HTTP Post to telemetry service - // https://telemetry.umbraco.com/installs/ - // Fire & Forget, do not need to know if its a 200, 500 etc - var result = await _httpClient.SendAsync(request); + // Set a low timeout - no need to use a larger default timeout for this POST request + _httpClient.Timeout = new TimeSpan(0, 0, 1); + // Make a HTTP Post to telemetry service + // https://telemetry.umbraco.com/installs/ + // Fire & Forget, do not need to know if its a 200, 500 etc + var result = await _httpClient.SendAsync(request); + } } catch { From fa931416a459de1cdea9eea0c3c746c2ea27d6e5 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Mon, 30 Nov 2020 10:34:10 +0000 Subject: [PATCH 21/23] Forgot to move the baseaddress set inside the usings --- src/Umbraco.Web/Telemetry/ReportSiteTask.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs index 725f0e431f..74342a2bf3 100644 --- a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs +++ b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs @@ -81,16 +81,16 @@ namespace Umbraco.Web.Telemetry try { - // Send data to LIVE telemetry - _httpClient.BaseAddress = new Uri("https://telemetry.umbraco.com/"); - -#if DEBUG - // Send data to DEBUG telemetry service - _httpClient.BaseAddress = new Uri("https://telemetry.rainbowsrock.net/"); -#endif - using (_httpClient) { + // Send data to LIVE telemetry + _httpClient.BaseAddress = new Uri("https://telemetry.umbraco.com/"); + +#if DEBUG + // Send data to DEBUG telemetry service + _httpClient.BaseAddress = new Uri("https://telemetry.rainbowsrock.net/"); +#endif + _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); var postData = new TelemetryReportData { Id = telemetrySiteIdentifier, Version = UmbracoVersion.SemanticVersion.ToSemanticString() }; var request = new HttpRequestMessage(HttpMethod.Post, "installs/"); From ee89610559e77c86716e17a7dea8e489bc2446c8 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Mon, 30 Nov 2020 12:23:28 +0000 Subject: [PATCH 22/23] Remove unused RuntimeState --- src/Umbraco.Web/Telemetry/ReportSiteTask.cs | 4 +--- src/Umbraco.Web/Telemetry/TelemetryComponent.cs | 9 +++------ 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs index 74342a2bf3..aa5aefe218 100644 --- a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs +++ b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs @@ -16,14 +16,12 @@ namespace Umbraco.Web.Telemetry { public class ReportSiteTask : RecurringTaskBase { - private IRuntimeState _runtime; private IProfilingLogger _logger; private static HttpClient _httpClient; - public ReportSiteTask(IBackgroundTaskRunner runner, int delayBeforeWeStart, int howOftenWeRepeat, IRuntimeState runtime, IProfilingLogger logger) + public ReportSiteTask(IBackgroundTaskRunner runner, int delayBeforeWeStart, int howOftenWeRepeat, IProfilingLogger logger) : base(runner, delayBeforeWeStart, howOftenWeRepeat) { - _runtime = runtime; _logger = logger; _httpClient = new HttpClient(); } diff --git a/src/Umbraco.Web/Telemetry/TelemetryComponent.cs b/src/Umbraco.Web/Telemetry/TelemetryComponent.cs index bb26ae5f8d..4ea4c6573a 100644 --- a/src/Umbraco.Web/Telemetry/TelemetryComponent.cs +++ b/src/Umbraco.Web/Telemetry/TelemetryComponent.cs @@ -1,5 +1,4 @@ -using Umbraco.Core; -using Umbraco.Core.Composing; +using Umbraco.Core.Composing; using Umbraco.Core.Logging; using Umbraco.Web.Scheduling; @@ -8,13 +7,11 @@ namespace Umbraco.Web.Telemetry public class TelemetryComponent : IComponent { private IProfilingLogger _logger; - private IRuntimeState _runtime; private BackgroundTaskRunner _telemetryReporterRunner; - public TelemetryComponent(IProfilingLogger logger, IRuntimeState runtime) + public TelemetryComponent(IProfilingLogger logger) { _logger = logger; - _runtime = runtime; } public void Initialize() @@ -26,7 +23,7 @@ namespace Umbraco.Web.Telemetry int howOftenWeRepeat = 60 * 1000 * 60 * 24; // 60 * 1000 * 60 * 24 = 24hrs (86400000) // As soon as we add our task to the runner it will start to run (after its delay period) - var task = new ReportSiteTask(_telemetryReporterRunner, delayBeforeWeStart, howOftenWeRepeat, _runtime, _logger); + var task = new ReportSiteTask(_telemetryReporterRunner, delayBeforeWeStart, howOftenWeRepeat, _logger); _telemetryReporterRunner.TryAdd(task); } From 6d120322e5154bd60bf7a37e8c9e3f5d9aaebdb4 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Mon, 30 Nov 2020 13:35:55 +0100 Subject: [PATCH 23/23] Do not dispose the static httpClient, but the HttpRequestMessage --- src/Umbraco.Web/Telemetry/ReportSiteTask.cs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs index aa5aefe218..fcac8570d2 100644 --- a/src/Umbraco.Web/Telemetry/ReportSiteTask.cs +++ b/src/Umbraco.Web/Telemetry/ReportSiteTask.cs @@ -79,19 +79,20 @@ namespace Umbraco.Web.Telemetry try { - using (_httpClient) - { - // Send data to LIVE telemetry - _httpClient.BaseAddress = new Uri("https://telemetry.umbraco.com/"); + + // Send data to LIVE telemetry + _httpClient.BaseAddress = new Uri("https://telemetry.umbraco.com/"); #if DEBUG - // Send data to DEBUG telemetry service - _httpClient.BaseAddress = new Uri("https://telemetry.rainbowsrock.net/"); + // Send data to DEBUG telemetry service + _httpClient.BaseAddress = new Uri("https://telemetry.rainbowsrock.net/"); #endif - _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); + _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json"); + + using (var request = new HttpRequestMessage(HttpMethod.Post, "installs/")) + { var postData = new TelemetryReportData { Id = telemetrySiteIdentifier, Version = UmbracoVersion.SemanticVersion.ToSemanticString() }; - var request = new HttpRequestMessage(HttpMethod.Post, "installs/"); request.Content = new StringContent(JsonConvert.SerializeObject(postData), Encoding.UTF8, "application/json"); //CONTENT-TYPE header // Set a low timeout - no need to use a larger default timeout for this POST request