有没有办法从应用程序中识别 heroku dyno 名称(例如 web.1、web.2)?我希望能够生成一个唯一的请求 ID(例如,跟踪 web 和工作 dyno 之间的请求,以便对整个请求堆栈进行合并日志记录),在我看来,dyno 标识符将是一个不错的起点。
如果无法做到这一点,是否有人有后备建议?
有没有办法从应用程序中识别 heroku dyno 名称(例如 web.1、web.2)?我希望能够生成一个唯一的请求 ID(例如,跟踪 web 和工作 dyno 之间的请求,以便对整个请求堆栈进行合并日志记录),在我看来,dyno 标识符将是一个不错的起点。
如果无法做到这一点,是否有人有后备建议?
Heroku 团队最近解决了这个问题。
Dyno Manager 添加DYNO
环境变量来保存您的 dyno 的标识符,例如web.1
,web.2
等foo.1
。但是,该变量仍然是实验性的,可能会更改或删除。
我需要该值(实际上是实例索引,如 1、2 等)来在实例启动时初始化 flake id 生成器,并且这个变量对我来说工作得很好。
您可以在Local environment variables上阅读有关变量的更多信息。
我问了 Heroku 支持的这个问题,因为这里有其他人问过我的类似问题,我想我应该分享一下。Heroku 工作人员 JD 回复如下:
不,不可能从测功机内部看到这些信息。我们之前已经审查过这个特性请求并且选择不实现它,因为这会引入一个特定于 Heroku 的变量,我们希望在我们的堆栈中避免这种变量。因此,我们没有计划实施此功能。
您可以在测功机启动时生成/添加到您的环境中的唯一标识符(例如 UUID)以实现类似的结果,并且您可以通过在当时将其打印到您的日志中来将其与您的应用程序的测功机相关联。如果您以后需要找到它,您可以检查该行的日志(当然,您需要使用 Papertrail、Loggly 等或您自己的服务器来排空日志)。
不幸的是,对于我的场景,UUID 太长(如果我想要这么大的数据,我会首先使用 UUID 来跟踪事物)。不过还是有官方的回答就好了。
Heroku 有一个$DYNO 环境变量,但是有一些重要的警告:
对于您尝试解决的问题,路由器请求 ID可能更合适。Heroku 通过 X-Request-ID 标头将唯一 ID 传递给每个 Web 请求。您可以将其传递给工作人员,并让 Web 和工作人员实例在他们记录特定请求/工作位的信息时记录请求 ID。这将允许您关联日志中的事件。
这可能不能完全回答这个问题,但您可以在 Procfile 中为每个工作进程设置不同的行(每个工作进程使用 ps:scale 1)。然后,您可以将工作人员编号作为环境变量从 Procfile 传递。
示例 procfile 中的两行可能如下所示:
worker_1: env WORKER_NUMBER=1 node worker
worker_2: env WORKER_NUMBER=2 node worker
使用的工头包heroku local
似乎再次更改了 ENV 变量名称(heroku/7.54.0)。您现在可以在$FOREMAN_WORKER_NAME
本地运行时获取工作人员名称。在 Heroku ( ,等)$DYNO
上运行时,它具有相同的值web.1
web.2
foreman
gem 仍然使用,因此$PS
要访问 dyno 名称并使其在 heroku 和开发中(使用时foreman
)都可以使用,您可以先检查$PS
,然后再检查$DYNO
. 要处理本地控制台的情况,请检查Rails.console
dyno_name = ENV['PS'] || ENV['DYNO'] || (defined?(Rails::Console) ? "console" : "")
使用 DYNO 环境变量很危险,因为它的值不能保证是唯一的。这意味着您可以同时运行两个测功机,它们短暂地具有相同的 DYNO 变量值。执行此操作的安全方法是启用 dyno 元数据,然后使用 HEROKU_DYNO_ID 环境变量。这将更好地让您生成唯一的请求 ID。见:https ://devcenter.heroku.com/articles/dyno-metadata