예제 #1
0
파일: SentryAPI.cs 프로젝트: Marwan0/tlplib
        // 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}");
                    }
                }
                    );
            });
        }
예제 #2
0
파일: SentryAPI.cs 프로젝트: Marwan0/tlplib
        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));
        }