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>>(