/// <summary> /// Initializes a new instance of the TelemetryConfiguration class. /// </summary> /// <param name="instrumentationKey">The instrumentation key this configuration instance will provide.</param> /// <param name="channel">The telemetry channel to provide with this configuration instance.</param> public TelemetryConfiguration(string instrumentationKey, ITelemetryChannel channel) { this.instrumentationKey = instrumentationKey ?? throw new ArgumentNullException(nameof(instrumentationKey)); SetTelemetryChannelEndpoint(channel, this.EndpointContainer.FormattedIngestionEndpoint, force: true); var defaultSink = new TelemetrySink(this, channel); defaultSink.Name = "default"; this.telemetrySinks.Add(defaultSink); }
/// <summary> /// Initializes a new instance of the TelemetryConfiguration class. /// </summary> /// <param name="instrumentationKey">The instrumentation key this configuration instance will provide.</param> /// <param name="channel">The telemetry channel to provide with this configuration instance.</param> public TelemetryConfiguration(string instrumentationKey, ITelemetryChannel channel) { if (instrumentationKey == null) { throw new ArgumentNullException(nameof(instrumentationKey)); } this.instrumentationKey = instrumentationKey; var defaultSink = new TelemetrySink(this, channel); defaultSink.Name = "default"; this.telemetrySinks.Add(defaultSink); }
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); }
public void TelemetryIsDeliveredToMultipleSinks() { var configuration = new TelemetryConfiguration(); var firstChannelTelemetry = new List <ITelemetry>(); var firstChannel = new StubTelemetryChannel(); firstChannel.OnSend = (telemetry) => firstChannelTelemetry.Add(telemetry); configuration.DefaultTelemetrySink.TelemetryChannel = firstChannel; var chainBuilder = new TelemetryProcessorChainBuilder(configuration); configuration.TelemetryProcessorChainBuilder = chainBuilder; var secondChannelTelemetry = new List <ITelemetry>(); var secondChannel = new StubTelemetryChannel(); secondChannel.OnSend = (telemetry) => secondChannelTelemetry.Add(telemetry); var secondSink = new TelemetrySink(configuration, secondChannel); configuration.TelemetrySinks.Add(secondSink); var thirdChannelTelemetry = new List <ITelemetry>(); var thirdChannel = new StubTelemetryChannel(); thirdChannel.OnSend = (telemetry) => thirdChannelTelemetry.Add(telemetry); var thirdSink = new TelemetrySink(configuration, thirdChannel); configuration.TelemetrySinks.Add(thirdSink); var client = new TelemetryClient(configuration); client.TrackTrace("t1"); Assert.AreEqual(1, firstChannelTelemetry.Count); Assert.AreEqual("t1", ((TraceTelemetry)firstChannelTelemetry[0]).Message); Assert.AreEqual(1, secondChannelTelemetry.Count); Assert.AreEqual("t1", ((TraceTelemetry)secondChannelTelemetry[0]).Message); Assert.AreEqual(1, thirdChannelTelemetry.Count); Assert.AreEqual("t1", ((TraceTelemetry)thirdChannelTelemetry[0]).Message); }
public void MultipleSinkTelemetryProcessorsAreInvoked() { var configuration = new TelemetryConfiguration(); var commonChainBuilder = new TelemetryProcessorChainBuilder(configuration); configuration.TelemetryProcessorChainBuilder = commonChainBuilder; commonChainBuilder.Use((next) => { var commonProcessor = new StubTelemetryProcessor(next); commonProcessor.OnProcess = (telemetry) => telemetry.Context.Properties.Add("SeenByCommonProcessor", "true"); return(commonProcessor); }); var firstChannelTelemetry = new List <ITelemetry>(); var firstChannel = new StubTelemetryChannel(); firstChannel.OnSend = (telemetry) => firstChannelTelemetry.Add(telemetry); configuration.DefaultTelemetrySink.TelemetryChannel = firstChannel; var firstSinkChainBuilder = new TelemetryProcessorChainBuilder(configuration, configuration.DefaultTelemetrySink); firstSinkChainBuilder.Use((next) => { var firstSinkTelemetryProcessor = new StubTelemetryProcessor(next); firstSinkTelemetryProcessor.OnProcess = (telemetry) => telemetry.Context.Properties.Add("SeenByFirstSinkProcessor", "true"); return(firstSinkTelemetryProcessor); }); configuration.DefaultTelemetrySink.TelemetryProcessorChainBuilder = firstSinkChainBuilder; var secondChannelTelemetry = new List <ITelemetry>(); var secondChannel = new StubTelemetryChannel(); secondChannel.OnSend = (telemetry) => secondChannelTelemetry.Add(telemetry); var secondSink = new TelemetrySink(configuration, secondChannel); configuration.TelemetrySinks.Add(secondSink); var secondSinkChainBuilder = new TelemetryProcessorChainBuilder(configuration, secondSink); secondSinkChainBuilder.Use((next) => { var secondSinkTelemetryProcessor = new StubTelemetryProcessor(next); secondSinkTelemetryProcessor.OnProcess = (telemetry) => telemetry.Context.Properties.Add("SeenBySecondSinkProcessor", "true"); return(secondSinkTelemetryProcessor); }); secondSink.TelemetryProcessorChainBuilder = secondSinkChainBuilder; var client = new TelemetryClient(configuration); client.TrackTrace("t1"); Assert.AreEqual(1, firstChannelTelemetry.Count); Assert.IsTrue(firstChannelTelemetry[0].Context.Properties.ContainsKey("SeenByCommonProcessor")); Assert.IsTrue(firstChannelTelemetry[0].Context.Properties.ContainsKey("SeenByFirstSinkProcessor")); Assert.IsFalse(firstChannelTelemetry[0].Context.Properties.ContainsKey("SeenBySecondSinkProcessor")); Assert.AreEqual(1, secondChannelTelemetry.Count); Assert.IsTrue(secondChannelTelemetry[0].Context.Properties.ContainsKey("SeenByCommonProcessor")); Assert.IsFalse(secondChannelTelemetry[0].Context.Properties.ContainsKey("SeenByFirstSinkProcessor")); Assert.IsTrue(secondChannelTelemetry[0].Context.Properties.ContainsKey("SeenBySecondSinkProcessor")); }