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;
 }