/// <summary>
        /// Initializes a new instance of the <see cref="ProfilerSqlProcessing"/> class.
        /// </summary>
        internal ProfilerSqlProcessing(TelemetryConfiguration configuration, string agentVersion, ObjectInstanceBasedOperationHolder telemetryTupleHolder)
        {
            if (configuration == null)
            {
                throw new ArgumentNullException("configuration");
            }

            if (telemetryTupleHolder == null)
            {
                throw new ArgumentNullException("telemetryHolder");
            }

            this.TelemetryTable = telemetryTupleHolder;
            this.telemetryClient = new TelemetryClient(configuration);

            // Since dependencySource is no longer set, sdk version is prepended with information which can identify whether RDD was collected by profiler/framework

            // For directly using TrackDependency(), version will be simply what is set by core
            string prefix = "rdd" + RddSource.Profiler + ":";
            this.telemetryClient.Context.GetInternalContext().SdkVersion = SdkVersionUtils.GetSdkVersion(prefix);
            if (!string.IsNullOrEmpty(agentVersion))
            {
                this.telemetryClient.Context.GetInternalContext().AgentVersion = agentVersion;
            }
        }
コード例 #2
0
ファイル: Telemetry.cs プロジェクト: XewTurquish/vsminecraft
        public static TelemetryClient Get()
        {
            lock (_instanceLock)
            {
                if (_activeConfig == null)
                {
                    TelemetryConfiguration config = TelemetryConfiguration.Active;
                    config.InstrumentationKey = "1b3b7cd2-f058-4eb3-b153-a4425e95e20e";
#if DEBUG
                config.TelemetryChannel.DeveloperMode = true;
#endif
                    config.ContextInitializers.Add(new ComponentContextInitializer());
                    config.ContextInitializers.Add(new DeviceContextInitializer());
                    config.ContextInitializers.Add(new UserSessionInitializer());

                    _activeConfig = config;
                }

                if (_instance == null)
                {

                    var ret = new TelemetryClient(_activeConfig);
                    PopulateContext(ret);
                    _instance = ret;
                }

                return _instance;
            }
        }
コード例 #3
0
        public void IsEnabledReturnsTrueIfTelemetryTrackingIsEnabledInConfiguration()
        {
            var configuration = new TelemetryConfiguration { DisableTelemetry = false };
            var client = new TelemetryClient(configuration);

            Assert.True(client.IsEnabled());
        }
コード例 #4
0
        public void simpleTelemetry()
        {
            Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration configuration = Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration.CreateDefault();
            var telemetryClient = new TelemetryClient(configuration);

            telemetryClient.TrackTrace("CashIn - Error");
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="ProfilerHttpProcessing"/> class.
        /// </summary>
        public ProfilerHttpProcessing(TelemetryConfiguration configuration, string agentVersion, ObjectInstanceBasedOperationHolder telemetryTupleHolder, bool setCorrelationHeaders, ICollection<string> correlationDomainExclusionList)
        {
            if (configuration == null)
            {
                throw new ArgumentNullException("configuration");
            }

            if (telemetryTupleHolder == null)
            {
                throw new ArgumentNullException("telemetryTupleHolder");
            }

            if (correlationDomainExclusionList == null)
            {
                throw new ArgumentNullException("correlationDomainExclusionList");
            }

            this.applicationInsightsUrlFilter = new ApplicationInsightsUrlFilter(configuration);
            this.TelemetryTable = telemetryTupleHolder;
            this.telemetryClient = new TelemetryClient(configuration);
            this.correlationDomainExclusionList = correlationDomainExclusionList;
            this.setCorrelationHeaders = setCorrelationHeaders;

            // Since dependencySource is no longer set, sdk version is prepended with information which can identify whether RDD was collected by profiler/framework
            // For directly using TrackDependency(), version will be simply what is set by core
            string prefix = "rdd" + RddSource.Profiler + ":";
            this.telemetryClient.Context.GetInternalContext().SdkVersion = SdkVersionUtils.GetSdkVersion(prefix);
            if (!string.IsNullOrEmpty(agentVersion))
            {
                this.telemetryClient.Context.GetInternalContext().AgentVersion = agentVersion;
            }
        }
 public static void SnippetWillIncludeInstrumentationKeyAsSubstring()
 {
     string unittestkey = "unittestkey";
     var telemetryConfiguration = new TelemetryConfiguration { InstrumentationKey = unittestkey };
     var snippet = new JavaScriptSnippet(telemetryConfiguration);
     Assert.Contains("'" + unittestkey + "'", snippet.FullScript.ToString());
 }
        public void TestHttpRequestsWithQueryStringAreCollected()
        {
            ITelemetry sentTelemetry = null;
            var channel = new StubTelemetryChannel { OnSend = telemetry => sentTelemetry = telemetry };
            var config = new TelemetryConfiguration
            {
                InstrumentationKey = IKey,
                TelemetryChannel = channel
            };

            using (var module = new DependencyTrackingTelemetryModule())
            {
                module.Initialize(config);
                const string Url = "http://www.bing.com/search?q=1";
                new HttpWebRequestUtils().ExecuteAsyncHttpRequest(Url, HttpMethod.Get);

                while (sentTelemetry == null)
                {
                    Thread.Sleep(100);
                }

                Assert.IsNotNull(sentTelemetry, "Get requests are not monitored with RDD Event Source.");
                var item = (DependencyTelemetry)sentTelemetry;
                Assert.AreEqual(Url, item.Name, "Reported Url must be " + Url);
                Assert.IsTrue(item.Duration > TimeSpan.FromMilliseconds(0), "Duration has to be positive");
                Assert.AreEqual("Http", item.DependencyKind, "HttpAny has to be dependency kind as it includes http and azure calls");
                Assert.IsTrue(
                    DateTime.UtcNow.Subtract(item.Timestamp.UtcDateTime).TotalMilliseconds < TimeSpan.FromMinutes(1).TotalMilliseconds, "timestamp < now");
                Assert.IsTrue(
                    item.Timestamp.Subtract(DateTime.UtcNow).TotalMilliseconds > -TimeSpan.FromMinutes(1).TotalMilliseconds, "now - 1 min < timestamp");
            }
        }
 private TelemetryConfiguration CreateStubTelemetryConfiguration()
 {
     TelemetryConfiguration configuration = new TelemetryConfiguration();
     configuration.TelemetryChannel = new StubTelemetryChannel { EndpointAddress = "https://endpointaddress" };
     configuration.InstrumentationKey = Guid.NewGuid().ToString();
     return configuration;
 }
コード例 #9
0
 public RequestTrackingMiddleware(OwinMiddleware next, TelemetryConfiguration telemetryConfiguration) 
     : base(next)
 {
     _telemetryClient = telemetryConfiguration == null 
         ? new TelemetryClient()
         : new TelemetryClient(telemetryConfiguration);
 }
        /// <summary>
        /// Initialize method is called after all configuration properties have been loaded from the configuration.
        /// </summary>
        public void Initialize(TelemetryConfiguration configuration)
        {
            // Temporary fix to make sure that we initialize module once.
            // It should be removed when configuration reading logic is moved to Web SDK.
            if (!this.isInitialized)
            {
                lock (this.lockObject)
                {
                    if (!this.isInitialized)
                    {
                        try
                        {                            
                            this.telemetryConfiguration = configuration;

                            // Net40 only supports runtime instrumentation
                            // Net45 supports either but not both to avoid duplication
                            this.InitializeForRuntimeInstrumentationOrFramework();
                        }
                        catch (Exception exc)
                        {
                            DependencyCollectorEventSource.Log.RemoteDependencyModuleError(exc.ToInvariantString(), Environment.Version.ToString());
                        }

                        this.isInitialized = true;
                    }
                }
            }
        }
        public void InitializingEmptyConfigurationAddsCoreSdkDefaultComponents()
        {
            var configuration = new TelemetryConfiguration();
            TelemetryConfigurationFactory.Instance.Initialize(configuration);

            Assert.AreEqual(2, configuration.TelemetryInitializers.Count);
            Assert.IsInstanceOfType(configuration.TelemetryChannel, typeof(InMemoryChannel));
        }
コード例 #12
0
        public WcfInterceptor(TelemetryConfiguration configuration, ContractFilter filter)
        {
            if ( configuration == null )
                throw new ArgumentNullException("configuration");

            this.configuration = configuration;
            this.contractFilter = filter;
        }
 /// <summary>
 /// Gives the opportunity for this telemetry module to initialize configuration object that is passed to it.
 /// </summary>
 /// <param name="configuration">Configuration object.</param>
 public void Initialize(TelemetryConfiguration configuration)
 {
     if (!configuration.TelemetryChannel.DeveloperMode.HasValue && IsDebuggerAttached())
     {
         // Note that when debugger is not attached we are preserving default null value
         configuration.TelemetryChannel.DeveloperMode = true;
     }
 }
 public void TestInitialize()
 {
     this.configuration = new TelemetryConfiguration();
     this.sendItems = new List<ITelemetry>(); 
     this.configuration.TelemetryChannel = new StubTelemetryChannel { OnSend = item => this.sendItems.Add(item) };
     this.configuration.InstrumentationKey = Guid.NewGuid().ToString();
     this.httpProcessingFramework = new FrameworkHttpProcessing(this.configuration, new CacheBasedOperationHolder());
 }
 public void TestInitialize()
 {
     this.configuration = new TelemetryConfiguration();
     this.sendItems = new List<ITelemetry>();
     this.configuration.TelemetryChannel = new StubTelemetryChannel { OnSend = item => this.sendItems.Add(item) };
     this.configuration.InstrumentationKey = Guid.NewGuid().ToString();
     this.httpProcessingProfiler = new ProfilerHttpProcessing(this.configuration, null, new ObjectInstanceBasedOperationHolder());
     this.ex = new Exception();
 }
コード例 #16
0
 public void AddConfiguration(string deploymentId, string hostName, string clientId, IPAddress address)
 {
     //throw new NotImplementedException();
     TelemetryConfiguration.Active.ContextInitializers.Add(new AppInInitializer(DeploymentId));
     var tc = new TelemetryConfiguration();
     Telemetry = new TelemetryClient();
     Telemetry.InstrumentationKey = InstrumentationKey;
     Initialized = true;
 }
 public void TestInitialize()
 {
     var configuration = new TelemetryConfiguration();
     this.sendItems = new List<ITelemetry>();
     configuration.TelemetryChannel = new StubTelemetryChannel { OnSend = item => this.sendItems.Add(item) };
     configuration.InstrumentationKey = Guid.NewGuid().ToString();
     this.telemetryClient = new TelemetryClient(configuration);
     AsyncLocalHelpers.SaveOperationContext(null);
 }
 public void TestInitialize()
 {
     var configuration = new TelemetryConfiguration();
     this.sendItems = new List<ITelemetry>();
     configuration.TelemetryChannel = new StubTelemetryChannel { OnSend = item => this.sendItems.Add(item) };
     configuration.InstrumentationKey = Guid.NewGuid().ToString();
     this.telemetryClient = new TelemetryClient(configuration);
     CallContext.FreeNamedDataSlot(CallContextHelpers.OperationContextSlotName);
 }
        private static void CopyConfiguration(TelemetryConfiguration source, TelemetryConfiguration target)
        {
            target.InstrumentationKey = source.InstrumentationKey;

            foreach (var telemetryInitializer in source.TelemetryInitializers)
            {
                target.TelemetryInitializers.Add(telemetryInitializer);
            }
        }
 public void TestInitialize()
 {
     var configuration = new TelemetryConfiguration();
     this.sendItems = new List<ITelemetry>();
     configuration.TelemetryChannel = new StubTelemetryChannel { OnSend = item => this.sendItems.Add(item) };
     configuration.InstrumentationKey = Guid.NewGuid().ToString();
     configuration.TelemetryInitializers.Add(new OperationCorrelationTelemetryInitializer());
     this.telemetryClient = new TelemetryClient(configuration);
 }
コード例 #21
0
        /// <summary>
        /// Initializes a new instance of the <see cref="TelemetryClient" /> class. Send telemetry with the specified <paramref name="configuration"/>.
        /// </summary>
        /// <exception cref="ArgumentNullException">The <paramref name="configuration"/> is null.</exception>
        public TelemetryClient(TelemetryConfiguration configuration)
        {
            if (configuration == null)
            {
                CoreEventSource.Log.TelemetryClientConstructorWithNoTelemetryConfiguration();
                configuration = TelemetryConfiguration.Active;
            }

            this.configuration = configuration;
        }
 public void TestInit()
 {
     this.sendItems = new List<ITelemetry>();
     var stubTelemetryChannel = new StubTelemetryChannel { OnSend = item => this.sendItems.Add(item) };
     this.configuration = new TelemetryConfiguration
     {
         InstrumentationKey = Guid.NewGuid().ToString(),
         TelemetryChannel = stubTelemetryChannel
     };
 }
コード例 #23
0
        public static TelemetryClient MockTelemetryClient(Action<ITelemetry> onSendCallback)
        {
            var telemetryChannel = new FakeTelemetryChannel { OnSend = onSendCallback };

            var telemetryConfiguration = new TelemetryConfiguration();
            telemetryConfiguration.InstrumentationKey = "REQUIRED";
            telemetryConfiguration.TelemetryChannel = telemetryChannel;

            return new TelemetryClient(telemetryConfiguration);
        }
コード例 #24
0
        public void ChannelIsLazilyInitializedFromConfiguration()
        {
            var configuration = new TelemetryConfiguration();
            TelemetryClient client = new TelemetryClient(configuration);

            configuration.TelemetryChannel = new StubTelemetryChannel();
            ITelemetryChannel clientChannel = client.Channel;

            Assert.Same(configuration.TelemetryChannel, clientChannel);
        }
        public void InitializingTelemetryConfigurationWithoutAnIkey()
        {
            string profile = Configuration("<InstrumentationKey>    </InstrumentationKey>");
            PlatformSingleton.Current = new StubPlatform { OnReadConfigurationXml = () => { return profile; } };

            var configuration = new TelemetryConfiguration();
            TelemetryConfigurationFactory.Instance.Initialize(configuration);

            Assert.IsTrue(string.IsNullOrEmpty(configuration.InstrumentationKey));
        }
コード例 #26
0
        public void ContextIsLazilyInitializedFromConfigurationToDefferCosts()
        {
            var configuration = new TelemetryConfiguration();
            TelemetryClient client = new TelemetryClient(configuration);

            configuration.ContextInitializers.Add(new StubContextInitializer { OnInitialize = context => context.User.Id = "Test User Id" });
            TelemetryContext clientContext = client.Context;

            Assert.Equal("Test User Id", clientContext.User.Id);
        }
        public static IAppBuilder UseApplicationInsights(this IAppBuilder builder,
            OperationIdContextMiddlewareConfiguration middlewareConfiguration = null,
            TelemetryConfiguration telemetryConfiguration = null,
            Func<IOwinRequest, IOwinResponse, bool> shouldTraceRequest = null)
        {
            builder.Use<OperationIdContextMiddleware>(middlewareConfiguration);
            builder.Use<HttpRequestTrackingMiddleware>(telemetryConfiguration, shouldTraceRequest);

            return builder;
        }
コード例 #28
0
 public void AddConfiguration(string deploymentId, bool isSilo, string siloName, SiloAddress address, IPEndPoint gateway, string hostName)
 {
     SiloName = siloName;
     DeploymentId = deploymentId;
     HostName = hostName;
     TelemetryConfiguration.Active.ContextInitializers.Add(new AppInInitializer(DeploymentId));
     var tc = new TelemetryConfiguration();
     Telemetry = new TelemetryClient();
     Telemetry.InstrumentationKey = InstrumentationKey;
     Initialized = true;
 }
        /// <summary>
        /// Adds a sink that writes log events against Microsoft Application Insights using the provided <paramref name="configuration"/>.
        /// </summary>
        /// <param name="loggerConfiguration">The logger configuration.</param>
        /// <param name="configuration">Required Application Insights configuration settings.</param>
        /// <param name="restrictedToMinimumLevel">The minimum log event level required in order to write an event to the sink.</param>
        /// <param name="formatProvider">Supplies culture-specific formatting information, or null.</param>
        /// <returns>
        /// Logger configuration, allowing configuration to continue.
        /// </returns>
        /// <exception cref="System.ArgumentNullException">
        /// loggerConfiguration
        /// or
        /// configuration
        /// </exception>
        public static LoggerConfiguration ApplicationInsights(
            this LoggerSinkConfiguration loggerConfiguration,
            TelemetryConfiguration configuration,
            LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum,
            IFormatProvider formatProvider = null)
        {
            if (loggerConfiguration == null) throw new ArgumentNullException("loggerConfiguration");
            if (configuration == null) throw new ArgumentNullException("configuration");

            return loggerConfiguration.Sink(new ApplicationInsightsSink(CreateTelemetryClientFromConfiguration(configuration), formatProvider), restrictedToMinimumLevel);
        }
        public void InitializingTelemetryConfigurationWithAnIkey()
        {
            string expected = Guid.NewGuid().ToString();
            string profile = Configuration("<InstrumentationKey>" + expected + "</InstrumentationKey>");
            PlatformSingleton.Current = new StubPlatform { OnReadConfigurationXml = () => { return profile; } };

            var configuration = new TelemetryConfiguration();
            TelemetryConfigurationFactory.Instance.Initialize(configuration);

            Assert.AreEqual(expected.ToString(), configuration.InstrumentationKey);
        }
コード例 #31
0
        /// <summary>
        /// Initializes a new instance of the <see cref="TelemetryClient" /> class. Send telemetry with the specified <paramref name="configuration"/>.
        /// </summary>
        /// <exception cref="ArgumentNullException">The <paramref name="configuration"/> is null.</exception>
        public TelemetryClient(TelemetryConfiguration configuration)
        {
            if (configuration == null)
            {
                CoreEventSource.Log.TelemetryClientConstructorWithNoTelemetryConfiguration();
                configuration = TelemetryConfiguration.Active;
            }

            this.configuration = configuration;
            this.debugOutput = PlatformSingleton.Current.GetDebugOutput();
        }
コード例 #32
0
        public void advancedTelemetry()
        {
            Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration configuration = Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration.CreateDefault();
            var telemetryClient = new TelemetryClient(configuration);

            telemetryClient.TrackTrace("Login - Critical issue",
                                       Microsoft.ApplicationInsights.DataContracts.SeverityLevel.Critical,
                                       new Dictionary <string, string> {
                { "username", "0610691306" },
                { "tier", "TR23435023403408" },
                { "channel", "M" }
            });
        }
コード例 #33
0
        public void TelemetryProcessorsCollectionIsReadOnly()
        {
            var configuration = new TelemetryConfiguration();

            Assert.IsType <ReadOnlyCollection <ITelemetryProcessor> >(configuration.TelemetryProcessors);
        }
コード例 #34
0
 /// <summary>
 /// Returns the TelemetryProcessorChainBuilder which can build and populate TelemetryProcessors in the given config.
 /// </summary>
 /// <param name="configuration">Telemetry configuration for which the telemetry processor chain is to be setup.</param>
 /// <returns>The constructed TelemetryProcessorChainBuilder.</returns>
 public static TelemetryProcessorChainBuilder GetTelemetryProcessorChainBuilder(this TelemetryConfiguration configuration)
 {
     return(new TelemetryProcessorChainBuilder(configuration));
 }
コード例 #35
0
        public void MetricPrcessorsReturnsThreadSafeList()
        {
            var configuration = new TelemetryConfiguration();

            Assert.Equal(typeof(SnapshottingList <IMetricProcessor>), configuration.MetricProcessors.GetType());
        }
コード例 #36
0
        public void Request_TelemetryRespectsDimLimitCloudRoleInstance()
        {
            List <ITelemetry> telemetrySentToChannel = new List <ITelemetry>();
            Func <ITelemetryProcessor, AutocollectedMetricsExtractor> extractorFactory =
                (nextProc) => {
                var metricExtractor = new AutocollectedMetricsExtractor(nextProc);
                metricExtractor.MaxRequestCloudRoleInstanceValuesToDiscover = 2;
                return(metricExtractor);
            };

            TelemetryConfiguration telemetryConfig = CreateTelemetryConfigWithExtractor(telemetrySentToChannel, extractorFactory);

            using (telemetryConfig)
            {
                TelemetryClient client = new TelemetryClient(telemetryConfig);
                // Track 4 requests with 3 different values for RoleInstance - A B C D.
                // As MaxRequestCloudRoleInstanceValuesToDiscover = 2, the first 2 values encountered (A,B)
                // will be used as such at which the DimensionCap is hit.
                // Newly incoming values (C,D) will be rolled into "DIMENSION-CAPPED"

                client.TrackRequest(CreateRequestTelemetry(
                                        TimeSpan.FromMilliseconds(100), "200", true, false, "RoleNameA", "RoleInstanceA"));
                client.TrackRequest(CreateRequestTelemetry(
                                        TimeSpan.FromMilliseconds(100), "200", true, false, "RoleNameA", "RoleInstanceB"));
                client.TrackRequest(CreateRequestTelemetry(
                                        TimeSpan.FromMilliseconds(100), "200", true, false, "RoleNameA", "RoleInstanceC"));
                client.TrackRequest(CreateRequestTelemetry(
                                        TimeSpan.FromMilliseconds(100), "200", true, false, "RoleNameA", "RoleInstanceD"));
            }

            // 4 requests + 3 metric
            Assert.AreEqual(7, telemetrySentToChannel.Count);

            AssertEx.IsType <RequestTelemetry>(telemetrySentToChannel[0]);
            Assert.AreEqual("Req1", ((RequestTelemetry)telemetrySentToChannel[0]).Name);
            Assert.AreEqual(true, ((RequestTelemetry)telemetrySentToChannel[0]).Properties.ContainsKey("_MS.ProcessedByMetricExtractors"));
            Assert.AreEqual("(Name:'Requests', Ver:'1.1')",
                            ((RequestTelemetry)telemetrySentToChannel[0]).Properties["_MS.ProcessedByMetricExtractors"]);

            AssertEx.IsType <RequestTelemetry>(telemetrySentToChannel[1]);
            Assert.AreEqual("Req1", ((RequestTelemetry)telemetrySentToChannel[1]).Name);
            Assert.AreEqual(true, ((RequestTelemetry)telemetrySentToChannel[1]).Properties.ContainsKey("_MS.ProcessedByMetricExtractors"));
            Assert.AreEqual("(Name:'Requests', Ver:'1.1')",
                            ((RequestTelemetry)telemetrySentToChannel[1]).Properties["_MS.ProcessedByMetricExtractors"]);

            AssertEx.IsType <RequestTelemetry>(telemetrySentToChannel[2]);
            Assert.AreEqual("Req1", ((RequestTelemetry)telemetrySentToChannel[2]).Name);
            Assert.AreEqual(true, ((RequestTelemetry)telemetrySentToChannel[2]).Properties.ContainsKey("_MS.ProcessedByMetricExtractors"));
            Assert.AreEqual("(Name:'Requests', Ver:'1.1')",
                            ((RequestTelemetry)telemetrySentToChannel[2]).Properties["_MS.ProcessedByMetricExtractors"]);

            AssertEx.IsType <RequestTelemetry>(telemetrySentToChannel[3]);
            Assert.AreEqual("Req1", ((RequestTelemetry)telemetrySentToChannel[3]).Name);
            Assert.AreEqual(true, ((RequestTelemetry)telemetrySentToChannel[3]).Properties.ContainsKey("_MS.ProcessedByMetricExtractors"));
            Assert.AreEqual("(Name:'Requests', Ver:'1.1')",
                            ((RequestTelemetry)telemetrySentToChannel[3]).Properties["_MS.ProcessedByMetricExtractors"]);

            for (int i = 4; i < 7; i++)
            {
                AssertEx.IsType <MetricTelemetry>(telemetrySentToChannel[i]);
                var metricTel = telemetrySentToChannel[i] as MetricTelemetry;
                // validate standard fields
                Assert.IsTrue(metricTel.Properties.ContainsKey("_MS.AggregationIntervalMs"));
                Assert.IsTrue(metricTel.Context.GlobalProperties.ContainsKey("_MS.IsAutocollected"));
                Assert.AreEqual("True", metricTel.Context.GlobalProperties["_MS.IsAutocollected"]);
                Assert.IsTrue(metricTel.Context.GlobalProperties.ContainsKey("_MS.MetricId"));
                Assert.AreEqual("requests/duration", metricTel.Context.GlobalProperties["_MS.MetricId"]);

                // validate dimensions exist
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("Request.Success"));
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("cloud/roleInstance"));
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("cloud/roleName"));
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("request/resultCode"));
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("request/performanceBucket"));
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("operation/synthetic"));
            }

            // We expect RoleInstanceA to be tracked correctly
            var cloudRoleInstanceA = telemetrySentToChannel.Where(
                (tel) => "Server response time".Equals((tel as MetricTelemetry)?.Name) &&
                (tel as MetricTelemetry).Properties.Contains(new KeyValuePair <string, string>("cloud/roleInstance", "RoleInstanceA")));

            Assert.IsTrue(cloudRoleInstanceA.Count() == 1);

            // We expect RoleInstanceB to be tracked correctly
            var cloudRoleInstanceB = telemetrySentToChannel.Where(
                (tel) => "Server response time".Equals((tel as MetricTelemetry)?.Name) &&
                (tel as MetricTelemetry).Properties.Contains(new KeyValuePair <string, string>("cloud/roleInstance", "RoleInstanceB")));

            Assert.IsTrue(cloudRoleInstanceB.Count() == 1);

            // We expect RoleInstanceC to be not present as a dimension, as dimension cap of 2 is already hit.
            var cloudRoleInstanceC = telemetrySentToChannel.Where(
                (tel) => "Server response time".Equals((tel as MetricTelemetry)?.Name) &&
                (tel as MetricTelemetry).Properties.Contains(new KeyValuePair <string, string>("cloud/roleInstance", "RoleInstanceC")));

            Assert.IsTrue(cloudRoleInstanceC.Count() == 0);

            // We expect RoleInstanceD to be not present as a dimension, as dimension cap of 2 is already hit.
            var cloudRoleInstanceD = telemetrySentToChannel.Where(
                (tel) => "Server response time".Equals((tel as MetricTelemetry)?.Name) &&
                (tel as MetricTelemetry).Properties.Contains(new KeyValuePair <string, string>("cloud/roleInstance", "RoleInstanceD")));

            Assert.IsTrue(cloudRoleInstanceD.Count() == 0);

            // We expect a DIMENSION-CAPPED series, which represents RoleInstanceC and RoleInstanceD
            var dimCappedSeries = telemetrySentToChannel.Where(
                (tel) => "Server response time".Equals((tel as MetricTelemetry)?.Name) &&
                (tel as MetricTelemetry).Properties.Contains(new KeyValuePair <string, string>("cloud/roleInstance", "DIMENSION-CAPPED")));

            Assert.IsTrue(dimCappedSeries.Count() == 1);
        }
コード例 #37
0
        public void Request_CorrectlyExtractsMetric()
        {
            List <ITelemetry> telemetrySentToChannel = new List <ITelemetry>();
            Func <ITelemetryProcessor, AutocollectedMetricsExtractor> extractorFactory = (nextProc) => new AutocollectedMetricsExtractor(nextProc);

            // default set of dimensions with test values.
            bool[]   success            = new bool[] { true, false };
            bool[]   synthetic          = new bool[] { true, false };
            string[] responseCode       = new string[] { "200", "500", "401" };
            string[] cloudRoleNames     = new string[] { "RoleA", "RoleB" };
            string[] cloudRoleInstances = new string[] { "RoleInstanceA", "RoleInstanceB" };

            TelemetryConfiguration telemetryConfig = CreateTelemetryConfigWithExtractor(telemetrySentToChannel, extractorFactory);

            using (telemetryConfig)
            {
                TelemetryClient         client   = new TelemetryClient(telemetryConfig);
                List <RequestTelemetry> requests = new List <RequestTelemetry>();

                // Produces telemetry with every combination of dimension values.
                for (int i = 0; i < success.Length; i++)
                {
                    for (int j = 0; j < responseCode.Length; j++)
                    {
                        for (int k = 0; k < cloudRoleNames.Length; k++)
                        {
                            for (int l = 0; l < cloudRoleInstances.Length; l++)
                            {
                                for (int m = 0; m < synthetic.Length; m++)
                                {
                                    // For ease of validation 4 calls are tracked.
                                    // with 100, 100. 600. 600.
                                    // This will fall into 2 buckets <250msec, and 500ms-1sec
                                    requests.Add(CreateRequestTelemetry(
                                                     TimeSpan.FromMilliseconds(100), responseCode[j], success[i], synthetic[m], cloudRoleNames[k], cloudRoleInstances[l]));
                                    requests.Add(CreateRequestTelemetry(
                                                     TimeSpan.FromMilliseconds(100), responseCode[j], success[i], synthetic[m], cloudRoleNames[k], cloudRoleInstances[l]));
                                    requests.Add(CreateRequestTelemetry(
                                                     TimeSpan.FromMilliseconds(600), responseCode[j], success[i], synthetic[m], cloudRoleNames[k], cloudRoleInstances[l]));
                                    requests.Add(CreateRequestTelemetry(
                                                     TimeSpan.FromMilliseconds(600), responseCode[j], success[i], synthetic[m], cloudRoleNames[k], cloudRoleInstances[l]));
                                }
                            }
                        }
                    }
                }

                foreach (var req in requests)
                {
                    client.TrackRequest(req);
                }

                // The # of iteration is 48 = 2 * 2 * 3 * 2 * 2
                //  success * synthetic * responseCode * RoleName * RoleInstance
                // 4 Track calls are made in every iteration,
                // hence 48 * 4 requests gives 192 total requests
                Assert.AreEqual(192, telemetrySentToChannel.Count);

                // The total # of timeseries is 96
                // 2 * 2 * 3 * 2 * 2 * 2 = 96
                // success * synthetic * responseCode * RoleName * RoleInstance * DurationBucket
                // Duration bucket is auto calculated, hence not included in iteration count.

                // The above did not include Metrics as they are sent upon dispose only.
            } // dispose occurs here, and hence metrics get flushed out.

            // 2 * 2 * 3 * 2 * 2 * 2 = 96
            // success * synthetic * responseCode * RoleName * RoleInstance * DurationBucket
            int totalTimeSeries = 96;

            // 288 = 192 requests + 96 metrics as there are 96 unique combination of dimension
            Assert.AreEqual(288, telemetrySentToChannel.Count);

            // These are pre-agg metric
            var serverResponseMetric = telemetrySentToChannel.Where(
                (tel) => "Server response time".Equals((tel as MetricTelemetry)?.Name));

            Assert.AreEqual(totalTimeSeries, serverResponseMetric.Count());

            foreach (var metric in serverResponseMetric)
            {
                var metricTel = metric as MetricTelemetry;
                // validate standard fields
                Assert.IsTrue(metricTel.Properties.ContainsKey("_MS.AggregationIntervalMs"));
                Assert.IsTrue(metricTel.Context.GlobalProperties.ContainsKey("_MS.IsAutocollected"));
                Assert.AreEqual("True", metricTel.Context.GlobalProperties["_MS.IsAutocollected"]);
                Assert.IsTrue(metricTel.Context.GlobalProperties.ContainsKey("_MS.MetricId"));
                Assert.AreEqual("requests/duration", metricTel.Context.GlobalProperties["_MS.MetricId"]);

                // validate dimensions exist
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("Request.Success"));
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("cloud/roleInstance"));
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("cloud/roleName"));
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("request/resultCode"));
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("request/performanceBucket"));
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("operation/synthetic"));
            }

            // Validate success dimension
            for (int i = 0; i < success.Length; i++)
            {
                var metricCollection = serverResponseMetric.Where(
                    (tel) => (tel as MetricTelemetry).Properties["Request.Success"] == success[i].ToString());
                int expectedCount = totalTimeSeries / success.Length;
                Assert.AreEqual(expectedCount, metricCollection.Count());
                ValidateAllMetric(metricCollection);
            }

            // Validate synthetic dimension
            for (int i = 0; i < synthetic.Length; i++)
            {
                var metricCollection = serverResponseMetric.Where(
                    (tel) => (tel as MetricTelemetry).Properties["operation/synthetic"] == synthetic[i].ToString());
                int expectedCount = totalTimeSeries / synthetic.Length;
                Assert.AreEqual(expectedCount, metricCollection.Count());
                ValidateAllMetric(metricCollection);
            }

            // Validate RoleName dimesion
            for (int i = 0; i < cloudRoleNames.Length; i++)
            {
                var metricCollection = serverResponseMetric.Where(
                    (tel) => (tel as MetricTelemetry).Properties["cloud/roleName"] == cloudRoleNames[i]);
                int expectedCount = totalTimeSeries / cloudRoleNames.Length;
                Assert.AreEqual(expectedCount, metricCollection.Count());
                ValidateAllMetric(metricCollection);
            }

            // Validate RoleInstance dimension
            for (int i = 0; i < cloudRoleInstances.Length; i++)
            {
                var metricCollection = serverResponseMetric.Where(
                    (tel) => (tel as MetricTelemetry).Properties["cloud/roleInstance"] == cloudRoleInstances[i]);
                int expectedCount = totalTimeSeries / cloudRoleInstances.Length;
                Assert.AreEqual(expectedCount, metricCollection.Count());
                ValidateAllMetric(metricCollection);
            }

            // Validate ResponseCode dimension
            for (int i = 0; i < responseCode.Length; i++)
            {
                var metricCollection = serverResponseMetric.Where(
                    (tel) => (tel as MetricTelemetry).Properties["request/resultCode"] == responseCode[i]);
                int expectedCount = totalTimeSeries / responseCode.Length;
                Assert.AreEqual(expectedCount, metricCollection.Count());
                ValidateAllMetric(metricCollection);
            }

            // Validate Duration Bucket dimension
            {
                var metricCollectionBelow250 = serverResponseMetric.Where(
                    (tel) => (tel as MetricTelemetry).Properties["request/performanceBucket"] == "<250ms");

                var metricCollection500mSecTo1Sec = serverResponseMetric.Where(
                    (tel) => (tel as MetricTelemetry).Properties["request/performanceBucket"] == "500ms-1sec");


                int expectedCount = totalTimeSeries / 2;
                Assert.AreEqual(expectedCount, metricCollectionBelow250.Count());
                ValidateAllMetric(metricCollectionBelow250);

                Assert.AreEqual(expectedCount, metricCollection500mSecTo1Sec.Count());
                ValidateAllMetric(metricCollection500mSecTo1Sec);
            }
        }
コード例 #38
0
        public void InstrumentationKeyThrowsArgumentNullExceptionWhenNewValueIsNullToAvoidNullReferenceExceptionWhenAccessingPropertyValue()
        {
            var configuration = new TelemetryConfiguration();

            Xunit.Assert.Throws <ArgumentNullException>(() => configuration.InstrumentationKey = null);
        }
コード例 #39
0
        public void EnsureAllTelemetrySinkItemsAreSimilarAcrossSinks()
        {
            var configuration      = new TelemetryConfiguration();
            var commonChainBuilder = new TelemetryProcessorChainBuilder(configuration);

            configuration.TelemetryProcessorChainBuilder = commonChainBuilder;

            string jsonFromFirstChannel  = null;
            string jsonFromSecondChannel = null;

            ITelemetryChannel firstTelemetryChannel = new StubTelemetryChannel
            {
                OnSend = telemetry =>
                {
                    jsonFromFirstChannel = JsonConvert.SerializeObject(telemetry);
                }
            };

            ITelemetryChannel secondTelemetryChannel = new StubTelemetryChannel
            {
                OnSend = telemetry =>
                {
                    jsonFromSecondChannel = JsonConvert.SerializeObject(telemetry);
                }
            };

            configuration.DefaultTelemetrySink.TelemetryChannel = firstTelemetryChannel;
            configuration.TelemetrySinks.Add(new TelemetrySink(configuration, secondTelemetryChannel));

            configuration.TelemetryProcessorChainBuilder.Build();

            TelemetryClient telemetryClient = new TelemetryClient(configuration);

            // Setup TelemetryContext in a way that it is filledup.
            telemetryClient.Context.Operation.Id       = "OpId";
            telemetryClient.Context.Cloud.RoleName     = "UnitTest";
            telemetryClient.Context.Component.Version  = "TestVersion";
            telemetryClient.Context.Device.Id          = "TestDeviceId";
            telemetryClient.Context.Flags              = 1234;
            telemetryClient.Context.InstrumentationKey = Guid.Empty.ToString();
            telemetryClient.Context.Location.Ip        = "127.0.0.1";
            telemetryClient.Context.Session.Id         = "SessionId";
            telemetryClient.Context.User.Id            = "userId";

            telemetryClient.TrackAvailability(
                "Availability",
                DateTimeOffset.Now,
                TimeSpan.FromMilliseconds(200),
                "Local",
                true,
                "Message",
                new Dictionary <string, string>()
            {
                { "Key", "Value" }
            },
                new Dictionary <string, double>()
            {
                { "Dimension1", 0.9865 }
            });
            Assert.AreEqual(jsonFromFirstChannel, jsonFromSecondChannel);

            telemetryClient.TrackDependency(
                "HTTP",
                "Target",
                "Test",
                "https://azure",
                DateTimeOffset.Now,
                TimeSpan.FromMilliseconds(100),
                "200",
                true);
            Assert.AreEqual(jsonFromFirstChannel, jsonFromSecondChannel);

            telemetryClient.TrackEvent(
                "Event",
                new Dictionary <string, string>()
            {
                { "Key", "Value" }
            },
                new Dictionary <string, double>()
            {
                { "Dimension1", 0.9865 }
            });
            Assert.AreEqual(jsonFromFirstChannel, jsonFromSecondChannel);

            telemetryClient.TrackException(
                new Exception("Test"),
                new Dictionary <string, string>()
            {
                { "Key", "Value" }
            },
                new Dictionary <string, double>()
            {
                { "Dimension1", 0.9865 }
            });
            Assert.AreEqual(jsonFromFirstChannel, jsonFromSecondChannel);

            telemetryClient.TrackMetric("Metric", 0.1, new Dictionary <string, string>()
            {
                { "Key", "Value" }
            });
            Assert.AreEqual(jsonFromFirstChannel, jsonFromSecondChannel);

            telemetryClient.TrackPageView("PageView");
            Assert.AreEqual(jsonFromFirstChannel, jsonFromSecondChannel);

            telemetryClient.TrackRequest(
                new RequestTelemetry("GET https://azure.com", DateTimeOffset.Now, TimeSpan.FromMilliseconds(200), "200", true)
            {
#pragma warning disable CS0618 // Type or member is obsolete. Using for testing all cases.
                HttpMethod = "GET"
#pragma warning restore CS0618 // Type or member is obsolete. Using for testing all cases.
            });
            Assert.AreEqual(jsonFromFirstChannel, jsonFromSecondChannel);

            telemetryClient.TrackTrace(
                "Message",
                SeverityLevel.Critical,
                new Dictionary <string, string>()
            {
                { "Key", "Value" }
            });
            Assert.AreEqual(jsonFromFirstChannel, jsonFromSecondChannel);
        }
コード例 #40
0
        public void EnsureEventsAreNotDroppedByBroadcastProcessor()
        {
            var configuration      = new TelemetryConfiguration();
            var commonChainBuilder = new TelemetryProcessorChainBuilder(configuration);

            configuration.TelemetryProcessorChainBuilder = commonChainBuilder;

            ConcurrentBag <ITelemetry> itemsReceivedBySink1 = new ConcurrentBag <ITelemetry>();
            ConcurrentBag <ITelemetry> itemsReceivedBySink2 = new ConcurrentBag <ITelemetry>();

            ITelemetryChannel firstTelemetryChannel = new StubTelemetryChannel
            {
                OnSend = telemetry =>
                {
                    itemsReceivedBySink1.Add(telemetry);
                }
            };

            ITelemetryChannel secondTelemetryChannel = new StubTelemetryChannel
            {
                OnSend = telemetry =>
                {
                    itemsReceivedBySink2.Add(telemetry);
                }
            };

            configuration.DefaultTelemetrySink.TelemetryChannel = firstTelemetryChannel;
            configuration.TelemetrySinks.Add(new TelemetrySink(configuration, secondTelemetryChannel));

            configuration.TelemetryProcessorChainBuilder.Build();

            TelemetryClient telemetryClient = new TelemetryClient(configuration);

            // Setup TelemetryContext in a way that it is filledup.
            telemetryClient.Context.Operation.Id       = "OpId";
            telemetryClient.Context.Cloud.RoleName     = "UnitTest";
            telemetryClient.Context.Component.Version  = "TestVersion";
            telemetryClient.Context.Device.Id          = "TestDeviceId";
            telemetryClient.Context.Flags              = 1234;
            telemetryClient.Context.InstrumentationKey = Guid.Empty.ToString();
            telemetryClient.Context.Location.Ip        = "127.0.0.1";
            telemetryClient.Context.Session.Id         = "SessionId";
            telemetryClient.Context.User.Id            = "userId";

            Parallel.ForEach(
                new int[100],
                new ParallelOptions
            {
                MaxDegreeOfParallelism = 100
            },
                (value) =>
            {
                telemetryClient.TrackAvailability(
                    "Availability",
                    DateTimeOffset.Now,
                    TimeSpan.FromMilliseconds(200),
                    "Local",
                    true,
                    "Message",
                    new Dictionary <string, string>()
                {
                    { "Key", "Value" }
                },
                    new Dictionary <string, double>()
                {
                    { "Dimension1", 0.9865 }
                });

                telemetryClient.TrackDependency(
                    "HTTP",
                    "Target",
                    "Test",
                    "https://azure",
                    DateTimeOffset.Now,
                    TimeSpan.FromMilliseconds(100),
                    "200",
                    true);

                telemetryClient.TrackEvent(
                    "Event",
                    new Dictionary <string, string>()
                {
                    { "Key", "Value" }
                },
                    new Dictionary <string, double>()
                {
                    { "Dimension1", 0.9865 }
                });

                telemetryClient.TrackException(
                    new Exception("Test"),
                    new Dictionary <string, string>()
                {
                    { "Key", "Value" }
                },
                    new Dictionary <string, double>()
                {
                    { "Dimension1", 0.9865 }
                });

                telemetryClient.TrackMetric("Metric", 0.1, new Dictionary <string, string>()
                {
                    { "Key", "Value" }
                });

                telemetryClient.TrackPageView("PageView");

                telemetryClient.TrackRequest(
                    new RequestTelemetry("GET https://azure.com", DateTimeOffset.Now, TimeSpan.FromMilliseconds(200), "200", true)
                {
#pragma warning disable CS0618 // Type or member is obsolete. Using for testing all cases.
                    HttpMethod = "GET"
#pragma warning restore CS0618 // Type or member is obsolete. Using for testing all cases.
                });

                telemetryClient.TrackTrace(
                    "Message",
                    SeverityLevel.Critical,
                    new Dictionary <string, string>()
                {
                    { "Key", "Value" }
                });
            });

            Assert.AreEqual(itemsReceivedBySink1.Count, itemsReceivedBySink2.Count);
            Assert.AreEqual(8 * 100, itemsReceivedBySink1.Count);
            Assert.AreEqual(8 * 100, itemsReceivedBySink2.Count);
        }
コード例 #41
0
        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);

            // does not throw
            try
            {
                client.TrackTrace("t2");
            }
            catch (Exception ex)
            {
                Assert.Fail(ex.ToString());
            }
        }
コード例 #42
0
        public void TelemetryInitializersReturnsThreadSafeList()
        {
            var configuration = new TelemetryConfiguration();

            Assert.Equal(typeof(SnapshottingList <ITelemetryInitializer>), configuration.TelemetryInitializers.GetType());
        }
コード例 #43
0
        public void DisableTelemetryIsFalseByDefault()
        {
            var configuration = new TelemetryConfiguration();

            Assert.False(configuration.DisableTelemetry);
        }
コード例 #44
0
        public void TelemetryChannelIsNullByDefaultToAvoidLockEscalation()
        {
            var configuration = new TelemetryConfiguration();

            Assert.Null(configuration.TelemetryChannel);
        }
コード例 #45
0
 public override void Initialize(TelemetryConfiguration configuration, TelemetryModules modules)
 {
     this.OnInitialize(configuration, modules);
 }
コード例 #46
0
        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"));
        }
コード例 #47
0
        public void Request_TelemetryRespectsDimLimitResponseCode()
        {
            List <ITelemetry> telemetrySentToChannel = new List <ITelemetry>();
            Func <ITelemetryProcessor, AutocollectedMetricsExtractor> extractorFactory =
                (nextProc) => {
                var metricExtractor = new AutocollectedMetricsExtractor(nextProc);
                metricExtractor.MaxRequestResponseCodeValuesToDiscover = 0;
                return(metricExtractor);
            };

            TelemetryConfiguration telemetryConfig = CreateTelemetryConfigWithExtractor(telemetrySentToChannel, extractorFactory);

            using (telemetryConfig)
            {
                TelemetryClient client = new TelemetryClient(telemetryConfig);
                // Track 3 requests with 3 different values for Result code - 200,201,202.
                // As MaxRequestResponseCodeValuesToDiscover = 0, we expect all responde code to be rolled into Other
                client.TrackRequest("Test Request 1", DateTimeOffset.Now, TimeSpan.FromMilliseconds(10), "200", success: true);
                client.TrackRequest("Test Request 2", DateTimeOffset.Now, TimeSpan.FromMilliseconds(11), "201", success: true);
                client.TrackRequest("Test Request 3", DateTimeOffset.Now, TimeSpan.FromMilliseconds(11), "202", success: true);
            }

            Assert.AreEqual(4, telemetrySentToChannel.Count);

            AssertEx.IsType <RequestTelemetry>(telemetrySentToChannel[0]);
            Assert.AreEqual("Test Request 1", ((RequestTelemetry)telemetrySentToChannel[0]).Name);
            Assert.AreEqual(true, ((RequestTelemetry)telemetrySentToChannel[0]).Properties.ContainsKey("_MS.ProcessedByMetricExtractors"));
            Assert.AreEqual("(Name:'Requests', Ver:'1.1')",
                            ((RequestTelemetry)telemetrySentToChannel[0]).Properties["_MS.ProcessedByMetricExtractors"]);

            AssertEx.IsType <RequestTelemetry>(telemetrySentToChannel[1]);
            Assert.AreEqual("Test Request 2", ((RequestTelemetry)telemetrySentToChannel[1]).Name);
            Assert.AreEqual(true, ((RequestTelemetry)telemetrySentToChannel[1]).Properties.ContainsKey("_MS.ProcessedByMetricExtractors"));
            Assert.AreEqual("(Name:'Requests', Ver:'1.1')",
                            ((RequestTelemetry)telemetrySentToChannel[1]).Properties["_MS.ProcessedByMetricExtractors"]);

            AssertEx.IsType <RequestTelemetry>(telemetrySentToChannel[2]);
            Assert.AreEqual("Test Request 3", ((RequestTelemetry)telemetrySentToChannel[2]).Name);
            Assert.AreEqual(true, ((RequestTelemetry)telemetrySentToChannel[2]).Properties.ContainsKey("_MS.ProcessedByMetricExtractors"));
            Assert.AreEqual("(Name:'Requests', Ver:'1.1')",
                            ((RequestTelemetry)telemetrySentToChannel[2]).Properties["_MS.ProcessedByMetricExtractors"]);

            AssertEx.IsType <MetricTelemetry>(telemetrySentToChannel[3]);
            var metricTel = telemetrySentToChannel[3] as MetricTelemetry;

            // validate standard fields
            Assert.IsTrue(metricTel.Properties.ContainsKey("_MS.AggregationIntervalMs"));
            Assert.IsTrue(metricTel.Context.GlobalProperties.ContainsKey("_MS.IsAutocollected"));
            Assert.AreEqual("True", metricTel.Context.GlobalProperties["_MS.IsAutocollected"]);
            Assert.IsTrue(metricTel.Context.GlobalProperties.ContainsKey("_MS.MetricId"));
            Assert.AreEqual("requests/duration", metricTel.Context.GlobalProperties["_MS.MetricId"]);

            // validate dimensions exist
            Assert.AreEqual(true, metricTel.Properties.ContainsKey("Request.Success"));
            Assert.AreEqual(true, metricTel.Properties.ContainsKey("cloud/roleInstance"));
            Assert.AreEqual(true, metricTel.Properties.ContainsKey("cloud/roleName"));
            Assert.AreEqual(true, metricTel.Properties.ContainsKey("request/resultCode"));
            Assert.AreEqual(true, metricTel.Properties.ContainsKey("request/performanceBucket"));
            Assert.AreEqual(true, metricTel.Properties.ContainsKey("operation/synthetic"));

            var resultCodeDimension = metricTel.Properties["request/resultCode"];

            // As MaxRequestResponseCodeValuesToDiscover = 0, we expect all responde code to be rolled into Other
            Assert.AreEqual("Other", resultCodeDimension);
        }
コード例 #48
0
        public void Dependency_CorrectlyExtractsMetric()
        {
            List <ITelemetry> telemetrySentToChannel = new List <ITelemetry>();
            Func <ITelemetryProcessor, AutocollectedMetricsExtractor> extractorFactory = (nextProc) => new AutocollectedMetricsExtractor(nextProc);

            // default set of dimensions with test values.
            bool[]   success            = new bool[] { true, false };
            bool[]   synthetic          = new bool[] { true, false };
            string[] targets            = new string[] { "TargetA", "TargetB", "TargetC" };
            string[] types              = new string[] { "TypeA", "TypeB", "TypeC" };
            string[] cloudRoleNames     = new string[] { "RoleA", "RoleB" };
            string[] cloudRoleInstances = new string[] { "RoleInstanceA", "RoleInstanceB" };

            TelemetryConfiguration telemetryConfig = CreateTelemetryConfigWithExtractor(telemetrySentToChannel, extractorFactory);

            using (telemetryConfig)
            {
                TelemetryClient            client       = new TelemetryClient(telemetryConfig);
                List <DependencyTelemetry> dependencies = new List <DependencyTelemetry>();

                // Produces telemetry with every combination of dimension values.
                for (int i = 0; i < success.Length; i++)
                {
                    for (int j = 0; j < targets.Length; j++)
                    {
                        for (int k = 0; k < cloudRoleNames.Length; k++)
                        {
                            for (int l = 0; l < cloudRoleInstances.Length; l++)
                            {
                                for (int m = 0; m < synthetic.Length; m++)
                                {
                                    for (int n = 0; n < types.Length; n++)
                                    {
                                        // For ease of validation 4 calls are tracked.
                                        // with 100, 100. 600. 600.
                                        // This will fall into 2 buckets <250msec, and 500ms-1sec
                                        dependencies.Add(CreateDependencyTelemetry(
                                                             TimeSpan.FromMilliseconds(100), targets[j], types[n], success[i], synthetic[m], cloudRoleNames[k], cloudRoleInstances[l]));
                                        dependencies.Add(CreateDependencyTelemetry(
                                                             TimeSpan.FromMilliseconds(100), targets[j], types[n], success[i], synthetic[m], cloudRoleNames[k], cloudRoleInstances[l]));
                                        dependencies.Add(CreateDependencyTelemetry(
                                                             TimeSpan.FromMilliseconds(600), targets[j], types[n], success[i], synthetic[m], cloudRoleNames[k], cloudRoleInstances[l]));
                                        dependencies.Add(CreateDependencyTelemetry(
                                                             TimeSpan.FromMilliseconds(600), targets[j], types[n], success[i], synthetic[m], cloudRoleNames[k], cloudRoleInstances[l]));
                                    }
                                }
                            }
                        }
                    }
                }

                foreach (var dep in dependencies)
                {
                    client.TrackDependency(dep);
                }


                // 2 * 2 * 3 * 3 *  2 * 2 = 144 iteration
                // DurationBucket is not included in interation as its automatically extracted.
                // 4 Track calls are made in every iteration,
                // hence 144 * 4 dependencies gives 576 total dependencies
                Assert.AreEqual(576, telemetrySentToChannel.Count);

                // The above did not include Metrics as they are sent upon dispose only.
            } // dispose occurs here, and hence metrics get flushed out.

            // 2 * 2 * 3 * 3 *  2 * 2 * 2 = 288 timeseries
            // success * synthetic * target * type * RoleName * RoleInstance *DurationBucket
            int totalTimeSeries = 288;

            // 864 = 576 requests + 288 metrics as there are 288 unique combination of dimension
            Assert.AreEqual(864, telemetrySentToChannel.Count);

            // These are pre-agg metric
            var depDurationMetric = telemetrySentToChannel.Where(
                (tel) => "Dependency duration".Equals((tel as MetricTelemetry)?.Name));

            Assert.AreEqual(totalTimeSeries, depDurationMetric.Count());

            foreach (var metric in depDurationMetric)
            {
                var metricTel = metric as MetricTelemetry;
                // validate standard fields
                Assert.IsTrue(metricTel.Properties.ContainsKey("_MS.AggregationIntervalMs"));
                Assert.IsTrue(metricTel.Context.GlobalProperties.ContainsKey("_MS.IsAutocollected"));
                Assert.AreEqual("True", metricTel.Context.GlobalProperties["_MS.IsAutocollected"]);
                Assert.IsTrue(metricTel.Context.GlobalProperties.ContainsKey("_MS.MetricId"));
                Assert.AreEqual("dependencies/duration", metricTel.Context.GlobalProperties["_MS.MetricId"]);

                // validate dimensions exist
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("Dependency.Success"));
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("cloud/roleInstance"));
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("cloud/roleName"));
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("Dependency.Type"));
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("dependency/target"));
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("operation/synthetic"));
                Assert.AreEqual(true, metricTel.Properties.ContainsKey("dependency/performanceBucket"));
            }

            // Validate success dimension
            for (int i = 0; i < success.Length; i++)
            {
                var metricCollection = depDurationMetric.Where(
                    (tel) => (tel as MetricTelemetry).Properties["Dependency.Success"] == success[i].ToString());
                int expectedCount = totalTimeSeries / success.Length;
                Assert.AreEqual(expectedCount, metricCollection.Count());
                ValidateAllMetric(metricCollection);
            }

            // Validate synthetic dimension
            for (int i = 0; i < synthetic.Length; i++)
            {
                var metricCollection = depDurationMetric.Where(
                    (tel) => (tel as MetricTelemetry).Properties["operation/synthetic"] == synthetic[i].ToString());
                int expectedCount = totalTimeSeries / synthetic.Length;
                Assert.AreEqual(expectedCount, metricCollection.Count());
                ValidateAllMetric(metricCollection);
            }

            // Validate RoleName dimesion
            for (int i = 0; i < cloudRoleNames.Length; i++)
            {
                var metricCollection = depDurationMetric.Where(
                    (tel) => (tel as MetricTelemetry).Properties["cloud/roleName"] == cloudRoleNames[i]);
                int expectedCount = totalTimeSeries / cloudRoleNames.Length;
                Assert.AreEqual(expectedCount, metricCollection.Count());
                ValidateAllMetric(metricCollection);
            }

            // Validate RoleInstance dimension
            for (int i = 0; i < cloudRoleInstances.Length; i++)
            {
                var metricCollection = depDurationMetric.Where(
                    (tel) => (tel as MetricTelemetry).Properties["cloud/roleInstance"] == cloudRoleInstances[i]);
                int expectedCount = totalTimeSeries / cloudRoleInstances.Length;
                Assert.AreEqual(expectedCount, metricCollection.Count());
                ValidateAllMetric(metricCollection);
            }

            // Validate Dep Type dimension
            for (int i = 0; i < types.Length; i++)
            {
                var metricCollection = depDurationMetric.Where(
                    (tel) => (tel as MetricTelemetry).Properties["Dependency.Type"] == types[i]);
                int expectedCount = totalTimeSeries / types.Length;
                Assert.AreEqual(expectedCount, metricCollection.Count());
                ValidateAllMetric(metricCollection);
            }

            // Validate Dep Target dimension
            for (int i = 0; i < targets.Length; i++)
            {
                var metricCollection = depDurationMetric.Where(
                    (tel) => (tel as MetricTelemetry).Properties["dependency/target"] == targets[i]);
                int expectedCount = totalTimeSeries / types.Length;
                Assert.AreEqual(expectedCount, metricCollection.Count());
                ValidateAllMetric(metricCollection);
            }

            // Validate Duration Bucket dimension
            {
                var metricCollectionBelow250 = depDurationMetric.Where(
                    (tel) => (tel as MetricTelemetry).Properties["dependency/performanceBucket"] == "<250ms");

                var metricCollection500mSecTo1Sec = depDurationMetric.Where(
                    (tel) => (tel as MetricTelemetry).Properties["dependency/performanceBucket"] == "500ms-1sec");


                int expectedCount = totalTimeSeries / 2;
                Assert.AreEqual(expectedCount, metricCollectionBelow250.Count());
                ValidateAllMetric(metricCollectionBelow250);

                Assert.AreEqual(expectedCount, metricCollection500mSecTo1Sec.Count());
                ValidateAllMetric(metricCollection500mSecTo1Sec);
            }
        }
コード例 #49
0
        public void Request_CorrectlyWorksWithResponseSuccess()
        {
            List <ITelemetry> telemetrySentToChannel = new List <ITelemetry>();
            Func <ITelemetryProcessor, AutocollectedMetricsExtractor> extractorFactory = (nextProc) => new AutocollectedMetricsExtractor(nextProc);

            TelemetryConfiguration telemetryConfig = CreateTelemetryConfigWithExtractor(telemetrySentToChannel, extractorFactory);

            using (telemetryConfig)
            {
                TelemetryClient client = new TelemetryClient(telemetryConfig);

                client.TrackRequest(new RequestTelemetry()
                {
                    Name         = "Test Request 1",
                    Timestamp    = DateTimeOffset.Now,
                    Duration     = TimeSpan.FromMilliseconds(5),
                    ResponseCode = "xxx",
                    Success      = true
                });

                client.TrackRequest(new RequestTelemetry()
                {
                    Name         = "Test Request 2",
                    Timestamp    = DateTimeOffset.Now,
                    Duration     = TimeSpan.FromMilliseconds(10),
                    ResponseCode = "xxx",
                    Success      = false
                });

                client.TrackRequest(new RequestTelemetry()
                {
                    Name         = "Test Request 3",
                    Timestamp    = DateTimeOffset.Now,
                    Duration     = TimeSpan.FromMilliseconds(15),
                    ResponseCode = "xxx",
                    Success      = null
                });
            }

            Assert.AreEqual(5, telemetrySentToChannel.Count);

            var t = new SortedList <string, MetricTelemetry>();

            Assert.IsNotNull(telemetrySentToChannel[3]);
            AssertEx.IsType <MetricTelemetry>(telemetrySentToChannel[3]);
            var m = (MetricTelemetry)telemetrySentToChannel[3];

            t.Add(m.Properties["Request.Success"], m);

            Assert.IsNotNull(telemetrySentToChannel[4]);
            AssertEx.IsType <MetricTelemetry>(telemetrySentToChannel[4]);
            m = (MetricTelemetry)telemetrySentToChannel[4];
            t.Add(m.Properties["Request.Success"], m);

            var metricF = t.Values[0];
            var metricT = t.Values[1];

            Assert.AreEqual("Server response time", metricT.Name);
            Assert.AreEqual(2, metricT.Count);
            Assert.AreEqual(15, metricT.Max);
            Assert.AreEqual(5, metricT.Min);
            Assert.AreEqual(20, metricT.Sum);
            Assert.AreEqual(true, metricT.Properties.ContainsKey("Request.Success"));
            Assert.AreEqual(Boolean.TrueString, metricT.Properties["Request.Success"]);

            Assert.AreEqual("Server response time", metricF.Name);
            Assert.AreEqual(1, metricF.Count);
            Assert.AreEqual(10, metricF.Max);
            Assert.AreEqual(10, metricF.Min);
            Assert.AreEqual(10, metricF.Sum);
            Assert.AreEqual(true, metricF.Properties.ContainsKey("Request.Success"));
            Assert.AreEqual(Boolean.FalseString, metricF.Properties["Request.Success"]);
        }
コード例 #50
0
        public void TelemetryInitializersReturnsAnEmptyListByDefaultToAvoidNullReferenceExceptionsInUserCode()
        {
            var configuration = new TelemetryConfiguration();

            Assert.Equal(0, configuration.TelemetryInitializers.Count);
        }
コード例 #51
0
        public void InstrumentationKeyIsEmptyStringByDefaultToAvoidNullReferenceExceptionWhenAccessingPropertyValue()
        {
            var configuration = new TelemetryConfiguration();

            Assert.Equal(0, configuration.InstrumentationKey.Length);
        }