public override string GetStackTitle(PersistentEvent ev) { if (!ShouldHandle(ev)) return null; var error = ev.GetSimpleError(); return error?.Message; }
public override SummaryData GetEventSummaryData(PersistentEvent ev) { if (!ShouldHandle(ev)) return null; var stackingTarget = ev.GetStackingTarget(); if (stackingTarget?.Error == null) return null; var data = new Dictionary<string, object> { { "Id", ev.Id }, { "Message", ev.Message } }; if (!String.IsNullOrEmpty(stackingTarget.Error.Type)) { data.Add("Type", stackingTarget.Error.Type.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries).Last()); data.Add("TypeFullName", stackingTarget.Error.Type); } if (stackingTarget.Method != null) { data.Add("Method", stackingTarget.Method.Name); data.Add("MethodFullName", stackingTarget.Method.GetFullName()); } var requestInfo = ev.GetRequestInfo(); if (!String.IsNullOrEmpty(requestInfo?.Path)) data.Add("Path", requestInfo.Path); return new SummaryData { TemplateKey = "event-error-summary", Data = data }; }
public override SummaryData GetEventSummaryData(PersistentEvent ev) { if (!ShouldHandle(ev)) return null; var error = ev.GetError(); var stackingTarget = error?.GetStackingTarget(); if (stackingTarget?.Error == null) return null; dynamic data = new ExpandoObject(); data.Id = ev.Id; data.Message = ev.Message; if (!String.IsNullOrEmpty(stackingTarget.Error.Type)) { data.Type = stackingTarget.Error.Type.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries).Last(); data.TypeFullName = stackingTarget.Error.Type; } if (stackingTarget.Method != null) { data.Method = stackingTarget.Method.Name; data.MethodFullName = stackingTarget.Method.GetFullName(); } var requestInfo = ev.GetRequestInfo(); if (!String.IsNullOrEmpty(requestInfo?.Path)) data.Path = requestInfo.Path; return new SummaryData { TemplateKey = "event-error-summary", Data = data }; }
public override string GetStackTitle(PersistentEvent ev) { if (!ShouldHandle(ev)) return null; return !String.IsNullOrEmpty(ev.Source) ? ev.Source : "(Unknown)"; }
public void ValidateTag(string tag, bool isValid) { var ev = new PersistentEvent { Type = Event.KnownTypes.Error, Date = DateTimeOffset.Now, Id = "123456789012345678901234", OrganizationId = "123456789012345678901234", ProjectId = "123456789012345678901234", StackId = "123456789012345678901234" }; ev.Tags.Add(tag); var result = _validator.Validate(ev); Assert.Equal(isValid, result.IsValid); }
public override SummaryData GetEventSummaryData(PersistentEvent ev) { if (!ShouldHandle(ev)) return null; dynamic data = new ExpandoObject(); data.SessionId = ev.SessionId; if (ev.IsSessionStart()) { data.Value = ev.Value.GetValueOrDefault(); DateTime? endTime = ev.GetSessionEndTime(); if (endTime.HasValue) data.SessionEnd = endTime; } var identity = ev.GetUserIdentity(); if (identity != null) { if (!String.IsNullOrEmpty(identity.Identity)) data.Identity = identity.Identity; if (!String.IsNullOrEmpty(identity.Name)) data.Name = identity.Name; } return new SummaryData { TemplateKey = "event-session-summary", Data = data }; }
public override string GetEventViewName(PersistentEvent ev) { if (!ShouldHandle(ev)) return null; return "Event-Session"; }
public static PersistentEvent GenerateEvent(string[] organizationIds = null, string[] projectIds = null, string[] stackIds = null, DateTimeOffset? startDate = null, DateTimeOffset? endDate = null, DateTimeOffset? occurrenceDate = null, int maxErrorNestingLevel = 0, bool generateTags = true, bool generateData = true, bool isFixed = false, bool isHidden = false, string[] referenceIds = null, string type = null, string sessionId = null, string userIdentity = null, decimal? value = -1, string semver = null) { if (!startDate.HasValue || startDate > DateTimeOffset.Now.AddHours(1)) startDate = DateTimeOffset.Now.AddDays(-30); if (!endDate.HasValue || endDate > DateTimeOffset.Now.AddHours(1)) endDate = DateTimeOffset.Now; var ev = new PersistentEvent { OrganizationId = organizationIds.Random(TestConstants.OrganizationId), ProjectId = projectIds.Random(TestConstants.ProjectId), ReferenceId = referenceIds.Random(), Date = occurrenceDate ?? RandomData.GetDateTimeOffset(startDate, endDate), Value = value.GetValueOrDefault() >= 0 ? value : RandomData.GetDecimal(0, Int32.MaxValue), IsFixed = isFixed, IsHidden = isHidden, StackId = stackIds.Random() }; if (!String.IsNullOrEmpty(userIdentity)) ev.SetUserIdentity(userIdentity); if (generateData) { for (int i = 0; i < RandomData.GetInt(1, 5); i++) { string key = RandomData.GetWord(); while (ev.Data.ContainsKey(key) || key == Event.KnownDataKeys.Error) key = RandomData.GetWord(); ev.Data.Add(key, RandomData.GetWord()); } } if (generateTags) { for (int i = 0; i < RandomData.GetInt(1, 3); i++) { string tag = TestConstants.EventTags.Random(); if (!ev.Tags.Contains(tag)) ev.Tags.Add(tag); } } if (String.IsNullOrEmpty(type) || String.Equals(type, Event.KnownTypes.Error, StringComparison.OrdinalIgnoreCase)) { ev.Type = Event.KnownTypes.Error; // limit error variation so that stacking will occur if (_randomErrors == null) _randomErrors = new List<Error>(Enumerable.Range(1, 25).Select(i => GenerateError(maxErrorNestingLevel))); ev.Data[Event.KnownDataKeys.Error] = _randomErrors.Random(); } else { ev.Type = type.ToLower(); } if (!String.IsNullOrEmpty(sessionId)) ev.SetSessionId(sessionId); if (ev.IsSessionStart()) ev.Value = null; ev.SetVersion(semver); return ev; }
private void UpdateGeoAndlocation(PersistentEvent ev, GeoResult result, bool isValidLocation = true) { ev.Geo = result?.ToString(); if (result != null && isValidLocation) ev.SetLocation(result.ToLocation()); else ev.Data.Remove(Event.KnownDataKeys.Location); }
public async Task WillNotSetLocation() { var plugin = new GeoPlugin(await GetResolverAsync(Log)); var ev = new PersistentEvent { Geo = GREEN_BAY_COORDINATES }; await plugin.EventBatchProcessingAsync(new List<EventContext> { new EventContext(ev) }); Assert.Equal(GREEN_BAY_COORDINATES, ev.Geo); Assert.Null(ev.GetLocation()); }
public EventNotification(EventNotificationWorkItem workItem, PersistentEvent ev) { EventId = workItem.EventId ?? ev.Id; IsNew = workItem.IsNew; IsCritical = workItem.IsCritical; IsRegression = workItem.IsRegression; TotalOccurrences = workItem.TotalOccurrences; ProjectName = workItem.ProjectName; Event = ev; }
public async Task AddManualStackSignatureData(string stackingKey, bool willAddManualStackSignature) { var ev = new PersistentEvent(); ev.SetManualStackingKey(stackingKey); var context = new EventContext(ev); var plugin = new ManualStackingPlugin(); await plugin.EventBatchProcessingAsync(new List<EventContext> { context }); Assert.Equal(willAddManualStackSignature, context.StackSignatureData.Count > 0); }
public async Task WillResetLocation(string geo) { var plugin = new GeoPlugin(await GetResolverAsync(Log)); var ev = new PersistentEvent { Geo = geo }; await plugin.EventBatchProcessingAsync(new List<EventContext> { new EventContext(ev) }); Assert.Null(ev.Geo); Assert.Null(ev.GetLocation()); }
public SummaryData GetEventSummaryData(PersistentEvent ev) { var data = new Dictionary<string, object> { { "Message", GetStackTitle(ev) }, { "Source", ev.Source }, { "Type", ev.Type } }; return new SummaryData { TemplateKey = "event-summary", Data = data }; }
public override string GetStackTitle(PersistentEvent ev) { if (!ShouldHandle(ev)) return null; if (ev.IsSessionHeartbeat()) return "Session Heartbeat"; return ev.IsSessionStart() ? "Session Start" : "Session End"; }
public override SummaryData GetEventSummaryData(PersistentEvent ev) { if (!ShouldHandle(ev)) return null; var data = new Dictionary<string, object> { { "Source", ev.Source } }; AddUserIdentitySummaryData(data, ev.GetUserIdentity()); return new SummaryData { TemplateKey = "event-feature-summary", Data = data }; }
public PersistentEvent GeneratePersistent() { var ev = new PersistentEvent { OrganizationId = "1ecd0826e447ad1e78877555", ProjectId = "1ecd0826e447ad1e78877ab2", StackId = "1ecd0826e447a44e78877ab1", Date = DateTime.UtcNow }; PopulateEvent(ev); return ev; }
protected IEnumerable<string> GetIpAddresses(PersistentEvent ev, RequestInfo request) { if (request != null && !String.IsNullOrWhiteSpace(request.ClientIpAddress)) yield return request.ClientIpAddress; var environmentInfo = ev.GetEnvironmentInfo(); if (environmentInfo == null || String.IsNullOrWhiteSpace(environmentInfo.IpAddress)) yield break; foreach (var ip in environmentInfo.IpAddress.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) yield return ip; }
public override SummaryData GetEventSummaryData(PersistentEvent ev) { var data = new Dictionary<string, object> { { "Message", GetStackTitle(ev) }, { "Source", ev.Source }, { "Type", ev.Type } }; AddUserIdentitySummaryData(data, ev.GetUserIdentity()); return new SummaryData { TemplateKey = "event-summary", Data = data }; }
public async Task WillSetLocationFromGeo() { var plugin = new GeoPlugin(await GetResolverAsync(Log)); var ev = new PersistentEvent { Geo = GREEN_BAY_IP }; await plugin.EventBatchProcessingAsync(new List<EventContext> { new EventContext(ev) }); Assert.NotNull(ev.Geo); Assert.NotEqual(GREEN_BAY_IP, ev.Geo); var location = ev.GetLocation(); Assert.Equal("US", location?.Country); Assert.Equal("WI", location?.Level1); Assert.Equal("Green Bay", location?.Locality); }
private async Task<HeartbeatResult> GetHeartbeatAsync(PersistentEvent sessionStart) { string sessionId = sessionStart.GetSessionId(); if (!String.IsNullOrWhiteSpace(sessionId)) { var result = await GetLastHeartbeatActivityUtcAsync($"project:{sessionStart.ProjectId}:heartbeat:{sessionId.ToSHA1()}"); if (result != null) return result; } var user = sessionStart.GetUserIdentity(); if (String.IsNullOrWhiteSpace(user?.Identity)) return null; return await GetLastHeartbeatActivityUtcAsync($"project:{sessionStart.ProjectId}:heartbeat:{user.Identity.ToSHA1()}"); }
public WebHookDataContext(Version version, PersistentEvent ev, Organization organization = null, Project project = null, Stack stack = null, bool isNew = false, bool isRegression = false) { if (version == null) throw new ArgumentException("Version cannot be null.", "version"); if (ev == null) throw new ArgumentException("Event cannot be null.", "ev"); Version = version; Organization = organization; Project = project; Stack = stack; Event = ev; IsNew = isNew; IsRegression = isRegression; }
private IEnumerable<string> GetIpAddresses(PersistentEvent ev) { if (!String.IsNullOrEmpty(ev.Geo) && (ev.Geo.Contains(".") || ev.Geo.Contains(":"))) yield return ev.Geo; var request = ev.GetRequestInfo(); if (!String.IsNullOrWhiteSpace(request?.ClientIpAddress)) yield return request.ClientIpAddress; var environmentInfo = ev.GetEnvironmentInfo(); if (String.IsNullOrWhiteSpace(environmentInfo?.IpAddress)) yield break; foreach (var ip in environmentInfo.IpAddress.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) yield return ip; }
public override SummaryData GetEventSummaryData(PersistentEvent ev) { if (!ShouldHandle(ev)) return null; dynamic data = new ExpandoObject(); data.Message = ev.Message; data.Source = ev.Source; data.Type = ev.Type; object temp; string level = ev.Data.TryGetValue(Event.KnownDataKeys.Level, out temp) ? temp as string : null; if (!String.IsNullOrWhiteSpace(level)) data.Level = level.Trim(); return new SummaryData { TemplateKey = "event-log-summary", Data = data }; }
public override SummaryData GetEventSummaryData(PersistentEvent ev) { if (!ShouldHandle(ev)) return null; var data = new Dictionary<string, object> { { "SessionId", ev.GetSessionId() }, { "Type", ev.Type } }; AddUserIdentitySummaryData(data, ev.GetUserIdentity()); if (ev.IsSessionStart()) { data.Add("Value", ev.Value.GetValueOrDefault()); DateTime? endTime = ev.GetSessionEndTime(); if (endTime.HasValue) data.Add("SessionEnd", endTime); } return new SummaryData { TemplateKey = "event-session-summary", Data = data }; }
public override SummaryData GetEventSummaryData(PersistentEvent ev) { if (!ShouldHandle(ev)) return null; var data = new Dictionary<string, object> { { "Message", ev.Message } }; if (!String.IsNullOrWhiteSpace(ev.Source)) { data.Add("Source", ev.Source); string truncatedSource = ev.Source.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries).Last(); if (!String.Equals(ev.Source, truncatedSource)) data.Add("SourceShortName", truncatedSource); } object temp; string level = ev.Data.TryGetValue(Event.KnownDataKeys.Level, out temp) ? temp as string : null; if (!String.IsNullOrWhiteSpace(level)) data.Add("Level", level.Trim()); return new SummaryData { TemplateKey = "event-log-summary", Data = data }; }
public override SummaryData GetEventSummaryData(PersistentEvent ev) { if (!ShouldHandle(ev)) return null; var error = ev.GetSimpleError(); if (error == null) return null; var data = new Dictionary<string, object> { { "Message", ev.Message } }; if (!String.IsNullOrEmpty(error.Type)) { data.Add("Type", error.Type.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries).Last()); data.Add("TypeFullName", error.Type); } var requestInfo = ev.GetRequestInfo(); if (!String.IsNullOrEmpty(requestInfo?.Path)) data.Add("Path", requestInfo.Path); return new SummaryData { TemplateKey = "event-simple-summary", Data = data }; }
public SlackAttachment(PersistentEvent ev) { TimeStamp = ev.Date.ToUnixTimeSeconds(); var ud = ev.GetUserDescription(); var ui = ev.GetUserIdentity(); Text = ud?.Description; string displayName = null; if (!String.IsNullOrEmpty(ui?.Identity)) { displayName = ui.Identity; } if (!String.IsNullOrEmpty(ui?.Name)) { displayName = ui.Name; } if (!String.IsNullOrEmpty(displayName) && !String.IsNullOrEmpty(ud?.EmailAddress)) { displayName = $"{displayName} ({ud.EmailAddress})"; } else if (!String.IsNullOrEmpty(ui?.Identity) && !String.IsNullOrEmpty(ui.Name)) { displayName = $"{ui.Name} ({ui.Identity})"; } if (!String.IsNullOrEmpty(displayName)) { AuthorName = displayName; if (!String.IsNullOrEmpty(ud?.EmailAddress)) { AuthorLink = $"mailto:{ud.EmailAddress}?body={ud.Description}"; //AuthorIcon = $"https://www.gravatar.com/avatar/{ud.EmailAddress.ToMD5()}", } } }
public override SummaryData GetEventSummaryData(PersistentEvent ev) { if (!ShouldHandle(ev)) return null; var error = ev.GetSimpleError(); if (error == null) return null; dynamic data = new ExpandoObject(); data.Message = ev.Message; if (!String.IsNullOrEmpty(error.Type)) { data.Type = error.Type.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries).Last(); data.TypeFullName = error.Type; } var requestInfo = ev.GetRequestInfo(); if (!String.IsNullOrEmpty(requestInfo?.Path)) data.Path = requestInfo.Path; return new SummaryData { TemplateKey = "event-simple-summary", Data = data }; }
public override SummaryData GetEventSummaryData(PersistentEvent ev) { if (!ShouldHandle(ev)) return null; var data = new Dictionary<string, object> { { "Message", ev.Message } }; AddUserIdentitySummaryData(data, ev.GetUserIdentity()); if (!String.IsNullOrWhiteSpace(ev.Source)) { data.Add("Source", ev.Source); var parts = ev.Source.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length > 1 && !String.Equals(ev.Source, parts.Last()) && parts.All(p => p.IsValidIdentifier())) data.Add("SourceShortName", parts.Last()); } object temp; string level = ev.Data.TryGetValue(Event.KnownDataKeys.Level, out temp) ? temp as string : null; if (!String.IsNullOrWhiteSpace(level)) data.Add("Level", level.Trim()); return new SummaryData { TemplateKey = "event-log-summary", Data = data }; }
public EventContext(PersistentEvent ev) { Event = ev; StackSignatureData = new Dictionary<string, string>(); }