Skip to content

Commit

Permalink
Fix resource group overriding
Browse files Browse the repository at this point in the history
The ability to override the resource group per metric was broken for all resource types other than the Generic resource type.

This commit:

- Fixes the tests for all resource types to test for this by removing the `Ignore()` method calls for the `ResourceGroupName` property and added an extra assert to check for the resource group.
- Alters the deserializers to inherit directly from `MetricDeserializer` rather than `GenericAzureMetricDeserializer`. They weren't actually using any of the functionality from the generic type.
- Fixes a few Scraper implementations to actually use the overridden group name.

Fixes #655
  • Loading branch information
adamconnelly committed Aug 13, 2019
1 parent f869ba9 commit 222e5a6
Show file tree
Hide file tree
Showing 25 changed files with 80 additions and 71 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ protected virtual TMetricDefinition DeserializeMetricDefinition<TMetricDefinitio

var name = metricNode.Children[new YamlScalarNode("name")];
var description = metricNode.Children[new YamlScalarNode("description")];

var azureMetricConfigurationNode = (YamlMappingNode)metricNode.Children[new YamlScalarNode("azureMetricConfiguration")];

var azureMetricConfigurationDeserializer = new AzureMetricConfigurationDeserializer(Logger);
Expand All @@ -37,7 +38,8 @@ protected virtual TMetricDefinition DeserializeMetricDefinition<TMetricDefinitio
{
Name = name?.ToString(),
Description = description?.ToString(),
AzureMetricConfiguration = azureMetricConfiguration
AzureMetricConfiguration = azureMetricConfiguration,
ResourceGroupName = GetResourceGroupName(metricNode)
};

DeserializeScraping(metricNode, metricDefinition);
Expand All @@ -46,6 +48,16 @@ protected virtual TMetricDefinition DeserializeMetricDefinition<TMetricDefinitio
return metricDefinition;
}

private static string GetResourceGroupName(YamlMappingNode metricNode)
{
if (metricNode.Children.TryGetValue("resourceGroupName", out var resourceGroupNode))
{
return resourceGroupNode.ToString();
}

return null;
}

private static void DeserializeScraping<TMetricDefinition>(YamlMappingNode metricNode, TMetricDefinition metricDefinition) where TMetricDefinition : MetricDefinition, new()
{
if (metricNode.Children.ContainsKey(@"scraping") == false)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
using Promitor.Core.Scraping.Configuration.Model.Metrics;
using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes;
using Promitor.Core.Scraping.Configuration.Serialization.v1.Core;
using YamlDotNet.RepresentationModel;

namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Providers
{
internal class ContainerInstanceMetricDeserializer : GenericAzureMetricDeserializer
internal class ContainerInstanceMetricDeserializer : MetricDeserializer
{
/// <summary>Deserializes the specified Container Instances metric node from the YAML configuration file.</summary>
/// <param name="metricNode">The metric node to deserialize to Container Instances configuration</param>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
using Promitor.Core.Scraping.Configuration.Model.Metrics;
using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes;
using Promitor.Core.Scraping.Configuration.Serialization.v1.Core;
using YamlDotNet.RepresentationModel;

namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Providers
{
internal class ContainerRegistryMetricDeserializer : GenericAzureMetricDeserializer
internal class ContainerRegistryMetricDeserializer : MetricDeserializer
{
/// <summary>Deserializes the specified Container Registry metric node from the YAML configuration file.</summary>
/// <param name="metricNode">The metric node to deserialize to Container Registry configuration</param>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
using Promitor.Core.Scraping.Configuration.Model.Metrics;
using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes;
using Promitor.Core.Scraping.Configuration.Serialization.v1.Core;
using YamlDotNet.RepresentationModel;

namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Providers
{
internal class CosmosDbMetricDeserializer : GenericAzureMetricDeserializer
internal class CosmosDbMetricDeserializer : MetricDeserializer
{
/// <summary>Deserializes the specified Cosmos DB metric node from the YAML configuration file.</summary>
/// <param name="metricNode">The metric node to deserialize to Cosmos DB configuration</param>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,6 @@ internal override MetricDefinition Deserialize(YamlMappingNode metricNode)
{
metricDefinition.Filter = filterNode?.ToString();
}
if (metricNode.Children.TryGetValue(new YamlScalarNode("resourceGroupName"), out var resourceGroupName))
{
metricDefinition.ResourceGroupName = resourceGroupName?.ToString();
}

var resourceUri = metricNode.Children[new YamlScalarNode(value: "resourceUri")];

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
using Promitor.Core.Scraping.Configuration.Model.Metrics;
using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes;
using Promitor.Core.Scraping.Configuration.Serialization.v1.Core;
using YamlDotNet.RepresentationModel;

namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Providers
{
internal class NetworkInterfaceMetricDeserializer : GenericAzureMetricDeserializer
internal class NetworkInterfaceMetricDeserializer : MetricDeserializer
{
/// <summary>Deserializes the specified Network Interface metric node from the YAML configuration file.</summary>
/// <param name="metricNode">The metric node containing 'networkInterfaceName' parameter pointing to an instance of a Network Interface</param>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
using Promitor.Core.Scraping.Configuration.Model.Metrics;
using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes;
using Promitor.Core.Scraping.Configuration.Serialization.v1.Core;
using YamlDotNet.RepresentationModel;

namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Providers
{
/// <summary>
/// Defines a deserializer for the PostgreSQL Server resource type
/// </summary>
internal class PostgreSqlMetricDeserializer : GenericAzureMetricDeserializer
internal class PostgreSqlMetricDeserializer : MetricDeserializer
{
/// <summary>
/// Deserializes the specified PostgreSQL Server metric node from the YAML configuration file.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
using Promitor.Core.Scraping.Configuration.Model.Metrics;
using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes;
using Promitor.Core.Scraping.Configuration.Serialization.v1.Core;
using YamlDotNet.RepresentationModel;

namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Providers
{
/// <summary>
/// Defines a deserializer for the Redis Cache resource type
/// </summary>
internal class RedisCacheMetricDeserializer : GenericAzureMetricDeserializer
internal class RedisCacheMetricDeserializer : MetricDeserializer
{
/// <summary>
/// Deserializes the specified Redis Cache metric node from the YAML configuration file.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
using Promitor.Core.Scraping.Configuration.Model.Metrics;
using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes;
using Promitor.Core.Scraping.Configuration.Serialization.v1.Core;
using YamlDotNet.RepresentationModel;

namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Providers
{
internal class ServiceBusQueueMetricDeserializer : GenericAzureMetricDeserializer
internal class ServiceBusQueueMetricDeserializer : MetricDeserializer
{
/// <summary>Deserializes the specified Service Bus Queue metric node from the YAML configuration file.</summary>
/// <param name="metricNode">The metric node to deserialize to Service Bus queue</param>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Providers
{
internal class StorageQueueMetricDeserializer : GenericAzureMetricDeserializer
internal class StorageQueueMetricDeserializer : MetricDeserializer
{
/// <summary>Deserializes the specified Storage Queue metric node from the YAML configuration file.</summary>
/// <param name="metricNode">The metric node to deserialize to Storage queue configuration</param>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
using Promitor.Core.Scraping.Configuration.Model.Metrics;
using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes;
using Promitor.Core.Scraping.Configuration.Serialization.v1.Core;
using YamlDotNet.RepresentationModel;

namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Providers
{
internal class VirtualMachineMetricDeserializer : GenericAzureMetricDeserializer
internal class VirtualMachineMetricDeserializer : MetricDeserializer
{
/// <summary>Deserializes the specified Virtual Machine metric node from the YAML configuration file.</summary>
/// <param name="metricNode">The metric node containing 'virtualMachineName' parameter pointing to an instance of a Virtual Machine</param>
Expand Down
73 changes: 37 additions & 36 deletions src/Promitor.Core.Scraping/Factories/MetricDeserializerFactory.cs
Original file line number Diff line number Diff line change
@@ -1,37 +1,38 @@
using System;
using Promitor.Core.Scraping.Configuration.Serialization.v1.Providers;

namespace Promitor.Core.Scraping.Factories
{
internal static class MetricDeserializerFactory
{
internal static GenericAzureMetricDeserializer GetDeserializerFor(Configuration.Model.ResourceType resource)
{
switch (resource)
{
case Configuration.Model.ResourceType.Generic:
return new GenericAzureMetricDeserializer();
case Configuration.Model.ResourceType.ServiceBusQueue:
return new ServiceBusQueueMetricDeserializer();
case Configuration.Model.ResourceType.StorageQueue:
return new StorageQueueMetricDeserializer();
case Configuration.Model.ResourceType.ContainerInstance:
return new ContainerInstanceMetricDeserializer();
case Configuration.Model.ResourceType.VirtualMachine:
return new VirtualMachineMetricDeserializer();
case Configuration.Model.ResourceType.ContainerRegistry:
return new ContainerRegistryMetricDeserializer();
case Configuration.Model.ResourceType.NetworkInterface:
return new NetworkInterfaceMetricDeserializer();
case Configuration.Model.ResourceType.CosmosDb:
return new CosmosDbMetricDeserializer();
case Configuration.Model.ResourceType.RedisCache:
using System;
using Promitor.Core.Scraping.Configuration.Serialization.v1.Core;
using Promitor.Core.Scraping.Configuration.Serialization.v1.Providers;

namespace Promitor.Core.Scraping.Factories
{
internal static class MetricDeserializerFactory
{
internal static MetricDeserializer GetDeserializerFor(Configuration.Model.ResourceType resource)
{
switch (resource)
{
case Configuration.Model.ResourceType.Generic:
return new GenericAzureMetricDeserializer();
case Configuration.Model.ResourceType.ServiceBusQueue:
return new ServiceBusQueueMetricDeserializer();
case Configuration.Model.ResourceType.StorageQueue:
return new StorageQueueMetricDeserializer();
case Configuration.Model.ResourceType.ContainerInstance:
return new ContainerInstanceMetricDeserializer();
case Configuration.Model.ResourceType.VirtualMachine:
return new VirtualMachineMetricDeserializer();
case Configuration.Model.ResourceType.ContainerRegistry:
return new ContainerRegistryMetricDeserializer();
case Configuration.Model.ResourceType.NetworkInterface:
return new NetworkInterfaceMetricDeserializer();
case Configuration.Model.ResourceType.CosmosDb:
return new CosmosDbMetricDeserializer();
case Configuration.Model.ResourceType.RedisCache:
return new RedisCacheMetricDeserializer();
case Configuration.Model.ResourceType.PostgreSql:
return new PostgreSqlMetricDeserializer();
}

throw new ArgumentOutOfRangeException($@"Resource Type {resource} not supported.");
}
}
}
case Configuration.Model.ResourceType.PostgreSql:
return new PostgreSqlMetricDeserializer();
}

throw new ArgumentOutOfRangeException($@"Resource Type {resource} not supported.");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public ContainerInstanceScraper(ScraperConfiguration scraperConfiguration)

protected override async Task<ScrapeResult> ScrapeResourceAsync(string subscriptionId, string resourceGroupName, ContainerInstanceMetricDefinition metricDefinition, AggregationType aggregationType, TimeSpan aggregationInterval)
{
var resourceUri = string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, AzureMetadata.ResourceGroupName, metricDefinition.ContainerGroup);
var resourceUri = string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, resourceGroupName, metricDefinition.ContainerGroup);

var metricName = metricDefinition.AzureMetricConfiguration.MetricName;
var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName, aggregationType, aggregationInterval, resourceUri);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public NetworkInterfaceScraper(ScraperConfiguration scraperConfiguration)

protected override async Task<ScrapeResult> ScrapeResourceAsync(string subscriptionId, string resourceGroupName, NetworkInterfaceMetricDefinition metricDefinition, AggregationType aggregationType, TimeSpan aggregationInterval)
{
var resourceUri = string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, AzureMetadata.ResourceGroupName, metricDefinition.NetworkInterfaceName);
var resourceUri = string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, resourceGroupName, metricDefinition.NetworkInterfaceName);

var metricName = metricDefinition.AzureMetricConfiguration.MetricName;
var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName, aggregationType, aggregationInterval, resourceUri);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public VirtualMachineScraper(ScraperConfiguration scraperConfiguration)

protected override async Task<ScrapeResult> ScrapeResourceAsync(string subscriptionId, string resourceGroupName, VirtualMachineMetricDefinition metricDefinition, AggregationType aggregationType, TimeSpan aggregationInterval)
{
var resourceUri = string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, AzureMetadata.ResourceGroupName, metricDefinition.VirtualMachineName);
var resourceUri = string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, resourceGroupName, metricDefinition.VirtualMachineName);

var metricName = metricDefinition.AzureMetricConfiguration.MetricName;
var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName, aggregationType, aggregationInterval, resourceUri);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,7 @@ private StorageQueueMetricDefinition GenerateBogusAzureStorageQueueMetricDefinit
.RuleFor(metricDefinition => metricDefinition.AzureMetricConfiguration, faker => bogusAzureMetricConfiguration)
.RuleFor(metricDefinition => metricDefinition.ResourceGroupName, faker => resourceGroupName)
.RuleFor(metricDefinition => metricDefinition.Scraping, faker => bogusScrapingInterval)
.RuleFor(metricDefinition => metricDefinition.Labels, faker => new Dictionary<string, string> { { faker.Name.FirstName(), faker.Random.Guid().ToString() } })
.Ignore(metricDefinition => metricDefinition.ResourceGroupName);
.RuleFor(metricDefinition => metricDefinition.Labels, faker => new Dictionary<string, string> { { faker.Name.FirstName(), faker.Random.Guid().ToString() } });

return bogusGenerator.Generate();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,7 @@ private ContainerInstanceMetricDefinition GenerateBogusContainerInstanceMetricDe
.RuleFor(metricDefinition => metricDefinition.AzureMetricConfiguration, faker => bogusAzureMetricConfiguration)
.RuleFor(metricDefinition => metricDefinition.ResourceGroupName, faker => resourceGroupName)
.RuleFor(metricDefinition => metricDefinition.Scraping, faker => bogusScrapingInterval)
.RuleFor(metricDefinition => metricDefinition.Labels, faker => new Dictionary<string, string> { { faker.Name.FirstName(), faker.Random.Guid().ToString() } })
.Ignore(metricDefinition => metricDefinition.ResourceGroupName);
.RuleFor(metricDefinition => metricDefinition.Labels, faker => new Dictionary<string, string> { { faker.Name.FirstName(), faker.Random.Guid().ToString() } });

return bogusGenerator.Generate();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,7 @@ private ContainerRegistryMetricDefinition GenerateBogusContainerRegistryMetricDe
.RuleFor(metricDefinition => metricDefinition.AzureMetricConfiguration, faker => bogusAzureMetricConfiguration)
.RuleFor(metricDefinition => metricDefinition.ResourceGroupName, faker => resourceGroupName)
.RuleFor(metricDefinition => metricDefinition.Scraping, faker => bogusScrapingInterval)
.RuleFor(metricDefinition => metricDefinition.Labels, faker => new Dictionary<string, string> { { faker.Name.FirstName(), faker.Random.Guid().ToString() } })
.Ignore(metricDefinition => metricDefinition.ResourceGroupName);
.RuleFor(metricDefinition => metricDefinition.Labels, faker => new Dictionary<string, string> { { faker.Name.FirstName(), faker.Random.Guid().ToString() } });

return bogusGenerator.Generate();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,7 @@ private CosmosDbMetricDefinition GenerateBogusCosmosDbMetricDefinition(string re
.RuleFor(metricDefinition => metricDefinition.AzureMetricConfiguration, faker => bogusAzureMetricConfiguration)
.RuleFor(metricDefinition => metricDefinition.ResourceGroupName, faker => resourceGroupName)
.RuleFor(metricDefinition => metricDefinition.Scraping, faker => bogusScrapingInterval)
.RuleFor(metricDefinition => metricDefinition.Labels, faker => new Dictionary<string, string> { { faker.Name.FirstName(), faker.Random.Guid().ToString() } })
.Ignore(metricDefinition => metricDefinition.ResourceGroupName);
.RuleFor(metricDefinition => metricDefinition.Labels, faker => new Dictionary<string, string> { { faker.Name.FirstName(), faker.Random.Guid().ToString() } });

return bogusGenerator.Generate();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,7 @@ private NetworkInterfaceMetricDefinition GenerateBogusNetworkInterfaceMetricDefi
.RuleFor(metricDefinition => metricDefinition.AzureMetricConfiguration, faker => bogusAzureMetricConfiguration)
.RuleFor(metricDefinition => metricDefinition.ResourceGroupName, faker => resourceGroupName)
.RuleFor(metricDefinition => metricDefinition.Scraping, faker => bogusScrapingInterval)
.RuleFor(metricDefinition => metricDefinition.Labels, faker => new Dictionary<string, string> { { faker.Name.FirstName(), faker.Random.Guid().ToString() } })
.Ignore(metricDefinition => metricDefinition.ResourceGroupName);
.RuleFor(metricDefinition => metricDefinition.Labels, faker => new Dictionary<string, string> { { faker.Name.FirstName(), faker.Random.Guid().ToString() } });

return bogusGenerator.Generate();
}
Expand Down
Loading

0 comments on commit 222e5a6

Please sign in to comment.