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 @@ - +