pm2
Version:
Production process manager for Node.JS applications with a built-in load balancer.
60 lines (48 loc) • 1.79 kB
JavaScript
const IOAPI = require('@pm2/js-api')
const fs = require('fs')
const path = require('path')
const PM2_HOME = process.env.PM2_HOME || path.resolve(require('os').homedir(), '.pm2')
const TOKEN_PATH = path.resolve(PM2_HOME, 'pm2-io-token')
const BUCKET_NAME = process.argv[2] || 'Keymetrics - Production'
let tokens
try {
tokens = JSON.parse(fs.readFileSync(TOKEN_PATH, 'utf8'))
} catch (err) {
console.error(`Cannot read token file at ${TOKEN_PATH}`)
console.error('Run "pm2 plus login" first.')
process.exit(1)
}
const io = new IOAPI()
io._network.tokens = tokens
io._network.authenticated = true
async function main() {
const res = await io.bucket.retrieveAll()
const bucket = res.data.find(b => b.name === BUCKET_NAME)
if (!bucket) {
console.log(`Bucket "${BUCKET_NAME}" not found.`)
console.log('Available buckets:')
res.data.forEach(b => console.log(` - ${b.name} (${b._id})`))
process.exit(1)
}
console.log(`Bucket: ${bucket.name} (${bucket._id})\n`)
const issues = await io.data.issues.list(bucket._id, {})
const exceptions = issues.data || []
console.log(`Exceptions: ${exceptions.length}\n`)
exceptions.slice(0, 100).forEach((ex, i) => {
const last = ex.last || {}
const date = last.at || '-'
const count = ex.count || '-'
const app = last.app || '-'
const server = last.server || '-'
const msg = (last.message || '').substring(0, 120)
const callsite = last.callsite || ''
console.log(`${String(i + 1).padStart(3)}. [${date}] ${app}@${server} (x${count})`)
console.log(` ${msg}`)
if (callsite) console.log(` ${callsite}`)
})
}
main().catch(err => {
console.error('Error:', err.data || err.message || err)
process.exit(1)
}).then(() => process.exit(0))