Всё о 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
The author does not allow comments to this entry
Comments
Display comments as Linear | Threaded