From c1bade14664dc3629bf5995dded802fe78a75524 Mon Sep 17 00:00:00 2001 From: Tom Kerkhove Date: Wed, 3 Jun 2020 11:08:36 +0200 Subject: [PATCH 1/7] Provide support for configuring resource collections to scrape --- .../IServiceCollectionExtensions.cs | 51 ++++++++++-------- .../Model/Metrics/AzureResourceCollection.cs | 7 +++ .../Model/Metrics/MetricDefinition.cs | 5 ++ .../AzureResourceCollectionDeserializer.cs | 13 +++++ .../v1/Core/MetricDefinitionDeserializer.cs | 16 ++++-- .../v1/Mapping/V1MappingProfile.cs | 1 + .../AzureResourceCollectionDefinitionV1.cs | 10 ++++ .../v1/Model/MetricDefinitionV1.cs | 5 ++ ...zureResourceCollectionDeserializerTests.cs | 39 ++++++++++++++ .../Core/MetricDefinitionDeserializerTests.cs | 52 ++++++++++++++++--- .../Serialization/v1/V1DeserializerFactory.cs | 1 + .../Serialization/v1/V1SerializationTests.cs | 15 ++++++ 12 files changed, 183 insertions(+), 32 deletions(-) create mode 100644 src/Promitor.Core.Scraping/Configuration/Model/Metrics/AzureResourceCollection.cs create mode 100644 src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/AzureResourceCollectionDeserializer.cs create mode 100644 src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/AzureResourceCollectionDefinitionV1.cs create mode 100644 src/Promitor.Tests.Unit/Serialization/v1/Core/AzureResourceCollectionDeserializerTests.cs diff --git a/src/Promitor.Agents.Scraper/Extensions/IServiceCollectionExtensions.cs b/src/Promitor.Agents.Scraper/Extensions/IServiceCollectionExtensions.cs index 819d86d42..944976321 100644 --- a/src/Promitor.Agents.Scraper/Extensions/IServiceCollectionExtensions.cs +++ b/src/Promitor.Agents.Scraper/Extensions/IServiceCollectionExtensions.cs @@ -58,31 +58,39 @@ public static IServiceCollection ScheduleMetricScraping(this IServiceCollection foreach (var metric in metrics.Metrics) { - foreach (var resource in metric.Resources) + if (metric.ResourceCollections?.Any() == true) { - var resourceSubscriptionId = string.IsNullOrWhiteSpace(resource.SubscriptionId) ? metrics.AzureMetadata.SubscriptionId : resource.SubscriptionId; - var azureMonitorClient = azureMonitorClientFactory.CreateIfNotExists(metrics.AzureMetadata.Cloud, metrics.AzureMetadata.TenantId, resourceSubscriptionId, metricSinkWriter, runtimeMetricCollector, configuration, azureMonitorLoggingConfiguration, loggerFactory); - var scrapeDefinition = metric.CreateScrapeDefinition(resource, metrics.AzureMetadata); - var jobName = GenerateJobName(scrapeDefinition, resource); + Console.WriteLine("Resource collections are not scraped yet."); + } - services.AddScheduler(builder => + if (metric.Resources != null) + { + foreach (var resource in metric.Resources) { - builder.AddJob(jobServices => - { - return new MetricScrapingJob(jobName, scrapeDefinition, - metricSinkWriter, - jobServices.GetService(), - jobServices.GetService(), - azureMonitorClient, - jobServices.GetService>()); - }, schedulerOptions => + var resourceSubscriptionId = string.IsNullOrWhiteSpace(resource.SubscriptionId) ? metrics.AzureMetadata.SubscriptionId : resource.SubscriptionId; + var azureMonitorClient = azureMonitorClientFactory.CreateIfNotExists(metrics.AzureMetadata.Cloud, metrics.AzureMetadata.TenantId, resourceSubscriptionId, metricSinkWriter, runtimeMetricCollector, configuration, azureMonitorLoggingConfiguration, loggerFactory); + var scrapeDefinition = metric.CreateScrapeDefinition(resource, metrics.AzureMetadata); + var jobName = GenerateJobName(scrapeDefinition, resource); + + services.AddScheduler(builder => { - schedulerOptions.CronSchedule = scrapeDefinition.Scraping.Schedule; - schedulerOptions.RunImmediately = true; - }, - jobName: jobName); - builder.UnobservedTaskExceptionHandler = (sender, exceptionEventArgs) => UnobservedJobHandlerHandler(sender, exceptionEventArgs, services); - }); + builder.AddJob(jobServices => + { + return new MetricScrapingJob(jobName, scrapeDefinition, + metricSinkWriter, + jobServices.GetService(), + jobServices.GetService(), + azureMonitorClient, + jobServices.GetService>()); + }, schedulerOptions => + { + schedulerOptions.CronSchedule = scrapeDefinition.Scraping.Schedule; + schedulerOptions.RunImmediately = true; + }, + jobName: jobName); + builder.UnobservedTaskExceptionHandler = (sender, exceptionEventArgs) => UnobservedJobHandlerHandler(sender, exceptionEventArgs, services); + }); + } } } @@ -129,6 +137,7 @@ public static IServiceCollection DefineDependencies(this IServiceCollection serv services.AddSingleton, MetricDimensionDeserializer>(); services.AddSingleton, ScrapingDeserializer>(); services.AddSingleton, AzureMetricConfigurationDeserializer>(); + services.AddSingleton, AzureResourceCollectionDeserializer>(); services.AddSingleton(); services.AddSingleton, MetricAggregationDeserializer>(); services.AddSingleton, SecretDeserializer>(); diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/AzureResourceCollection.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/AzureResourceCollection.cs new file mode 100644 index 000000000..cb7aa8fda --- /dev/null +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/AzureResourceCollection.cs @@ -0,0 +1,7 @@ +namespace Promitor.Core.Scraping.Configuration.Model.Metrics +{ + public class AzureResourceCollection + { + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/MetricDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/MetricDefinition.cs index eb8ab9b2c..3a8f73544 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/MetricDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/MetricDefinition.cs @@ -41,6 +41,11 @@ public MetricDefinition(PrometheusMetricDefinition prometheusMetricDefinition, /// public ResourceType ResourceType { get; set; } + /// + /// Gets or sets the list of resource collections to discover resources with. + /// + public List ResourceCollections { get; set; } + /// /// Gets or sets the list of resources to scrape. /// diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/AzureResourceCollectionDeserializer.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/AzureResourceCollectionDeserializer.cs new file mode 100644 index 000000000..296989508 --- /dev/null +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/AzureResourceCollectionDeserializer.cs @@ -0,0 +1,13 @@ +using Microsoft.Extensions.Logging; +using Promitor.Core.Scraping.Configuration.Serialization.v1.Model; + +namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Core +{ + public class AzureResourceCollectionDeserializer : Deserializer + { + public AzureResourceCollectionDeserializer(ILogger logger) : base(logger) + { + MapRequired(metadata => metadata.Name); + } + } +} diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/MetricDefinitionDeserializer.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/MetricDefinitionDeserializer.cs index 7b316661d..5915e6c59 100644 --- a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/MetricDefinitionDeserializer.cs +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/MetricDefinitionDeserializer.cs @@ -8,21 +8,26 @@ namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Core public class MetricDefinitionDeserializer : Deserializer { private const string ResourcesTag = "resources"; + private const string ResourceCollectionsTag = "resourceCollections"; + private readonly IDeserializer _azureResourceCollectionDeserializer; private readonly IAzureResourceDeserializerFactory _azureResourceDeserializerFactory; public MetricDefinitionDeserializer(IDeserializer azureMetricConfigurationDeserializer, IDeserializer scrapingDeserializer, + IDeserializer azureResourceCollectionDeserializer, IAzureResourceDeserializerFactory azureResourceDeserializerFactory, ILogger logger) : base(logger) { + _azureResourceCollectionDeserializer = azureResourceCollectionDeserializer; _azureResourceDeserializerFactory = azureResourceDeserializerFactory; MapRequired(definition => definition.Name); MapRequired(definition => definition.Description); MapRequired(definition => definition.ResourceType); - MapOptional(definition => definition.Labels); MapRequired(definition => definition.AzureMetricConfiguration, azureMetricConfigurationDeserializer); + MapOptional(definition => definition.Labels); MapOptional(definition => definition.Scraping, scrapingDeserializer); + IgnoreField(ResourceCollectionsTag); IgnoreField(ResourcesTag); } @@ -49,6 +54,11 @@ private void DeserializeMetrics(YamlMappingNode node, MetricDefinitionV1 metricD return; } + if (node.Children.TryGetValue(ResourceCollectionsTag, out var resourceCollectionNode)) + { + metricDefinition.ResourceCollections = _azureResourceCollectionDeserializer.Deserialize((YamlSequenceNode)resourceCollectionNode, errorReporter); + } + if (node.Children.TryGetValue(ResourcesTag, out var metricsNode)) { var resourceDeserializer = _azureResourceDeserializerFactory.GetDeserializerFor(metricDefinition.ResourceType.Value); @@ -61,10 +71,6 @@ private void DeserializeMetrics(YamlMappingNode node, MetricDefinitionV1 metricD errorReporter.ReportError(resourceTypeNode, $"Could not find a deserializer for resource type '{metricDefinition.ResourceType}'."); } } - else - { - errorReporter.ReportError(node, "'resources' is a required field but was not found."); - } } } } diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Mapping/V1MappingProfile.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Mapping/V1MappingProfile.cs index d0ee52263..86a7b8964 100644 --- a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Mapping/V1MappingProfile.cs +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Mapping/V1MappingProfile.cs @@ -19,6 +19,7 @@ public V1MappingProfile() CreateMap(); CreateMap(); CreateMap(); + CreateMap(); CreateMap(); CreateMap(); diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/AzureResourceCollectionDefinitionV1.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/AzureResourceCollectionDefinitionV1.cs new file mode 100644 index 000000000..0c12c05b7 --- /dev/null +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/AzureResourceCollectionDefinitionV1.cs @@ -0,0 +1,10 @@ +namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Model +{ + /// + /// Represents a resource collection that represent a collection of Azure resource that are automatically discovered and will be scraped. + /// + public class AzureResourceCollectionDefinitionV1 + { + public string Name { get; set; } + } +} diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/MetricDefinitionV1.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/MetricDefinitionV1.cs index b8025377c..3fd04bdd8 100644 --- a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/MetricDefinitionV1.cs +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/MetricDefinitionV1.cs @@ -39,6 +39,11 @@ public class MetricDefinitionV1 /// public ScrapingV1 Scraping { get; set; } + /// + /// The resource collections to be scraped. + /// + public IReadOnlyCollection ResourceCollections { get; set; } + /// /// The resources to be scraped. /// diff --git a/src/Promitor.Tests.Unit/Serialization/v1/Core/AzureResourceCollectionDeserializerTests.cs b/src/Promitor.Tests.Unit/Serialization/v1/Core/AzureResourceCollectionDeserializerTests.cs new file mode 100644 index 000000000..69f892e62 --- /dev/null +++ b/src/Promitor.Tests.Unit/Serialization/v1/Core/AzureResourceCollectionDeserializerTests.cs @@ -0,0 +1,39 @@ +using System.ComponentModel; +using Microsoft.Extensions.Logging.Abstractions; +using Promitor.Core.Scraping.Configuration.Serialization.v1.Core; +using Xunit; + +namespace Promitor.Tests.Unit.Serialization.v1.Core +{ + [Category("Unit")] + public class AzureResourceCollectionDeserializerTests + { + private readonly AzureResourceCollectionDeserializer _deserializer; + + public AzureResourceCollectionDeserializerTests() + { + _deserializer = new AzureResourceCollectionDeserializer(NullLogger.Instance); + } + + [Fact] + public void Deserialize_CollectionNameSupplied_SetsName() + { + // Arrange + const string yamlText = + @"name: sample-1"; + + // Act & Assert + YamlAssert.PropertySet(_deserializer, yamlText, "sample-1", d => d.Name); + } + + [Fact] + public void Deserialize_CollectionNameNotSupplied_ReportsError() + { + // Arrange + var node = YamlUtils.CreateYamlNode("field: promitor"); + + // Act & Assert + YamlAssert.ReportsErrorForProperty(_deserializer, node, "name"); + } + } +} diff --git a/src/Promitor.Tests.Unit/Serialization/v1/Core/MetricDefinitionDeserializerTests.cs b/src/Promitor.Tests.Unit/Serialization/v1/Core/MetricDefinitionDeserializerTests.cs index 73bca7bc6..fa189255e 100644 --- a/src/Promitor.Tests.Unit/Serialization/v1/Core/MetricDefinitionDeserializerTests.cs +++ b/src/Promitor.Tests.Unit/Serialization/v1/Core/MetricDefinitionDeserializerTests.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.ComponentModel; +using System.Linq; using Microsoft.Extensions.Logging.Abstractions; using Moq; using Promitor.Core.Scraping.Configuration.Model; @@ -17,6 +18,7 @@ public class MetricDefinitionDeserializerTests private readonly Mock> _azureMetricConfigurationDeserializer; private readonly Mock> _scrapingDeserializer; private readonly Mock _resourceDeserializerFactory; + private readonly Mock> _resourceCollectionsDeserializer; private readonly Mock _errorReporter = new Mock(); private readonly MetricDefinitionDeserializer _deserializer; @@ -25,11 +27,13 @@ public MetricDefinitionDeserializerTests() { _azureMetricConfigurationDeserializer = new Mock>(); _scrapingDeserializer = new Mock>(); + _resourceCollectionsDeserializer = new Mock>(); _resourceDeserializerFactory = new Mock(); _deserializer = new MetricDefinitionDeserializer( _azureMetricConfigurationDeserializer.Object, _scrapingDeserializer.Object, + _resourceCollectionsDeserializer.Object, _resourceDeserializerFactory.Object, NullLogger.Instance); } @@ -326,16 +330,52 @@ public void Deserialize_ResourcesWithUnspecifiedResourceType_Null() } [Fact] - public void Deserialize_ResourcesNotSupplied_ReportsError() + public void Deserialize_ResourcesNotSupplied_Null() { // Arrange var node = YamlUtils.CreateYamlNode("resourceType: Generic"); - // Act / Assert - YamlAssert.ReportsErrorForProperty( - _deserializer, - node, - "resources"); + // Act + var definition = _deserializer.Deserialize(node, _errorReporter.Object); + + // Assert + Assert.Null(definition.Resources); + } + + [Fact] + public void Deserialize_ResourceCollectionsSupplied_DoesNotReportWarning() + { + // Because we're handling deserializing the resources manually, we + // need to explicitly ignore the field to stop a warning being reported + // about an unknown field + + // Arrange + const string yamlText = + @"resourceType: Generic +resourceCollections: +- name: sample-1 +- name: sample-2"; + var node = YamlUtils.CreateYamlNode(yamlText); + + // Act + _deserializer.Deserialize(node, _errorReporter.Object); + + // Assert + _errorReporter.Verify( + r => r.ReportWarning(It.IsAny(), It.Is(s => s.Contains("resourceCollections"))), Times.Never); + } + + [Fact] + public void Deserialize_ResourceCollectionsNotSupplied_Null() + { + // Arrange + var node = YamlUtils.CreateYamlNode("resourceType: Generic"); + + // Act + var definition = _deserializer.Deserialize(node, _errorReporter.Object); + + // Assert + Assert.Null(definition.ResourceCollections); } [Fact] diff --git a/src/Promitor.Tests.Unit/Serialization/v1/V1DeserializerFactory.cs b/src/Promitor.Tests.Unit/Serialization/v1/V1DeserializerFactory.cs index 7d2bbce0d..4e064d4bf 100644 --- a/src/Promitor.Tests.Unit/Serialization/v1/V1DeserializerFactory.cs +++ b/src/Promitor.Tests.Unit/Serialization/v1/V1DeserializerFactory.cs @@ -23,6 +23,7 @@ public static V1Deserializer CreateDeserializer() new MetricAggregationDeserializer(NullLogger.Instance), NullLogger.Instance), new ScrapingDeserializer(NullLogger.Instance), + new AzureResourceCollectionDeserializer(NullLogger.Instance), new AzureResourceDeserializerFactory(new SecretDeserializer(NullLogger.Instance), new LoggerFactory()), NullLogger.Instance), NullLogger.Instance); diff --git a/src/Promitor.Tests.Unit/Serialization/v1/V1SerializationTests.cs b/src/Promitor.Tests.Unit/Serialization/v1/V1SerializationTests.cs index 49a230554..3a06ddeef 100644 --- a/src/Promitor.Tests.Unit/Serialization/v1/V1SerializationTests.cs +++ b/src/Promitor.Tests.Unit/Serialization/v1/V1SerializationTests.cs @@ -115,6 +115,13 @@ public V1SerializationTests() QueueName = "orders", ResourceGroupName = "promitor-demo-group" } + }, + ResourceCollections = new List + { + new AzureResourceCollectionDefinitionV1 + { + Name="example-resource-collection" + } } } } @@ -171,6 +178,10 @@ public void Deserialize_SerializedModel_CanDeserialize() Assert.Equal("promitor-messaging", serviceBusQueueResource.Namespace); Assert.Equal("orders", serviceBusQueueResource.QueueName); Assert.Equal("promitor-demo-group", serviceBusQueueResource.ResourceGroupName); + Assert.NotNull(deserializedModel.Metrics.ElementAt(1).ResourceCollections); + Assert.Single(deserializedModel.Metrics.ElementAt(1).ResourceCollections); + var resourceCollection =deserializedModel.Metrics.ElementAt(1).ResourceCollections.ElementAt(0); + Assert.Equal("example-resource-collection", resourceCollection.Name); } [Fact] @@ -215,6 +226,10 @@ public void Deserialize_SerializedYaml_CanDeserializeToRuntimeModel() Assert.Equal("orders", definition.QueueName); Assert.Equal("promitor-demo-group", definition.ResourceGroupName); }); + Assert.NotNull(secondMetric.ResourceCollections); + Assert.Single(secondMetric.ResourceCollections); + var resourceCollection = secondMetric.ResourceCollections.First(); + Assert.Equal("example-resource-collection", resourceCollection.Name); } } } From cb106041d6ae4fa4b1681c39c61f7ec84865f644 Mon Sep 17 00:00:00 2001 From: Tom Kerkhove Date: Wed, 3 Jun 2020 11:18:36 +0200 Subject: [PATCH 2/7] Document new validation Signed-off-by: Tom Kerkhove --- changelog/content/experimental/unreleased.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 changelog/content/experimental/unreleased.md diff --git a/changelog/content/experimental/unreleased.md b/changelog/content/experimental/unreleased.md new file mode 100644 index 000000000..a1b6c3047 --- /dev/null +++ b/changelog/content/experimental/unreleased.md @@ -0,0 +1,8 @@ +--- +title: "(2018-09-15)" +date: 2018-09-02T20:46:47+02:00 +weight: 1 +version: +--- + +- {{% tag added %}} New validation rule to ensure at least one resource or resource collection is configured to scrape \ No newline at end of file From a76035b6e89c7b0b9b25275858a1455bda8831c0 Mon Sep 17 00:00:00 2001 From: Tom Kerkhove Date: Wed, 3 Jun 2020 11:59:01 +0200 Subject: [PATCH 3/7] Provide validation for missing resources & resource collections --- .../MetricDefinitions/MetricsValidator.cs | 15 +- .../Metrics/v1/MetricsDeclarationBuilder.cs | 520 +++++++----------- ...tMetricsDeclarationValidationStepsTests.cs | 17 + ...nMetricsDeclarationValidationStepsTests.cs | 17 + ...geMetricsDeclarationValidationStepTests.cs | 17 + ...ceMetricsDeclarationValidationStepTests.cs | 17 + ...ryMetricsDeclarationValidationStepTests.cs | 17 + ...DbMetricsDeclarationValidationStepTests.cs | 17 + ...eMetricsDeclarationValidationStepsTests.cs | 17 + ...geMetricsDeclarationValidationStepTests.cs | 19 +- ...pMetricsDeclarationValidationStepsTests.cs | 17 + ...icMetricsDeclarationValidationStepTests.cs | 17 + ...bMetricsDeclarationValidationStepsTests.cs | 17 + ...tMetricsDeclarationValidationStepsTests.cs | 17 + ...eMetricsDeclarationValidationStepsTests.cs | 17 + ...qlMetricsDeclarationValidationStepTests.cs | 34 ++ ...heMetricsDeclarationValidationStepTests.cs | 34 ++ ...ueMetricsDeclarationValidationStepTests.cs | 19 +- ...seMetricsDeclarationValidationStepTests.cs | 17 + ...ceMetricsDeclarationValidationStepTests.cs | 34 ++ ...erMetricsDeclarationValidationStepTests.cs | 17 + ...ntMetricsDeclarationValidationStepTests.cs | 34 ++ ...ueMetricsDeclarationValidationStepTests.cs | 34 ++ ...eMetricsDeclarationValidationStepsTests.cs | 34 ++ ...tMetricsDeclarationValidationStepsTests.cs | 34 ++ ...pMetricsDeclarationValidationStepsTests.cs | 34 ++ 26 files changed, 768 insertions(+), 315 deletions(-) diff --git a/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/MetricsValidator.cs b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/MetricsValidator.cs index e6d6f1c81..f830a1ea6 100644 --- a/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/MetricsValidator.cs +++ b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/MetricsValidator.cs @@ -49,11 +49,18 @@ private IEnumerable Validate(MetricDefinition metric) errorMessages.Add("No metric name is configured"); } - var metricDefinitionValidationErrors = MetricValidatorFactory - .GetValidatorFor(metric.ResourceType) - .Validate(metric); + if (metric.Resources?.Any() == false && metric.ResourceCollections?.Any() == false) + { + errorMessages.Add("No resource or resource collection is configured"); + } + else + { + var metricDefinitionValidationErrors = MetricValidatorFactory + .GetValidatorFor(metric.ResourceType) + .Validate(metric); - errorMessages.AddRange(metricDefinitionValidationErrors); + errorMessages.AddRange(metricDefinitionValidationErrors); + } var metricAggregationValidator = new AzureMetricConfigurationValidator(_metricDefaults); var metricsConfigurationErrorMessages = metricAggregationValidator.Validate(metric.AzureMetricConfiguration); diff --git a/src/Promitor.Tests.Unit/Builders/Metrics/v1/MetricsDeclarationBuilder.cs b/src/Promitor.Tests.Unit/Builders/Metrics/v1/MetricsDeclarationBuilder.cs index 5323e52ad..6b80fd7b9 100644 --- a/src/Promitor.Tests.Unit/Builders/Metrics/v1/MetricsDeclarationBuilder.cs +++ b/src/Promitor.Tests.Unit/Builders/Metrics/v1/MetricsDeclarationBuilder.cs @@ -69,169 +69,139 @@ public string Build(IMapper mapper) return configurationSerializer.Serialize(metricsDeclaration); } - public MetricsDeclarationBuilder WithServiceBusMetric(string metricName = "promitor-service-bus", string metricDescription = "Description for a metric", string metricDimension = "", string queueName = "promitor-queue", string serviceBusNamespace = "promitor-namespace", string azureMetricName = "Total", bool omitResource = false) + public MetricsDeclarationBuilder WithServiceBusMetric(string metricName = "promitor-service-bus", + string metricDescription = "Description for a metric", + string metricDimension = "", + string queueName = "promitor-queue", + string serviceBusNamespace = "promitor-namespace", + string azureMetricName = "Total", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName, metricDimension); var resource = new ServiceBusQueueResourceV1 { QueueName = queueName, Namespace = serviceBusNamespace }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - ResourceType = ResourceType.ServiceBusQueue - }; - - if (omitResource == false) - { - metric.Resources = new List { resource }; - } - - _metrics.Add(metric); - + CreateAndAddMetricDefinition(ResourceType.ServiceBusQueue, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource, metricDimension); + return this; } - public MetricsDeclarationBuilder WithContainerInstanceMetric(string metricName = "promitor-container-instance", string metricDescription = "Description for a metric", string containerGroup = "promitor-group", string azureMetricName = "Total") + public MetricsDeclarationBuilder WithContainerInstanceMetric(string metricName = "promitor-container-instance", + string metricDescription = "Description for a metric", + string containerGroup = "promitor-group", + string azureMetricName = "Total", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new ContainerInstanceResourceV1 { ContainerGroup = containerGroup }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.ContainerInstance - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.ContainerInstance, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithContainerRegistryMetric(string metricName = "promitor-container-registry", string metricDescription = "Description for a metric", string registryName = "promitor-container-registry", string azureMetricName = "Total") + public MetricsDeclarationBuilder WithContainerRegistryMetric(string metricName = "promitor-container-registry", + string metricDescription = "Description for a metric", + string registryName = "promitor-container-registry", + string azureMetricName = "Total", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new ContainerRegistryResourceV1 { RegistryName = registryName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.ContainerRegistry - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.ContainerRegistry, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithCosmosDbMetric(string metricName = "promitor-cosmosdb", string metricDescription = "Description for a metric", string dbName = "promitor-cosmosdb", string azureMetricName = "TotalRequests") + public MetricsDeclarationBuilder WithCosmosDbMetric(string metricName = "promitor-cosmosdb", + string metricDescription = "Description for a metric", + string dbName = "promitor-cosmosdb", + string azureMetricName = "TotalRequests", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new CosmosDbResourceV1 { DbName = dbName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.CosmosDb - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.CosmosDb, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithAppPlanMetric(string metricName = "promitor-app-plan", string metricDescription = "Description for a metric", string appPlanName = "promitor-app-plan", string azureMetricName = "TotalRequests") + public MetricsDeclarationBuilder WithAppPlanMetric(string metricName = "promitor-app-plan", + string metricDescription = "Description for a metric", + string appPlanName = "promitor-app-plan", + string azureMetricName = "TotalRequests", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new AppPlanResourceV1 { AppPlanName = appPlanName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.AppPlan - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.AppPlan, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithApiManagementMetric(string metricName = "promitor-api-management", string metricDescription = "Description for a metric", string instanceName = "promitor-app-plan", string locationName = "West Europe", string azureMetricName = "TotalRequests") + public MetricsDeclarationBuilder WithApiManagementMetric(string metricName = "promitor-api-management", + string metricDescription = "Description for a metric", + string instanceName = "promitor-app-plan", + string locationName = "West Europe", + string azureMetricName = "TotalRequests", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new ApiManagementResourceV1 { InstanceName = instanceName, LocationName = locationName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.ApiManagement - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.ApiManagement, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithFunctionAppMetric(string metricName = "promitor-fuction-app", string metricDescription = "Description for a metric", string functionAppName = "promitor-fuction-app", string azureMetricName = "TotalRequests") + public MetricsDeclarationBuilder WithFunctionAppMetric(string metricName = "promitor-fuction-app", + string metricDescription = "Description for a metric", + string functionAppName = "promitor-fuction-app", + string azureMetricName = "TotalRequests", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new FunctionAppResourceV1 { FunctionAppName = functionAppName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.FunctionApp - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.FunctionApp, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithStorageQueueMetric(string metricName = "promitor", string metricDescription = "Description for a metric", string queueName = "promitor-queue", string accountName = "promitor-account", string sasToken = "?sig=promitor", string azureMetricName = AzureStorageConstants.Queues.Metrics.MessageCount) + public MetricsDeclarationBuilder WithStorageQueueMetric(string metricName = "promitor", + string metricDescription = "Description for a metric", + string queueName = "promitor-queue", + string accountName = "promitor-account", + string sasToken = "?sig=promitor", + string azureMetricName = AzureStorageConstants.Queues.Metrics.MessageCount, + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var secret = new SecretV1 { RawValue = sasToken @@ -244,260 +214,181 @@ public string Build(IMapper mapper) SasToken = secret }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.StorageQueue - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.StorageQueue, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithStorageAccountMetric(string metricName = "promitor", string metricDescription = "Description for a metric", string accountName = "promitor-account", string azureMetricName = "Total") + public MetricsDeclarationBuilder WithStorageAccountMetric(string metricName = "promitor", + string metricDescription = "Description for a metric", + string accountName = "promitor-account", + string azureMetricName = "Total", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new StorageAccountResourceV1 { AccountName = accountName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.StorageAccount - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.StorageAccount, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithFileStorageMetric(string metricName = "promitor", string metricDescription = "Description for a metric", string accountName = "promitor-account", string azureMetricName = "Total") + public MetricsDeclarationBuilder WithFileStorageMetric(string metricName = "promitor", + string metricDescription = "Description for a metric", + string accountName = "promitor-account", + string azureMetricName = "Total", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new FileStorageResourceV1 { AccountName = accountName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.FileStorage - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.FileStorage, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithBlobStorageMetric(string metricName = "promitor", string metricDescription = "Description for a metric", string accountName = "promitor-account", string azureMetricName = "Total") + public MetricsDeclarationBuilder WithBlobStorageMetric(string metricName = "promitor", + string metricDescription = "Description for a metric", + string accountName = "promitor-account", + string azureMetricName = "Total", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new BlobStorageResourceV1 { AccountName = accountName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.BlobStorage - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.BlobStorage, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithVirtualMachineMetric(string metricName = "promitor-virtual-machine", string metricDescription = "Description for a metric", string virtualMachineName = "promitor-virtual-machine-name", string azureMetricName = "Total") + public MetricsDeclarationBuilder WithVirtualMachineMetric(string metricName = "promitor-virtual-machine", + string metricDescription = "Description for a metric", + string virtualMachineName = "promitor-virtual-machine-name", + string azureMetricName = "Total", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new VirtualMachineResourceV1 { VirtualMachineName = virtualMachineName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.VirtualMachine - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.VirtualMachine, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithWebAppMetric(string metricName = "promitor-web-app", string metricDescription = "Description for a metric", string webAppName = "promitor-web-app-name", string slotName = "production", string azureMetricName = "Total") + public MetricsDeclarationBuilder WithWebAppMetric(string metricName = "promitor-web-app", + string metricDescription = "Description for a metric", + string webAppName = "promitor-web-app-name", + string slotName = "production", + string azureMetricName = "Total", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new WebAppResourceV1 { WebAppName = webAppName, SlotName = slotName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.WebApp - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.WebApp, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithVirtualMachineScaleSetMetric(string metricName = "promitor-virtual-machine-scale-set", string metricDescription = "Description for a metric", string scaleSetName = "promitor-scale-set-name", string azureMetricName = "Total") + public MetricsDeclarationBuilder WithVirtualMachineScaleSetMetric(string metricName = "promitor-virtual-machine-scale-set", + string metricDescription = "Description for a metric", + string scaleSetName = "promitor-scale-set-name", + string azureMetricName = "Total", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new VirtualMachineScaleSetResourceV1() { ScaleSetName = scaleSetName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.VirtualMachineScaleSet - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.VirtualMachineScaleSet, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithNetworkInterfaceMetric(string metricName = "promitor-network-interface", string metricDescription = "Description for a metric", string networkInterfaceName = "promitor-network-interface-name", string azureMetricName = "Total") + public MetricsDeclarationBuilder WithNetworkInterfaceMetric(string metricName = "promitor-network-interface", + string metricDescription = "Description for a metric", + string networkInterfaceName = "promitor-network-interface-name", + string azureMetricName = "Total", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new NetworkInterfaceResourceV1 { NetworkInterfaceName = networkInterfaceName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.NetworkInterface - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.NetworkInterface, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithGenericMetric(string metricName = "foo", string metricDescription = "Description for a metric", string resourceUri = "Microsoft.ServiceBus/namespaces/promitor-messaging", string filter = "EntityName eq \'orders\'", string azureMetricName = "Total") + public MetricsDeclarationBuilder WithGenericMetric(string metricName = "foo", + string metricDescription = "Description for a metric", + string resourceUri = "Microsoft.ServiceBus/namespaces/promitor-messaging", + string filter = "EntityName eq \'orders\'", + string azureMetricName = "Total", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new GenericResourceV1 { ResourceUri = resourceUri, Filter = filter }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.Generic - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.Generic, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - private AzureMetricConfigurationV1 CreateAzureMetricConfiguration(string azureMetricName, string metricDimension = "") - { - var metricConfig = new AzureMetricConfigurationV1 - { - MetricName = azureMetricName, - Aggregation = new MetricAggregationV1 - { - Type = AggregationType.Average - } - }; - - if (string.IsNullOrWhiteSpace(metricDimension) == false) - { - metricConfig.Dimension = new MetricDimensionV1 - { - Name = metricDimension - }; - } - - return metricConfig; - } - - public MetricsDeclarationBuilder WithRedisCacheMetric(string metricName = "promitor-redis", string metricDescription = "Description for a metric", string cacheName = "promitor-redis", string azureMetricName = "CacheHits") + public MetricsDeclarationBuilder WithRedisCacheMetric(string metricName = "promitor-redis", + string metricDescription = "Description for a metric", + string cacheName = "promitor-redis", + string azureMetricName = "CacheHits", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new RedisCacheResourceV1 { CacheName = cacheName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.RedisCache - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.RedisCache, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithPostgreSqlMetric(string metricName = "promitor-postgresql", string metricDescription = "Description for a metric", string serverName = "promitor-postgresql", string azureMetricName = "cpu_percent") + public MetricsDeclarationBuilder WithPostgreSqlMetric(string metricName = "promitor-postgresql", + string metricDescription = "Description for a metric", + string serverName = "promitor-postgresql", + string azureMetricName = "cpu_percent", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new PostgreSqlResourceV1 { ServerName = serverName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.PostgreSql - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.PostgreSql, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } @@ -507,25 +398,17 @@ public MetricsDeclarationBuilder WithSqlDatabaseMetric( string azureMetricName = "cpu_percent", string serverName = "promitor-sql-server", string databaseName = "promitor-db", - string metricDescription = "Metric description") + string metricDescription = "Metric description", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new SqlDatabaseResourceV1 { ServerName = serverName, DatabaseName = databaseName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.SqlDatabase - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.SqlDatabase, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } @@ -534,24 +417,16 @@ public MetricsDeclarationBuilder WithSqlServerMetric( string metricName = "promitor-sql-server", string azureMetricName = "cpu_percent", string serverName = "promitor-sql-server", - string metricDescription = "Metric description") + string metricDescription = "Metric description", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new SqlServerResourceV1 { ServerName = serverName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.SqlServer - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.SqlServer, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } @@ -560,92 +435,119 @@ public MetricsDeclarationBuilder WithSqlManagedInstanceMetric( string metricName = "promitor-sql-managed-instance", string azureMetricName = "cpu_percent", string instanceName = "promitor-sql-instance", - string metricDescription = "Metric description") + string metricDescription = "Metric description", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new SqlManagedInstanceResourceV1 { InstanceName = instanceName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.SqlManagedInstance - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.SqlManagedInstance, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithIoTHubMetric(string metricName = "promitor-iot-hub", string metricDescription = "Description for a metric", string iotHubName = "promitor-iot-hub", string azureMetricName = "devices.totalDevices") + public MetricsDeclarationBuilder WithIoTHubMetric(string metricName = "promitor-iot-hub", + string metricDescription = "Description for a metric", + string iotHubName = "promitor-iot-hub", + string azureMetricName = "devices.totalDevices", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new IoTHubResourceV1 { IoTHubName = iotHubName }; - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.IoTHub - }; - - _metrics.Add(metric); + CreateAndAddMetricDefinition(ResourceType.IoTHub, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithDeviceProvisioningServiceMetric(string metricName = "promitor-dps", string metricDescription = "Description for a metric", string deviceProvisioningServiceName = "promitor-dps", string azureMetricName = "AttestationAttempts") + public MetricsDeclarationBuilder WithDeviceProvisioningServiceMetric(string metricName = "promitor-dps", + string metricDescription = "Description for a metric", + string deviceProvisioningServiceName = "promitor-dps", + string azureMetricName = "AttestationAttempts", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new DeviceProvisioningServiceResourceV1 { DeviceProvisioningServiceName = deviceProvisioningServiceName }; - - var metric = new MetricDefinitionV1 - { - Name = metricName, - Description = metricDescription, - AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.DeviceProvisioningService - }; - - _metrics.Add(metric); + + CreateAndAddMetricDefinition(ResourceType.DeviceProvisioningService, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); return this; } - public MetricsDeclarationBuilder WithKeyVaultMetric(string metricName = "promitor-kv", string metricDescription = "Description for a metric", string vaultName = "promitor-kv", string azureMetricName = "ServiceApiLatency") + public MetricsDeclarationBuilder WithKeyVaultMetric(string metricName = "promitor-kv", + string metricDescription = "Description for a metric", + string vaultName = "promitor-kv", + string azureMetricName = "ServiceApiLatency", + string resourceCollectionName = "", + bool omitResource = false) { - var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var resource = new KeyVaultResourceV1 { VaultName = vaultName }; + CreateAndAddMetricDefinition(ResourceType.KeyVault, metricName, metricDescription, resourceCollectionName, omitResource, azureMetricName, resource); + + return this; + } + + private void CreateAndAddMetricDefinition(ResourceType resourceType, string metricName, string metricDescription, string resourceCollectionName, bool omitResource, string azureMetricName, AzureResourceDefinitionV1 resource, string metricDimension = null) + { + var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName, metricDimension); var metric = new MetricDefinitionV1 { Name = metricName, Description = metricDescription, AzureMetricConfiguration = azureMetricConfiguration, - Resources = new List { resource }, - ResourceType = ResourceType.KeyVault + ResourceType = resourceType }; + if (omitResource == false) + { + metric.Resources = new List { resource }; + } + + if (string.IsNullOrWhiteSpace(resourceCollectionName) == false) + { + var resourceCollection = new AzureResourceCollectionDefinitionV1 { Name = resourceCollectionName }; + metric.ResourceCollections = new List + { + resourceCollection + }; + } + _metrics.Add(metric); + } - return this; + private AzureMetricConfigurationV1 CreateAzureMetricConfiguration(string azureMetricName, string metricDimension = "") + { + var metricConfig = new AzureMetricConfigurationV1 + { + MetricName = azureMetricName, + Aggregation = new MetricAggregationV1 + { + Type = AggregationType.Average + } + }; + + if (string.IsNullOrWhiteSpace(metricDimension) == false) + { + metricConfig.Dimension = new MetricDimensionV1 + { + Name = metricDimension + }; + } + + return metricConfig; } } } \ No newline at end of file diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ApiManagementMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ApiManagementMetricsDeclarationValidationStepsTests.cs index 183336d07..4dcbe1260 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ApiManagementMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ApiManagementMetricsDeclarationValidationStepsTests.cs @@ -93,6 +93,23 @@ public void ApiManagementMetricsDeclaration_DeclarationWithoutInstanceName_Fails Assert.False(validationResult.IsSuccessful, "Validation is successful"); } + [Fact] + public void ApiManagementMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithApiManagementMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation was successful"); + } + [Fact] public void ApiManagementMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/AppPlanMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/AppPlanMetricsDeclarationValidationStepsTests.cs index 4e1dff599..d2e8b37ae 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/AppPlanMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/AppPlanMetricsDeclarationValidationStepsTests.cs @@ -77,6 +77,23 @@ public void AppPlanMetricsDeclaration_DeclarationWithoutAppPlanName_Fails() Assert.False(validationResult.IsSuccessful, "Validation is successful"); } + [Fact] + public void AppPlanMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithAppPlanMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation was successful"); + } + [Fact] public void AppPlanMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/BlobStorageMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/BlobStorageMetricsDeclarationValidationStepTests.cs index fffdf98a9..a268caa6b 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/BlobStorageMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/BlobStorageMetricsDeclarationValidationStepTests.cs @@ -129,5 +129,22 @@ public void BlobStorageMetricsDeclaration_ValidDeclarationWithTimeSpentInQueue_S // Assert Assert.True(validationResult.IsSuccessful, userMessage: "Validation was not successful"); } + + [Fact] + public void BlobStorageMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithBlobStorageMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, userMessage: "Validation was successful"); + } } } \ No newline at end of file diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ContainerInstanceMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ContainerInstanceMetricsDeclarationValidationStepTests.cs index 118529f15..4781500c1 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ContainerInstanceMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ContainerInstanceMetricsDeclarationValidationStepTests.cs @@ -77,6 +77,23 @@ public void ContainerInstanceMetricsDeclaration_DeclarationWithoutContainerGroup Assert.False(validationResult.IsSuccessful, "Validation is successful"); } + [Fact] + public void ContainerInstanceMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithContainerInstanceMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation was successful"); + } + [Fact] public void ContainerInstanceMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ContainerRegistryMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ContainerRegistryMetricsDeclarationValidationStepTests.cs index 137616534..429982484 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ContainerRegistryMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ContainerRegistryMetricsDeclarationValidationStepTests.cs @@ -79,6 +79,23 @@ public void ContainerRegistryMetricsDeclaration_DeclarationWithoutRegistryName_F Assert.False(validationResult.IsSuccessful, "Validation is successful"); } + [Fact] + public void ContainerRegistryMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithContainerRegistryMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation was successful"); + } + [Fact] public void ContainerRegistryMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/CosmosDbMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/CosmosDbMetricsDeclarationValidationStepTests.cs index f624ad151..63a15cfa5 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/CosmosDbMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/CosmosDbMetricsDeclarationValidationStepTests.cs @@ -77,6 +77,23 @@ public void CosmosDbMetricsDeclaration_DeclarationWithoutDbName_Fails() Assert.False(validationResult.IsSuccessful, "Validation is successful"); } + [Fact] + public void CosmosDbMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithCosmosDbMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation was not successful"); + } + [Fact] public void CosmosDbMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/DeviceProvisioningServiceMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/DeviceProvisioningServiceMetricsDeclarationValidationStepsTests.cs index 57eff0d94..e322e4490 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/DeviceProvisioningServiceMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/DeviceProvisioningServiceMetricsDeclarationValidationStepsTests.cs @@ -77,6 +77,23 @@ public void DeviceProvisioningServiceMetricsDeclaration_DeclarationWithoutDevice Assert.False(validationResult.IsSuccessful, "Validation is successful"); } + [Fact] + public void DeviceProvisioningServiceMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithDeviceProvisioningServiceMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation was successful"); + } + [Fact] public void DeviceProvisioningServiceMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/FileStorageMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/FileStorageMetricsDeclarationValidationStepTests.cs index 3d1c3bd7e..7b2ee5c35 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/FileStorageMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/FileStorageMetricsDeclarationValidationStepTests.cs @@ -114,7 +114,7 @@ public void FileStorageMetricsDeclaration_ValidDeclarationWithMessageCount_Succe } [Fact] - public void FileStorageMetricsDeclaration_ValidDeclarationWithTimeSpentInQueue_Succeeds() + public void FileStorageMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() { // Arrange var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() @@ -129,5 +129,22 @@ public void FileStorageMetricsDeclaration_ValidDeclarationWithTimeSpentInQueue_S // Assert Assert.True(validationResult.IsSuccessful, userMessage: "Validation was not successful"); } + + [Fact] + public void FileStorageMetricsDeclaration_ValidDeclarationWithTimeSpentInQueue_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithFileStorageMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, userMessage: "Validation was successful"); + } } } \ No newline at end of file diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/FunctionAppMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/FunctionAppMetricsDeclarationValidationStepsTests.cs index 93b431081..52c1b2ea0 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/FunctionAppMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/FunctionAppMetricsDeclarationValidationStepsTests.cs @@ -77,6 +77,23 @@ public void FunctionAppMetricsDeclaration_DeclarationWithoutFunctionAppName_Fail Assert.False(validationResult.IsSuccessful, "Validation is successful"); } + [Fact] + public void FunctionAppMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithFunctionAppMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation was successful"); + } + [Fact] public void FunctionAppMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/GenericMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/GenericMetricsDeclarationValidationStepTests.cs index ed848283f..a99d23caf 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/GenericMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/GenericMetricsDeclarationValidationStepTests.cs @@ -111,6 +111,23 @@ public void GenericMetricsDeclaration_DeclarationWithoutResourceUri_Fails() Assert.False(validationResult.IsSuccessful, "Validation is successful"); } + [Fact] + public void GenericMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithServiceBusMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation was successful"); + } + [Fact] public void GenericMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTHubMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTHubMetricsDeclarationValidationStepsTests.cs index 17b938b34..e948aa7ec 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTHubMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTHubMetricsDeclarationValidationStepsTests.cs @@ -77,6 +77,23 @@ public void IoTHubMetricsDeclaration_DeclarationWithoutIoTHubName_Fails() Assert.False(validationResult.IsSuccessful, "Validation is successful"); } + [Fact] + public void IoTHubMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithIoTHubMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation was successful"); + } + [Fact] public void IoTHubMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/KeyVaultMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/KeyVaultMetricsDeclarationValidationStepsTests.cs index d3ea57eee..4deee8340 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/KeyVaultMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/KeyVaultMetricsDeclarationValidationStepsTests.cs @@ -77,6 +77,23 @@ public void KeyVaultMetricsDeclaration_DeclarationWithoutVaultName_Fails() Assert.False(validationResult.IsSuccessful, "Validation is successful"); } + [Fact] + public void KeyVaultMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithKeyVaultMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation was not successful"); + } + [Fact] public void KeyVaultMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/NetworkInterfaceMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/NetworkInterfaceMetricsDeclarationValidationStepsTests.cs index a110c4fa5..d695004d5 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/NetworkInterfaceMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/NetworkInterfaceMetricsDeclarationValidationStepsTests.cs @@ -77,6 +77,23 @@ public void NetworkInterfaceMetricsDeclaration_DeclarationWithoutNetworkInterfac Assert.False(validationResult.IsSuccessful, "Validation is successful"); } + [Fact] + public void NetworkInterfaceMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithNetworkInterfaceMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation was not successful"); + } + [Fact] public void NetworkInterfaceMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/PostgreSqlMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/PostgreSqlMetricsDeclarationValidationStepTests.cs index a7e2a28e3..e4ef257d2 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/PostgreSqlMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/PostgreSqlMetricsDeclarationValidationStepTests.cs @@ -59,5 +59,39 @@ public void PostgreSqlMetricsDeclaration_DeclarationWithoutServerName_Fails() // Assert Assert.False(validationResult.IsSuccessful, "Validation is not successful"); } + + [Fact] + public void PostgreSqlMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithPostgreSqlMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation is not successful"); + } + + [Fact] + public void PostgreSqlMetricsDeclaration_ValidDeclaration_Succeeds() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithPostgreSqlMetric() + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation is not successful"); + } } } diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/RedisCacheMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/RedisCacheMetricsDeclarationValidationStepTests.cs index b9d6e23c9..94a801593 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/RedisCacheMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/RedisCacheMetricsDeclarationValidationStepTests.cs @@ -59,5 +59,39 @@ public void RedisCacheMetricsDeclaration_DeclarationWithoutCacheName_Fails() // Assert Assert.False(validationResult.IsSuccessful, "Validation is not successful"); } + + [Fact] + public void RedisCacheMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithRedisCacheMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation is not successful"); + } + + [Fact] + public void RedisCacheMetricsDeclaration_ValidDeclaration_Succeeds() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithRedisCacheMetric() + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation is not successful"); + } } } diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ServiceBusQueueMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ServiceBusQueueMetricsDeclarationValidationStepTests.cs index d97153162..99d075541 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ServiceBusQueueMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ServiceBusQueueMetricsDeclarationValidationStepTests.cs @@ -61,7 +61,7 @@ public void ServiceBusQueuesMetricsDeclaration_UseAllowedDimension_Succeeded() } [Fact] - public void ServiceBusQueuesMetricsDeclaration_DeclarationWithoutResourceInfo_Fails() + public void ServiceBusQueuesMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() { // Arrange var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() @@ -77,6 +77,23 @@ public void ServiceBusQueuesMetricsDeclaration_DeclarationWithoutResourceInfo_Fa Assert.False(validationResult.IsSuccessful, "Validation was successful but should have failed"); } + [Fact] + public void ServiceBusQueuesMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithServiceBusMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation was not successful"); + } + [Fact] public void ServiceBusQueuesMetricsDeclaration_DeclarationWithoutMetricDescription_Succeeded() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlDatabaseMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlDatabaseMetricsDeclarationValidationStepTests.cs index 7132e7a85..2cc1d76f1 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlDatabaseMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlDatabaseMetricsDeclarationValidationStepTests.cs @@ -77,6 +77,23 @@ public void SqlDatabaseMetricsDeclaration_DeclarationWithoutDatabaseName_Fails() Assert.False(validationResult.IsSuccessful, "Validation is not successful"); } + [Fact] + public void SqlDatabaseMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithSqlDatabaseMetric() + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation is successful"); + } + [Fact] public void SqlDatabaseMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlManagedInstanceMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlManagedInstanceMetricsDeclarationValidationStepTests.cs index a70bf9adf..73fadd06f 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlManagedInstanceMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlManagedInstanceMetricsDeclarationValidationStepTests.cs @@ -59,5 +59,39 @@ public void SqlManagedInstanceMetricsDeclaration_DeclarationWithoutInstanceName_ // Assert Assert.False(validationResult.IsSuccessful, "Validation is successful"); } + + [Fact] + public void SqlManagedInstanceMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithSqlManagedInstanceMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation is successful"); + } + + [Fact] + public void SqlManagedInstanceMetricsDeclaration_ValidDeclaration_Succeed() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithSqlManagedInstanceMetric() + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation is successful"); + } } } diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlServerMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlServerMetricsDeclarationValidationStepTests.cs index cbfe67a1d..ccc405daf 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlServerMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlServerMetricsDeclarationValidationStepTests.cs @@ -60,6 +60,23 @@ public void SqlServerMetricsDeclaration_DeclarationWithoutServerName_Fails() Assert.False(validationResult.IsSuccessful, "Validation is not successful"); } + [Fact] + public void SqlServerMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithSqlServerMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation is successful"); + } + [Fact] public void SqlServerMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/StorageAccountMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/StorageAccountMetricsDeclarationValidationStepTests.cs index 204d023a1..3720502ef 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/StorageAccountMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/StorageAccountMetricsDeclarationValidationStepTests.cs @@ -129,5 +129,39 @@ public void StorageAccountMetricsDeclaration_ValidDeclarationWithTimeSpentInQueu // Assert Assert.True(validationResult.IsSuccessful, userMessage: "Validation was not successful"); } + + [Fact] + public void StorageAccountMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithStorageAccountMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, userMessage: "Validation was successful"); + } + + [Fact] + public void StorageAccountMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithServiceBusMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, userMessage: "Validation was not successful"); + } } } \ No newline at end of file diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/StorageQueueMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/StorageQueueMetricsDeclarationValidationStepTests.cs index 07cb7a1dd..c0bbd64b9 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/StorageQueueMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/StorageQueueMetricsDeclarationValidationStepTests.cs @@ -182,5 +182,39 @@ public void StorageQueuesMetricsDeclaration_ValidDeclarationWithTimeSpentInQueue // Assert Assert.True(validationResult.IsSuccessful, userMessage: "Validation was not successful"); } + + [Fact] + public void StorageQueuesMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithStorageQueueMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, userMessage: "Validation was successful"); + } + + [Fact] + public void StorageQueuesMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithServiceBusMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, userMessage: "Validation was not successful"); + } } } \ No newline at end of file diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineMetricsDeclarationValidationStepsTests.cs index e58db2439..1e0ccf90a 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineMetricsDeclarationValidationStepsTests.cs @@ -77,6 +77,40 @@ public void VirtualMachineMetricsDeclaration_DeclarationWithoutVirtualMachineNam Assert.False(validationResult.IsSuccessful, "Validation is successful"); } + [Fact] + public void VirtualMachineMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithVirtualMachineMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation was successful"); + } + + [Fact] + public void VirtualMachineMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithServiceBusMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation was not successful"); + } + [Fact] public void VirtualMachineMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineScaleSetMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineScaleSetMetricsDeclarationValidationStepsTests.cs index e5660701b..e0e64a0e2 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineScaleSetMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineScaleSetMetricsDeclarationValidationStepsTests.cs @@ -77,6 +77,40 @@ public void VirtualMachineScaleSetMetricsDeclaration_DeclarationWithoutVirtualMa Assert.False(validationResult.IsSuccessful, "Validation is successful"); } + [Fact] + public void VirtualMachineScaleSetMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithVirtualMachineScaleSetMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation was successful"); + } + + [Fact] + public void VirtualMachineScaleSetMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithServiceBusMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation was not successful"); + } + [Fact] public void VirtualMachineScaleSetMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/WebAppMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/WebAppMetricsDeclarationValidationStepsTests.cs index 192d7643c..a3d48856b 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/WebAppMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/WebAppMetricsDeclarationValidationStepsTests.cs @@ -94,6 +94,40 @@ public void WebAppMetricsDeclaration_DeclarationWithoutSlotName_Succeeds() Assert.True(validationResult.IsSuccessful, "Validation was not successful"); } + [Fact] + public void WebAppMetricsDeclaration_DeclarationWithoutResourceAndResourceCollectionInfo_Fails() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithWebAppMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation was successful"); + } + + [Fact] + public void WebAppMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithServiceBusMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation was not successful"); + } + [Fact] public void WebAppMetricsDeclaration_ValidDeclaration_Succeeds() { From 8b0287979c11495b7c5a1b031ee9a5c48cc9abb4 Mon Sep 17 00:00:00 2001 From: Tom Kerkhove Date: Wed, 3 Jun 2020 11:59:06 +0200 Subject: [PATCH 4/7] Improve local config --- .../resource-discovery-declaration.yaml | 2 +- config/promitor/scraper/metrics.yaml | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/config/promitor/resource-discovery/resource-discovery-declaration.yaml b/config/promitor/resource-discovery/resource-discovery-declaration.yaml index 1b8c37081..4e0c3e1b6 100644 --- a/config/promitor/resource-discovery/resource-discovery-declaration.yaml +++ b/config/promitor/resource-discovery/resource-discovery-declaration.yaml @@ -4,7 +4,7 @@ azureLandscape: - 0329dd2a-59dc-4493-aa54-cb01cb027dc2 - 0f9d7fea-99e8-4768-8672-06a28514f77e resourceCollections: -- name: service-bus +- name: service-bus-landscape type: microsoft.servicebus/namespaces criteria: subscriptions: diff --git a/config/promitor/scraper/metrics.yaml b/config/promitor/scraper/metrics.yaml index a5a00eca0..d93a6bbc1 100644 --- a/config/promitor/scraper/metrics.yaml +++ b/config/promitor/scraper/metrics.yaml @@ -47,6 +47,17 @@ metrics: resources: # filter is deliberately omitted given filter is optional - resourceUri: Microsoft.ServiceBus/namespaces/promitor-messaging + - name: promitor_demo_servicebusqueue_queue_size_discovered + description: "Amount of active messages of the Service Bus queues" + resourceType: ServiceBusQueue + azureMetricConfiguration: + metricName: ActiveMessages + aggregation: + type: Average + # Optionally override the default aggregation interval (metricDefaults.aggregation.interval) + interval: 00:15:00 + resourceCollections: + - name: orders service-bus-landscape - name: promitor_demo_servicebusqueue_queue_size description: "Amount of active messages of the 'orders' queue (determined with ServiceBusQueue provider)" resourceType: ServiceBusQueue From 64b5af5318531745bf24f05fa7efba8f0d8d772e Mon Sep 17 00:00:00 2001 From: Tom Kerkhove Date: Wed, 3 Jun 2020 19:25:53 +0200 Subject: [PATCH 5/7] Provide more unit tests Signed-off-by: Tom Kerkhove --- ...tMetricsDeclarationValidationStepsTests.cs | 17 ++++++++++++++ ...nMetricsDeclarationValidationStepsTests.cs | 17 ++++++++++++++ ...geMetricsDeclarationValidationStepTests.cs | 17 ++++++++++++++ ...ceMetricsDeclarationValidationStepTests.cs | 17 ++++++++++++++ ...ryMetricsDeclarationValidationStepTests.cs | 17 ++++++++++++++ ...DbMetricsDeclarationValidationStepTests.cs | 19 ++++++++++++++- ...eMetricsDeclarationValidationStepsTests.cs | 17 ++++++++++++++ ...geMetricsDeclarationValidationStepTests.cs | 23 ++++++++++++++++--- ...pMetricsDeclarationValidationStepsTests.cs | 17 ++++++++++++++ ...icMetricsDeclarationValidationStepTests.cs | 21 +++++++++++++++-- ...bMetricsDeclarationValidationStepsTests.cs | 17 ++++++++++++++ ...tMetricsDeclarationValidationStepsTests.cs | 17 ++++++++++++++ ...eMetricsDeclarationValidationStepsTests.cs | 19 ++++++++++++++- ...qlMetricsDeclarationValidationStepTests.cs | 19 ++++++++++++++- ...heMetricsDeclarationValidationStepTests.cs | 19 ++++++++++++++- ...seMetricsDeclarationValidationStepTests.cs | 21 +++++++++++++++-- ...ceMetricsDeclarationValidationStepTests.cs | 17 ++++++++++++++ ...erMetricsDeclarationValidationStepTests.cs | 17 ++++++++++++++ ...ntMetricsDeclarationValidationStepTests.cs | 2 +- ...ueMetricsDeclarationValidationStepTests.cs | 2 +- ...eMetricsDeclarationValidationStepsTests.cs | 2 +- ...tMetricsDeclarationValidationStepsTests.cs | 2 +- ...pMetricsDeclarationValidationStepsTests.cs | 2 +- 23 files changed, 322 insertions(+), 16 deletions(-) diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ApiManagementMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ApiManagementMetricsDeclarationValidationStepsTests.cs index 4dcbe1260..1508abbce 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ApiManagementMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ApiManagementMetricsDeclarationValidationStepsTests.cs @@ -110,6 +110,23 @@ public void ApiManagementMetricsDeclaration_DeclarationWithoutResourceAndResourc Assert.False(validationResult.IsSuccessful, "Validation was successful"); } + [Fact] + public void ApiManagementMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithApiManagementMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation was not successful"); + } + [Fact] public void ApiManagementMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/AppPlanMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/AppPlanMetricsDeclarationValidationStepsTests.cs index d2e8b37ae..7ac02ce3d 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/AppPlanMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/AppPlanMetricsDeclarationValidationStepsTests.cs @@ -94,6 +94,23 @@ public void AppPlanMetricsDeclaration_DeclarationWithoutResourceAndResourceColle Assert.False(validationResult.IsSuccessful, "Validation was successful"); } + [Fact] + public void AppPlanMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithAppPlanMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation was not successful"); + } + [Fact] public void AppPlanMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/BlobStorageMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/BlobStorageMetricsDeclarationValidationStepTests.cs index a268caa6b..6837773cb 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/BlobStorageMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/BlobStorageMetricsDeclarationValidationStepTests.cs @@ -146,5 +146,22 @@ public void BlobStorageMetricsDeclaration_DeclarationWithoutResourceAndResourceC // Assert Assert.False(validationResult.IsSuccessful, userMessage: "Validation was successful"); } + + [Fact] + public void BlobStorageMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithBlobStorageMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, userMessage: "Validation was not successful"); + } } } \ No newline at end of file diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ContainerInstanceMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ContainerInstanceMetricsDeclarationValidationStepTests.cs index 4781500c1..328dd67a3 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ContainerInstanceMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ContainerInstanceMetricsDeclarationValidationStepTests.cs @@ -94,6 +94,23 @@ public void ContainerInstanceMetricsDeclaration_DeclarationWithoutResourceAndRes Assert.False(validationResult.IsSuccessful, "Validation was successful"); } + [Fact] + public void ContainerInstanceMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithContainerInstanceMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation was not successful"); + } + [Fact] public void ContainerInstanceMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ContainerRegistryMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ContainerRegistryMetricsDeclarationValidationStepTests.cs index 429982484..99e00a70f 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ContainerRegistryMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/ContainerRegistryMetricsDeclarationValidationStepTests.cs @@ -96,6 +96,23 @@ public void ContainerRegistryMetricsDeclaration_DeclarationWithoutResourceAndRes Assert.False(validationResult.IsSuccessful, "Validation was successful"); } + [Fact] + public void ContainerRegistryMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithContainerRegistryMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation was successful"); + } + [Fact] public void ContainerRegistryMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/CosmosDbMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/CosmosDbMetricsDeclarationValidationStepTests.cs index 63a15cfa5..034489308 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/CosmosDbMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/CosmosDbMetricsDeclarationValidationStepTests.cs @@ -91,7 +91,24 @@ public void CosmosDbMetricsDeclaration_DeclarationWithoutResourceAndResourceColl var validationResult = scrapingScheduleValidationStep.Run(); // Assert - Assert.False(validationResult.IsSuccessful, "Validation was not successful"); + Assert.False(validationResult.IsSuccessful, "Validation was successful"); + } + + [Fact] + public void CosmosDbMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithCosmosDbMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation was not successful"); } [Fact] diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/DeviceProvisioningServiceMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/DeviceProvisioningServiceMetricsDeclarationValidationStepsTests.cs index e322e4490..b1ed8f1ee 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/DeviceProvisioningServiceMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/DeviceProvisioningServiceMetricsDeclarationValidationStepsTests.cs @@ -94,6 +94,23 @@ public void DeviceProvisioningServiceMetricsDeclaration_DeclarationWithoutResour Assert.False(validationResult.IsSuccessful, "Validation was successful"); } + [Fact] + public void DeviceProvisioningServiceMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithDeviceProvisioningServiceMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation was not successful"); + } + [Fact] public void DeviceProvisioningServiceMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/FileStorageMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/FileStorageMetricsDeclarationValidationStepTests.cs index 7b2ee5c35..8e702e9af 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/FileStorageMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/FileStorageMetricsDeclarationValidationStepTests.cs @@ -118,7 +118,24 @@ public void FileStorageMetricsDeclaration_DeclarationWithoutResourceAndResourceC { // Arrange var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() - .WithFileStorageMetric(azureMetricName: AzureStorageConstants.Queues.Metrics.TimeSpentInQueue) + .WithFileStorageMetric(omitResource: true) + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, userMessage: "Validation was successful"); + } + + [Fact] + public void FileStorageMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithFileStorageMetric(omitResource: true, resourceCollectionName: "sample-collection") .Build(Mapper); var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); @@ -135,7 +152,7 @@ public void FileStorageMetricsDeclaration_ValidDeclarationWithTimeSpentInQueue_S { // Arrange var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() - .WithFileStorageMetric(omitResource: true) + .WithFileStorageMetric() .Build(Mapper); var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); @@ -144,7 +161,7 @@ public void FileStorageMetricsDeclaration_ValidDeclarationWithTimeSpentInQueue_S var validationResult = scrapingScheduleValidationStep.Run(); // Assert - Assert.False(validationResult.IsSuccessful, userMessage: "Validation was successful"); + Assert.True(validationResult.IsSuccessful, userMessage: "Validation was successful"); } } } \ No newline at end of file diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/FunctionAppMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/FunctionAppMetricsDeclarationValidationStepsTests.cs index 52c1b2ea0..d258f5c73 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/FunctionAppMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/FunctionAppMetricsDeclarationValidationStepsTests.cs @@ -94,6 +94,23 @@ public void FunctionAppMetricsDeclaration_DeclarationWithoutResourceAndResourceC Assert.False(validationResult.IsSuccessful, "Validation was successful"); } + [Fact] + public void FunctionAppMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithFunctionAppMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation was not successful"); + } + [Fact] public void FunctionAppMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/GenericMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/GenericMetricsDeclarationValidationStepTests.cs index a99d23caf..d86ad87a4 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/GenericMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/GenericMetricsDeclarationValidationStepTests.cs @@ -116,7 +116,7 @@ public void GenericMetricsDeclaration_DeclarationWithoutResourceAndResourceColle { // Arrange var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() - .WithServiceBusMetric(omitResource: true) + .WithGenericMetric(omitResource: true) .Build(Mapper); var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); @@ -128,12 +128,29 @@ public void GenericMetricsDeclaration_DeclarationWithoutResourceAndResourceColle Assert.False(validationResult.IsSuccessful, "Validation was successful"); } + [Fact] + public void GenericMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithGenericMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation was not successful"); + } + [Fact] public void GenericMetricsDeclaration_ValidDeclaration_Succeeds() { // Arrange var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() - .WithServiceBusMetric() + .WithGenericMetric() .Build(Mapper); var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTHubMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTHubMetricsDeclarationValidationStepsTests.cs index e948aa7ec..32495fb39 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTHubMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTHubMetricsDeclarationValidationStepsTests.cs @@ -94,6 +94,23 @@ public void IoTHubMetricsDeclaration_DeclarationWithoutResourceAndResourceCollec Assert.False(validationResult.IsSuccessful, "Validation was successful"); } + [Fact] + public void IoTHubMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithIoTHubMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation was not successful"); + } + [Fact] public void IoTHubMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/KeyVaultMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/KeyVaultMetricsDeclarationValidationStepsTests.cs index 4deee8340..a06fc17dd 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/KeyVaultMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/KeyVaultMetricsDeclarationValidationStepsTests.cs @@ -94,6 +94,23 @@ public void KeyVaultMetricsDeclaration_DeclarationWithoutResourceAndResourceColl Assert.False(validationResult.IsSuccessful, "Validation was not successful"); } + [Fact] + public void KeyVaultMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithKeyVaultMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation was not successful"); + } + [Fact] public void KeyVaultMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/NetworkInterfaceMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/NetworkInterfaceMetricsDeclarationValidationStepsTests.cs index d695004d5..fdb2ffb6c 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/NetworkInterfaceMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/NetworkInterfaceMetricsDeclarationValidationStepsTests.cs @@ -91,7 +91,24 @@ public void NetworkInterfaceMetricsDeclaration_DeclarationWithoutResourceAndReso var validationResult = scrapingScheduleValidationStep.Run(); // Assert - Assert.False(validationResult.IsSuccessful, "Validation was not successful"); + Assert.False(validationResult.IsSuccessful, "Validation was successful"); + } + + [Fact] + public void NetworkInterfaceMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithNetworkInterfaceMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation was not successful"); } [Fact] diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/PostgreSqlMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/PostgreSqlMetricsDeclarationValidationStepTests.cs index e4ef257d2..2196c10be 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/PostgreSqlMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/PostgreSqlMetricsDeclarationValidationStepTests.cs @@ -74,7 +74,24 @@ public void PostgreSqlMetricsDeclaration_DeclarationWithoutResourceAndResourceCo var validationResult = scrapingScheduleValidationStep.Run(); // Assert - Assert.False(validationResult.IsSuccessful, "Validation is not successful"); + Assert.False(validationResult.IsSuccessful, "Validation is successful"); + } + + [Fact] + public void PostgreSqlMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithPostgreSqlMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation is not successful"); } [Fact] diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/RedisCacheMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/RedisCacheMetricsDeclarationValidationStepTests.cs index 94a801593..3e6893438 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/RedisCacheMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/RedisCacheMetricsDeclarationValidationStepTests.cs @@ -74,7 +74,24 @@ public void RedisCacheMetricsDeclaration_DeclarationWithoutResourceAndResourceCo var validationResult = scrapingScheduleValidationStep.Run(); // Assert - Assert.False(validationResult.IsSuccessful, "Validation is not successful"); + Assert.False(validationResult.IsSuccessful, "Validation is successful"); + } + + [Fact] + public void RedisCacheMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithRedisCacheMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation is not successful"); } [Fact] diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlDatabaseMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlDatabaseMetricsDeclarationValidationStepTests.cs index 2cc1d76f1..4df565322 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlDatabaseMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlDatabaseMetricsDeclarationValidationStepTests.cs @@ -82,7 +82,7 @@ public void SqlDatabaseMetricsDeclaration_DeclarationWithoutResourceAndResourceC { // Arrange var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() - .WithSqlDatabaseMetric() + .WithSqlDatabaseMetric(omitResource: true) .Build(Mapper); var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); @@ -91,7 +91,24 @@ public void SqlDatabaseMetricsDeclaration_DeclarationWithoutResourceAndResourceC var validationResult = scrapingScheduleValidationStep.Run(); // Assert - Assert.True(validationResult.IsSuccessful, "Validation is successful"); + Assert.False(validationResult.IsSuccessful, "Validation is successful"); + } + + [Fact] + public void SqlDatabaseMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithSqlDatabaseMetric(omitResource:true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation is not successful"); } [Fact] diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlManagedInstanceMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlManagedInstanceMetricsDeclarationValidationStepTests.cs index 73fadd06f..e6197a4d6 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlManagedInstanceMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlManagedInstanceMetricsDeclarationValidationStepTests.cs @@ -77,6 +77,23 @@ public void SqlManagedInstanceMetricsDeclaration_DeclarationWithoutResourceAndRe Assert.False(validationResult.IsSuccessful, "Validation is successful"); } + [Fact] + public void SqlManagedInstanceMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithSqlManagedInstanceMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation is not successful"); + } + [Fact] public void SqlManagedInstanceMetricsDeclaration_ValidDeclaration_Succeed() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlServerMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlServerMetricsDeclarationValidationStepTests.cs index ccc405daf..8e169b180 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlServerMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/SqlServerMetricsDeclarationValidationStepTests.cs @@ -77,6 +77,23 @@ public void SqlServerMetricsDeclaration_DeclarationWithoutResourceAndResourceCol Assert.False(validationResult.IsSuccessful, "Validation is successful"); } + [Fact] + public void SqlServerMetricsDeclaration_DeclarationWithoutResourceButWithResourceCollectionInfo_Succeeds() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithSqlServerMetric(omitResource: true, resourceCollectionName: "sample-collection") + .Build(Mapper); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation is not successful"); + } + [Fact] public void SqlServerMetricsDeclaration_ValidDeclaration_Succeeds() { diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/StorageAccountMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/StorageAccountMetricsDeclarationValidationStepTests.cs index 3720502ef..81783cc40 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/StorageAccountMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/StorageAccountMetricsDeclarationValidationStepTests.cs @@ -152,7 +152,7 @@ public void StorageAccountMetricsDeclaration_DeclarationWithoutResourceButWithRe { // Arrange var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() - .WithServiceBusMetric(omitResource: true, resourceCollectionName: "sample-collection") + .WithStorageAccountMetric(omitResource: true, resourceCollectionName: "sample-collection") .Build(Mapper); var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/StorageQueueMetricsDeclarationValidationStepTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/StorageQueueMetricsDeclarationValidationStepTests.cs index c0bbd64b9..37ae5493a 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/StorageQueueMetricsDeclarationValidationStepTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/StorageQueueMetricsDeclarationValidationStepTests.cs @@ -205,7 +205,7 @@ public void StorageQueuesMetricsDeclaration_DeclarationWithoutResourceButWithRes { // Arrange var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() - .WithServiceBusMetric(omitResource: true, resourceCollectionName: "sample-collection") + .WithStorageQueueMetric(omitResource: true, resourceCollectionName: "sample-collection") .Build(Mapper); var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineMetricsDeclarationValidationStepsTests.cs index 1e0ccf90a..b4aa84a00 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineMetricsDeclarationValidationStepsTests.cs @@ -99,7 +99,7 @@ public void VirtualMachineMetricsDeclaration_DeclarationWithoutResourceButWithRe { // Arrange var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() - .WithServiceBusMetric(omitResource: true, resourceCollectionName: "sample-collection") + .WithVirtualMachineMetric(omitResource: true, resourceCollectionName: "sample-collection") .Build(Mapper); var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineScaleSetMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineScaleSetMetricsDeclarationValidationStepsTests.cs index e0e64a0e2..0d2bcd6c4 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineScaleSetMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineScaleSetMetricsDeclarationValidationStepsTests.cs @@ -99,7 +99,7 @@ public void VirtualMachineScaleSetMetricsDeclaration_DeclarationWithoutResourceB { // Arrange var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() - .WithServiceBusMetric(omitResource: true, resourceCollectionName: "sample-collection") + .WithVirtualMachineScaleSetMetric(omitResource: true, resourceCollectionName: "sample-collection") .Build(Mapper); var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/WebAppMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/WebAppMetricsDeclarationValidationStepsTests.cs index a3d48856b..b43838e76 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/WebAppMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/WebAppMetricsDeclarationValidationStepsTests.cs @@ -116,7 +116,7 @@ public void WebAppMetricsDeclaration_DeclarationWithoutResourceButWithResourceCo { // Arrange var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() - .WithServiceBusMetric(omitResource: true, resourceCollectionName: "sample-collection") + .WithWebAppMetric(omitResource: true, resourceCollectionName: "sample-collection") .Build(Mapper); var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); From fb112ef0d189d2a0c12e3a6529d8dfd45faee842 Mon Sep 17 00:00:00 2001 From: Tom Kerkhove Date: Wed, 3 Jun 2020 19:31:55 +0200 Subject: [PATCH 6/7] Improve error message Signed-off-by: Tom Kerkhove --- .../Validation/MetricDefinitions/MetricsValidator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/MetricsValidator.cs b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/MetricsValidator.cs index f830a1ea6..04d8b3660 100644 --- a/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/MetricsValidator.cs +++ b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/MetricsValidator.cs @@ -51,7 +51,7 @@ private IEnumerable Validate(MetricDefinition metric) if (metric.Resources?.Any() == false && metric.ResourceCollections?.Any() == false) { - errorMessages.Add("No resource or resource collection is configured"); + errorMessages.Add("No resource or resource collection is configured to be scraped"); } else { From dee1233de2e06919c77dbb29754c811b466d08e2 Mon Sep 17 00:00:00 2001 From: Tom Kerkhove Date: Wed, 3 Jun 2020 19:41:19 +0200 Subject: [PATCH 7/7] Fix code quality Signed-off-by: Tom Kerkhove --- .../v1/Core/MetricDefinitionDeserializerTests.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Promitor.Tests.Unit/Serialization/v1/Core/MetricDefinitionDeserializerTests.cs b/src/Promitor.Tests.Unit/Serialization/v1/Core/MetricDefinitionDeserializerTests.cs index fa189255e..24add3200 100644 --- a/src/Promitor.Tests.Unit/Serialization/v1/Core/MetricDefinitionDeserializerTests.cs +++ b/src/Promitor.Tests.Unit/Serialization/v1/Core/MetricDefinitionDeserializerTests.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.ComponentModel; -using System.Linq; using Microsoft.Extensions.Logging.Abstractions; using Moq; using Promitor.Core.Scraping.Configuration.Model; @@ -18,7 +17,6 @@ public class MetricDefinitionDeserializerTests private readonly Mock> _azureMetricConfigurationDeserializer; private readonly Mock> _scrapingDeserializer; private readonly Mock _resourceDeserializerFactory; - private readonly Mock> _resourceCollectionsDeserializer; private readonly Mock _errorReporter = new Mock(); private readonly MetricDefinitionDeserializer _deserializer; @@ -27,13 +25,13 @@ public MetricDefinitionDeserializerTests() { _azureMetricConfigurationDeserializer = new Mock>(); _scrapingDeserializer = new Mock>(); - _resourceCollectionsDeserializer = new Mock>(); _resourceDeserializerFactory = new Mock(); + var resourceCollectionsDeserializer = new Mock>(); _deserializer = new MetricDefinitionDeserializer( _azureMetricConfigurationDeserializer.Object, _scrapingDeserializer.Object, - _resourceCollectionsDeserializer.Object, + resourceCollectionsDeserializer.Object, _resourceDeserializerFactory.Object, NullLogger.Instance); }