public static async Task <List <TelemetrySummary> > InsertData(ITelemetryUnitOfWork work, List <TelemetryItem> units, TelemetryRootObject program, string ipAddress)
        {
            if (units.Any())
            {
                ClientAppUser clientAppUser =
                    await GetUserOrAddIfMissing(work, units.First(), ipAddress).ConfigureAwait(false);

                IEnumerable <IGrouping <TelemetryItemTypes, TelemetryItem> > typeGroupings =
                    units.GroupBy(x => x.TelemetryItemType);
                List <TelemetrySummary> summaries = new List <TelemetrySummary>();
                foreach (IGrouping <TelemetryItemTypes, TelemetryItem> typeGrouping in typeGroupings)
                {
                    if (typeGrouping.Key == TelemetryItemTypes.Exception)
                    {
                        AddExceptions(work, program, typeGrouping, clientAppUser);
                    }
                    else if (typeGrouping.Key == TelemetryItemTypes.LogMessage)
                    {
                        AddLogs(work, program, typeGrouping);
                    }
                    else
                    {
                        await AddTelemetries(work, program, ipAddress, typeGrouping, clientAppUser, summaries).ConfigureAwait(false);
                    }
                }

                await work.CompleteAsync().ConfigureAwait(false);

                return(summaries);
            }

            return(null);
        }
        public static async Task <ClientAppUser> GetUserOrAddIfMissing(ITelemetryUnitOfWork work, TelemetryItem item, string ip)
        {
            ClientAppUser user = null;

            if (!string.IsNullOrEmpty(item.AuthenticatedUserIdentifier))
            {
                user = await work.ClientAppUsers.FirstOrDefaultAsync(x => x.AuthenticatedUserIdentifier == item.AuthenticatedUserIdentifier).ConfigureAwait(false);
            }

            if (user == null)
            {
                user = await work.ClientAppUsers.FirstOrDefaultAsync(x => x.UserIdentifier == item.UserIdentifier).ConfigureAwait(false);
            }

            if (user == null)
            {
                user = new ClientAppUser();
                user.UserIdentifier = item.UserIdentifier ?? "";
                user.AuthenticatedUserIdentifier = item.AuthenticatedUserIdentifier;
                user.FirstSeenDate = DateTime.UtcNow;
                user.IpAddresses.Add(ip);
                work.ClientAppUsers.Add(user);
            }
            else
            {
                if (!user.IpAddresses.Contains(ip))
                {
                    user.IpAddresses.Add(ip);
                }
            }
            return(user);
        }
Esempio n. 3
0
        public async Task AddUserInfo(ClientAppUser objectToAdd)
        {
            objectToAdd.RegisteredDate = DateTime.UtcNow;

            this.DbContext.AppUsers.Add(objectToAdd);
            await this.DbContext.SaveChangesAsync();
        }
        public static TelemetrySummary GetTelemetrySummary(ClientAppUser clientAppUser, ITelemetryAware component)
        {
            TelemetrySummary summary = component.GetTelemetrySummary(clientAppUser.Id);

            if (summary == null)
            {
                summary = component.AddTelemetrySummary(clientAppUser.Id);
            }

            return(summary);
        }
        public async Task <TelemetryInitializeResponse> Initialize(TelemetryInitializeRequest request)
        {
            try
            {
                Stopwatch sw = Stopwatch.StartNew();

                if (!ApiRequestsValidator.IsRequestValid(request))
                {
                    return(new TelemetryInitializeResponse()
                    {
                        Exception = new BadRequestException("Request is not valid")
                    });
                }

                TelemetryRootObject program = await work.GetMonitoredProgram(request.TelemetryKey).ConfigureAwait(false);

                if (program == null)
                {
                    {
                        return(new TelemetryInitializeResponse {
                            Exception = new InvalidOperationException($"Program [{request.TelemetryKey}] is null")
                        });
                    }
                }

                string        ip            = "0.0.0.0";
                ClientAppUser clientAppUser = await TelemetryControllerHelpers.GetUserOrAddIfMissing(this.work, request.UserInfo, ip).ConfigureAwait(false);

                await this.work.CompleteAsync().ConfigureAwait(false);

                TelemetryInitializeResponse response = new TelemetryInitializeResponse {
                    UserId = clientAppUser.PublicId
                };
                sw.Stop();
                this.telemetryClient.TrackEvent("Initialize", new Dictionary <string, string>()
                {
                    { $"ProgramName", request.ProgramInfo?.Name },
                    { $"ExecutionTime", sw.ElapsedMilliseconds.ToString() },
                    { $"ProgramId", program.ProgramId.ToString() },
                    { $"TelemetryKey", program.TelemetryKey.ToString() },
                });
                return(response);
            }
            catch (Exception ex)
            {
                return(new TelemetryInitializeResponse {
                    Exception = new InvalidOperationException("Error while processing telemetry initialize request", ex)
                });
            }
        }
        private static void AddExceptions(ITelemetryUnitOfWork work, TelemetryRootObject program, IGrouping <TelemetryItemTypes, TelemetryItem> typeGrouping
                                          , ClientAppUser clientAppUser)
        {
            foreach (TelemetryItem telemetryItem in typeGrouping)
            {
                foreach (TelemetryItem.ExceptionInfo telemetryItemException in telemetryItem.Exceptions)
                {
                    var exception = new ExceptionInfo
                    {
                        Timestamp          = telemetryItem.Timestamp
                        , ProgramId        = program.ProgramId
                        , ProgramVersion   = telemetryItem.VersionData.FileVersion
                        , UserName         = clientAppUser.UserIdentifier
                        , Sequence         = telemetryItem.Sequence
                        , ExceptionId      = telemetryItemException.Id
                        , ExceptionOuterId = telemetryItemException.OuterId
                        , HasFullStack     = telemetryItemException.HasFullStack
                        , Message          = telemetryItemException.Message
                        , Note             = GetExceptionNote(telemetryItem.Properties)
                        , TypeName         = telemetryItemException.TypeName
                        , ParsedStack      = JsonConvert.SerializeObject(telemetryItemException.ParsedStack)
                    };
                    if (telemetryItem.Properties != null && telemetryItem.Properties.Any())
                    {
                        foreach (KeyValuePair <string, string> unit in telemetryItem.Properties)
                        {
                            ExceptionTelemetryUnit telemetryUnit = new ExceptionTelemetryUnit {
                                Key = unit.Key, ValueString = unit.Value?.ToString(), UnitType = TelemetryUnit.UnitTypes.Property
                            };
                            ((List <ExceptionTelemetryUnit>)exception.TelemetryUnits).Add(telemetryUnit);
                        }
                    }
                    if (telemetryItem.Measurements != null && telemetryItem.Measurements.Any())
                    {
                        foreach (KeyValuePair <string, double> unit in telemetryItem.Measurements)
                        {
                            ExceptionTelemetryUnit telemetryUnit = new ExceptionTelemetryUnit {
                                Key = unit.Key, ValueDouble = unit.Value, UnitType = TelemetryUnit.UnitTypes.Metric
                            };
                            ((List <ExceptionTelemetryUnit>)exception.TelemetryUnits).Add(telemetryUnit);
                        }
                    }

                    work.Exceptions.Add(exception);
                }
            }
        }
Esempio n. 7
0
        public async Task <IActionResult> OnPostAsync(string returnUrl = null)
        {
            returnUrl      = returnUrl ?? Url.Content("~/");
            ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
            if (ModelState.IsValid)
            {
                var user = new ClientAppUser {
                    UserName = Input.Email, Email = Input.Email
                };
                var result = await _userManager.CreateAsync(user, Input.Password);

                if (result.Succeeded)
                {
                    _logger.LogInformation("User created a new account with password.");

                    var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);

                    code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
                    var callbackUrl = Url.Page(
                        "/Account/ConfirmEmail",
                        pageHandler: null,
                        values: new { area = "Identity", userId = user.Id, code = code, returnUrl = returnUrl },
                        protocol: Request.Scheme);

                    await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
                                                      $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");

                    if (_userManager.Options.SignIn.RequireConfirmedAccount)
                    {
                        return(RedirectToPage("RegisterConfirmation", new { email = Input.Email, returnUrl = returnUrl }));
                    }
                    else
                    {
                        await _signInManager.SignInAsync(user, isPersistent : false);

                        return(LocalRedirect(returnUrl));
                    }
                }
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }

            // If we got this far, something failed, redisplay form
            return(Page());
        }
        public static async Task <ClientAppUser> GetUserOrAddIfMissing(ITelemetryUnitOfWork work, UserInfo userDto, string ip)
        {
            ClientAppUser user = await work.ClientAppUsers.FirstOrDefaultAsync(x => x.UserIdentifier == userDto.UserIdentifier).ConfigureAwait(false);

            if (user == null)
            {
                user = Mapper.Map <ClientAppUser>(userDto);
                user.FirstSeenDate = DateTime.UtcNow;
                user.IpAddresses.Add(ip);
                work.ClientAppUsers.Add(user);
            }
            else
            {
                if (!user.IpAddresses.Contains(ip))
                {
                    user.IpAddresses.Add(ip);
                }
            }
            return(user);
        }
Esempio n. 9
0
        public async Task <TelemetryInitializeResponse> Initialize(TelemetryInitializeRequest request)
        {
            try
            {
                if (!ApiRequestsValidator.IsRequestValid(request))
                {
                    return(new TelemetryInitializeResponse()
                    {
                        Exception = new BadRequestException("Request is not valid")
                    });
                }

                TelemetryRootObject program = await work.GetMonitoredProgram(request.TelemetryKey).ConfigureAwait(false);

                if (program == null)
                {
                    {
                        return(new TelemetryInitializeResponse {
                            Exception = new InvalidOperationException($"Program [{request.TelemetryKey}] is null")
                        });
                    }
                }

                string        ip            = this.Request.GetClientIp();
                ClientAppUser clientAppUser = await TelemetryControllerHelpers.GetUserOrAddIfMissing(this.work, request.UserInfo, ip).ConfigureAwait(false);

                await this.work.CompleteAsync().ConfigureAwait(false);

                TelemetryInitializeResponse response = new TelemetryInitializeResponse {
                    UserId = clientAppUser.PublicId
                };
                return(response);
            }
            catch (Exception ex)
            {
                return(new TelemetryInitializeResponse {
                    Exception = new InvalidOperationException("Error while processing telemetry initialize request", ex)
                });
            }
        }
        public async Task TestEventsVariousUsers()
        {
            TelemetryUnitOfWork unit = new TelemetryUnitOfWork(this.TelemetryContext, this.PortalContext, new AssemblyStreamVersionReader());
            List <KeyValuePair <string, Guid> > apps = await Helpers.SeedInitialPrograms(this.PortalContext, this.TelemetryContext, 2, "TestApp", new[] { "Billy Jean", "Jack Black" });

            Helpers.GetProgramAndUser(unit, "TestApp", "Billy Jean", out TelemetryRootObject prg, out ClientAppUser usr);

            TelemetryItem telemetryItem = new TelemetryItem()

            {
                EntryKey          = Helpers.GetName("Func1"),
                TelemetryItemType = TelemetryItemTypes.Event,
                Sequence          = "aaa:1",
                VersionData       = new VersionData("1.2.3.4", "2.0.0.0"),
                Timestamp         = new DateTimeOffset(DateTime.UtcNow),
                Properties        = new Dictionary <string, string> {
                    { "AKey", "AValue" }, { "AKey2", "AValue2" }
                },
                UserIdentifier = usr.UserIdentifier
            };

            List <TelemetrySummary> result = await TelemetryControllerHelpers.InsertData(unit, (new[] { telemetryItem }).ToList(), prg, "127.1.1.1");

            Event @event = prg.Events.Single();

            Guid eventId = this.TelemetryContext.Events.FirstOrDefault(x => x.Name == @event.Name).Id;

            Helpers.AssertUpdateResponse(result, prg, usr, 1, Helpers.GetName("Func1"), eventId);

            Assert.AreEqual(1, prg.Events.Count);
            Assert.AreEqual(Helpers.GetName("Func1"), @event.Name);
            Assert.AreEqual(1, @event.TelemetrySummaries.Count);
            Assert.AreEqual(prg.ProgramId, @event.ProgramId);

            TelemetrySummary summary = @event.GetTelemetrySummary(this.GetUserByGuid(result.First().ClientAppUser.Id).Id);

            Assert.AreEqual(usr.Id, summary.ClientAppUserId);

            TelemetryDetail detail = @event.GetTelemetryDetails(this.GetUserByGuid(result.First().ClientAppUser.Id).Id).Single();

            Assert.AreEqual(detail.GetTelemetrySummary().Id, summary.Id);
            Assert.AreEqual(usr.Id, detail.GetTelemetrySummary().ClientAppUserId);
            Assert.AreEqual(usr.UserIdentifier, detail.UserIdentifier);
            Assert.AreEqual(2, detail.GetTelemetryUnits().Count());
            Assert.AreEqual("AKey", detail.GetTelemetryUnits().ElementAt(0).Key);
            Assert.AreEqual("AValue", detail.GetTelemetryUnits().ElementAt(0).ValueString);
            Assert.AreEqual("AKey2", detail.GetTelemetryUnits().ElementAt(1).Key);
            Assert.AreEqual("AValue2", detail.GetTelemetryUnits().ElementAt(1).ValueString);


            ClientAppUser otherUser = Helpers.GetUser(unit, "Jack Black");

            telemetryItem = new TelemetryItem()

            {
                EntryKey          = Helpers.GetName("Func1"),
                TelemetryItemType = TelemetryItemTypes.Event,
                Sequence          = "aaa:1",
                VersionData       = new VersionData("1.2.3.4", "2.0.0.0"),
                Timestamp         = new DateTimeOffset(DateTime.UtcNow),
                Properties        = new Dictionary <string, string> {
                    { "AKey3", "AValue3" }, { "AKey4", "AValue4" }, { "AKey5", "AValue5" }
                },
                UserIdentifier = otherUser.UserIdentifier
            };

            result = await TelemetryControllerHelpers.InsertData(unit, (new[] { telemetryItem }).ToList(), prg, "127.1.1.1");

            Helpers.AssertUpdateResponse(result, prg, otherUser, 1, Helpers.GetName("Func1"), eventId);

            prg = await unit.GetMonitoredProgram(prg.TelemetryKey);

            Assert.AreEqual(1, prg.Events.Count);
            @event = prg.Events.Single();
            Assert.AreEqual(Helpers.GetName("Func1"), @event.Name);
            Assert.AreEqual(2, @event.TelemetrySummaries.Count);
            Assert.AreEqual(1, @event.GetTelemetrySummary(this.GetUserByGuid(result.First().ClientAppUser.Id).Id).SummaryCount);
            Assert.AreEqual(1, summary.GetTelemetryDetails().Count());

            Assert.AreNotEqual(otherUser.Id, usr.Id);

            TelemetrySummary otherSummary = @event.GetTelemetrySummary(this.GetUserByGuid(result.First().ClientAppUser.Id).Id);

            Assert.AreEqual(otherUser.Id, otherSummary.ClientAppUserId);

            TelemetryDetail otherUserDetail = @event.GetTelemetryDetails(this.GetUserByGuid(result.First().ClientAppUser.Id).Id).Single();

            Assert.AreEqual(otherUser.Id, otherUserDetail.GetTelemetrySummary().ClientAppUserId);
            Assert.AreEqual(otherUser.UserIdentifier, otherUserDetail.UserIdentifier);
            Assert.AreEqual(3, otherUserDetail.GetTelemetryUnits().Count());
            Assert.AreEqual("AKey3", otherUserDetail.GetTelemetryUnits().ElementAt(0).Key);
            Assert.AreEqual("AValue3", otherUserDetail.GetTelemetryUnits().ElementAt(0).ValueString);
            Assert.AreEqual("AKey5", otherUserDetail.GetTelemetryUnits().ElementAt(2).Key);
            Assert.AreEqual("AValue5", otherUserDetail.GetTelemetryUnits().ElementAt(2).ValueString);

            telemetryItem = new TelemetryItem()

            {
                EntryKey          = Helpers.GetName("Func1"),
                TelemetryItemType = TelemetryItemTypes.Event,
                Sequence          = "aaa:1",
                VersionData       = new VersionData("1.2.3.4", "2.0.0.0"),
                Timestamp         = new DateTimeOffset(DateTime.UtcNow),
                Properties        = new Dictionary <string, string> {
                    { "AKey", "AValue" }, { "AKey2", "AValue2" }
                },
                UserIdentifier = usr.UserIdentifier
            };

            //run again with first user
            result = await TelemetryControllerHelpers.InsertData(unit, (new[] { telemetryItem }).ToList(), prg, "127.1.1.1");

            @event = prg.Events.Single();
            Assert.AreEqual(2, @event.TelemetrySummaries.Count);
            Assert.AreEqual(2, @event.GetTelemetrySummary(this.GetUserByGuid(result.First().ClientAppUser.Id).Id).SummaryCount);
            Assert.AreEqual(2, summary.GetTelemetryDetails().Count());


            List <EventTelemetryDetail> details = @event.GetTelemetryDetails(this.GetUserByGuid(result.First().ClientAppUser.Id).Id).OrderBy(x => x.Timestamp)
                                                  .Cast <EventTelemetryDetail>().ToList();

            Assert.AreEqual(2, details.Count);
            Assert.IsTrue(details.All(x => x.TelemetrySummary.ClientAppUserId == this.GetUserByGuid(result.First().ClientAppUser.Id).Id));
            Assert.IsTrue(details.First().Timestamp < details.Last().Timestamp);

            Assert.AreEqual(3, this.TelemetryContext.EventTelemetryDetails.Count(x => x.TelemetrySummary.Event.Name == telemetryItem.EntryKey));
            Assert.AreEqual(2, this.TelemetryContext.EventTelemetryDetails.Count(x => x.TelemetrySummaryId == summary.Id));
        }
Esempio n. 11
0
        public static void AssertUpdateResponse(List <TelemetrySummary> response, TelemetryRootObject prg, ClientAppUser usr,
                                                int expectedSummariesCount, string funcName = null, Guid funcId = default(Guid))
        {
            Assert.AreEqual(expectedSummariesCount, response.Count);
            Assert.AreEqual(1, response.Count(x => x.GetComponent().Name == funcName));
            if (funcId != Guid.Empty)
            {
                Assert.AreEqual(1, response.Count(x => x.GetComponent().Id == funcId));
            }

            Assert.IsTrue(response.All(x => x.GetComponent().Program.TelemetryKey == prg.TelemetryKey));
            Assert.IsTrue(response.All(x => x.ClientAppUser.Id == usr.Id));
        }
Esempio n. 12
0
        public static void GetProgramAndUser(TelemetryUnitOfWork unit, string programName, string userName, out TelemetryRootObject prg, out ClientAppUser usr
                                             , [CallerMemberName] string methodIdentifier = "")
        {
            string prgName = GetName(programName, methodIdentifier);
            var    p       = unit.Programs.GetByNames("SeedInitialProgramsSomeDeveloper", prgName).GetAwaiter().GetResult();

            prg = unit.GetMonitoredProgram(p.TelemetryKey).Result;
            usr = GetUser(unit, userName, methodIdentifier);
        }
        private static async Task AddTelemetries(ITelemetryUnitOfWork work, TelemetryRootObject program, string ipAddress
                                                 , IGrouping <TelemetryItemTypes, TelemetryItem> typeGrouping, ClientAppUser clientAppUser, List <TelemetrySummary> summaries)
        {
            foreach (IGrouping <string, TelemetryItem> keyGroupings in typeGrouping.GroupBy(x => x.EntryKey))
            {
                ITelemetryAware trackedComponent = await GetTrackedComponent(work, typeGrouping.Key, keyGroupings.Key, program)
                                                   .ConfigureAwait(false);

                TelemetrySummary summary = GetTelemetrySummary(clientAppUser, trackedComponent);
                foreach (TelemetryItem telemetryItem in keyGroupings)
                {
                    summary.UpdateTelemetry(keyGroupings.First().VersionData, ipAddress, telemetryItem);
                }

                summaries.Add(summary);
            }
        }
Esempio n. 14
0
 public ViewTelemetrySummary GetUsage(View view, ClientAppUser clientAppUser)
 {
     return(this.TelimenaPortalContext.ViewTelemetrySummaries.FirstOrDefault(x => x.View.Id == view.Id && x.ClientAppUserId == clientAppUser.Id));
 }
Esempio n. 15
0
        public static void GetProgramAndUser(TelemetryUnitOfWork unit, string programName, string userName, out TelemetryRootObject prg, out ClientAppUser usr
                                             , [CallerMemberName] string methodIdentifier = "")
        {
            string prgName = GetName(programName, methodIdentifier);
            var    p       = unit.GetProgramFirstOrDefault(x => x.Name == prgName).GetAwaiter().GetResult();

            prg = unit.GetMonitoredProgram(p.TelemetryKey).Result;
            usr = GetUser(unit, userName, methodIdentifier);
        }