如何从应用程序中识别heroku dyno号码?

时间:2012-07-13 06:27:42

标签: heroku

有没有办法从应用程序中识别heroku dyno名称(例如web.1,web.2)?我希望能够生成一个唯一的请求ID(例如,跟踪web和worker dynos之间的请求,以便整合请求堆栈的整合记录),在我看来,dyno标识符将成为一个不错的起点。

如果无法做到这一点,是否有人有后备建议?

7 个答案:

答案 0 :(得分:17)

最近Heroku团队已经解决了这个问题。

Dyno Manager添加DYNO个环境变量,其中包含您的dyno的标识符,例如web.1web.2foo.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,但是有一些重要的警告:

  1. " $ DYNO变量是实验性的,可以更改或删除。"所以他们可以随时拿走它。
  2. " $ DYNO不保证在应用程序中是唯一的。"这是一个更有问题的问题,特别是如果您正在寻求实施类似Snowflake ID的内容。
  3. 对于您尝试解决的问题,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 上运行时,它具有相同的值 $DYNOweb.1web.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