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