From 145bd30c528d5bfb7c31ebf0fdff6226be7c857a Mon Sep 17 00:00:00 2001 From: Tom Kerkhove Date: Wed, 8 Jan 2020 12:24:53 +0100 Subject: [PATCH 1/3] Add new scraper in changelog --- 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..5b0643142 --- /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 %}} Azure Virtual Machine Scale Set Scraper ([docs](https://promitor.io/configuration/v1.x/metrics/virtual-machine-scale-set) | [#310](https://github.com/tomkerkhove/promitor/issues/310)) From 816c8b4fd48a49b80dee448ae69bc1218918e7a5 Mon Sep 17 00:00:00 2001 From: Tom Kerkhove Date: Wed, 8 Jan 2020 12:25:24 +0100 Subject: [PATCH 2/3] Document new scraper --- docs/configuration/v1.x/metrics/index.md | 1 + .../v1.x/metrics/virtual-machine-scale-set.md | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 docs/configuration/v1.x/metrics/virtual-machine-scale-set.md diff --git a/docs/configuration/v1.x/metrics/index.md b/docs/configuration/v1.x/metrics/index.md index ceeff3fc4..e129362a2 100644 --- a/docs/configuration/v1.x/metrics/index.md +++ b/docs/configuration/v1.x/metrics/index.md @@ -122,6 +122,7 @@ We also provide a simplified way to scrape the following Azure resources: - [Azure SQL Managed Instance](sql-managed-instance) - [Azure Storage Queue](storage-queue) - [Azure Virtual Machine](virtual-machine) +- [Azure Virtual Machine Scale Set (VMSS)](virtual-machine-scale-set) Want to help out? Create an issue and [contribute a new scraper](https://github.com/tomkerkhove/promitor/blob/master/adding-a-new-scraper.md). diff --git a/docs/configuration/v1.x/metrics/virtual-machine-scale-set.md b/docs/configuration/v1.x/metrics/virtual-machine-scale-set.md new file mode 100644 index 000000000..63a7ddd7b --- /dev/null +++ b/docs/configuration/v1.x/metrics/virtual-machine-scale-set.md @@ -0,0 +1,36 @@ +--- +layout: default +title: Azure Virtual Machine Scale Set (VMSS) Declaration +--- + +## Azure Virtual Machine Scale Set (VMSS) - ![Availability Badge](https://img.shields.io/badge/Available%20Starting-v1.2-green.svg) + +You can declare to scrape an Azure Virtual Machine Scale Set via the `VirtualMachineScaleSet` resource +type. + +The following fields need to be provided: + +- `scaleSetName` - The name of the Virtual Machine Scale Set + +All supported metrics are documented in the official [Azure Monitor documentation](https://docs.microsoft.com/en-us/azure/azure-monitor/platform/metrics-supported#microsoftcomputevirtualmachinescalesets). + +Example: + +```yaml +name: azure_virtual_machine_scale_set_percentage_cpu +description: "Average percentage cpu usage on an Azure virtual machine scale set" +resourceType: VirtualMachineScaleSet +azureMetricConfiguration: + metricName: Percentage CPU + dimension: + name: VMName + aggregation: + type: Average +resources: +- scaleSetName: promitor-virtual-machine-scale-set-1 +``` + + +[← back to metrics declarations](/configuration/v1.x/metrics)
+[← back to introduction](/) + From ecfd77323152f36fe7e1ce468847f2e97cba2650 Mon Sep 17 00:00:00 2001 From: Tom Kerkhove Date: Wed, 8 Jan 2020 12:35:10 +0100 Subject: [PATCH 3/3] Provide Azure Virtual Machine Scale Set (VMSS) Scraper --- ...> SqlManagedInstanceResourceDefinition.cs} | 6 +- ...rtualMachineScaleSetsResourceDefinition.cs | 13 +++ .../Configuration/Model/ResourceType.cs | 3 +- .../Core/AzureResourceDeserializerFactory.cs | 3 + .../v1/Mapping/V1MappingProfile.cs | 6 +- .../VirtualMachineScaleSetResourceV1.cs | 13 +++ .../VirtualMachineScaleSetDeserializer.cs | 26 +++++ .../Factories/MetricScraperFactory.cs | 2 + .../SqlManagedInstanceScraper.cs | 6 +- .../VirtualMachineScaleSetScraper.cs | 29 +++++ .../Factories/MetricValidatorFactory.cs | 2 + .../SqlManagedInstanceMetricValidator.cs | 2 +- .../VirtualMachineScaleSetMetricValidator.cs | 25 ++++ .../Metrics/v1/MetricsDeclarationBuilder.cs | 22 ++++ ...VirtualMachineScaleSetDeserializerTests.cs | 44 +++++++ ...tMetricsDeclarationValidationStepsTests.cs | 107 ++++++++++++++++++ 16 files changed, 299 insertions(+), 10 deletions(-) rename src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/{SqlManagedInstanceDefinition.cs => SqlManagedInstanceResourceDefinition.cs} (78%) create mode 100644 src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/VirtualMachineScaleSetsResourceDefinition.cs create mode 100644 src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/VirtualMachineScaleSetResourceV1.cs create mode 100644 src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/VirtualMachineScaleSetDeserializer.cs create mode 100644 src/Promitor.Core.Scraping/ResourceTypes/VirtualMachineScaleSetScraper.cs create mode 100644 src/Promitor.Scraper.Host/Validation/MetricDefinitions/ResourceTypes/VirtualMachineScaleSetMetricValidator.cs create mode 100644 src/Promitor.Scraper.Tests.Unit/Serialization/v1/Providers/VirtualMachineScaleSetDeserializerTests.cs create mode 100644 src/Promitor.Scraper.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineScaleSetMetricsDeclarationValidationStepsTests.cs diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/SqlManagedInstanceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/SqlManagedInstanceResourceDefinition.cs similarity index 78% rename from src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/SqlManagedInstanceDefinition.cs rename to src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/SqlManagedInstanceResourceDefinition.cs index d886d79ad..bc6368a9b 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/SqlManagedInstanceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/SqlManagedInstanceResourceDefinition.cs @@ -3,14 +3,14 @@ /// /// Represents an Azure SQL Managed Instance resource. /// - public class SqlManagedInstanceDefinition : AzureResourceDefinition + public class SqlManagedInstanceResourceDefinition : AzureResourceDefinition { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The name of the resource group the server is in. /// The name of the Azure SQL Managed Instance resource. - public SqlManagedInstanceDefinition(string resourceGroupName, string instanceName) + public SqlManagedInstanceResourceDefinition(string resourceGroupName, string instanceName) : base(ResourceType.SqlManagedInstance, resourceGroupName) { InstanceName = instanceName; diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/VirtualMachineScaleSetsResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/VirtualMachineScaleSetsResourceDefinition.cs new file mode 100644 index 000000000..009b13eb2 --- /dev/null +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/VirtualMachineScaleSetsResourceDefinition.cs @@ -0,0 +1,13 @@ +namespace Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes +{ + public class VirtualMachineScaleSetResourceDefinition : AzureResourceDefinition + { + public VirtualMachineScaleSetResourceDefinition(string resourceGroupName, string scaleSetName) + : base(ResourceType.VirtualMachineScaleSet, resourceGroupName) + { + ScaleSetName = scaleSetName; + } + + public string ScaleSetName { get; } + } +} \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/ResourceType.cs b/src/Promitor.Core.Scraping/Configuration/Model/ResourceType.cs index 0f51cdeeb..a48a0282a 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/ResourceType.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/ResourceType.cs @@ -14,6 +14,7 @@ public enum ResourceType RedisCache = 9, PostgreSql = 10, SqlDatabase = 11, - SqlManagedInstance = 12 + SqlManagedInstance = 12, + VirtualMachineScaleSet = 13 } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/AzureResourceDeserializerFactory.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/AzureResourceDeserializerFactory.cs index d7912e6c6..0a3cd4456 100644 --- a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/AzureResourceDeserializerFactory.cs +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/AzureResourceDeserializerFactory.cs @@ -57,6 +57,9 @@ public IDeserializer GetDeserializerFor(ResourceType case ResourceType.SqlManagedInstance: var sqlManagedInstanceLogger = _loggerFactory.CreateLogger(); return new SqlManagedInstanceDeserializer(sqlManagedInstanceLogger); + case ResourceType.VirtualMachineScaleSet: + var virtualMachineScaleSetLogger = _loggerFactory.CreateLogger(); + return new VirtualMachineScaleSetDeserializer(virtualMachineScaleSetLogger); default: throw new ArgumentOutOfRangeException($"Resource Type {resourceType} not supported."); } 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 4d3783436..073f205c3 100644 --- a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Mapping/V1MappingProfile.cs +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Mapping/V1MappingProfile.cs @@ -33,7 +33,8 @@ public V1MappingProfile() CreateMap(); CreateMap(); CreateMap(); - CreateMap(); + CreateMap(); + CreateMap(); CreateMap(); @@ -52,7 +53,8 @@ public V1MappingProfile() .Include() .Include() .Include() - .Include(); + .Include() + .Include(); } } } diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/VirtualMachineScaleSetResourceV1.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/VirtualMachineScaleSetResourceV1.cs new file mode 100644 index 000000000..0fd1771fc --- /dev/null +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/VirtualMachineScaleSetResourceV1.cs @@ -0,0 +1,13 @@ +namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Model.ResourceTypes +{ + /// + /// Contains the configuration required to scrape a virtual machine scale set. + /// + public class VirtualMachineScaleSetResourceV1 : AzureResourceDefinitionV1 + { + /// + /// The name of the scale set machine to get metrics for. + /// + public string ScaleSetName { get; set; } + } +} diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/VirtualMachineScaleSetDeserializer.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/VirtualMachineScaleSetDeserializer.cs new file mode 100644 index 000000000..4a9bc56c2 --- /dev/null +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/VirtualMachineScaleSetDeserializer.cs @@ -0,0 +1,26 @@ +using Microsoft.Extensions.Logging; +using Promitor.Core.Scraping.Configuration.Serialization.v1.Model; +using Promitor.Core.Scraping.Configuration.Serialization.v1.Model.ResourceTypes; +using YamlDotNet.RepresentationModel; + +namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Providers +{ + public class VirtualMachineScaleSetDeserializer : ResourceDeserializer + { + private const string ScaleSetNameTag = "scaleSetName"; + + public VirtualMachineScaleSetDeserializer(ILogger logger) : base(logger) + { + } + + protected override AzureResourceDefinitionV1 DeserializeResource(YamlMappingNode node) + { + var scaleSetName = node.GetString(ScaleSetNameTag); + + return new VirtualMachineScaleSetResourceV1 + { + ScaleSetName = scaleSetName + }; + } + } +} diff --git a/src/Promitor.Core.Scraping/Factories/MetricScraperFactory.cs b/src/Promitor.Core.Scraping/Factories/MetricScraperFactory.cs index 6a749693e..0f0257915 100644 --- a/src/Promitor.Core.Scraping/Factories/MetricScraperFactory.cs +++ b/src/Promitor.Core.Scraping/Factories/MetricScraperFactory.cs @@ -65,6 +65,8 @@ public IScraper CreateScraper(ResourceType metricDefini return new SqlDatabaseScraper(scraperConfiguration); case ResourceType.SqlManagedInstance: return new SqlManagedInstanceScraper(scraperConfiguration); + case ResourceType.VirtualMachineScaleSet: + return new VirtualMachineScaleSetScraper(scraperConfiguration); default: throw new ArgumentOutOfRangeException(); } diff --git a/src/Promitor.Core.Scraping/ResourceTypes/SqlManagedInstanceScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/SqlManagedInstanceScraper.cs index 6a8843eee..ec748a674 100644 --- a/src/Promitor.Core.Scraping/ResourceTypes/SqlManagedInstanceScraper.cs +++ b/src/Promitor.Core.Scraping/ResourceTypes/SqlManagedInstanceScraper.cs @@ -6,7 +6,7 @@ namespace Promitor.Core.Scraping.ResourceTypes { - public class SqlManagedInstanceScraper : Scraper + public class SqlManagedInstanceScraper : Scraper { private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Sql/managedInstances/{2}"; @@ -18,13 +18,13 @@ public SqlManagedInstanceScraper(ScraperConfiguration scraperConfiguration) : ba { } - protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, SqlManagedInstanceDefinition resourceDefinition, AggregationType aggregationType, TimeSpan aggregationInterval) + protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, SqlManagedInstanceResourceDefinition resourceResourceDefinition, AggregationType aggregationType, TimeSpan aggregationInterval) { var resourceUri = string.Format( ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, - resourceDefinition.InstanceName); + resourceResourceDefinition.InstanceName); var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; diff --git a/src/Promitor.Core.Scraping/ResourceTypes/VirtualMachineScaleSetScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/VirtualMachineScaleSetScraper.cs new file mode 100644 index 000000000..fa4c50416 --- /dev/null +++ b/src/Promitor.Core.Scraping/ResourceTypes/VirtualMachineScaleSetScraper.cs @@ -0,0 +1,29 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Azure.Management.Monitor.Fluent.Models; +using Promitor.Core.Scraping.Configuration.Model.Metrics; +using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; + +namespace Promitor.Core.Scraping.ResourceTypes +{ + internal class VirtualMachineScaleSetScraper : Scraper + { + private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Compute/virtualMachineScaleSets/{2}"; + + public VirtualMachineScaleSetScraper(ScraperConfiguration scraperConfiguration) + : base(scraperConfiguration) + { + } + + protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, VirtualMachineScaleSetResourceDefinition resource, AggregationType aggregationType, TimeSpan aggregationInterval) + { + var resourceUri = string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, resource.ScaleSetName); + + var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; + var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; + var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName,dimensionName, aggregationType, aggregationInterval, resourceUri); + + return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, resource.ScaleSetName, resourceUri, foundMetricValue); + } + } +} \ No newline at end of file diff --git a/src/Promitor.Scraper.Host/Validation/Factories/MetricValidatorFactory.cs b/src/Promitor.Scraper.Host/Validation/Factories/MetricValidatorFactory.cs index d4b969d0a..57df7355f 100644 --- a/src/Promitor.Scraper.Host/Validation/Factories/MetricValidatorFactory.cs +++ b/src/Promitor.Scraper.Host/Validation/Factories/MetricValidatorFactory.cs @@ -35,6 +35,8 @@ internal static IMetricValidator GetValidatorFor(ResourceType resourceType) return new SqlDatabaseMetricValidator(); case ResourceType.SqlManagedInstance: return new SqlManagedInstanceMetricValidator(); + case ResourceType.VirtualMachineScaleSet: + return new VirtualMachineScaleSetMetricValidator(); } throw new ArgumentOutOfRangeException(nameof(resourceType), $"No validation rules are defined for metric type '{resourceType}'"); diff --git a/src/Promitor.Scraper.Host/Validation/MetricDefinitions/ResourceTypes/SqlManagedInstanceMetricValidator.cs b/src/Promitor.Scraper.Host/Validation/MetricDefinitions/ResourceTypes/SqlManagedInstanceMetricValidator.cs index ec54db383..1865c5f3b 100644 --- a/src/Promitor.Scraper.Host/Validation/MetricDefinitions/ResourceTypes/SqlManagedInstanceMetricValidator.cs +++ b/src/Promitor.Scraper.Host/Validation/MetricDefinitions/ResourceTypes/SqlManagedInstanceMetricValidator.cs @@ -17,7 +17,7 @@ public IEnumerable Validate(MetricDefinition metricDefinition) { Guard.NotNull(metricDefinition, nameof(metricDefinition)); - foreach (var definition in metricDefinition.Resources.Cast()) + foreach (var definition in metricDefinition.Resources.Cast()) { if (string.IsNullOrWhiteSpace(definition.InstanceName)) { diff --git a/src/Promitor.Scraper.Host/Validation/MetricDefinitions/ResourceTypes/VirtualMachineScaleSetMetricValidator.cs b/src/Promitor.Scraper.Host/Validation/MetricDefinitions/ResourceTypes/VirtualMachineScaleSetMetricValidator.cs new file mode 100644 index 000000000..c19522335 --- /dev/null +++ b/src/Promitor.Scraper.Host/Validation/MetricDefinitions/ResourceTypes/VirtualMachineScaleSetMetricValidator.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using System.Linq; +using GuardNet; +using Promitor.Core.Scraping.Configuration.Model.Metrics; +using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; +using Promitor.Scraper.Host.Validation.MetricDefinitions.Interfaces; + +namespace Promitor.Scraper.Host.Validation.MetricDefinitions.ResourceTypes +{ + internal class VirtualMachineScaleSetMetricValidator : IMetricValidator + { + public IEnumerable Validate(MetricDefinition metricDefinition) + { + Guard.NotNull(metricDefinition, nameof(metricDefinition)); + + foreach (var resourceDefinition in metricDefinition.Resources.Cast()) + { + if (string.IsNullOrWhiteSpace(resourceDefinition.ScaleSetName)) + { + yield return "No virtual machine scale set name is configured"; + } + } + } + } +} \ No newline at end of file diff --git a/src/Promitor.Scraper.Tests.Unit/Builders/Metrics/v1/MetricsDeclarationBuilder.cs b/src/Promitor.Scraper.Tests.Unit/Builders/Metrics/v1/MetricsDeclarationBuilder.cs index efdec40da..7431608ad 100644 --- a/src/Promitor.Scraper.Tests.Unit/Builders/Metrics/v1/MetricsDeclarationBuilder.cs +++ b/src/Promitor.Scraper.Tests.Unit/Builders/Metrics/v1/MetricsDeclarationBuilder.cs @@ -213,6 +213,28 @@ public string Build(IMapper mapper) 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") + { + 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); + + 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") { var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); diff --git a/src/Promitor.Scraper.Tests.Unit/Serialization/v1/Providers/VirtualMachineScaleSetDeserializerTests.cs b/src/Promitor.Scraper.Tests.Unit/Serialization/v1/Providers/VirtualMachineScaleSetDeserializerTests.cs new file mode 100644 index 000000000..abeded123 --- /dev/null +++ b/src/Promitor.Scraper.Tests.Unit/Serialization/v1/Providers/VirtualMachineScaleSetDeserializerTests.cs @@ -0,0 +1,44 @@ +using System.ComponentModel; +using Promitor.Core.Scraping.Configuration.Serialization; +using Promitor.Core.Scraping.Configuration.Serialization.v1.Model; +using Promitor.Core.Scraping.Configuration.Serialization.v1.Model.ResourceTypes; +using Promitor.Core.Scraping.Configuration.Serialization.v1.Providers; +using Xunit; + +namespace Promitor.Scraper.Tests.Unit.Serialization.v1.Providers +{ + [Category("Unit")] + public class VirtualMachineScaleSetDeserializerTests : ResourceDeserializerTest + { + private readonly VirtualMachineScaleSetDeserializer _deserializer; + + public VirtualMachineScaleSetDeserializerTests() + { + _deserializer = new VirtualMachineScaleSetDeserializer(Logger); + } + + [Fact] + public void Deserialize_ScaleSetNameSupplied_SetsName() + { + YamlAssert.PropertySet( + _deserializer, + "scaleSetName: promitor-vmss", + "promitor-vmss", + r => r.ScaleSetName); + } + + [Fact] + public void Deserialize_ScaleSetNameNotSupplied_Null() + { + YamlAssert.PropertyNull( + _deserializer, + "resourceGroupName: promitor-group", + r => r.ScaleSetName); + } + + protected override IDeserializer CreateDeserializer() + { + return new VirtualMachineScaleSetDeserializer(Logger); + } + } +} diff --git a/src/Promitor.Scraper.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineScaleSetMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Scraper.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineScaleSetMetricsDeclarationValidationStepsTests.cs new file mode 100644 index 000000000..03fbc18fc --- /dev/null +++ b/src/Promitor.Scraper.Tests.Unit/Validation/Metrics/ResourceTypes/VirtualMachineScaleSetMetricsDeclarationValidationStepsTests.cs @@ -0,0 +1,107 @@ +using System.ComponentModel; +using AutoMapper; +using Promitor.Core.Scraping.Configuration.Serialization.v1.Mapping; +using Promitor.Scraper.Host.Validation.Steps; +using Promitor.Scraper.Tests.Unit.Builders.Metrics.v1; +using Promitor.Scraper.Tests.Unit.Stubs; +using Xunit; + +namespace Promitor.Scraper.Tests.Unit.Validation.Metrics.ResourceTypes +{ + [Category("Unit")] + public class VirtualMachineScaleSetMetricsDeclarationValidationStepsTests + { + private readonly IMapper _mapper; + + public VirtualMachineScaleSetMetricsDeclarationValidationStepsTests() + { + var config = new MapperConfiguration(c => c.AddProfile()); + _mapper = config.CreateMapper(); + } + + [Fact] + public void VirtualMachineScaleSetMetricsDeclaration_DeclarationWithoutAzureMetricName_Succeeds() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithVirtualMachineScaleSetMetric(azureMetricName: string.Empty) + .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 VirtualMachineScaleSetMetricsDeclaration_DeclarationWithoutMetricDescription_Succeeded() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithVirtualMachineScaleSetMetric(metricDescription: string.Empty) + .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 VirtualMachineScaleSetMetricsDeclaration_DeclarationWithoutMetricName_Fails() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithVirtualMachineScaleSetMetric(string.Empty) + .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 VirtualMachineScaleSetMetricsDeclaration_DeclarationWithoutVirtualMachineName_Fails() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithVirtualMachineScaleSetMetric(scaleSetName: string.Empty) + .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 VirtualMachineScaleSetMetricsDeclaration_ValidDeclaration_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithVirtualMachineScaleSetMetric() + .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"); + } + } +} \ No newline at end of file