/// <summary> /// Add new session channel to the list of active channels. /// </summary> /// <param name="sessionChannel"></param> public void AddSessionChannel(ISessionChannel sessionChannel) { RequiresNotDisposed(); CodeContract.RequiresArgumentNotNull <ISessionChannel>(sessionChannel, "sessionChannel"); if (IsValidChannel(sessionChannel)) { EventProcessor.AddChannel(sessionChannel); if ((sessionChannel.Properties & ChannelProperties.Default) == ChannelProperties.Default) { defaultSessionChannelsId.Add(sessionChannel.ChannelId); } } }
/// <summary> /// Set up telemetry session properties /// </summary> /// <param name="settings"></param> /// <param name="initializerObject"></param> /// <param name="isCloned"></param> private TelemetrySession(TelemetrySessionSettings settings, bool isCloned, TelemetrySessionInitializer initializerObject) { CodeContract.RequiresArgumentNotNull <TelemetrySessionInitializer>(initializerObject, "initializerObject"); initializerObject.Validate(); initializerObject.AppInsightsInstrumentationKey = settings.AppInsightsInstrumentationKey; initializerObject.AsimovInstrumentationKey = settings.AsimovInstrumentationKey; TelemetryService.EnsureEtwProviderInitialized(); sessionInitializer = initializerObject; sessionSettings = settings; isSessionCloned = isCloned; cancellationTokenSource = initializerObject.CancellationTokenSource; diagnosticTelemetry = initializerObject.DiagnosticTelemetry; identityTelemetry = initializerObject.IdentityTelemetry; optinStatusReader = initializerObject.OptinStatusReader; channelValidators = initializerObject.ChannelValidators; telemetryBufferChannel = new TelemetryBufferChannel(); initializerObject.WatsonSessionChannelBuilder.Build(this); WatsonSessionChannel sessionChannel = initializerObject.WatsonSessionChannelBuilder.WatsonSessionChannel; if (IsValidChannel(sessionChannel)) { watsonSessionChannel = sessionChannel; } machineInformationProvider = initializerObject.MachineInformationProvider; macInformationProvider = initializerObject.MACInformationProvider; userInformationProvider = initializerObject.UserInformationProvider; defaultContextPropertyManager = initializerObject.DefaultContextPropertyManager; persistentPropertyBag = initializerObject.PersistentPropertyBag; initializerObject.EventProcessorChannelBuilder.Build(this); persistentSharedProperties = initializerObject.PersistentSharedProperties; EventProcessor = initializerObject.EventProcessorChannelBuilder.EventProcessor; if (initializerObject.CustomActionToAdd != null) { foreach (IEventProcessorAction item in initializerObject.CustomActionToAdd) { EventProcessor.AddCustomAction(item); } } eventProcessorChannel = initializerObject.EventProcessorChannelBuilder.EventProcessorChannel; telemetryManifestManager = new Lazy <ITelemetryManifestManager>(() => initializerObject.TelemetryManifestManagerBuilder.Build(this)); contextScheduler = initializerObject.ContextScheduler; if (initializerObject.ChannelsToAdd != null) { AddSessionChannels(initializerObject.ChannelsToAdd); } defaultContext = CreateDefaultContext(); macInformationProvider.MACAddressHashCalculationCompleted += MACAddressHashCalculationCompleted; identityTelemetry.IdentityInformationProvider.HardwareIdCalculationCompleted += HardwareIdCalculationCompleted; }
/// <summary> /// Start synchronous dispose /// </summary> /// <returns>can we continue with dispose or not</returns> private bool DisposeStart() { if (Interlocked.CompareExchange(ref startedDisposing, 1, 0) == 1) { return(false); } disposeLatencyTimer = new Stopwatch(); disposeLatencyTimer.Start(); if (!isInitialized) { if (!isSessionStarted) { Start(); } if (!ManifestManager.ForceReadManifest()) { TelemetryManifestUpdateStatus(this, new TelemetryManifestEventArgs(null)); } MACAddressHashCalculationCompleted(this, EventArgs.Empty); HardwareIdCalculationCompleted(this, EventArgs.Empty); } macInformationProvider.MACAddressHashCalculationCompleted -= MACAddressHashCalculationCompleted; identityTelemetry.IdentityInformationProvider.HardwareIdCalculationCompleted -= HardwareIdCalculationCompleted; ManifestManager.UpdateTelemetryManifestStatusEvent -= TelemetryManifestUpdateStatus; ManifestManager.Dispose(); cancellationTokenSource.Cancel(); defaultContextPropertyManager.Dispose(); EventProcessor.PostDiagnosticInformationIfNeeded(); customEventPostProtection.TryEnterWriteLock(1000); List <TelemetryContext> list; lock (sessionContextStack) { list = sessionContextStack.Reverse().ToList(); } foreach (TelemetryContext item in list) { item.Dispose(); } return(true); }