Сбор основных показателей PostgreSQL

Настраиваем периодический сбор данных при помощи psql:

sudo su - postgres
crontab -e
# добавляем следующий код
*/15 * * * * psql -U postgres -d postgres -c "SELECT datname, xact_commit, now(), numbackends FROM pg_stat_database where datname = 'cic-release-db' or datname = 'hangfire'" >> /var/lib/postgresql/pg_stat_database.log

Примечание: имена таблиц в pg_stat_database указывать свои.

Далее форматируем сохраненные данные в csv:

// sudo su - postgres
//crontab -e
//# добавляем следующий код
//*/15 * * * * psql -U postgres -d postgres -c "SELECT datname, xact_commit, now(), numbackends FROM pg_stat_database where datname = 'cic-release-db' or datname = 'hangfire'" >> /var/lib/postgresql/pg_stat_database.log

/**
 * Простое применение: node script.js /var/data.log
 * Полный синтаксис: node script.js /var/data.log /var/data.log.csv ;
 * Версия: 1.0
 */
const SEPARATE = process.argv[4] || ',';
const fs = require('fs');
const pth = require('path');
var filePath = process.argv[2];
if(fs.existsSync(filePath)) {
    var data = fs.readFileSync(filePath).toString();
    var dbOut = {};
    var output = 'datname' + SEPARATE + 'xact_commit' + SEPARATE + 'now' + SEPARATE + 'numbackends\n';

    var lines = data.split('\n');
    for(var i in lines.slice(2, lines.length)) {
        var line = lines[i];
        if(line.trim() == '' || line.indexOf('(') >=0 || line.indexOf('datname') >= 0 || line.indexOf('-----') >= 0)
            continue;

        if(line) {
            var data = line.split('|');
            var name = data[0].trim();
            if(!dbOut[name]) {
                dbOut[name] = '';
            }

            dbOut[name] += data[0].trim() + SEPARATE + data[1].trim() + SEPARATE + data[2].trim() + SEPARATE + data[3].trim() + '\n';
        }
    }


    for(var i in dbOut) {
        var str = output + dbOut[i].trimEnd();
        var file = (process.argv[3] || (process.argv[2] + '.csv'));
        var dir = pth.dirname(file);
        var name = pth.basename(file);

        fs.writeFileSync(pth.join(dir, i + '_' + name), str);
    }
}

На вход принимается два параметра:

  • путь к файлу для обработки
  • файл куда требуется сохранить информацию
  • разделитель для CSV

Пример:

psql.js data.log output.csv ,

Далее распарсив данные можно воспользоваться интернет ресурсом CSV Plot — Online CSV plots для построения отчета на основе CSV

Print Friendly, PDF & Email

Добавить комментарий