/// <summary> /// Adds <see cref="SamplingTelemetryProcessor"/> to the given<see cref="TelemetryProcessorChainBuilder" /> /// </summary> /// <param name="builder">Instance of <see cref="TelemetryProcessorChainBuilder"/></param> /// <param name="samplingPercentage">Sampling Percentage to configure.</param> /// <return>Instance of <see cref="TelemetryProcessorChainBuilder"/>.</return> public static TelemetryProcessorChainBuilder UseSampling(this TelemetryProcessorChainBuilder builder, double samplingPercentage) { return(builder.Use((next) => new SamplingTelemetryProcessor(next) { SamplingPercentage = samplingPercentage })); }
/// <summary> /// Adds <see cref="AdaptiveSamplingTelemetryProcessor"/> to the <see cref="TelemetryProcessorChainBuilder" /> /// </summary> /// <param name="builder">Instance of <see cref="TelemetryProcessorChainBuilder"/></param> /// <param name="maxTelemetryItemsPerSecond">Maximum number of telemetry items to be generated on this application instance.</param> /// <return>Instance of <see cref="TelemetryProcessorChainBuilder"/>.</return> public static TelemetryProcessorChainBuilder UseAdaptiveSampling(this TelemetryProcessorChainBuilder builder, double maxTelemetryItemsPerSecond) { return(builder.Use((next) => new AdaptiveSamplingTelemetryProcessor(next) { MaxTelemetryItemsPerSecond = maxTelemetryItemsPerSecond })); }
private static TelemetryProcessorChain CreateTelemetryProcessorChainWithSampling(IList <ITelemetry> sentTelemetry, double samplingPercentage, string excludedTypes = null, string includedTypes = null) { var tc = new TelemetryConfiguration { TelemetryChannel = new StubTelemetryChannel() }; tc.InstrumentationKey = Guid.NewGuid().ToString("D"); var channelBuilder = new TelemetryProcessorChainBuilder(tc); channelBuilder.UseSampling(samplingPercentage, excludedTypes, includedTypes); channelBuilder.Use(next => new StubTelemetryProcessor(next) { OnProcess = t => sentTelemetry.Add(t) }); channelBuilder.Build(); TelemetryProcessorChain processors = tc.TelemetryProcessorChain; foreach (ITelemetryProcessor processor in processors.TelemetryProcessors) { ITelemetryModule m = processor as ITelemetryModule; if (m != null) { m.Initialize(tc); } } return(processors); }
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //ApplicationInsight //Initializers: TelemetryConfiguration.Active.TelemetryInitializers.Add(new HttpTelemetryInitializer()); TelemetryConfiguration.Active.TelemetryInitializers.Add(new HttpRequestTelemetryInitializer()); TelemetryConfiguration.Active.TelemetryInitializers.Add(new WebMethodInitializer()); //Procesors: TelemetryProcessorChainBuilder builder = TelemetryConfiguration.Active.DefaultTelemetrySink.TelemetryProcessorChainBuilder; builder.Use((next) => new TelemetryUnAuthorizedFilter(next)); builder.Use((next) => new TelemetryPathFilter(next)); builder.Use((next) => new TelemetryBotFilter(next)); builder.Use((next) => new TelemetryFastRemoteDependencyCallsFilter(next)); builder.Use((next) => new SuccessfulDependencyFilter(next)); builder.Build(); }
internal static TelemetryConfiguration CreateTelemetryConfigWithExtractor(IList <ITelemetry> telemetrySentToChannel, Func <ITelemetryProcessor, AutocollectedMetricsExtractor> extractorFactory) { ITelemetryChannel channel = new StubTelemetryChannel { OnSend = (t) => telemetrySentToChannel.Add(t) }; string iKey = Guid.NewGuid().ToString("D"); TelemetryConfiguration telemetryConfig = new TelemetryConfiguration(iKey, channel); var channelBuilder = new TelemetryProcessorChainBuilder(telemetryConfig); channelBuilder.Use(extractorFactory); channelBuilder.Build(); TelemetryProcessorChain processors = telemetryConfig.TelemetryProcessorChain; foreach (ITelemetryProcessor processor in processors.TelemetryProcessors) { ITelemetryModule m = processor as ITelemetryModule; if (m != null) { m.Initialize(telemetryConfig); } } return(telemetryConfig); }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); var appInsightsConfig = app.ApplicationServices.GetService <TelemetryConfiguration>(); TelemetryProcessorChainBuilder builder = appInsightsConfig.TelemetryProcessorChainBuilder; // some custom telemetry processor for Application Insights that filters out synthetic traffic (e.g traffic that comes from Azure to keep the server awake). builder.UseAdaptiveSampling(excludedTypes: "Exception"); builder.UseAdaptiveSampling(maxTelemetryItemsPerSecond: 10000); builder.Build(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
public void CommonTelemetryProcessorsAreInvoked() { var configuration = new TelemetryConfiguration(); var sentTelemetry = new List <ITelemetry>(1); var channel = new StubTelemetryChannel(); channel.OnSend = (telemetry) => sentTelemetry.Add(telemetry); configuration.TelemetryChannel = channel; var chainBuilder = new TelemetryProcessorChainBuilder(configuration); configuration.TelemetryProcessorChainBuilder = chainBuilder; chainBuilder.Use((next) => { var first = new StubTelemetryProcessor(next); first.OnProcess = (telemetry) => telemetry.Context.Properties.Add("SeenByFirst", "true"); return(first); }); chainBuilder.Use((next) => { var second = new StubTelemetryProcessor(next); second.OnProcess = (telemetry) => telemetry.Context.Properties.Add("SeenBySecond", "true"); return(second); }); var client = new TelemetryClient(configuration); client.TrackTrace("t1"); Assert.AreEqual(1, sentTelemetry.Count); Assert.IsTrue(sentTelemetry[0].Context.Properties.ContainsKey("SeenByFirst")); Assert.IsTrue(sentTelemetry[0].Context.Properties.ContainsKey("SeenBySecond")); }
public void SinkProcessorsAreInvoked() { var configuration = new TelemetryConfiguration(); var sentTelemetry = new List <ITelemetry>(1); var channel = new StubTelemetryChannel(); channel.OnSend = (telemetry) => sentTelemetry.Add(telemetry); configuration.TelemetryChannel = channel; var chainBuilder = new TelemetryProcessorChainBuilder(configuration, configuration.DefaultTelemetrySink); configuration.DefaultTelemetrySink.TelemetryProcessorChainBuilder = chainBuilder; chainBuilder.Use((next) => { var first = new StubTelemetryProcessor(next); first.OnProcess = (telemetry) => telemetry.Context.Properties.Add("SeenByFirst", "true"); return(first); }); chainBuilder.Use((next) => { var second = new StubTelemetryProcessor(next); second.OnProcess = (telemetry) => telemetry.Context.Properties.Add("SeenBySecond", "true"); return(second); }); var client = new TelemetryClient(configuration); client.TrackTrace("t1"); Assert.IsFalse(configuration.TelemetryProcessors.OfType <StubTelemetryProcessor>().Any()); // Both processors belong to the sink, not to the common chain. Assert.AreEqual(1, sentTelemetry.Count); Assert.IsTrue(sentTelemetry[0].Context.Properties.ContainsKey("SeenByFirst")); Assert.IsTrue(sentTelemetry[0].Context.Properties.ContainsKey("SeenBySecond")); }
public static TelemetryConfiguration CreateAITelemetryConfig(out IList <ITelemetry> telemetrySentToChannel) { StubApplicationInsightsTelemetryChannel channel = new StubApplicationInsightsTelemetryChannel(); string iKey = Guid.NewGuid().ToString("D"); TelemetryConfiguration telemetryConfig = new TelemetryConfiguration(iKey, channel); var channelBuilder = new TelemetryProcessorChainBuilder(telemetryConfig); channelBuilder.Build(); foreach (ITelemetryProcessor initializer in telemetryConfig.TelemetryInitializers) { ITelemetryModule m = initializer as ITelemetryModule; if (m != null) { m.Initialize(telemetryConfig); } } foreach (ITelemetryProcessor processor in telemetryConfig.TelemetryProcessors) { ITelemetryModule m = processor as ITelemetryModule; if (m != null) { m.Initialize(telemetryConfig); } } telemetrySentToChannel = channel.TelemetryItems; return(telemetryConfig); }
public ApplicationInsightsWriter(string instrumentationKey, WriterOptions options) { TelemetryConfiguration.Active.InstrumentationKey = instrumentationKey; TelemetryProcessorChainBuilder builder = TelemetryConfiguration.Active.TelemetryProcessorChainBuilder; QuickPulseTelemetryProcessor quickPulseProcessor = null; // add our own telemetry processor that can override session based variables //builder.Use(next => new LogMagicTelemetryProcessor(next)); // optionally enable QuickPulse /* * - Free and is not counted towards the bill. * - The latency is 1 second compared to a few minutes. * - Retention is while the data is on the chart, not 90 days. * - Data is only streamed while you are in Live Metrics view. */ if (options.EnableQuickPulse) { builder.Use((next) => { quickPulseProcessor = new QuickPulseTelemetryProcessor(next); return(quickPulseProcessor); }); } builder.Build(); _telemetryClient = new TelemetryClient(TelemetryConfiguration.Active); _telemetryClient.InstrumentationKey = instrumentationKey; _context = new InsightsContext(_telemetryClient, options); if (options.EnableQuickPulse) { var quickPulse = new QuickPulseTelemetryModule(); quickPulse.Initialize(TelemetryConfiguration.Active); quickPulse.RegisterTelemetryProcessor(quickPulseProcessor); } #if NETFULL // see https://github.com/Microsoft/ApplicationInsights-dotnet-server/blob/develop/Src/PerformanceCollector/Perf.Shared/PerformanceCollectorModule.cs if (options.CollectPerformanceCounters) { //optionally enable performance counters collection var pcm = new PerformanceCollectorModule(); //custom counters can be easily added here if required pcm.Counters.Add(new PerformanceCounterCollectionRequest(@"\.NET CLR Memory(LogMagic.Console)\# GC Handles", "GC Handles")); pcm.Initialize(TelemetryConfiguration.Active); } #endif TelemetryConfiguration.Active.TelemetryInitializers.Add(new OperationTelemetryInitialiser()); _options = options; }
public Task <bool> UseProcessorSink(IConfiguration config, ILogger logger, TelemetryProcessorChainBuilder aiClientBuilder) { aiClientBuilder.Use((next) => new AppInsightAggMetricSink( next: next, logger: logger, config: config)); return(Task.FromResult <bool>(true)); }
public void UseAdaptiveSamplingWithSettingsParameterThrowsArgumentNullExceptionSettingsIsNull() { var tc = new TelemetryConfiguration { TelemetryChannel = new StubTelemetryChannel() }; var channelBuilder = new TelemetryProcessorChainBuilder(tc); AssertEx.Throws <ArgumentNullException>(() => channelBuilder.UseAdaptiveSampling(default(SamplingPercentageEstimatorSettings), null)); }
/// <summary> /// Uses AppId information into the telemetry. /// </summary> /// <param name="builder">The builder.</param> /// <param name="appId">The AppId identify the application.</param> /// <returns>The builder.</returns> public static TelemetryProcessorChainBuilder UseAppId( this TelemetryProcessorChainBuilder builder, AppId appId) { builder .Use((next) => new TelemetryReplicationProcessor(next, appId)) .Build(); return(builder); }
public void UseAdaptiveSamplingWithSettingsParameterAndExcludedTypesThrowsArgumentNullExceptionSettingsIsNull() { var tc = new TelemetryConfiguration { TelemetryChannel = new StubTelemetryChannel() }; var channelBuilder = new TelemetryProcessorChainBuilder(tc); AssertEx.Throws <ArgumentNullException>(() => channelBuilder.UseAdaptiveSampling(null, null, "request")); }
/// <summary> /// Adds <see cref="AdaptiveSamplingTelemetryProcessor"/> to the <see cref="TelemetryProcessorChainBuilder" /> /// </summary> /// <param name="builder">Instance of <see cref="TelemetryProcessorChainBuilder"/></param> /// <return>Instance of <see cref="TelemetryProcessorChainBuilder"/>.</return> public static TelemetryProcessorChainBuilder UseAdaptiveSampling(this TelemetryProcessorChainBuilder builder) { if (builder == null) { throw new ArgumentNullException("builder"); } return(builder.Use(next => new AdaptiveSamplingTelemetryProcessor(next))); }
/// <summary> /// Adds <see cref="AdaptiveSamplingTelemetryProcessor"/> to the <see cref="TelemetryProcessorChainBuilder" /> /// </summary> /// <param name="builder">Instance of <see cref="TelemetryProcessorChainBuilder"/></param> /// <param name="settings">Set of settings applicable to dynamic sampling percentage algorithm.</param> /// <param name="callback">Callback invoked every time sampling percentage evaluation occurs.</param> /// <return>Instance of <see cref="TelemetryProcessorChainBuilder"/>.</return> public static TelemetryProcessorChainBuilder UseAdaptiveSampling( this TelemetryProcessorChainBuilder builder, SamplingPercentageEstimatorSettings settings, AdaptiveSamplingPercentageEvaluatedCallback callback) { return(builder.Use((next) => new AdaptiveSamplingTelemetryProcessor(settings, callback, next) { InitialSamplingPercentage = 100.0 / settings.EffectiveInitialSamplingRate })); }
public void UseAdaptiveSamplingAddsAdaptiveSamplingProcessorToTheChain() { var tc = new TelemetryConfiguration { TelemetryChannel = new StubTelemetryChannel() }; var channelBuilder = new TelemetryProcessorChainBuilder(tc); channelBuilder.UseAdaptiveSampling(); channelBuilder.Build(); AssertEx.IsType <AdaptiveSamplingTelemetryProcessor>(tc.TelemetryProcessorChain.FirstTelemetryProcessor); }
public void UseSamplingSetsAddsSamplingProcessorToTheChainWithCorrectPercentage() { var tc = new TelemetryConfiguration { TelemetryChannel = new StubTelemetryChannel() }; var channelBuilder = new TelemetryProcessorChainBuilder(tc); channelBuilder.UseSampling(5); channelBuilder.Build(); Assert.AreEqual(5, ((SamplingTelemetryProcessor)tc.TelemetryProcessorChain.FirstTelemetryProcessor).SamplingPercentage); }
public void UseAdaptiveSamplingAddsAdaptiveSamplingProcessorToTheChainWithCorrectExcludedTypes() { var tc = new TelemetryConfiguration { TelemetryChannel = new StubTelemetryChannel() }; var channelBuilder = new TelemetryProcessorChainBuilder(tc); channelBuilder.UseAdaptiveSampling("request"); channelBuilder.Build(); Assert.AreEqual("request", ((AdaptiveSamplingTelemetryProcessor)tc.TelemetryProcessorChain.FirstTelemetryProcessor).ExcludedTypes); }
/// <summary> /// Adds <see cref="AdaptiveSamplingTelemetryProcessor"/> to the <see cref="TelemetryProcessorChainBuilder" /> /// </summary> /// <param name="builder">Instance of <see cref="TelemetryProcessorChainBuilder"/></param> /// <param name="maxTelemetryItemsPerSecond">Maximum number of telemetry items to be generated on this application instance.</param> /// <return>Instance of <see cref="TelemetryProcessorChainBuilder"/>.</return> public static TelemetryProcessorChainBuilder UseAdaptiveSampling(this TelemetryProcessorChainBuilder builder, double maxTelemetryItemsPerSecond) { if (builder == null) { throw new ArgumentNullException("builder"); } return(builder.Use(next => new AdaptiveSamplingTelemetryProcessor(next) { MaxTelemetryItemsPerSecond = maxTelemetryItemsPerSecond })); }
public void UseAdaptiveSamplingAddsAdaptiveSamplingProcessorToTheChainWithCorrectMaxTelemetryItemsPerSecond() { var tc = new TelemetryConfiguration { TelemetryChannel = new StubTelemetryChannel() }; var channelBuilder = new TelemetryProcessorChainBuilder(tc); channelBuilder.UseAdaptiveSampling(5); channelBuilder.Build(); Assert.AreEqual(5, ((AdaptiveSamplingTelemetryProcessor)tc.TelemetryProcessorChain.FirstTelemetryProcessor).MaxTelemetryItemsPerSecond); }
/// <summary> /// Adds <see cref="SamplingTelemetryProcessor"/> to the given<see cref="TelemetryProcessorChainBuilder" /> /// </summary> /// <param name="builder">Instance of <see cref="TelemetryProcessorChainBuilder"/></param> /// <param name="samplingPercentage">Sampling Percentage to configure.</param> /// <return>Instance of <see cref="TelemetryProcessorChainBuilder"/>.</return> public static TelemetryProcessorChainBuilder UseSampling(this TelemetryProcessorChainBuilder builder, double samplingPercentage) { if (builder == null) { throw new ArgumentNullException("builder"); } return(builder.Use(next => new SamplingTelemetryProcessor(next) { SamplingPercentage = samplingPercentage })); }
/// <summary> /// Adds <see cref="AdaptiveSamplingTelemetryProcessor"/> to the <see cref="TelemetryProcessorChainBuilder" /> /// </summary> /// <param name="builder">Instance of <see cref="TelemetryProcessorChainBuilder"/></param> /// <param name="excludedTypes">Semicolon separated list of types that should not be sampled.</param> /// <param name="includedTypes">Semicolon separated list of types that should be sampled. All types are sampled when left empty.</param> /// <return>Instance of <see cref="TelemetryProcessorChainBuilder"/>.</return> public static TelemetryProcessorChainBuilder UseAdaptiveSampling(this TelemetryProcessorChainBuilder builder, string excludedTypes = null, string includedTypes = null) { if (builder == null) { throw new ArgumentNullException("builder"); } return(builder.Use(next => new AdaptiveSamplingTelemetryProcessor(next) { ExcludedTypes = excludedTypes, IncludedTypes = includedTypes })); }
internal TelemetryConfiguration InitializeConfiguration() { TelemetryConfiguration config = new TelemetryConfiguration() { InstrumentationKey = _instrumentationKey }; AddInitializers(config); // Plug in Live stream and adaptive sampling QuickPulseTelemetryProcessor processor = null; TelemetryProcessorChainBuilder builder = config.TelemetryProcessorChainBuilder .Use((next) => { processor = new QuickPulseTelemetryProcessor(next); return(processor); }); if (_samplingSettings != null) { builder.Use((next) => { return(new AdaptiveSamplingTelemetryProcessor(_samplingSettings, null, next)); }); } builder.Build(); _quickPulseModule = new QuickPulseTelemetryModule(); _quickPulseModule.Initialize(config); _quickPulseModule.RegisterTelemetryProcessor(processor); // Plug in perf counters _perfModule = new PerformanceCollectorModule(); _perfModule.Initialize(config); // Configure the TelemetryChannel ITelemetryChannel channel = CreateTelemetryChannel(); // call Initialize if available ITelemetryModule module = channel as ITelemetryModule; if (module != null) { module.Initialize(config); } config.TelemetryChannel = channel; return(config); }
public void ConfigurationDisposesAllSinks() { var configuration = new TelemetryConfiguration(); var commonChainBuilder = new TelemetryProcessorChainBuilder(configuration); configuration.TelemetryProcessorChainBuilder = commonChainBuilder; var firstChannel = new StubTelemetryChannel(); bool firstChannelDisposed = false; firstChannel.OnDispose = () => firstChannelDisposed = true; configuration.DefaultTelemetrySink.TelemetryChannel = firstChannel; var firstSinkChainBuilder = new TelemetryProcessorChainBuilder(configuration, configuration.DefaultTelemetrySink); bool firstSinkTelemetryProcessorDisposed = false; firstSinkChainBuilder.Use((next) => { var firstSinkTelemetryProcessor = new StubTelemetryProcessor(next); firstSinkTelemetryProcessor.OnDispose = () => firstSinkTelemetryProcessorDisposed = true; return(firstSinkTelemetryProcessor); }); configuration.DefaultTelemetrySink.TelemetryProcessorChainBuilder = firstSinkChainBuilder; var secondChannel = new StubTelemetryChannel(); bool secondChannelDisposed = false; secondChannel.OnDispose = () => secondChannelDisposed = true; var secondSink = new TelemetrySink(configuration, secondChannel); var secondSinkChainBuilder = new TelemetryProcessorChainBuilder(configuration, secondSink); bool secondSinkTelemetryProcessorDisposed = false; secondSinkChainBuilder.Use((next) => { var secondSinkTelemetryProcessor = new StubTelemetryProcessor(next); secondSinkTelemetryProcessor.OnDispose = () => secondSinkTelemetryProcessorDisposed = true; return(secondSinkTelemetryProcessor); }); secondSink.TelemetryProcessorChainBuilder = secondSinkChainBuilder; configuration.TelemetrySinks.Add(secondSink); var client = new TelemetryClient(configuration); client.TrackTrace("t1"); configuration.Dispose(); // We expect the channels to not be disposed (because they were created externally to sinks), but the processors should be disposed. Assert.IsTrue(firstSinkTelemetryProcessorDisposed); Assert.IsTrue(secondSinkTelemetryProcessorDisposed); Assert.IsFalse(firstChannelDisposed); Assert.IsFalse(secondChannelDisposed); }
/// <summary> /// Adds <see cref="SamplingTelemetryProcessor"/> to the given<see cref="TelemetryProcessorChainBuilder" />. /// </summary> /// <param name="builder">Instance of <see cref="TelemetryProcessorChainBuilder"/>.</param> /// <param name="samplingPercentage">Sampling Percentage to configure.</param> /// <param name="excludedTypes">Semicolon separated list of types that should not be sampled.</param> /// <param name="includedTypes">Semicolon separated list of types that should be sampled. All types are sampled when left empty.</param> /// <return>Same instance of <see cref="TelemetryProcessorChainBuilder"/>.</return> public static TelemetryProcessorChainBuilder UseSampling(this TelemetryProcessorChainBuilder builder, double samplingPercentage, string excludedTypes = null, string includedTypes = null) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } return(builder.Use(next => new SamplingTelemetryProcessor(next) { SamplingPercentage = samplingPercentage, ExcludedTypes = excludedTypes, IncludedTypes = includedTypes, })); }
/// <summary> /// Adds <see cref="AdaptiveSamplingTelemetryProcessor"/> to the <see cref="TelemetryProcessorChainBuilder" />. /// </summary> /// <param name="builder">Instance of <see cref="TelemetryProcessorChainBuilder"/>.</param> /// <param name="maxTelemetryItemsPerSecond">Maximum number of telemetry items to be generated on this application instance.</param> /// <param name="excludedTypes">Semicolon separated list of types that should not be sampled.</param> /// <param name="includedTypes">Semicolon separated list of types that should be sampled. All types are sampled when left empty.</param> /// <return>Same instance of <see cref="TelemetryProcessorChainBuilder"/>.</return> public static TelemetryProcessorChainBuilder UseAdaptiveSampling(this TelemetryProcessorChainBuilder builder, double maxTelemetryItemsPerSecond, string excludedTypes = null, string includedTypes = null) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } return(builder.Use(next => new AdaptiveSamplingTelemetryProcessor(next) { MaxTelemetryItemsPerSecond = maxTelemetryItemsPerSecond, ExcludedTypes = excludedTypes, IncludedTypes = includedTypes, })); }
public void AllTelemetryCapturedWhenProductionRateIsLow() { var sentTelemetry = new List <ITelemetry>(); int itemsProduced = 0; using (var tc = new TelemetryConfiguration() { TelemetryChannel = new StubTelemetryChannel() }) { var chainBuilder = new TelemetryProcessorChainBuilder(tc); // set up adaptive sampling that evaluates and changes sampling % frequently chainBuilder .UseAdaptiveSampling( new Channel.Implementation.SamplingPercentageEstimatorSettings() { EvaluationInterval = TimeSpan.FromSeconds(1), SamplingPercentageDecreaseTimeout = TimeSpan.FromSeconds(2), SamplingPercentageIncreaseTimeout = TimeSpan.FromSeconds(2), }, this.TraceSamplingPercentageEvaluation) .Use((next) => new StubTelemetryProcessor(next) { OnProcess = (t) => sentTelemetry.Add(t) }); chainBuilder.Build(); const int productionFrequencyMs = 1000; var productionTimer = new Timer( (state) => { tc.TelemetryProcessorChain.Process(new RequestTelemetry()); itemsProduced++; }, null, productionFrequencyMs, productionFrequencyMs); Thread.Sleep(25000); // dispose timer and wait for callbacks to complete DisposeTimer(productionTimer); } Assert.AreEqual(itemsProduced, sentTelemetry.Count); }
public void AdaptiveSamplingSetsExcludedTypesOnInternalSamplingProcessor() { var tc = new TelemetryConfiguration { TelemetryChannel = new StubTelemetryChannel() }; var channelBuilder = new TelemetryProcessorChainBuilder(tc); channelBuilder.UseAdaptiveSampling(5, "request;"); channelBuilder.Build(); var fieldInfo = typeof(AdaptiveSamplingTelemetryProcessor).GetField("samplingProcessor", BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic); SamplingTelemetryProcessor internalProcessor = (SamplingTelemetryProcessor)fieldInfo.GetValue(tc.TelemetryProcessorChain.FirstTelemetryProcessor); Assert.AreEqual("request;", internalProcessor.ExcludedTypes); }
public ApplicationInsightsWriter(string instrumentationKey, WriterOptions options) { TelemetryConfiguration.Active.InstrumentationKey = instrumentationKey; TelemetryProcessorChainBuilder builder = TelemetryConfiguration.Active.TelemetryProcessorChainBuilder; builder.Use(next => new LogMagicTelemetryProcessor(next)); builder.Build(); _telemetryClient = new TelemetryClient(TelemetryConfiguration.Active); _telemetryClient.InstrumentationKey = instrumentationKey; _context = new InsightsContext(_telemetryClient, options); _options = options; }