From 98f25e3017cea65051909f8900cd52786ae568ee Mon Sep 17 00:00:00 2001 From: Peng Chen <67345894+pengchen0692@users.noreply.github.com> Date: Mon, 28 Sep 2020 12:42:50 -0700 Subject: [PATCH] Log AcceptHeaders for diagnosis convenience (#356) Example Log: Getting transfer syntax for retrieving 'Frames' with accept headers 'MediaType:'application/octet-stream', PayloadType:'MultipartRelated', TransferSyntax:'', Quality:'''. --- .../Retrieve/RetrieveResourceServiceTests.cs | 2 +- .../RetrieveTransferSyntaxHandlerTests.cs | 3 ++- .../Messages/Retrieve/AcceptHeaderTests.cs | 12 ++++++++++++ .../Retrieve/RetrieveTransferSyntaxHandler.cs | 18 +++++++++++++++--- .../Messages/Retrieve/AcceptHeader.cs | 5 +++++ .../Features/RetrieveResourceServiceTests.cs | 2 +- 6 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.Health.Dicom.Core.UnitTests/Features/Retrieve/RetrieveResourceServiceTests.cs b/src/Microsoft.Health.Dicom.Core.UnitTests/Features/Retrieve/RetrieveResourceServiceTests.cs index 5524b6e833..6f993964d2 100644 --- a/src/Microsoft.Health.Dicom.Core.UnitTests/Features/Retrieve/RetrieveResourceServiceTests.cs +++ b/src/Microsoft.Health.Dicom.Core.UnitTests/Features/Retrieve/RetrieveResourceServiceTests.cs @@ -52,7 +52,7 @@ public RetrieveResourceServiceTests() _fileStore = Substitute.For(); _retrieveTranscoder = Substitute.For(); _dicomFrameHandler = Substitute.For(); - _retrieveTransferSyntaxHandler = new RetrieveTransferSyntaxHandler(); + _retrieveTransferSyntaxHandler = new RetrieveTransferSyntaxHandler(NullLogger.Instance); _logger = NullLogger.Instance; _recyclableMemoryStreamManager = new RecyclableMemoryStreamManager(); _retrieveResourceService = new RetrieveResourceService( diff --git a/src/Microsoft.Health.Dicom.Core.UnitTests/Features/Retrieve/RetrieveTransferSyntaxHandlerTests.cs b/src/Microsoft.Health.Dicom.Core.UnitTests/Features/Retrieve/RetrieveTransferSyntaxHandlerTests.cs index 0109638b8f..a6ba7ac7ad 100644 --- a/src/Microsoft.Health.Dicom.Core.UnitTests/Features/Retrieve/RetrieveTransferSyntaxHandlerTests.cs +++ b/src/Microsoft.Health.Dicom.Core.UnitTests/Features/Retrieve/RetrieveTransferSyntaxHandlerTests.cs @@ -4,6 +4,7 @@ // ------------------------------------------------------------------------------------------------- using Dicom; +using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Health.Dicom.Core.Exceptions; using Microsoft.Health.Dicom.Core.Features.Retrieve; using Microsoft.Health.Dicom.Core.Messages; @@ -20,7 +21,7 @@ public class RetrieveTransferSyntaxHandlerTests public RetrieveTransferSyntaxHandlerTests() { - _handler = new RetrieveTransferSyntaxHandler(); + _handler = new RetrieveTransferSyntaxHandler(NullLogger.Instance); } [Fact(Skip = "Will be enabled later as https://microsofthealth.visualstudio.com/Health/_workitems/edit/75782")] diff --git a/src/Microsoft.Health.Dicom.Core.UnitTests/Messages/Retrieve/AcceptHeaderTests.cs b/src/Microsoft.Health.Dicom.Core.UnitTests/Messages/Retrieve/AcceptHeaderTests.cs index b58dde1adf..c7a98c219c 100644 --- a/src/Microsoft.Health.Dicom.Core.UnitTests/Messages/Retrieve/AcceptHeaderTests.cs +++ b/src/Microsoft.Health.Dicom.Core.UnitTests/Messages/Retrieve/AcceptHeaderTests.cs @@ -28,5 +28,17 @@ public void GivenValidInput_WhenConstructAcceptHeader_ThenShouldSucceed() Assert.Equal(transferSytnax, header.TransferSyntax); Assert.Equal(quality, header.Quality); } + + [Fact] + public void GivenValidInput_WhenToString_ThenShouldReturnExpectedContent() + { + StringSegment mediaType = KnownContentTypes.ApplicationDicom; + PayloadTypes payloadType = PayloadTypes.MultipartRelated; + StringSegment transferSytnax = DicomTransferSyntax.ExplicitVRLittleEndian.UID.UID; + double quality = 0.5; + AcceptHeader header = new AcceptHeader(mediaType, payloadType, transferSytnax, quality); + + Assert.Equal($"MediaType:'{mediaType}', PayloadType:'{payloadType}', TransferSyntax:'{transferSytnax}', Quality:'{quality}'", header.ToString()); + } } } diff --git a/src/Microsoft.Health.Dicom.Core/Features/Retrieve/RetrieveTransferSyntaxHandler.cs b/src/Microsoft.Health.Dicom.Core/Features/Retrieve/RetrieveTransferSyntaxHandler.cs index 8b4ef6fd30..9efddceb15 100644 --- a/src/Microsoft.Health.Dicom.Core/Features/Retrieve/RetrieveTransferSyntaxHandler.cs +++ b/src/Microsoft.Health.Dicom.Core/Features/Retrieve/RetrieveTransferSyntaxHandler.cs @@ -8,6 +8,7 @@ using System.Linq; using Dicom; using EnsureThat; +using Microsoft.Extensions.Logging; using Microsoft.Health.Dicom.Core.Exceptions; using Microsoft.Health.Dicom.Core.Messages; using Microsoft.Health.Dicom.Core.Messages.Retrieve; @@ -28,17 +29,28 @@ public class RetrieveTransferSyntaxHandler : IRetrieveTransferSyntaxHandler private readonly IReadOnlyDictionary _acceptableDescriptors; - public RetrieveTransferSyntaxHandler() - : this(AcceptableDescriptors) + private readonly ILogger _logger; + + public RetrieveTransferSyntaxHandler(ILogger logger) + : this(AcceptableDescriptors, logger) { } - public RetrieveTransferSyntaxHandler(IReadOnlyDictionary acceptableDescriptors) => _acceptableDescriptors = acceptableDescriptors; + public RetrieveTransferSyntaxHandler(IReadOnlyDictionary acceptableDescriptors, ILogger logger) + { + EnsureArg.IsNotNull(logger, nameof(logger)); + EnsureArg.IsNotNull(acceptableDescriptors, nameof(acceptableDescriptors)); + + _acceptableDescriptors = acceptableDescriptors; + _logger = logger; + } public string GetTransferSyntax(ResourceType resourceType, IEnumerable acceptHeaders, out AcceptHeaderDescriptor acceptableHeaderDescriptor) { EnsureArg.IsNotNull(acceptHeaders, nameof(acceptHeaders)); + _logger.LogInformation($"Getting transfer syntax for retrieving '{resourceType}' with accept headers '{string.Join(";", acceptHeaders)}'."); + // TODO: disable multiple accept headers, will fully implement it later (https://microsofthealth.visualstudio.com/Health/_workitems/edit/75782) if (acceptHeaders.Count() > 1) { diff --git a/src/Microsoft.Health.Dicom.Core/Messages/Retrieve/AcceptHeader.cs b/src/Microsoft.Health.Dicom.Core/Messages/Retrieve/AcceptHeader.cs index 34360cc9a8..24fec05ad9 100644 --- a/src/Microsoft.Health.Dicom.Core/Messages/Retrieve/AcceptHeader.cs +++ b/src/Microsoft.Health.Dicom.Core/Messages/Retrieve/AcceptHeader.cs @@ -25,5 +25,10 @@ public AcceptHeader(StringSegment mediaType, PayloadTypes payloadType, StringSeg public StringSegment TransferSyntax { get; } public double? Quality { get; } + + public override string ToString() + { + return $"MediaType:'{MediaType}', PayloadType:'{PayloadType}', TransferSyntax:'{TransferSyntax}', Quality:'{Quality}'"; + } } } diff --git a/test/Microsoft.Health.Dicom.Tests.Integration/Features/RetrieveResourceServiceTests.cs b/test/Microsoft.Health.Dicom.Tests.Integration/Features/RetrieveResourceServiceTests.cs index fe95d2eda7..83ba60a6e3 100644 --- a/test/Microsoft.Health.Dicom.Tests.Integration/Features/RetrieveResourceServiceTests.cs +++ b/test/Microsoft.Health.Dicom.Tests.Integration/Features/RetrieveResourceServiceTests.cs @@ -51,7 +51,7 @@ public RetrieveResourceServiceTests(DataStoreTestsFixture blobStorageFixture, Sq _fileStore = blobStorageFixture.FileStore; _retrieveTranscoder = Substitute.For(); _frameHandler = Substitute.For(); - _retrieveTransferSyntaxHandler = new RetrieveTransferSyntaxHandler(); + _retrieveTransferSyntaxHandler = new RetrieveTransferSyntaxHandler(NullLogger.Instance); _recyclableMemoryStreamManager = blobStorageFixture.RecyclableMemoryStreamManager; _retrieveResourceService = new RetrieveResourceService( _instanceStore, _fileStore, _retrieveTranscoder, _frameHandler, _retrieveTransferSyntaxHandler, blobStorageFixture.RecyclableMemoryStreamManager, NullLogger.Instance);