Skip to content

Commit 8261296

Browse files
feat(discovery-agent): add DnsZone resource type support (#2695)
Co-authored-by: Tom Kerkhove <[email protected]>
1 parent 37c8c44 commit 8261296

File tree

20 files changed

+423
-1
lines changed

20 files changed

+423
-1
lines changed

changelog/content/experimental/unreleased.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ version:
88

99
- {{% tag fixed %}} Azure Monitor Scraper: batch based on aggregation in addition to existing criteria
1010
- {{% tag feature %}} Azure Monitor Scraper: make query lookback range configurable in minutes
11+
- {{% tag feature %}} Azure DNS Zone: support for scraping DNS zone metrics
1112
- {{% tag feature %}} Azure Monitor Scraper: add health check based on data freshness
1213

1314
#### Resource Discovery
1415

15-
None.
16+
- {{% tag feature %}} Azure DNS Zone: support for discovering DNS zones

config/promitor/resource-discovery/resource-discovery-declaration.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ resourceDiscoveryGroups:
3131
type: DataFactory
3232
- name: data-share-landscape
3333
type: DataShare
34+
- name: dns-zones
35+
type: DnsZone
3436
- name: dps
3537
type: DeviceProvisioningService
3638
- name: event-hubs-landscape

config/promitor/scraper/metrics.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,15 @@ metrics:
421421
type: Count
422422
resourceDiscoveryGroups:
423423
- name: powerbi-dedicated
424+
- name: azure_dns_zone_record_capacity_utilization_discovered
425+
description: "Record set capacity utilization percentage for discovered DNS zones"
426+
resourceType: DnsZone
427+
azureMetricConfiguration:
428+
metricName: RecordSetCapacityUtilization
429+
aggregation:
430+
type: Average
431+
resourceDiscoveryGroups:
432+
- name: dns-zones
424433

425434
# This uses our large-scale data set containing 1000+ Azure Logic App instances
426435
# Uncomment if you want to test with this scale

src/Promitor.Agents.ResourceDiscovery/Graph/ResourceDiscoveryFactory.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ public static ResourceDiscoveryQuery UseResourceDiscoveryFor(ResourceType resour
3838
return new DataFactoryDiscoveryQuery();
3939
case ResourceType.DataShare:
4040
return new DataShareDiscoveryQuery();
41+
case ResourceType.DnsZone:
42+
return new DnsZoneDiscoveryQuery();
4143
case ResourceType.DeviceProvisioningService:
4244
return new DeviceProvisioningServiceDiscoveryQuery();
4345
case ResourceType.EventHubs:
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using GuardNet;
2+
using Newtonsoft.Json.Linq;
3+
using Promitor.Core.Contracts;
4+
using Promitor.Core.Contracts.ResourceTypes;
5+
6+
namespace Promitor.Agents.ResourceDiscovery.Graph.ResourceTypes
7+
{
8+
public class DnsZoneDiscoveryQuery : ResourceDiscoveryQuery
9+
{
10+
public override string[] ResourceTypes => new[] { "microsoft.network/dnszones" };
11+
public override string[] ProjectedFieldNames => new[] { "subscriptionId", "resourceGroup", "type", "name" };
12+
13+
public override AzureResourceDefinition ParseResults(JToken resultRowEntry)
14+
{
15+
Guard.NotNull(resultRowEntry, nameof(resultRowEntry));
16+
17+
var resource = new DnsZoneResourceDefinition(resultRowEntry[0]?.ToString(), resultRowEntry[1]?.ToString(), resultRowEntry[3]?.ToString());
18+
return resource;
19+
}
20+
}
21+
}

src/Promitor.Agents.Scraper/Validation/Factories/MetricValidatorFactory.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ internal static IMetricValidator GetValidatorFor(ResourceType resourceType)
4141
return new DataFactoryMetricValidator();
4242
case ResourceType.DataShare:
4343
return new DataShareMetricValidator();
44+
case ResourceType.DnsZone:
45+
return new DnsZoneMetricValidator();
4446
case ResourceType.DeviceProvisioningService:
4547
return new DeviceProvisioningServiceMetricValidator();
4648
case ResourceType.EventHubs:
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using GuardNet;
4+
using Promitor.Agents.Scraper.Validation.MetricDefinitions.Interfaces;
5+
using Promitor.Core.Contracts.ResourceTypes;
6+
using Promitor.Core.Scraping.Configuration.Model.Metrics;
7+
8+
namespace Promitor.Agents.Scraper.Validation.MetricDefinitions.ResourceTypes
9+
{
10+
internal class DnsZoneMetricValidator : IMetricValidator
11+
{
12+
public IEnumerable<string> Validate(MetricDefinition metricDefinition)
13+
{
14+
Guard.NotNull(metricDefinition, nameof(metricDefinition));
15+
16+
foreach (var resourceDefinition in metricDefinition.Resources.Cast<DnsZoneResourceDefinition>())
17+
{
18+
if (string.IsNullOrWhiteSpace(resourceDefinition.ZoneName))
19+
{
20+
yield return "No DNS Zone name is configured";
21+
}
22+
}
23+
}
24+
}
25+
}

src/Promitor.Core.Contracts/ResourceType.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,6 @@ public enum ResourceType
5757
PowerBiDedicated = 52,
5858
AzureFirewall = 53,
5959
CognitiveServicesAccount = 54,
60+
DnsZone = 55,
6061
}
6162
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
namespace Promitor.Core.Contracts.ResourceTypes
2+
{
3+
/// <summary>
4+
/// Represents an Azure DNS Zone resource.
5+
/// </summary>
6+
public class DnsZoneResourceDefinition : AzureResourceDefinition
7+
{
8+
/// <summary>
9+
/// Initializes a new instance of the <see cref="DnsZoneResourceDefinition" /> class.
10+
/// </summary>
11+
/// <param name="subscriptionId">Specify a subscription to scrape that defers from the default subscription.</param>
12+
/// <param name="resourceGroupName">The name of the resource group the DNS zone is in.</param>
13+
/// <param name="zoneName">The DNS zone name (e.g., example.com).</param>
14+
public DnsZoneResourceDefinition(string subscriptionId, string resourceGroupName, string zoneName)
15+
: base(ResourceType.DnsZone, subscriptionId, resourceGroupName, zoneName)
16+
{
17+
ZoneName = zoneName;
18+
}
19+
20+
/// <summary>
21+
/// The DNS zone name.
22+
/// </summary>
23+
public string ZoneName { get; }
24+
}
25+
}

src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/AzureResourceDeserializerFactory.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ public IDeserializer<AzureResourceDefinitionV1> GetDeserializerFor(ResourceType
6666
case ResourceType.DataShare:
6767
var dataShareLogger = _loggerFactory.CreateLogger<DataShareDeserializer>();
6868
return new DataShareDeserializer(dataShareLogger);
69+
case ResourceType.DnsZone:
70+
var dnsZoneLogger = _loggerFactory.CreateLogger<DnsZoneDeserializer>();
71+
return new DnsZoneDeserializer(dnsZoneLogger);
6972
case ResourceType.DeviceProvisioningService:
7073
var deviceProvisioningServiceLogger = _loggerFactory.CreateLogger<DeviceProvisioningServiceDeserializer>();
7174
return new DeviceProvisioningServiceDeserializer(deviceProvisioningServiceLogger);

0 commit comments

Comments
 (0)