Пример #1
0
        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));
        }
Пример #2
0
        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);
        }
Пример #3
0
        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;
 }
 /// <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);
        }
Пример #8
0
        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));
        }