From 95f1a06a3fff54d443f1df3168c934b28259f067 Mon Sep 17 00:00:00 2001 From: Christian Eder Date: Tue, 5 May 2020 16:30:46 +0200 Subject: [PATCH 01/18] Add configuration classes --- .../ResourceTypes/IotHubResourceDefinition.cs | 16 +++++++ .../Configuration/Model/ResourceType.cs | 1 + .../Core/AzureResourceDeserializerFactory.cs | 3 ++ .../Model/ResourceTypes/IotHubResourceV1.cs | 13 ++++++ .../v1/Providers/IotHubDeserializer.cs | 13 ++++++ .../v1/Providers/IotHubDeserializerTests.cs | 43 +++++++++++++++++++ 6 files changed, 89 insertions(+) create mode 100644 src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/IotHubResourceDefinition.cs create mode 100644 src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/IotHubResourceV1.cs create mode 100644 src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/IotHubDeserializer.cs create mode 100644 src/Promitor.Tests.Unit/Serialization/v1/Providers/IotHubDeserializerTests.cs diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/IotHubResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/IotHubResourceDefinition.cs new file mode 100644 index 000000000..eee3d1efe --- /dev/null +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/IotHubResourceDefinition.cs @@ -0,0 +1,16 @@ +namespace Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes +{ + public class IotHubResourceDefinition : AzureResourceDefinition + { + public IotHubResourceDefinition(string subscriptionId, string resourceGroupName, string iotHubName) + : base(ResourceType.IotHub, subscriptionId, resourceGroupName) + { + IotHubName = iotHubName; + } + + public string IotHubName { get; } + + /// + public override string GetResourceName() => IotHubName; + } +} \ 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 59e477c20..e5be09c42 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/ResourceType.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/ResourceType.cs @@ -24,5 +24,6 @@ public enum ResourceType FileStorage = 19, StorageAccount = 20, ApiManagement = 21, + IotHub = 22, } } \ 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 96a0e9937..bbaf92793 100644 --- a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/AzureResourceDeserializerFactory.cs +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/AzureResourceDeserializerFactory.cs @@ -84,6 +84,9 @@ public IDeserializer GetDeserializerFor(ResourceType case ResourceType.FileStorage: var fileStorageLogger = _loggerFactory.CreateLogger(); return new FileStorageDeserializer(fileStorageLogger); + case ResourceType.IotHub: + var iotHubLogger = _loggerFactory.CreateLogger(); + return new IotHubDeserializer(iotHubLogger); default: throw new ArgumentOutOfRangeException($"Resource Type {resourceType} not supported."); } diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/IotHubResourceV1.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/IotHubResourceV1.cs new file mode 100644 index 000000000..1b21b1a58 --- /dev/null +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/IotHubResourceV1.cs @@ -0,0 +1,13 @@ +namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Model.ResourceTypes +{ + /// + /// Contains the configuration required to scrape an Azure IoT Hub. + /// + public class IotHubResourceV1 : AzureResourceDefinitionV1 + { + /// + /// The name of the Azure IoT Hub to get metrics for. + /// + public string IotHubName { get; set; } + } +} diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/IotHubDeserializer.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/IotHubDeserializer.cs new file mode 100644 index 000000000..52c31ad6b --- /dev/null +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/IotHubDeserializer.cs @@ -0,0 +1,13 @@ +using Microsoft.Extensions.Logging; +using Promitor.Core.Scraping.Configuration.Serialization.v1.Model.ResourceTypes; + +namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Providers +{ + public class IotHubDeserializer : ResourceDeserializer + { + public IotHubDeserializer(ILogger logger) : base(logger) + { + MapRequired(resource => resource.IotHubName); + } + } +} diff --git a/src/Promitor.Tests.Unit/Serialization/v1/Providers/IotHubDeserializerTests.cs b/src/Promitor.Tests.Unit/Serialization/v1/Providers/IotHubDeserializerTests.cs new file mode 100644 index 000000000..7c126f9fb --- /dev/null +++ b/src/Promitor.Tests.Unit/Serialization/v1/Providers/IotHubDeserializerTests.cs @@ -0,0 +1,43 @@ +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.Tests.Unit.Serialization.v1.Providers +{ + public class IotHubDeserializerTests : ResourceDeserializerTest + { + private readonly IotHubDeserializer _deserializer; + + public IotHubDeserializerTests() + { + _deserializer = new IotHubDeserializer(Logger); + } + + [Fact] + public void Deserialize_IotHubNameSupplied_SetsIotHubName() + { + const string iotHubName = "promitor-iot-hub"; + YamlAssert.PropertySet( + _deserializer, + $"iotHubName: {iotHubName}", + iotHubName, + r => r.IotHubName); + } + + [Fact] + public void Deserialize_IotHubNameNotSupplied_Null() + { + YamlAssert.PropertyNull( + _deserializer, + "resourceGroupName: promitor-group", + r => r.IotHubName); + } + + protected override IDeserializer CreateDeserializer() + { + return new IotHubDeserializer(Logger); + } + } +} \ No newline at end of file From 139995d3d6d09ceba7fc57f4a9a39aa954ec8d68 Mon Sep 17 00:00:00 2001 From: Christian Eder Date: Tue, 5 May 2020 17:00:41 +0200 Subject: [PATCH 02/18] Added Validation classes and tests, updated contribution docs --- adding-a-new-scraper.md | 3 +- .../Factories/MetricValidatorFactory.cs | 2 + .../ResourceTypes/IotHubMetricValidator.cs | 25 +++++ .../v1/Mapping/V1MappingProfile.cs | 4 +- .../Metrics/v1/MetricsDeclarationBuilder.cs | 22 +++++ .../v1/Providers/IotHubDeserializerTests.cs | 2 + ...bMetricsDeclarationValidationStepsTests.cs | 97 +++++++++++++++++++ 7 files changed, 153 insertions(+), 2 deletions(-) create mode 100644 src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs create mode 100644 src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IotHubMetricsDeclarationValidationStepsTests.cs diff --git a/adding-a-new-scraper.md b/adding-a-new-scraper.md index 77c95ae95..e5d75637b 100644 --- a/adding-a-new-scraper.md +++ b/adding-a-new-scraper.md @@ -27,7 +27,8 @@ discuss your scenario_ 5. Update `Promitor.Core.Scraping.Configuration.v1.Core.AzureResourceDeserializerFactory` to handle your new resource type by returning a new instance of the Deserializer you created in the previous step. -6. Provide a unit test in `.\src\Promitor.Tests.Unit\Serialization\v1\Providers` +6. Update the `Promitor.Core.Scraping.Configuration.Serialization.v1.Mapping.V1MappingProfile` to handle your new resource type by mapping the `ResourceV1` to `ResourceDefinition` +7. Provide a unit test in `.\src\Promitor.Tests.Unit\Serialization\v1\Providers` that tests the deserialization based on our sample. Your test class must inherit from `ResourceDeserializerTest` to ensure the inherited functionality is tested. diff --git a/src/Promitor.Agents.Scraper/Validation/Factories/MetricValidatorFactory.cs b/src/Promitor.Agents.Scraper/Validation/Factories/MetricValidatorFactory.cs index 08fa382ac..25ff53c98 100644 --- a/src/Promitor.Agents.Scraper/Validation/Factories/MetricValidatorFactory.cs +++ b/src/Promitor.Agents.Scraper/Validation/Factories/MetricValidatorFactory.cs @@ -53,6 +53,8 @@ internal static IMetricValidator GetValidatorFor(ResourceType resourceType) return new FileStorageMetricValidator(); case ResourceType.SqlServer: return new SqlServerMetricValidator(); + case ResourceType.IotHub: + return new IotHubMetricValidator(); } throw new ArgumentOutOfRangeException(nameof(resourceType), $"No validation rules are defined for metric type '{resourceType}'"); diff --git a/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs new file mode 100644 index 000000000..c160c74b3 --- /dev/null +++ b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.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.Agents.Scraper.Validation.MetricDefinitions.Interfaces; + +namespace Promitor.Agents.Scraper.Validation.MetricDefinitions.ResourceTypes +{ + internal class IotHubMetricValidator : IMetricValidator + { + public IEnumerable Validate(MetricDefinition metricDefinition) + { + Guard.NotNull(metricDefinition, nameof(metricDefinition)); + + foreach (var resourceDefinition in metricDefinition.Resources.Cast()) + { + if (string.IsNullOrWhiteSpace(resourceDefinition.IotHubName)) + { + yield return "No iot hub name is configured"; + } + } + } + } +} \ No newline at end of file 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 dd600f2a6..ed7fc12f3 100644 --- a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Mapping/V1MappingProfile.cs +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Mapping/V1MappingProfile.cs @@ -43,6 +43,7 @@ public V1MappingProfile() CreateMap(); CreateMap(); CreateMap(); + CreateMap(); CreateMap(); @@ -70,7 +71,8 @@ public V1MappingProfile() .Include() .Include() .Include() - .Include(); + .Include() + .Include(); } } } diff --git a/src/Promitor.Tests.Unit/Builders/Metrics/v1/MetricsDeclarationBuilder.cs b/src/Promitor.Tests.Unit/Builders/Metrics/v1/MetricsDeclarationBuilder.cs index 9d90a9979..ce5f479a4 100644 --- a/src/Promitor.Tests.Unit/Builders/Metrics/v1/MetricsDeclarationBuilder.cs +++ b/src/Promitor.Tests.Unit/Builders/Metrics/v1/MetricsDeclarationBuilder.cs @@ -581,5 +581,27 @@ public MetricsDeclarationBuilder WithSqlManagedInstanceMetric( 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") + { + 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); + + return this; + } } } \ No newline at end of file diff --git a/src/Promitor.Tests.Unit/Serialization/v1/Providers/IotHubDeserializerTests.cs b/src/Promitor.Tests.Unit/Serialization/v1/Providers/IotHubDeserializerTests.cs index 7c126f9fb..cfb12ef46 100644 --- a/src/Promitor.Tests.Unit/Serialization/v1/Providers/IotHubDeserializerTests.cs +++ b/src/Promitor.Tests.Unit/Serialization/v1/Providers/IotHubDeserializerTests.cs @@ -2,10 +2,12 @@ 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 System.ComponentModel; using Xunit; namespace Promitor.Tests.Unit.Serialization.v1.Providers { + [Category("Unit")] public class IotHubDeserializerTests : ResourceDeserializerTest { private readonly IotHubDeserializer _deserializer; diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IotHubMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IotHubMetricsDeclarationValidationStepsTests.cs new file mode 100644 index 000000000..09079dadd --- /dev/null +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IotHubMetricsDeclarationValidationStepsTests.cs @@ -0,0 +1,97 @@ +using System.ComponentModel; +using Promitor.Agents.Scraper.Validation.Steps; +using Promitor.Tests.Unit.Builders.Metrics.v1; +using Promitor.Tests.Unit.Stubs; +using Xunit; + +namespace Promitor.Tests.Unit.Validation.Metrics.ResourceTypes +{ + [Category("Unit")] + public class IotHubMetricsDeclarationValidationStepsTests : MetricsDeclarationValidationStepsTests + { + [Fact] + public void IotHubMetricsDeclaration_DeclarationWithoutAzureMetricName_Fails() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithIotHubMetric(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 IotHubMetricsDeclaration_DeclarationWithoutMetricDescription_Succeeded() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithIotHubMetric(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 IotHubMetricsDeclaration_DeclarationWithoutMetricName_Fails() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithIotHubMetric(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 IotHubMetricsDeclaration_DeclarationWithoutIotHubName_Fails() + { + // Arrange + var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithIotHubMetric(iotHubName: 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 IotHubMetricsDeclaration_ValidDeclaration_Succeeds() + { + // Arrange + var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() + .WithIotHubMetric() + .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 From 7167b2982ea58c3839e77dd6ee4c4914849352c9 Mon Sep 17 00:00:00 2001 From: Christian Eder Date: Wed, 6 May 2020 07:14:44 +0200 Subject: [PATCH 03/18] add IoT Hub Scraper --- .../Factories/MetricScraperFactory.cs | 2 ++ src/Promitor.Core.Scraping/IotHubScraper.cs | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/Promitor.Core.Scraping/IotHubScraper.cs diff --git a/src/Promitor.Core.Scraping/Factories/MetricScraperFactory.cs b/src/Promitor.Core.Scraping/Factories/MetricScraperFactory.cs index 8c74ed060..c0234d98a 100644 --- a/src/Promitor.Core.Scraping/Factories/MetricScraperFactory.cs +++ b/src/Promitor.Core.Scraping/Factories/MetricScraperFactory.cs @@ -77,6 +77,8 @@ public IScraper CreateScraper(ResourceType metricDefin return new BlobStorageScraper(scraperConfiguration); case ResourceType.FileStorage: return new FileStorageScraper(scraperConfiguration); + case ResourceType.IotHub: + return new IotHubScraper(scraperConfiguration); default: throw new ArgumentOutOfRangeException(); } diff --git a/src/Promitor.Core.Scraping/IotHubScraper.cs b/src/Promitor.Core.Scraping/IotHubScraper.cs new file mode 100644 index 000000000..a4b8b41ec --- /dev/null +++ b/src/Promitor.Core.Scraping/IotHubScraper.cs @@ -0,0 +1,26 @@ +using Promitor.Core.Scraping.Configuration.Model.Metrics; +using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; + +// ReSharper disable All + +namespace Promitor.Core.Scraping +{ + /// + /// Scrapes an Azure IoT Hub + /// + public class IotHubScraper : AzureMonitorScraper + { + private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Devices/IotHubs/{2}"; + + public IotHubScraper(ScraperConfiguration scraperConfiguration) : + base(scraperConfiguration) + { + } + + /// + protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, IotHubResourceDefinition resource) + { + return string.Format(ResourceUriTemplate, subscriptionId, scrapeDefinition.ResourceGroupName, resource.IotHubName); + } + } +} \ No newline at end of file From 742b19cc4a8dedbe6ea66ecbbdc52894502084c3 Mon Sep 17 00:00:00 2001 From: Christian Eder Date: Wed, 6 May 2020 07:25:58 +0200 Subject: [PATCH 04/18] add docs --- adding-a-new-scraper.md | 2 +- docs/configuration/v1.x/metrics/index.md | 1 + docs/configuration/v1.x/metrics/iot-hub.md | 34 ++++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 docs/configuration/v1.x/metrics/iot-hub.md diff --git a/adding-a-new-scraper.md b/adding-a-new-scraper.md index e5d75637b..a4ee3259d 100644 --- a/adding-a-new-scraper.md +++ b/adding-a-new-scraper.md @@ -75,4 +75,4 @@ Please provide documentation on the following: 2. What fields need to be configured and what they are for. 3. An example configuration. -This should be provided in a new file under `docs\configuration\metrics`. +This should be provided in a new file under `docs\configuration\v1.x\metrics`. Please also update the file `docs/configuration/v1.x/metrics/index.md` to include your new file. diff --git a/docs/configuration/v1.x/metrics/index.md b/docs/configuration/v1.x/metrics/index.md index 602cd1dc2..d06044f55 100644 --- a/docs/configuration/v1.x/metrics/index.md +++ b/docs/configuration/v1.x/metrics/index.md @@ -140,6 +140,7 @@ We also provide a simplified way to scrape the following Azure resources: - [Azure Virtual Machine](virtual-machine) - [Azure Virtual Machine Scale Set (VMSS)](virtual-machine-scale-set) - [Azure Web App](web-app) +- [Azure IoT Hub](iot-hub) 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/iot-hub.md b/docs/configuration/v1.x/metrics/iot-hub.md new file mode 100644 index 000000000..d03c48d6b --- /dev/null +++ b/docs/configuration/v1.x/metrics/iot-hub.md @@ -0,0 +1,34 @@ +--- +layout: default +title: Azure IoT Hub Declaration +--- + +## Azure IoT Hub - ![Availability Badge](https://img.shields.io/badge/Available%20Starting-v1.4-green.svg) + +You can declare to scrape an Azure IoT Hub via the `IotHub` resource type. + +The following fields need to be provided: + +- `iotHubName` - The name of the Azure IoT Hub + +All supported metrics are documented in the official [Azure Monitor documentation](https://docs.microsoft.com/en-us/azure/azure-monitor/platform/metrics-supported#microsoftdevicesiothubs). + +Example: + +```yaml +name: azure_iot_hub_total_devices +description: "The number of devices registered to your IoT hub" +resourceType: IotHub +azureMetricConfiguration: + metricName: devices.totalDevices + aggregation: + type: Total +resources: +- iotHubName: promitor-1 +- iotHubName: promitor-2 +``` + + +[← back to metrics declarations](/configuration/v1.x/metrics)
+[← back to introduction](/) + From 9c76a34a771e8fdd46ce38dfe1f515f504a89335 Mon Sep 17 00:00:00 2001 From: Christian Eder Date: Wed, 6 May 2020 07:28:40 +0200 Subject: [PATCH 05/18] casing --- .../MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs index c160c74b3..78b2a194a 100644 --- a/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs +++ b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs @@ -17,7 +17,7 @@ public IEnumerable Validate(MetricDefinition metricDefinition) { if (string.IsNullOrWhiteSpace(resourceDefinition.IotHubName)) { - yield return "No iot hub name is configured"; + yield return "No IoT Hub name is configured"; } } } From 0f357fbccdd2b7963562860d5e271fb0f9edc2dd Mon Sep 17 00:00:00 2001 From: Christian Eder Date: Wed, 6 May 2020 07:39:05 +0200 Subject: [PATCH 06/18] fix docs linting --- adding-a-new-scraper.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/adding-a-new-scraper.md b/adding-a-new-scraper.md index a4ee3259d..2f63a944a 100644 --- a/adding-a-new-scraper.md +++ b/adding-a-new-scraper.md @@ -75,4 +75,5 @@ Please provide documentation on the following: 2. What fields need to be configured and what they are for. 3. An example configuration. -This should be provided in a new file under `docs\configuration\v1.x\metrics`. Please also update the file `docs/configuration/v1.x/metrics/index.md` to include your new file. +This should be provided in a new file under `docs\configuration\v1.x\metrics`. +Please also update the file `docs/configuration/v1.x/metrics/index.md` to include your new file. From a55f584de994e7ec68108850f4e4065295be28a7 Mon Sep 17 00:00:00 2001 From: Christian Eder Date: Wed, 6 May 2020 07:48:46 +0200 Subject: [PATCH 07/18] set availability badge to v1.6 --- docs/configuration/v1.x/metrics/iot-hub.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration/v1.x/metrics/iot-hub.md b/docs/configuration/v1.x/metrics/iot-hub.md index d03c48d6b..88a593f5a 100644 --- a/docs/configuration/v1.x/metrics/iot-hub.md +++ b/docs/configuration/v1.x/metrics/iot-hub.md @@ -3,7 +3,7 @@ layout: default title: Azure IoT Hub Declaration --- -## Azure IoT Hub - ![Availability Badge](https://img.shields.io/badge/Available%20Starting-v1.4-green.svg) +## Azure IoT Hub - ![Availability Badge](https://img.shields.io/badge/Available%20Starting-v1.6-green.svg) You can declare to scrape an Azure IoT Hub via the `IotHub` resource type. From a6bf8f17202b645badc94fb57fd7d5067dc044a3 Mon Sep 17 00:00:00 2001 From: Christian Eder Date: Wed, 6 May 2020 07:54:49 +0200 Subject: [PATCH 08/18] add entry to changelog --- changelog/content/experimental/unreleased.md | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog/content/experimental/unreleased.md b/changelog/content/experimental/unreleased.md index bf91ec6db..c50da55dc 100644 --- a/changelog/content/experimental/unreleased.md +++ b/changelog/content/experimental/unreleased.md @@ -9,3 +9,4 @@ version: v1.6.0 - {{% tag added %}} Support for defining default metric labels ([docs](https://promitor.io/configuration/v1.x/metrics/) | [#933](https://github.com/tomkerkhove/promitor/issues/933)) - {{% tag added %}} Support for Kubernetes RBAC in Helm chart ([Helm Hub](https://hub.helm.sh/charts/promitor/promitor-agent-scraper) | [#951](https://github.com/tomkerkhove/promitor/issues/951)) - {{% tag added %}} Support for configuring Pod Security Policy in Helm Chart ([Helm Hub](https://hub.helm.sh/charts/promitor/promitor-agent-scraper) | [#952](https://github.com/tomkerkhove/promitor/issues/952)) +- {{% tag added %}} Support for scraping Azure IoT Hub metrics ([docs](https://promitor.io/configuration/v1.x/metrics/iot-hub) | [#372](https://github.com/tomkerkhove/promitor/issues/372)) From 5546e3c3979025cc04c3a592adf8e99f9d72cf4b Mon Sep 17 00:00:00 2001 From: Christian Eder Date: Wed, 6 May 2020 07:56:59 +0200 Subject: [PATCH 09/18] linter again --- adding-a-new-scraper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adding-a-new-scraper.md b/adding-a-new-scraper.md index 2f63a944a..a96a40e73 100644 --- a/adding-a-new-scraper.md +++ b/adding-a-new-scraper.md @@ -75,5 +75,5 @@ Please provide documentation on the following: 2. What fields need to be configured and what they are for. 3. An example configuration. -This should be provided in a new file under `docs\configuration\v1.x\metrics`. +This should be provided in a new file under `docs\configuration\v1.x\metrics`. Please also update the file `docs/configuration/v1.x/metrics/index.md` to include your new file. From b7cb2196527351ce9a0236eb3a187073449f9137 Mon Sep 17 00:00:00 2001 From: Christian Eder Date: Wed, 6 May 2020 16:58:11 +0200 Subject: [PATCH 10/18] Iot --> IoT --- docs/configuration/v1.x/metrics/iot-hub.md | 4 ++-- .../Factories/MetricValidatorFactory.cs | 4 ++-- .../ResourceTypes/IotHubMetricValidator.cs | 6 ++--- .../ResourceTypes/IotHubResourceDefinition.cs | 12 +++++----- .../Configuration/Model/ResourceType.cs | 2 +- .../Core/AzureResourceDeserializerFactory.cs | 6 ++--- .../v1/Mapping/V1MappingProfile.cs | 4 ++-- .../Model/ResourceTypes/IotHubResourceV1.cs | 4 ++-- .../v1/Providers/IotHubDeserializer.cs | 6 ++--- .../Factories/MetricScraperFactory.cs | 4 ++-- src/Promitor.Core.Scraping/IotHubScraper.cs | 8 +++---- .../Metrics/v1/MetricsDeclarationBuilder.cs | 8 +++---- .../v1/Providers/IotHubDeserializerTests.cs | 22 +++++++++---------- ...bMetricsDeclarationValidationStepsTests.cs | 22 +++++++++---------- 14 files changed, 56 insertions(+), 56 deletions(-) diff --git a/docs/configuration/v1.x/metrics/iot-hub.md b/docs/configuration/v1.x/metrics/iot-hub.md index 88a593f5a..7776c04f4 100644 --- a/docs/configuration/v1.x/metrics/iot-hub.md +++ b/docs/configuration/v1.x/metrics/iot-hub.md @@ -5,7 +5,7 @@ title: Azure IoT Hub Declaration ## Azure IoT Hub - ![Availability Badge](https://img.shields.io/badge/Available%20Starting-v1.6-green.svg) -You can declare to scrape an Azure IoT Hub via the `IotHub` resource type. +You can declare to scrape an Azure IoT Hub via the `IoTHub` resource type. The following fields need to be provided: @@ -18,7 +18,7 @@ Example: ```yaml name: azure_iot_hub_total_devices description: "The number of devices registered to your IoT hub" -resourceType: IotHub +resourceType: IoTHub azureMetricConfiguration: metricName: devices.totalDevices aggregation: diff --git a/src/Promitor.Agents.Scraper/Validation/Factories/MetricValidatorFactory.cs b/src/Promitor.Agents.Scraper/Validation/Factories/MetricValidatorFactory.cs index 25ff53c98..700397e12 100644 --- a/src/Promitor.Agents.Scraper/Validation/Factories/MetricValidatorFactory.cs +++ b/src/Promitor.Agents.Scraper/Validation/Factories/MetricValidatorFactory.cs @@ -53,8 +53,8 @@ internal static IMetricValidator GetValidatorFor(ResourceType resourceType) return new FileStorageMetricValidator(); case ResourceType.SqlServer: return new SqlServerMetricValidator(); - case ResourceType.IotHub: - return new IotHubMetricValidator(); + case ResourceType.IoTHub: + return new IoTHubMetricValidator(); } throw new ArgumentOutOfRangeException(nameof(resourceType), $"No validation rules are defined for metric type '{resourceType}'"); diff --git a/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs index 78b2a194a..a92e89165 100644 --- a/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs +++ b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs @@ -7,15 +7,15 @@ namespace Promitor.Agents.Scraper.Validation.MetricDefinitions.ResourceTypes { - internal class IotHubMetricValidator : IMetricValidator + internal class IoTHubMetricValidator : IMetricValidator { public IEnumerable Validate(MetricDefinition metricDefinition) { Guard.NotNull(metricDefinition, nameof(metricDefinition)); - foreach (var resourceDefinition in metricDefinition.Resources.Cast()) + foreach (var resourceDefinition in metricDefinition.Resources.Cast()) { - if (string.IsNullOrWhiteSpace(resourceDefinition.IotHubName)) + if (string.IsNullOrWhiteSpace(resourceDefinition.IoTHubName)) { yield return "No IoT Hub name is configured"; } diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/IotHubResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/IotHubResourceDefinition.cs index eee3d1efe..c8ed74143 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/IotHubResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/IotHubResourceDefinition.cs @@ -1,16 +1,16 @@ namespace Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes { - public class IotHubResourceDefinition : AzureResourceDefinition + public class IoTHubResourceDefinition : AzureResourceDefinition { - public IotHubResourceDefinition(string subscriptionId, string resourceGroupName, string iotHubName) - : base(ResourceType.IotHub, subscriptionId, resourceGroupName) + public IoTHubResourceDefinition(string subscriptionId, string resourceGroupName, string iotHubName) + : base(ResourceType.IoTHub, subscriptionId, resourceGroupName) { - IotHubName = iotHubName; + IoTHubName = iotHubName; } - public string IotHubName { get; } + public string IoTHubName { get; } /// - public override string GetResourceName() => IotHubName; + public override string GetResourceName() => IoTHubName; } } \ 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 e5be09c42..cd6baa702 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/ResourceType.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/ResourceType.cs @@ -24,6 +24,6 @@ public enum ResourceType FileStorage = 19, StorageAccount = 20, ApiManagement = 21, - IotHub = 22, + IoTHub = 22, } } \ 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 bbaf92793..2d421aa7c 100644 --- a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/AzureResourceDeserializerFactory.cs +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/AzureResourceDeserializerFactory.cs @@ -84,9 +84,9 @@ public IDeserializer GetDeserializerFor(ResourceType case ResourceType.FileStorage: var fileStorageLogger = _loggerFactory.CreateLogger(); return new FileStorageDeserializer(fileStorageLogger); - case ResourceType.IotHub: - var iotHubLogger = _loggerFactory.CreateLogger(); - return new IotHubDeserializer(iotHubLogger); + case ResourceType.IoTHub: + var iotHubLogger = _loggerFactory.CreateLogger(); + return new IoTHubDeserializer(iotHubLogger); 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 ed7fc12f3..1982a0061 100644 --- a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Mapping/V1MappingProfile.cs +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Mapping/V1MappingProfile.cs @@ -43,7 +43,7 @@ public V1MappingProfile() CreateMap(); CreateMap(); CreateMap(); - CreateMap(); + CreateMap(); CreateMap(); @@ -72,7 +72,7 @@ public V1MappingProfile() .Include() .Include() .Include() - .Include(); + .Include(); } } } diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/IotHubResourceV1.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/IotHubResourceV1.cs index 1b21b1a58..07a869b0b 100644 --- a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/IotHubResourceV1.cs +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/IotHubResourceV1.cs @@ -3,11 +3,11 @@ /// /// Contains the configuration required to scrape an Azure IoT Hub. /// - public class IotHubResourceV1 : AzureResourceDefinitionV1 + public class IoTHubResourceV1 : AzureResourceDefinitionV1 { /// /// The name of the Azure IoT Hub to get metrics for. /// - public string IotHubName { get; set; } + public string IoTHubName { get; set; } } } diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/IotHubDeserializer.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/IotHubDeserializer.cs index 52c31ad6b..e69888443 100644 --- a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/IotHubDeserializer.cs +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/IotHubDeserializer.cs @@ -3,11 +3,11 @@ namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Providers { - public class IotHubDeserializer : ResourceDeserializer + public class IoTHubDeserializer : ResourceDeserializer { - public IotHubDeserializer(ILogger logger) : base(logger) + public IoTHubDeserializer(ILogger logger) : base(logger) { - MapRequired(resource => resource.IotHubName); + MapRequired(resource => resource.IoTHubName); } } } diff --git a/src/Promitor.Core.Scraping/Factories/MetricScraperFactory.cs b/src/Promitor.Core.Scraping/Factories/MetricScraperFactory.cs index c0234d98a..e8e07b3e6 100644 --- a/src/Promitor.Core.Scraping/Factories/MetricScraperFactory.cs +++ b/src/Promitor.Core.Scraping/Factories/MetricScraperFactory.cs @@ -77,8 +77,8 @@ public IScraper CreateScraper(ResourceType metricDefin return new BlobStorageScraper(scraperConfiguration); case ResourceType.FileStorage: return new FileStorageScraper(scraperConfiguration); - case ResourceType.IotHub: - return new IotHubScraper(scraperConfiguration); + case ResourceType.IoTHub: + return new IoTHubScraper(scraperConfiguration); default: throw new ArgumentOutOfRangeException(); } diff --git a/src/Promitor.Core.Scraping/IotHubScraper.cs b/src/Promitor.Core.Scraping/IotHubScraper.cs index a4b8b41ec..6173e033a 100644 --- a/src/Promitor.Core.Scraping/IotHubScraper.cs +++ b/src/Promitor.Core.Scraping/IotHubScraper.cs @@ -8,19 +8,19 @@ namespace Promitor.Core.Scraping /// /// Scrapes an Azure IoT Hub /// - public class IotHubScraper : AzureMonitorScraper + public class IoTHubScraper : AzureMonitorScraper { private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Devices/IotHubs/{2}"; - public IotHubScraper(ScraperConfiguration scraperConfiguration) : + public IoTHubScraper(ScraperConfiguration scraperConfiguration) : base(scraperConfiguration) { } /// - protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, IotHubResourceDefinition resource) + protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, IoTHubResourceDefinition resource) { - return string.Format(ResourceUriTemplate, subscriptionId, scrapeDefinition.ResourceGroupName, resource.IotHubName); + return string.Format(ResourceUriTemplate, subscriptionId, scrapeDefinition.ResourceGroupName, resource.IoTHubName); } } } \ No newline at end of file diff --git a/src/Promitor.Tests.Unit/Builders/Metrics/v1/MetricsDeclarationBuilder.cs b/src/Promitor.Tests.Unit/Builders/Metrics/v1/MetricsDeclarationBuilder.cs index ce5f479a4..97d891bd7 100644 --- a/src/Promitor.Tests.Unit/Builders/Metrics/v1/MetricsDeclarationBuilder.cs +++ b/src/Promitor.Tests.Unit/Builders/Metrics/v1/MetricsDeclarationBuilder.cs @@ -582,12 +582,12 @@ public MetricsDeclarationBuilder WithSqlManagedInstanceMetric( 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") { var azureMetricConfiguration = CreateAzureMetricConfiguration(azureMetricName); - var resource = new IotHubResourceV1 + var resource = new IoTHubResourceV1 { - IotHubName = iotHubName + IoTHubName = iotHubName }; var metric = new MetricDefinitionV1 @@ -596,7 +596,7 @@ public MetricsDeclarationBuilder WithSqlManagedInstanceMetric( Description = metricDescription, AzureMetricConfiguration = azureMetricConfiguration, Resources = new List { resource }, - ResourceType = ResourceType.IotHub + ResourceType = ResourceType.IoTHub }; _metrics.Add(metric); diff --git a/src/Promitor.Tests.Unit/Serialization/v1/Providers/IotHubDeserializerTests.cs b/src/Promitor.Tests.Unit/Serialization/v1/Providers/IotHubDeserializerTests.cs index cfb12ef46..9cc0628d6 100644 --- a/src/Promitor.Tests.Unit/Serialization/v1/Providers/IotHubDeserializerTests.cs +++ b/src/Promitor.Tests.Unit/Serialization/v1/Providers/IotHubDeserializerTests.cs @@ -8,38 +8,38 @@ namespace Promitor.Tests.Unit.Serialization.v1.Providers { [Category("Unit")] - public class IotHubDeserializerTests : ResourceDeserializerTest + public class IoTHubDeserializerTests : ResourceDeserializerTest { - private readonly IotHubDeserializer _deserializer; + private readonly IoTHubDeserializer _deserializer; - public IotHubDeserializerTests() + public IoTHubDeserializerTests() { - _deserializer = new IotHubDeserializer(Logger); + _deserializer = new IoTHubDeserializer(Logger); } [Fact] - public void Deserialize_IotHubNameSupplied_SetsIotHubName() + public void Deserialize_IoTHubNameSupplied_SetsIoTHubName() { const string iotHubName = "promitor-iot-hub"; - YamlAssert.PropertySet( + YamlAssert.PropertySet( _deserializer, $"iotHubName: {iotHubName}", iotHubName, - r => r.IotHubName); + r => r.IoTHubName); } [Fact] - public void Deserialize_IotHubNameNotSupplied_Null() + public void Deserialize_IoTHubNameNotSupplied_Null() { - YamlAssert.PropertyNull( + YamlAssert.PropertyNull( _deserializer, "resourceGroupName: promitor-group", - r => r.IotHubName); + r => r.IoTHubName); } protected override IDeserializer CreateDeserializer() { - return new IotHubDeserializer(Logger); + return new IoTHubDeserializer(Logger); } } } \ No newline at end of file diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IotHubMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IotHubMetricsDeclarationValidationStepsTests.cs index 09079dadd..eee38394c 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IotHubMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IotHubMetricsDeclarationValidationStepsTests.cs @@ -7,14 +7,14 @@ namespace Promitor.Tests.Unit.Validation.Metrics.ResourceTypes { [Category("Unit")] - public class IotHubMetricsDeclarationValidationStepsTests : MetricsDeclarationValidationStepsTests + public class IoTHubMetricsDeclarationValidationStepsTests : MetricsDeclarationValidationStepsTests { [Fact] - public void IotHubMetricsDeclaration_DeclarationWithoutAzureMetricName_Fails() + public void IoTHubMetricsDeclaration_DeclarationWithoutAzureMetricName_Fails() { // Arrange var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() - .WithIotHubMetric(azureMetricName: string.Empty) + .WithIoTHubMetric(azureMetricName: string.Empty) .Build(Mapper); var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); @@ -27,11 +27,11 @@ public void IotHubMetricsDeclaration_DeclarationWithoutAzureMetricName_Fails() } [Fact] - public void IotHubMetricsDeclaration_DeclarationWithoutMetricDescription_Succeeded() + public void IoTHubMetricsDeclaration_DeclarationWithoutMetricDescription_Succeeded() { // Arrange var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() - .WithIotHubMetric(metricDescription: string.Empty) + .WithIoTHubMetric(metricDescription: string.Empty) .Build(Mapper); var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); @@ -44,11 +44,11 @@ public void IotHubMetricsDeclaration_DeclarationWithoutMetricDescription_Succeed } [Fact] - public void IotHubMetricsDeclaration_DeclarationWithoutMetricName_Fails() + public void IoTHubMetricsDeclaration_DeclarationWithoutMetricName_Fails() { // Arrange var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() - .WithIotHubMetric(string.Empty) + .WithIoTHubMetric(string.Empty) .Build(Mapper); var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); @@ -61,11 +61,11 @@ public void IotHubMetricsDeclaration_DeclarationWithoutMetricName_Fails() } [Fact] - public void IotHubMetricsDeclaration_DeclarationWithoutIotHubName_Fails() + public void IoTHubMetricsDeclaration_DeclarationWithoutIoTHubName_Fails() { // Arrange var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() - .WithIotHubMetric(iotHubName: string.Empty) + .WithIoTHubMetric(IoTHubName: string.Empty) .Build(Mapper); var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); @@ -78,11 +78,11 @@ public void IotHubMetricsDeclaration_DeclarationWithoutIotHubName_Fails() } [Fact] - public void IotHubMetricsDeclaration_ValidDeclaration_Succeeds() + public void IoTHubMetricsDeclaration_ValidDeclaration_Succeeds() { // Arrange var rawMetricsDeclaration = MetricsDeclarationBuilder.WithMetadata() - .WithIotHubMetric() + .WithIoTHubMetric() .Build(Mapper); var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawMetricsDeclaration, Mapper); From c0a03fad0f1680fad1c6317f025dcb2f028d693c Mon Sep 17 00:00:00 2001 From: Christian Eder Date: Wed, 6 May 2020 17:01:44 +0200 Subject: [PATCH 11/18] review findings --- adding-a-new-scraper.md | 4 +++- docs/configuration/v1.x/metrics/index.md | 2 +- .../MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/adding-a-new-scraper.md b/adding-a-new-scraper.md index a96a40e73..539ed594f 100644 --- a/adding-a-new-scraper.md +++ b/adding-a-new-scraper.md @@ -75,5 +75,7 @@ Please provide documentation on the following: 2. What fields need to be configured and what they are for. 3. An example configuration. -This should be provided in a new file under `docs\configuration\v1.x\metrics`. +This should be provided in a new file under `docs\configuration\v1.x\metrics` and be listed +under the supported providers on `docs/configuration/v1.x/metrics/index.md` in alphabetical order. + Please also update the file `docs/configuration/v1.x/metrics/index.md` to include your new file. diff --git a/docs/configuration/v1.x/metrics/index.md b/docs/configuration/v1.x/metrics/index.md index d06044f55..ccc3ed05a 100644 --- a/docs/configuration/v1.x/metrics/index.md +++ b/docs/configuration/v1.x/metrics/index.md @@ -128,6 +128,7 @@ We also provide a simplified way to scrape the following Azure resources: - [Azure Cosmos DB](cosmos-db) - [Azure Database for PostgreSQL](postgresql) - [Azure Function App](function-app) +- [Azure IoT Hub](iot-hub) - [Azure Network Interface](network-interface) - [Azure Service Bus Queue](service-bus-queue) - [Azure SQL Database](sql-database) @@ -140,7 +141,6 @@ We also provide a simplified way to scrape the following Azure resources: - [Azure Virtual Machine](virtual-machine) - [Azure Virtual Machine Scale Set (VMSS)](virtual-machine-scale-set) - [Azure Web App](web-app) -- [Azure IoT Hub](iot-hub) 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/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs index a92e89165..48854969e 100644 --- a/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs +++ b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs @@ -17,7 +17,7 @@ public IEnumerable Validate(MetricDefinition metricDefinition) { if (string.IsNullOrWhiteSpace(resourceDefinition.IoTHubName)) { - yield return "No IoT Hub name is configured"; + yield return "No Azure IoT Hub name is configured"; } } } From 06ead20cdf43cb003da2b9518278e050d0429d8c Mon Sep 17 00:00:00 2001 From: Christian Eder Date: Wed, 6 May 2020 17:02:32 +0200 Subject: [PATCH 12/18] rename 1 --- .../{IotHubMetricValidator.cs => IoTsHubMetricValidator.cs} | 0 .../{IotHubResourceDefinition.cs => IoTsHubResourceDefinition.cs} | 0 .../ResourceTypes/{IotHubResourceV1.cs => IoTsHubResourceV1.cs} | 0 .../Providers/{IotHubDeserializer.cs => IoTsHubDeserializer.cs} | 0 .../{IotHubScraper.cs => IoTsHubScraper.cs} | 0 .../{IotHubDeserializerTests.cs => IoTsHubDeserializerTests.cs} | 0 ...sTests.cs => IoTsHubMetricsDeclarationValidationStepsTests.cs} | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/{IotHubMetricValidator.cs => IoTsHubMetricValidator.cs} (100%) rename src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/{IotHubResourceDefinition.cs => IoTsHubResourceDefinition.cs} (100%) rename src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/{IotHubResourceV1.cs => IoTsHubResourceV1.cs} (100%) rename src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/{IotHubDeserializer.cs => IoTsHubDeserializer.cs} (100%) rename src/Promitor.Core.Scraping/{IotHubScraper.cs => IoTsHubScraper.cs} (100%) rename src/Promitor.Tests.Unit/Serialization/v1/Providers/{IotHubDeserializerTests.cs => IoTsHubDeserializerTests.cs} (100%) rename src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/{IotHubMetricsDeclarationValidationStepsTests.cs => IoTsHubMetricsDeclarationValidationStepsTests.cs} (100%) diff --git a/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IoTsHubMetricValidator.cs similarity index 100% rename from src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IotHubMetricValidator.cs rename to src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IoTsHubMetricValidator.cs diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/IotHubResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/IoTsHubResourceDefinition.cs similarity index 100% rename from src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/IotHubResourceDefinition.cs rename to src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/IoTsHubResourceDefinition.cs diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/IotHubResourceV1.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/IoTsHubResourceV1.cs similarity index 100% rename from src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/IotHubResourceV1.cs rename to src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/IoTsHubResourceV1.cs diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/IotHubDeserializer.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/IoTsHubDeserializer.cs similarity index 100% rename from src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/IotHubDeserializer.cs rename to src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/IoTsHubDeserializer.cs diff --git a/src/Promitor.Core.Scraping/IotHubScraper.cs b/src/Promitor.Core.Scraping/IoTsHubScraper.cs similarity index 100% rename from src/Promitor.Core.Scraping/IotHubScraper.cs rename to src/Promitor.Core.Scraping/IoTsHubScraper.cs diff --git a/src/Promitor.Tests.Unit/Serialization/v1/Providers/IotHubDeserializerTests.cs b/src/Promitor.Tests.Unit/Serialization/v1/Providers/IoTsHubDeserializerTests.cs similarity index 100% rename from src/Promitor.Tests.Unit/Serialization/v1/Providers/IotHubDeserializerTests.cs rename to src/Promitor.Tests.Unit/Serialization/v1/Providers/IoTsHubDeserializerTests.cs diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IotHubMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTsHubMetricsDeclarationValidationStepsTests.cs similarity index 100% rename from src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IotHubMetricsDeclarationValidationStepsTests.cs rename to src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTsHubMetricsDeclarationValidationStepsTests.cs From ce391df7686c665bd74a83f44fbdb1a03cdb0dec Mon Sep 17 00:00:00 2001 From: Christian Eder Date: Wed, 6 May 2020 17:03:18 +0200 Subject: [PATCH 13/18] rename back --- .../{IoTsHubMetricValidator.cs => IoTHubMetricValidator.cs} | 0 .../{IoTsHubResourceDefinition.cs => IoTHubResourceDefinition.cs} | 0 .../ResourceTypes/{IoTsHubResourceV1.cs => IoTHubResourceV1.cs} | 0 .../Providers/{IoTsHubDeserializer.cs => IoTHubDeserializer.cs} | 0 .../{IoTsHubScraper.cs => IoTHubScraper.cs} | 0 .../{IoTsHubDeserializerTests.cs => IoTHubDeserializerTests.cs} | 0 ...psTests.cs => IoTHubMetricsDeclarationValidationStepsTests.cs} | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/{IoTsHubMetricValidator.cs => IoTHubMetricValidator.cs} (100%) rename src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/{IoTsHubResourceDefinition.cs => IoTHubResourceDefinition.cs} (100%) rename src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/{IoTsHubResourceV1.cs => IoTHubResourceV1.cs} (100%) rename src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/{IoTsHubDeserializer.cs => IoTHubDeserializer.cs} (100%) rename src/Promitor.Core.Scraping/{IoTsHubScraper.cs => IoTHubScraper.cs} (100%) rename src/Promitor.Tests.Unit/Serialization/v1/Providers/{IoTsHubDeserializerTests.cs => IoTHubDeserializerTests.cs} (100%) rename src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/{IoTsHubMetricsDeclarationValidationStepsTests.cs => IoTHubMetricsDeclarationValidationStepsTests.cs} (100%) diff --git a/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IoTsHubMetricValidator.cs b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IoTHubMetricValidator.cs similarity index 100% rename from src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IoTsHubMetricValidator.cs rename to src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IoTHubMetricValidator.cs diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/IoTsHubResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/IoTHubResourceDefinition.cs similarity index 100% rename from src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/IoTsHubResourceDefinition.cs rename to src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/IoTHubResourceDefinition.cs diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/IoTsHubResourceV1.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/IoTHubResourceV1.cs similarity index 100% rename from src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/IoTsHubResourceV1.cs rename to src/Promitor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/IoTHubResourceV1.cs diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/IoTsHubDeserializer.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/IoTHubDeserializer.cs similarity index 100% rename from src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/IoTsHubDeserializer.cs rename to src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/IoTHubDeserializer.cs diff --git a/src/Promitor.Core.Scraping/IoTsHubScraper.cs b/src/Promitor.Core.Scraping/IoTHubScraper.cs similarity index 100% rename from src/Promitor.Core.Scraping/IoTsHubScraper.cs rename to src/Promitor.Core.Scraping/IoTHubScraper.cs diff --git a/src/Promitor.Tests.Unit/Serialization/v1/Providers/IoTsHubDeserializerTests.cs b/src/Promitor.Tests.Unit/Serialization/v1/Providers/IoTHubDeserializerTests.cs similarity index 100% rename from src/Promitor.Tests.Unit/Serialization/v1/Providers/IoTsHubDeserializerTests.cs rename to src/Promitor.Tests.Unit/Serialization/v1/Providers/IoTHubDeserializerTests.cs diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTsHubMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTHubMetricsDeclarationValidationStepsTests.cs similarity index 100% rename from src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTsHubMetricsDeclarationValidationStepsTests.cs rename to src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTHubMetricsDeclarationValidationStepsTests.cs From e7be9182fd58d3773dd4eee061f5f95c2adc8c02 Mon Sep 17 00:00:00 2001 From: Christian Eder Date: Wed, 6 May 2020 17:18:47 +0200 Subject: [PATCH 14/18] newline --- .../MetricDefinitions/ResourceTypes/IoTHubMetricValidator.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IoTHubMetricValidator.cs b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IoTHubMetricValidator.cs index 48854969e..ecb82269b 100644 --- a/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IoTHubMetricValidator.cs +++ b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IoTHubMetricValidator.cs @@ -22,4 +22,5 @@ public IEnumerable Validate(MetricDefinition metricDefinition) } } } + } \ No newline at end of file From d6a90d94cda26d311f35c8c350c7c936754305ac Mon Sep 17 00:00:00 2001 From: Christian Eder Date: Wed, 6 May 2020 17:18:56 +0200 Subject: [PATCH 15/18] reverted --- .../MetricDefinitions/ResourceTypes/IoTHubMetricValidator.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IoTHubMetricValidator.cs b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IoTHubMetricValidator.cs index ecb82269b..48854969e 100644 --- a/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IoTHubMetricValidator.cs +++ b/src/Promitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IoTHubMetricValidator.cs @@ -22,5 +22,4 @@ public IEnumerable Validate(MetricDefinition metricDefinition) } } } - } \ No newline at end of file From d97a97c5075a70f286f3fbf6ee98bacbb7656785 Mon Sep 17 00:00:00 2001 From: Tom Kerkhove Date: Wed, 6 May 2020 18:31:36 +0200 Subject: [PATCH 16/18] Cleanup --- adding-a-new-scraper.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/adding-a-new-scraper.md b/adding-a-new-scraper.md index 539ed594f..957bdddc9 100644 --- a/adding-a-new-scraper.md +++ b/adding-a-new-scraper.md @@ -77,5 +77,3 @@ Please provide documentation on the following: This should be provided in a new file under `docs\configuration\v1.x\metrics` and be listed under the supported providers on `docs/configuration/v1.x/metrics/index.md` in alphabetical order. - -Please also update the file `docs/configuration/v1.x/metrics/index.md` to include your new file. From 54b23a82623cd16c215c045e94e2d0dfd041f516 Mon Sep 17 00:00:00 2001 From: Tom Kerkhove Date: Wed, 6 May 2020 18:56:58 +0200 Subject: [PATCH 17/18] Fix bad parameter name --- .../IoTHubMetricsDeclarationValidationStepsTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTHubMetricsDeclarationValidationStepsTests.cs b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTHubMetricsDeclarationValidationStepsTests.cs index eee38394c..17b938b34 100644 --- a/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTHubMetricsDeclarationValidationStepsTests.cs +++ b/src/Promitor.Tests.Unit/Validation/Metrics/ResourceTypes/IoTHubMetricsDeclarationValidationStepsTests.cs @@ -65,7 +65,7 @@ public void IoTHubMetricsDeclaration_DeclarationWithoutIoTHubName_Fails() { // Arrange var rawDeclaration = MetricsDeclarationBuilder.WithMetadata() - .WithIoTHubMetric(IoTHubName: string.Empty) + .WithIoTHubMetric(iotHubName: string.Empty) .Build(Mapper); var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, Mapper); @@ -94,4 +94,4 @@ public void IoTHubMetricsDeclaration_ValidDeclaration_Succeeds() Assert.True(validationResult.IsSuccessful, "Validation was not successful"); } } -} \ No newline at end of file +} From 12b38f9b4057b4af923018cdc62a702192252a04 Mon Sep 17 00:00:00 2001 From: Christian Eder Date: Thu, 7 May 2020 06:54:15 +0200 Subject: [PATCH 18/18] fix test after renaming to IoT --- .../Serialization/v1/Providers/IoTHubDeserializerTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Promitor.Tests.Unit/Serialization/v1/Providers/IoTHubDeserializerTests.cs b/src/Promitor.Tests.Unit/Serialization/v1/Providers/IoTHubDeserializerTests.cs index 9cc0628d6..c2d829519 100644 --- a/src/Promitor.Tests.Unit/Serialization/v1/Providers/IoTHubDeserializerTests.cs +++ b/src/Promitor.Tests.Unit/Serialization/v1/Providers/IoTHubDeserializerTests.cs @@ -23,7 +23,7 @@ public void Deserialize_IoTHubNameSupplied_SetsIoTHubName() const string iotHubName = "promitor-iot-hub"; YamlAssert.PropertySet( _deserializer, - $"iotHubName: {iotHubName}", + $"ioTHubName: {iotHubName}", iotHubName, r => r.IoTHubName); }