// ReSharper disable once UnusedMember.Global public static ErrorReporter.OnError createSendOnError( SentryAPI.SendOnErrorData sendData, Uri reportingUrl, SentryAPI.ApiKeys keys, bool onlySendUniqueErrors ) { var sentJsonsOpt = onlySendUniqueErrors.opt(() => new HashSet <string>()); return(__data => { var data = new SentryAPI.ErrorData(__data); var msg = message( keys, sendData.appInfo, data, sendData.addExtraData, sendData.userOpt, sendData.staticTags ); Action send = () => msg.send(reportingUrl); sentJsonsOpt.voidFold( send, sentJsons => { if (sentJsons.Add(msg.jsonWithoutTimestamps)) { send(); } else if (Log.isDebug) { Log.rdebug($"Not sending duplicate Sentry msg: {msg}"); } } ); }); }
public static Message message( SentryAPI.ApiKeys keys, ErrorReporter.AppInfo appInfo, SentryAPI.ErrorData data, SentryAPI.ExtraData extraData, Option <SentryAPI.UserInterface> userOpt, IDictionary <string, SentryAPI.Tag> staticTags ) { const string logger = "tlplib-" + nameof(SentryRESTAPI); var eventId = Guid.NewGuid(); var timestamp = DateTime.UtcNow; // The list of frames should be ordered by the oldest call first. // ReSharper disable once ConvertClosureToMethodGroup - MCS bug var stacktraceFrames = data.backtrace.Select(a => backtraceElemToJson(a)).Reverse().ToList(); // Beware of the order! Do not mutate static tags! var tags = SentryAPI.dynamicTags().addAll(staticTags); extraData.addTagsToDictionary(tags); // Extra contextual data is limited to 4096 characters. var extras = SentryAPI.dynamicExtras(); extraData.addExtrasToDictionary(extras); var json = new Dictionary <string, object> { { "message", s(data.message) }, { "level", s(data.logLevel, SentryAPI.LogLevel_.str) }, { "logger", s(logger) }, { "platform", s(Application.platform.ToString()) }, { "release", s(appInfo.bundleVersion) }, { "tags", tags.toDict(_ => _.Key, _ => _.Value.s) }, { "extra", extras }, { "stacktrace", new Dictionary <string, object> { { "frames", stacktraceFrames } } }, { "fingerprint", data.fingerprint } }; foreach (var user in userOpt) { json.Add("user", userInterfaceParametersJson(user)); } foreach (var culprit in data.culprit) { json.Add("culprit", culprit); } return(new Message(keys, eventId, timestamp, json)); }