private static IHealthReporter CreateHealthReporter(IConfiguration configuration) { // The GetSection() method never returns null. We will have to call the GetChildren() method to determine if the configuration is empty. IConfiguration healthReporterConfiguration = configuration.GetSection(ExtensionCategories.HealthReporter); string healthReporterType = healthReporterConfiguration["type"]; if (!string.IsNullOrEmpty(healthReporterType)) { // Look for 3rd party HealthReporter--look up the "extensions" section and create the instance dynamically IConfiguration extensionsConfiguration = configuration.GetSection("extensions"); foreach (var extension in extensionsConfiguration.GetChildren()) { var extConfig = new ExtensionsConfiguration(); extension.Bind(extConfig); if (string.Equals(extConfig.Category, ExtensionCategories.HealthReporter, StringComparison.OrdinalIgnoreCase) && string.Equals(extConfig.Type, healthReporterType, StringComparison.OrdinalIgnoreCase)) { var type = Type.GetType(extConfig.QualifiedTypeName, throwOnError: true); // Consider: Make IHealthReporter an abstract class, so the inherited classes are ensured to have a constructor with parameter IConfiguration return(Activator.CreateInstance(type, healthReporterConfiguration) as IHealthReporter); } } } if (string.IsNullOrEmpty(healthReporterType) || healthReporterType.Equals("CsvHealthReporter", StringComparison.OrdinalIgnoreCase)) { if (healthReporterConfiguration.GetChildren().Count() == 0) { healthReporterConfiguration = new ConfigurationBuilder().AddInMemoryCollection().Build(); } return(new CsvHealthReporter(healthReporterConfiguration)); } return(null); }
private static void CreateItemFactories( IConfiguration configuration, IHealthReporter healthReporter, out IDictionary <string, string> inputFactories, out IDictionary <string, string> outputFactories, out IDictionary <string, string> filterFactories) { Debug.Assert(configuration != null); Debug.Assert(healthReporter != null); inputFactories = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); inputFactories["EventSource"] = "Microsoft.Diagnostics.EventFlow.Inputs.EventSourceInputFactory, Microsoft.Diagnostics.EventFlow.Inputs.EventSource"; inputFactories["PerformanceCounter"] = "Microsoft.Diagnostics.EventFlow.Inputs.PerformanceCounterInputFactory, Microsoft.Diagnostics.EventFlow.Inputs.PerformanceCounter"; inputFactories["Trace"] = "Microsoft.Diagnostics.EventFlow.Inputs.TraceInputFactory, Microsoft.Diagnostics.EventFlow.Inputs.Trace"; inputFactories["Serilog"] = "Microsoft.Diagnostics.EventFlow.Inputs.SerilogInputFactory, Microsoft.Diagnostics.EventFlow.Inputs.Serilog"; inputFactories["Microsoft.Extensions.Logging"] = "Microsoft.Diagnostics.EventFlow.Inputs.LoggerInputFactory, Microsoft.Diagnostics.EventFlow.Inputs.MicrosoftLogging"; inputFactories["ETW"] = "Microsoft.Diagnostics.EventFlow.Inputs.EtwInputFactory, Microsoft.Diagnostics.EventFlow.Inputs.Etw"; inputFactories["ApplicationInsights"] = "Microsoft.Diagnostics.EventFlow.Inputs.ApplicationInsightsInputFactory, Microsoft.Diagnostics.EventFlow.Inputs.ApplicationInsights"; inputFactories["Log4net"] = "Microsoft.Diagnostics.EventFlow.Inputs.Log4netFactory, Microsoft.Diagnostics.EventFlow.Inputs.Log4net"; inputFactories["NLog"] = "Microsoft.Diagnostics.EventFlow.Inputs.NLogInputFactory, Microsoft.Diagnostics.EventFlow.Inputs.NLog"; inputFactories["DiagnosticSource"] = "Microsoft.Diagnostics.EventFlow.Inputs.DiagnosticSource.DiagnosticSourceInputFactory, Microsoft.Diagnostics.EventFlow.Inputs.DiagnosticSource"; outputFactories = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); outputFactories["ApplicationInsights"] = "Microsoft.Diagnostics.EventFlow.Outputs.ApplicationInsightsOutputFactory, Microsoft.Diagnostics.EventFlow.Outputs.ApplicationInsights"; outputFactories["StdOutput"] = "Microsoft.Diagnostics.EventFlow.Outputs.StdOutputFactory, Microsoft.Diagnostics.EventFlow.Outputs.StdOutput"; outputFactories["EventHub"] = "Microsoft.Diagnostics.EventFlow.Outputs.EventHubOutputFactory, Microsoft.Diagnostics.EventFlow.Outputs.EventHub"; outputFactories["ElasticSearch"] = "Microsoft.Diagnostics.EventFlow.Outputs.ElasticSearchOutputFactory, Microsoft.Diagnostics.EventFlow.Outputs.ElasticSearch"; outputFactories["OmsOutput"] = "Microsoft.Diagnostics.EventFlow.Outputs.OmsOutputFactory, Microsoft.Diagnostics.EventFlow.Outputs.Oms"; outputFactories["Http"] = "Microsoft.Diagnostics.EventFlow.Outputs.HttpOutputFactory, Microsoft.Diagnostics.EventFlow.Outputs.HttpOutput"; filterFactories = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); filterFactories["metadata"] = "Microsoft.Diagnostics.EventFlow.Filters.EventMetadataFilterFactory, Microsoft.Diagnostics.EventFlow.Core"; filterFactories["drop"] = "Microsoft.Diagnostics.EventFlow.Filters.DropFilterFactory, Microsoft.Diagnostics.EventFlow.Core"; // read 3rd party plugins IConfiguration extensionsConfiguration = configuration.GetSection("extensions"); foreach (var extension in extensionsConfiguration.GetChildren()) { var extConfig = new ExtensionsConfiguration(); extension.Bind(extConfig); IDictionary <string, string> targetFactories = null; if (string.Equals(extConfig.Category, ExtensionCategories.InputFactory, StringComparison.OrdinalIgnoreCase)) { targetFactories = inputFactories; } else if (string.Equals(extConfig.Category, ExtensionCategories.OutputFactory, StringComparison.OrdinalIgnoreCase)) { targetFactories = outputFactories; } else if (string.Equals(extConfig.Category, ExtensionCategories.FilterFactory, StringComparison.OrdinalIgnoreCase)) { targetFactories = filterFactories; } else if (string.Equals(extConfig.Category, ExtensionCategories.HealthReporter, StringComparison.OrdinalIgnoreCase)) { // Health reporter should have been created earlier, so skip continue; } else { healthReporter.ReportWarning($"Unrecognized extension category: {extConfig.Category}"); continue; } if (!string.IsNullOrEmpty(extConfig.Type) && !string.IsNullOrEmpty(extConfig.QualifiedTypeName)) { targetFactories[extConfig.Type] = extConfig.QualifiedTypeName; } else { healthReporter.ReportWarning($"Invalid extension configuration is skipped. Category: {extConfig.Category}, Type: {extConfig.Type}, QualifiedTypeName: {extConfig.QualifiedTypeName}"); } } }
public AddOrRemoveExtensionsCommand(ObservableCollection <FileExtension> extensions, ExtensionsConfiguration extensionsConfig) { Extensions = extensions; ExtensionsConfig = extensionsConfig; }