diff --git a/Directory.Packages.props b/Directory.Packages.props
index f37bd594e4c..8d1be8d06bb 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -19,6 +19,7 @@
+
diff --git a/eng/Versions.props b/eng/Versions.props
index b8eea776951..4005cc092bc 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -86,6 +86,7 @@
$(MicrosoftExtensionsLogging80Version)
$(MicrosoftExtensionsLoggingAbstractions80Version)
$(MicrosoftExtensionsLoggingConsole80Version)
+ $(MicrosoftExtensionsOptions80Version)
$(SystemTextJson80Version)
@@ -95,6 +96,7 @@
$(MicrosoftExtensionsLogging90Version)
$(MicrosoftExtensionsLoggingAbstractions90Version)
$(MicrosoftExtensionsLoggingConsole90Version)
+ $(MicrosoftExtensionsOptions90Version)
$(SystemTextJson90Version)
$(MicrosoftAspNetCoreApp90Version)
@@ -105,6 +107,7 @@
$(MicrosoftNETCoreApp100Version)
$(MicrosoftNETCoreApp100Version)
$(MicrosoftNETCoreApp100Version)
+ $(MicrosoftNETCoreApp100Version)
$(MicrosoftNETCoreApp100Version)
$(MicrosoftAspNetCoreApp100Version)
diff --git a/eng/dependabot/net8.0/Packages.props b/eng/dependabot/net8.0/Packages.props
index 039efe2cfb3..fc6c4e5c1e0 100644
--- a/eng/dependabot/net8.0/Packages.props
+++ b/eng/dependabot/net8.0/Packages.props
@@ -7,6 +7,7 @@
+
8.0.1
+
+ 8.0.2
8.0.15
diff --git a/eng/dependabot/net9.0/Versions.props b/eng/dependabot/net9.0/Versions.props
index 8a7dfb77b34..5fc5de53c00 100644
--- a/eng/dependabot/net9.0/Versions.props
+++ b/eng/dependabot/net9.0/Versions.props
@@ -9,6 +9,8 @@
9.0.4
9.0.4
+
+ 9.0.4
9.0.4
diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets
index b75f72b30b1..8a8355ce625 100644
--- a/src/Directory.Build.targets
+++ b/src/Directory.Build.targets
@@ -126,4 +126,14 @@
+
+
+
+
+
+
+
diff --git a/src/Microsoft.Diagnostics.Monitoring.Extension.Common/EgressHelper.cs b/src/Microsoft.Diagnostics.Monitoring.Extension.Common/EgressHelper.cs
index 1136a5e4b3c..a00d0c0d30e 100644
--- a/src/Microsoft.Diagnostics.Monitoring.Extension.Common/EgressHelper.cs
+++ b/src/Microsoft.Diagnostics.Monitoring.Extension.Common/EgressHelper.cs
@@ -190,7 +190,6 @@ private static ServiceCollection CreateServices(ExtensionEgressPayload
.Build()
.Bind(options);
});
- services.AddSingleton, DataAnnotationValidateOptions>();
services.AddSingleton(new EgressProperties(payload.Properties));
diff --git a/src/Microsoft.Diagnostics.Monitoring.Extension.Common/Microsoft.Diagnostics.Monitoring.Extension.Common.csproj b/src/Microsoft.Diagnostics.Monitoring.Extension.Common/Microsoft.Diagnostics.Monitoring.Extension.Common.csproj
index 8879d6f8eb6..8c5c54fd3a7 100644
--- a/src/Microsoft.Diagnostics.Monitoring.Extension.Common/Microsoft.Diagnostics.Monitoring.Extension.Common.csproj
+++ b/src/Microsoft.Diagnostics.Monitoring.Extension.Common/Microsoft.Diagnostics.Monitoring.Extension.Common.csproj
@@ -9,10 +9,6 @@
true
-
-
-
-
diff --git a/src/Microsoft.Diagnostics.Monitoring.Options/FileSystemEgressProviderOptionsValidator.cs b/src/Microsoft.Diagnostics.Monitoring.Options/FileSystemEgressProviderOptionsValidator.cs
new file mode 100644
index 00000000000..7113f63b046
--- /dev/null
+++ b/src/Microsoft.Diagnostics.Monitoring.Options/FileSystemEgressProviderOptionsValidator.cs
@@ -0,0 +1,19 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.Diagnostics.Tools.Monitor.Egress.FileSystem
+{
+ [OptionsValidator]
+ internal sealed partial class FileSystemEgressProviderOptionsValidator : IValidateOptions
+ {
+ IServiceProvider _serviceProvider;
+
+ public FileSystemEgressProviderOptionsValidator(IServiceProvider serviceProvider)
+ {
+ _serviceProvider = serviceProvider;
+ }
+ }
+}
diff --git a/src/Microsoft.Diagnostics.Monitoring.Options/GlobalCounterOptions.cs b/src/Microsoft.Diagnostics.Monitoring.Options/GlobalCounterOptions.cs
index c360b5184d1..5c213a302be 100644
--- a/src/Microsoft.Diagnostics.Monitoring.Options/GlobalCounterOptions.cs
+++ b/src/Microsoft.Diagnostics.Monitoring.Options/GlobalCounterOptions.cs
@@ -7,6 +7,8 @@
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Linq;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
namespace Microsoft.Diagnostics.Monitoring.WebApi
{
@@ -48,23 +50,28 @@ public class GlobalProviderOptions
public float? IntervalSeconds { get; set; }
}
+ [OptionsValidator]
+ partial class GlobalProviderOptionsValidator : IValidateOptions
+ {
+ }
+
partial class GlobalCounterOptions : IValidatableObject
{
public IEnumerable Validate(ValidationContext validationContext)
{
+ var providerValidator = validationContext.GetRequiredService>();
var results = new List();
if (Providers != null)
{
- var providerResults = new List();
foreach ((string provider, GlobalProviderOptions options) in Providers)
{
- providerResults.Clear();
- if (!Validator.TryValidateObject(options, new ValidationContext(options), providerResults, true))
+ ValidateOptionsResult providerResults = providerValidator.Validate(provider, options);
+ if (providerResults.Failed)
{
// We prefix the validation error with the provider.
- results.AddRange(providerResults.Select(r => new ValidationResult(
- string.Format(CultureInfo.CurrentCulture, OptionsDisplayStrings.ErrorMessage_NestedProviderValidationError, provider, r.ErrorMessage))));
+ results.AddRange(providerResults.Failures.Select(r => new ValidationResult(
+ string.Format(CultureInfo.CurrentCulture, OptionsDisplayStrings.ErrorMessage_NestedProviderValidationError, provider, r))));
}
}
}
@@ -73,6 +80,17 @@ public IEnumerable Validate(ValidationContext validationContex
}
}
+ [OptionsValidator]
+ partial class GlobalCounterOptionsValidator : IValidateOptions
+ {
+ private readonly IServiceProvider _serviceProvider;
+
+ public GlobalCounterOptionsValidator(IServiceProvider serviceProvider)
+ {
+ _serviceProvider = serviceProvider;
+ }
+ }
+
internal static class GlobalCounterOptionsExtensions
{
public static float GetIntervalSeconds(this GlobalCounterOptions options) =>
diff --git a/src/Microsoft.Diagnostics.Monitoring.Options/MetricsOptions.cs b/src/Microsoft.Diagnostics.Monitoring.Options/MetricsOptions.cs
index faa647690f3..7d7b5a9e9d7 100644
--- a/src/Microsoft.Diagnostics.Monitoring.Options/MetricsOptions.cs
+++ b/src/Microsoft.Diagnostics.Monitoring.Options/MetricsOptions.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.ComponentModel;
@@ -43,6 +44,7 @@ public class MetricsOptions
[Display(
ResourceType = typeof(OptionsDisplayStrings),
Description = nameof(OptionsDisplayStrings.DisplayAttributeDescription_MetricsOptions_Providers))]
+ [ValidateEnumeratedItems]
public List Providers { get; set; } = [];
[Display(
diff --git a/src/Microsoft.Diagnostics.Monitoring.Options/MetricsOptionsValidator.cs b/src/Microsoft.Diagnostics.Monitoring.Options/MetricsOptionsValidator.cs
new file mode 100644
index 00000000000..6ec1d27f5b0
--- /dev/null
+++ b/src/Microsoft.Diagnostics.Monitoring.Options/MetricsOptionsValidator.cs
@@ -0,0 +1,12 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.Diagnostics.Monitoring.WebApi
+{
+ [OptionsValidator]
+ public partial class MetricsOptionsValidator : IValidateOptions
+ {
+ }
+}
diff --git a/src/Microsoft.Diagnostics.Monitoring.Options/Microsoft.Diagnostics.Monitoring.Options.csproj b/src/Microsoft.Diagnostics.Monitoring.Options/Microsoft.Diagnostics.Monitoring.Options.csproj
index f11b2d63e0e..b8763eb1259 100644
--- a/src/Microsoft.Diagnostics.Monitoring.Options/Microsoft.Diagnostics.Monitoring.Options.csproj
+++ b/src/Microsoft.Diagnostics.Monitoring.Options/Microsoft.Diagnostics.Monitoring.Options.csproj
@@ -1,4 +1,4 @@
-
+