-
-
Notifications
You must be signed in to change notification settings - Fork 92
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Provide support for scraping metrics for Azure IoT Hubs (#1011)
- Loading branch information
1 parent
fcabbb8
commit 7c705c5
Showing
17 changed files
with
308 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
--- | ||
layout: default | ||
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. | ||
|
||
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 | ||
``` | ||
<!-- markdownlint-disable MD033 --> | ||
[← back to metrics declarations](/configuration/v1.x/metrics)<br /> | ||
[← back to introduction](/) | ||
<!-- markdownlint-enable --> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
25 changes: 25 additions & 0 deletions
25
...omitor.Agents.Scraper/Validation/MetricDefinitions/ResourceTypes/IoTHubMetricValidator.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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<string> Validate(MetricDefinition metricDefinition) | ||
{ | ||
Guard.NotNull(metricDefinition, nameof(metricDefinition)); | ||
|
||
foreach (var resourceDefinition in metricDefinition.Resources.Cast<IoTHubResourceDefinition>()) | ||
{ | ||
if (string.IsNullOrWhiteSpace(resourceDefinition.IoTHubName)) | ||
{ | ||
yield return "No Azure IoT Hub name is configured"; | ||
} | ||
} | ||
} | ||
} | ||
} |
16 changes: 16 additions & 0 deletions
16
...mitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/IoTHubResourceDefinition.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; } | ||
|
||
/// <inheritdoc /> | ||
public override string GetResourceName() => IoTHubName; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -24,5 +24,6 @@ public enum ResourceType | |
FileStorage = 19, | ||
StorageAccount = 20, | ||
ApiManagement = 21, | ||
IoTHub = 22, | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
13 changes: 13 additions & 0 deletions
13
...itor.Core.Scraping/Configuration/Serialization/v1/Model/ResourceTypes/IoTHubResourceV1.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Model.ResourceTypes | ||
{ | ||
/// <summary> | ||
/// Contains the configuration required to scrape an Azure IoT Hub. | ||
/// </summary> | ||
public class IoTHubResourceV1 : AzureResourceDefinitionV1 | ||
{ | ||
/// <summary> | ||
/// The name of the Azure IoT Hub to get metrics for. | ||
/// </summary> | ||
public string IoTHubName { get; set; } | ||
} | ||
} |
13 changes: 13 additions & 0 deletions
13
src/Promitor.Core.Scraping/Configuration/Serialization/v1/Providers/IoTHubDeserializer.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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<IoTHubResourceV1> | ||
{ | ||
public IoTHubDeserializer(ILogger<IoTHubDeserializer> logger) : base(logger) | ||
{ | ||
MapRequired(resource => resource.IoTHubName); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
{ | ||
/// <summary> | ||
/// Scrapes an Azure IoT Hub | ||
/// </summary> | ||
public class IoTHubScraper : AzureMonitorScraper<IoTHubResourceDefinition> | ||
{ | ||
private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Devices/IotHubs/{2}"; | ||
|
||
public IoTHubScraper(ScraperConfiguration scraperConfiguration) : | ||
base(scraperConfiguration) | ||
{ | ||
} | ||
|
||
/// <inheritdoc /> | ||
protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition<IAzureResourceDefinition> scrapeDefinition, IoTHubResourceDefinition resource) | ||
{ | ||
return string.Format(ResourceUriTemplate, subscriptionId, scrapeDefinition.ResourceGroupName, resource.IoTHubName); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
45 changes: 45 additions & 0 deletions
45
src/Promitor.Tests.Unit/Serialization/v1/Providers/IoTHubDeserializerTests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
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 System.ComponentModel; | ||
using Xunit; | ||
|
||
namespace Promitor.Tests.Unit.Serialization.v1.Providers | ||
{ | ||
[Category("Unit")] | ||
public class IoTHubDeserializerTests : ResourceDeserializerTest<IoTHubDeserializer> | ||
{ | ||
private readonly IoTHubDeserializer _deserializer; | ||
|
||
public IoTHubDeserializerTests() | ||
{ | ||
_deserializer = new IoTHubDeserializer(Logger); | ||
} | ||
|
||
[Fact] | ||
public void Deserialize_IoTHubNameSupplied_SetsIoTHubName() | ||
{ | ||
const string iotHubName = "promitor-iot-hub"; | ||
YamlAssert.PropertySet<IoTHubResourceV1, AzureResourceDefinitionV1, string>( | ||
_deserializer, | ||
$"ioTHubName: {iotHubName}", | ||
iotHubName, | ||
r => r.IoTHubName); | ||
} | ||
|
||
[Fact] | ||
public void Deserialize_IoTHubNameNotSupplied_Null() | ||
{ | ||
YamlAssert.PropertyNull<IoTHubResourceV1, AzureResourceDefinitionV1>( | ||
_deserializer, | ||
"resourceGroupName: promitor-group", | ||
r => r.IoTHubName); | ||
} | ||
|
||
protected override IDeserializer<AzureResourceDefinitionV1> CreateDeserializer() | ||
{ | ||
return new IoTHubDeserializer(Logger); | ||
} | ||
} | ||
} |
97 changes: 97 additions & 0 deletions
97
...sts.Unit/Validation/Metrics/ResourceTypes/IoTHubMetricsDeclarationValidationStepsTests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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"); | ||
} | ||
} | ||
} |