From b60d64e65506f04a75fed3f885ca2945594e7ed9 Mon Sep 17 00:00:00 2001 From: nmallick1 Date: Wed, 25 Nov 2020 10:10:33 -0800 Subject: [PATCH] Add support for custom time grain aggregation while fetching time series in MDM data provider. (#609) --- .../DataProviders/MdmDataProvider.cs | 17 ++++++++++++ .../Interfaces/IMdmDataProvider.cs | 13 +++++++++ .../MdmLogDecorator.cs | 7 ++++- .../DataProviderTests/DataProviderTests.cs | 27 +++++++++++++++++++ 4 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/Diagnostics.DataProviders/DataProviders/MdmDataProvider.cs b/src/Diagnostics.DataProviders/DataProviders/MdmDataProvider.cs index 790754b4..b093d021 100644 --- a/src/Diagnostics.DataProviders/DataProviders/MdmDataProvider.cs +++ b/src/Diagnostics.DataProviders/DataProviders/MdmDataProvider.cs @@ -150,6 +150,23 @@ namespace Diagnostics.DataProviders return await GetMultipleTimeSeriesAsync(startTimeUtc, endTimeUtc, sampling, new List>>> { definition }); } + /// + /// Gets the time series with specified time granularity. + /// + /// The start time UTC. + /// The end time UTC. + /// The sampling type. + /// The metric namespace. + /// The metric name. + /// The resolution window used to reduce the resolution of the returned series. + /// The dimension. + /// The time series for the given definition. + public async Task> GetTimeSeriesAsync(DateTime startTimeUtc, DateTime endTimeUtc, Sampling sampling, string metricNamespace, string metricName, int seriesResolutionInMinutes, IDictionary dimension) + { + var definition = Tuple.Create>>(metricNamespace, metricName, dimension); + return await GetMultipleTimeSeriesAsync(startTimeUtc, endTimeUtc, sampling, seriesResolutionInMinutes, new List>>> { definition }); + } + /// /// Gets a list of the time series. /// diff --git a/src/Diagnostics.DataProviders/Interfaces/IMdmDataProvider.cs b/src/Diagnostics.DataProviders/Interfaces/IMdmDataProvider.cs index 03d01fb5..dda88db1 100644 --- a/src/Diagnostics.DataProviders/Interfaces/IMdmDataProvider.cs +++ b/src/Diagnostics.DataProviders/Interfaces/IMdmDataProvider.cs @@ -63,6 +63,19 @@ namespace Diagnostics.DataProviders.Interfaces /// The time series for the given definition. Task> GetTimeSeriesAsync(DateTime startTimeUtc, DateTime endTimeUtc, Sampling sampling, string metricNamespace, string metricName, IDictionary dimension); + /// + /// Gets the time series with specified time granularity. + /// + /// The start time UTC. + /// The end time UTC. + /// The sampling type. + /// The metric namespace. + /// The metric name. + /// The resolution window used to reduce the resolution of the returned series. + /// The dimension. + /// The time series for the given definition. + Task> GetTimeSeriesAsync(DateTime startTimeUtc, DateTime endTimeUtc, Sampling sampling, string metricNamespace, string metricName, int seriesResolutionInMinutes, IDictionary dimension); + /// /// Gets a list of the time series. /// diff --git a/src/Diagnostics.DataProviders/MdmLogDecorator.cs b/src/Diagnostics.DataProviders/MdmLogDecorator.cs index 81d96417..b8599e87 100644 --- a/src/Diagnostics.DataProviders/MdmLogDecorator.cs +++ b/src/Diagnostics.DataProviders/MdmLogDecorator.cs @@ -45,7 +45,12 @@ namespace Diagnostics.DataProviders return MakeDependencyCall(DataProvider.GetTimeSeriesAsync(startTimeUtc, endTimeUtc, sampling, metricNamespace, metricName, dimension)); } - public Task> GetMultipleTimeSeriesAsync(DateTime startTimeUtc, DateTime endTimeUtc, Sampling sampling, int seriesResolutionInMinutes, IEnumerable>>> definitions) + public Task> GetTimeSeriesAsync(DateTime startTimeUtc, DateTime endTimeUtc, Sampling sampling, string metricNamespace, string metricName, int seriesResolutionInMinutes, IDictionary dimension) + { + return MakeDependencyCall(DataProvider.GetTimeSeriesAsync(startTimeUtc, endTimeUtc, sampling, metricNamespace, metricName, seriesResolutionInMinutes, dimension)); + } + + public Task> GetMultipleTimeSeriesAsync(DateTime startTimeUtc, DateTime endTimeUtc, Sampling sampling, int seriesResolutionInMinutes, IEnumerable>>> definitions) { return MakeDependencyCall(DataProvider.GetMultipleTimeSeriesAsync(startTimeUtc, endTimeUtc, sampling, seriesResolutionInMinutes, definitions)); } diff --git a/tests/Diagnostics.Tests/DataProviderTests/DataProviderTests.cs b/tests/Diagnostics.Tests/DataProviderTests/DataProviderTests.cs index 102259cb..ced371d4 100644 --- a/tests/Diagnostics.Tests/DataProviderTests/DataProviderTests.cs +++ b/tests/Diagnostics.Tests/DataProviderTests/DataProviderTests.cs @@ -171,6 +171,33 @@ namespace Diagnostics.Tests.DataProviderTests } } + /// + /// Mdm data provider test for custom time grain aggregation + /// + [Fact] + public async void TestMdmGetTimeSeriesValuesCustomTimeGrainAsync() + { + var metadata = ScriptTestDataHelper.GetRandomMetadata(); + metadata.ScriptText = @" + public async static Task> Run(DataProviders dataProviders) { + var dimensions = new Dictionary { { ""StampName"", ""kudu1"" } }; + return await dataProviders.Mdm(MdmDataSource.Antares).GetTimeSeriesAsync(DateTime.UtcNow.AddMinutes(-10), DateTime.UtcNow, Sampling.Average | Sampling.Max | Sampling.Count, ""Microsoft/Web/WebApps"", ""CpuTime"", 5, dimensions); + }"; + + var configFactory = new MockDataProviderConfigurationFactory(); + var config = configFactory.LoadConfigurations(); + + var dataProviders = new DataProviders.DataProviders(new DataProviderContext(config, Guid.NewGuid().ToString())); + + using (EntityInvoker invoker = new EntityInvoker(metadata, ScriptHelper.GetFrameworkReferences(), ScriptHelper.GetFrameworkImports())) + { + await invoker.InitializeEntryPointAsync(); + var result = await invoker.Invoke(new object[] { dataProviders }) as IEnumerable; + + Assert.NotNull(result); + } + } + /// /// Kusto data provider test ///