Skip to content

Всё о GUC по порядку: application_name

Автор: Christophe Pettus, All Your GUCs in a Row: application_name


Большинство GUC в этой серии будут операционно не важны для большинства читателей. Этот — не такой. application_name — это самое дешёвое средство наблюдаемости (observability infrastructure), которое поставляет PostgreSQL, и поразительное количество производственных баз данных работают с неустановленным значением или со значением, застрявшим на значении по умолчанию клиентской библиотеки (psql, PostgreSQL JDBC Driver или, что я люблю больше всего, — пустая строка).



Это метка уровня сеанса (per-session label). Значение по умолчанию — пустая строка, контекст — user, поэтому любая роль может его установить. Установите его через SET application_name = 'order-service';, через параметр подключения application_name или через переменную окружения PGAPPNAME, которую libpq учитывает автоматически. Максимальная длина — NAMEDATALEN - 1 — 63 байта в стандартной сборке, а непечатаемые символы заменяются на ?.

Почему это должно вас волновать



  • pg_stat_activity предоставляет его как столбец. Когда вы выполняете запрос «что сейчас выполняется» в 2 часа ночи, application_name — это то, как вы отличаете «задание cron» от «пользовательского API» от «the analyst’s ad-hoc notebook».

  • log_line_prefix имеет заполнитель %a. Установите его, и каждая строка журнала будет нести эту метку. grep снова станет инструментом отладки.

  • synchronous_standby_names сопоставляет резервные серверы по их application_name. Для синхронной репликации значение, которое каждый резервный сервер устанавливает в своём primary_conninfo, используется первичным сервером для определения кворума.

  • Инструменты мониторинга (pganalyze, pgwatch, самодельные панели) сегментируют по этому полю. Детальные показатели (granular per-service metrics) достаются бесплатно, если метки хорошие, и невозможны, если их нет.



Что уже делает это (хорошо или плохо)


Командные инструменты PostgreSQL устанавливают разумные значения по умолчанию через libpq с помощью fallback_application_name: psql идентифицирует себя как psql, pg_dump как pg_dump, pg_basebackup как pg_basebackup и так далее. Если вы видите любое из этих имён в pg_stat_activity, вы точно знаете, что выполняется, и можете действовать соответственно. JDBC-драйвер устанавливает PostgreSQL JDBC Driver — бесполезно, но хотя бы не пусто. pgAdmin устанавливает что-то вроде pgAdmin 4 - CONN:1234567, что включает идентификатор сеанса и действительно полезно. pg gem (Ruby) и psycopg (Python) оставляют это поле пустым, если вы не настроили их.



Закономерность: производственные инструменты устанавливают идентифицирующие значения по умолчанию. Драйверы приложений оставляют это вам.



Установка в используемых вами фреймворках



Django


Передайте application_name через OPTIONS в DATABASES:



DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myapp',
'OPTIONS': {
'application_name': f'myapp-{os.environ.get("DYNO", "local")}',
},
}
}


Всё в OPTIONS передаётся как именованные аргументы в psycopg. Включите ваш dyno, pod или имя хоста, если вам нужна детализация на уровне экземпляра.



SQLAlchemy


Два одинаково хороших варианта. В URL:



create_engine("postgresql+psycopg://user:pw@host/db?application_name=myapp-worker")


Или в connect_args:



create_engine(
"postgresql+psycopg://user:pw@host/db",
connect_args={"application_name": "myapp-worker"},
)


Результат тот же. Выберите тот, который подходит вашему стилю конфигурации.



Active Record (Rails)


В config/database.yml добавьте application_name как ключ — адаптер PostgreSQL Active Record передаёт неизвестные ключи драйверу pg, который передаёт их в libpq:



production:
adapter: postgresql
database: myapp_production
application_name: <%= "myapp-#{ENV.fetch('HOSTNAME', 'unknown')}" %>


В Kubernetes HOSTNAME по умолчанию является именем пода (pod name), что даёт вам бесплатную атрибуцию на уровень пода.



Для всех трёх: если вы хотите одну метку без изменения конфигурации, установите PGAPPNAME в окружении процесса. libpq подхватит её автоматически, и каждое подключение из этого процесса унаследует её.



Соглашения об именах, которые окупаются


service-role-version — например, checkout-writer-v4, analytics-reader, migrations-2026-03-15. Включите достаточно для устранения неоднозначности; пропустите всё, что имеет высокую кардинальность (high-cardinality). application_name — это не место для идентификаторов запросов.



Операционные примечания



  • pgbouncer отслеживает application_name для каждого клиента по умолчанию в режиме пула транзакций (transaction pooling mode), поэтому сервер всегда видит правильный. Установите application_name_add_host = 1, если вы также хотите добавить IP-адрес и порт клиента — полезно, когда у одной службы есть много экземпляров за одной и той же меткой.

  • Значения по умолчанию большинства клиентских библиотек бесполезны. Переопределяйте их в строке подключения. Не доверяйте значению по умолчанию.

  • Ограничение в 63 байта реально. Усечение происходит без предупреждения. Оставьте запас.



Рекомендация: Установите его везде. Установите его правильно. Пять минут, которые вы потратите на обновление строк подключения в ваших сервисах, — это то, за что вы поблагодарите себя первым делом в 2 часа ночи.






(Это #4 в серии о каждом GUC PostgreSQL по состоянию на версию 18, в алфавитном порядке.)


Trackbacks

No Trackbacks

Comments

Display comments as Linear | Threaded

No comments

The author does not allow comments to this entry

Add Comment

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Submitted comments will be subject to moderation before being displayed.