diff --git a/src/Gallery.CredentialExpiration/Gallery.CredentialExpiration.csproj b/src/Gallery.CredentialExpiration/Gallery.CredentialExpiration.csproj
index 10e2e269f..11a191f4e 100644
--- a/src/Gallery.CredentialExpiration/Gallery.CredentialExpiration.csproj
+++ b/src/Gallery.CredentialExpiration/Gallery.CredentialExpiration.csproj
@@ -103,7 +103,7 @@
9.0.1
- 2.36.0
+ 2.39.0
2.1.3
diff --git a/src/NuGet.Jobs.Common/NuGet.Jobs.Common.csproj b/src/NuGet.Jobs.Common/NuGet.Jobs.Common.csproj
index 29d291748..02f71a448 100644
--- a/src/NuGet.Jobs.Common/NuGet.Jobs.Common.csproj
+++ b/src/NuGet.Jobs.Common/NuGet.Jobs.Common.csproj
@@ -105,13 +105,13 @@
all
- 2.33.0
+ 2.39.0
- 2.33.0
+ 2.39.0
- 2.33.0
+ 2.39.0
4.3.3
diff --git a/src/NuGet.Services.Revalidate/NuGet.Services.Revalidate.csproj b/src/NuGet.Services.Revalidate/NuGet.Services.Revalidate.csproj
index 762cc12e5..5e223e60f 100644
--- a/src/NuGet.Services.Revalidate/NuGet.Services.Revalidate.csproj
+++ b/src/NuGet.Services.Revalidate/NuGet.Services.Revalidate.csproj
@@ -123,7 +123,7 @@
all
- 2.33.0
+ 2.39.0
diff --git a/src/NuGet.Services.Validation.Orchestrator/Job.cs b/src/NuGet.Services.Validation.Orchestrator/Job.cs
index 63af2b731..7eb10a3df 100644
--- a/src/NuGet.Services.Validation.Orchestrator/Job.cs
+++ b/src/NuGet.Services.Validation.Orchestrator/Job.cs
@@ -47,6 +47,11 @@ namespace NuGet.Services.Validation.Orchestrator
{
public class Job : JobBase
{
+ ///
+ /// The maximum number of concurrent connections that can be established to a single server.
+ ///
+ private const int MaximumConnectionsPerServer = 64;
+
private const string ConfigurationArgument = "Configuration";
private const string ValidateArgument = "Validate";
@@ -93,6 +98,8 @@ public class Job : JobBase
public override void Init(IServiceContainer serviceContainer, IDictionary jobArgsDictionary)
{
+ ServicePointManager.DefaultConnectionLimit = MaximumConnectionsPerServer;
+
var configurationFilename = JobConfigurationManager.GetArgument(jobArgsDictionary, ConfigurationArgument);
_validateOnly = JobConfigurationManager.TryGetBoolArgument(jobArgsDictionary, ValidateArgument, defaultValue: false);
diff --git a/src/NuGet.Services.Validation.Orchestrator/NuGet.Services.Validation.Orchestrator.csproj b/src/NuGet.Services.Validation.Orchestrator/NuGet.Services.Validation.Orchestrator.csproj
index 8e3224342..6579fb5b2 100644
--- a/src/NuGet.Services.Validation.Orchestrator/NuGet.Services.Validation.Orchestrator.csproj
+++ b/src/NuGet.Services.Validation.Orchestrator/NuGet.Services.Validation.Orchestrator.csproj
@@ -167,7 +167,7 @@
all
- 2.36.0
+ 2.39.0
diff --git a/src/NuGet.Services.Validation.Orchestrator/Services/PackageMessageService.cs b/src/NuGet.Services.Validation.Orchestrator/Services/PackageMessageService.cs
index 7657b2edf..da98d8247 100644
--- a/src/NuGet.Services.Validation.Orchestrator/Services/PackageMessageService.cs
+++ b/src/NuGet.Services.Validation.Orchestrator/Services/PackageMessageService.cs
@@ -7,6 +7,7 @@
using Microsoft.Extensions.Options;
using NuGet.Services.Entities;
using NuGet.Services.Messaging.Email;
+using NuGetGallery.Infrastructure.Mail.Messages;
namespace NuGet.Services.Validation.Orchestrator
{
diff --git a/src/NuGet.Services.Validation.Orchestrator/Services/SymbolsMessageService.cs b/src/NuGet.Services.Validation.Orchestrator/Services/SymbolsMessageService.cs
index 51eac1f56..8343f0e05 100644
--- a/src/NuGet.Services.Validation.Orchestrator/Services/SymbolsMessageService.cs
+++ b/src/NuGet.Services.Validation.Orchestrator/Services/SymbolsMessageService.cs
@@ -7,6 +7,7 @@
using Microsoft.Extensions.Options;
using NuGet.Services.Entities;
using NuGet.Services.Messaging.Email;
+using NuGetGallery.Infrastructure.Mail.Messages;
namespace NuGet.Services.Validation.Orchestrator
{
diff --git a/src/NuGet.Services.Validation.Orchestrator/Telemetry/ITelemetryService.cs b/src/NuGet.Services.Validation.Orchestrator/Telemetry/ITelemetryService.cs
index 8769f508a..1b556a4fe 100644
--- a/src/NuGet.Services.Validation.Orchestrator/Telemetry/ITelemetryService.cs
+++ b/src/NuGet.Services.Validation.Orchestrator/Telemetry/ITelemetryService.cs
@@ -17,12 +17,19 @@ public interface ITelemetryService
///
void TrackDurationToValidationSetCreation(TimeSpan duration);
+ ///
+ /// Track how long a package's backup takes.
+ ///
+ /// The validation set that requested the backup.
+ /// Reports the duration when disposed.
+ IDisposable TrackDurationToBackupPackage(PackageValidationSet validationSet);
+
///
/// A counter metric emitted when a package changes package status. This metric is not emitted if package status
/// does not change. This metric is emitted for revalidation if the terminal state changes.
///
/// The status that the package moved from.
- /// The status that the package moved tp.
+ /// The status that the package moved to.
void TrackPackageStatusChange(PackageStatus fromStatus, PackageStatus toStatus);
///
diff --git a/src/NuGet.Services.Validation.Orchestrator/Telemetry/TelemetryService.cs b/src/NuGet.Services.Validation.Orchestrator/Telemetry/TelemetryService.cs
index 81c918f3a..473e48acf 100644
--- a/src/NuGet.Services.Validation.Orchestrator/Telemetry/TelemetryService.cs
+++ b/src/NuGet.Services.Validation.Orchestrator/Telemetry/TelemetryService.cs
@@ -16,6 +16,7 @@ public class TelemetryService : ITelemetryService, ISubscriptionProcessorTelemet
private const string PackageCertificatesPrefix = "PackageCertificates.";
private const string DurationToValidationSetCreationSeconds = OrchestratorPrefix + "DurationToValidationSetCreationSeconds";
+ private const string DurationToBackupPackageSeconds = OrchestratorPrefix + "DurationToBackupPackageSeconds";
private const string PackageStatusChange = OrchestratorPrefix + "PackageStatusChange";
private const string TotalValidationDurationSeconds = OrchestratorPrefix + "TotalValidationDurationSeconds";
private const string SentValidationTakingTooLongMessage = OrchestratorPrefix + "SentValidationTakingTooLongMessage";
@@ -31,6 +32,8 @@ public class TelemetryService : ITelemetryService, ISubscriptionProcessorTelemet
private const string DurationToHashPackageSeconds = OrchestratorPrefix + "DurationToHashPackageSeconds";
private const string MessageDeliveryLag = OrchestratorPrefix + "MessageDeliveryLag";
private const string MessageEnqueueLag = OrchestratorPrefix + "MessageEnqueueLag";
+ private const string MessageHandlerDurationSeconds = OrchestratorPrefix + "MessageHandlerDurationSeconds";
+ private const string MessageLockLost = OrchestratorPrefix + "MessageLockLost";
private const string SymbolsMessageEnqueued = OrchestratorPrefix + "SymbolsMessageEnqueued";
private const string DurationToStartPackageSigningValidatorSeconds = PackageSigningPrefix + "DurationToStartSeconds";
@@ -50,6 +53,8 @@ public class TelemetryService : ITelemetryService, ISubscriptionProcessorTelemet
private const string HashAlgorithm = "HashAlgorithm";
private const string StreamType = "StreamType";
private const string MessageType = "MessageType";
+ private const string CallGuid = "CallGuid";
+ private const string Handled = "Handled";
private const string ValidationId = "ValidationId";
private const string OperationDateTime = "OperationDateTime";
@@ -86,6 +91,18 @@ public void TrackDurationToValidationSetCreation(TimeSpan duration)
duration.TotalSeconds);
}
+ public IDisposable TrackDurationToBackupPackage(PackageValidationSet validationSet)
+ {
+ return _telemetryClient.TrackDuration(
+ DurationToBackupPackageSeconds,
+ new Dictionary
+ {
+ { ValidationTrackingId, validationSet.ValidationTrackingId.ToString() },
+ { PackageId, validationSet.PackageId },
+ { NormalizedVersion, validationSet.PackageNormalizedVersion }
+ });
+ }
+
public void TrackPackageStatusChange(PackageStatus fromStatus, PackageStatus toStatus)
{
_telemetryClient.TrackMetric(
@@ -238,6 +255,31 @@ public void TrackMessageDeliveryLag(TimeSpan deliveryLag)
{ MessageType, typeof(TMessage).Name }
});
+ public void TrackMessageHandlerDuration(TimeSpan duration, Guid callGuid, bool handled)
+ {
+ _telemetryClient.TrackMetric(
+ MessageHandlerDurationSeconds,
+ duration.TotalSeconds,
+ new Dictionary
+ {
+ { MessageType, typeof(TMessage).Name },
+ { CallGuid, callGuid.ToString() },
+ { Handled, handled.ToString() }
+ });
+ }
+
+ public void TrackMessageLockLost(Guid callGuid)
+ {
+ _telemetryClient.TrackMetric(
+ MessageLockLost,
+ 1,
+ new Dictionary
+ {
+ { MessageType, typeof(TMessage).Name },
+ { CallGuid, callGuid.ToString() }
+ });
+ }
+
public void TrackEnqueueLag(TimeSpan enqueueLag)
=> _telemetryClient.TrackMetric(
MessageEnqueueLag,
diff --git a/src/NuGet.Services.Validation.Orchestrator/ValidationPackageFileService.cs b/src/NuGet.Services.Validation.Orchestrator/ValidationPackageFileService.cs
index 233464578..52a917b94 100644
--- a/src/NuGet.Services.Validation.Orchestrator/ValidationPackageFileService.cs
+++ b/src/NuGet.Services.Validation.Orchestrator/ValidationPackageFileService.cs
@@ -118,19 +118,22 @@ public Task CopyValidationPackageForValidationSetAsync(PackageValidationSet vali
public async Task BackupPackageFileFromValidationSetPackageAsync(PackageValidationSet validationSet)
{
- _logger.LogInformation(
- "Backing up package for validation set {ValidationTrackingId} ({PackageId} {PackageVersion}).",
- validationSet.ValidationTrackingId,
- validationSet.PackageId,
- validationSet.PackageNormalizedVersion);
+ using (_telemetryService.TrackDurationToBackupPackage(validationSet))
+ {
+ _logger.LogInformation(
+ "Backing up package for validation set {ValidationTrackingId} ({PackageId} {PackageVersion}).",
+ validationSet.ValidationTrackingId,
+ validationSet.PackageId,
+ validationSet.PackageNormalizedVersion);
- var packageUri = await GetPackageForValidationSetReadUriAsync(
- validationSet,
- DateTimeOffset.UtcNow.Add(AccessDuration));
+ var packageUri = await GetPackageForValidationSetReadUriAsync(
+ validationSet,
+ DateTimeOffset.UtcNow.Add(AccessDuration));
- using (var packageStream = await _fileDownloader.DownloadAsync(packageUri, CancellationToken.None))
- {
- await StorePackageFileInBackupLocationAsync(validationSet, packageStream);
+ using (var packageStream = await _fileDownloader.DownloadAsync(packageUri, CancellationToken.None))
+ {
+ await StorePackageFileInBackupLocationAsync(validationSet, packageStream);
+ }
}
}
diff --git a/src/NuGet.SupportRequests.Notifications/NuGet.SupportRequests.Notifications.csproj b/src/NuGet.SupportRequests.Notifications/NuGet.SupportRequests.Notifications.csproj
index d6baa4941..23903ffbe 100644
--- a/src/NuGet.SupportRequests.Notifications/NuGet.SupportRequests.Notifications.csproj
+++ b/src/NuGet.SupportRequests.Notifications/NuGet.SupportRequests.Notifications.csproj
@@ -111,7 +111,7 @@
9.0.1
- 2.36.0
+ 2.39.0
diff --git a/src/PackageHash/PackageHash.csproj b/src/PackageHash/PackageHash.csproj
index f385878ce..ea57797da 100644
--- a/src/PackageHash/PackageHash.csproj
+++ b/src/PackageHash/PackageHash.csproj
@@ -81,7 +81,7 @@
1.1.2
- 2.22.0
+ 2.39.0
diff --git a/src/PackageLagMonitor/Monitoring.PackageLag.csproj b/src/PackageLagMonitor/Monitoring.PackageLag.csproj
index 9b58dc427..db2b507e9 100644
--- a/src/PackageLagMonitor/Monitoring.PackageLag.csproj
+++ b/src/PackageLagMonitor/Monitoring.PackageLag.csproj
@@ -112,7 +112,7 @@
0.5.0-CI-20180510-012541
- 2.33.0
+ 2.39.0
4.3.3
diff --git a/src/StatusAggregator/StatusAggregator.csproj b/src/StatusAggregator/StatusAggregator.csproj
index ed42c751e..71ec7892a 100644
--- a/src/StatusAggregator/StatusAggregator.csproj
+++ b/src/StatusAggregator/StatusAggregator.csproj
@@ -157,13 +157,13 @@
1.1.1
- 2.38.0
+ 2.39.0
- 2.38.0
+ 2.39.0
- 2.38.0
+ 2.39.0
9.2.0
diff --git a/src/Validation.Common.Job/Storage/ProcessorPackageFileService.cs b/src/Validation.Common.Job/Storage/ProcessorPackageFileService.cs
index 314e59c7a..606f4401e 100644
--- a/src/Validation.Common.Job/Storage/ProcessorPackageFileService.cs
+++ b/src/Validation.Common.Job/Storage/ProcessorPackageFileService.cs
@@ -50,7 +50,7 @@ public Task GetReadAndDeleteUriAsync(
var fileName = BuildFileName(packageId, packageNormalizedVersion, validationId);
return _fileStorageService.GetPriviledgedFileUriAsync(
- CoreConstants.ValidationFolderName,
+ CoreConstants.Folders.ValidationFolderName,
fileName,
FileUriPermissions.Read | FileUriPermissions.Delete,
DateTimeOffset.UtcNow + AccessDuration);
@@ -80,7 +80,7 @@ public Task SaveAsync(
packageFile.Position = 0;
return _fileStorageService.SaveFileAsync(
- CoreConstants.ValidationFolderName,
+ CoreConstants.Folders.ValidationFolderName,
fileName,
packageFile,
overwrite: true);
diff --git a/src/Validation.Common.Job/Validation.Common.Job.csproj b/src/Validation.Common.Job/Validation.Common.Job.csproj
index c10586732..b6cca797b 100644
--- a/src/Validation.Common.Job/Validation.Common.Job.csproj
+++ b/src/Validation.Common.Job/Validation.Common.Job.csproj
@@ -103,19 +103,19 @@
5.0.0-preview1.5665
- 2.33.0
+ 2.39.0
- 2.33.0
+ 2.39.0
- 2.33.0
+ 2.39.0
- 2.33.0
+ 2.39.0
- 4.4.5-dev-2193892
+ 4.4.5-master-2224741
2.5.0
diff --git a/src/Validation.PackageSigning.ProcessSignature/Telemetry/TelemetryService.cs b/src/Validation.PackageSigning.ProcessSignature/Telemetry/TelemetryService.cs
index 745827321..1f9a39820 100644
--- a/src/Validation.PackageSigning.ProcessSignature/Telemetry/TelemetryService.cs
+++ b/src/Validation.PackageSigning.ProcessSignature/Telemetry/TelemetryService.cs
@@ -16,6 +16,8 @@ public class TelemetryService : ITelemetryService, ISubscriptionProcessorTelemet
private const string DurationToStripRepositorySignaturesSeconds = Prefix + "DurationToStripRepositorySignaturesSeconds";
private const string MessageDeliveryLag = Prefix + "MessageDeliveryLag";
private const string MessageEnqueueLag = Prefix + "MessageEnqueueLag";
+ private const string MessageHandlerDurationSeconds = Prefix + "MessageHandlerDurationSeconds";
+ private const string MessageLockLost = Prefix + "MessageLockLost";
private const string PackageId = "PackageId";
private const string NormalizedVersion = "NormalizedVersion";
@@ -26,6 +28,8 @@ public class TelemetryService : ITelemetryService, ISubscriptionProcessorTelemet
private const string OutputCounterSignatureCount = "OutputCounterSignatureCount";
private const string Changed = "Changed";
private const string MessageType = "MessageType";
+ private const string CallGuid = "CallGuid";
+ private const string Handled = "Handled";
private readonly ITelemetryClient _telemetryClient;
@@ -100,5 +104,30 @@ public void TrackEnqueueLag(TimeSpan enqueueLag)
{
{ MessageType, typeof(TMessage).Name }
});
+
+ public void TrackMessageHandlerDuration(TimeSpan duration, Guid callGuid, bool handled)
+ {
+ _telemetryClient.TrackMetric(
+ MessageHandlerDurationSeconds,
+ duration.TotalSeconds,
+ new Dictionary
+ {
+ { MessageType, typeof(TMessage).Name },
+ { CallGuid, callGuid.ToString() },
+ { Handled, handled.ToString() }
+ });
+ }
+
+ public void TrackMessageLockLost(Guid callGuid)
+ {
+ _telemetryClient.TrackMetric(
+ MessageLockLost,
+ 1,
+ new Dictionary
+ {
+ { MessageType, typeof(TMessage).Name },
+ { CallGuid, callGuid.ToString() }
+ });
+ }
}
}
diff --git a/src/Validation.PackageSigning.ValidateCertificate/TelemetryService.cs b/src/Validation.PackageSigning.ValidateCertificate/TelemetryService.cs
index 3c19d2d22..b95caf893 100644
--- a/src/Validation.PackageSigning.ValidateCertificate/TelemetryService.cs
+++ b/src/Validation.PackageSigning.ValidateCertificate/TelemetryService.cs
@@ -17,6 +17,8 @@ public class TelemetryService : ITelemetryService, ISubscriptionProcessorTelemet
private const string UnableToValidateCertificate = Prefix + "UnableToValidateCertificate";
private const string MessageDeliveryLag = Prefix + "MessageDeliveryLag";
private const string MessageEnqueueLag = Prefix + "MessageEnqueueLag";
+ private const string MessageHandlerDurationSeconds = Prefix + "MessageHandlerDurationSeconds";
+ private const string MessageLockLost = Prefix + "MessageLockLost";
private const string PackageId = "PackageId";
private const string PackageNormalizedVersion = "PackageNormalizedVersion";
@@ -24,6 +26,8 @@ public class TelemetryService : ITelemetryService, ISubscriptionProcessorTelemet
private const string CertificateId = "CertificateId";
private const string CertificateThumbprint = "CertificateThumbprint";
private const string MessageType = "MessageType";
+ private const string CallGuid = "CallGuid";
+ private const string Handled = "Handled";
private readonly TelemetryClient _telemetryClient;
@@ -87,5 +91,30 @@ public void TrackEnqueueLag(TimeSpan enqueueLag)
{
{ MessageType, typeof(TMessage).Name }
});
+
+ public void TrackMessageHandlerDuration(TimeSpan duration, Guid callGuid, bool handled)
+ {
+ _telemetryClient.TrackMetric(
+ MessageHandlerDurationSeconds,
+ duration.TotalSeconds,
+ new Dictionary
+ {
+ { MessageType, typeof(TMessage).Name },
+ { CallGuid, callGuid.ToString() },
+ { Handled, handled.ToString() }
+ });
+ }
+
+ public void TrackMessageLockLost(Guid callGuid)
+ {
+ _telemetryClient.TrackMetric(
+ MessageLockLost,
+ 1,
+ new Dictionary
+ {
+ { MessageType, typeof(TMessage).Name },
+ { CallGuid, callGuid.ToString() }
+ });
+ }
}
}
diff --git a/src/Validation.ScanAndSign.Core/Validation.ScanAndSign.Core.csproj b/src/Validation.ScanAndSign.Core/Validation.ScanAndSign.Core.csproj
index cb3a8038d..d7701388e 100644
--- a/src/Validation.ScanAndSign.Core/Validation.ScanAndSign.Core.csproj
+++ b/src/Validation.ScanAndSign.Core/Validation.ScanAndSign.Core.csproj
@@ -64,7 +64,7 @@
all
- 2.33.0
+ 2.39.0
0.3.0
diff --git a/src/Validation.Symbols/TelemetryService.cs b/src/Validation.Symbols/TelemetryService.cs
index e99c17b9a..845106987 100644
--- a/src/Validation.Symbols/TelemetryService.cs
+++ b/src/Validation.Symbols/TelemetryService.cs
@@ -16,6 +16,8 @@ public class TelemetryService : ITelemetryService
private const string SymbolValidationDuration = Prefix + "SymbolValidationDurationInSeconds";
private const string MessageDeliveryLag = Prefix + "MessageDeliveryLag";
private const string MessageEnqueueLag = Prefix + "MessageEnqueueLag";
+ private const string MessageHandlerDurationSeconds = Prefix + "MessageHandlerDurationSeconds";
+ private const string MessageLockLost = Prefix + "MessageLockLost";
private const string SymbolValidationResult = Prefix + "SymbolValidationResult";
private const string SymbolAssemblyValidationResult = Prefix + "SymbolAssemblyValidationResult";
@@ -26,6 +28,8 @@ public class TelemetryService : ITelemetryService
private const string ValidationResult = "ValidationResult";
private const string Issue = "Issue";
private const string AssemblyName = "AssemblyName";
+ private const string CallGuid = "CallGuid";
+ private const string Handled = "Handled";
private readonly ITelemetryClient _telemetryClient;
@@ -115,5 +119,30 @@ public void TrackEnqueueLag(TimeSpan enqueueLag)
{
{ MessageType, typeof(TMessage).Name }
});
+
+ public void TrackMessageHandlerDuration(TimeSpan duration, Guid callGuid, bool handled)
+ {
+ _telemetryClient.TrackMetric(
+ MessageHandlerDurationSeconds,
+ duration.TotalSeconds,
+ new Dictionary
+ {
+ { MessageType, typeof(TMessage).Name },
+ { CallGuid, callGuid.ToString() },
+ { Handled, handled.ToString() }
+ });
+ }
+
+ public void TrackMessageLockLost(Guid callGuid)
+ {
+ _telemetryClient.TrackMetric(
+ MessageLockLost,
+ 1,
+ new Dictionary
+ {
+ { MessageType, typeof(TMessage).Name },
+ { CallGuid, callGuid.ToString() }
+ });
+ }
}
}
diff --git a/tests/NuGet.Services.Validation.Orchestrator.Tests/Services/MessageServiceFacts.cs b/tests/NuGet.Services.Validation.Orchestrator.Tests/Services/MessageServiceFacts.cs
index 205268373..9da712f31 100644
--- a/tests/NuGet.Services.Validation.Orchestrator.Tests/Services/MessageServiceFacts.cs
+++ b/tests/NuGet.Services.Validation.Orchestrator.Tests/Services/MessageServiceFacts.cs
@@ -10,6 +10,7 @@
using Moq;
using NuGet.Services.Entities;
using NuGet.Services.Messaging.Email;
+using NuGetGallery.Infrastructure.Mail.Messages;
using Xunit;
namespace NuGet.Services.Validation.Orchestrator.Tests
diff --git a/tests/NuGet.Services.Validation.Orchestrator.Tests/Services/SymbolsMessageServiceFacts.cs b/tests/NuGet.Services.Validation.Orchestrator.Tests/Services/SymbolsMessageServiceFacts.cs
index 87c7f269a..8ea72ca83 100644
--- a/tests/NuGet.Services.Validation.Orchestrator.Tests/Services/SymbolsMessageServiceFacts.cs
+++ b/tests/NuGet.Services.Validation.Orchestrator.Tests/Services/SymbolsMessageServiceFacts.cs
@@ -8,6 +8,7 @@
using Moq;
using NuGet.Services.Entities;
using NuGet.Services.Messaging.Email;
+using NuGetGallery.Infrastructure.Mail.Messages;
using Xunit;
namespace NuGet.Services.Validation.Orchestrator.Tests
diff --git a/tests/NuGet.Services.Validation.Orchestrator.Tests/TelemetryServiceFacts.cs b/tests/NuGet.Services.Validation.Orchestrator.Tests/TelemetryServiceFacts.cs
index 27e531d07..f9388a0fe 100644
--- a/tests/NuGet.Services.Validation.Orchestrator.Tests/TelemetryServiceFacts.cs
+++ b/tests/NuGet.Services.Validation.Orchestrator.Tests/TelemetryServiceFacts.cs
@@ -71,5 +71,48 @@ public void TrackDurationToHashPackage_TracksDuration()
_telemetryClient.VerifyAll();
}
+
+ [Fact]
+ public void TrackDurationToBackupPackage_TracksDuration()
+ {
+ // Arrange
+ var validationTrackingId = Guid.NewGuid();
+ var packageId = "a";
+ var normalizedVersion = "b";
+ var validationSet = new PackageValidationSet
+ {
+ ValidationTrackingId = validationTrackingId,
+ PackageId = packageId,
+ PackageNormalizedVersion = normalizedVersion
+ };
+
+ var expectedReturnValue = Mock.Of();
+
+ _telemetryClient.Setup(
+ x => x.TrackMetric(
+ It.IsNotNull(),
+ It.IsAny(),
+ It.IsNotNull>()))
+ .Callback((string metricName, double value, IDictionary properties) =>
+ {
+ Assert.Equal("Orchestrator.DurationToBackupPackageSeconds", metricName);
+ Assert.True(value > 0);
+ Assert.NotEmpty(properties);
+ Assert.Equal(new Dictionary()
+ {
+ { "ValidationTrackingId", validationTrackingId.ToString() },
+ { "PackageId", packageId },
+ { "NormalizedVersion", normalizedVersion },
+ }, properties);
+ });
+
+ // Act
+ using (_telemetryService.TrackDurationToBackupPackage(validationSet))
+ {
+ }
+
+ // Assert
+ _telemetryClient.VerifyAll();
+ }
}
}
\ No newline at end of file
diff --git a/tests/NuGet.Services.Validation.Orchestrator.Tests/ValidationPackageFileServiceFacts.cs b/tests/NuGet.Services.Validation.Orchestrator.Tests/ValidationPackageFileServiceFacts.cs
index 670b8cf4d..d6fc90c17 100644
--- a/tests/NuGet.Services.Validation.Orchestrator.Tests/ValidationPackageFileServiceFacts.cs
+++ b/tests/NuGet.Services.Validation.Orchestrator.Tests/ValidationPackageFileServiceFacts.cs
@@ -112,6 +112,15 @@ public async Task BackupPackageFileFromValidationSetPackageAsync()
.Returns(Task.CompletedTask)
.Verifiable();
+ var backupDurationMetric = new Mock(MockBehavior.Strict);
+ backupDurationMetric
+ .Setup(m => m.Dispose())
+ .Verifiable();
+
+ _telemetryService
+ .Setup(t => t.TrackDurationToBackupPackage(_validationSet))
+ .Returns(backupDurationMetric.Object);
+
var before = DateTimeOffset.UtcNow;
await _target.BackupPackageFileFromValidationSetPackageAsync(_validationSet);
var after = DateTimeOffset.UtcNow;
@@ -304,7 +313,7 @@ public async Task UpdatePackageBlobMetadataAsync()
var wasUpdated = false;
_fileStorageService.Setup(x => x.SetMetadataAsync(
- It.Is(folderName => folderName == CoreConstants.PackagesFolderName),
+ It.Is(folderName => folderName == CoreConstants.Folders.PackagesFolderName),
It.Is(fileName => fileName == _packageFileName),
It.IsNotNull>, IDictionary, Task>>()))
.Callback>, IDictionary, Task>>(
@@ -350,7 +359,7 @@ public async Task UpdatePackageBlobMetadataAsync_WhenETagChangesBetweenSuccessiv
var wasUpdated = false;
_fileStorageService.Setup(x => x.SetMetadataAsync(
- It.Is(folderName => folderName == CoreConstants.PackagesFolderName),
+ It.Is(folderName => folderName == CoreConstants.Folders.PackagesFolderName),
It.Is(fileName => fileName == _packageFileName),
It.IsNotNull>, IDictionary, Task>>()))
.Callback>, IDictionary, Task>>(