예제 #1
0
        public static async Task Main(string[] args)
        {
            var builder = WebAssemblyHostBuilder.CreateDefault(args);

            builder.RootComponents.Add <App>("#app");

            builder.Services.AddSingleton(sp => new HttpClient {
                BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)
            });
            // Add antd
            builder.Services.AddAntDesign();
            builder.Services.AddSingleton <VirtualNetwork>();
            builder.Services.AddBlazorApplicationInsights(async applicationInsights =>
            {
                var telemetryItem = new TelemetryItem()
                {
                    Tags = new Dictionary <string, object>()
                    {
                        { "ai.cloud.role", "SPA" },
                        { "ai.cloud.roleInstance", "vnet-planner" },
                    }
                };

                await applicationInsights.AddTelemetryInitializer(telemetryItem);
            });
            builder.Services.AddBlazorDownloadFile();

            var host      = builder.Build();
            var vnetState = host.Services.GetRequiredService <VirtualNetwork>();
            await vnetState.Initialize();

            await host.RunAsync();
        }
예제 #2
0
        public async Task <ActionResult <TelemetryItem> > Post(TelemetryItem item)
        {
            _context.TelemetryItems.Add(item);
            await _context.SaveChangesAsync();

            return(CreatedAtAction("Get", new { id = item.Id }, item));
        }
예제 #3
0
        protected void DebugTelemetryItems(Envelope[] telemetries)
        {
            StringBuilder builder = new StringBuilder();

            foreach (Envelope telemetry in telemetries)
            {
                TelemetryItem <RemoteDependencyData> dependency = telemetry as TelemetryItem <RemoteDependencyData>;
                if (dependency != null)
                {
                    var data = ((TelemetryItem <RemoteDependencyData>)dependency).data.baseData;
                    builder.AppendLine($"{dependency} - {data.data} - {((TelemetryItem<RemoteDependencyData>)dependency).time} - {data.duration} - {data.id} - {data.name} - {data.resultCode} - {data.success} - {data.target} - {data.type}");
                }
                else
                {
                    TelemetryItem <RequestData> request = telemetry as TelemetryItem <RequestData>;
                    if (request != null)
                    {
                        var data = ((TelemetryItem <RequestData>)request).data.baseData;
                        builder.AppendLine($"{request} - {data.url} - {((TelemetryItem<RequestData>)request).time} - {data.duration} - {data.id} - {data.name} - {data.success} - {data.responseCode}");
                    }
                    else
                    {
                        TelemetryItem <ExceptionData> exception = telemetry as TelemetryItem <ExceptionData>;
                        if (exception != null)
                        {
                            var data = ((TelemetryItem <ExceptionData>)exception).data.baseData;
                            builder.AppendLine($"{exception} - {data.exceptions[0].message} - {data.exceptions[0].stack} - {data.exceptions[0].typeName} - {data.severityLevel}");
                        }
                        else
                        {
                            TelemetryItem <MessageData> message = telemetry as TelemetryItem <MessageData>;
                            if (message != null)
                            {
                                var data = ((TelemetryItem <MessageData>)message).data.baseData;
                                builder.AppendLine($"{message} - {data.message} - {data.severityLevel}");
                            }
                            else
                            {
                                TelemetryItem <MetricData> metric = telemetry as TelemetryItem <MetricData>;
                                if (metric != null)
                                {
                                    var data = ((TelemetryItem <MetricData>)metric).data.baseData;
                                    builder.AppendLine($"{metric.ToString()} - {metric.data}- {metric.name} - {data.metrics.Count}");
                                    foreach (var metricVal in data.metrics)
                                    {
                                        builder.AppendLine($"{metricVal.name} {metricVal.value}");
                                    }
                                }
                                else
                                {
                                    builder.AppendLine($"{telemetry.ToString()} - {telemetry.time}");
                                }
                            }
                        }
                    }
                }
            }

            this.output.WriteLine(builder.ToString());
        }
예제 #4
0
        internal static List <TelemetryItem> OtelToAzureMonitorTrace(Batch <Activity> batchActivity, string roleName, string roleInstance, string instrumentationKey)
        {
            List <TelemetryItem> telemetryItems = new List <TelemetryItem>();
            TelemetryItem        telemetryItem;

            foreach (var activity in batchActivity)
            {
                MonitorBase telemetryData = new MonitorBase();
                var         monitorTags   = TraceHelper.EnumerateActivityTags(activity);
                telemetryItem = new TelemetryItem(activity, ref monitorTags);
                telemetryItem.InstrumentationKey = instrumentationKey;
                telemetryItem.SetResource(roleName, roleInstance);

                switch (activity.GetTelemetryType())
                {
                case TelemetryType.Request:
                    telemetryData.BaseType = "RequestData";
                    telemetryData.BaseData = new RequestData(Version, activity, ref monitorTags);
                    break;

                case TelemetryType.Dependency:
                    telemetryData.BaseType = "RemoteDependencyData";
                    telemetryData.BaseData = new RemoteDependencyData(Version, activity, ref monitorTags);
                    break;
                }

                telemetryItem.Data = telemetryData;
                telemetryItems.Add(telemetryItem);
            }

            return(telemetryItems);
        }
        internal static List <TelemetryItem> OtelToAzureMonitorMetrics(Batch <Metric> batch, string roleName, string roleInstance, string instrumentationKey)
        {
            List <TelemetryItem> telemetryItems = new List <TelemetryItem>();
            TelemetryItem        telemetryItem;

            foreach (var metric in batch)
            {
                if (metric.MetricType == MetricType.DoubleSum || metric.MetricType == MetricType.DoubleGauge)
                {
                    foreach (ref readonly var metricPoint in metric.GetMetricPoints())
                    {
                        telemetryItem      = new TelemetryItem(metricPoint.EndTime.UtcDateTime, roleName, roleInstance, instrumentationKey);
                        telemetryItem.Data = new MonitorBase
                        {
                            BaseType = "MetricData",
                            BaseData = new MetricsData(Version, metric, metricPoint)
                        };
                        telemetryItems.Add(telemetryItem);
                    }
                }
                else
                {
                    // log not supported
                }
            }

            return(telemetryItems);
        }
예제 #6
0
        private async void ProcessTelemetry(string jsonString)
        {
            var json = JObject.Parse(jsonString);
            // var name = json.name.value;

            // foreach(var item in json.value.timeseries.data)
            // {
            //     var telemetry = new TelemetryItem(name, item.timeStamp, item.average);
            // }

            var telemetry = new TelemetryItem(DateTime.Now.ToUniversalTime(), ((JArray)json["value"][0]["timeseries"][0]["data"]).Count);

            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                var content = new StringContent(JsonConvert.SerializeObject(telemetry), Encoding.UTF8, "application/json");
                using (HttpResponseMessage response = await client.PostAsync(uriTelemetryApi, content))
                {
                    if (!response.IsSuccessStatusCode)
                    {
                        // WHAHAHHAHAAA!!!
                    }
                }
            }
        }
        internal static List <TelemetryItem> OtelToAzureMonitorLogs(Batch <LogRecord> batchLogRecord, string roleName, string roleInstance, string instrumentationKey)
        {
            List <TelemetryItem> telemetryItems = new List <TelemetryItem>();
            TelemetryItem        telemetryItem;

            foreach (var logRecord in batchLogRecord)
            {
                telemetryItem = new TelemetryItem(logRecord, roleName, roleInstance, instrumentationKey);
                if (logRecord.Exception != null)
                {
                    telemetryItem.Data = new MonitorBase
                    {
                        BaseType = "ExceptionData",
                        BaseData = new TelemetryExceptionData(Version, logRecord),
                    };
                }
                else
                {
                    telemetryItem.Data = new MonitorBase
                    {
                        BaseType = "MessageData",
                        BaseData = new MessageData(Version, logRecord),
                    };
                }

                telemetryItems.Add(telemetryItem);
            }

            return(telemetryItems);
        }
예제 #8
0
        private static TelemetryItem Build(AppInsightsTelemetry appInsightsTelemetry)
        {
            Dictionary <string, string> appInsightsProperties = appInsightsTelemetry.Data?.BaseData?.Properties;
            //bear in mind - if something goes wrong, properties might be null
            TelemetryItem item = new TelemetryItem()
            {
                Timestamp      = appInsightsTelemetry.Time,
                VersionData    = GetVersionData(appInsightsProperties),
                UserIdentifier = appInsightsTelemetry.Tags?.AiUserId,
                AuthenticatedUserIdentifier = appInsightsTelemetry.Tags?.AiUserAuthUserId,
                Properties        = GetFilteredProperties(appInsightsProperties),
                Measurements      = appInsightsTelemetry.Data?.BaseData?.Measurements,
                TelemetryItemType = GetItemType(appInsightsTelemetry),
                EntryKey          = appInsightsTelemetry.Data?.BaseData?.Name ?? "MissingKey",
                Sequence          = appInsightsTelemetry.Seq,
                LogMessage        = appInsightsTelemetry.Data?.BaseData?.Message
            };

            MapTelemetryKey(appInsightsProperties, item);

            MapLogLevel(appInsightsTelemetry, item);

            MapExceptionProperties(appInsightsTelemetry, item);

            HandleNullPropertiesError(appInsightsTelemetry, appInsightsProperties, item);

            return(item);
        }
예제 #9
0
        internal static List <TelemetryItem> OtelToAzureMonitorMetrics(Batch <Metric> batch, string roleName, string roleInstance, string instrumentationKey)
        {
            List <TelemetryItem> telemetryItems = new List <TelemetryItem>();
            TelemetryItem        telemetryItem;

            foreach (var metric in batch)
            {
                if (metric.MetricType == MetricType.DoubleSum || metric.MetricType == MetricType.DoubleGauge)
                {
                    foreach (ref var metricPoint in metric.GetMetricPoints())
                    {
                        string name    = "Metric";
                        string utcTime = TelemetryItem.FormatUtcTimestamp(metricPoint.EndTime.UtcDateTime);
                        telemetryItem = new TelemetryItem(name, utcTime);
                        telemetryItem.Tags[ContextTagKeys.AiInternalSdkVersion.ToString()] = SdkVersionUtils.SdkVersion;
                        telemetryItem.InstrumentationKey = instrumentationKey;
                        telemetryItem.SetResource(roleName, roleInstance);

                        telemetryItem.Data = new MonitorBase
                        {
                            BaseType = "MetricData",
                            BaseData = new MetricsData(version, metric, ref metricPoint)
                        };
                        telemetryItems.Add(telemetryItem);
                    }
                }
                else
                {
                    // log not supported
                }
            }

            return(telemetryItems);
        }
예제 #10
0
        public void HttpMethodAndHttpRouteIsUsedForHttpRequestOperationName(string route)
        {
            using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
            using var activity = activitySource.StartActivity(
                      ActivityName,
                      ActivityKind.Server,
                      null,
                      startTime: DateTime.UtcNow);
            var resource = CreateTestResource();

            activity.DisplayName = "/getaction";

            activity.SetTag(SemanticConventions.AttributeHttpMethod, "GET");
            activity.SetTag(SemanticConventions.AttributeHttpRoute, route);
            activity.SetTag(SemanticConventions.AttributeHttpUrl, "https://www.foo.bar/search");

            string expectedOperationName;

            if (route == "{controller}/{action}/{id}" || route == null)
            {
                expectedOperationName = "GET /search";
            }
            else
            {
                expectedOperationName = $"GET {route}";
            }

            var monitorTags = TraceHelper.EnumerateActivityTags(activity);

            var telemetryItem = new TelemetryItem(activity, ref monitorTags);

            Assert.Equal(expectedOperationName, telemetryItem.Tags[ContextTagKeys.AiOperationName.ToString()]);
        }
예제 #11
0
        /// <summary>
        /// Validates Runtime Dependency Telemetry values.
        /// </summary>
        /// <param name="itemToValidate">RDD Item to be validated.</param>
        /// <param name="accessTimeMax">Expected maximum limit for access time.</param>
        /// <param name="successFlagExpected">Expected value for success flag.</param>
        public static void Validate(
            TelemetryItem <RemoteDependencyData> itemToValidate,
            TimeSpan accessTimeMax,
            bool successFlagExpected)
        {
            string actualSdkVersion = itemToValidate.tags[new ContextTagKeys().InternalSdkVersion];

            Assert.IsTrue(actualSdkVersion.Contains(DeploymentAndValidationTools.ExpectedSDKPrefix), "Actual version:" + actualSdkVersion);

            // Validate is within expected limits
            var accessTime = TimeSpan.Parse(itemToValidate.data.baseData.duration);

            // DNS resolution may take up to 15 seconds https://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.timeout(v=vs.110).aspx.
            // In future when tests will be refactored we should re-think failed http calls validation policy - need to validate resposnes that actually fails on GetResponse,
            // not only those made to not-existing domain.
            var accessTimeMaxPlusDnsResolutionTime = accessTimeMax.Add(TimeSpan.FromSeconds(15));

            if (successFlagExpected)
            {
                Assert.IsTrue(accessTime.Ticks > 0, "Access time should be above zero");
            }
            else
            {
                Assert.IsTrue(accessTime.Ticks >= 0, "Access time should be zero or above for failed calls");
            }

            Assert.IsTrue(accessTime < accessTimeMaxPlusDnsResolutionTime, string.Format("Access time of {0} exceeds expected max of {1}", accessTime, accessTimeMaxPlusDnsResolutionTime));

            // Validate success flag
            var successFlagActual = itemToValidate.data.baseData.success;

            Assert.AreEqual(successFlagExpected, successFlagActual, "Success flag collected is wrong");
        }
예제 #12
0
        internal static TelemetryItem GetTelemetryItem(LogRecord logRecord, string instrumentationKey)
        {
            var name = PartA_Name_Mapping[TelemetryType.Message];
            var time = FormatUtcTimestamp(logRecord.Timestamp);

            TelemetryItem telemetryItem = new TelemetryItem(name, time)
            {
                InstrumentationKey = instrumentationKey
            };

            // TODO: I WAS TOLD THIS MIGHT BE CHANGING. IGNORING FOR NOW.
            //InitRoleInfo(activity);
            //telemetryItem.Tags[ContextTagKeys.AiCloudRole.ToString()] = RoleName;
            //telemetryItem.Tags[ContextTagKeys.AiCloudRoleInstance.ToString()] = RoleInstance;

            if (logRecord.TraceId != default)
            {
                telemetryItem.Tags[ContextTagKeys.AiOperationId.ToString()] = logRecord.TraceId.ToHexString();
            }

            if (logRecord.SpanId != default)
            {
                telemetryItem.Tags[ContextTagKeys.AiOperationParentId.ToString()] = logRecord.SpanId.ToHexString();
            }

            telemetryItem.Tags[ContextTagKeys.AiInternalSdkVersion.ToString()] = SdkVersionUtils.SdkVersion;

            return(telemetryItem);
        }
예제 #13
0
        public async Task <IHttpActionResult> PostBasic(Guid telemetryKey, BasicTelemetryItem request)
        {
            if (request == null)
            {
                request = new BasicTelemetryItem();
            }

            TelemetryRootObject program = await this.work.GetMonitoredProgram(telemetryKey).ConfigureAwait(false);

            if (program == null)
            {
                throw new BadRequestException($"Program with telemetry key [{telemetryKey}] does not exist");
            }

            try
            {
                TelemetryItem item = TelemetryMapper.Map(telemetryKey, request);

                string ip = this.Request.GetClientIp();

                await this.InsertDataInternal(new[] { item }, program, ip).ConfigureAwait(false);

                return(await Task.FromResult(this.StatusCode(HttpStatusCode.OK)).ConfigureAwait(false));
            }
            catch (Exception ex)
            {
                return(await Task.FromResult(this.InternalServerError(new InvalidOperationException($"Error while inserting entry: {ex}"))).ConfigureAwait(false));
            }
        }
        public void ValidateTelemetryItem_DefaultActivity_DefaultResource()
        {
            using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
            using var activity = activitySource.StartActivity(
                      ActivityName,
                      ActivityKind.Client,
                      parentContext: default,
                      startTime: DateTime.UtcNow);

            var resource = CreateTestResource();

            var monitorTags    = TraceHelper.EnumerateActivityTags(activity);
            var telemetryItem  = new TelemetryItem(activity, ref monitorTags);
            var resourceParser = new ResourceParser();

            resourceParser.UpdateRoleNameAndInstance(resource);
            telemetryItem.SetResource(resourceParser.RoleName, resourceParser.RoleInstance);

            Assert.Equal("RemoteDependency", telemetryItem.Name);
            Assert.Equal(TelemetryItem.FormatUtcTimestamp(activity.StartTimeUtc), telemetryItem.Time);
            Assert.StartsWith("unknown_service", telemetryItem.Tags[ContextTagKeys.AiCloudRole.ToString()]);
            Assert.Equal(Dns.GetHostName(), telemetryItem.Tags[ContextTagKeys.AiCloudRoleInstance.ToString()]);
            Assert.NotNull(telemetryItem.Tags[ContextTagKeys.AiOperationId.ToString()]);
            Assert.NotNull(telemetryItem.Tags[ContextTagKeys.AiInternalSdkVersion.ToString()]);
            Assert.Throws <KeyNotFoundException>(() => telemetryItem.Tags[ContextTagKeys.AiOperationParentId.ToString()]);
        }
예제 #15
0
        public async static Task SendToMissionControlAsync(TelemetryItem telemetry)
        {
            var client = TopicClient.CreateFromConnectionString(Common.CoreConstants.MissionControlTransmissionConnection, Common.CoreConstants.MissionEventName);

            BrokeredMessage bm = new BrokeredMessage();

            bm.Label = telemetry.UserId;
            bm.Properties["UserId"]      = telemetry.UserId;
            bm.Properties["DisplayName"] = telemetry.DisplayName;
            bm.Properties["Tagline"]     = telemetry.Tagline;
            bm.Properties["Altitude"]    = telemetry.Altitude;
            bm.Properties["DescentRate"] = telemetry.DescentRate;
            bm.Properties["Fuel"]        = telemetry.Fuel;
            bm.Properties["Thrust"]      = telemetry.Thrust;

            try
            {
                await client.SendAsync(bm);
            }
            catch
            {
            }

            return;
        }
예제 #16
0
        internal static TelemetryItem GetTelemetryItem(Activity activity, ref TagEnumerationState monitorTags, Resource resource, string instrumentationKey)
        {
            TelemetryItem telemetryItem = new TelemetryItem(PartA_Name_Mapping[activity.GetTelemetryType()], FormatUtcTimestamp(activity.StartTimeUtc))
            {
                InstrumentationKey = instrumentationKey
            };

            InitRoleInfo(resource);

            if (activity.ParentSpanId != default)
            {
                telemetryItem.Tags[ContextTagKeys.AiOperationParentId.ToString()] = activity.ParentSpanId.ToHexString();
            }

            telemetryItem.Tags[ContextTagKeys.AiCloudRole.ToString()]         = RoleName;
            telemetryItem.Tags[ContextTagKeys.AiCloudRoleInstance.ToString()] = RoleInstance;
            telemetryItem.Tags[ContextTagKeys.AiOperationId.ToString()]       = activity.TraceId.ToHexString();
            // todo: update swagger to include this key.
            telemetryItem.Tags["ai.user.userAgent"] = AzMonList.GetTagValue(ref monitorTags.PartBTags, SemanticConventions.AttributeHttpUserAgent)?.ToString();

            // we only have mapping for server spans
            // todo: non-server spans
            if (activity.Kind == ActivityKind.Server)
            {
                telemetryItem.Tags[ContextTagKeys.AiOperationName.ToString()] = GetOperationName(activity, ref monitorTags.PartBTags);
                telemetryItem.Tags[ContextTagKeys.AiLocationIp.ToString()]    = GetLocationIp(ref monitorTags.PartBTags);
            }

            telemetryItem.Tags[ContextTagKeys.AiInternalSdkVersion.ToString()] = SdkVersionUtils.SdkVersion;

            return(telemetryItem);
        }
예제 #17
0
        private static void AddLoggingAndApplicationInsights(WebAssemblyHostBuilder builder)
        {
            var instrumentationKey = builder.Configuration.GetValue <string>("ApplicationInsights:InstrumentationKey");

            builder.Services.AddBlazorApplicationInsights(async applicationInsights =>
            {
                await applicationInsights.SetInstrumentationKey(instrumentationKey);
                await applicationInsights.LoadAppInsights();

                var telemetryItem = new TelemetryItem()
                {
                    Tags = new Dictionary <string, object>()
                    {
                        { "ai.cloud.role", "Web.Client" },
                        // { "ai.cloud.roleInstance", "..." },
                    }
                };

                await applicationInsights.AddTelemetryInitializer(telemetryItem);
            }, addILoggerProvider: true);

            builder.Logging.AddFilter <ApplicationInsightsLoggerProvider>(level => (level == LogLevel.Error) || (level == LogLevel.Critical));

#if DEBUG
            builder.Logging.SetMinimumLevel(LogLevel.Debug);
#endif
        }
예제 #18
0
        public void GeneratePartAEnvelope_Activity_WithResource()
        {
            using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
            using var activity = activitySource.StartActivity(
                      ActivityName,
                      ActivityKind.Client,
                      parentContext: default,
                      startTime: DateTime.UtcNow);

            var resource = CreateTestResource(serviceName: "my-service", serviceInstance: "my-instance");

            var monitorTags = TraceHelper.EnumerateActivityTags(activity);

            var telemetryItem  = new TelemetryItem(activity, ref monitorTags);
            var resourceParser = new ResourceParser();

            resourceParser.UpdateRoleNameAndInstance(resource);
            telemetryItem.SetResource(resourceParser.RoleName, resourceParser.RoleInstance);

            Assert.Equal("RemoteDependency", telemetryItem.Name);
            Assert.Equal(TelemetryItem.FormatUtcTimestamp(activity.StartTimeUtc), telemetryItem.Time);
            Assert.Equal("my-service", telemetryItem.Tags[ContextTagKeys.AiCloudRole.ToString()]);
            Assert.Equal("my-instance", telemetryItem.Tags[ContextTagKeys.AiCloudRoleInstance.ToString()]);
            Assert.Equal(activity.TraceId.ToHexString(), telemetryItem.Tags[ContextTagKeys.AiOperationId.ToString()]);
            Assert.Equal(SdkVersionUtils.SdkVersion, telemetryItem.Tags[ContextTagKeys.AiInternalSdkVersion.ToString()]);
            Assert.Throws <KeyNotFoundException>(() => telemetryItem.Tags[ContextTagKeys.AiOperationParentId.ToString()]);
        }
예제 #19
0
        public static IServiceCollection AddBlazorServices(this IServiceCollection services)
        {
            services.AddScoped <ICatalogBrandService, CachedCatalogBrandServiceDecorator>();
            services.AddScoped <CatalogBrandService>();
            services.AddScoped <ICatalogTypeService, CachedCatalogTypeServiceDecorator>();
            services.AddScoped <CatalogTypeService>();
            services.AddScoped <ICatalogItemService, CachedCatalogItemServiceDecorator>();
            services.AddScoped <CatalogItemService>();

            //Application Insights
            services.AddBlazorApplicationInsights(async applicationInsights =>
            {
                var telemetryItem = new TelemetryItem()
                {
                    Tags = new Dictionary <string, object>()
                    {
                        { "ai.cloud.role", "SPA" },
                        { "ai.cloud.roleInstance", "Blazor Wasm" },
                    }
                };

                await applicationInsights.AddTelemetryInitializer(telemetryItem);
            });

            return(services);
        }
예제 #20
0
        public void GeneratePartAEnvelope_Activity_WithParentSpanId()
        {
            using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
            using var activity = activitySource.StartActivity(
                      ActivityName,
                      ActivityKind.Client,
                      parentContext: new ActivityContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.Recorded),
                      startTime: DateTime.UtcNow);
            var resource = CreateTestResource();

            var monitorTags = TraceHelper.EnumerateActivityTags(activity);

            var telemetryItem  = new TelemetryItem(activity, ref monitorTags);
            var resourceParser = new ResourceParser();

            resourceParser.UpdateRoleNameAndInstance(resource);
            telemetryItem.SetResource(resourceParser.RoleName, resourceParser.RoleInstance);

            Assert.Equal("RemoteDependency", telemetryItem.Name);
            Assert.Equal(TelemetryItem.FormatUtcTimestamp(activity.StartTimeUtc), telemetryItem.Time);
            Assert.StartsWith("unknown_service", telemetryItem.Tags[ContextTagKeys.AiCloudRole.ToString()]);
            Assert.Equal(Dns.GetHostName(), telemetryItem.Tags[ContextTagKeys.AiCloudRoleInstance.ToString()]);
            Assert.NotNull(telemetryItem.Tags[ContextTagKeys.AiOperationId.ToString()]);
            Assert.NotNull(telemetryItem.Tags[ContextTagKeys.AiInternalSdkVersion.ToString()]);
            Assert.Equal(activity.ParentSpanId.ToHexString(), telemetryItem.Tags[ContextTagKeys.AiOperationParentId.ToString()]);
        }
예제 #21
0
        /// <summary>
        /// Maps the specified basic item.
        /// </summary>
        /// <param name="telemetryKey"></param>
        /// <param name="basicItem">The basic item.</param>
        /// <returns>TelemetryItem.</returns>
        public static TelemetryItem Map(Guid telemetryKey, BasicTelemetryItem basicItem)
        {
            if (!Version.TryParse(basicItem.ProgramVersion, out _))
            {
                basicItem.ProgramVersion = "0.0.0.0";
            }

            TelemetryItem item = new TelemetryItem
            {
                TelemetryKey      = telemetryKey,
                UserIdentifier    = basicItem.UserIdentifier,
                TelemetryItemType = basicItem.TelemetryItemType,
                LogMessage        = basicItem.LogMessage,
                EntryKey          = basicItem.EventName,
                Sequence          = "NotSpecified",
                Properties        = basicItem.Properties,
                Measurements      = basicItem.Metrics,
                VersionData       = new VersionData(basicItem.ProgramVersion, basicItem.ProgramVersion),
                Timestamp         = basicItem.Timestamp
            };

            if (basicItem.TelemetryItemType == TelemetryItemTypes.Exception)
            {
                item.Exceptions = new List <TelemetryItem.ExceptionInfo>();
                item.Exceptions.Add(new TelemetryItem.ExceptionInfo()
                {
                    Message = basicItem.ErrorMessage
                });
            }
            return(item);
        }
예제 #22
0
        public static async Task Main(string[] args)
        {
            var builder = WebAssemblyHostBuilder.CreateDefault(args);

            builder.RootComponents.Add <App>("app");

            builder.Services.AddTransient(sp => new HttpClient {
                BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)
            });

            builder.Services.AddBlazorApplicationInsights(async applicationInsights =>
            {
                var telemetryItem = new TelemetryItem()
                {
                    Tags = new Dictionary <string, object>()
                    {
                        { "ai.cloud.role", "SPA" },
                        { "ai.cloud.roleInstance", "Blazor Wasm" },
                    }
                };

                await applicationInsights.AddTelemetryInitializer(telemetryItem);
            });

            await builder.Build().RunAsync();
        }
        private static void Validate(TelemetryItem <RemoteDependencyData> itemToValidate,
                                     string targetExpected,
                                     string commandNameExpected,
                                     TimeSpan accessTimeMax,
                                     bool successFlagExpected,
                                     string sqlErrorCodeExpected,
                                     string sqlErrorMessageExpected)
        {
            Assert.IsTrue(itemToValidate.data.baseData.target.Contains(targetExpected),
                          "The remote dependancy target is incorrect. Expected: " + targetExpected +
                          ". Collected: " + itemToValidate.data.baseData.target);

            Assert.AreEqual(sqlErrorCodeExpected, itemToValidate.data.baseData.resultCode);

            //If the command name is expected to be empty, the deserializer will make the CommandName null
            if ("rdddsc" == DeploymentAndValidationTools.ExpectedSqlSDKPrefix)
            {
                // Additional checks for profiler collection
                if (!string.IsNullOrEmpty(sqlErrorMessageExpected))
                {
                    Assert.AreEqual(sqlErrorMessageExpected, itemToValidate.data.baseData.properties["ErrorMessage"]);
                }

                if (string.IsNullOrEmpty(commandNameExpected))
                {
                    Assert.IsNull(itemToValidate.data.baseData.data);
                }
                else
                {
                    Assert.AreEqual(commandNameExpected, itemToValidate.data.baseData.data, "The command name is incorrect");
                }
            }

            DeploymentAndValidationTools.Validate(itemToValidate, accessTimeMax, successFlagExpected, sqlErrorCodeExpected);
        }
예제 #24
0
        private async Task Track(string customEvent, string mectrics)
        {
            TelemetryItem telemetryItem = new TelemetryItem();

            telemetryItem.CustomEvent = customEvent;
            telemetryItem.Metrics     = mectrics;

            await InsertTelemetryItem(telemetryItem);
        }
예제 #25
0
        protected void ValidateExceptionTelemetry(TelemetryItem <ExceptionData> exceptionTelemetry, TelemetryItem <RequestData> request, int expectedExceptionsCount)
        {
            Assert.AreEqual(this.Config.IKey, exceptionTelemetry.iKey, "iKey is not the same as in config file for exception");
            Assert.AreEqual(request.tags[new ContextTagKeys().OperationId], exceptionTelemetry.tags[new ContextTagKeys().OperationId], "Operation id is incorrect");

            Assert.AreEqual(expectedExceptionsCount, exceptionTelemetry.data.baseData.exceptions.Count, "Exceptions count is incorrect");

            Assert.IsTrue(exceptionTelemetry.tags.Where((x) => { return(x.Key.StartsWith("ai.cloud")); }).Count() > 0, "Cloud was not collected");
        }
        protected void ValidateExceptionTelemetry(TelemetryItem<ExceptionData> exceptionTelemetry, TelemetryItem<RequestData> request, int expectedExceptionsCount)
        {
            Assert.AreEqual(this.Config.IKey, exceptionTelemetry.iKey, "iKey is not the same as in config file for exception");
            Assert.AreEqual(request.tags[new ContextTagKeys().OperationId], exceptionTelemetry.tags[new ContextTagKeys().OperationId], "Operation id is incorrect");

            Assert.AreEqual(expectedExceptionsCount, exceptionTelemetry.data.baseData.exceptions.Count, "Exceptions count is incorrect");

            Assert.IsTrue(exceptionTelemetry.tags.Where((x)=> { return x.Key.StartsWith("ai.cloud"); }).Count() > 0, "Cloud was not collected");
        }
예제 #27
0
 private static void MapLogLevel(AppInsightsTelemetry appInsightsTelemetry, TelemetryItem item)
 {
     if (appInsightsTelemetry.Data.BaseData.SeverityLevel != null)
     {
         if (Enum.TryParse(appInsightsTelemetry.Data.BaseData.SeverityLevel, out SeverityLevel enumerized))
         {
             item.LogLevel = Map(enumerized);
         }
     }
 }
예제 #28
0
        public void SerializeWritesStateAsExpectedByEndpoint()
        {
            var telemetry = new SessionStateTelemetry {
                State = SessionState.End
            };
            TelemetryItem <EventData> envelope = TelemetryItemTestHelper.SerializeDeserializeTelemetryItem <SessionStateTelemetry, EventData>(telemetry);

            Assert.AreEqual("Session ended", envelope.data.baseData.name);
            Assert.AreEqual(2, envelope.data.baseData.ver);
        }
        public static void VerifyDependency(TelemetryItem telemetryItem, ExpectedTelemetryItemValues expectedVars)
        {
            Assert.Equal("RemoteDependency", telemetryItem.Name);
            Assert.Equal(nameof(RemoteDependencyData), telemetryItem.Data.BaseType);

            var data = (RemoteDependencyData)telemetryItem.Data.BaseData;

            Assert.Equal(expectedVars.Name, data.Name);
            Assert.Equal(expectedVars.CustomProperties, data.Properties);
        }
예제 #30
0
        public void SerializeWritesStateAsExpectedByEndpoint()
        {
            var telemetry = new SessionStateTelemetry {
                State = SessionState.End
            };
            TelemetryItem <SessionStateData> envelope = TelemetryItemTestHelper.SerializeDeserializeTelemetryItem <SessionStateTelemetry, SessionStateData>(telemetry);

            Assert.Equal(AI.SessionState.End, envelope.data.baseData.state);
            Assert.Equal(2, envelope.data.baseData.ver);
        }
예제 #31
0
        public void SerializeWritesStateAsExpectedByEndpoint()
        {
            var telemetry = new SessionStateTelemetry {
                State = SessionState.End
            };
            TelemetryItem <SessionStateData> envelope = TelemetryItemTestHelper.SerializeDeserializeTelemetryItem <SessionStateTelemetry, SessionStateData>(telemetry);

            Assert.Equal(DataPlatformModel.SessionState.End, envelope.Data.BaseData.State);
            Assert.Equal(2, envelope.Data.BaseData.Ver);
        }
        protected void ValidateExceptionTelemetry(TelemetryItem<ExceptionData> exceptionTelemetry, TelemetryItem<RequestData> request, int expectedExceptionsCount)
        {
            Assert.AreEqual(this.Config.IKey, exceptionTelemetry.IKey, "iKey is not the same as in config file for exception");
            Assert.AreEqual(request.OperationContext.Id, exceptionTelemetry.OperationContext.Id, "Operation id is incorrect");

            Assert.AreEqual("Platform", exceptionTelemetry.Data.BaseData.HandledAt, "handledAt is incorrect");

            Assert.AreEqual(expectedExceptionsCount, exceptionTelemetry.Data.BaseData.Exceptions.Count, "Exceptions count is incorrect");

            Assert.IsNotNull(exceptionTelemetry.DeviceContext, "Device was not collected");
        }
        protected void TestWebApplicationHelper(string requestName, string requestUrl, string responseCode, bool success, TelemetryItem<RequestData> item, DateTimeOffset testStart, DateTimeOffset testFinish)
        {
            Assert.AreEqual(this.Config.IKey, item.IKey, "iKey is not the same as in config file");
            Assert.AreEqual(requestName, item.OperationContext.Name);
            Assert.AreEqual(requestUrl, item.Data.BaseData.Url);
            Assert.AreEqual(responseCode, item.Data.BaseData.ResponseCode);
            Assert.AreEqual(success, item.Data.BaseData.Success);

            double duration = Math.Floor(item.Data.BaseData.Duration.TotalMilliseconds);
            Assert.IsTrue(duration >= 0, "Duration is negative: " + duration);
            Assert.IsTrue((testFinish - testStart).TotalMilliseconds >= duration, "Duration is incorrect: " + duration);
        }
        protected void TestWebApplicationHelper(string requestName, string requestUrl, string responseCode, bool success, TelemetryItem<RequestData> item, DateTimeOffset testStart, DateTimeOffset testFinish)
        {
            Assert.AreEqual(this.Config.IKey, item.iKey, "iKey is not the same as in config file");
            Assert.AreEqual(requestName, item.tags[new ContextTagKeys().OperationName]);
            Assert.AreEqual(requestUrl, item.data.baseData.url);
            Assert.AreEqual(responseCode, item.data.baseData.responseCode);
            Assert.AreEqual(success, item.data.baseData.success);

            double duration = Math.Floor(TimeSpan.Parse(item.data.baseData.duration).TotalMilliseconds);
            Assert.IsTrue(duration >= 0, "Duration is negative: " + duration);
            Assert.IsTrue((testFinish - testStart).TotalMilliseconds >= duration, "Duration is incorrect: " + duration);
        }
        private void ReceiveRequestAndSession(
            int testListenerTimeoutInMs,
            out TelemetryItem<RequestData> requestItem,
            out TelemetryItem<SessionStateData> sessionItem)
        {
            var items = Listener.ReceiveItemsOfTypes<TelemetryItem<RequestData>, TelemetryItem<SessionStateData>>(
                2,
                testListenerTimeoutInMs);

            // One item is request, the other one is sessionState.
            int requestItemIndex = (items[0] is TelemetryItem<RequestData>) ? 0 : 1;
            int sessionStateItemIndex = (requestItemIndex == 0) ? 1 : 0;

            sessionItem = (TelemetryItem<SessionStateData>)items[sessionStateItemIndex];
            requestItem = (TelemetryItem<RequestData>)items[requestItemIndex];
        }
        private static void AssertCustomCounterReported(TelemetryItem[] counterItems, string metricName, bool reported = true)
        {
            bool counterReported = counterItems.Any(
                item =>
                {
                    var metricData = item as TelemetryItem<MetricData>;

                    return metricData != null && metricData.Data.BaseData.Metrics[0].Name == metricName;
                });

            if (reported)
            {
                Assert.IsTrue(counterReported);
            }
            else
            {
                Assert.IsFalse(counterReported);
            }
        }
        private static void AssertDefaultCounterReported(TelemetryItem[] counterItems, string categoryName, string counterName, bool reported = true)
        {
            bool counterReported = counterItems.Any(
                item =>
                {
                    var perfData = item as TelemetryItem<PerformanceCounterData>;

                    return perfData != null && perfData.Data.BaseData.CategoryName == categoryName
                           && perfData.Data.BaseData.CounterName == counterName;
                });

            if (reported)
            {
                Assert.IsTrue(counterReported);
            }
            else
            {
                Assert.IsFalse(counterReported);
            }
        }
        private void Validate(TelemetryItem<RemoteDependencyData> itemToValidate,
            Uri expectedUrl,
            TimeSpan accessTimeMax,
            bool successFlagExpected,
            string verb)
        {
            if ("rddp" == DeploymentAndValidationTools.ExpectedSDKPrefix)
            {
                Assert.AreEqual(verb + " " + expectedUrl.AbsolutePath, itemToValidate.data.baseData.name, "For StatusMonitor implementation we expect verb to be collected.");
                Assert.AreEqual(expectedUrl.Host, itemToValidate.data.baseData.target);
                Assert.AreEqual(expectedUrl.OriginalString, itemToValidate.data.baseData.data);
            }

            DeploymentAndValidationTools.Validate(itemToValidate, accessTimeMax, successFlagExpected);
        }
        private void Validate(TelemetryItem<RemoteDependencyData> itemToValidate,
            string targetExpected,
            string commandNameExpected,
            TimeSpan accessTimeMax,
            bool successFlagExpected,
            string sqlErrorCodeExpected,
            string sqlErrorMessageExpected)
        {
            // For http name is validated in test itself
            Assert.IsTrue(itemToValidate.data.baseData.target.Contains(targetExpected),
                "The remote dependancy target is incorrect. Expected: " + targetExpected +
                ". Collected: " + itemToValidate.data.baseData.target);

            Assert.AreEqual(sqlErrorCodeExpected, itemToValidate.data.baseData.resultCode);

            //If the command name is expected to be empty, the deserializer will make the CommandName null
            if ("rddp" == DeploymentAndValidationTools.ExpectedSDKPrefix)
            {
                // Additional checks for profiler collection
                if (!string.IsNullOrEmpty(sqlErrorMessageExpected))
                {
                    Assert.AreEqual(sqlErrorMessageExpected, itemToValidate.data.baseData.properties["ErrorMessage"]);
                }

                if (string.IsNullOrEmpty(commandNameExpected))
                {
                    Assert.IsNull(itemToValidate.data.baseData.data);
                }
                else
                {
                    Assert.IsTrue(itemToValidate.data.baseData.data.Equals(commandNameExpected), "The command name is incorrect");
                }
            }

            DeploymentAndValidationTools.Validate(itemToValidate, accessTimeMax, successFlagExpected);
        }
        /// <summary>
        /// Validates Runtime Dependency Telemetry values.
        /// </summary>        
        /// <param name="itemToValidate">RDD Item to be validated.</param>
        /// <param name="accessTimeMax">Expected maximum limit for access time.</param>   
        /// <param name="successFlagExpected">Expected value for success flag.</param>   
        public static void Validate(
            TelemetryItem<RemoteDependencyData> itemToValidate,
            TimeSpan accessTimeMax,
            bool successFlagExpected)
        {
            string actualSdkVersion = itemToValidate.tags[new ContextTagKeys().InternalSdkVersion];
            Assert.IsTrue(actualSdkVersion.Contains(DeploymentAndValidationTools.ExpectedSDKPrefix), "Actual version:" + actualSdkVersion);

            // Validate is within expected limits
            var accessTime = TimeSpan.Parse(itemToValidate.data.baseData.duration);

            // DNS resolution may take up to 15 seconds https://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.timeout(v=vs.110).aspx.
            // In future when tests will be refactored we should re-think failed http calls validation policy - need to validate resposnes that actually fails on GetResponse,
            // not only those made to not-existing domain.
            var accessTimeMaxPlusDnsResolutionTime = accessTimeMax.Add(TimeSpan.FromSeconds(15));
            if (successFlagExpected)
            {
                Assert.IsTrue(accessTime.Ticks > 0, "Access time should be above zero");
            }
            else
            {
                Assert.IsTrue(accessTime.Ticks >= 0, "Access time should be zero or above for failed calls");
            }

            Assert.IsTrue(accessTime < accessTimeMaxPlusDnsResolutionTime, string.Format("Access time of {0} exceeds expected max of {1}", accessTime, accessTimeMaxPlusDnsResolutionTime));

            // Validate success flag
            var successFlagActual = itemToValidate.data.baseData.success;
            Assert.AreEqual(successFlagExpected, successFlagActual, "Success flag collected is wrong");
        }
        /// <summary>
        /// Validates Runtime Dependency Telemetry values.
        /// </summary>        
        /// <param name="itemToValidate">RDD Item to be validated.</param>
        /// <param name="remoteDependencyNameExpected">Expected name.</param>   
        /// <param name="countExpected">Expected count.</param>   
        /// <param name="accessTimeMax">Expected maximum limit for access time.</param>   
        /// <param name="successFlagExpected">Expected value for success flag.</param>   
        /// <param name="asyncFlagExpected">Expected value for async flag.</param>           
        private void ValidateRddTelemetryValues(TelemetryItem<RemoteDependencyData> itemToValidate, string remoteDependencyNameExpected, string commandNameExpected, int countExpected, TimeSpan accessTimeMax, bool successFlagExpected, bool asyncFlagExpected)
        {
            DependencySourceType source = sourceExpected;
            Assert.IsTrue(itemToValidate.Data.BaseData.Name.Contains(remoteDependencyNameExpected), "The remote dependancy name is incorrect");

            //If the command name is expected to be empty, the deserializer will make the CommandName null
            if (DependencySourceType.Apmc == sourceExpected)
            {
                if (string.IsNullOrEmpty(commandNameExpected))
                    Assert.IsNull(itemToValidate.Data.BaseData.CommandName);
                else
                    Assert.IsTrue(itemToValidate.Data.BaseData.CommandName.Equals(commandNameExpected), "The command name is incorrect");
            }

            string actualSdkVersion = itemToValidate.InternalContext.SdkVersion;
            if (DependencySourceType.Apmc == sourceExpected)
            {
                Assert.IsTrue(actualSdkVersion.Contains("rddp"), "Actual version:" + actualSdkVersion);
            }
            else
            {
                Assert.IsTrue(actualSdkVersion.Contains("rddf"), "Actual version:" + actualSdkVersion);
            }

            // Validate is within expected limits
            var ticks = (long)(itemToValidate.Data.BaseData.Value * 10000);

            var accessTime = TimeSpan.FromTicks(ticks);
            // DNS resolution may take up to 15 seconds https://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.timeout(v=vs.110).aspx.
            // In future when tests will be refactored we should re-think failed http calls validation policy - need to validate resposnes that actually fails on GetResponse,
            // not only those made to not-existing domain.
            var accessTimeMaxPlusDnsResolutionTime = accessTimeMax.Add(TimeSpan.FromSeconds(15));
            if (successFlagExpected == true)
            {
                Assert.IsTrue(accessTime.Ticks > 0, "Access time should be above zero");
            }
            else
            {
                Assert.IsTrue(accessTime.Ticks >= 0, "Access time should be zero or above for failed calls");
            }

            Assert.IsTrue(accessTime < accessTimeMaxPlusDnsResolutionTime, string.Format("Access time of {0} exceeds expected max of {1}", accessTime, accessTimeMaxPlusDnsResolutionTime));

            // Validate success and async flag values
            var successFlagActual = itemToValidate.Data.BaseData.Success;
            Assert.AreEqual(successFlagExpected, successFlagActual, "Success flag collected is wrong");
        }