2012-07-13 30 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

相關問題