diff --git a/docs/configuration/metrics/virtual-machine.md b/docs/configuration/metrics/virtual-machine.md index 9bd3ced73..c36a0f0c6 100644 --- a/docs/configuration/metrics/virtual-machine.md +++ b/docs/configuration/metrics/virtual-machine.md @@ -14,7 +14,7 @@ All supported metrics are documented in the official [Azure Monitor documentatio Example: ```yaml name: demo_virtualmachine_percentage_cpu -description: "Average percentage cpu usage of our 'promitor-virtual-machine'" +description: "Average percentage cpu usage of our 'promitor-virtual-machine' virtual machine" resourceType: VirtualMachine virtualMachineName: promitor-virtual-machine azureMetricConfiguration: diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/VirtualMachineMetricDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/VirtualMachineMetricDefinition.cs index 085ac5f14..685d736ee 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/VirtualMachineMetricDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/VirtualMachineMetricDefinition.cs @@ -3,6 +3,6 @@ namespace Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes public class VirtualMachineMetricDefinition : MetricDefinition { public string VirtualMachineName { get; set; } - public override ResourceType ResourceType { get; set; } = ResourceType.VirtualMachine; + public override ResourceType ResourceType { get; } = ResourceType.VirtualMachine; } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/Deserializers/VirtualMachineMetricDeserializer.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/Deserializers/VirtualMachineMetricDeserializer.cs index 1d72d3425..2fb520433 100644 --- a/src/Promitor.Core.Scraping/Configuration/Serialization/Deserializers/VirtualMachineMetricDeserializer.cs +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/Deserializers/VirtualMachineMetricDeserializer.cs @@ -14,7 +14,7 @@ internal override MetricDefinition Deserialize(YamlMappingNode metricNode) var metricDefinition = base.DeserializeMetricDefinition(metricNode); var virtualMachineName = metricNode.Children[new YamlScalarNode("virtualMachineName")]; - metricDefinition.virtualMachineName = virtualMachineName?.ToString(); + metricDefinition.VirtualMachineName = virtualMachineName?.ToString(); return metricDefinition; } diff --git a/src/Promitor.Core.Scraping/Factories/MetricDeserializerFactory.cs b/src/Promitor.Core.Scraping/Factories/MetricDeserializerFactory.cs index 7f112525f..56b130c80 100644 --- a/src/Promitor.Core.Scraping/Factories/MetricDeserializerFactory.cs +++ b/src/Promitor.Core.Scraping/Factories/MetricDeserializerFactory.cs @@ -16,7 +16,7 @@ internal static GenericAzureMetricDeserializer GetDeserializerFor(Configuration. case Configuration.Model.ResourceType.StorageQueue: return new StorageQueueMetricDeserializer(); case Configuration.Model.ResourceType.VirtualMachine: - return new VirtualMachineMetric(node); + return new VirtualMachineMetricDeserializer(); } throw new ArgumentOutOfRangeException($@"Resource Type {resource} not supported."); diff --git a/src/Promitor.Scraper.Tests.Unit/Builders/MetricsDeclarationBuilder.cs b/src/Promitor.Scraper.Tests.Unit/Builders/MetricsDeclarationBuilder.cs index 2badba1bb..794075213 100644 --- a/src/Promitor.Scraper.Tests.Unit/Builders/MetricsDeclarationBuilder.cs +++ b/src/Promitor.Scraper.Tests.Unit/Builders/MetricsDeclarationBuilder.cs @@ -85,7 +85,6 @@ public string Build() var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); var metric = new VirtualMachineMetricDefinition { - ResourceType = ResourceType.VirtualMachine, Name = metricName, Description = metricDescription, VirtualMachineName = virtualMachineName, diff --git a/src/Promitor.Scraper.Tests.Unit/Serialization/MetricsDeclaration/MetricsDeclarationWithVirtualMachineYamlSerializationTests.cs b/src/Promitor.Scraper.Tests.Unit/Serialization/MetricsDeclaration/MetricsDeclarationWithVirtualMachineYamlSerializationTests.cs index abc99ae6e..2b513939f 100644 --- a/src/Promitor.Scraper.Tests.Unit/Serialization/MetricsDeclaration/MetricsDeclarationWithVirtualMachineYamlSerializationTests.cs +++ b/src/Promitor.Scraper.Tests.Unit/Serialization/MetricsDeclaration/MetricsDeclarationWithVirtualMachineYamlSerializationTests.cs @@ -5,7 +5,7 @@ using Microsoft.Extensions.Logging.Abstractions; using Promitor.Core.Scraping.Configuration.Model; using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; -using Promitor.Core.Scraping.Configuration.Serialization; +using Promitor.Core.Scraping.Configuration.Serialization.Core; using Xunit; using MetricDefinition = Promitor.Core.Scraping.Configuration.Model.Metrics.MetricDefinition; @@ -44,8 +44,8 @@ public void YamlSerialization_SerializeAndDeserializeValidConfigForVirtualMachin Assert.Single(deserializedConfiguration.Metrics); var deserializedMetricDefinition = deserializedConfiguration.Metrics.FirstOrDefault(); AssertMetricDefinition(deserializedMetricDefinition, virtualMachineMetricDefinition); - var deserializedServiceBusMetricDefinition = deserializedMetricDefinition as VirtualMachineMetricDefinition; - AssertVirtualMachineMetricDefinition(deserializedServiceBusMetricDefinition, virtualMachineMetricDefinition, deserializedMetricDefinition); + var deserializedVirtualMachineMetricDefinition = deserializedMetricDefinition as VirtualMachineMetricDefinition; + AssertVirtualMachineMetricDefinition(deserializedVirtualMachineMetricDefinition, virtualMachineMetricDefinition, deserializedMetricDefinition); } private static void AssertVirtualMachineMetricDefinition(VirtualMachineMetricDefinition deserializedVirtualMachineMetricDefinition, VirtualMachineMetricDefinition virtualMachineMetricDefinition, MetricDefinition deserializedMetricDefinition) diff --git a/src/Promitor.Scraper.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Scraper.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineMetricsDeclarationValidationStepsTests.cs index abc99ae6e..f5c7e288b 100644 --- a/src/Promitor.Scraper.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Scraper.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineMetricsDeclarationValidationStepsTests.cs @@ -1,75 +1,97 @@ -using System.Collections.Generic; using System.ComponentModel; -using System.Linq; -using Bogus; -using Microsoft.Extensions.Logging.Abstractions; -using Promitor.Core.Scraping.Configuration.Model; -using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; -using Promitor.Core.Scraping.Configuration.Serialization; +using Promitor.Scraper.Host.Validation.Steps; +using Promitor.Scraper.Tests.Unit.Builders; +using Promitor.Scraper.Tests.Unit.Stubs; using Xunit; -using MetricDefinition = Promitor.Core.Scraping.Configuration.Model.Metrics.MetricDefinition; -namespace Promitor.Scraper.Tests.Unit.Serialization.MetricsDeclaration +namespace Promitor.Scraper.Tests.Unit.Validation.Metrics.ResourceTypes { [Category("Unit")] - public class MetricsDeclarationWithVirtualMachineYamlSerializationTests : YamlSerializationTests + public class VirtualMachineMetricsDeclarationValidationStepTests { [Fact] - public void YamlSerialization_SerializeAndDeserializeValidConfigForVirtualMachine_SucceedsWithIdenticalOutput() + public void VirtualMachineMetricsDeclaration_DeclarationWithoutAzureMetricName_Succeeds() { // Arrange - var azureMetadata = GenerateBogusAzureMetadata(); - var virtualMachineMetricDefinition = GenerateBogusVirtualMachineMetricDefinition(); - var metricDefaults = GenerateBogusMetricDefaults(); - var scrapingConfiguration = new Core.Scraping.Configuration.Model.MetricsDeclaration - { - AzureMetadata = azureMetadata, - MetricDefaults = metricDefaults, - Metrics = new List - { - virtualMachineMetricDefinition - } - }; - var configurationSerializer = new ConfigurationSerializer(NullLogger.Instance); + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithVirtualMachineMetric(azureMetricName: string.Empty) + .Build(); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration); // Act - var serializedConfiguration = configurationSerializer.Serialize(scrapingConfiguration); - var deserializedConfiguration = configurationSerializer.Deserialize(serializedConfiguration); + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); // Assert - Assert.NotNull(deserializedConfiguration); - AssertAzureMetadata(deserializedConfiguration, azureMetadata); - AssertMetricDefaults(deserializedConfiguration, metricDefaults); - Assert.NotNull(deserializedConfiguration.Metrics); - Assert.Single(deserializedConfiguration.Metrics); - var deserializedMetricDefinition = deserializedConfiguration.Metrics.FirstOrDefault(); - AssertMetricDefinition(deserializedMetricDefinition, virtualMachineMetricDefinition); - var deserializedServiceBusMetricDefinition = deserializedMetricDefinition as VirtualMachineMetricDefinition; - AssertVirtualMachineMetricDefinition(deserializedServiceBusMetricDefinition, virtualMachineMetricDefinition, deserializedMetricDefinition); + Assert.False(validationResult.IsSuccessful, "Validation is successful"); } - private static void AssertVirtualMachineMetricDefinition(VirtualMachineMetricDefinition deserializedVirtualMachineMetricDefinition, VirtualMachineMetricDefinition virtualMachineMetricDefinition, MetricDefinition deserializedMetricDefinition) + [Fact] + public void VirtualMachineMetricsDeclaration_DeclarationWithoutMetricDescription_Succeeded() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithVirtualMachineMetric(metricDescription: string.Empty) + .Build(); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation was not successful"); + } + + [Fact] + public void VirtualMachineMetricsDeclaration_DeclarationWithoutMetricName_Fails() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithVirtualMachineMetric(string.Empty) + .Build(); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation is successful"); + } + + [Fact] + public void VirtualMachineMetricsDeclaration_DeclarationWithoutVirtualMachineName_Fails() { - Assert.NotNull(deserializedVirtualMachineMetricDefinition); - Assert.Equal(virtualMachineMetricDefinition.VirtualMachineName, deserializedVirtualMachineMetricDefinition.VirtualMachineName); - Assert.NotNull(deserializedMetricDefinition.AzureMetricConfiguration); - Assert.Equal(virtualMachineMetricDefinition.AzureMetricConfiguration.MetricName, deserializedMetricDefinition.AzureMetricConfiguration.MetricName); - Assert.NotNull(deserializedMetricDefinition.AzureMetricConfiguration.Aggregation); - Assert.Equal(virtualMachineMetricDefinition.AzureMetricConfiguration.Aggregation.Type, deserializedMetricDefinition.AzureMetricConfiguration.Aggregation.Type); - Assert.Equal(virtualMachineMetricDefinition.AzureMetricConfiguration.Aggregation.Interval, deserializedMetricDefinition.AzureMetricConfiguration.Aggregation.Interval); + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithVirtualMachineMetric(virtualMachineName: string.Empty) + .Build(); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration); + + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.False(validationResult.IsSuccessful, "Validation is successful"); } - private VirtualMachineMetricDefinition GenerateBogusVirtualMachineMetricDefinition() + + [Fact] + public void VirtualMachineMetricsDeclaration_ValidDeclaration_Succeeds() { - var bogusAzureMetricConfiguration = GenerateBogusAzureMetricConfiguration(); - var bogusGenerator = new Faker() - .StrictMode(ensureRulesForAllProperties: true) - .RuleFor(metricDefinition => metricDefinition.Name, faker => faker.Name.FirstName()) - .RuleFor(metricDefinition => metricDefinition.Description, faker => faker.Lorem.Sentence(wordCount: 6)) - .RuleFor(metricDefinition => metricDefinition.ResourceType, faker => ResourceType.VirtualMachine) - .RuleFor(metricDefinition => metricDefinition.VirtualMachineName, faker => faker.Name.LastName()) - .RuleFor(metricDefinition => metricDefinition.AzureMetricConfiguration, faker => bogusAzureMetricConfiguration); + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithVirtualMachineMetric() + .Build(); + var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration); - return bogusGenerator.Generate(); + // Act + var scrapingScheduleValidationStep = new MetricsDeclarationValidationStep(metricsDeclarationProvider); + var validationResult = scrapingScheduleValidationStep.Run(); + + // Assert + Assert.True(validationResult.IsSuccessful, "Validation was not successful"); } } } \ No newline at end of file