Skip to content

Commit

Permalink
Provide validation rule to verify if resource discovery is configured…
Browse files Browse the repository at this point in the history
… when metric discovery is used (#1142)

* Provide validation rule to verify if resource discovery is configured

Signed-off-by: Tom Kerkhove <kerkhove.tom@gmail.com>

* Improve error message
  • Loading branch information
tomkerkhove authored Jul 5, 2020
1 parent fd065ee commit 65cb025
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 11 deletions.
2 changes: 1 addition & 1 deletion src/Promitor.Agents.Scraper/Validation/RuntimeValidator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public RuntimeValidator(
new ConfigurationPathValidationStep(metricsConfiguration, _validationLogger),
new AzureAuthenticationValidationStep(configuration, _validationLogger),
new MetricsDeclarationValidationStep(scrapeConfigurationProvider, _validationLogger),
new ResourceDiscoveryValidationStep(runtimeConfiguration.Value.ResourceDiscovery, _validationLogger),
new ResourceDiscoveryValidationStep(runtimeConfiguration.Value.ResourceDiscovery, scrapeConfigurationProvider, _validationLogger),
new StatsDMetricSinkValidationStep(runtimeConfiguration, _validationLogger),
new PrometheusScrapingEndpointMetricSinkValidationStep(runtimeConfiguration, _validationLogger)
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,39 @@
using Microsoft.Extensions.Logging.Abstractions;
using Promitor.Agents.Scraper.Configuration;
using Promitor.Agents.Scraper.Validation.Interfaces;
using Promitor.Core.Scraping.Configuration.Providers.Interfaces;
using Promitor.Core.Scraping.Configuration.Serialization;

namespace Promitor.Agents.Scraper.Validation.Steps
{
public class ResourceDiscoveryValidationStep : ValidationStep, IValidationStep
{
private const string NoDiscoveryConfiguredError = "Resource discovery groups are defined in your metrics configuration, but resource discovery has not been configured in the runtime configuration. Please add a resource discovery configuration for Promitor Scraper runtime.";
private readonly IMetricsDeclarationProvider _metricsDeclarationProvider;
private readonly ResourceDiscoveryConfiguration _configuration;

public ResourceDiscoveryValidationStep(ResourceDiscoveryConfiguration configuration) : this(configuration, NullLogger.Instance)
public ResourceDiscoveryValidationStep(ResourceDiscoveryConfiguration configuration, IMetricsDeclarationProvider metricsDeclarationProvider) : this(configuration, metricsDeclarationProvider, NullLogger.Instance)
{
}

public ResourceDiscoveryValidationStep(ResourceDiscoveryConfiguration configuration, ILogger logger) : base( logger)
public ResourceDiscoveryValidationStep(ResourceDiscoveryConfiguration configuration, IMetricsDeclarationProvider metricsDeclarationProvider, ILogger logger) : base( logger)
{
_metricsDeclarationProvider = metricsDeclarationProvider;
_configuration = configuration;
}

public string ComponentName { get; } = "Resource Discovery";

public ValidationResult Run()
{
var doesDeclareResourceDiscoveryGroups = DetermineIfDiscoveryGroupsAreDefined();
if (_configuration == null)
{
if (doesDeclareResourceDiscoveryGroups)
{
return ValidationResult.Failure(ComponentName, new List<string> { NoDiscoveryConfiguredError });
}

return ValidationResult.Successful(ComponentName);
}

Expand All @@ -42,5 +53,12 @@ public ValidationResult Run()

return errorMessages.Any() ? ValidationResult.Failure(ComponentName, errorMessages) : ValidationResult.Successful(ComponentName);
}

private bool DetermineIfDiscoveryGroupsAreDefined()
{
var errorReporter = new ErrorReporter();
var metricsDeclaration = _metricsDeclarationProvider.Get(applyDefaults: true, errorReporter: errorReporter);
return metricsDeclaration.Metrics.Any(metricDefinition => metricDefinition.ResourceDiscoveryGroups?.Count >= 1);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public async Task ResourceDiscovery_GetAllPerResourceTypeWithoutFilters_ReturnsE
{
// Arrange
const string resourceDiscoveryGroupName = "no-filter";
const int expectedResourceCount = 10;
const int expectedResourceCount = 11;
var resourceDiscoveryClient = new ResourceDiscoveryClient(Configuration, Logger);

// Act
Expand Down Expand Up @@ -119,7 +119,7 @@ public async Task ResourceDiscovery_GetWithFilterOnTwoSubscriptions_ReturnsExpec
{
// Arrange
const string resourceDiscoveryGroupName = "two-subscriptions-scenario";
const int expectedResourceCount = 10;
const int expectedResourceCount = 11;
var resourceDiscoveryClient = new ResourceDiscoveryClient(Configuration, Logger);

// Act
Expand Down Expand Up @@ -199,7 +199,7 @@ public async Task ResourceDiscovery_GetWithFilterOnTwoRegions_ReturnsExpectedAmo
{
// Arrange
const string resourceDiscoveryGroupName = "two-region-scenario";
const int expectedResourceCount = 9;
const int expectedResourceCount = 10;
var resourceDiscoveryClient = new ResourceDiscoveryClient(Configuration, Logger);

// Act
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,35 @@
using System.ComponentModel;
using AutoMapper;
using Promitor.Agents.Scraper.Configuration;
using Promitor.Agents.Scraper.Validation.Steps;
using Promitor.Core.Scraping.Configuration.Serialization.v1.Mapping;
using Promitor.Tests.Unit.Builders.Metrics.v1;
using Promitor.Tests.Unit.Generators.Config;
using Promitor.Tests.Unit.Stubs;
using Xunit;

namespace Promitor.Tests.Unit.Validation.Misc
{
[Category("Unit")]
public class ResourceDiscoveryValidationStepTests
{
private readonly IMapper _mapper;

public ResourceDiscoveryValidationStepTests()
{
var config = new MapperConfiguration(c => c.AddProfile<V1MappingProfile>());
_mapper = config.CreateMapper();
}

[Fact]
public void Validate_ResourceDiscoveryIsFullyConfigured_Success()
{
// Arrange
var metricsDeclarationProvider = GetMetricDeclarationProvider();
var resourceDiscoveryConfiguration = CreateRuntimeConfiguration();

// Act
var azureAuthenticationValidationStep = new ResourceDiscoveryValidationStep(resourceDiscoveryConfiguration);
var azureAuthenticationValidationStep = new ResourceDiscoveryValidationStep(resourceDiscoveryConfiguration, metricsDeclarationProvider);
var validationResult = azureAuthenticationValidationStep.Run();

// Assert
Expand All @@ -27,26 +40,44 @@ public void Validate_ResourceDiscoveryIsFullyConfigured_Success()
public void Validate_ResourceDiscoveryIsNotConfigured_Success()
{
// Arrange
var metricsDeclarationProvider = GetMetricDeclarationProvider();
ResourceDiscoveryConfiguration resourceDiscoveryConfiguration = null;

// Act
// ReSharper disable once ExpressionIsAlwaysNull
var azureAuthenticationValidationStep = new ResourceDiscoveryValidationStep(resourceDiscoveryConfiguration);
var azureAuthenticationValidationStep = new ResourceDiscoveryValidationStep(resourceDiscoveryConfiguration, metricsDeclarationProvider);
var validationResult = azureAuthenticationValidationStep.Run();

// Assert
Assert.True(validationResult.IsSuccessful);
}

[Fact]
public void Validate_ResourceDiscoveryIsNotConfiguredButMetricWithDiscoveryIsDefined_Fails()
{
// Arrange
var metricsDeclarationProvider = GetMetricDeclarationProvider(useDiscoveryGroup: true);
ResourceDiscoveryConfiguration resourceDiscoveryConfiguration = null;

// Act
// ReSharper disable once ExpressionIsAlwaysNull
var azureAuthenticationValidationStep = new ResourceDiscoveryValidationStep(resourceDiscoveryConfiguration, metricsDeclarationProvider);
var validationResult = azureAuthenticationValidationStep.Run();

// Assert
Assert.False(validationResult.IsSuccessful);
}

[Fact]
public void Validate_StatsDWithNegativePort_Fails()
{
// Arrange
var metricsDeclarationProvider = GetMetricDeclarationProvider();
var resourceDiscoveryConfiguration = CreateRuntimeConfiguration();
resourceDiscoveryConfiguration.Port = -1;

// Act
var azureAuthenticationValidationStep = new ResourceDiscoveryValidationStep(resourceDiscoveryConfiguration);
var azureAuthenticationValidationStep = new ResourceDiscoveryValidationStep(resourceDiscoveryConfiguration, metricsDeclarationProvider);
var validationResult = azureAuthenticationValidationStep.Run();

// Assert
Expand All @@ -57,11 +88,12 @@ public void Validate_StatsDWithNegativePort_Fails()
public void Validate_StatsDWithPortZero_Fails()
{
// Arrange
var metricsDeclarationProvider = GetMetricDeclarationProvider();
var resourceDiscoveryConfiguration = CreateRuntimeConfiguration();
resourceDiscoveryConfiguration.Port = 0;

// Act
var azureAuthenticationValidationStep = new ResourceDiscoveryValidationStep(resourceDiscoveryConfiguration);
var azureAuthenticationValidationStep = new ResourceDiscoveryValidationStep(resourceDiscoveryConfiguration, metricsDeclarationProvider);
var validationResult = azureAuthenticationValidationStep.Run();

// Assert
Expand All @@ -75,11 +107,12 @@ public void Validate_StatsDWithPortZero_Fails()
public void Validate_NoHostIsConfigured_Fails(string host)
{
// Arrange
var metricsDeclarationProvider = GetMetricDeclarationProvider();
var resourceDiscoveryConfiguration = CreateRuntimeConfiguration();
resourceDiscoveryConfiguration.Host = host;

// Act
var azureAuthenticationValidationStep = new ResourceDiscoveryValidationStep(resourceDiscoveryConfiguration);
var azureAuthenticationValidationStep = new ResourceDiscoveryValidationStep(resourceDiscoveryConfiguration, metricsDeclarationProvider);
var validationResult = azureAuthenticationValidationStep.Run();

// Assert
Expand All @@ -92,5 +125,22 @@ private ResourceDiscoveryConfiguration CreateRuntimeConfiguration()

return bogusRuntimeConfiguration.ResourceDiscovery;
}

private MetricsDeclarationProviderStub GetMetricDeclarationProvider(bool useDiscoveryGroup=false)
{
var metricsDeclarationBuilder = MetricsDeclarationBuilder.WithMetadata()
.WithApiManagementMetric(locationName: string.Empty);

if (useDiscoveryGroup)
{
metricsDeclarationBuilder.WithApiManagementMetric(resourceDiscoveryGroupName: "hello-cloud");
}

var rawDeclaration = metricsDeclarationBuilder
.Build(_mapper);

var metricsDeclarationProvider = new MetricsDeclarationProviderStub(rawDeclaration, _mapper);
return metricsDeclarationProvider;
}
}
}

0 comments on commit 65cb025

Please sign in to comment.