/// <summary>
        /// Adds <c>ETW</c> in-process telemetry session services to the service collection.
        /// </summary>
        /// <param name="services">A <see cref="IServiceCollection"/> instance.</param>
        /// <param name="configuration">A <see cref="IConfiguration"/> instance.</param>
        /// <returns>The provided <see cref="IServiceCollection"/> instance.</returns>
        public static IServiceCollection AddInProcessTelemetrySession(
            this IServiceCollection services,
            IConfiguration configuration)
        {
            if (services == null)
            {
                throw new ArgumentNullException(nameof(services));
            }

            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }

            return(services
                   .AddTracingCore(configuration)
                   .Configure <SessionConfiguration>(configuration.GetSection("Tracing"))
                   .AddSingleton <IProvidersDescriptor, SessionConfigurationProvidersDescriptor>()
                   .AddSingleton(p =>
            {
                SessionConfiguration config = p
                                              .GetRequiredService <IOptions <SessionConfiguration> >()?.Value;
                IEnumerable <ITelemetryEventTransmitter> eventTransmitters =
                    p.GetServices <ITelemetryEventTransmitter>();
                ITelemetrySession session = InProcessTelemetrySession
                                            .Create(config, p.GetServices <IProvidersDescriptor>());

                foreach (ITelemetryEventTransmitter transmitter in eventTransmitters)
                {
                    session.Attach(transmitter);
                }

                return session;
            }));
        }
예제 #2
0
        /// <summary>
        /// Creates a new instance of <see cref="InProcessTelemetrySession"/>.
        /// </summary>
        /// <param name="applicationId">An unique application id.</param>
        /// <param name="level">A level of severity.</param>
        /// <param name="providersDescriptors">
        /// A collection of provider descriptors.
        /// </param>
        /// <returns>
        /// A new instance of <see cref="InProcessTelemetrySession"/>.
        /// </returns>
        public static InProcessTelemetrySession Create(int applicationId,
                                                       EventLevel level, IEnumerable <IProvidersDescriptor> providersDescriptors)
        {
            InProcessTelemetrySession session = new InProcessTelemetrySession(
                applicationId, level, providersDescriptors);

            session.FindAndActivateProviders();
            session.RegisterAssemblyLoadCallback();

            return(session);
        }