private void InitializeServiceClient(TelemetryConfiguration configuration) { if (this.serviceClient != null) { // service client has been passed through a constructor, we don't need to do anything return; } Uri serviceEndpointUri; if (string.IsNullOrWhiteSpace(this.QuickPulseServiceEndpoint)) { // endpoint is not specified in configuration, use the default one serviceEndpointUri = QuickPulseDefaults.ServiceEndpoint; } else { // endpoint appears to have been specified in configuration, try using it try { serviceEndpointUri = new Uri(this.QuickPulseServiceEndpoint); } catch (Exception e) { throw new ArgumentException( string.Format( CultureInfo.InvariantCulture, "Error initializing QuickPulse module. QPS endpoint is not a correct URI: '{0}'", this.QuickPulseServiceEndpoint), e); } } // create the default production implementation of the service client with the best service endpoint we could get string instanceName = GetInstanceName(configuration); string streamId = GetStreamId(); string machineName = Environment.MachineName; var assemblyVersion = SdkVersionUtils.GetSdkVersion(null); bool isWebApp = PerformanceCounterUtility.IsWebAppRunningInAzure(); int? processorCount = PerformanceCounterUtility.GetProcessorCount(isWebApp); this.serviceClient = new QuickPulseServiceClient( serviceEndpointUri, instanceName, streamId, machineName, assemblyVersion, this.timeProvider, isWebApp, processorCount ?? 0); QuickPulseEventSource.Log.TroubleshootingMessageEvent( string.Format( CultureInfo.InvariantCulture, "Service client initialized. Endpoint: '{0}', instance name: '{1}', assembly version: '{2}'", serviceEndpointUri, instanceName, assemblyVersion)); }
private static QuickPulseCollectionStateManager CreateManager( IQuickPulseServiceClient serviceClient, Clock timeProvider, List <string> actions, List <QuickPulseDataSample> returnedSamples = null, QuickPulseTimings timings = null, List <CollectionConfigurationInfo> collectionConfigurationInfos = null) { var manager = new QuickPulseCollectionStateManager( serviceClient, timeProvider, timings ?? QuickPulseTimings.Default, () => actions.Add(StartCollectionMessage), () => actions.Add(StopCollectionMessage), () => { actions.Add(CollectMessage); CollectionConfigurationError[] errors; var now = DateTimeOffset.UtcNow; return (new[] { new QuickPulseDataSample( new QuickPulseDataAccumulator( new CollectionConfiguration(EmptyCollectionConfigurationInfo, out errors, timeProvider)) { AIRequestSuccessCount = 5, StartTimestamp = now, EndTimestamp = now.AddSeconds(1) }, new Dictionary <string, Tuple <PerformanceCounterData, double> >(), Enumerable.Empty <Tuple <string, int> >(), false) }.ToList()); }, samples => { returnedSamples?.AddRange(samples); }, collectionConfigurationInfo => { actions.Add(UpdatedConfigurationMessage); collectionConfigurationInfos?.Add(collectionConfigurationInfo); CollectionConfigurationError[] errors; new CollectionConfiguration(collectionConfigurationInfo, out errors, timeProvider); return(errors); }, _ => { }); return(manager); }
public QuickPulseCollectionStateManager( IQuickPulseServiceClient serviceClient, Clock timeProvider, QuickPulseTimings timings, Action onStartCollection, Action onStopCollection, Func <IList <QuickPulseDataSample> > onSubmitSamples, Action <IList <QuickPulseDataSample> > onReturnFailedSamples) { if (serviceClient == null) { throw new ArgumentNullException(nameof(serviceClient)); } if (timeProvider == null) { throw new ArgumentNullException(nameof(timeProvider)); } if (timings == null) { throw new ArgumentNullException(nameof(timings)); } if (onStartCollection == null) { throw new ArgumentNullException(nameof(onStartCollection)); } if (onStopCollection == null) { throw new ArgumentNullException(nameof(onStopCollection)); } if (onSubmitSamples == null) { throw new ArgumentNullException(nameof(onSubmitSamples)); } if (onReturnFailedSamples == null) { throw new ArgumentNullException(nameof(onReturnFailedSamples)); } this.serviceClient = serviceClient; this.timeProvider = timeProvider; this.timings = timings; this.onStartCollection = onStartCollection; this.onStopCollection = onStopCollection; this.onSubmitSamples = onSubmitSamples; this.onReturnFailedSamples = onReturnFailedSamples; }
public QuickPulseCollectionStateManager( IQuickPulseServiceClient serviceClient, Clock timeProvider, QuickPulseTimings timings, Action onStartCollection, Action onStopCollection, Func<IList<QuickPulseDataSample>> onSubmitSamples, Action<IList<QuickPulseDataSample>> onReturnFailedSamples) { if (serviceClient == null) { throw new ArgumentNullException(nameof(serviceClient)); } if (timeProvider == null) { throw new ArgumentNullException(nameof(timeProvider)); } if (timings == null) { throw new ArgumentNullException(nameof(timings)); } if (onStartCollection == null) { throw new ArgumentNullException(nameof(onStartCollection)); } if (onStopCollection == null) { throw new ArgumentNullException(nameof(onStopCollection)); } if (onSubmitSamples == null) { throw new ArgumentNullException(nameof(onSubmitSamples)); } if (onReturnFailedSamples == null) { throw new ArgumentNullException(nameof(onReturnFailedSamples)); } this.serviceClient = serviceClient; this.timeProvider = timeProvider; this.timings = timings; this.onStartCollection = onStartCollection; this.onStopCollection = onStopCollection; this.onSubmitSamples = onSubmitSamples; this.onReturnFailedSamples = onReturnFailedSamples; }
/// <summary> /// Initializes a new instance of the <see cref="QuickPulseTelemetryModule"/> class. Internal constructor for unit tests only. /// </summary> /// <param name="collectionTimeSlotManager">Collection time slot manager.</param> /// <param name="dataAccumulatorManager">Data hub to sink QuickPulse data to.</param> /// <param name="serviceClient">QPS service client.</param> /// <param name="performanceCollector">Performance counter collector.</param> /// <param name="timings">Timings for the module.</param> internal QuickPulseTelemetryModule( QuickPulseCollectionTimeSlotManager collectionTimeSlotManager, QuickPulseDataAccumulatorManager dataAccumulatorManager, IQuickPulseServiceClient serviceClient, IPerformanceCollector performanceCollector, QuickPulseTimings timings) : this() { this.collectionTimeSlotManager = collectionTimeSlotManager; this.dataAccumulatorManager = dataAccumulatorManager; this.serviceClient = serviceClient; this.performanceCollector = performanceCollector; this.timings = timings; }
public void QuickPulseTelemetryModuleInitializesServiceClientFromDefault() { // ARRANGE var module = new QuickPulseTelemetryModule(null, null, null, null, null, null); // ACT // do not provide module configuration, force default service client module.Initialize(new TelemetryConfiguration()); // ASSERT IQuickPulseServiceClient serviceClient = (IQuickPulseServiceClient)QuickPulseTestHelper.GetPrivateField(module, "serviceClient"); Assert.IsInstanceOfType(serviceClient, typeof(QuickPulseServiceClient)); Assert.AreEqual(QuickPulseDefaults.ServiceEndpoint, serviceClient.ServiceUri); }
private static QuickPulseCollectionStateManager CreateManager( IQuickPulseServiceClient serviceClient, Clock timeProvider, List <string> actions, List <QuickPulseDataSample> returnedSamples = null, QuickPulseTimings timings = null) { var manager = new QuickPulseCollectionStateManager( serviceClient, timeProvider, timings ?? QuickPulseTimings.Default, () => actions.Add(StartCollectionMessage), () => actions.Add(StopCollectionMessage), () => { actions.Add(CollectMessage); var now = DateTimeOffset.UtcNow; return (new[] { new QuickPulseDataSample( new QuickPulseDataAccumulator { AIRequestSuccessCount = 5, StartTimestamp = now, EndTimestamp = now.AddSeconds(1) }, new Dictionary <string, Tuple <PerformanceCounterData, double> >(), Enumerable.Empty <Tuple <string, int> >(), false) }.ToList()); }, samples => { if (returnedSamples != null) { returnedSamples.AddRange(samples); } }); return(manager); }
private void InitializeServiceClient(TelemetryConfiguration configuration) { if (this.ServiceClient != null) { // service client has been passed through a constructor, we don't need to do anything return; } Uri serviceEndpointUri; if (string.IsNullOrWhiteSpace(this.QuickPulseServiceEndpoint)) { // endpoint is not explicitly specified, use the Endpoint from the TelemetryConfiguration (ex: https://rt.services.visualstudio.com/QuickPulseService.svc) serviceEndpointUri = new Uri(configuration.EndpointContainer.Live, "QuickPulseService.svc"); } else { // endpoint appears to have been specified in configuration, try using it try { serviceEndpointUri = new Uri(this.QuickPulseServiceEndpoint); } catch (Exception e) { throw new ArgumentException( string.Format( CultureInfo.InvariantCulture, "Error initializing QuickPulse module. QPS endpoint is not a correct URI: '{0}'", this.QuickPulseServiceEndpoint), e); } } // create the default production implementation of the service client with the best service endpoint we could get string instanceName = GetInstanceName(configuration); string streamId = GetStreamId(); var assemblyVersion = SdkVersionUtils.GetSdkVersion(null); bool isWebApp = PerformanceCounterUtility.IsWebAppRunningInAzure(); int? processorCount = PerformanceCounterUtility.GetProcessorCount(); this.ServiceClient = new QuickPulseServiceClient( serviceEndpointUri, instanceName, streamId, ServerId, assemblyVersion, this.timeProvider, isWebApp, processorCount ?? 0); // TelemetryConfigurationFactory will initialize Modules after Processors. Need to update the processor with the correct service endpoint. foreach (var processor in this.TelemetryProcessors) { processor.ServiceEndpoint = serviceEndpointUri; } QuickPulseEventSource.Log.TroubleshootingMessageEvent( string.Format( CultureInfo.InvariantCulture, "Service client initialized. Endpoint: '{0}', instance name: '{1}', assembly version: '{2}'", serviceEndpointUri, instanceName, assemblyVersion)); }
public QuickPulseCollectionStateManager( IQuickPulseServiceClient serviceClient, Clock timeProvider, QuickPulseTimings timings, Action onStartCollection, Action onStopCollection, Func <IList <QuickPulseDataSample> > onSubmitSamples, Action <IList <QuickPulseDataSample> > onReturnFailedSamples, Func <CollectionConfigurationInfo, CollectionConfigurationError[]> onUpdatedConfiguration) { if (serviceClient == null) { throw new ArgumentNullException(nameof(serviceClient)); } if (timeProvider == null) { throw new ArgumentNullException(nameof(timeProvider)); } if (timings == null) { throw new ArgumentNullException(nameof(timings)); } if (onStartCollection == null) { throw new ArgumentNullException(nameof(onStartCollection)); } if (onStopCollection == null) { throw new ArgumentNullException(nameof(onStopCollection)); } if (onSubmitSamples == null) { throw new ArgumentNullException(nameof(onSubmitSamples)); } if (onReturnFailedSamples == null) { throw new ArgumentNullException(nameof(onReturnFailedSamples)); } if (onUpdatedConfiguration == null) { throw new ArgumentNullException(nameof(onUpdatedConfiguration)); } this.serviceClient = serviceClient; this.timeProvider = timeProvider; this.timings = timings; this.onStartCollection = onStartCollection; this.onStopCollection = onStopCollection; this.onSubmitSamples = onSubmitSamples; this.onReturnFailedSamples = onReturnFailedSamples; this.onUpdatedConfiguration = onUpdatedConfiguration; this.coolDownTimeout = TimeSpan.FromMilliseconds(timings.CollectionInterval.TotalMilliseconds / 20); }
private static QuickPulseCollectionStateManager CreateManager( IQuickPulseServiceClient serviceClient, Clock timeProvider, List<string> actions, List<QuickPulseDataSample> returnedSamples = null, QuickPulseTimings timings = null) { var manager = new QuickPulseCollectionStateManager( serviceClient, timeProvider, timings ?? QuickPulseTimings.Default, () => actions.Add(StartCollectionMessage), () => actions.Add(StopCollectionMessage), () => { actions.Add(CollectMessage); var now = DateTimeOffset.UtcNow; return new[] { new QuickPulseDataSample( new QuickPulseDataAccumulator { AIRequestSuccessCount = 5, StartTimestamp = now, EndTimestamp = now.AddSeconds(1) }, new Dictionary<string, Tuple<PerformanceCounterData, double>>()) }.ToList(); }, samples => { if (returnedSamples != null) { returnedSamples.AddRange(samples); } }); return manager; }
private void InitializeServiceClient(TelemetryConfiguration configuration) { if (this.serviceClient != null) { // service client has been passed through a constructor, we don't need to do anything return; } Uri serviceEndpointUri; if (string.IsNullOrWhiteSpace(this.QuickPulseServiceEndpoint)) { // endpoint is not specified in configuration, use the default one serviceEndpointUri = QuickPulseDefaults.ServiceEndpoint; } else { // endpoint appears to have been specified in configuration, try using it try { serviceEndpointUri = new Uri(this.QuickPulseServiceEndpoint); } catch (Exception e) { throw new ArgumentException( string.Format( CultureInfo.InvariantCulture, "Error initializing QuickPulse module. QPS endpoint is not a correct URI: '{0}'", this.QuickPulseServiceEndpoint), e); } } // create the default production implementation of the service client with the best service endpoint we could get string instanceName = GetInstanceName(configuration); string streamId = GetStreamId(); string machineName = Environment.MachineName; var assemblyVersion = SdkVersionUtils.GetSdkVersion(null); bool isWebApp = PerformanceCounterUtility.IsWebAppRunningInAzure(); this.serviceClient = new QuickPulseServiceClient( serviceEndpointUri, instanceName, streamId, machineName, assemblyVersion, this.timeProvider, isWebApp); QuickPulseEventSource.Log.TroubleshootingMessageEvent( string.Format( CultureInfo.InvariantCulture, "Service client initialized. Endpoint: '{0}', instance name: '{1}', assembly version: '{2}'", serviceEndpointUri, instanceName, assemblyVersion)); }