From 5ed4bee8534ebc9733c60b1aa1661bc9d7e327ee Mon Sep 17 00:00:00 2001 From: Philipp Hofmann Date: Tue, 6 Dec 2022 09:57:05 +0100 Subject: [PATCH] feat: MetricKit TestVersion 1 (#2476) This PR adds a first iteration of sending MetricKitData of MXCrashDiagnostic, MXCPUExceptionDiagnostic, and MXDiskWriteExceptionDiagnostic to Sentry. This PRs aim is to have the code running in the iOS-Swift test app via TestFlight to get some real MetricKit data of MXCPUExceptionDiagnostic, and MXDiskWriteExceptionDiagnostic. MXCrashDiagnostic exists solely for validating the stacktrace symbolication. --- .../iOS-Swift.xcodeproj/project.pbxproj | 6 + Samples/iOS-Swift/iOS-Swift/AppDelegate.swift | 3 + .../iOS-Swift/Base.lproj/Main.storyboard | 32 +- .../iOS-Swift/Tools/DiskWriteException.swift | 75 ++ .../iOS-Swift/iOS-Swift/ViewController.swift | 35 +- .../macOS-Swift.xcodeproj/project.pbxproj | 15 + Sentry.xcodeproj/project.pbxproj | 48 + Sources/Sentry/Public/SentryDefines.h | 6 + Sources/Sentry/Public/SentryOptions.h | 13 + Sources/Sentry/SentryBaseIntegration.m | 9 + Sources/Sentry/SentryDependencyContainer.m | 18 + Sources/Sentry/SentryMetricKitIntegration.m | 190 ++++ Sources/Sentry/SentryOptions.m | 34 +- .../Sentry/include/SentryBaseIntegration.h | 1 + .../include/SentryDependencyContainer.h | 7 +- .../include/SentryMetricKitIntegration.h | 19 + .../MetricKit/SentryMXCallStackTree.swift | 62 ++ Sources/Swift/MetricKit/SentryMXManager.swift | 72 ++ .../metric-kit-callstack-tree-garbage.json | 23 + .../metric-kit-callstack-tree-real.json | 881 ++++++++++++++++++ .../metric-kit-callstack-tree-simple.json | 26 + ...ric-kit-callstack-tree-unknown-fields.json | 27 + .../SentryMXCallStackTreeTests.swift | 76 ++ .../SentryMetricKitIntegrationTests.swift | 144 +++ .../SentryNSURLSessionTaskSearchTests.swift | 2 +- Tests/SentryTests/SentryOptionsTest.m | 6 + .../SentryTests/SentryTests-Bridging-Header.h | 1 + .../TestUtils/TestExtensions.swift | 8 + 28 files changed, 1817 insertions(+), 22 deletions(-) create mode 100644 Samples/iOS-Swift/iOS-Swift/Tools/DiskWriteException.swift create mode 100644 Sources/Sentry/SentryMetricKitIntegration.m create mode 100644 Sources/Sentry/include/SentryMetricKitIntegration.h create mode 100644 Sources/Swift/MetricKit/SentryMXCallStackTree.swift create mode 100644 Sources/Swift/MetricKit/SentryMXManager.swift create mode 100644 Tests/Resources/metric-kit-callstack-tree-garbage.json create mode 100644 Tests/Resources/metric-kit-callstack-tree-real.json create mode 100644 Tests/Resources/metric-kit-callstack-tree-simple.json create mode 100644 Tests/Resources/metric-kit-callstack-tree-unknown-fields.json create mode 100644 Tests/SentryTests/Integrations/MetricKit/SentryMXCallStackTreeTests.swift create mode 100644 Tests/SentryTests/Integrations/MetricKit/SentryMetricKitIntegrationTests.swift diff --git a/Samples/iOS-Swift/iOS-Swift.xcodeproj/project.pbxproj b/Samples/iOS-Swift/iOS-Swift.xcodeproj/project.pbxproj index c1c94c626d..7f48d85272 100644 --- a/Samples/iOS-Swift/iOS-Swift.xcodeproj/project.pbxproj +++ b/Samples/iOS-Swift/iOS-Swift.xcodeproj/project.pbxproj @@ -16,6 +16,8 @@ 637AFDB3243B02770034958B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 637AFDB2243B02770034958B /* Assets.xcassets */; }; 637AFDB6243B02770034958B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 637AFDB4243B02770034958B /* LaunchScreen.storyboard */; }; 7B3427F825876A5200056519 /* Tongariro.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 7B3427F725876A5200056519 /* Tongariro.jpg */; }; + 7B5525B32938B5B5006A2932 /* DiskWriteException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5525B22938B5B5006A2932 /* DiskWriteException.swift */; }; + 7B5525B62938B644006A2932 /* DiskWriteException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B5525B22938B5B5006A2932 /* DiskWriteException.swift */; }; 7B64386B26A6C544000D0F65 /* LaunchUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B64386A26A6C544000D0F65 /* LaunchUITests.swift */; }; 7B79000429028C7300A7F467 /* MetricKitManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B79000329028C7300A7F467 /* MetricKitManager.swift */; }; 7BFC8B0626D4D24B000D3504 /* LoremIpsum.txt in Resources */ = {isa = PBXBuildFile; fileRef = 7BFC8B0526D4D24B000D3504 /* LoremIpsum.txt */; }; @@ -245,6 +247,7 @@ 7B3427F725876A5200056519 /* Tongariro.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = Tongariro.jpg; sourceTree = ""; }; 7B4F33F7271EBD2500C8591E /* SwiftUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUI.swift; sourceTree = ""; }; 7B4F33FA271EBE0C00C8591E /* SwiftUIViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUIViewController.swift; sourceTree = ""; }; + 7B5525B22938B5B5006A2932 /* DiskWriteException.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiskWriteException.swift; sourceTree = ""; }; 7B64386826A6C544000D0F65 /* iOS-SwiftUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "iOS-SwiftUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 7B64386A26A6C544000D0F65 /* LaunchUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchUITests.swift; sourceTree = ""; }; 7B64386C26A6C544000D0F65 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -511,6 +514,7 @@ D8D7BB492750067900044146 /* UIAssert.swift */, D8D7BB4D27501B9400044146 /* SpanObserver.swift */, 84FB812C2840021B00F3A94A /* iOS-Swift-Bridging-Header.h */, + 7B5525B22938B5B5006A2932 /* DiskWriteException.swift */, ); path = Tools; sourceTree = ""; @@ -809,6 +813,7 @@ D8444E4C275E38090042F4DE /* UIViewControllerExtension.swift in Sources */, 637AFDAE243B02760034958B /* ViewController.swift in Sources */, 0AABE2EA28855FF80057ED69 /* PermissionsViewController.swift in Sources */, + 7B5525B32938B5B5006A2932 /* DiskWriteException.swift in Sources */, 84FB8120283EEDB900F3A94A /* PerformanceViewController.swift in Sources */, D8F3D062274EBD4800B56F8C /* SpanExtension.swift in Sources */, 637AFDAA243B02760034958B /* AppDelegate.swift in Sources */, @@ -858,6 +863,7 @@ D8269A4F274C09A400BD5BD5 /* SwiftUI.swift in Sources */, D8444E57275F795D0042F4DE /* UIViewControllerExtension.swift in Sources */, D8F3D058274E57D600B56F8C /* TableViewController.swift in Sources */, + 7B5525B62938B644006A2932 /* DiskWriteException.swift in Sources */, D8269A58274C0FC700BD5BD5 /* ViewController.swift in Sources */, 844DA821282584C300E6B62E /* CoreDataViewController.swift in Sources */, D8444E55275F79570042F4DE /* SpanExtension.swift in Sources */, diff --git a/Samples/iOS-Swift/iOS-Swift/AppDelegate.swift b/Samples/iOS-Swift/iOS-Swift/AppDelegate.swift index eb0d35b200..a75b8981e0 100644 --- a/Samples/iOS-Swift/iOS-Swift/AppDelegate.swift +++ b/Samples/iOS-Swift/iOS-Swift/AppDelegate.swift @@ -19,6 +19,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return event } options.debug = true + if #available(iOS 14.0, *) { + options.enableMetricKit = true + } // Sampling 100% - In Production you probably want to adjust this options.tracesSampleRate = 1.0 options.sessionTrackingIntervalMillis = 5_000 diff --git a/Samples/iOS-Swift/iOS-Swift/Base.lproj/Main.storyboard b/Samples/iOS-Swift/iOS-Swift/Base.lproj/Main.storyboard index f835a85963..c5caddff8b 100644 --- a/Samples/iOS-Swift/iOS-Swift/Base.lproj/Main.storyboard +++ b/Samples/iOS-Swift/iOS-Swift/Base.lproj/Main.storyboard @@ -18,13 +18,13 @@ - + - + - + - + +