Exemplo n.º 1
0
        private List <string> ValidateAzureMetadata(AzureMetadata azureMetadata)
        {
            var errorMessages = new List <string>();

            if (azureMetadata == null)
            {
                errorMessages.Add("No azure metadata is configured");
                return(errorMessages);
            }

            if (string.IsNullOrWhiteSpace(azureMetadata.TenantId))
            {
                errorMessages.Add($"{azureMetadata.TenantId} is not configured");
            }

            if (string.IsNullOrWhiteSpace(azureMetadata.SubscriptionId))
            {
                errorMessages.Add($"{azureMetadata.SubscriptionId} is not configured");
            }

            if (string.IsNullOrWhiteSpace(azureMetadata.ResourceGroupName))
            {
                errorMessages.Add($"{azureMetadata.ResourceGroupName} is not configured");
            }

            return(errorMessages);
        }
        private async Task ScrapeMetric(AzureMetadata azureMetadata, MetricDefinition metricDefinitionDefinition)
        {
            Console.WriteLine($"\t> Scraping {metricDefinitionDefinition.Name} of type {metricDefinitionDefinition.ResourceType}");

            var scraper = MetricScraperFactory.CreateScraper(azureMetadata, metricDefinitionDefinition.ResourceType);
            await scraper.ScrapeAsync(metricDefinitionDefinition);
        }
        private AzureMonitorClient CreateAzureMonitorClient(AzureMetadata azureMetadata, IRuntimeMetricsCollector runtimeMetricsCollector)
        {
            var azureCredentials   = DetermineAzureCredentials();
            var azureMonitorClient = new AzureMonitorClient(azureMetadata.TenantId, azureMetadata.SubscriptionId, azureCredentials.ApplicationId, azureCredentials.Secret, runtimeMetricsCollector, _logger);

            return(azureMonitorClient);
        }
Exemplo n.º 4
0
        private async Task ScrapeMetric(AzureMetadata azureMetadata, MetricDefinition metricDefinitionDefinition)
        {
            _logger.LogInformation("Scraping '{metricName}' for resource type '{resourceType}'", metricDefinitionDefinition.Name, metricDefinitionDefinition.ResourceType);

            var scraper = MetricScraperFactory.CreateScraper(azureMetadata, metricDefinitionDefinition.ResourceType, _logger, _exceptionTracker);
            await scraper.ScrapeAsync(metricDefinitionDefinition);
        }
Exemplo n.º 5
0
        private async Task ScrapeMetric(AzureMetadata azureMetadata, ScrapeDefinition <IAzureResourceDefinition> metricDefinitionDefinition)
        {
            _logger.LogInformation("Scraping {MetricName} for resource type {ResourceType}", metricDefinitionDefinition.PrometheusMetricDefinition.Name, metricDefinitionDefinition.Resource.ResourceType);

            var scraper = _metricScraperFactory.CreateScraper(metricDefinitionDefinition.Resource.ResourceType, azureMetadata, _prometheusMetricWriter, _azureMonitorClient);
            await scraper.ScrapeAsync(metricDefinitionDefinition);
        }
Exemplo n.º 6
0
        private static IEnumerable <string> ValidateAzureMetadata(AzureMetadata azureMetadata)
        {
            var errorMessages = new List <string>();

            if (azureMetadata == null)
            {
                errorMessages.Add("No azure metadata is configured");
                return(errorMessages);
            }

            if (string.IsNullOrWhiteSpace(azureMetadata.TenantId))
            {
                errorMessages.Add("No tenant id is configured");
            }

            if (string.IsNullOrWhiteSpace(azureMetadata.SubscriptionId))
            {
                errorMessages.Add("No subscription id is configured");
            }

            if (string.IsNullOrWhiteSpace(azureMetadata.ResourceGroupName))
            {
                errorMessages.Add("No resource group name is not configured");
            }

            return(errorMessages);
        }
        public ResourceDiscoveryGroupScrapingJob(string jobName, string resourceDiscoveryGroupName, AzureMetadata azureMetadata, MetricDefinition metricDefinition, ResourceDiscoveryRepository resourceDiscoveryRepository,
                                                 MetricSinkWriter metricSinkWriter,
                                                 MetricScraperFactory metricScraperFactory,
                                                 AzureMonitorClientFactory azureMonitorClientFactory, IRuntimeMetricsCollector runtimeMetricCollector, IConfiguration configuration, IOptions <AzureMonitorLoggingConfiguration> azureMonitorLoggingConfiguration, ILoggerFactory loggerFactory,
                                                 ILogger <ResourceDiscoveryGroupScrapingJob> logger)
            : base(jobName, logger)
        {
            Guard.NotNullOrWhitespace(resourceDiscoveryGroupName, nameof(resourceDiscoveryGroupName));
            Guard.NotNull(resourceDiscoveryRepository, nameof(resourceDiscoveryRepository));
            Guard.NotNull(metricDefinition, nameof(metricDefinition));
            Guard.NotNull(azureMetadata, nameof(azureMetadata));
            Guard.NotNullOrWhitespace(jobName, nameof(jobName));
            Guard.NotNull(metricScraperFactory, nameof(metricScraperFactory));
            Guard.NotNull(azureMonitorClientFactory, nameof(azureMonitorClientFactory));
            Guard.NotNull(runtimeMetricCollector, nameof(runtimeMetricCollector));
            Guard.NotNull(configuration, nameof(configuration));
            Guard.NotNull(azureMonitorLoggingConfiguration, nameof(azureMonitorLoggingConfiguration));
            Guard.NotNull(loggerFactory, nameof(loggerFactory));
            Guard.NotNull(metricSinkWriter, nameof(metricSinkWriter));

            ResourceDiscoveryGroupName = resourceDiscoveryGroupName;

            _azureMetadata               = azureMetadata;
            _metricDefinition            = metricDefinition;
            _resourceDiscoveryRepository = resourceDiscoveryRepository;
            _metricSinkWriter            = metricSinkWriter;

            _runtimeMetricCollector           = runtimeMetricCollector;
            _azureMonitorClientFactory        = azureMonitorClientFactory;
            _configuration                    = configuration;
            _azureMonitorLoggingConfiguration = azureMonitorLoggingConfiguration;
            _loggerFactory                    = loggerFactory;

            _metricScraperFactory = metricScraperFactory;
        }
Exemplo n.º 8
0
        private static MetricsDeclaration InterpretYamlStream(YamlStream metricsDeclarationYamlStream)
        {
            var document = metricsDeclarationYamlStream.Documents.First();
            var rootNode = (YamlMappingNode)document.RootNode;

            AzureMetadata azureMetadata = null;

            if (rootNode.Children.ContainsKey("azureMetadata"))
            {
                var azureMetadataNode       = (YamlMappingNode)rootNode.Children[new YamlScalarNode("azureMetadata")];
                var azureMetadataSerializer = new AzureMetadataDeserializer();
                azureMetadata = azureMetadataSerializer.Deserialize(azureMetadataNode);
            }

            List <MetricDefinition> metrics = null;

            if (rootNode.Children.ContainsKey("metrics"))
            {
                var metricsNode         = (YamlSequenceNode)rootNode.Children[new YamlScalarNode("metrics")];
                var metricsDeserializer = new MetricsDeserializer();
                metrics = metricsDeserializer.Deserialize(metricsNode);
            }

            var metricsDeclaration = new MetricsDeclaration
            {
                AzureMetadata = azureMetadata,
                Metrics       = metrics
            };

            return(metricsDeclaration);
        }
Exemplo n.º 9
0
        private async Task ScrapeMetric(AzureMetadata azureMetadata, ScrapeDefinition <AzureResourceDefinition> metricDefinitionDefinition)
        {
            _logger.LogInformation("Scraping '{MetricName}' for resource type '{ResourceType}'", metricDefinitionDefinition.PrometheusMetricDefinition.Name, metricDefinitionDefinition.Resource.ResourceType);

            var scraper = _metricScraperFactory.CreateScraper(metricDefinitionDefinition.Resource.ResourceType, azureMetadata, _prometheusMetricWriter, _runtimeMetricsCollector);
            await scraper.ScrapeAsync(metricDefinitionDefinition);
        }
Exemplo n.º 10
0
        private void PlotAzureMetadataInAsciiTable(AzureMetadata metadata)
        {
            var asciiTable = CreateAzureMetadataAsciiTable();

            asciiTable.AddRow(metadata.TenantId, metadata.SubscriptionId, metadata.ResourceGroupName, metadata.Cloud.Name.Humanize(LetterCasing.Title));

            AnsiConsole.Write(asciiTable);
        }
Exemplo n.º 11
0
        /// <summary>
        ///     Constructor
        /// </summary>
        /// <param name="azureMetadata">Metadata concerning the Azure resources</param>
        /// <param name="azureCredentials">Credentials used to authenticate to Microsoft Azure</param>
        /// <param name="exceptionTracker">Exception tracker</param>
        protected Scraper(AzureMetadata azureMetadata, AzureCredentials azureCredentials, IExceptionTracker exceptionTracker)
        {
            Guard.NotNull(exceptionTracker, nameof(exceptionTracker));

            _exceptionTracker = exceptionTracker;

            AzureMetadata    = azureMetadata ?? throw new ArgumentNullException(nameof(azureMetadata));
            AzureCredentials = azureCredentials ?? throw new ArgumentNullException(nameof(azureCredentials));
        }
Exemplo n.º 12
0
        private async Task ScrapeMetric(AzureMetadata azureMetadata, MetricDefinition metricDefinitionDefinition)
        {
            _logger.LogInformation("Scraping '{MetricName}' for resource type '{ResourceType}'", metricDefinitionDefinition.Name, metricDefinitionDefinition.ResourceType);

            var scraper = MetricScraperFactory.CreateScraper(metricDefinitionDefinition.ResourceType, azureMetadata, _logger, _exceptionTracker);
            int subscriptionReadLimit = await scraper.ScrapeAsync(metricDefinitionDefinition);

            HealthMonitor.Instance.setSubscriptionLimitCount(subscriptionReadLimit);
        }
        public static MetricsDeclarationBuilder WithMetadata(string tenantId = "tenantId", string subscriptionId = "subscriptionId", string resourceGroupName = "resourceGroupName")
        {
            var azureMetadata = new AzureMetadata
            {
                TenantId          = tenantId,
                SubscriptionId    = subscriptionId,
                ResourceGroupName = resourceGroupName
            };

            return(new MetricsDeclarationBuilder(azureMetadata));
        }
Exemplo n.º 14
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="azureMetadata">Metadata concerning the Azure resources</param>
        /// <param name="azureMonitorClient">Client to communicate with Azure Monitor</param>
        /// <param name="prometheusMetricWriter">Metrics collector for our Prometheus scraping endpoint</param>
        /// <param name="logger">General logger</param>
        public ScraperConfiguration(AzureMetadata azureMetadata, AzureMonitorClient azureMonitorClient, IPrometheusMetricWriter prometheusMetricWriter, ILogger logger)
        {
            Guard.NotNull(azureMetadata, nameof(azureMetadata));
            Guard.NotNull(azureMonitorClient, nameof(azureMonitorClient));
            Guard.NotNull(prometheusMetricWriter, nameof(prometheusMetricWriter));
            Guard.NotNull(logger, nameof(logger));

            AzureMetadata          = azureMetadata;
            AzureMonitorClient     = azureMonitorClient;
            PrometheusMetricWriter = prometheusMetricWriter;
            Logger = logger;
        }
Exemplo n.º 15
0
        /// <summary>
        ///     Constructor
        /// </summary>
        /// <param name="azureMetadata">Metadata concerning the Azure resources</param>
        /// <param name="azureMonitorClient">Client to communicate with Azure Monitor</param>
        /// <param name="logger">General logger</param>
        /// <param name="exceptionTracker">Exception tracker</param>
        protected Scraper(AzureMetadata azureMetadata, AzureMonitorClient azureMonitorClient, ILogger logger,
                          IExceptionTracker exceptionTracker)
        {
            Guard.NotNull(exceptionTracker, nameof(exceptionTracker));
            Guard.NotNull(azureMetadata, nameof(azureMetadata));
            Guard.NotNull(azureMonitorClient, nameof(azureMonitorClient));

            _logger           = logger;
            _exceptionTracker = exceptionTracker;

            AzureMetadata      = azureMetadata;
            AzureMonitorClient = azureMonitorClient;
        }
        /// <summary>
        ///     Creates a scraper that is capable of scraping a specific resource type
        /// </summary>
        /// <param name="azureMetadata">Metadata concerning the Azure resources</param>
        /// <param name="metricDefinitionResourceType">Resource type to scrape</param>
        internal static IScraper <MetricDefinition> CreateScraper(AzureMetadata azureMetadata, ResourceType metricDefinitionResourceType)
        {
            var azureCredentials = DetermineAzureCredentials();

            switch (metricDefinitionResourceType)
            {
            case ResourceType.ServiceBusQueue:
                return(new ServiceBusQueueScraper(azureMetadata, azureCredentials));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Exemplo n.º 17
0
        /// <summary>
        ///     Creates a scraper that is capable of scraping a specific resource type
        /// </summary>
        /// <param name="azureMetadata">Metadata concerning the Azure resources</param>
        /// <param name="metricDefinitionResourceType">Resource type to scrape</param>
        /// <param name="logger">General logger</param>
        /// <param name="exceptionTracker">Tracker used to log exceptions</param>
        public static IScraper <MetricDefinition> CreateScraper(AzureMetadata azureMetadata, ResourceType metricDefinitionResourceType, ILogger logger, IExceptionTracker exceptionTracker)
        {
            var azureCredentials = DetermineAzureCredentials();

            switch (metricDefinitionResourceType)
            {
            case ResourceType.ServiceBusQueue:
                return(new ServiceBusQueueScraper(azureMetadata, azureCredentials, logger, exceptionTracker));

            case ResourceType.Generic:
                return(new GenericScraper(azureMetadata, azureCredentials, logger, exceptionTracker));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Exemplo n.º 18
0
 public GenericScraper(AzureMetadata azureMetadata, MetricDefaults metricDefaults, AzureMonitorClient azureMonitorClient, ILogger logger, IExceptionTracker exceptionTracker)
     : base(azureMetadata, metricDefaults, azureMonitorClient, logger, exceptionTracker)
 {
 }
Exemplo n.º 19
0
        private static AzureMonitorClient CreateAzureMonitorClient(AzureMetadata azureMetadata, AzureCredentials azureCredentials, IRuntimeMetricsCollector runtimeMetricsCollector, ILogger logger)
        {
            var azureMonitorClient = new AzureMonitorClient(azureMetadata.TenantId, azureMetadata.SubscriptionId, azureCredentials.ApplicationId, azureCredentials.Secret, runtimeMetricsCollector, logger);

            return(azureMonitorClient);
        }
Exemplo n.º 20
0
 /// <summary>
 ///     Constructor
 /// </summary>
 /// <param name="azureMetadata">Metadata concerning the Azure resources</param>
 /// <param name="azureCredentials">Credentials used to authenticate to Microsoft Azure</param>
 protected Scraper(AzureMetadata azureMetadata, AzureCredentials azureCredentials)
 {
     AzureMetadata    = azureMetadata ?? throw new ArgumentNullException(nameof(azureMetadata));
     AzureCredentials = azureCredentials ?? throw new ArgumentNullException(nameof(azureCredentials));
 }
Exemplo n.º 21
0
 public ServiceBusQueueScraper(AzureMetadata azureMetadata, AzureCredentials azureCredentials) : base(azureMetadata, azureCredentials)
 {
 }
Exemplo n.º 22
0
 public StorageQueueScraper(AzureMetadata azureMetadata, AzureMonitorClient azureMonitorClient, ILogger logger, IExceptionTracker exceptionTracker)
     : base(azureMetadata, azureMonitorClient, logger, exceptionTracker)
 {
     _azureStorageQueueClient = new AzureStorageQueueClient(logger);
 }
Exemplo n.º 23
0
 public ServiceBusQueueScraper(AzureMetadata azureMetadata, AzureCredentials azureCredentials, IExceptionTracker exceptionTracker)
     : base(azureMetadata, azureCredentials, exceptionTracker)
 {
 }
Exemplo n.º 24
0
 /// <summary>
 /// Creates a <see cref="ScrapeDefinition{TResourceDefinition}"/> object for the specified resource.
 /// </summary>
 /// <param name="resource">The resource to scrape.</param>
 /// <param name="azureMetadata">The Azure global metadata.</param>
 /// <returns>The scrape definition.</returns>
 public ScrapeDefinition <IAzureResourceDefinition> CreateScrapeDefinition(IAzureResourceDefinition resource, AzureMetadata azureMetadata)
 {
     return(new ScrapeDefinition <IAzureResourceDefinition>(
                AzureMetricConfiguration,
                PrometheusMetricDefinition,
                Scraping,
                resource,
                string.IsNullOrEmpty(resource.SubscriptionId) ? azureMetadata.SubscriptionId : resource.SubscriptionId,
                string.IsNullOrEmpty(resource.ResourceGroupName) ? azureMetadata.ResourceGroupName : resource.ResourceGroupName));
 }
Exemplo n.º 25
0
 public ContainerRegistryScraper(AzureMetadata azureMetadata, AzureMonitorClient azureMonitorClient, ILogger logger, IExceptionTracker exceptionTracker)
     : base(azureMetadata, azureMonitorClient, logger, exceptionTracker)
 {
 }
Exemplo n.º 26
0
 public VirtualMachineScraper(AzureMetadata azureMetadata, AzureMonitorClient azureMonitorClient, ILogger logger, IExceptionTracker exceptionTracker)
     : base(azureMetadata, azureMonitorClient, logger, exceptionTracker)
 {
 }
 public MetricsDeclarationBuilder(AzureMetadata azureMetadata)
 {
     _azureMetadata = azureMetadata;
 }
Exemplo n.º 28
0
        /// <summary>
        ///     Creates a scraper that is capable of scraping a specific resource type
        /// </summary>
        /// <param name="azureMetadata">Metadata concerning the Azure resources</param>
        /// <param name="metricDefinitionResourceType">Resource type to scrape</param>
        /// <param name="prometheusMetricWriter">Metrics collector for our Prometheus scraping endpoint</param>
        /// <param name="runtimeMetricsCollector">Metrics collector for our runtime</param>
        public IScraper <AzureResourceDefinition> CreateScraper(ResourceType metricDefinitionResourceType, AzureMetadata azureMetadata,
                                                                IPrometheusMetricWriter prometheusMetricWriter, IRuntimeMetricsCollector runtimeMetricsCollector)
        {
            var azureMonitorClient   = CreateAzureMonitorClient(azureMetadata, runtimeMetricsCollector);
            var scraperConfiguration = new ScraperConfiguration(azureMetadata, azureMonitorClient, prometheusMetricWriter, _logger, _exceptionTracker);

            switch (metricDefinitionResourceType)
            {
            case ResourceType.ServiceBusQueue:
                return(new ServiceBusQueueScraper(scraperConfiguration));

            case ResourceType.Generic:
                return(new GenericScraper(scraperConfiguration));

            case ResourceType.StorageQueue:
                return(new StorageQueueScraper(scraperConfiguration));

            case ResourceType.ContainerInstance:
                return(new ContainerInstanceScraper(scraperConfiguration));

            case ResourceType.VirtualMachine:
                return(new VirtualMachineScraper(scraperConfiguration));

            case ResourceType.NetworkInterface:
                return(new NetworkInterfaceScraper(scraperConfiguration));

            case ResourceType.ContainerRegistry:
                return(new ContainerRegistryScraper(scraperConfiguration));

            case ResourceType.CosmosDb:
                return(new CosmosDbScraper(scraperConfiguration));

            case ResourceType.RedisCache:
                return(new RedisCacheScraper(scraperConfiguration));

            case ResourceType.PostgreSql:
                return(new PostgreSqlScraper(scraperConfiguration));

            case ResourceType.AzureSqlDatabase:
                return(new AzureSqlDatabaseScraper(scraperConfiguration));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Exemplo n.º 29
0
 protected void AssertAzureMetadata(Core.Scraping.Configuration.Model.MetricsDeclaration deserializedConfiguration, AzureMetadata azureMetadata)
 {
     Assert.NotNull(deserializedConfiguration.AzureMetadata);
     Assert.Equal(azureMetadata.TenantId, deserializedConfiguration.AzureMetadata.TenantId);
     Assert.Equal(azureMetadata.ResourceGroupName, deserializedConfiguration.AzureMetadata.ResourceGroupName);
     Assert.Equal(azureMetadata.SubscriptionId, deserializedConfiguration.AzureMetadata.SubscriptionId);
 }
Exemplo n.º 30
0
        /// <summary>
        ///     Creates a scraper that is capable of scraping a specific resource type
        /// </summary>
        /// <param name="azureMetadata">Metadata concerning the Azure resources</param>
        /// <param name="metricDefinitionResourceType">Resource type to scrape</param>
        /// <param name="runtimeMetricsCollector">Metrics collector for our runtime</param>
        /// <param name="logger">General logger</param>
        /// <param name="exceptionTracker">Tracker used to log exceptions</param>
        public static IScraper <MetricDefinition> CreateScraper(ResourceType metricDefinitionResourceType, AzureMetadata azureMetadata,
                                                                IRuntimeMetricsCollector runtimeMetricsCollector, ILogger logger, IExceptionTracker exceptionTracker)
        {
            var azureCredentials   = DetermineAzureCredentials();
            var azureMonitorClient = CreateAzureMonitorClient(azureMetadata, azureCredentials, runtimeMetricsCollector, logger);

            switch (metricDefinitionResourceType)
            {
            case ResourceType.ServiceBusQueue:
                return(new ServiceBusQueueScraper(azureMetadata, azureMonitorClient, logger, exceptionTracker));

            case ResourceType.Generic:
                return(new GenericScraper(azureMetadata, azureMonitorClient, logger, exceptionTracker));

            case ResourceType.StorageQueue:
                return(new StorageQueueScraper(azureMetadata, azureMonitorClient, logger, exceptionTracker));

            case ResourceType.ContainerInstance:
                return(new ContainerInstanceScraper(azureMetadata, azureMonitorClient, logger, exceptionTracker));

            case ResourceType.VirtualMachine:
                return(new VirtualMachineScraper(azureMetadata, azureMonitorClient, logger, exceptionTracker));

            case ResourceType.NetworkInterface:
                return(new NetworkInterfaceScraper(azureMetadata, azureMonitorClient, logger, exceptionTracker));

            case ResourceType.ContainerRegistry:
                return(new ContainerRegistryScraper(azureMetadata, azureMonitorClient, logger, exceptionTracker));

            case ResourceType.CosmosDb:
                return(new CosmosDbScraper(azureMetadata, azureMonitorClient, logger, exceptionTracker));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }