mirror of
https://github.com/wwiinnddyy/LanMountainDesktop.git
synced 2026-06-22 00:54:26 +08:00
0.7.2
This commit is contained in:
@@ -8,7 +8,6 @@ using LanMountainDesktop.DesktopHost;
|
||||
using LanMountainDesktop.Models;
|
||||
using LanMountainDesktop.Services;
|
||||
using LanMountainDesktop.Services.Settings;
|
||||
using Sentry;
|
||||
|
||||
namespace LanMountainDesktop;
|
||||
|
||||
@@ -21,11 +20,6 @@ sealed class Program
|
||||
{
|
||||
AppLogger.Initialize();
|
||||
RegisterGlobalExceptionLogging();
|
||||
DesktopBootstrap.InitializeStartupServices(
|
||||
InitializeDeviceId,
|
||||
InitializeCrashReporting,
|
||||
InitializeUserBehaviorAnalytics,
|
||||
ScheduleWhiteboardNoteStartupCleanup);
|
||||
var restartParentProcessId = AppRestartService.TryGetRestartParentProcessId(args);
|
||||
|
||||
using var singleInstance = AcquireSingleInstance(restartParentProcessId);
|
||||
@@ -44,6 +38,12 @@ sealed class Program
|
||||
return;
|
||||
}
|
||||
|
||||
DesktopBootstrap.InitializeStartupServices(
|
||||
InitializeTelemetryIdentity,
|
||||
InitializeCrashTelemetry,
|
||||
InitializeUsageTelemetry,
|
||||
ScheduleWhiteboardNoteStartupCleanup);
|
||||
|
||||
var diagnostics = StartupDiagnosticsService.Run(args);
|
||||
StartupDiagnosticsService.ShowLegacyExecutableWarningIfNeeded(diagnostics);
|
||||
|
||||
@@ -53,7 +53,6 @@ sealed class Program
|
||||
StartupRenderMode = renderMode;
|
||||
AppLogger.Info("Startup", $"Resolved render mode '{renderMode}'.");
|
||||
App.CurrentSingleInstanceService = singleInstance;
|
||||
App.AnalyticsServices = (_userBehaviorAnalyticsService, _crashReportService);
|
||||
BuildAvaloniaApp(renderMode).StartWithClassicDesktopLifetime(args);
|
||||
AppLogger.Info("Startup", "Application exited normally.");
|
||||
}
|
||||
@@ -185,204 +184,90 @@ sealed class Program
|
||||
{
|
||||
AppDomain.CurrentDomain.UnhandledException += (_, eventArgs) =>
|
||||
{
|
||||
var exception = eventArgs.ExceptionObject as Exception
|
||||
?? new Exception(eventArgs.ExceptionObject?.ToString() ?? "Unhandled exception.");
|
||||
|
||||
AppLogger.Critical(
|
||||
"UnhandledException",
|
||||
$"Unhandled exception. IsTerminating={eventArgs.IsTerminating}",
|
||||
eventArgs.ExceptionObject as Exception);
|
||||
exception);
|
||||
|
||||
if (eventArgs.IsTerminating)
|
||||
try
|
||||
{
|
||||
SentrySdk.Flush(TimeSpan.FromSeconds(5));
|
||||
TelemetryServices.Crash?.CaptureUnhandledException(
|
||||
exception,
|
||||
"AppDomain.UnhandledException",
|
||||
eventArgs.IsTerminating);
|
||||
}
|
||||
catch (Exception telemetryException)
|
||||
{
|
||||
AppLogger.Warn("UnhandledException", "Failed to forward unhandled exception to crash telemetry.", telemetryException);
|
||||
}
|
||||
};
|
||||
|
||||
TaskScheduler.UnobservedTaskException += (_, eventArgs) =>
|
||||
{
|
||||
AppLogger.Error("TaskScheduler", "Unobserved task exception.", eventArgs.Exception);
|
||||
|
||||
try
|
||||
{
|
||||
TelemetryServices.Crash?.CaptureTaskException(
|
||||
eventArgs.Exception,
|
||||
"TaskScheduler.UnobservedTaskException");
|
||||
}
|
||||
catch (Exception telemetryException)
|
||||
{
|
||||
AppLogger.Warn("TaskScheduler", "Failed to forward task exception to crash telemetry.", telemetryException);
|
||||
}
|
||||
|
||||
eventArgs.SetObserved();
|
||||
};
|
||||
}
|
||||
|
||||
private static void InitializeDeviceId()
|
||||
private static void InitializeTelemetryIdentity()
|
||||
{
|
||||
try
|
||||
{
|
||||
DeviceIdService.Initialize(HostSettingsFacadeProvider.GetOrCreate());
|
||||
AppLogger.Info("Startup", $"DeviceId initialized: {DeviceIdService.Instance.DeviceId}");
|
||||
TelemetryIdentityService.Initialize(HostSettingsFacadeProvider.GetOrCreate());
|
||||
AppLogger.Info(
|
||||
"Startup",
|
||||
$"Telemetry identity initialized. InstallId={TelemetryIdentityService.Instance.InstallId}; TelemetryId={TelemetryIdentityService.Instance.TelemetryId}.");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AppLogger.Warn("Startup", "Failed to initialize DeviceIdService.", ex);
|
||||
AppLogger.Warn("Startup", "Failed to initialize telemetry identity service.", ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static void InitializeSentryForAnalytics()
|
||||
{
|
||||
try
|
||||
{
|
||||
var deviceId = DeviceIdService.Instance.DeviceId;
|
||||
|
||||
SentrySdk.Init(options =>
|
||||
{
|
||||
options.Dsn = "https://f2aad3a1c63b5f2213ad82683ce93c06@o4511049423257600.ingest.us.sentry.io/4511049425813504";
|
||||
options.AutoSessionTracking = true;
|
||||
options.Release = GetAppVersion();
|
||||
options.Environment = GetEnvironment();
|
||||
});
|
||||
|
||||
SentrySdk.ConfigureScope(scope =>
|
||||
{
|
||||
scope.User = new SentryUser
|
||||
{
|
||||
Id = deviceId
|
||||
};
|
||||
|
||||
scope.SetTag("data_type", "analytics");
|
||||
scope.SetTag("device_id", deviceId);
|
||||
scope.SetTag("app_version", GetAppVersion());
|
||||
scope.SetTag("os_name", GetOsName());
|
||||
scope.SetTag("os_version", GetOsVersion());
|
||||
scope.SetTag("os_build", GetOsBuild());
|
||||
scope.SetTag("device_model", GetDeviceModel());
|
||||
scope.SetTag("device_arch", GetDeviceArchitecture());
|
||||
scope.SetTag("processor_count", GetProcessorCount().ToString());
|
||||
scope.SetTag("total_memory_mb", GetTotalMemoryMB().ToString());
|
||||
scope.SetTag("runtime_version", GetRuntimeVersion());
|
||||
scope.SetTag("language", GetSystemLanguage());
|
||||
scope.SetTag("clr_version", GetClrVersion());
|
||||
scope.SetTag("is_64bit", Environment.Is64BitOperatingSystem.ToString());
|
||||
});
|
||||
|
||||
SentrySdk.CaptureMessage("user_active");
|
||||
|
||||
AppLogger.Info("Startup", $"Analytics service initialized. DeviceId={deviceId}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AppLogger.Warn("Startup", "Failed to initialize analytics service.", ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetAppVersion()
|
||||
{
|
||||
var version = typeof(Program).Assembly.GetName().Version;
|
||||
return version is null ? "1.0.0" : $"{version.Major}.{version.Minor}.{version.Build}";
|
||||
}
|
||||
|
||||
private static string GetOsName()
|
||||
{
|
||||
if (OperatingSystem.IsWindows()) return "Windows";
|
||||
if (OperatingSystem.IsLinux()) return "Linux";
|
||||
if (OperatingSystem.IsMacOS()) return "macOS";
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
private static string GetOsVersion()
|
||||
{
|
||||
try { return Environment.OSVersion.VersionString ?? "Unknown"; }
|
||||
catch { return "Unknown"; }
|
||||
}
|
||||
|
||||
private static string GetOsBuild()
|
||||
{
|
||||
try { return Environment.OSVersion.Version.Build.ToString() ?? "Unknown"; }
|
||||
catch { return "Unknown"; }
|
||||
}
|
||||
|
||||
private static string GetDeviceName()
|
||||
{
|
||||
try { return Environment.MachineName ?? "Unknown"; }
|
||||
catch { return "Unknown"; }
|
||||
}
|
||||
|
||||
private static string GetDeviceModel()
|
||||
{
|
||||
if (OperatingSystem.IsWindows()) return "Windows PC";
|
||||
if (OperatingSystem.IsLinux()) return "Linux PC";
|
||||
if (OperatingSystem.IsMacOS()) return "Mac";
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
private static string GetDeviceArchitecture()
|
||||
{
|
||||
return Environment.Is64BitOperatingSystem ? "x64" : "x86";
|
||||
}
|
||||
|
||||
private static int GetProcessorCount()
|
||||
{
|
||||
return Environment.ProcessorCount;
|
||||
}
|
||||
|
||||
private static long GetTotalMemoryMB()
|
||||
{
|
||||
try { return GC.GetGCMemoryInfo().TotalAvailableMemoryBytes / (1024 * 1024); }
|
||||
catch { return 0; }
|
||||
}
|
||||
|
||||
private static string GetRuntimeVersion()
|
||||
{
|
||||
return Environment.Version.ToString();
|
||||
}
|
||||
|
||||
private static string GetSystemLanguage()
|
||||
{
|
||||
try { return System.Globalization.CultureInfo.CurrentUICulture.Name ?? "en-US"; }
|
||||
catch { return "en-US"; }
|
||||
}
|
||||
|
||||
private static string GetClrVersion()
|
||||
{
|
||||
return Environment.Version.ToString();
|
||||
}
|
||||
|
||||
private static CrashReportService? _crashReportService;
|
||||
private static UserBehaviorAnalyticsService? _userBehaviorAnalyticsService;
|
||||
|
||||
private static void InitializeCrashReporting()
|
||||
private static void InitializeCrashTelemetry()
|
||||
{
|
||||
try
|
||||
{
|
||||
var settingsFacade = HostSettingsFacadeProvider.GetOrCreate();
|
||||
_crashReportService = new CrashReportService(settingsFacade, DeviceIdService.Instance);
|
||||
_crashReportService.RefreshEnabledState();
|
||||
var crashTelemetry = new SentryCrashTelemetryService(settingsFacade);
|
||||
TelemetryServices.Crash = crashTelemetry;
|
||||
crashTelemetry.Initialize();
|
||||
AppLogger.Info("Startup", $"Crash telemetry initialized. Enabled={crashTelemetry.IsEnabled}.");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AppLogger.Warn("Startup", "Failed to initialize crash reporting service.", ex);
|
||||
AppLogger.Warn("Startup", "Failed to initialize crash telemetry service.", ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static void InitializeUserBehaviorAnalytics()
|
||||
private static void InitializeUsageTelemetry()
|
||||
{
|
||||
try
|
||||
{
|
||||
var settingsFacade = HostSettingsFacadeProvider.GetOrCreate();
|
||||
_userBehaviorAnalyticsService = new UserBehaviorAnalyticsService(settingsFacade, DeviceIdService.Instance);
|
||||
_userBehaviorAnalyticsService.Initialize();
|
||||
var usageTelemetry = new PostHogUsageTelemetryService(settingsFacade);
|
||||
TelemetryServices.Usage = usageTelemetry;
|
||||
usageTelemetry.Initialize();
|
||||
AppLogger.Info("Startup", $"Usage telemetry initialized. Enabled={usageTelemetry.IsUsageEnabled}.");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AppLogger.Warn("Startup", "Failed to initialize user behavior analytics service.", ex);
|
||||
AppLogger.Warn("Startup", "Failed to initialize usage telemetry service.", ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetReleaseVersion()
|
||||
{
|
||||
var assembly = typeof(Program).Assembly;
|
||||
var version = assembly.GetName().Version;
|
||||
if (version is null)
|
||||
{
|
||||
return "1.0.0";
|
||||
}
|
||||
return version.Major >= 0 ? $"{version.Major}.{version.Minor}.{version.Build}" : "1.0.0";
|
||||
}
|
||||
|
||||
private static string GetEnvironment()
|
||||
{
|
||||
#if DEBUG
|
||||
return "development";
|
||||
#else
|
||||
return "production";
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user