From 2d40f011d1438daffce06966793b92945c94e953 Mon Sep 17 00:00:00 2001 From: kdysput Date: Thu, 23 Jun 2022 00:18:29 +0200 Subject: [PATCH 1/3] WiP --- Runtime/BacktraceDatabase.cs | 14 +++++++++- .../Model/Breadcrumbs/BacktraceBreadcrumbs.cs | 6 +++++ .../IArchiveableBreadcrumbManager.cs | 11 ++++++++ .../IArchiveableBreadcrumbManager.cs.meta | 11 ++++++++ .../Storage/BacktraceStorageLogManager.cs | 26 +++++++++++++++++-- 5 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs create mode 100644 Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs.meta diff --git a/Runtime/BacktraceDatabase.cs b/Runtime/BacktraceDatabase.cs index d336fe57..f87bc546 100644 --- a/Runtime/BacktraceDatabase.cs +++ b/Runtime/BacktraceDatabase.cs @@ -622,7 +622,19 @@ protected virtual void LoadReports() { return; } - var files = BacktraceDatabaseFileContext.GetRecords(); + var files = BacktraceDatabaseFileContext.GetRecords().ToArray(); + if(files.Length == 0) + { + return; + } + string breadcrumbPath = string.Empty; + string breadcrumbArchive = string.Empty; + + if(Breadcrumbs != null) + { + breadcrumbPath = Breadcrumbs.GetBreadcrumbLogPath(); + breadcrumbArchive = Breadcrumbs.Archi + } foreach (var file in files) { var record = BacktraceDatabaseRecord.ReadFromFile(file); diff --git a/Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs b/Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs index 3312d03d..0b74f874 100644 --- a/Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs +++ b/Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs @@ -29,6 +29,7 @@ internal sealed class BacktraceBreadcrumbs : IBacktraceBreadcrumbs /// Determine if breadcrumbs are enabled /// private bool _enabled = false; + public BacktraceBreadcrumbs(IBacktraceLogManager logManager, BacktraceBreadcrumbType level, UnityEngineLogLevel unityLogLevel) { BreadcrumbsLevel = level; @@ -191,5 +192,10 @@ public static bool CanStoreBreadcrumbs(UnityEngineLogLevel logLevel, BacktraceBr { return backtraceBreadcrumbsLevel != BacktraceBreadcrumbType.None && logLevel != UnityEngineLogLevel.None; } + public string Archive() + { + return LogManager.Archive() + + } } } diff --git a/Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs b/Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs new file mode 100644 index 00000000..3944f8ab --- /dev/null +++ b/Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs @@ -0,0 +1,11 @@ +namespace Backtrace.Unity.Model.Breadcrumbs +{ + internal interface IArchiveableBreadcrumbManager + { + /// + /// Archive current breadcrumb file + /// + /// Path to the archived breadcurmb file if archiving process went successfully. Otherwise empty string. + string Archive(); + } +} diff --git a/Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs.meta b/Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs.meta new file mode 100644 index 00000000..dfe52480 --- /dev/null +++ b/Runtime/Model/Breadcrumbs/IArchiveableBreadcrumbManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 11e0df6317b5a1e499757f8c0a743a58 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs b/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs index 6b69b236..45e79053 100644 --- a/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs +++ b/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs @@ -7,7 +7,7 @@ namespace Backtrace.Unity.Model.Breadcrumbs.Storage { - internal sealed class BacktraceStorageLogManager : IBacktraceLogManager + internal sealed class BacktraceStorageLogManager : IBacktraceLogManager, IArchiveableBreadcrumbManager { /// /// Path to the breadcrumbs file @@ -86,6 +86,11 @@ public long BreadcrumbsSize /// private readonly Queue _logSize = new Queue(); + /// + /// Breadcrumb storage directory + /// + private readonly string _storagePath; + internal IBreadcrumbFile BreadcrumbFile { get; set; } public BacktraceStorageLogManager(string storagePath) @@ -94,7 +99,8 @@ public BacktraceStorageLogManager(string storagePath) { throw new ArgumentException("Breadcrumbs storage path is null or empty"); } - BreadcrumbsFilePath = Path.Combine(storagePath, BreadcrumbLogFileName); + _storagePath = storagePath; + BreadcrumbsFilePath = Path.Combine(_storagePath, BreadcrumbLogFileName); BreadcrumbFile = new BreadcrumbFile(BreadcrumbsFilePath); } @@ -317,5 +323,21 @@ public double BreadcrumbId() { return _breadcrumbId; } + + public string Archive() + { + if (!File.Exists(BreadcrumbsFilePath)) + { + return string.Empty; + } + + var copyPath = Path.Combine(_storagePath, string.Format("{0}-1", BreadcrumbLogFilePrefix)); + if (File.Exists(copyPath)) + { + File.Delete(copyPath); + } + File.Copy(BreadcrumbsFilePath, copyPath); + return copyPath; + } } } From 709dc6ec7a21a8c1bd2466ff72626749b48927a0 Mon Sep 17 00:00:00 2001 From: kdysput Date: Mon, 4 Jul 2022 19:09:44 +0200 Subject: [PATCH 2/3] Finished breadcrumbs multi session support --- Runtime/BacktraceClient.cs | 1 - Runtime/BacktraceDatabase.cs | 20 ++++++++++++++++--- .../Model/Breadcrumbs/BacktraceBreadcrumbs.cs | 15 +++++++++++++- .../Breadcrumbs/IBacktraceBreadcrumbs.cs | 1 + .../Storage/BacktraceStorageLogManager.cs | 3 ++- 5 files changed, 34 insertions(+), 6 deletions(-) diff --git a/Runtime/BacktraceClient.cs b/Runtime/BacktraceClient.cs index 487d5169..4afb4d26 100644 --- a/Runtime/BacktraceClient.cs +++ b/Runtime/BacktraceClient.cs @@ -570,7 +570,6 @@ public void Refresh() } _nativeClient = NativeClientFactory.CreateNativeClient(Configuration, name, _breadcrumbs, scopedAttributes, nativeAttachments); AttributeProvider.AddDynamicAttributeProvider(_nativeClient); - Database.EnableBreadcrumbsSupport(); } } diff --git a/Runtime/BacktraceDatabase.cs b/Runtime/BacktraceDatabase.cs index f87bc546..33646f69 100644 --- a/Runtime/BacktraceDatabase.cs +++ b/Runtime/BacktraceDatabase.cs @@ -265,6 +265,8 @@ private void Start() LoadReports(); // remove orphaned files RemoveOrphaned(); + // enable breadcrumb support after finishing loading reports + EnableBreadcrumbsSupport(); if (DatabaseSettings.AutoSendMode) { _lastConnection = Time.unscaledTime; @@ -623,18 +625,19 @@ protected virtual void LoadReports() return; } var files = BacktraceDatabaseFileContext.GetRecords().ToArray(); - if(files.Length == 0) + if (files.Length == 0) { return; } string breadcrumbPath = string.Empty; string breadcrumbArchive = string.Empty; - if(Breadcrumbs != null) + if (Breadcrumbs != null) { breadcrumbPath = Breadcrumbs.GetBreadcrumbLogPath(); - breadcrumbArchive = Breadcrumbs.Archi + breadcrumbArchive = Breadcrumbs.Archive(); } + var shouldUseArchiveBreadcrumbArchive = !string.IsNullOrEmpty(breadcrumbArchive); foreach (var file in files) { var record = BacktraceDatabaseRecord.ReadFromFile(file); @@ -647,6 +650,17 @@ protected virtual void LoadReports() BacktraceDatabaseFileContext.Delete(record); continue; } + + // Use always the breadcrumb archive instead of the old breadcrumb file. + if (shouldUseArchiveBreadcrumbArchive) + { + bool replacementResult = record.Attachments.Remove(breadcrumbPath); + if (replacementResult) + { + record.Attachments.Add(breadcrumbArchive); + } + } + BacktraceDatabaseContext.Add(record); ValidateDatabaseSize(); record.Unlock(); diff --git a/Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs b/Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs index 0b74f874..26cdabaa 100644 --- a/Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs +++ b/Runtime/Model/Breadcrumbs/BacktraceBreadcrumbs.cs @@ -192,9 +192,22 @@ public static bool CanStoreBreadcrumbs(UnityEngineLogLevel logLevel, BacktraceBr { return backtraceBreadcrumbsLevel != BacktraceBreadcrumbType.None && logLevel != UnityEngineLogLevel.None; } + /// + /// Archives a breadcrumb file from the previous session. + /// + /// + /// Path to the archived breadcrumb library. + /// If the operation failed then the method returns + /// an empty string. + /// public string Archive() { - return LogManager.Archive() + var breadcrumbArchiveManager = LogManager as IArchiveableBreadcrumbManager; + if (breadcrumbArchiveManager == null) + { + return string.Empty; + } + return breadcrumbArchiveManager.Archive(); } } diff --git a/Runtime/Model/Breadcrumbs/IBacktraceBreadcrumbs.cs b/Runtime/Model/Breadcrumbs/IBacktraceBreadcrumbs.cs index 6f5e34b2..3c559f0f 100644 --- a/Runtime/Model/Breadcrumbs/IBacktraceBreadcrumbs.cs +++ b/Runtime/Model/Breadcrumbs/IBacktraceBreadcrumbs.cs @@ -29,5 +29,6 @@ public interface IBacktraceBreadcrumbs double BreadcrumbId(); void UnregisterEvents(); void Update(); + string Archive(); } } diff --git a/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs b/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs index 45e79053..149d23be 100644 --- a/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs +++ b/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs @@ -331,7 +331,8 @@ public string Archive() return string.Empty; } - var copyPath = Path.Combine(_storagePath, string.Format("{0}-1", BreadcrumbLogFilePrefix)); + const string archivePattern = "{0}-1"; + var copyPath = Path.Combine(_storagePath, string.Format(archivePattern, BreadcrumbLogFilePrefix)); if (File.Exists(copyPath)) { File.Delete(copyPath); From ca55b6e5047d10044e594e4c13254063099de49e Mon Sep 17 00:00:00 2001 From: kdysput Date: Thu, 7 Jul 2022 00:07:49 +0200 Subject: [PATCH 3/3] override file if the breadcrumb file exists --- .../Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs b/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs index 149d23be..be6462fd 100644 --- a/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs +++ b/Runtime/Model/Breadcrumbs/Storage/BacktraceStorageLogManager.cs @@ -333,11 +333,7 @@ public string Archive() const string archivePattern = "{0}-1"; var copyPath = Path.Combine(_storagePath, string.Format(archivePattern, BreadcrumbLogFilePrefix)); - if (File.Exists(copyPath)) - { - File.Delete(copyPath); - } - File.Copy(BreadcrumbsFilePath, copyPath); + File.Copy(BreadcrumbsFilePath, copyPath, true); return copyPath; } }