アプリケーション内から heroku dyno 名 (web.1、web.2 など) を特定する方法はありますか? 一意のリクエスト ID を生成できるようにしたいと考えています (たとえば、リクエスト スタック全体の統合ロギングのために Web とワーカー dyno 間のリクエストを追跡するため)。
これができない場合、フォールバックの推奨事項はありますか?
アプリケーション内から heroku dyno 名 (web.1、web.2 など) を特定する方法はありますか? 一意のリクエスト ID を生成できるようにしたいと考えています (たとえば、リクエスト スタック全体の統合ロギングのために Web とワーカー dyno 間のリクエストを追跡するため)。
これができない場合、フォールバックの推奨事項はありますか?
Heroku のサポートについてこの質問をしましたが、ここには私と同様の質問をした人が他にもいるので、共有する必要があると考えました。Heroku のスタッフ JD は次のように答えました。
いいえ、この情報を dyno 内から見ることはできません。以前にこの機能リクエストを確認しましたが、実装しないことを選択しました。これにより、スタック内で回避することを目指している Heroku 固有の変数が導入されるためです。そのため、この機能を実装する予定はありません。
同様の結果を得るために、dyno ブートで一意の識別子 (UUID など) を環境に生成または追加し、その時点でログに出力することで、これをアプリの dyno に関連付けることができます。後でそれを見つける必要がある場合は、その行のログを確認できます (もちろん、Papertrail、Loggly などを使用して、または独自のサーバーにログを排出する必要があります)。
残念ながら、私のシナリオでは、UUID は長すぎます (このような大きなデータが必要な場合は、最初に UUID を使用して追跡します)。しかし、公式の回答があることはまだ良いことです。
これは質問に正確に答えないかもしれませんが、Procfile にワーカー プロセスごとに異なる行を含めることができます (それぞれに ps:scale を 1 を使用します)。その後、Procfile からワーカー番号を環境変数として渡すことができます。
サンプル procfile の 2 行は次のようになります。
worker_1: env WORKER_NUMBER=1 node worker
worker_2: env WORKER_NUMBER=2 node worker
使用している foremanパッケージheroku local
は、ENV 変数名を再度変更したようです (heroku/7.54.0)。$FOREMAN_WORKER_NAME
ローカルで実行しているときにワーカー名を取得できるようになりました。$DYNO
Heroku で実行する場合と同じ値を持ちます ( web.1
、web.2
など)。
foreman
gem はまだ を使用して$PS
いるため、dyno 名にアクセスして heroku と開発中 ( を使用している場合) の両方で動作させるには、最初に をforeman
チェックしてから をチェックします。ローカル コンソールのケースを処理するには、$PS
$DYNO
Rails.console
dyno_name = ENV['PS'] || ENV['DYNO'] || (defined?(Rails::Console) ? "console" : "")