RSS Git Download  Clone
Raw Blame History 3kB 122 lines
/* from npm's redis-info, adding missing avg_ttl */

const fromPairs = require('lodash.frompairs')
const find = require('lodash.find')
const has = require('lodash.has')

module.exports = {
    parse: function (info) {
        return parseFields(splitStr(info))
    }
}


function startWith(pattern) {
    return function (value) {
        return value.indexOf(pattern) === 0
    }
}


function split(s) {
    return function (v) {
        return v.split(s)
    }
}

function orEmptyStr(v) {
    return v || ''
}


function takeN(func, n) {
    return function (v) {
        return func(v[n])
    }
}

function takeFirst(func) {
    return takeN(func, 0)
}

/**
 * Split the info string by \n and :
 * @param  {String} str the returned redis info
 * @return {Array}     Array of [key, value]
 */
function splitStr(str) {
  return str.split('\n')
        .filter(function (line) {
          return line.length > 0 && line.indexOf('#') !== 0
        })
        .map(function (line) {
          return line.trim().split(':')
        })
}

function parseDatabases(info) {
  return info
        .filter(takeFirst(startWith('db')))
        .map(function _parseDatabaseInfo(args) {
              var dbName = args[0]
              var value = args[1]
              var values = orEmptyStr(value).split(',')
              console.log({values})

              function extract(param) {
                  return parseInt(orEmptyStr(find(values, startWith(param))).split('=')[1] || 0, 10)
              }

              return {
                    index: parseInt(dbName.substr(2), 10),
                    keys: extract('keys'),
                    expires: extract('expires'),
                    avg_ttl: extract('avg_ttl'),
              }
        })
        .reduce(function (m, v) {
              m[v.index] = {
                keys: v.keys,
                expires: v.expires,
                avg_ttl: v.avg_ttl,
              }
              return m
        }, {})
}

function parseCommands(info) {
    return fromPairs(info.filter(function (a) {
        return orEmptyStr(a[0]).indexOf('cmdstat_') === 0
    })
    .map(function _parseCommands(args) {
          var v = args[0]
          var a = args[1]
          var val = fromPairs(orEmptyStr(a).split(',').map(split('=')))
          if (has(val, 'calls')) {
              val.calls = parseInt(val.calls, 10)
          }
          if (has(val, 'usec')) {
              val.usec = parseInt(val.usec, 10)
          }
          if (has(val, 'usec_per_call')) {
              val.usec_per_call = parseFloat(val.usec_per_call, 10)
          }
          return [orEmptyStr(v).split('_')[1], val]
    }))
}

function parseFields(info) {
  var fields = info.reduce(function (m, v) {
        if (!v[0].trim() || v[0].indexOf('db') === 0 ||  v[0].indexOf('cmdstat_') === 0) {
            return m
        }
        m[v[0]] = v[1]
        return m
      }, {
          databases: parseDatabases(info),
          commands: parseCommands(info)
      })

    return fields
}