Как определить номер dynku gemku из приложения?

Есть ли способ идентифицировать имя исполнителя heroku (например, web.1, web.2) из ​​приложения? Я хотел бы иметь возможность генерировать уникальный идентификатор запроса (например, для отслеживания запросов между веб-серверами и рабочими динамиками для консолидированного ведения журнала всего стека запросов), и мне кажется, что идентификатор dyno сделает достойную отправную точку.

Если этого не сделать, есть ли у кого-нибудь рекомендация об отказе?

Ответ 1

Я задал этот вопрос поддержки Хероку, и поскольку здесь есть другие, которые задали мне похожие вопросы, я решил, что должен поделиться им. Сотрудник Heroku JD ответил следующим образом:

Нет, это невозможно увидеть изнутри динамика. Мы рассмотрели этот запрос функции раньше и выбрали не реализует его, так как это вводит специфическую для Хероку переменную, которая мы стремимся избегать в нашем стеке. Таким образом, у нас нет планов реализовать эту функцию.

Вы можете сгенерировать/добавить в свою среду уникальный идентификатор (например, UUID), чтобы выполнить аналогичный результат, и вы можете сопоставьте это с вашими приложениями, напечатав их в своих журналах время. Если вам когда-нибудь понадобится найти его позже, вы можете проверить свои журналы для эта линия (конечно, вам нужно будет слить ваши журналы с помощью Papertrail, Loggly и т.д. Или на ваш собственный сервер).

К сожалению, для моего сценария UUID слишком длинный (если бы я хотел такую ​​большую часть данных, я бы просто использовал UUID для отслеживания вещей в первую очередь). Но все равно хорошо иметь официальный ответ.

Ответ 2

Недавно эта проблема была решена командой Heroku.

Диспетчер Dyno добавляет переменные среды DYNO, которые содержат идентификатор вашего dyno, например. web.1, web.2, foo.1 и т.д. Однако переменная все еще экспериментальна и может быть изменена или удалена.

Мне понадобилось это значение (фактический индекс экземпляра, например, 1, 2 и т.д.), чтобы инициализировать генератор flake id при запуске экземпляра, и эта переменная работала отлично для меня.

Вы можете узнать больше о переменных Локальных переменных окружения.

Ответ 3

Heroku имеет $DYNO переменную окружения, однако есть некоторые большие оговорки, связанные с ней:

  • "Переменная $DYNO является экспериментальной и может быть изменена или изменена". Поэтому они могут убрать его в любой момент.
  • "$ DYNO не гарантируется быть уникальным в приложении". Это более проблематично, особенно если вы хотите реализовать что-то вроде ID Snowflake.

Для проблемы, которую вы пытаетесь решить, более подходящим может быть идентификатор запроса маршрутизатора. Heroku передает уникальный идентификатор каждому веб-запросу через заголовок X-Request-ID. Вы можете передать это работнику, и как веб-сайт, так и рабочий экземпляр регистрируют идентификатор запроса в любое время, когда они регистрируют информацию для конкретного запроса/части работы. Это позволит вам соотнести инциденты в журналах.

Ответ 4

Это может не точно ответить на вопрос, но у вас может быть другая строка в вашем файле Procfile для каждого рабочего процесса (с использованием ps: шкала по 1 для каждого). Затем вы можете передать номер рабочего места в качестве переменной среды из файла Procfile.

Две строки из примера procfile могут выглядеть так:

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

Ответ 5

Драйвер foreman по-прежнему использует $PS, поэтому для доступа к имени dyno и его работы как на герою, так и в разработке (при использовании foreman) вы можете сначала проверить $PS, а затем $DYNO. Чтобы обработать случай локальной консоли, проверьте Rails.console

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

Ответ 6

Опасно использовать переменную среды DYNO, потому что ее ценность не гарантируется быть уникальной. Это означает, что вы можете одновременно запустить два динамика, которые на короткое время имеют одинаковое значение переменной DYNO. Безопасный способ сделать это - включить динамические метаданные, а затем использовать переменную среды HEROKU_DYNO_ID. Это позволит вам создавать уникальные идентификаторы запросов. См.: https://devcenter.heroku.com/articles/dyno-metadata