Skip to content

feat(telemetry): 使用 Sentry 收集并上报遥测数据#2593

Open
Big-Cake-jpg wants to merge 41 commits intodevfrom
feat/sentry-telemetry
Open

feat(telemetry): 使用 Sentry 收集并上报遥测数据#2593
Big-Cake-jpg wants to merge 41 commits intodevfrom
feat/sentry-telemetry

Conversation

@Big-Cake-jpg
Copy link
Member

@Big-Cake-jpg Big-Cake-jpg commented Mar 12, 2026

本 PR 对遥测服务与日志服务进行了改动,使用 Sentry 收集启动器上报的环境信息与错误。

在启用遥测后,Sentry 将会自动收集程序启动后出现的错误与环境信息,并将其上报至服务器。程序自行收集的环境信息也会被一并包含在收集到的错误内上报。

需要添加一个新的环境变量:SENTRY_DSN 用于配置 Sentry SDK 使用的后端。在不配置 SENTRY_DSN 或未勾选 启用遥测数据收集 设置项的情况下,遥测服务不会上报任何数据。

遥测服务现在具有一个新的方法:ReportException(ex),用于在需要的地方进行调用以上报启动器错误供开发者调查、复现与修复。

参见:

Note

这个 PR 和目前所使用的 Sentry 实例配置可能还不是很完善,如果有任何建议欢迎提出,也欢迎直接向 feat/sentry-telemetry 分支提交你的更改。

Sentry 实例的访问权限请各位开发联系 @Big-Cake-jpg 提供邮箱获取注册邮件。

Summary by Sourcery

集成基于 Sentry 的遥测,用于错误和环境报告,并将其接入现有的日志和遥测生命周期。

新功能:

  • 新增由环境变量 SENTRY_DSN 驱动的 Sentry SDK 初始化,以启用远程错误和遥测上报。
  • 引入 TelemetryService.ReportException API,并将其挂接到日志管道中,以便将已记录的异常发送到 Sentry。
  • 通过 Sentry 发送设备环境遥测数据,替代之前自定义的 HTTP 端点,包括启动器和网络环境数据。

增强:

  • 更新遥测生命周期处理逻辑,在服务停止时关闭 Sentry SDK。
  • 调整用户可见的遥测选择加入对话框,以在新的遥测行为下,解释错误和环境数据的收集方式。
Original summary in English

Summary by Sourcery

Integrate Sentry-based telemetry for error and environment reporting and wire it into the existing logging and telemetry lifecycle.

New Features:

  • Add Sentry SDK initialization driven by the SENTRY_DSN environment variable to enable remote error and telemetry reporting.
  • Introduce a TelemetryService.ReportException API and hook it into the logging pipeline to send logged exceptions to Sentry.
  • Send device environment telemetry via Sentry instead of the previous custom HTTP endpoint, including launcher and network environment data.

Enhancements:

  • Update telemetry lifecycle handling to close the Sentry SDK on service stop.
  • Revise the user-facing telemetry opt-in dialog to explain error and environment data collection with the new telemetry behavior.

@pcl-ce-automation pcl-ce-automation bot added 🛠️ 等待审查 Pull Request 已完善,等待维护者或负责人进行代码审查 size: M PR 大小评估:中型 labels Mar 12, 2026
@Big-Cake-jpg Big-Cake-jpg requested a review from a team March 12, 2026 10:04
@pcl-ce-automation pcl-ce-automation bot added size: L PR 大小评估:大型 and removed size: M PR 大小评估:中型 labels Mar 12, 2026
@Big-Cake-jpg Big-Cake-jpg requested a review from lhx077 March 12, 2026 11:19
Copy link
Member

@LinQingYuu LinQingYuu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

也许可以考虑有选择性的上报

像一些 IOException 还有 HTTP 请求超时其实没有上报的必要,报这个纯粹在浪费钱

@Big-Cake-jpg Big-Cake-jpg force-pushed the feat/sentry-telemetry branch from b545c25 to fe7aa62 Compare March 14, 2026 02:57
@Big-Cake-jpg Big-Cake-jpg requested a review from ruattd March 14, 2026 02:59
lhx077
lhx077 previously requested changes Mar 14, 2026
options.AutoSessionTracking = true;
options.Release = release;
options.Environment = environment;
options.SetBeforeSend(@event =>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@event.Exception 可能为 null(message/event 类型、或异常在 @event.Exceptions 列表里),这段逻辑可能根本过滤不到你想过滤的 timeout。
仅通过 Level == Debug 丢弃也未必等同于你想要的策略:你在 ReportException 里会把 Info/Warning 也送过去;但 LogService 现在对“任何带 Exception 的日志”都会调用上报,因此 Sentry 可能被 Warning/Info 异常大量污染。

@LinQingYuu LinQingYuu dismissed lhx077’s stale review March 14, 2026 17:44

It seems like an invalid review.

@lhx077
Copy link
Member

lhx077 commented Mar 15, 2026

对了,我觉得我有必要再解释一下昨天那个回复:
@event.Exception 极可能是 null

我就说这么多

@Big-Cake-jpg
Copy link
Member Author

@sourcery-ai review

@sourcery-ai
Copy link

sourcery-ai bot commented Mar 16, 2026

Reviewer's Guide

集成 Sentry 作为遥测后端,将异常上报接入日志管线,在启用遥测且配置了 SENTRY_DSN 时,使用 Sentry 捕获运行时错误和设备环境数据。

将日志中的异常上报到 Sentry 遥测的时序图

sequenceDiagram
    participant Caller
    participant LogService
    participant TelemetryService
    participant SentrySdk

    Caller->>LogService: Log(level, message, module, ex)
    LogService->>LogService: _OnWrapperLog(level, msg, module, ex)
    LogService->>LogService: Compose formatted log line
    alt Exception_present
        LogService->>TelemetryService: ReportException(ex, plainMessage, level)
        TelemetryService->>TelemetryService: Create SentryEvent(ex)
        TelemetryService->>TelemetryService: Map LogLevel to SentryLevel
        TelemetryService->>TelemetryService: Attach message to SentryEvent
        TelemetryService->>SentrySdk: CaptureEvent(sentryEvent)
    end
    LogService->>LogService: _LogAction(level, actionLevel, formatted, plain, ex)
    LogService-->>Caller: Log completed
Loading

通过 Sentry 在启动时上报遥测环境的时序图

sequenceDiagram
    participant App
    participant TelemetryService
    participant SentrySdk

    App->>TelemetryService: _StartAsync()
    TelemetryService->>TelemetryService: Check Config.System.Telemetry
    alt Telemetry_enabled
        TelemetryService->>TelemetryService: _InitSentry()
        TelemetryService->>SentrySdk: Init(options)
        TelemetryService->>TelemetryService: Collect TelemetryDeviceEnvironment
        TelemetryService->>TelemetryService: _ReportDeviceEnvironment(telemetry)
        TelemetryService->>SentrySdk: ConfigureScope(scope)
        TelemetryService->>SentrySdk: CaptureMessage("设备环境调查")
    else Telemetry_disabled
        TelemetryService-->>App: Return without telemetry
    end

    App->>TelemetryService: _StopAsync() on shutdown
    TelemetryService->>SentrySdk: Close()
Loading

更新后的 TelemetryService 和 LogService 遥测集成类图

classDiagram
    class TelemetryService {
        <<sealed>>
        +_InitSentry() void
        +ReportException(ex Exception, plain string, level LogLevel?) void
        +_ReportDeviceEnvironment(content TelemetryDeviceEnvironment) void
        +_StartAsync() Task
        +_StopAsync() void
    }

    class TelemetryDeviceEnvironment {
        +LauncherVersion string
        +LauncherId string
        +OsVersion string
        +OsArchitecture string
        +MemorySize string
        +NatType string
        +NatFilterBehaviour string
        +Ipv6Status string
        +HasUsedOfficialPcl bool
        +HasUsedHmcl bool
        +HasUsedBakaXL bool
    }

    class LogService {
        +StartAsync() Task
        +StopAsync() Task
        +OnLog(item LifecycleLogItem) void
        -_LogAction(reportLevel LogLevel, level ActionLevel, formatted string, plain string, ex Exception?) void
        -_OnWrapperLog(level LogLevel, msg string, module string, ex Exception?) void
    }

    class LifecycleLogItem {
        +Level LogLevel
        +ActionLevel ActionLevel
        +Message string
        +Exception Exception?
        +ComposeMessage() string
    }

    class LogLevel {
        +Fatal
        +Error
        +Warning
        +Info
        +Debug
        +Trace
        +PrintName() string
        +DefaultActionLevel() ActionLevel
    }

    class ActionLevel {
        +TraceLog
        +InfoLog
        +WarningLog
        +ErrorLog
    }

    LogService --> TelemetryService : uses ReportException
    LogService --> LifecycleLogItem : consumes
    LifecycleLogItem --> LogLevel : has
    LifecycleLogItem --> ActionLevel : has
    TelemetryService --> TelemetryDeviceEnvironment : reports
Loading

File-Level Changes

Change Details Files
在应用启动时初始化并配置用于遥测的 Sentry SDK,并在生命周期停止时干净地关闭。
  • 新增 _InitSentry 帮助方法,用于读取 SENTRY_DSN,配置 release/environment、隐私设置、会话追踪以及过滤规则(忽略 TimeoutException 和 debug 级别事件)
  • 仅在启用遥测时,从 _StartAsync 调用 _InitSentry,而不再使用自定义的 TELEMETRY_KEY
  • 新增 _StopAsync 生命周期停止处理,在服务关闭时调用 SentrySdk.Close
  • LifecycleScope 名称大小写从 "Telemetry" 调整为 "telemetry"
PCL.Core/App/Essentials/TelemetryService.cs
通过 Sentry 发送设备环境信息,替代原有的自定义 HTTP 端点。
  • 引入 _ReportDeviceEnvironment,将 TelemetryDeviceEnvironment 附加到 Sentry scope 上下文并发送一条 Sentry 消息
  • 用对 _ReportDeviceEnvironment 的调用,替换原先带有 TELEMETRY_KEY 认证的遥测端点手动 HTTP POST
  • 为环境数据的 Sentry 消息发送添加错误处理和日志记录
PCL.Core/App/Essentials/TelemetryService.cs
将日志中的异常接入基于 Sentry 的遥测上报。
  • 扩展 _LogAction,增加用于遥测严重级别映射的 LogLevel 参数
  • 对任何包含 Exception 的日志条目,调用 TelemetryService.ReportException,传入异常、纯文本消息和日志级别
  • 更新 _OnWrapperLogOnLog,将正确的 LogLevel 传入 _LogAction
PCL.Core/Logging/LogService.cs
更新面向用户的遥测选项提示,使其反映基于 Sentry 的错误与环境数据收集语义。
  • 修改提示文案,说明在收集设备环境信息的同时也会收集启动器错误,并澄清禁用遥测的影响
  • 更新对话框标题和按钮文本,将其从“调查”相关措辞改为“遥测数据收集”相关措辞,同时保持原有的选择加入逻辑不变
Plain Craft Launcher 2/FormMain.xaml.vb
添加 Sentry SDK 依赖,并为遥测接好所需的项目配置。
  • 在核心项目中引用 Sentry,以启用 SentrySdk 的使用
  • 如有需要,使启动器设置界面(PageSetupLauncherMisc.xaml)与新的遥测行为和文案保持一致
PCL.Core/PCL.Core.csproj
Plain Craft Launcher 2/Pages/PageSetup/PageSetupLauncherMisc.xaml

Tips and commands

Interacting with Sourcery

  • 触发新一次审查: 在 pull request 上评论 @sourcery-ai review
  • 继续讨论: 直接回复 Sourcery 的审查评论。
  • 从审查评论生成 GitHub issue: 在审查评论下回复,请 Sourcery 根据该评论创建 issue。你也可以直接回复 @sourcery-ai issue,根据该评论创建 issue。
  • 生成 pull request 标题: 在 pull request 标题的任意位置写上 @sourcery-ai,即可随时生成标题。你也可以在 pull request 中评论 @sourcery-ai title 来(重新)生成标题。
  • 生成 pull request 摘要: 在 pull request 正文任意位置写上 @sourcery-ai summary,即可在该位置生成 PR 摘要。你也可以在 pull request 中评论 @sourcery-ai summary 来(重新)生成摘要。
  • 生成审查者指南: 在 pull request 上评论 @sourcery-ai guide,即可随时(重新)生成审查者指南。
  • 一次性解决所有 Sourcery 评论: 在 pull request 上评论 @sourcery-ai resolve,可以将所有 Sourcery 评论标记为已解决。如果你已经处理完所有评论且不想再看到它们,这会很有用。
  • 忽略所有 Sourcery 审查: 在 pull request 上评论 @sourcery-ai dismiss,可以忽略所有现有的 Sourcery 审查。当你想从一次全新的审查开始时尤其有用——别忘了再评论 @sourcery-ai review 来触发新的审查!

Customizing Your Experience

前往你的 dashboard 可进行以下操作:

  • 启用或禁用审查功能,例如 Sourcery 生成的 pull request 摘要、审查者指南等。
  • 更改审查语言。
  • 添加、移除或编辑自定义审查说明。
  • 调整其他审查设置。

Getting Help

Original review guide in English

Reviewer's Guide

Integrates Sentry as the telemetry backend, wiring exception reporting into the logging pipeline and using Sentry to capture both runtime errors and device environment data when telemetry is enabled and SENTRY_DSN is configured.

Sequence diagram for logging exceptions reported to Sentry telemetry

sequenceDiagram
    participant Caller
    participant LogService
    participant TelemetryService
    participant SentrySdk

    Caller->>LogService: Log(level, message, module, ex)
    LogService->>LogService: _OnWrapperLog(level, msg, module, ex)
    LogService->>LogService: Compose formatted log line
    alt Exception_present
        LogService->>TelemetryService: ReportException(ex, plainMessage, level)
        TelemetryService->>TelemetryService: Create SentryEvent(ex)
        TelemetryService->>TelemetryService: Map LogLevel to SentryLevel
        TelemetryService->>TelemetryService: Attach message to SentryEvent
        TelemetryService->>SentrySdk: CaptureEvent(sentryEvent)
    end
    LogService->>LogService: _LogAction(level, actionLevel, formatted, plain, ex)
    LogService-->>Caller: Log completed
Loading

Sequence diagram for startup telemetry environment reporting via Sentry

sequenceDiagram
    participant App
    participant TelemetryService
    participant SentrySdk

    App->>TelemetryService: _StartAsync()
    TelemetryService->>TelemetryService: Check Config.System.Telemetry
    alt Telemetry_enabled
        TelemetryService->>TelemetryService: _InitSentry()
        TelemetryService->>SentrySdk: Init(options)
        TelemetryService->>TelemetryService: Collect TelemetryDeviceEnvironment
        TelemetryService->>TelemetryService: _ReportDeviceEnvironment(telemetry)
        TelemetryService->>SentrySdk: ConfigureScope(scope)
        TelemetryService->>SentrySdk: CaptureMessage("设备环境调查")
    else Telemetry_disabled
        TelemetryService-->>App: Return without telemetry
    end

    App->>TelemetryService: _StopAsync() on shutdown
    TelemetryService->>SentrySdk: Close()
Loading

Class diagram for updated TelemetryService and LogService telemetry integration

classDiagram
    class TelemetryService {
        <<sealed>>
        +_InitSentry() void
        +ReportException(ex Exception, plain string, level LogLevel?) void
        +_ReportDeviceEnvironment(content TelemetryDeviceEnvironment) void
        +_StartAsync() Task
        +_StopAsync() void
    }

    class TelemetryDeviceEnvironment {
        +LauncherVersion string
        +LauncherId string
        +OsVersion string
        +OsArchitecture string
        +MemorySize string
        +NatType string
        +NatFilterBehaviour string
        +Ipv6Status string
        +HasUsedOfficialPcl bool
        +HasUsedHmcl bool
        +HasUsedBakaXL bool
    }

    class LogService {
        +StartAsync() Task
        +StopAsync() Task
        +OnLog(item LifecycleLogItem) void
        -_LogAction(reportLevel LogLevel, level ActionLevel, formatted string, plain string, ex Exception?) void
        -_OnWrapperLog(level LogLevel, msg string, module string, ex Exception?) void
    }

    class LifecycleLogItem {
        +Level LogLevel
        +ActionLevel ActionLevel
        +Message string
        +Exception Exception?
        +ComposeMessage() string
    }

    class LogLevel {
        +Fatal
        +Error
        +Warning
        +Info
        +Debug
        +Trace
        +PrintName() string
        +DefaultActionLevel() ActionLevel
    }

    class ActionLevel {
        +TraceLog
        +InfoLog
        +WarningLog
        +ErrorLog
    }

    LogService --> TelemetryService : uses ReportException
    LogService --> LifecycleLogItem : consumes
    LifecycleLogItem --> LogLevel : has
    LifecycleLogItem --> ActionLevel : has
    TelemetryService --> TelemetryDeviceEnvironment : reports
Loading

File-Level Changes

Change Details Files
Initialize and configure Sentry SDK for telemetry when the app starts and cleanly shut it down on lifecycle stop.
  • Add _InitSentry helper that reads SENTRY_DSN, configures release/environment, privacy, session tracking and filtering (ignores TimeoutException and debug-level events)
  • Invoke _InitSentry from _StartAsync only when telemetry is enabled instead of using a custom TELEMETRY_KEY
  • Add _StopAsync lifecycle stop handler to close SentrySdk on service shutdown
  • Adjust LifecycleScope name casing from "Telemetry" to "telemetry"
PCL.Core/App/Essentials/TelemetryService.cs
Send device environment information via Sentry instead of the custom HTTP endpoint.
  • Introduce _ReportDeviceEnvironment to attach TelemetryDeviceEnvironment into Sentry scope contexts and send a Sentry message
  • Replace manual HTTP POST (with TELEMETRY_KEY auth) to the telemetry endpoint with a call to _ReportDeviceEnvironment
  • Add error handling and logging around Sentry message sending for environment data
PCL.Core/App/Essentials/TelemetryService.cs
Wire log exceptions into Sentry-based telemetry reporting.
  • Extend _LogAction to accept a LogLevel used for telemetry severity mapping
  • On any log entry with an Exception, call TelemetryService.ReportException with the exception, plain message, and log level
  • Update _OnWrapperLog and OnLog to pass the correct LogLevel into _LogAction
PCL.Core/Logging/LogService.cs
Update user-facing telemetry opt-in prompt to reflect Sentry-based error and environment collection semantics.
  • Revise prompt text to describe collection of launcher errors in addition to device environment and clarify impact of disabling telemetry
  • Update dialog title and button text from survey wording to telemetry data collection wording while preserving the same opt-in logic
Plain Craft Launcher 2/FormMain.xaml.vb
Add Sentry SDK dependency and hook up any necessary project configuration for telemetry.
  • Reference Sentry in the core project to enable SentrySdk usage
  • Align launcher settings UI (in PageSetupLauncherMisc.xaml) with the new telemetry behavior and wording if needed
PCL.Core/PCL.Core.csproj
Plain Craft Launcher 2/Pages/PageSetup/PageSetupLauncherMisc.xaml

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - 我在这里给出了一些整体性的反馈:

  • 现在每个带有异常的日志条目都会调用 TelemetryService.ReportException,但它有可能在 _InitSentry 之前(或者在遥测被禁用时)被调用,这可能导致 Sentry 行为异常或抛出错误;建议在遥测关闭 / Sentry 尚未初始化时直接短路返回,以确保在所有配置下日志记录都是安全的。
  • _InitSentry 当前假设 SentrySdk.Init 一定会成功;将初始化过程包在 try/catch 中并记录失败日志,可以避免 Sentry 配置/网络问题影响应用程序启动。
给 AI 助手的提示
请根据本次代码审查中的评论进行修改:

## 整体评论
- 现在每个带有异常的日志条目都会调用 `TelemetryService.ReportException`,但它有可能在 `_InitSentry` 之前(或者在遥测被禁用时)被调用,这可能导致 Sentry 行为异常或抛出错误;建议在遥测关闭 / Sentry 尚未初始化时直接短路返回,以确保在所有配置下日志记录都是安全的。
- `_InitSentry` 当前假设 `SentrySdk.Init` 一定会成功;将初始化过程包在 try/catch 中并记录失败日志,可以避免 Sentry 配置/网络问题影响应用程序启动。

Sourcery 对开源项目免费 —— 如果你觉得我们的代码审查有帮助,欢迎分享给更多人 ✨
帮我变得更有用!请在每条评论上点击 👍 或 👎,我会根据你的反馈改进后续的审查。
Original comment in English

Hey - I've left some high level feedback:

  • TelemetryService.ReportException is now invoked for every log entry with an exception, but it can be called before _InitSentry (or when telemetry is disabled), which may cause Sentry to misbehave or throw; consider short‑circuiting when telemetry is off / Sentry is not initialized so logging remains safe in all configurations.
  • _InitSentry currently assumes SentrySdk.Init always succeeds; wrapping the initialization in a try/catch and logging failures would prevent Sentry configuration/network issues from impacting application startup.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- `TelemetryService.ReportException` is now invoked for every log entry with an exception, but it can be called before `_InitSentry` (or when telemetry is disabled), which may cause Sentry to misbehave or throw; consider short‑circuiting when telemetry is off / Sentry is not initialized so logging remains safe in all configurations.
- `_InitSentry` currently assumes `SentrySdk.Init` always succeeds; wrapping the initialization in a try/catch and logging failures would prevent Sentry configuration/network issues from impacting application startup.

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

lhx077
lhx077 previously approved these changes Mar 17, 2026
Comment on lines +64 to +65
// 错误上报
public static void ReportException(Exception ex, string plain, LogLevel? level = null)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

此方法直接假设 SentrySdk 已初始化完毕,若未初始化时调用则会导致问题

若调用时未初始化,可考虑在 telemetry 启用的情况下记录信息并等待初始化后上报,否则直接丢弃

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sentry SDK 对这种情况的默认行为就是静默丢弃,不会上报也不会抛出异常。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不不不,我说的导致问题就是它可能直接忽略不上报,这不符合预期

预期行为应为初始化阶段(running 前)崩掉也会上报,因为我们很多 issue 都是初始化阶段崩掉的

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

初始化之前就崩掉的话,遥测服务根本来不及初始化程序就退出了。

如果不改变遥测服务初始化的顺序,即便尝试实现一个队列缓存也没有任何作用,因为它们还没等到遥测服务初始化就因为强制退出被清掉了。

@Big-Cake-jpg Big-Cake-jpg requested a review from ruattd March 17, 2026 16:02
@ruattd
Copy link
Contributor

ruattd commented Mar 24, 2026

先这样吧,再出问题再说,但是你是不是没给 CI 加 secret

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size: L PR 大小评估:大型 🛠️ 等待审查 Pull Request 已完善,等待维护者或负责人进行代码审查

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants