Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Provide promitor_ratelimit_arm for StatsD #1021

Merged
merged 2 commits into from
May 10, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build/azure-devops/agents-ci-scraper.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ stages:
artifactName: Build
- stage: CodeQuality
displayName: Code Quality
dependsOn: [Build]
dependsOn: [Init]
jobs:
- job: RunCodeQuality
displayName: Run Code Quality
Expand Down
12 changes: 7 additions & 5 deletions src/Promitor.Agents.Scraper/AzureMonitorClientFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using Microsoft.Extensions.Options;
using Promitor.Core;
using Promitor.Core.Metrics;
using Promitor.Core.Metrics.Sinks;
using Promitor.Core.Scraping.Configuration.Model;
using Promitor.Integrations.AzureMonitor;
using Promitor.Integrations.AzureMonitor.Configuration;
Expand All @@ -21,27 +22,28 @@ public class AzureMonitorClientFactory
/// <param name="cloud">Name of the Azure cloud to interact with</param>
/// <param name="tenantId">Id of the tenant that owns the Azure subscription</param>
/// <param name="subscriptionId">Id of the Azure subscription</param>
/// <param name="runtimeMetricCollector">Metrics collector for our runtime</param>
/// <param name="metricSinkWriter">Writer to send metrics to all configured sinks</param>
/// <param name="metricsCollector">Metrics collector to write metrics to Prometheus</param>
/// <param name="configuration">Configuration of Promitor</param>
/// <param name="azureMonitorLoggingConfiguration">Options for Azure Monitor logging</param>
/// <param name="loggerFactory">Factory to create loggers with</param>
public AzureMonitorClient CreateIfNotExists(AzureEnvironment cloud, string tenantId, string subscriptionId, IRuntimeMetricsCollector runtimeMetricCollector, IConfiguration configuration, IOptions<AzureMonitorLoggingConfiguration> azureMonitorLoggingConfiguration, ILoggerFactory loggerFactory)
public AzureMonitorClient CreateIfNotExists(AzureEnvironment cloud, string tenantId, string subscriptionId, MetricSinkWriter metricSinkWriter, IRuntimeMetricsCollector metricsCollector, IConfiguration configuration, IOptions<AzureMonitorLoggingConfiguration> azureMonitorLoggingConfiguration, ILoggerFactory loggerFactory)
{
if (_azureMonitorClients.ContainsKey(subscriptionId))
{
return _azureMonitorClients[subscriptionId];
}

var azureMonitorClient = CreateNewAzureMonitorClient(cloud, tenantId, subscriptionId, runtimeMetricCollector, configuration, azureMonitorLoggingConfiguration, loggerFactory);
var azureMonitorClient = CreateNewAzureMonitorClient(cloud, tenantId, subscriptionId, metricSinkWriter, metricsCollector, configuration, azureMonitorLoggingConfiguration, loggerFactory);
_azureMonitorClients.Add(subscriptionId, azureMonitorClient);

return azureMonitorClient;
}

private static AzureMonitorClient CreateNewAzureMonitorClient(AzureEnvironment cloud, string tenantId, string subscriptionId, IRuntimeMetricsCollector runtimeMetricCollector, IConfiguration configuration, IOptions<AzureMonitorLoggingConfiguration> azureMonitorLoggingConfiguration, ILoggerFactory loggerFactory)
private static AzureMonitorClient CreateNewAzureMonitorClient(AzureEnvironment cloud, string tenantId, string subscriptionId, MetricSinkWriter metricSinkWriter, IRuntimeMetricsCollector metricsCollector, IConfiguration configuration, IOptions<AzureMonitorLoggingConfiguration> azureMonitorLoggingConfiguration, ILoggerFactory loggerFactory)
{
var azureCredentials = DetermineAzureCredentials(configuration);
var azureMonitorClient = new AzureMonitorClient(cloud, tenantId, subscriptionId, azureCredentials.ApplicationId, azureCredentials.Secret, azureMonitorLoggingConfiguration, runtimeMetricCollector, loggerFactory);
var azureMonitorClient = new AzureMonitorClient(cloud, tenantId, subscriptionId, azureCredentials.ApplicationId, azureCredentials.Secret, azureMonitorLoggingConfiguration, metricSinkWriter, metricsCollector, loggerFactory);
return azureMonitorClient;
}

Expand Down
5 changes: 3 additions & 2 deletions 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.

Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@
using Promitor.Agents.Scraper.Scheduling;
using Promitor.Agents.Scraper.Validation;
using Promitor.Core.Metrics;
using Promitor.Core.Metrics.Sinks;
using Promitor.Core.Scraping.Configuration.Runtime;
using Promitor.Core.Scraping.Interfaces;
using Promitor.Core.Scraping.Metrics.Sinks;
using Promitor.Integrations.AzureMonitor.Configuration;
using Promitor.Integrations.Sinks.Prometheus;
using Promitor.Integrations.Sinks.Prometheus.Configuration;
Expand Down Expand Up @@ -56,7 +56,7 @@ public static IServiceCollection ScheduleMetricScraping(this IServiceCollection
foreach (var resource in metric.Resources)
{
var resourceSubscriptionId = string.IsNullOrWhiteSpace(resource.SubscriptionId) ? metrics.AzureMetadata.SubscriptionId : resource.SubscriptionId;
var azureMonitorClient = azureMonitorClientFactory.CreateIfNotExists(metrics.AzureMetadata.Cloud, metrics.AzureMetadata.TenantId, resourceSubscriptionId, runtimeMetricCollector, configuration, azureMonitorLoggingConfiguration, loggerFactory);
var azureMonitorClient = azureMonitorClientFactory.CreateIfNotExists(metrics.AzureMetadata.Cloud, metrics.AzureMetadata.TenantId, resourceSubscriptionId, metricSinkWriter, runtimeMetricCollector, configuration, azureMonitorLoggingConfiguration, loggerFactory);
var scrapeDefinition = metric.CreateScrapeDefinition(resource, metrics.AzureMetadata);

var jobName = $"{scrapeDefinition.SubscriptionId}-{scrapeDefinition.PrometheusMetricDefinition.Name}";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
using CronScheduler.Extensions.Scheduler;
using GuardNet;
using Microsoft.Extensions.Logging;
using Promitor.Core.Metrics.Sinks;
using Promitor.Core.Scraping.Configuration.Model.Metrics;
using Promitor.Core.Scraping.Factories;
using Promitor.Core.Scraping.Interfaces;
using Promitor.Core.Scraping.Metrics.Sinks;
using Promitor.Integrations.AzureMonitor;

namespace Promitor.Agents.Scraper.Scheduling
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
using System;
using GuardNet;
using Microsoft.Extensions.Logging;
using Promitor.Core.Metrics.Sinks;
using Promitor.Core.Scraping.Configuration.Model;
using Promitor.Core.Scraping.Configuration.Model.Metrics;
using Promitor.Core.Scraping.Interfaces;
using Promitor.Core.Scraping.Metrics.Sinks;
using Promitor.Core.Scraping.ResourceTypes;
using Promitor.Integrations.AzureMonitor;

Expand Down
12 changes: 0 additions & 12 deletions src/Promitor.Core.Scraping/Metrics/Sinks/IMetricSink.cs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
using System.Threading.Tasks;
using GuardNet;
using Microsoft.Azure.Management.Monitor.Fluent.Models;
using Promitor.Core.Metrics;
using Promitor.Core.Scraping.Configuration.Model.Metrics;
using Promitor.Core.Scraping.Configuration.Model.Metrics.ResourceTypes;
using Promitor.Integrations.AzureMonitor;
using Promitor.Integrations.AzureStorage;

namespace Promitor.Core.Scraping.ResourceTypes
Expand Down
2 changes: 1 addition & 1 deletion src/Promitor.Core.Scraping/Scraper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
using Microsoft.Azure.Management.Monitor.Fluent.Models;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Promitor.Core.Metrics.Sinks;
using Promitor.Core.Scraping.Configuration.Model.Metrics;
using Promitor.Core.Scraping.Interfaces;
using Promitor.Core.Scraping.Metrics.Sinks;
using Promitor.Integrations.AzureMonitor;

namespace Promitor.Core.Scraping
Expand Down
2 changes: 1 addition & 1 deletion src/Promitor.Core.Scraping/ScraperConfiguration.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using GuardNet;
using Microsoft.Extensions.Logging;
using Promitor.Core.Metrics.Sinks;
using Promitor.Core.Scraping.Interfaces;
using Promitor.Core.Scraping.Metrics.Sinks;
using Promitor.Integrations.AzureMonitor;

namespace Promitor.Core.Scraping
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
using GuardNet;
using Microsoft.Azure.Management.Monitor.Fluent.Models;

namespace Promitor.Integrations.AzureMonitor
namespace Promitor.Core.Metrics
{
public class MeasuredMetric
{
Expand Down Expand Up @@ -59,7 +59,7 @@ public static MeasuredMetric CreateWithoutDimension(double? value)
/// <param name="value">Measured metric value</param>
/// <param name="dimensionName">Name of dimension that is being scraped</param>
/// <param name="timeseries">Timeseries representing one of the dimensions</param>
internal static MeasuredMetric CreateForDimension(double? value, string dimensionName, TimeSeriesElement timeseries)
public static MeasuredMetric CreateForDimension(double? value, string dimensionName, TimeSeriesElement timeseries)
{
Guard.NotNullOrWhitespace(dimensionName, nameof(dimensionName));
Guard.NotNull(timeseries, nameof(timeseries));
Expand Down
13 changes: 13 additions & 0 deletions src/Promitor.Core/Metrics/Sinks/IMetricSink.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Promitor.Core.Metrics.Sinks
{
public interface IMetricSink
{
MetricSinkType Type { get; }

Task ReportMetricAsync(string metricName, string metricDescription, MeasuredMetric measuredMetric);
Task ReportMetricAsync(string metricName, string metricDescription, double metricValue, Dictionary<string, string> labels);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Promitor.Core.Scraping.Metrics.Sinks
namespace Promitor.Core.Metrics.Sinks
{
public enum MetricSinkType
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
using GuardNet;
using Microsoft.Extensions.Logging;

namespace Promitor.Core.Scraping.Metrics.Sinks
namespace Promitor.Core.Metrics.Sinks
{
public class MetricSinkWriter
{
Expand Down Expand Up @@ -56,5 +56,20 @@ private async Task ReportMetricAsync(IMetricSink sink, string metricName, string
}
}
}

public async Task ReportMetricAsync(string metricName, string metricDescription, double metricValue, Dictionary<string, string> metricLabels)
{
Guard.NotNullOrWhitespace(metricName, nameof(metricName));
Guard.NotNull(metricLabels, nameof(metricLabels));

var reportTasks = new List<Task>();
foreach (var sink in _configuredSinks)
{
var reportTask = sink.ReportMetricAsync(metricName, metricDescription, metricValue, metricLabels);
reportTasks.Add(reportTask);
}

await Task.WhenAll(reportTasks);
}
}
}
7 changes: 7 additions & 0 deletions src/Promitor.Core/Promitor.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,14 @@
<ItemGroup>
<PackageReference Include="Guard.Net" Version="1.2.0" />
<PackageReference Include="Microsoft.ApplicationInsights" Version="2.14.0" />
<PackageReference Include="Microsoft.Azure.Management.Monitor.Fluent" Version="1.33.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.3" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.3" />
<PackageReference Include="YamlDotNet" Version="8.1.1" />
</ItemGroup>

<ItemGroup>
<Folder Include="Metrics\Sinks\" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
using System.Collections.Generic;
using GuardNet;
using Promitor.Integrations.AzureMonitor;
using Promitor.Core.Metrics;

namespace Promitor.Core.Scraping
namespace Promitor.Core
{
public class ScrapeResult
{
Expand Down
12 changes: 7 additions & 5 deletions src/Promitor.Integrations.AzureMonitor/AzureMonitorClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using Microsoft.Extensions.Options;
using Microsoft.Rest;
using Promitor.Core.Metrics;
using Promitor.Core.Metrics.Sinks;
using Promitor.Integrations.AzureMonitor.Configuration;
using Promitor.Integrations.AzureMonitor.Exceptions;
using Promitor.Integrations.AzureMonitor.Logging;
Expand All @@ -35,9 +36,10 @@ public class AzureMonitorClient
/// <param name="applicationId">Id of the Azure AD application used to authenticate with Azure Monitor</param>
/// <param name="applicationSecret">Secret to authenticate with Azure Monitor for the specified Azure AD application</param>
/// <param name="azureMonitorLoggingConfiguration">Options for Azure Monitor logging</param>
/// <param name="runtimeMetricsCollector">Metrics collector for our runtime</param>
/// <param name="metricSinkWriter">Writer to send metrics to all configured sinks</param>
/// <param name="metricsCollector">Metrics collector to write metrics to Prometheus</param>
/// <param name="loggerFactory">Factory to create loggers with</param>
public AzureMonitorClient(AzureEnvironment azureCloud, string tenantId, string subscriptionId, string applicationId, string applicationSecret, IOptions<AzureMonitorLoggingConfiguration> azureMonitorLoggingConfiguration, IRuntimeMetricsCollector runtimeMetricsCollector, ILoggerFactory loggerFactory)
public AzureMonitorClient(AzureEnvironment azureCloud, string tenantId, string subscriptionId, string applicationId, string applicationSecret, IOptions<AzureMonitorLoggingConfiguration> azureMonitorLoggingConfiguration, MetricSinkWriter metricSinkWriter, IRuntimeMetricsCollector metricsCollector, ILoggerFactory loggerFactory)
{
Guard.NotNullOrWhitespace(tenantId, nameof(tenantId));
Guard.NotNullOrWhitespace(subscriptionId, nameof(subscriptionId));
Expand All @@ -46,7 +48,7 @@ public AzureMonitorClient(AzureEnvironment azureCloud, string tenantId, string s
Guard.NotNull(azureMonitorLoggingConfiguration, nameof(azureMonitorLoggingConfiguration));

_logger = loggerFactory.CreateLogger<AzureMonitorClient>();
_authenticatedAzureSubscription = CreateAzureClient(azureCloud, tenantId, subscriptionId, applicationId, applicationSecret, azureMonitorLoggingConfiguration, loggerFactory, runtimeMetricsCollector);
_authenticatedAzureSubscription = CreateAzureClient(azureCloud, tenantId, subscriptionId, applicationId, applicationSecret, azureMonitorLoggingConfiguration, loggerFactory, metricSinkWriter, metricsCollector);
}

/// <summary>
Expand Down Expand Up @@ -213,12 +215,12 @@ private IWithMetricsQueryExecute CreateMetricsQuery(AggregationType metricAggreg
return metricQuery;
}

private IAzure CreateAzureClient(AzureEnvironment azureCloud, string tenantId, string subscriptionId, string applicationId, string applicationSecret, IOptions<AzureMonitorLoggingConfiguration> azureMonitorLoggingConfiguration, ILoggerFactory loggerFactory, IRuntimeMetricsCollector runtimeMetricsCollector)
private IAzure CreateAzureClient(AzureEnvironment azureCloud, string tenantId, string subscriptionId, string applicationId, string applicationSecret, IOptions<AzureMonitorLoggingConfiguration> azureMonitorLoggingConfiguration, ILoggerFactory loggerFactory, MetricSinkWriter metricSinkWriter, IRuntimeMetricsCollector metricsCollector)
{
var credentials = _azureCredentialsFactory.FromServicePrincipal(applicationId, applicationSecret, tenantId, azureCloud);

var throttlingLogger = loggerFactory.CreateLogger<AzureResourceManagerThrottlingRequestHandler>();
var monitorHandler = new AzureResourceManagerThrottlingRequestHandler(tenantId, subscriptionId, applicationId, runtimeMetricsCollector, throttlingLogger);
var monitorHandler = new AzureResourceManagerThrottlingRequestHandler(tenantId, subscriptionId, applicationId, metricSinkWriter, metricsCollector, throttlingLogger);

var azureClientConfiguration = Azure.Configure()
.WithDelegatingHandler(monitorHandler);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,6 @@
<ItemGroup>
<PackageReference Include="Guard.NET" Version="1.2.0" />
<PackageReference Include="Microsoft.Azure.Management.Fluent" Version="1.33.0" />
<PackageReference Include="Microsoft.Azure.Management.Monitor.Fluent" Version="1.33.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.3" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.3" />
<PackageReference Include="Microsoft.Data.OData" Version="5.8.4" />
<PackageReference Include="Serilog" Version="2.9.0" />
<PackageReference Include="System.Net.Http" Version="4.3.4" />
Expand Down
Loading