Description
Вышла версия 3.0, в ней был доработан плагин xlog.py
Мои замечания и предложения:
- Проблема с инстансами
В коде плагина используется следующий алгоритм для идентификации инстансов
CONCAT(application_name, ' ', pid) as application_name
Однако, pid меняется при рестарте, и таким образом, у нас будут появляться время от времени куча метрик :) и будет нарушаться история
Может быть лучше опираться на настройку cluster_name ?
Это удобный способ именовать инстансы и таким образом при рестартах ключи метрик не будут "убегать" :)
CONCAT(application_name, ' ', current_setting('cluster_name')) as application_name
- Проблема с измерением общего лага репликации
в коде плагина xlog.pay есть код:
result_lags = Pooler.run_sql_type('wal_lag_lsn')
if result_lags:
lags = []
for info in result_lags:
...
zbx.send('pgsql.replication.total_lag[{0}]'.format(
info[0]), float(info[4]), self.DELTA_SPEED)
Здесь вычисляется общий лаг репликации как: pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn)
данное число является конечным значением лага в байтах и его нужно показать как есть. Вычислять разницу с предыдущим значением нельзя!
Нужно удалить , self.DELTA_SPEED
. Удалить нужно в двух ветках, для версии старше 10 и младше.
Соответственно, в def discovery_rules
предлагаю заменить в наименованиях метрики Delta of total lag
на Total lag in bytes
и дополнительно добавить в описание метрики указание, что метрика:
{'key': self.right_type(self.key_total_lag, var_discovery="{#APPLICATION_NAME},"),
представляем собой байты:
'units': Plugin.UNITS.bytes,
- Вычисление лага репликации на реплике:
Предлагаю уйти от столь уникального способа измерения лага репликации как трансляции метки даты времени с мастера на реплику и сравнении её со временем на реплике.
Проблемы хорошо описаны здесь: смотри issue #107
Предлагаю изменить код функции FUNCTION mamonsu.timestamp_get()
select case when pg_last_wal_receive_lsn() = pg_last_wal_replay_lsn() then 0
else extract (epoch from now() - pg_last_xact_replay_timestamp())
end;
это позволит в случае совпадения проигранного и полученного lsn показывать 0, в другом же варианте просто показываем разницу между текущим временем и временем проигранной транзакции