Skip to content

Commit b6a44e7

Browse files
committed
Revert "feat: Provide support for batch scraping (#2459)"
This reverts commit 5fa547b. Signed-off-by: Tom Kerkhove <[email protected]>
1 parent 1f21f61 commit b6a44e7

File tree

40 files changed

+142
-1486
lines changed

40 files changed

+142
-1486
lines changed

src/Promitor.Agents.Scraper/Scheduling/ResourcesScrapingJob.cs

Lines changed: 10 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
using Promitor.Core.Extensions;
1616
using Promitor.Core.Metrics.Interfaces;
1717
using Promitor.Core.Metrics.Sinks;
18-
using Promitor.Core.Scraping.Batching;
1918
using Promitor.Core.Scraping.Configuration.Model;
2019
using Promitor.Core.Scraping.Configuration.Model.Metrics;
2120
using Promitor.Core.Scraping.Factories;
@@ -135,6 +134,7 @@ public async Task ExecuteAsync(CancellationToken cancellationToken)
135134
try
136135
{
137136
var scrapeDefinitions = await GetAllScrapeDefinitions(cancellationToken);
137+
138138
await ScrapeMetrics(scrapeDefinitions, cancellationToken);
139139
}
140140
catch (OperationCanceledException)
@@ -251,58 +251,21 @@ private void GetResourceScrapeDefinition(IAzureResourceDefinition resourceDefini
251251
}
252252

253253
private async Task ScrapeMetrics(IEnumerable<ScrapeDefinition<IAzureResourceDefinition>> scrapeDefinitions, CancellationToken cancellationToken)
254-
{
254+
{
255255
var tasks = new List<Task>();
256-
var batchScrapingEnabled = this._azureMonitorIntegrationConfiguration.Value.MetricsBatching?.Enabled ?? false;
257-
if (batchScrapingEnabled) {
258-
Logger.LogInformation("Promitor Scraper with operate in batch scraping mode, with max batch size {BatchSize}", this._azureMonitorIntegrationConfiguration.Value.MetricsBatching.MaxBatchSize);
259-
Logger.LogWarning("Batch scraping is an experimental feature. See Promitor.io for its limitations and cost considerations");
260-
261-
var batchScrapeDefinitions = AzureResourceDefinitionBatching.GroupScrapeDefinitions(scrapeDefinitions, this._azureMonitorIntegrationConfiguration.Value.MetricsBatching.MaxBatchSize);
262-
263-
foreach(var batchScrapeDefinition in batchScrapeDefinitions) {
264-
var azureMetricName = batchScrapeDefinition.ScrapeDefinitionBatchProperties.AzureMetricConfiguration.MetricName;
265-
var resourceType = batchScrapeDefinition.ScrapeDefinitionBatchProperties.ResourceType;
266-
Logger.LogInformation("Executing batch scrape job of size {BatchSize} for Azure Metric {AzureMetricName} for resource type {ResourceType}.", batchScrapeDefinition.ScrapeDefinitions.Count, azureMetricName, resourceType);
267-
await ScheduleLimitedConcurrencyAsyncTask(tasks, () => ScrapeMetricBatched(batchScrapeDefinition), cancellationToken);
268-
}
269-
} else {
270-
foreach (var scrapeDefinition in scrapeDefinitions)
271-
{
272-
cancellationToken.ThrowIfCancellationRequested();
273-
274-
var metricName = scrapeDefinition.PrometheusMetricDefinition.Name;
275-
var resourceType = scrapeDefinition.Resource.ResourceType;
276-
Logger.LogInformation("Scraping {MetricName} for resource type {ResourceType}.", metricName, resourceType);
277256

278-
await ScheduleLimitedConcurrencyAsyncTask(tasks, () => ScrapeMetric(scrapeDefinition), cancellationToken);
279-
}
280-
}
281-
282-
await Task.WhenAll(tasks);
283-
}
284-
private async Task ScrapeMetricBatched(BatchScrapeDefinition<IAzureResourceDefinition> batchScrapeDefinition) {
285-
try
257+
foreach (var scrapeDefinition in scrapeDefinitions)
286258
{
287-
var resourceSubscriptionId = batchScrapeDefinition.ScrapeDefinitionBatchProperties.SubscriptionId;
288-
var azureMonitorClient = _azureMonitorClientFactory.CreateIfNotExists(_metricsDeclaration.AzureMetadata.Cloud, _metricsDeclaration.AzureMetadata.TenantId,
289-
resourceSubscriptionId, _metricSinkWriter, _azureScrapingSystemMetricsPublisher, _resourceMetricDefinitionMemoryCache, _configuration,
290-
_azureMonitorIntegrationConfiguration, _azureMonitorLoggingConfiguration, _loggerFactory);
291-
var azureEnvironent = _metricsDeclaration.AzureMetadata.Cloud.GetAzureEnvironment();
259+
cancellationToken.ThrowIfCancellationRequested();
292260

293-
var tokenCredential = AzureAuthenticationFactory.GetTokenCredential(azureEnvironent.ManagementEndpoint, _metricsDeclaration.AzureMetadata.TenantId,
294-
AzureAuthenticationFactory.GetConfiguredAzureAuthentication(_configuration), new Uri(_metricsDeclaration.AzureMetadata.Cloud.GetAzureEnvironment().AuthenticationEndpoint));
295-
var logAnalyticsClient = new LogAnalyticsClient(_loggerFactory, azureEnvironent, tokenCredential);
261+
var metricName = scrapeDefinition.PrometheusMetricDefinition.Name;
262+
var resourceType = scrapeDefinition.Resource.ResourceType;
263+
Logger.LogInformation("Scraping {MetricName} for resource type {ResourceType}.", metricName, resourceType);
296264

297-
var scraper = _metricScraperFactory.CreateScraper(batchScrapeDefinition.ScrapeDefinitionBatchProperties.ResourceType, _metricSinkWriter, _azureScrapingSystemMetricsPublisher, azureMonitorClient, logAnalyticsClient);
298-
299-
await scraper.BatchScrapeAsync(batchScrapeDefinition);
300-
}
301-
catch (Exception ex)
302-
{
303-
Logger.LogError(ex, "Failed to scrape metric {MetricName} for resource batch {ResourceName}. Details: {Details}",
304-
batchScrapeDefinition.ScrapeDefinitionBatchProperties.PrometheusMetricDefinition.Name, batchScrapeDefinition.ScrapeDefinitionBatchProperties.ResourceType, ex.ToString());
265+
await ScheduleLimitedConcurrencyAsyncTask(tasks, () => ScrapeMetric(scrapeDefinition), cancellationToken);
305266
}
267+
268+
await Task.WhenAll(tasks);
306269
}
307270

308271
private async Task ScrapeMetric(ScrapeDefinition<IAzureResourceDefinition> scrapeDefinition)
@@ -324,7 +287,6 @@ private async Task ScrapeMetric(ScrapeDefinition<IAzureResourceDefinition> scrap
324287
var logAnalyticsClient = new LogAnalyticsClient(_loggerFactory, azureEnvironent, tokenCredential);
325288

326289
var scraper = _metricScraperFactory.CreateScraper(scrapeDefinition.Resource.ResourceType, _metricSinkWriter, _azureScrapingSystemMetricsPublisher, azureMonitorClient, logAnalyticsClient);
327-
328290
await scraper.ScrapeAsync(scrapeDefinition);
329291
}
330292
catch (Exception ex)

src/Promitor.Core.Scraping/AzureMonitorScraper.cs

Lines changed: 3 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
using System;
2-
using System.Collections.Concurrent;
32
using System.Collections.Generic;
4-
using System.Collections.Immutable;
53
using System.Linq;
64
using System.Threading.Tasks;
75
using GuardNet;
86
using Microsoft.Extensions.Logging;
97
using Promitor.Core.Contracts;
10-
using Promitor.Core.Extensions;
118
using Promitor.Core.Metrics;
129
using Promitor.Core.Scraping.Configuration.Model;
1310
using Promitor.Core.Scraping.Configuration.Model.Metrics;
@@ -21,19 +18,13 @@ namespace Promitor.Core.Scraping
2118
/// <typeparam name="TResourceDefinition">Type of metric definition that is being used</typeparam>
2219
public abstract class AzureMonitorScraper<TResourceDefinition> : Scraper<TResourceDefinition>
2320
where TResourceDefinition : class, IAzureResourceDefinition
24-
{
25-
/// <summary>
26-
/// A cache to store resource definitions. Used to hydrate resource info from resource ID, when processing batch query results
27-
/// </summary>
28-
private readonly ConcurrentDictionary<string, Tuple<IAzureResourceDefinition, TResourceDefinition>> _resourceDefinitions; // using a dictionary for now since IMemoryCache involves layers of injection
29-
21+
{
3022
/// <summary>
3123
/// Constructor
3224
/// </summary>
3325
protected AzureMonitorScraper(ScraperConfiguration scraperConfiguration) :
3426
base(scraperConfiguration)
3527
{
36-
_resourceDefinitions = new ConcurrentDictionary<string, Tuple<IAzureResourceDefinition, TResourceDefinition>>();
3728
}
3829

3930
/// <inheritdoc />
@@ -82,69 +73,6 @@ protected override async Task<ScrapeResult> ScrapeResourceAsync(string subscript
8273
return new ScrapeResult(subscriptionId, scrapeDefinition.ResourceGroupName, resourceDefinition.ResourceName, resourceUri, finalMetricValues, metricLabels);
8374
}
8475

85-
protected override async Task<List<ScrapeResult>> BatchScrapeResourceAsync(string subscriptionId, BatchScrapeDefinition<IAzureResourceDefinition> batchScrapeDefinition, PromitorMetricAggregationType aggregationType, TimeSpan aggregationInterval)
86-
{
87-
Guard.NotNull(batchScrapeDefinition, nameof(batchScrapeDefinition));
88-
Guard.NotLessThan(batchScrapeDefinition.ScrapeDefinitions.Count(), 1, nameof(batchScrapeDefinition));
89-
Guard.NotNull(batchScrapeDefinition.ScrapeDefinitionBatchProperties.AzureMetricConfiguration, nameof(batchScrapeDefinition.ScrapeDefinitionBatchProperties.AzureMetricConfiguration));
90-
91-
var metricName = batchScrapeDefinition.ScrapeDefinitionBatchProperties.AzureMetricConfiguration.MetricName;
92-
93-
// Build list of resource URIs based on definitions in the batch
94-
var resourceUriList = new List<string>();
95-
foreach (ScrapeDefinition<IAzureResourceDefinition> scrapeDefinition in batchScrapeDefinition.ScrapeDefinitions)
96-
{
97-
var resourceUri = $"/{BuildResourceUri(subscriptionId, scrapeDefinition, (TResourceDefinition) scrapeDefinition.Resource)}";
98-
resourceUriList.Add(resourceUri);
99-
// cache resource info
100-
// the TResourceDefinition resource definition attached to scrape definition can sometimes missing some attributes, need to them in here
101-
var resourceDefinitionToCache = new AzureResourceDefinition
102-
(
103-
resourceType: scrapeDefinition.Resource.ResourceType,
104-
resourceGroupName: scrapeDefinition.ResourceGroupName,
105-
subscriptionId: scrapeDefinition.SubscriptionId,
106-
resourceName: scrapeDefinition.Resource.ResourceName
107-
);
108-
_resourceDefinitions.AddOrUpdate(resourceUri, new Tuple<IAzureResourceDefinition, TResourceDefinition>(resourceDefinitionToCache, (TResourceDefinition)scrapeDefinition.Resource), (newTuple, oldTuple) => oldTuple);
109-
}
110-
111-
var metricLimit = batchScrapeDefinition.ScrapeDefinitionBatchProperties.AzureMetricConfiguration.Limit;
112-
var dimensionNames = DetermineMetricDimensions(metricName, (TResourceDefinition) batchScrapeDefinition.ScrapeDefinitions[0].Resource, batchScrapeDefinition.ScrapeDefinitionBatchProperties.AzureMetricConfiguration); // TODO: resource definition doesn't seem to be used, can we remove it from function signature?
113-
114-
var resourceIdTaggedMeasuredMetrics = new List<ResourceAssociatedMeasuredMetric>();
115-
try
116-
{
117-
// Query Azure Monitor for metrics
118-
resourceIdTaggedMeasuredMetrics = await AzureMonitorClient.BatchQueryMetricAsync(metricName, dimensionNames, aggregationType, aggregationInterval, resourceUriList, null, metricLimit);
119-
}
120-
catch (MetricInformationNotFoundException metricsNotFoundException)
121-
{
122-
Logger.LogWarning("No metric information found for metric {MetricName} with dimensions {MetricDimensions}. Details: {Details}", metricsNotFoundException.Name, metricsNotFoundException.Dimensions, metricsNotFoundException.Details);
123-
124-
var measuredMetric = dimensionNames.Count > 0
125-
? MeasuredMetric.CreateForDimensions(dimensionNames)
126-
: MeasuredMetric.CreateWithoutDimensions(null);
127-
resourceIdTaggedMeasuredMetrics.Add(measuredMetric.WithResourceIdAssociation(null));
128-
}
129-
130-
var scrapeResults = new List<ScrapeResult>();
131-
// group based on resource, then do enrichment per group
132-
var groupedMeasuredMetrics = resourceIdTaggedMeasuredMetrics.GroupBy(measuredMetric => measuredMetric.ResourceId);
133-
foreach (IGrouping<string, ResourceAssociatedMeasuredMetric> resourceMetricsGroup in groupedMeasuredMetrics)
134-
{
135-
var resourceId = resourceMetricsGroup.Key;
136-
if (_resourceDefinitions.TryGetValue(resourceId, out Tuple<IAzureResourceDefinition, TResourceDefinition> resourceDefinitionTuple))
137-
{
138-
var resourceDefinition = resourceDefinitionTuple.Item1;
139-
var metricLabels = DetermineMetricLabels(resourceDefinitionTuple.Item2);
140-
var finalMetricValues = EnrichMeasuredMetrics(resourceDefinitionTuple.Item2, dimensionNames, resourceMetricsGroup.ToImmutableList());
141-
scrapeResults.Add(new ScrapeResult(subscriptionId, resourceDefinition.ResourceGroupName, resourceDefinition.ResourceName, resourceId, finalMetricValues, metricLabels));
142-
}
143-
}
144-
145-
return scrapeResults;
146-
}
147-
14876
private int? DetermineMetricLimit(ScrapeDefinition<IAzureResourceDefinition> scrapeDefinition)
14977
{
15078
return scrapeDefinition.AzureMetricConfiguration.Limit;
@@ -161,9 +89,9 @@ protected override async Task<List<ScrapeResult>> BatchScrapeResourceAsync(strin
16189
/// <param name="dimensionNames">List of names of the specified dimensions provided by the scraper.</param>
16290
/// <param name="metricValues">Measured metric values that were found</param>
16391
/// <returns></returns>
164-
protected virtual List<MeasuredMetric> EnrichMeasuredMetrics(TResourceDefinition resourceDefinition, List<string> dimensionNames, IReadOnlyList<MeasuredMetric> metricValues)
92+
protected virtual List<MeasuredMetric> EnrichMeasuredMetrics(TResourceDefinition resourceDefinition, List<string> dimensionNames, List<MeasuredMetric> metricValues)
16593
{
166-
return metricValues.ToList();
94+
return metricValues;
16795
}
16896

16997
/// <summary>

src/Promitor.Core.Scraping/Batching/AzureResourceDefinitionBatching.cs

Lines changed: 0 additions & 46 deletions
This file was deleted.

src/Promitor.Core.Scraping/Configuration/Model/AzureMetricConfiguration.cs

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4-
using System.Text;
54

65
namespace Promitor.Core.Scraping.Configuration.Model
76
{
@@ -46,29 +45,5 @@ public class AzureMetricConfiguration
4645
}
4746
return Dimensions?.Any(dimension => dimension.Name.Equals(dimensionName, StringComparison.InvariantCultureIgnoreCase));
4847
}
49-
50-
// A unique string to represent this Azure metric and its configured dimensions
51-
public string ToUniqueStringRepresentation()
52-
{
53-
StringBuilder sb = new StringBuilder();
54-
sb.Append(MetricName);
55-
if (Dimension != null)
56-
{
57-
sb.Append('_');
58-
sb.Append(Dimension.Name);
59-
}
60-
else if (Dimensions != null)
61-
{
62-
foreach (var dimension in Dimensions)
63-
{
64-
sb.Append('_');
65-
sb.Append(dimension.Name);
66-
}
67-
}
68-
sb.Append($"_limit{Limit}");
69-
70-
71-
return sb.ToString();
72-
}
7348
}
7449
}

src/Promitor.Core.Scraping/Configuration/Model/Metrics/BatchScrapeDefinition.cs

Lines changed: 0 additions & 39 deletions
This file was deleted.

0 commit comments

Comments
 (0)