2012-07-13 32 views
10

有没有办法从应用程序中识别heroku dyno名称(例如web.1,web.2)?我希望能够生成一个唯一的请求标识(例如,跟踪web和工作人员dynos之间的请求以整合记录整个请求堆栈),并且在我看来,dyno标识符将成为一个体面的起点。如何从应用程序内识别heroku dyno号码?

如果这不能完成,是否有人有后备建议?

回答

6

我问过Heroku支持的这个问题,因为在这里有其他人问过类似的问题我想我应该分享它。 Heroku的工作人员JD回答如下:

不,从里面看不到这个信息。 我们之前已经审查了此功能请求,并且选择不要 实现它,因为这会引入一个Heroku特定的变量,我们希望在我们的堆栈中避免使用该变量。因此,我们没有计划 实现此功能。

您可以生成/在测功机启动添加到环境中的唯一标识符(如 UUID)来完成类似的结果,你可以 到应用的DYNOS归属关系这并在该 一次打印到日志。如果你以后需要找到它,你可以检查你的日志 那一行(当然,你需要使用Papertrail, Loggly等,或自己的服务器)。

不幸的是,对于我的场景来说,UUID太长了(如果我想要这么大的一块数据,我会首先使用UUID来跟踪事物)。但有正式答案仍然很好。

+4

Pfft,这是不可接受的,因为我捕获指标,并且每次源(UUID)更改时都无法重新配置仪表板。我会再次提出请求:-) – opyate 2012-09-13 19:09:46

+0

我们最终发现了[雪花](https://github.com/twitter/snowflake),然后发现了heroku自己的[noeqd](https://github.com/noeq)id代服务器。 很遗憾,heroku不会将他们的noeq服务暴露给他们的客户群,但它很容易启动并运行,并且每台服务器都很容易每秒生成超过一百万个独特ID值,足以用于跟踪请求ID。 – 2012-12-06 05:22:28

+0

这是荒谬的。 – 2013-07-31 16:51:48

15

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

Dyno Manager添加了DYNO环境变量,其中包含您的dyno的标识符,例如web.1,web.2, foo.1等。但是,该变量仍然是实验性的,可能会发生变化或删除。

我需要这个值(实际上是实例索引像1,2等)来初始化flake id生成器在实例启动时,这个变量对我来说工作得非常好。

你可以阅读更多关于Local environment variables上的变量。

+0

工头在哪里获取信息?当我使用Procfile和工头在本地运行rails应用程序时,日志中有“web.1”,“worker.1”等。 – 2016-08-13 22:06:25

+0

啊,领班在本地运行$ PS,其中$ DYNO取代heroku。 – 2016-08-13 22:14:40

2

的Heroku拥有$DYNO environment variable,但有连接到它的一些大注意事项:

  1. “的$ DYNO变量是实验性的,并随时更改或删除。”所以他们可以随时拿走它。
  2. “$ DYNO不保证在应用程序中是唯一的。”这是更有问题的一个,特别是如果你想要实现像雪花ID这样的东西。

对于您试图解决的问题,router request ID可能更合适。 Heroku通过X-Request-ID头向每个Web请求传递一个唯一的ID。您可以将其传递给工作人员,并让Web和工作者实例在任何时候记录特定请求/工作量的信息时记录请求ID。这将允许您关联日志中的事件。

0

这可能不会完全回答这个问题,但是您可以在每个工作进程的Procfile中使用不同的行(对每个进程使用ps:scale为1)。然后,您可以从Procfile传入工号作为环境变量。从一个例子procfile

两行可能看起来像:

worker_1: env WORKER_NUMBER=1 node worker 
worker_2: env WORKER_NUMBER=2 node worker 
0

foreman宝石仍然使用$PS,所以进入到了极致的名字和有它都在Heroku和发展工作(使用foreman时)你可先检查$PS,然后再检查$DYNO。为了处理本地控制台的情况下,检查Rails.console

dyno_name = ENV['PS'] || ENV['DYNO'] || (defined?(Rails::Console) ? "console" : "") 
0

是很危险的使用DYNO环境变量,因为它的价值是不能保证是唯一的。这意味着你可以在同一时间运行两个短暂的具有相同DYNO变量值的dynos。执行此操作的安全方法是启用dyno元数据,然后使用HEROKU_DYNO_ID环境变量。这将更好地让您生成唯一的请求ID。请参阅:https://devcenter.heroku.com/articles/dyno-metadata

相关问题