Skip to content

Commit

Permalink
Add custom endpoints to metrics and resoruce discovery yaml
Browse files Browse the repository at this point in the history
  • Loading branch information
Suraiya-Hameed committed Jan 29, 2025
1 parent 65662b4 commit d7d9007
Show file tree
Hide file tree
Showing 16 changed files with 327 additions and 312 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;
using Microsoft.Azure.Management.ResourceManager.Fluent;
using Microsoft.Azure.Management.Storage.Fluent.Models;
using Promitor.Core.Serialization.Enum;

namespace Promitor.Agents.ResourceDiscovery.Configuration
Expand All @@ -8,5 +11,7 @@ public class AzureLandscape
public string TenantId { get; set; }
public List<string> Subscriptions { get; set; }
public AzureCloud Cloud { get; set; } = AzureCloud.Global;
[JsonPropertyName("endpoints")]
public AzureEnvironment? AzureEnvironment { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ public class AzureResourceGraph : IAzureResourceGraph
private readonly IOptionsMonitor<ResourceDeclaration> _resourceDeclarationMonitor;
private readonly ISystemMetricsPublisher _systemMetricsPublisher;
private readonly ILogger<AzureResourceGraph> _logger;
private readonly IConfiguration _configuration;

private ResourceGraphClient _graphClient;

Expand All @@ -55,7 +54,6 @@ public AzureResourceGraph(ISystemMetricsPublisher systemMetricsPublisher, IOptio
_logger = logger;
_resourceDeclarationMonitor = resourceDeclarationMonitor;
_systemMetricsPublisher = systemMetricsPublisher;
_configuration = configuration;
_azureAuthenticationInfo = AzureAuthenticationFactory.GetConfiguredAzureAuthentication(configuration);
}

Expand Down Expand Up @@ -269,8 +267,8 @@ private async Task OpenConnectionAsync()

private async Task<ResourceGraphClient> CreateClientAsync()
{
var azureEnvironment = _resourceDeclarationMonitor.CurrentValue.AzureLandscape.Cloud.GetAzureEnvironment(_configuration);
var azureAuthorityHost = _resourceDeclarationMonitor.CurrentValue.AzureLandscape.Cloud.GetAzureAuthorityHost(_configuration);
var azureEnvironment = _resourceDeclarationMonitor.CurrentValue.AzureLandscape.AzureEnvironment;
var azureAuthorityHost = azureEnvironment.GetAzureAuthorityHost();

var credentials = await AzureAuthenticationFactory.GetTokenCredentialsAsync(azureEnvironment.ManagementEndpoint, TenantId, _azureAuthenticationInfo, azureAuthorityHost);
var resourceManagerBaseUri = new Uri(azureEnvironment.ResourceManagerEndpoint);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Azure.Management.ResourceManager.Fluent;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Promitor.Agents.Core.Validation;
using Promitor.Agents.Core.Validation.Interfaces;
using Promitor.Agents.Core.Validation.Steps;
using Promitor.Agents.ResourceDiscovery.Configuration;
using Promitor.Core.Extensions;
using Promitor.Core.Serialization.Enum;
using static Promitor.Core.EnvironmentVariables;

namespace Promitor.Agents.ResourceDiscovery.Validation.Steps
{
Expand Down Expand Up @@ -35,6 +39,47 @@ public ValidationResult Run()
errorMessages.Add("No Azure cloud was configured");
}

if (_azureLandscape.Cloud == AzureCloud.Global)
{
_azureLandscape.AzureEnvironment = AzureEnvironment.AzureGlobalCloud;
}
else if (_azureLandscape.Cloud == AzureCloud.China)
{
_azureLandscape.AzureEnvironment = AzureEnvironment.AzureChinaCloud;
}
else if (_azureLandscape.Cloud == AzureCloud.Germany)
{
_azureLandscape.AzureEnvironment = AzureEnvironment.AzureGermanCloud;
}
else if (_azureLandscape.Cloud == AzureCloud.UsGov)
{
_azureLandscape.AzureEnvironment = AzureEnvironment.AzureUSGovernment;
}
else if (_azureLandscape.Cloud == AzureCloud.Custom)
{
if (_azureLandscape.AzureEnvironment == null)
{
errorMessages.Add("AzureEnvironment configuration is missing for custom cloud.");
}
else if (string.IsNullOrWhiteSpace(_azureLandscape.AzureEnvironment.AuthenticationEndpoint) ||
string.IsNullOrWhiteSpace(_azureLandscape.AzureEnvironment.ResourceManagerEndpoint) ||
string.IsNullOrWhiteSpace(_azureLandscape.AzureEnvironment.ManagementEndpoint) ||
string.IsNullOrWhiteSpace(_azureLandscape.AzureEnvironment.GraphEndpoint) ||
string.IsNullOrWhiteSpace(_azureLandscape.AzureEnvironment.StorageEndpointSuffix) ||
string.IsNullOrWhiteSpace(_azureLandscape.AzureEnvironment.KeyVaultSuffix))
{
errorMessages.Add("All custom cloud endpoints were not configured to query");
}
else
{
_azureLandscape.AzureEnvironment.Name = _azureLandscape.Cloud.GetEnvironmentName();
}
}
else
{
errorMessages.Add($"{nameof(_azureLandscape.Cloud)} No Azure environment is known for in legacy SDK");
}

if (_azureLandscape.Subscriptions == null || _azureLandscape.Subscriptions.Any() == false)

Check notice on line 83 in src/Promitor.Agents.ResourceDiscovery/Validation/Steps/AzureLandscapeValidationStep.cs

View check run for this annotation

codefactor.io / CodeFactor

src/Promitor.Agents.ResourceDiscovery/Validation/Steps/AzureLandscapeValidationStep.cs#L83

Prefer comparing `Count` to 0 rather than using `Any()`, both for clarity and for performance. (CA1860)
{
errorMessages.Add("No subscription id(s) were configured to query");
Expand Down
10 changes: 5 additions & 5 deletions src/Promitor.Agents.Scraper/AzureMonitorClientFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public class AzureMonitorClientFactory
/// <param name="azureMonitorIntegrationConfiguration">Options for Azure Monitor integration</param>
/// <param name="azureMonitorLoggingConfiguration">Options for Azure Monitor logging</param>
/// <param name="loggerFactory">Factory to create loggers with</param>
public IAzureMonitorClient CreateIfNotExists(AzureCloud cloud, string tenantId, string subscriptionId, MetricSinkWriter metricSinkWriter, IAzureScrapingSystemMetricsPublisher azureScrapingSystemMetricsPublisher, IMemoryCache resourceMetricDefinitionMemoryCache, IConfiguration configuration, IOptions<AzureMonitorIntegrationConfiguration> azureMonitorIntegrationConfiguration, IOptions<AzureMonitorLoggingConfiguration> azureMonitorLoggingConfiguration, ILoggerFactory loggerFactory)
public IAzureMonitorClient CreateIfNotExists(AzureEnvironment azureEnvironment, string tenantId, string subscriptionId, MetricSinkWriter metricSinkWriter, IAzureScrapingSystemMetricsPublisher azureScrapingSystemMetricsPublisher, IMemoryCache resourceMetricDefinitionMemoryCache, IConfiguration configuration, IOptions<AzureMonitorIntegrationConfiguration> azureMonitorIntegrationConfiguration, IOptions<AzureMonitorLoggingConfiguration> azureMonitorLoggingConfiguration, ILoggerFactory loggerFactory)
{
if (_azureMonitorClients.TryGetValue(subscriptionId, out var value))
{
Expand All @@ -41,9 +41,9 @@ public IAzureMonitorClient CreateIfNotExists(AzureCloud cloud, string tenantId,
var useAzureMonitorSdk = azureMonitorIntegrationConfiguration.Value.UseAzureMonitorSdk;
IAzureMonitorClient azureMonitorClient;
if (useAzureMonitorSdk) {
azureMonitorClient = CreateNewAzureMonitorQueryClient(cloud, tenantId, subscriptionId, metricSinkWriter, azureScrapingSystemMetricsPublisher, resourceMetricDefinitionMemoryCache, configuration, azureMonitorIntegrationConfiguration, azureMonitorLoggingConfiguration, loggerFactory);
azureMonitorClient = CreateNewAzureMonitorQueryClient(azureEnvironment, tenantId, subscriptionId, metricSinkWriter, azureScrapingSystemMetricsPublisher, resourceMetricDefinitionMemoryCache, configuration, azureMonitorIntegrationConfiguration, azureMonitorLoggingConfiguration, loggerFactory);
} else {
azureMonitorClient = CreateNewLegacyAzureMonitorClient(cloud.GetAzureEnvironment(configuration), tenantId, subscriptionId, metricSinkWriter, azureScrapingSystemMetricsPublisher, resourceMetricDefinitionMemoryCache, configuration, azureMonitorIntegrationConfiguration, azureMonitorLoggingConfiguration, loggerFactory);
azureMonitorClient = CreateNewLegacyAzureMonitorClient(azureEnvironment, tenantId, subscriptionId, metricSinkWriter, azureScrapingSystemMetricsPublisher, resourceMetricDefinitionMemoryCache, configuration, azureMonitorIntegrationConfiguration, azureMonitorLoggingConfiguration, loggerFactory);
}
_azureMonitorClients.TryAdd(subscriptionId, azureMonitorClient);

Expand All @@ -57,10 +57,10 @@ private static LegacyAzureMonitorClient CreateNewLegacyAzureMonitorClient(AzureE
return azureMonitorClientLegacy;
}

private static AzureMonitorQueryClient CreateNewAzureMonitorQueryClient(AzureCloud cloud, string tenantId, string subscriptionId, MetricSinkWriter metricSinkWriter, IAzureScrapingSystemMetricsPublisher azureScrapingSystemMetricsPublisher, IMemoryCache resourceMetricDefinitionMemoryCache, IConfiguration configuration, IOptions<AzureMonitorIntegrationConfiguration> azureMonitorIntegrationConfiguration, IOptions<AzureMonitorLoggingConfiguration> azureMonitorLoggingConfiguration, ILoggerFactory loggerFactory)
private static AzureMonitorQueryClient CreateNewAzureMonitorQueryClient(AzureEnvironment azureEnvironment, string tenantId, string subscriptionId, MetricSinkWriter metricSinkWriter, IAzureScrapingSystemMetricsPublisher azureScrapingSystemMetricsPublisher, IMemoryCache resourceMetricDefinitionMemoryCache, IConfiguration configuration, IOptions<AzureMonitorIntegrationConfiguration> azureMonitorIntegrationConfiguration, IOptions<AzureMonitorLoggingConfiguration> azureMonitorLoggingConfiguration, ILoggerFactory loggerFactory)
{
var azureCredentials = AzureAuthenticationFactory.GetConfiguredAzureAuthentication(configuration);
var azureMonitorQueryClient = new AzureMonitorQueryClient(cloud, tenantId, subscriptionId, azureCredentials, metricSinkWriter, azureScrapingSystemMetricsPublisher, resourceMetricDefinitionMemoryCache, loggerFactory, azureMonitorIntegrationConfiguration, azureMonitorLoggingConfiguration, configuration);
var azureMonitorQueryClient = new AzureMonitorQueryClient(azureEnvironment, tenantId, subscriptionId, azureCredentials, metricSinkWriter, azureScrapingSystemMetricsPublisher, resourceMetricDefinitionMemoryCache, loggerFactory, azureMonitorIntegrationConfiguration, azureMonitorLoggingConfiguration);
return azureMonitorQueryClient;
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/Promitor.Agents.Scraper/Docs/Open-Api.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions src/Promitor.Agents.Scraper/Scheduling/ResourcesScrapingJob.cs
Original file line number Diff line number Diff line change
Expand Up @@ -285,13 +285,13 @@ private async Task ScrapeMetricBatched(BatchScrapeDefinition<IAzureResourceDefin
try
{
var resourceSubscriptionId = batchScrapeDefinition.ScrapeDefinitionBatchProperties.SubscriptionId;
var azureMonitorClient = _azureMonitorClientFactory.CreateIfNotExists(_metricsDeclaration.AzureMetadata.Cloud, _metricsDeclaration.AzureMetadata.TenantId,
var azureEnvironent = _metricsDeclaration.AzureMetadata.AzureEnvironment;
var azureMonitorClient = _azureMonitorClientFactory.CreateIfNotExists(azureEnvironent, _metricsDeclaration.AzureMetadata.TenantId,
resourceSubscriptionId, _metricSinkWriter, _azureScrapingSystemMetricsPublisher, _resourceMetricDefinitionMemoryCache, _configuration,
_azureMonitorIntegrationConfiguration, _azureMonitorLoggingConfiguration, _loggerFactory);
var azureEnvironent = _metricsDeclaration.AzureMetadata.Cloud.GetAzureEnvironment(_configuration);

var tokenCredential = AzureAuthenticationFactory.GetTokenCredential(azureEnvironent.ManagementEndpoint, _metricsDeclaration.AzureMetadata.TenantId,
AzureAuthenticationFactory.GetConfiguredAzureAuthentication(_configuration), new Uri(_metricsDeclaration.AzureMetadata.Cloud.GetAzureEnvironment(_configuration).AuthenticationEndpoint));
AzureAuthenticationFactory.GetConfiguredAzureAuthentication(_configuration), new Uri(_metricsDeclaration.AzureMetadata.AzureEnvironment.AuthenticationEndpoint));
var logAnalyticsClient = new LogAnalyticsClient(_loggerFactory, azureEnvironent, tokenCredential);

var scraper = _metricScraperFactory.CreateScraper(batchScrapeDefinition.ScrapeDefinitionBatchProperties.ResourceType, _metricSinkWriter, _azureScrapingSystemMetricsPublisher, azureMonitorClient, logAnalyticsClient);
Expand All @@ -313,14 +313,14 @@ private async Task ScrapeMetric(ScrapeDefinition<IAzureResourceDefinition> scrap
var resourceSubscriptionId = !string.IsNullOrWhiteSpace(scrapeDefinition.Resource.SubscriptionId)
? scrapeDefinition.Resource.SubscriptionId
: _metricsDeclaration.AzureMetadata.SubscriptionId;
var azureEnvironent = _metricsDeclaration.AzureMetadata.Cloud.GetAzureEnvironment(_configuration);
var azureEnvironent = _metricsDeclaration.AzureMetadata.AzureEnvironment;
Logger.LogInformation("Parsed SDK Config {UseAzureMonitorSdk}", _azureMonitorIntegrationConfiguration.Value.UseAzureMonitorSdk);
var azureMonitorClient = _azureMonitorClientFactory.CreateIfNotExists(_metricsDeclaration.AzureMetadata.Cloud, _metricsDeclaration.AzureMetadata.TenantId,
var azureMonitorClient = _azureMonitorClientFactory.CreateIfNotExists(azureEnvironent, _metricsDeclaration.AzureMetadata.TenantId,
resourceSubscriptionId, _metricSinkWriter, _azureScrapingSystemMetricsPublisher, _resourceMetricDefinitionMemoryCache, _configuration,
_azureMonitorIntegrationConfiguration, _azureMonitorLoggingConfiguration, _loggerFactory);

var tokenCredential = AzureAuthenticationFactory.GetTokenCredential(azureEnvironent.ManagementEndpoint, _metricsDeclaration.AzureMetadata.TenantId,
AzureAuthenticationFactory.GetConfiguredAzureAuthentication(_configuration), new Uri(_metricsDeclaration.AzureMetadata.Cloud.GetAzureEnvironment(_configuration).AuthenticationEndpoint));
AzureAuthenticationFactory.GetConfiguredAzureAuthentication(_configuration), new Uri(_metricsDeclaration.AzureMetadata.AzureEnvironment.AuthenticationEndpoint));
var logAnalyticsClient = new LogAnalyticsClient(_loggerFactory, azureEnvironent, tokenCredential);

var scraper = _metricScraperFactory.CreateScraper(scrapeDefinition.Resource.ResourceType, _metricSinkWriter, _azureScrapingSystemMetricsPublisher, azureMonitorClient, logAnalyticsClient);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@
using Microsoft.Extensions.Logging;
using Promitor.Agents.Core.Validation.Interfaces;
using Promitor.Agents.Core.Validation.Steps;
using Promitor.Core.Extensions;
using Promitor.Core.Scraping.Configuration.Model;
using Promitor.Core.Scraping.Configuration.Model.Metrics;
using Promitor.Core.Scraping.Configuration.Providers.Interfaces;
using Promitor.Core.Scraping.Configuration.Serialization;
using Promitor.Agents.Scraper.Validation.MetricDefinitions;
using ValidationResult = Promitor.Agents.Core.Validation.ValidationResult;
using Promitor.Core.Serialization.Enum;
using Microsoft.Azure.Management.ResourceManager.Fluent;

namespace Promitor.Agents.Scraper.Validation.Steps
{
Expand Down Expand Up @@ -124,6 +127,52 @@ private static IEnumerable<string> ValidateAzureMetadata(AzureMetadata azureMeta
errorMessages.Add("No resource group name is not configured");
}

if (azureMetadata.Cloud == AzureCloud.Unspecified)
{
errorMessages.Add("No Azure cloud is configured");
}

if (azureMetadata.Cloud == AzureCloud.Global)
{
azureMetadata.AzureEnvironment = AzureEnvironment.AzureGlobalCloud;
}
else if (azureMetadata.Cloud == AzureCloud.China)
{
azureMetadata.AzureEnvironment = AzureEnvironment.AzureChinaCloud;
}
else if (azureMetadata.Cloud == AzureCloud.Germany)
{
azureMetadata.AzureEnvironment = AzureEnvironment.AzureGermanCloud;
}
else if (azureMetadata.Cloud == AzureCloud.UsGov)
{
azureMetadata.AzureEnvironment = AzureEnvironment.AzureUSGovernment;
}
else if (azureMetadata.Cloud == AzureCloud.Custom)
{
if (azureMetadata.AzureEnvironment == null)
{
errorMessages.Add("AzureEnvironment configuration is missing for custom cloud.");
}
if (string.IsNullOrWhiteSpace(azureMetadata.AzureEnvironment.AuthenticationEndpoint) ||
string.IsNullOrWhiteSpace(azureMetadata.AzureEnvironment.ResourceManagerEndpoint) ||
string.IsNullOrWhiteSpace(azureMetadata.AzureEnvironment.ManagementEndpoint) ||
string.IsNullOrWhiteSpace(azureMetadata.AzureEnvironment.GraphEndpoint) ||
string.IsNullOrWhiteSpace(azureMetadata.AzureEnvironment.StorageEndpointSuffix) ||
string.IsNullOrWhiteSpace(azureMetadata.AzureEnvironment.KeyVaultSuffix))
{
errorMessages.Add("All custom cloud endpoints were not configured to query");
}
else
{
azureMetadata.AzureEnvironment.Name = azureMetadata.Cloud.GetEnvironmentName();
}
}
else
{
errorMessages.Add($"{nameof(azureMetadata.Cloud)} No Azure environment is known for in legacy SDK");
}

return errorMessages;
}

Check notice on line 178 in src/Promitor.Agents.Scraper/Validation/Steps/MetricsDeclarationValidationStep.cs

View check run for this annotation

codefactor.io / CodeFactor

src/Promitor.Agents.Scraper/Validation/Steps/MetricsDeclarationValidationStep.cs#L105-L178

Complex Method
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using Promitor.Core.Serialization.Enum;
using System.Text.Json.Serialization;
using Microsoft.Azure.Management.ResourceManager.Fluent;
using Promitor.Core.Serialization.Enum;

namespace Promitor.Core.Scraping.Configuration.Model
{
Expand All @@ -8,5 +10,7 @@ public class AzureMetadata
public string SubscriptionId { get; set; }
public string TenantId { get; set; }
public AzureCloud Cloud { get; set; }
[JsonPropertyName("endpoints")]
public AzureEnvironment? AzureEnvironment { get; set; }
}
}
Loading

0 comments on commit d7d9007

Please sign in to comment.