From c2aa7c465599d9d2af772058f31ff42ff93ff02f Mon Sep 17 00:00:00 2001 From: Tom Kerkhove Date: Wed, 15 Jan 2020 23:36:24 +0100 Subject: [PATCH] =?UTF-8?q?Simply=20scrapers=20to=20reduce=20duplicate=20c?= =?UTF-8?q?ode=20and=20make=20it=20easy=20to=20add=E2=80=A6=20(#839)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Reduce duplicate code in scraper Signed-off-by: Tom Kerkhove * Use correct instance name and refactor resource definition Signed-off-by: Tom Kerkhove --- .../AppServiceScraper.cs | 63 +++++++++++++++++++ .../AzureMonitorScraper.cs | 58 +++++++++++++++++ .../Model/Metrics/AzureResourceDefinition.cs | 16 +++-- .../Metrics/IAppServiceResourceDefinition.cs | 7 +++ .../Model/Metrics/IAzureResourceDefinition.cs | 29 +++++++++ .../Model/Metrics/MetricDefinition.cs | 8 +-- .../AppPlanResourceDefinition.cs | 3 + .../ContainerInstanceResourceDefinition.cs | 3 + .../ContainerRegistryResourceDefinition.cs | 3 + .../CosmosDbResourceDefinition.cs | 3 + .../FunctionAppResourceDefinition.cs | 5 +- .../GenericAzureResourceDefinition.cs | 3 + .../NetworkInterfaceResourceDefinition.cs | 3 + .../PostgreSqlResourceDefinition.cs | 3 + .../RedisCacheResourceDefinition.cs | 3 + .../ServiceBusQueueResourceDefinition.cs | 3 + .../SqlDatabaseResourceDefinition.cs | 3 + .../SqlManagedInstanceResourceDefinition.cs | 3 + .../StorageQueueResourceDefinition.cs | 3 + .../VirtualMachineResourceDefinition.cs | 3 + ...rtualMachineScaleSetsResourceDefinition.cs | 3 + .../ResourceTypes/WebAppResourceDefinition.cs | 5 +- .../Model/Metrics/ScrapeDefinition.cs | 2 +- .../v1/Mapping/V1MappingProfile.cs | 2 +- .../Factories/MetricScraperFactory.cs | 2 +- .../Interfaces/IScraper.cs | 2 +- .../ResourceTypes/AppPlanScraper.cs | 15 +---- .../ResourceTypes/ContainerInstanceScraper.cs | 17 ++--- .../ResourceTypes/ContainerRegistryScraper.cs | 17 ++--- .../ResourceTypes/CosmosDbScraper.cs | 17 ++--- .../ResourceTypes/FunctionAppScraper.cs | 28 +-------- .../ResourceTypes/GenericScraper.cs | 16 ++--- .../ResourceTypes/NetworkInterfaceScraper.cs | 15 +---- .../ResourceTypes/PostgreSqlScraper.cs | 17 ++--- .../ResourceTypes/RedisCacheScraper.cs | 17 ++--- .../ResourceTypes/ServiceBusQueueScraper.cs | 31 +++++---- .../ResourceTypes/SqlDatabaseScraper.cs | 36 ++++------- .../SqlManagedInstanceScraper.cs | 25 ++------ .../ResourceTypes/StorageQueueScraper.cs | 7 ++- .../VirtualMachineScaleSetScraper.cs | 15 +---- .../ResourceTypes/VirtualMachineScraper.cs | 15 +---- .../ResourceTypes/WebAppScraper.cs | 28 +-------- src/Promitor.Core.Scraping/Scraper.cs | 47 +++++++------- .../Scheduling/MetricScrapingJob.cs | 6 +- .../Model/Metrics/MetricDefinitionTests.cs | 6 +- 45 files changed, 337 insertions(+), 279 deletions(-) create mode 100644 src/Promitor.Core.Scraping/AppServiceScraper.cs create mode 100644 src/Promitor.Core.Scraping/AzureMonitorScraper.cs create mode 100644 src/Promitor.Core.Scraping/Configuration/Model/Metrics/IAppServiceResourceDefinition.cs create mode 100644 src/Promitor.Core.Scraping/Configuration/Model/Metrics/IAzureResourceDefinition.cs diff --git a/src/Promitor.Core.Scraping/AppServiceScraper.cs b/src/Promitor.Core.Scraping/AppServiceScraper.cs new file mode 100644 index 000000000..7afd54c14 --- /dev/null +++ b/src/Promitor.Core.Scraping/AppServiceScraper.cs @@ -0,0 +1,63 @@ +using System.Collections.Generic; +using Promitor.Core.Scraping.Configuration.Model.Metrics; + +// ReSharper disable All + +namespace Promitor.Core.Scraping +{ + /// + /// Azure Monitor Scraper + /// + /// Type of metric definition that is being used + public abstract class AppServiceScraper : AzureMonitorScraper + where TResourceDefinition : class, IAppServiceResourceDefinition + { + /// + /// Constructor + /// + protected AppServiceScraper(ScraperConfiguration scraperConfiguration) : + base(scraperConfiguration) + { + } + + /// + /// Builds the URI without deployment slots of the App Service resource to scrape + /// + /// Subscription id in which the resource lives + /// Contains all the information needed to scrape the resource. + /// Contains the resource cast to the specific resource type. + /// Uri of Azure resource + protected abstract string BuildResourceUriWithoutDeploymentSlot(string subscriptionId, ScrapeDefinition scrapeDefinition, TResourceDefinition resource); + + /// + protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, TResourceDefinition resource) + { + var slotName = DetermineSlotName(resource); + var resourceUri = BuildResourceUriWithoutDeploymentSlot(subscriptionId, scrapeDefinition, resource); + + // Production slot should not be suffixed in resource URI + if (slotName != "production") + { + resourceUri += $"/slots/{slotName}"; + } + + return resourceUri; + } + + /// + protected override Dictionary DetermineMetricLabels(TResourceDefinition resourceDefinition) + { + var metricLabels = base.DetermineMetricLabels(resourceDefinition); + + var slotName = DetermineSlotName(resourceDefinition); + metricLabels?.TryAdd("slot_name", slotName); + + return metricLabels; + } + + private static string DetermineSlotName(TResourceDefinition resource) + { + return string.IsNullOrWhiteSpace(resource.SlotName) ? "production" : resource.SlotName; + } + } +} \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/AzureMonitorScraper.cs b/src/Promitor.Core.Scraping/AzureMonitorScraper.cs new file mode 100644 index 000000000..6c1fdd836 --- /dev/null +++ b/src/Promitor.Core.Scraping/AzureMonitorScraper.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Azure.Management.Monitor.Fluent.Models; +using Promitor.Core.Scraping.Configuration.Model.Metrics; + +namespace Promitor.Core.Scraping +{ + /// + /// Azure Monitor Scraper + /// + /// Type of metric definition that is being used + public abstract class AzureMonitorScraper : Scraper + where TResourceDefinition : class, IAzureResourceDefinition + { + /// + /// Constructor + /// + protected AzureMonitorScraper(ScraperConfiguration scraperConfiguration) : + base(scraperConfiguration) + { + } + + /// + protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, TResourceDefinition resourceDefinition, AggregationType aggregationType, TimeSpan aggregationInterval) + { + var resourceUri = BuildResourceUri(AzureMetadata.SubscriptionId, scrapeDefinition, resourceDefinition); + + var metricFilter = DetermineMetricFilter(resourceDefinition); + var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; + var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; + var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName, dimensionName, aggregationType, aggregationInterval, resourceUri, metricFilter); + + var instanceName = resourceDefinition.GetResourceName(); + var metricLabels = DetermineMetricLabels(resourceDefinition); + + return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, instanceName, resourceUri, foundMetricValue, metricLabels); + } + + /// + /// Determines the metric filter to use + /// + /// Contains the resource cast to the specific resource type. + protected virtual string DetermineMetricFilter(TResourceDefinition resourceDefinition) + { + return null; + } + + /// + /// Determines the metric labels to include in the reported metric + /// + /// Contains the resource cast to the specific resource type. + protected virtual Dictionary DetermineMetricLabels(TResourceDefinition resourceDefinition) + { + return new Dictionary(); + } + } +} \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/AzureResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/AzureResourceDefinition.cs index f07ad681c..fe54082c1 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/AzureResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/AzureResourceDefinition.cs @@ -1,11 +1,16 @@ namespace Promitor.Core.Scraping.Configuration.Model.Metrics { /// - /// Describes a resource in Azure that can be scraped. Inheriting classes can add whatever - /// additional information is required to scrape a particular Azure resource. + /// Describes a resource in Azure that can be scraped. Inheriting classes can add whatever + /// additional information is required to scrape a particular Azure resource. /// - public abstract class AzureResourceDefinition + public abstract class AzureResourceDefinition : IAzureResourceDefinition { + /// + /// Constructor + /// + /// Type of resource that is configured + /// Specify a resource group to scrape that defers from the default resource group. protected AzureResourceDefinition(ResourceType resourceType, string resourceGroupName) { ResourceType = resourceType; @@ -22,5 +27,8 @@ protected AzureResourceDefinition(ResourceType resourceType, string resourceGrou /// This enables you to do multi-resource group scraping with one configuration file. /// public string ResourceGroupName { get; } + + /// + public abstract string GetResourceName(); } -} +} \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/IAppServiceResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/IAppServiceResourceDefinition.cs new file mode 100644 index 000000000..2f59983e4 --- /dev/null +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/IAppServiceResourceDefinition.cs @@ -0,0 +1,7 @@ +namespace Promitor.Core.Scraping.Configuration.Model.Metrics +{ + public interface IAppServiceResourceDefinition : IAzureResourceDefinition + { + public string SlotName { get; } + } +} \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/IAzureResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/IAzureResourceDefinition.cs new file mode 100644 index 000000000..774664e19 --- /dev/null +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/IAzureResourceDefinition.cs @@ -0,0 +1,29 @@ +namespace Promitor.Core.Scraping.Configuration.Model.Metrics +{ + /// + /// Describes a resource in Azure that can be scraped. Inheriting classes can add whatever + /// additional information is required to scrape a particular Azure resource. + /// + public interface IAzureResourceDefinition + { + /// + /// Type of resource that is configured + /// + public ResourceType ResourceType { get; } + + /// + /// Specify a resource group to scrape that defers from the default resource group. + /// This enables you to do multi-resource group scraping with one configuration file. + /// + public string ResourceGroupName { get; } + + /// + /// Gets the name of the resource + /// + /// This should return the name of the main resource + /// + /// For an Azure SQL Database it should be the name of the DB, not the server + /// + string GetResourceName(); + } +} \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/MetricDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/MetricDefinition.cs index f1b250f70..79c4a3ba8 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/MetricDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/MetricDefinition.cs @@ -12,7 +12,7 @@ public MetricDefinition(PrometheusMetricDefinition prometheusMetricDefinition, Scraping scraping, AzureMetricConfiguration azureMetricConfiguration, ResourceType resourceType, - List resources) + List resources) { AzureMetricConfiguration = azureMetricConfiguration; PrometheusMetricDefinition = prometheusMetricDefinition; @@ -44,7 +44,7 @@ public MetricDefinition(PrometheusMetricDefinition prometheusMetricDefinition, /// /// Gets or sets the list of resources to scrape. /// - public List Resources { get; set; } + public List Resources { get; set; } /// /// Creates a object for the specified resource. @@ -52,9 +52,9 @@ public MetricDefinition(PrometheusMetricDefinition prometheusMetricDefinition, /// The resource to scrape. /// The Azure global metadata. /// The scrape definition. - public ScrapeDefinition CreateScrapeDefinition(AzureResourceDefinition resource, AzureMetadata azureMetadata) + public ScrapeDefinition CreateScrapeDefinition(IAzureResourceDefinition resource, AzureMetadata azureMetadata) { - return new ScrapeDefinition( + return new ScrapeDefinition( AzureMetricConfiguration, PrometheusMetricDefinition, Scraping, diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/AppPlanResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/AppPlanResourceDefinition.cs index 0da1cf6c0..aa3a9d55e 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/AppPlanResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/AppPlanResourceDefinition.cs @@ -12,5 +12,8 @@ public AppPlanResourceDefinition(string resourceGroupName, string appPlanName) /// The name of the Azure App Plan to get metrics for. /// public string AppPlanName { get; set; } + + /// + public override string GetResourceName() => AppPlanName; } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/ContainerInstanceResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/ContainerInstanceResourceDefinition.cs index e7dde8e93..142747494 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/ContainerInstanceResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/ContainerInstanceResourceDefinition.cs @@ -9,5 +9,8 @@ public ContainerInstanceResourceDefinition(string resourceGroupName, string cont } public string ContainerGroup { get; } + + /// + public override string GetResourceName() => ContainerGroup; } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/ContainerRegistryResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/ContainerRegistryResourceDefinition.cs index ac9d3079e..550ecbc2d 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/ContainerRegistryResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/ContainerRegistryResourceDefinition.cs @@ -9,5 +9,8 @@ public ContainerRegistryResourceDefinition(string resourceGroupName, string regi } public string RegistryName { get; } + + /// + public override string GetResourceName() => RegistryName; } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/CosmosDbResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/CosmosDbResourceDefinition.cs index 8dd807fef..7a1985b66 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/CosmosDbResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/CosmosDbResourceDefinition.cs @@ -9,5 +9,8 @@ public CosmosDbResourceDefinition(string resourceGroupName, string dbName) } public string DbName { get; } + + /// + public override string GetResourceName() => DbName; } } diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/FunctionAppResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/FunctionAppResourceDefinition.cs index 1f20e081d..05148a2de 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/FunctionAppResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/FunctionAppResourceDefinition.cs @@ -1,6 +1,6 @@ namespace Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes { - public class FunctionAppResourceDefinition : AzureResourceDefinition + public class FunctionAppResourceDefinition : AzureResourceDefinition, IAppServiceResourceDefinition { public FunctionAppResourceDefinition(string resourceGroupName, string functionAppName) : base(ResourceType.FunctionApp, resourceGroupName) @@ -17,5 +17,8 @@ public FunctionAppResourceDefinition(string resourceGroupName, string functionAp /// The name of the deployment slot. /// public string SlotName { get; set; } + + /// + public override string GetResourceName() => FunctionAppName; } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/GenericAzureResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/GenericAzureResourceDefinition.cs index 61cbcad7f..c08708e5d 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/GenericAzureResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/GenericAzureResourceDefinition.cs @@ -11,5 +11,8 @@ public GenericAzureResourceDefinition(string resourceGroupName, string filter, s public string Filter { get; } public string ResourceUri { get; } + + /// + public override string GetResourceName() => null; } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/NetworkInterfaceResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/NetworkInterfaceResourceDefinition.cs index f2aaf10aa..332d3ba24 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/NetworkInterfaceResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/NetworkInterfaceResourceDefinition.cs @@ -9,5 +9,8 @@ public NetworkInterfaceResourceDefinition(string resourceGroupName, string netwo } public string NetworkInterfaceName { get; } + + /// + public override string GetResourceName() => NetworkInterfaceName; } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/PostgreSqlResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/PostgreSqlResourceDefinition.cs index 3d8a339bb..d43a6cfee 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/PostgreSqlResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/PostgreSqlResourceDefinition.cs @@ -9,5 +9,8 @@ public PostgreSqlResourceDefinition(string resourceGroupName, string serverName) } public string ServerName { get; } + + /// + public override string GetResourceName() => ServerName; } } diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/RedisCacheResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/RedisCacheResourceDefinition.cs index e71087e3c..2a3b96655 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/RedisCacheResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/RedisCacheResourceDefinition.cs @@ -9,5 +9,8 @@ public RedisCacheResourceDefinition(string resourceGroupName, string cacheName) } public string CacheName { get; } + + /// + public override string GetResourceName() => CacheName; } } diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/ServiceBusQueueResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/ServiceBusQueueResourceDefinition.cs index 9836a90f0..9ba3bdcae 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/ServiceBusQueueResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/ServiceBusQueueResourceDefinition.cs @@ -11,5 +11,8 @@ public ServiceBusQueueResourceDefinition(string resourceGroupName, string ns, st public string Namespace { get; } public string QueueName { get; } + + /// + public override string GetResourceName() => QueueName; } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/SqlDatabaseResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/SqlDatabaseResourceDefinition.cs index 1f935127b..747e439f8 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/SqlDatabaseResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/SqlDatabaseResourceDefinition.cs @@ -27,5 +27,8 @@ public SqlDatabaseResourceDefinition(string resourceGroupName, string serverName /// The name of the database. /// public string DatabaseName { get; } + + /// + public override string GetResourceName() => DatabaseName; } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/SqlManagedInstanceResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/SqlManagedInstanceResourceDefinition.cs index bc6368a9b..cc2d23d7d 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/SqlManagedInstanceResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/SqlManagedInstanceResourceDefinition.cs @@ -20,5 +20,8 @@ public SqlManagedInstanceResourceDefinition(string resourceGroupName, string ins /// The name of the Azure SQL Managed Instance resource. /// public string InstanceName { get; } + + /// + public override string GetResourceName() => InstanceName; } } diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/StorageQueueResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/StorageQueueResourceDefinition.cs index d4787012e..7b1005ee4 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/StorageQueueResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/StorageQueueResourceDefinition.cs @@ -13,5 +13,8 @@ public StorageQueueResourceDefinition(string resourceGroupName, string accountNa public string AccountName { get; } public string QueueName { get; } public Secret SasToken { get; } + + /// + public override string GetResourceName() => AccountName; } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/VirtualMachineResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/VirtualMachineResourceDefinition.cs index a999ef243..e507db534 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/VirtualMachineResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/VirtualMachineResourceDefinition.cs @@ -9,5 +9,8 @@ public VirtualMachineResourceDefinition(string resourceGroupName, string virtual } public string VirtualMachineName { get; } + + /// + public override string GetResourceName() => VirtualMachineName; } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/VirtualMachineScaleSetsResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/VirtualMachineScaleSetsResourceDefinition.cs index 009b13eb2..d666a0e2c 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/VirtualMachineScaleSetsResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/VirtualMachineScaleSetsResourceDefinition.cs @@ -9,5 +9,8 @@ public VirtualMachineScaleSetResourceDefinition(string resourceGroupName, string } public string ScaleSetName { get; } + + /// + public override string GetResourceName() => ScaleSetName; } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/WebAppResourceDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/WebAppResourceDefinition.cs index ecc178981..30c919a8e 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/WebAppResourceDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ResourceTypes/WebAppResourceDefinition.cs @@ -1,6 +1,6 @@ namespace Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes { - public class WebAppResourceDefinition : AzureResourceDefinition + public class WebAppResourceDefinition : AzureResourceDefinition, IAppServiceResourceDefinition { public WebAppResourceDefinition(string resourceGroupName, string webAppName, string slotName) : base(ResourceType.WebApp, resourceGroupName) @@ -18,5 +18,8 @@ public WebAppResourceDefinition(string resourceGroupName, string webAppName, str /// The name of the deployment slot. /// public string SlotName { get; set; } + + /// + public override string GetResourceName() => WebAppName; } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ScrapeDefinition.cs b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ScrapeDefinition.cs index e54ae9346..b74b00737 100644 --- a/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ScrapeDefinition.cs +++ b/src/Promitor.Core.Scraping/Configuration/Model/Metrics/ScrapeDefinition.cs @@ -5,7 +5,7 @@ namespace Promitor.Core.Scraping.Configuration.Model.Metrics /// /// Defines an individual Azure resource to be scraped. /// - public class ScrapeDefinition where TResourceDefinition: AzureResourceDefinition + public class ScrapeDefinition where TResourceDefinition : class, IAzureResourceDefinition { /// /// Creates a new instance of the class. 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 f5190f2ab..bab753220 100644 --- a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Mapping/V1MappingProfile.cs +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Mapping/V1MappingProfile.cs @@ -44,7 +44,7 @@ public V1MappingProfile() CreateMap() .ForMember(m => m.PrometheusMetricDefinition, o => o.MapFrom(v1 => v1)); - CreateMap() + CreateMap() .Include() .Include() .Include() diff --git a/src/Promitor.Core.Scraping/Factories/MetricScraperFactory.cs b/src/Promitor.Core.Scraping/Factories/MetricScraperFactory.cs index daa9872a4..1b8779449 100644 --- a/src/Promitor.Core.Scraping/Factories/MetricScraperFactory.cs +++ b/src/Promitor.Core.Scraping/Factories/MetricScraperFactory.cs @@ -33,7 +33,7 @@ public MetricScraperFactory(IConfiguration configuration, ILoggerResource type to scrape /// Metrics collector for our Prometheus scraping endpoint /// Metrics collector for our runtime - public IScraper CreateScraper(ResourceType metricDefinitionResourceType, AzureMetadata azureMetadata, + public IScraper CreateScraper(ResourceType metricDefinitionResourceType, AzureMetadata azureMetadata, IPrometheusMetricWriter prometheusMetricWriter, IRuntimeMetricsCollector runtimeMetricsCollector) { var azureMonitorClient = CreateAzureMonitorClient(azureMetadata, runtimeMetricsCollector); diff --git a/src/Promitor.Core.Scraping/Interfaces/IScraper.cs b/src/Promitor.Core.Scraping/Interfaces/IScraper.cs index be90ac551..51c5d6310 100644 --- a/src/Promitor.Core.Scraping/Interfaces/IScraper.cs +++ b/src/Promitor.Core.Scraping/Interfaces/IScraper.cs @@ -3,7 +3,7 @@ namespace Promitor.Core.Scraping.Interfaces { - public interface IScraper where TResourceDefinition : AzureResourceDefinition + public interface IScraper where TResourceDefinition : class, IAzureResourceDefinition { Task ScrapeAsync(ScrapeDefinition scrapeDefinition); } diff --git a/src/Promitor.Core.Scraping/ResourceTypes/AppPlanScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/AppPlanScraper.cs index 0ca999ae2..84bfc6760 100644 --- a/src/Promitor.Core.Scraping/ResourceTypes/AppPlanScraper.cs +++ b/src/Promitor.Core.Scraping/ResourceTypes/AppPlanScraper.cs @@ -1,12 +1,9 @@ -using System; -using System.Threading.Tasks; -using Microsoft.Azure.Management.Monitor.Fluent.Models; using Promitor.Core.Scraping.Configuration.Model.Metrics; using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; namespace Promitor.Core.Scraping.ResourceTypes { - internal class AppPlanScraper : Scraper + internal class AppPlanScraper : AzureMonitorScraper { private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Web/serverfarms/{2}"; @@ -15,15 +12,9 @@ public AppPlanScraper(ScraperConfiguration scraperConfiguration) { } - protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, AppPlanResourceDefinition resource, AggregationType aggregationType, TimeSpan aggregationInterval) + protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, AppPlanResourceDefinition resource) { - var resourceUri = string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, resource.AppPlanName); - - var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; - var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; - var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName,dimensionName, aggregationType, aggregationInterval, resourceUri); - - return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, resource.AppPlanName, resourceUri, foundMetricValue); + return string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, resource.AppPlanName); } } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/ResourceTypes/ContainerInstanceScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/ContainerInstanceScraper.cs index 9164f5033..69d1d7551 100644 --- a/src/Promitor.Core.Scraping/ResourceTypes/ContainerInstanceScraper.cs +++ b/src/Promitor.Core.Scraping/ResourceTypes/ContainerInstanceScraper.cs @@ -1,12 +1,9 @@ -using System; -using System.Threading.Tasks; -using Microsoft.Azure.Management.Monitor.Fluent.Models; -using Promitor.Core.Scraping.Configuration.Model.Metrics; +using Promitor.Core.Scraping.Configuration.Model.Metrics; using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; namespace Promitor.Core.Scraping.ResourceTypes { - public class ContainerInstanceScraper : Scraper + public class ContainerInstanceScraper : AzureMonitorScraper { private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.ContainerInstance/containerGroups/{2}"; @@ -15,15 +12,9 @@ public ContainerInstanceScraper(ScraperConfiguration scraperConfiguration) { } - protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, ContainerInstanceResourceDefinition resource, AggregationType aggregationType, TimeSpan aggregationInterval) + protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, ContainerInstanceResourceDefinition resource) { - var resourceUri = string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, resource.ContainerGroup); - - var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; - var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; - var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName,dimensionName, aggregationType, aggregationInterval, resourceUri); - - return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, resource.ContainerGroup, resourceUri, foundMetricValue); + return string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, resource.ContainerGroup); } } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/ResourceTypes/ContainerRegistryScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/ContainerRegistryScraper.cs index f9de55e0a..a61354c76 100644 --- a/src/Promitor.Core.Scraping/ResourceTypes/ContainerRegistryScraper.cs +++ b/src/Promitor.Core.Scraping/ResourceTypes/ContainerRegistryScraper.cs @@ -1,12 +1,9 @@ -using System; -using System.Threading.Tasks; -using Microsoft.Azure.Management.Monitor.Fluent.Models; -using Promitor.Core.Scraping.Configuration.Model.Metrics; +using Promitor.Core.Scraping.Configuration.Model.Metrics; using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; namespace Promitor.Core.Scraping.ResourceTypes { - public class ContainerRegistryScraper : Scraper + public class ContainerRegistryScraper : AzureMonitorScraper { private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.ContainerRegistry/registries/{2}"; @@ -15,15 +12,9 @@ public ContainerRegistryScraper(ScraperConfiguration scraperConfiguration) { } - protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, ContainerRegistryResourceDefinition resource, AggregationType aggregationType, TimeSpan aggregationInterval) + protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, ContainerRegistryResourceDefinition resource) { - var resourceUri = string.Format(ResourceUriTemplate, subscriptionId, scrapeDefinition.ResourceGroupName, resource.RegistryName); - - var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; - var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; - var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName,dimensionName, aggregationType, aggregationInterval, resourceUri); - - return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, resource.RegistryName, resourceUri, foundMetricValue); + return string.Format(ResourceUriTemplate, subscriptionId, scrapeDefinition.ResourceGroupName, resource.RegistryName); } } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/ResourceTypes/CosmosDbScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/CosmosDbScraper.cs index f54d34c14..59846b837 100644 --- a/src/Promitor.Core.Scraping/ResourceTypes/CosmosDbScraper.cs +++ b/src/Promitor.Core.Scraping/ResourceTypes/CosmosDbScraper.cs @@ -1,12 +1,9 @@ -using System; -using System.Threading.Tasks; -using Microsoft.Azure.Management.Monitor.Fluent.Models; -using Promitor.Core.Scraping.Configuration.Model.Metrics; +using Promitor.Core.Scraping.Configuration.Model.Metrics; using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; namespace Promitor.Core.Scraping.ResourceTypes { - public class CosmosDbScraper : Scraper + public class CosmosDbScraper : AzureMonitorScraper { private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.DocumentDB/databaseAccounts/{2}"; @@ -15,15 +12,9 @@ public CosmosDbScraper(ScraperConfiguration scraperConfiguration) { } - protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, CosmosDbResourceDefinition resource, AggregationType aggregationType, TimeSpan aggregationInterval) + protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, CosmosDbResourceDefinition resource) { - var resourceUri = string.Format(ResourceUriTemplate, subscriptionId, scrapeDefinition.ResourceGroupName, resource.DbName); - - var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; - var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; - var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName, dimensionName, aggregationType, aggregationInterval, resourceUri); - - return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, resource.DbName, resourceUri, foundMetricValue); + return string.Format(ResourceUriTemplate, subscriptionId, scrapeDefinition.ResourceGroupName, resource.DbName); } } } diff --git a/src/Promitor.Core.Scraping/ResourceTypes/FunctionAppScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/FunctionAppScraper.cs index 1c2ebeac4..21d084331 100644 --- a/src/Promitor.Core.Scraping/ResourceTypes/FunctionAppScraper.cs +++ b/src/Promitor.Core.Scraping/ResourceTypes/FunctionAppScraper.cs @@ -1,13 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Microsoft.Azure.Management.Monitor.Fluent.Models; using Promitor.Core.Scraping.Configuration.Model.Metrics; using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; namespace Promitor.Core.Scraping.ResourceTypes { - internal class FunctionAppScraper : Scraper + internal class FunctionAppScraper : AppServiceScraper { private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Web/sites/{2}"; @@ -16,27 +12,9 @@ public FunctionAppScraper(ScraperConfiguration scraperConfiguration) { } - protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, FunctionAppResourceDefinition resource, AggregationType aggregationType, TimeSpan aggregationInterval) + protected override string BuildResourceUriWithoutDeploymentSlot(string subscriptionId, ScrapeDefinition scrapeDefinition, FunctionAppResourceDefinition resource) { - var slotName = string.IsNullOrWhiteSpace(resource.SlotName) ? "production" : resource.SlotName; - var resourceUri = string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, resource.FunctionAppName); - - // Production slot should not be suffixed in resource URI - if (slotName != "production") - { - resourceUri += $"/slots/{slotName}"; - } - - var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; - var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; - var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName, dimensionName, aggregationType, aggregationInterval, resourceUri); - - var customLabels = new Dictionary - { - {"slot_name",slotName } - }; - - return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, resource.FunctionAppName, resourceUri, foundMetricValue, customLabels); + return string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, resource.FunctionAppName); } } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/ResourceTypes/GenericScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/GenericScraper.cs index c98287228..b4d3f3573 100644 --- a/src/Promitor.Core.Scraping/ResourceTypes/GenericScraper.cs +++ b/src/Promitor.Core.Scraping/ResourceTypes/GenericScraper.cs @@ -1,12 +1,9 @@ -using System; -using System.Threading.Tasks; -using Microsoft.Azure.Management.Monitor.Fluent.Models; -using Promitor.Core.Scraping.Configuration.Model.Metrics; +using Promitor.Core.Scraping.Configuration.Model.Metrics; using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; namespace Promitor.Core.Scraping.ResourceTypes { - internal class GenericScraper : Scraper + internal class GenericScraper : AzureMonitorScraper { private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/{2}"; @@ -15,14 +12,9 @@ public GenericScraper(ScraperConfiguration scraperConfiguration) { } - protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, GenericAzureResourceDefinition resource, AggregationType aggregationType, TimeSpan aggregationInterval) + protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, GenericAzureResourceDefinition resource) { - var resourceUri = string.Format(ResourceUriTemplate, subscriptionId, scrapeDefinition.ResourceGroupName, resource.ResourceUri); - var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; - var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; - var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName,dimensionName, aggregationType, aggregationInterval, resourceUri, resource.Filter); - - return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, resourceUri, foundMetricValue); + return string.Format(ResourceUriTemplate, subscriptionId, scrapeDefinition.ResourceGroupName, resource.ResourceUri); } } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/ResourceTypes/NetworkInterfaceScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/NetworkInterfaceScraper.cs index b0a85de11..70e51c922 100644 --- a/src/Promitor.Core.Scraping/ResourceTypes/NetworkInterfaceScraper.cs +++ b/src/Promitor.Core.Scraping/ResourceTypes/NetworkInterfaceScraper.cs @@ -1,12 +1,9 @@ -using System; -using System.Threading.Tasks; -using Microsoft.Azure.Management.Monitor.Fluent.Models; using Promitor.Core.Scraping.Configuration.Model.Metrics; using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; namespace Promitor.Core.Scraping.ResourceTypes { - internal class NetworkInterfaceScraper : Scraper + internal class NetworkInterfaceScraper : AzureMonitorScraper { private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Network/networkInterfaces/{2}"; @@ -15,15 +12,9 @@ public NetworkInterfaceScraper(ScraperConfiguration scraperConfiguration) { } - protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, NetworkInterfaceResourceDefinition resource, AggregationType aggregationType, TimeSpan aggregationInterval) + protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, NetworkInterfaceResourceDefinition resource) { - var resourceUri = string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, resource.NetworkInterfaceName); - - var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; - var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; - var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName, dimensionName, aggregationType, aggregationInterval, resourceUri); - - return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, resource.NetworkInterfaceName, resourceUri, foundMetricValue); + return string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, resource.NetworkInterfaceName); } } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/ResourceTypes/PostgreSqlScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/PostgreSqlScraper.cs index ee0cf4f9d..155ac5ce5 100644 --- a/src/Promitor.Core.Scraping/ResourceTypes/PostgreSqlScraper.cs +++ b/src/Promitor.Core.Scraping/ResourceTypes/PostgreSqlScraper.cs @@ -1,12 +1,9 @@ -using Microsoft.Azure.Management.Monitor.Fluent.Models; -using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; -using System; -using System.Threading.Tasks; +using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; using Promitor.Core.Scraping.Configuration.Model.Metrics; namespace Promitor.Core.Scraping.ResourceTypes { - public class PostgreSqlScraper : Scraper + public class PostgreSqlScraper : AzureMonitorScraper { private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.DBforPostgreSQL/servers/{2}"; @@ -15,15 +12,9 @@ public PostgreSqlScraper(ScraperConfiguration scraperConfiguration) { } - protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, PostgreSqlResourceDefinition resource, AggregationType aggregationType, TimeSpan aggregationInterval) + protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, PostgreSqlResourceDefinition resource) { - var resourceUri = string.Format(ResourceUriTemplate, subscriptionId, scrapeDefinition.ResourceGroupName, resource.ServerName); - - var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; - var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; - var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName,dimensionName, aggregationType, aggregationInterval, resourceUri); - - return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, resource.ServerName, resourceUri, foundMetricValue); + return string.Format(ResourceUriTemplate, subscriptionId, scrapeDefinition.ResourceGroupName, resource.ServerName); } } } diff --git a/src/Promitor.Core.Scraping/ResourceTypes/RedisCacheScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/RedisCacheScraper.cs index 6f970acc5..2551939cd 100644 --- a/src/Promitor.Core.Scraping/ResourceTypes/RedisCacheScraper.cs +++ b/src/Promitor.Core.Scraping/ResourceTypes/RedisCacheScraper.cs @@ -1,12 +1,9 @@ -using Microsoft.Azure.Management.Monitor.Fluent.Models; -using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; -using System; -using System.Threading.Tasks; +using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; using Promitor.Core.Scraping.Configuration.Model.Metrics; namespace Promitor.Core.Scraping.ResourceTypes { - public class RedisCacheScraper : Scraper + public class RedisCacheScraper : AzureMonitorScraper { private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Cache/Redis/{2}"; @@ -15,15 +12,9 @@ public RedisCacheScraper(ScraperConfiguration scraperConfiguration) { } - protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, RedisCacheResourceDefinition resource, AggregationType aggregationType, TimeSpan aggregationInterval) + protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, RedisCacheResourceDefinition resource) { - var resourceUri = string.Format(ResourceUriTemplate, subscriptionId, scrapeDefinition.ResourceGroupName, resource.CacheName); - - var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; - var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; - var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName,dimensionName, aggregationType, aggregationInterval, resourceUri); - - return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, resource.CacheName, resourceUri, foundMetricValue); + return string.Format(ResourceUriTemplate, subscriptionId, scrapeDefinition.ResourceGroupName, resource.CacheName); } } } diff --git a/src/Promitor.Core.Scraping/ResourceTypes/ServiceBusQueueScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/ServiceBusQueueScraper.cs index b1bdc2127..30bd12fc5 100644 --- a/src/Promitor.Core.Scraping/ResourceTypes/ServiceBusQueueScraper.cs +++ b/src/Promitor.Core.Scraping/ResourceTypes/ServiceBusQueueScraper.cs @@ -1,13 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Microsoft.Azure.Management.Monitor.Fluent.Models; +using System.Collections.Generic; using Promitor.Core.Scraping.Configuration.Model.Metrics; using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; namespace Promitor.Core.Scraping.ResourceTypes { - public class ServiceBusQueueScraper : Scraper + public class ServiceBusQueueScraper : AzureMonitorScraper { private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.ServiceBus/namespaces/{2}"; @@ -16,21 +13,23 @@ public ServiceBusQueueScraper(ScraperConfiguration scraperConfiguration) { } - protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, ServiceBusQueueResourceDefinition resource, AggregationType aggregationType, TimeSpan aggregationInterval) + protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, ServiceBusQueueResourceDefinition resource) { - var resourceUri = string.Format(ResourceUriTemplate, subscriptionId, scrapeDefinition.ResourceGroupName, resource.Namespace); + return string.Format(ResourceUriTemplate, subscriptionId, scrapeDefinition.ResourceGroupName, resource.Namespace); + } - var filter = $"EntityName eq '{resource.QueueName}'"; - var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; - var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; - var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName,dimensionName, aggregationType, aggregationInterval, resourceUri, filter); + protected override Dictionary DetermineMetricLabels(ServiceBusQueueResourceDefinition resourceDefinition) + { + var metricLabels = base.DetermineMetricLabels(resourceDefinition); - var labels = new Dictionary - { - {"entity_name", resource.QueueName} - }; + metricLabels.TryAdd("entity_name", resourceDefinition.QueueName); - return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, resource.Namespace, resourceUri, foundMetricValue, labels); + return metricLabels; + } + + protected override string DetermineMetricFilter(ServiceBusQueueResourceDefinition resourceDefinition) + { + return $"EntityName eq '{resourceDefinition.QueueName}'"; } } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/ResourceTypes/SqlDatabaseScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/SqlDatabaseScraper.cs index 53f78177a..3a9aca9f0 100644 --- a/src/Promitor.Core.Scraping/ResourceTypes/SqlDatabaseScraper.cs +++ b/src/Promitor.Core.Scraping/ResourceTypes/SqlDatabaseScraper.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Microsoft.Azure.Management.Monitor.Fluent.Models; +using System.Collections.Generic; using Promitor.Core.Scraping.Configuration.Model.Metrics; using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; @@ -10,39 +7,28 @@ namespace Promitor.Core.Scraping.ResourceTypes /// /// Scrapes an Azure SQL Database. /// - public class SqlDatabaseScraper : Scraper + public class SqlDatabaseScraper : AzureMonitorScraper { private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Sql/servers/{2}/databases/{3}"; - /// - /// Initializes an instance of the class. - /// - /// The scraper configuration public SqlDatabaseScraper(ScraperConfiguration scraperConfiguration) : base(scraperConfiguration) { } - protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, SqlDatabaseResourceDefinition resource, AggregationType aggregationType, TimeSpan aggregationInterval) + protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, SqlDatabaseResourceDefinition resource) { - var resourceUri = string.Format( - ResourceUriTemplate, - AzureMetadata.SubscriptionId, - scrapeDefinition.ResourceGroupName, - resource.ServerName, - resource.DatabaseName); + return string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, resource.ServerName, resource.DatabaseName); + } - var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; - var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; - var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName, dimensionName, aggregationType, aggregationInterval, resourceUri); + protected override Dictionary DetermineMetricLabels(SqlDatabaseResourceDefinition resourceDefinition) + { + var metricLabels = base.DetermineMetricLabels(resourceDefinition); - var labels = new Dictionary - { - {"server", resource.ServerName}, - {"database", resource.DatabaseName} - }; + metricLabels.TryAdd("server", resourceDefinition.ServerName); + metricLabels.TryAdd("database", resourceDefinition.DatabaseName); - return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, null, resourceUri, foundMetricValue, labels); + return metricLabels; } } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/ResourceTypes/SqlManagedInstanceScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/SqlManagedInstanceScraper.cs index ec748a674..a2f4d9d0c 100644 --- a/src/Promitor.Core.Scraping/ResourceTypes/SqlManagedInstanceScraper.cs +++ b/src/Promitor.Core.Scraping/ResourceTypes/SqlManagedInstanceScraper.cs @@ -1,36 +1,19 @@ -using System; -using System.Threading.Tasks; -using Microsoft.Azure.Management.Monitor.Fluent.Models; -using Promitor.Core.Scraping.Configuration.Model.Metrics; +using Promitor.Core.Scraping.Configuration.Model.Metrics; using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; namespace Promitor.Core.Scraping.ResourceTypes { - public class SqlManagedInstanceScraper : Scraper + public class SqlManagedInstanceScraper : AzureMonitorScraper { private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Sql/managedInstances/{2}"; - /// - /// Initializes an instance of the class. - /// - /// The scraper configuration public SqlManagedInstanceScraper(ScraperConfiguration scraperConfiguration) : base(scraperConfiguration) { } - protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, SqlManagedInstanceResourceDefinition resourceResourceDefinition, AggregationType aggregationType, TimeSpan aggregationInterval) + protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, SqlManagedInstanceResourceDefinition resource) { - var resourceUri = string.Format( - ResourceUriTemplate, - AzureMetadata.SubscriptionId, - scrapeDefinition.ResourceGroupName, - resourceResourceDefinition.InstanceName); - - var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; - var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; - var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName, dimensionName, aggregationType, aggregationInterval, resourceUri); - - return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, null, resourceUri, foundMetricValue); + return string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, resource.InstanceName); } } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/ResourceTypes/StorageQueueScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/StorageQueueScraper.cs index 237b09cce..04d0f8ae4 100644 --- a/src/Promitor.Core.Scraping/ResourceTypes/StorageQueueScraper.cs +++ b/src/Promitor.Core.Scraping/ResourceTypes/StorageQueueScraper.cs @@ -20,7 +20,7 @@ public StorageQueueScraper(ScraperConfiguration scraperConfiguration) _azureStorageQueueClient = new AzureStorageQueueClient(scraperConfiguration.Logger); } - protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, StorageQueueResourceDefinition resource, AggregationType aggregationType, TimeSpan aggregationInterval) + protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, StorageQueueResourceDefinition resource, AggregationType aggregationType, TimeSpan aggregationInterval) { Guard.NotNull(scrapeDefinition, nameof(scrapeDefinition)); Guard.NotNull(scrapeDefinition.AzureMetricConfiguration, nameof(scrapeDefinition.AzureMetricConfiguration)); @@ -55,5 +55,10 @@ protected override async Task ScrapeResourceAsync(string subscript return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, resource.AccountName, resourceUri, measuredMetrics, labels); } + + protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, StorageQueueResourceDefinition resource) + { + return string.Format(ResourceUriTemplate, subscriptionId, scrapeDefinition.ResourceGroupName, resource.AccountName); + } } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/ResourceTypes/VirtualMachineScaleSetScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/VirtualMachineScaleSetScraper.cs index fa4c50416..a1e0f43a6 100644 --- a/src/Promitor.Core.Scraping/ResourceTypes/VirtualMachineScaleSetScraper.cs +++ b/src/Promitor.Core.Scraping/ResourceTypes/VirtualMachineScaleSetScraper.cs @@ -1,12 +1,9 @@ -using System; -using System.Threading.Tasks; -using Microsoft.Azure.Management.Monitor.Fluent.Models; using Promitor.Core.Scraping.Configuration.Model.Metrics; using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; namespace Promitor.Core.Scraping.ResourceTypes { - internal class VirtualMachineScaleSetScraper : Scraper + internal class VirtualMachineScaleSetScraper : AzureMonitorScraper { private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Compute/virtualMachineScaleSets/{2}"; @@ -15,15 +12,9 @@ public VirtualMachineScaleSetScraper(ScraperConfiguration scraperConfiguration) { } - protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, VirtualMachineScaleSetResourceDefinition resource, AggregationType aggregationType, TimeSpan aggregationInterval) + protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, VirtualMachineScaleSetResourceDefinition resource) { - var resourceUri = string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, resource.ScaleSetName); - - var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; - var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; - var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName,dimensionName, aggregationType, aggregationInterval, resourceUri); - - return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, resource.ScaleSetName, resourceUri, foundMetricValue); + return string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, resource.ScaleSetName); } } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/ResourceTypes/VirtualMachineScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/VirtualMachineScraper.cs index 2eedf6343..415f246df 100644 --- a/src/Promitor.Core.Scraping/ResourceTypes/VirtualMachineScraper.cs +++ b/src/Promitor.Core.Scraping/ResourceTypes/VirtualMachineScraper.cs @@ -1,12 +1,9 @@ -using System; -using System.Threading.Tasks; -using Microsoft.Azure.Management.Monitor.Fluent.Models; using Promitor.Core.Scraping.Configuration.Model.Metrics; using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; namespace Promitor.Core.Scraping.ResourceTypes { - internal class VirtualMachineScraper : Scraper + internal class VirtualMachineScraper : AzureMonitorScraper { private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Compute/virtualMachines/{2}"; @@ -15,15 +12,9 @@ public VirtualMachineScraper(ScraperConfiguration scraperConfiguration) { } - protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, VirtualMachineResourceDefinition resource, AggregationType aggregationType, TimeSpan aggregationInterval) + protected override string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, VirtualMachineResourceDefinition resource) { - var resourceUri = string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, resource.VirtualMachineName); - - var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; - var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; - var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName,dimensionName, aggregationType, aggregationInterval, resourceUri); - - return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, resource.VirtualMachineName, resourceUri, foundMetricValue); + return string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, resource.VirtualMachineName); } } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/ResourceTypes/WebAppScraper.cs b/src/Promitor.Core.Scraping/ResourceTypes/WebAppScraper.cs index eff9364af..fc69a1fb1 100644 --- a/src/Promitor.Core.Scraping/ResourceTypes/WebAppScraper.cs +++ b/src/Promitor.Core.Scraping/ResourceTypes/WebAppScraper.cs @@ -1,13 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Microsoft.Azure.Management.Monitor.Fluent.Models; using Promitor.Core.Scraping.Configuration.Model.Metrics; using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes; namespace Promitor.Core.Scraping.ResourceTypes { - internal class WebAppScraper : Scraper + internal class WebAppScraper : AppServiceScraper { private const string ResourceUriTemplate = "subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Web/sites/{2}"; @@ -16,27 +12,9 @@ public WebAppScraper(ScraperConfiguration scraperConfiguration) { } - protected override async Task ScrapeResourceAsync(string subscriptionId, ScrapeDefinition scrapeDefinition, WebAppResourceDefinition resource, AggregationType aggregationType, TimeSpan aggregationInterval) + protected override string BuildResourceUriWithoutDeploymentSlot(string subscriptionId, ScrapeDefinition scrapeDefinition, WebAppResourceDefinition resource) { - var slotName = string.IsNullOrWhiteSpace(resource.SlotName) ? "production" : resource.SlotName; - var resourceUri = string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, resource.WebAppName); - - // Production slot should not be suffixed in resource URI - if (slotName != "production") - { - resourceUri += $"/slots/{slotName}"; - } - - var metricName = scrapeDefinition.AzureMetricConfiguration.MetricName; - var dimensionName = scrapeDefinition.AzureMetricConfiguration.Dimension?.Name; - var foundMetricValue = await AzureMonitorClient.QueryMetricAsync(metricName, dimensionName, aggregationType, aggregationInterval, resourceUri); - - var customLabels = new Dictionary - { - {"slot_name", slotName} - }; - - return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, resource.WebAppName, resourceUri, foundMetricValue, customLabels); + return string.Format(ResourceUriTemplate, AzureMetadata.SubscriptionId, scrapeDefinition.ResourceGroupName, resource.WebAppName); } } } \ No newline at end of file diff --git a/src/Promitor.Core.Scraping/Scraper.cs b/src/Promitor.Core.Scraping/Scraper.cs index 3746cb01b..c2e103943 100644 --- a/src/Promitor.Core.Scraping/Scraper.cs +++ b/src/Promitor.Core.Scraping/Scraper.cs @@ -10,20 +10,17 @@ using Promitor.Core.Scraping.Prometheus.Interfaces; using Promitor.Integrations.AzureMonitor; -// ReSharper disable All - namespace Promitor.Core.Scraping { /// - /// Azure Monitor Scraper + /// A generic scraper /// /// Type of metric definition that is being used - public abstract class Scraper : IScraper - where TResourceDefinition : AzureResourceDefinition + public abstract class Scraper : IScraper + where TResourceDefinition : class, IAzureResourceDefinition { private readonly ILogger _logger; private readonly IPrometheusMetricWriter _prometheusMetricWriter; - private readonly ScraperConfiguration _scraperConfiguration; /// /// Constructor @@ -33,7 +30,6 @@ protected Scraper(ScraperConfiguration scraperConfiguration) Guard.NotNull(scraperConfiguration, nameof(scraperConfiguration)); _logger = scraperConfiguration.Logger; - _scraperConfiguration = scraperConfiguration; _prometheusMetricWriter = scraperConfiguration.PrometheusMetricWriter; AzureMetadata = scraperConfiguration.AzureMetadata; @@ -45,32 +41,32 @@ protected Scraper(ScraperConfiguration scraperConfiguration) /// protected AzureMetadata AzureMetadata { get; } - /// - /// Default configuration for metrics - /// - protected MetricDefaults MetricDefaults { get; } - /// /// Client to interact with Azure Monitor /// protected AzureMonitorClient AzureMonitorClient { get; } - public async Task ScrapeAsync(ScrapeDefinition scrapeDefinition) + public async Task ScrapeAsync(ScrapeDefinition scrapeDefinition) { - try + if (scrapeDefinition == null) { - if (scrapeDefinition == null) - { - throw new ArgumentNullException(nameof(scrapeDefinition)); - } + throw new ArgumentNullException(nameof(scrapeDefinition)); + } + var aggregationInterval = scrapeDefinition.AzureMetricConfiguration?.Aggregation?.Interval; + if (aggregationInterval == null) + { + throw new ArgumentNullException(nameof(scrapeDefinition)); + } + + try + { var castedMetricDefinition = scrapeDefinition.Resource as TResourceDefinition; if (castedMetricDefinition == null) { throw new ArgumentException($"Could not cast metric definition of type {scrapeDefinition.Resource.ResourceType} to {typeof(TResourceDefinition)}. Payload: {JsonConvert.SerializeObject(scrapeDefinition)}"); } - var aggregationInterval = scrapeDefinition.AzureMetricConfiguration.Aggregation.Interval; var aggregationType = scrapeDefinition.AzureMetricConfiguration.Aggregation.Type; var scrapedMetricResult = await ScrapeResourceAsync( AzureMetadata.SubscriptionId, @@ -93,7 +89,7 @@ public async Task ScrapeAsync(ScrapeDefinition scrapeDe } } - private void LogMeasuredMetrics(ScrapeDefinition scrapeDefinition, ScrapeResult scrapedMetricResult, TimeSpan? aggregationInterval) + private void LogMeasuredMetrics(ScrapeDefinition scrapeDefinition, ScrapeResult scrapedMetricResult, TimeSpan? aggregationInterval) { foreach (var measuredMetric in scrapedMetricResult.MetricValues) { @@ -156,9 +152,18 @@ private void HandleErrorResponseException(ErrorResponseException errorResponseEx /// Interval that is used to aggregate metrics protected abstract Task ScrapeResourceAsync( string subscriptionId, - ScrapeDefinition scrapeDefinition, + ScrapeDefinition scrapeDefinition, TResourceDefinition resourceDefinition, AggregationType aggregationType, TimeSpan aggregationInterval); + + /// + /// Builds the URI of the resource to scrape + /// + /// Subscription id in which the resource lives + /// Contains all the information needed to scrape the resource. + /// Contains the resource cast to the specific resource type. + /// Uri of Azure resource + protected abstract string BuildResourceUri(string subscriptionId, ScrapeDefinition scrapeDefinition, TResourceDefinition resource); } } \ No newline at end of file diff --git a/src/Promitor.Scraper.Host/Scheduling/MetricScrapingJob.cs b/src/Promitor.Scraper.Host/Scheduling/MetricScrapingJob.cs index c3c67ce08..9a636d783 100644 --- a/src/Promitor.Scraper.Host/Scheduling/MetricScrapingJob.cs +++ b/src/Promitor.Scraper.Host/Scheduling/MetricScrapingJob.cs @@ -15,7 +15,7 @@ namespace Promitor.Scraper.Host.Scheduling { public class MetricScrapingJob : IScheduledJob { - private readonly ScrapeDefinition _metric; + private readonly ScrapeDefinition _metric; private readonly IMetricsDeclarationProvider _metricsDeclarationProvider; private readonly IPrometheusMetricWriter _prometheusMetricWriter; private readonly IRuntimeMetricsCollector _runtimeMetricsCollector; @@ -23,7 +23,7 @@ public class MetricScrapingJob : IScheduledJob private readonly MetricScraperFactory _metricScraperFactory; - public MetricScrapingJob(ScrapeDefinition metric, + public MetricScrapingJob(ScrapeDefinition metric, IMetricsDeclarationProvider metricsDeclarationProvider, IPrometheusMetricWriter prometheusMetricWriter, IRuntimeMetricsCollector runtimeMetricsCollector, @@ -74,7 +74,7 @@ public async Task ExecuteAsync(CancellationToken cancellationToken) } } - private async Task ScrapeMetric(AzureMetadata azureMetadata, ScrapeDefinition metricDefinitionDefinition) + private async Task ScrapeMetric(AzureMetadata azureMetadata, ScrapeDefinition metricDefinitionDefinition) { _logger.LogInformation("Scraping {MetricName} for resource type {ResourceType}", metricDefinitionDefinition.PrometheusMetricDefinition.Name, metricDefinitionDefinition.Resource.ResourceType); diff --git a/src/Promitor.Scraper.Tests.Unit/Core/Scraping/Configuration/Model/Metrics/MetricDefinitionTests.cs b/src/Promitor.Scraper.Tests.Unit/Core/Scraping/Configuration/Model/Metrics/MetricDefinitionTests.cs index 1e01dd014..a4c48892f 100644 --- a/src/Promitor.Scraper.Tests.Unit/Core/Scraping/Configuration/Model/Metrics/MetricDefinitionTests.cs +++ b/src/Promitor.Scraper.Tests.Unit/Core/Scraping/Configuration/Model/Metrics/MetricDefinitionTests.cs @@ -20,7 +20,7 @@ public void CreateScrapeDefinition_ResourceOverridesResourceGroupName_UsesOverri { // Arrange var resource = new ContainerInstanceResourceDefinition("containerInstanceResourceGroup", "containerGroup"); - var definition = new MetricDefinition(_prometheusMetricDefinition, new Promitor.Core.Scraping.Configuration.Model.Scraping(), new AzureMetricConfiguration(), ResourceType.ContainerInstance, new List {resource}); + var definition = new MetricDefinition(_prometheusMetricDefinition, new Promitor.Core.Scraping.Configuration.Model.Scraping(), new AzureMetricConfiguration(), ResourceType.ContainerInstance, new List {resource}); // Act var scrapeDefinition = definition.CreateScrapeDefinition(resource, _azureMetadata); @@ -34,7 +34,7 @@ public void CreateScrapeDefinition_ResourceDoesNotSpecifyResourceGroupName_UsesG { // Arrange var resource = new ContainerInstanceResourceDefinition(null, "containerGroup"); - var definition = new MetricDefinition(_prometheusMetricDefinition, new Promitor.Core.Scraping.Configuration.Model.Scraping(), new AzureMetricConfiguration(), ResourceType.ContainerInstance, new List { resource }); + var definition = new MetricDefinition(_prometheusMetricDefinition, new Promitor.Core.Scraping.Configuration.Model.Scraping(), new AzureMetricConfiguration(), ResourceType.ContainerInstance, new List { resource }); // Act var scrapeDefinition = definition.CreateScrapeDefinition(resource, _azureMetadata); @@ -48,7 +48,7 @@ public void CreateScrapeDefinition_ResourceHasEmptyResourceGroupName_UsesGlobalN { // Arrange var resource = new ContainerInstanceResourceDefinition(string.Empty, "containerGroup"); - var definition = new MetricDefinition(_prometheusMetricDefinition, new Promitor.Core.Scraping.Configuration.Model.Scraping(), new AzureMetricConfiguration(), ResourceType.ContainerInstance, new List { resource }); + var definition = new MetricDefinition(_prometheusMetricDefinition, new Promitor.Core.Scraping.Configuration.Model.Scraping(), new AzureMetricConfiguration(), ResourceType.ContainerInstance, new List { resource }); // Act var scrapeDefinition = definition.CreateScrapeDefinition(resource, _azureMetadata);