在自定义插件中添加 (Datadog APM) 初始化器?

大家好!第一次发帖,如果发错版块还请见谅。

我想为 Discourse 配置 Datadog APM 监控,觉得为此开发一个自定义插件是合理的做法(参考 discourse-prometheus 的思路)。

通常配置 Rails 应用进行 APM 监控的方式是使用一个初始化器(initializer)——我对 Discourse 的插件系统还不太熟悉。是否可以通过现有的插件系统在 Discourse 应用启动的早期加载这样的初始化器?如果不能,还有哪些其他方案?我希望能避免为了添加单个初始化器而 fork 整个应用:sweat_smile:

在 Prometheus 插件中遵循相同的模式:

after_initialize 极有可能是您放置此代码的位置。

感谢 @sam 的迅速回复!我会试试看,并告诉你结果。

@sam 我试过了,但看来这个特定的 ddtrace gem 期望 也能在 before_initialize 中运行。不过,before_initialize 似乎并不是 plugin.rb 中的有效方法。插件是否有其他选项可以在应用生命周期更早的阶段运行?

错误信息:

[2020-06-30T15:30:40.348519 #2313] ERROR -- ddtrace: [ddtrace] (/workspace/plugins/discourse-datadog/gems/2.6.2/gems/ddtrace-0.37.0/lib/ddtrace/contrib/patcher.rb:43:in `on_patch_error') 应用 Datadog::Contrib::Rails::Patcher 补丁失败。原因:无法修改冻结的数组 位置:/home/vscode/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/actionpack-6.0.3.1/lib/action_dispatch/middleware/stack.rb:102:in `insert'

我接下来的步骤将是不使用由该 gem 的“补丁器”自动应用的魔法化插桩,而是将部分实际的插桩逻辑直接集成到插件本身,就像你在 discourse-prometheus 中所做的那样。我想,考虑到要接入 Discourse 的一些具体特性,这样做也是合理的。我只是希望还有某种我尚未发现的利用这些魔法的方法。

@raph 你让这款插件运行起来了吗?哪怕只是使用自动插桩功能?