ΠΠΎΠΌΠΏΠ°Π½ΠΈΡ ΠΏΡΡΠ½Π° Π΅Π΄Π½ΠΎΠΈΠΌΠ΅Π½Π½ΠΎΡΠΎ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ pgsentinel (), ΠΊΠΎΠ΅ΡΠΎ Π΄ΠΎΠ±Π°Π²Ρ Π² PostgreSQL ΠΈΠ·Π³Π»Π΅Π΄Π° pg_active_session_history β ΠΈΡΡΠΎΡΠΈΡ Π½Π° Π°ΠΊΡΠΈΠ²Π½ΠΈΡΠ΅ ΡΠ΅ΡΠΈΠΈ (Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π½Π° ΠΎΡΠ°ΠΊΠ»ΠΎΠ²ΠΎΡΠΎ v$active_session_history).
ΠΠΎ ΡΡΡΠ΅ΡΡΠ²ΠΎ, ΡΠΎΠ²Π° ΡΠ° ΠΏΡΠΎΡΡΠΎ ΡΠ½ΠΈΠΌΠΊΠΈ ΠΎΡ pg_stat_activity Π²ΡΡΠΊΠ° ΡΠ΅ΠΊΡΠ½Π΄Π°, Π½ΠΎ ΠΈΠΌΠ° Π²Π°ΠΆΠ½ΠΈ ΠΌΠΎΠΌΠ΅Π½ΡΠΈ:
- ΠΡΠΈΡΠΊΠ°ΡΠ° Π½Π°ΡΡΡΠΏΠ°Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π° ΡΠ°ΠΌΠΎ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½Π°ΡΠ° ΠΏΠ°ΠΌΠ΅Ρ, Π° ΠΊΠΎΠ½ΡΡΠΌΠΈΡΠ°Π½ΠΈΡ ΠΎΠ±Π΅ΠΌ ΠΏΠ°ΠΌΠ΅Ρ ΡΠ΅ ΡΠ΅Π³ΡΠ»ΠΈΡΠ° ΠΎΡ Π±ΡΠΎΡ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΎ ΡΡΡ ΡΠ°Π½Π΅Π½ΠΈΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ.
- ΠΠΎΠ±Π°Π²Ρ ΡΠ΅ ΠΏΠΎΠ»Π΅ queryid β ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠΎΠ·ΠΈ queryid ΠΎΡ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ pg_stat_statements (ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡ).
- ΠΠΎΠ±Π°Π²Ρ ΡΠ΅ ΠΏΠΎΠ»Π΅ top_level_query β ΡΠ΅ΠΊΡΡΡΡ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ°, ΠΎΡ ΠΊΠΎΡΡΠΎ Π΅ ΠΈΠ·Π²ΠΈΠΊΠ°Π½Π° ΡΠ΅ΠΊΡΡΠ°ΡΠ° Π·Π°ΡΠ²ΠΊΠ° (Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° pl/pgsql)
ΠΡΠ»Π΅Π½ ΡΠΏΠΈΡΡΠΊ Π½Π° ΠΏΠΎΠ»Π΅ΡΠ°ΡΠ° pg_active_session_history:
Column | Type
------------------+--------------------------
ash_time | timestamp with time zone
datid | oid
datname | text
pid | integer
usesysid | oid
usename | text
application_name | text
client_addr | text
client_hostname | text
client_port | integer
backend_start | timestamp with time zone
xact_start | timestamp with time zone
query_start | timestamp with time zone
state_change | timestamp with time zone
wait_event_type | text
wait_event | text
state | text
backend_xid | xid
backend_xmin | xid
top_level_query | text
query | text
queryid | bigint
backend_type | text
ΠΠΎΡΠΎΠ² ΠΏΠ°ΠΊΠ΅Ρ Π·Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡ Π·Π°ΡΠ΅Π³Π° Π½ΡΠΌΠ°. ΠΡΠ΅ΠΏΠΎΡΡΡΠ²Π° ΡΠ΅ Π΄Π° ΡΠ΅ ΡΠ²Π°Π»ΡΡ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ Π΄Π° ΡΠ΅ ΡΡΠ±Π΅ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½ΠΎ. ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° βdevelβ-ΠΏΠ°ΠΊΠ΅Ρ Π·Π° ΡΡΡΠ²ΡΡΠ° ΠΈ Π² ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° PATH Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΈΡΠ΅ ΠΏΡΡΡΡ Π΄ΠΎ pg_config. Π‘ΡΠ±ΠΈΡΠ°ΠΌΠ΅:
cd pgsentinel/src
Π½Π°ΠΏΡΠ°Π²ΠΈ
make install
ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π² postgres.conf:
shared_preload_libraries = βpg_stat_statements,pgsentinelβ
track_activity_query_size = 2048
pg_stat_statements.track = all# ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ
pgsentinel_ash.max_entries = 10000
Π Π΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ PostgreSQL ΠΈ ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ:
create extension pgsentinel;
ΠΠ°ΡΡΡΠΏΠ°Π½Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ Π½Π° Π²ΡΠΏΡΠΎΡΠΈ ΠΊΠ°ΡΠΎ:
- ΠΠ° ΠΊΠ°ΠΊΠ²ΠΈ ΠΎΡΠ°ΠΊΠ²Π°Π½ΠΈΡ ΡΠ΅ΡΠΈΠΈΡΠ΅ ΡΠ° ΠΏΡΠ΅ΠΊΠ°ΡΠ°Π»ΠΈ Π½Π°ΠΉ-ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅?
- ΠΠΎΠΈ ΡΠ΅ΡΠΈΠΈ Π±ΡΡ Π° Π½Π°ΠΉ-Π°ΠΊΡΠΈΠ²Π½ΠΈ?
- ΠΠΎΠΈ Π·Π°ΡΠ²ΠΊΠΈ Π±ΡΡ Π° Π½Π°ΠΉ-Π°ΠΊΡΠΈΠ²Π½ΠΈ?
ΠΡΠ³ΠΎΠ²ΠΎΡΠΈΡΠ΅ Π½Π° ΡΠ΅Π·ΠΈ Π²ΡΠΏΡΠΎΡΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΡΠ΅Π· SQL-Π·Π°ΡΠ²ΠΊΠΈ, Π½ΠΎ Π΅ ΠΏΠΎ-ΡΠ΄ΠΎΠ±Π½ΠΎ Π΄Π° Π³ΠΈ Π²ΠΈΠ΄ΠΈΡΠ΅ Π²ΠΈΠ·ΡΠ°Π»Π½ΠΎ Π½Π° Π³ΡΠ°ΡΠΈΠΊΠ°, ΠΊΠ°ΡΠΎ ΠΏΠΎΠ΄ΡΠ΅ΡΡΠ°Π΅ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°ΡΠΈΡΠ΅ Π²ΠΈ Π²ΡΠ΅ΠΌΠ΅Π²ΠΈ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΈ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π±Π΅Π·ΠΏΠ»Π°ΡΠ½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° (ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΠΈΡΠ΅ ΡΡΠ±ΡΠ°Π½ΠΈΡΠ΅ Π±ΠΈΠ½Π°ΡΠ½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² ΡΠ°Π·Π΄Π΅Π»Π° ).
ΠΠΎΠ³Π°ΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ PASH-Viewer (ΠΎΡ Π²Π΅ΡΡΠΈΡ 0.4.0), ΡΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Π·Π° Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ pg_active_session_history ΠΈ Π°ΠΊΠΎ ΡΠ°ΠΊΠΎΠ²Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°, Π·Π°ΡΠ΅ΠΆΠ΄Π° ΡΡΠ»Π°ΡΠ° Π½Π°ΡΡΡΠΏΠ°Π½Π° ΠΈΡΡΠΎΡΠΈΡ ΠΎΡ Π½Π΅Π³ΠΎ ΠΈ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π° Π΄Π° ΡΠ΅ΡΠ΅ Π½ΠΎΠ²ΠΎΠΏΠΎΡΡΡΠΏΠ²Π°ΡΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π°ΠΉΠΊΠΈ Π³ΡΠ°ΡΠΈΠΊΠ° Π½Π° Π²ΡΠ΅ΠΊΠΈ 15 ΡΠ΅ΠΊΡΠ½Π΄ΠΈ.

ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
