[nodejs / pageres] 웹 서비스 상태 확인하기
- 꼬반
- 2016. 1. 5. 17:47
회사에서 관리하는 웹 서비스가 약 40개 가량 되다보니 모니터링이나 관리가 필요하여
어제, 오늘 간단하게 만들어보았습니다.
물론 해당 서버들에는 nagios 나 whatap, whatsup 등으로 모니터링을 하고 있고
서비스가 다운되면 메일로 알림이 오긴 하지만
아무래도 한눈에 지금 사이트들이 다 정상인지 아닌지 확인하기는 좀 어려운 부분이 있는건 사실입니다.
그래서 다음과 같은 요구 사항을 가지고 만들었습니다.
1. 모니터링 도메인의 추가/삭제 가능
2. 해당 도메인의 현재 상태 (response 응답 코드) 확인 가능 (대시보드에 접속했을때 동작)
3. 해당 사이트에 메인 페이지 스크린샷 저장 가능
일단은 위 요구사항을 기본으로 다음과 같이 작성하였습니다.
URL 부분은 가려두었습니다. 액션부분은 아직 미정인 부분입니다.
메인에 접속하면 모니터링 대상 도메인을 불러와 상태를 확인하고 해당 스크린샷을 찍어서 테이블로 뿌려줍니다.
ui는 bootstrap / nodejs, express, pageres 가 주 모듈이고, DB는 사용하지 않습니다.
개선 사항으로는
1. 스크린샷에서 확인되는 것 처럼 NO가 정렬되지 않고 노출되는 부분에 대한 수정
2. 스크린샷이 현재 시점으로 저장되는데 날짜와 시간을 파일명에 추가하여 이력관리가 가능하도록 할 것
3. 액션 추가 (왼쪽 메뉴의 관리, 이력 포함)
정도가 있습니다. 추후 수정하겠죠.. 아마...
주요 소스는 아래와 같습니다.
index.js - router
router.get('/', function(req, res) { fs.readFile('../url.list', 'utf8', function (err, data) { var array_url = data.split("\n"); res.header("Access-Control-Allow-Origin" , "*"); res.render('index', { result: array_url }); }); }); router.get('/load', function(req, res) { fs.readFile('../url.list', 'utf8', function (err, data) { var array_url = data.split("\n"); res.header("Access-Control-Allow-Origin" , "*"); res.send(array_url); }); }); router.post('/check', function(req, res) { var body = req.body; //console.log(body.t_url); check.checkUrlStatus(body.t_url, function(result) { //console.log(result); res.header("Access-Control-Allow-Origin" , "*"); res.send(result+" : "+body.cnt); }); });
checkUrl.js /** * Created by ggoban on 16. 1. 4. */ var http = require('http'), url = require('url'), Pageres = require('pageres'); require('events').EventEmitter.defaultMaxListeners = Infinity; exports.checkUrlStatus = function (Url, callback) { var options = { method: 'GET', host: url.parse(Url).host, port: 80, path: url.parse(Url).pathname }; var pageres = new Pageres({delay: 2}) .src(Url, ['1024x768']) .dest(__dirname+'/public/screenshot'); pageres.run(function (err) { if (err) { throw err; console.log(err); } console.log('done'); }); http.get(options, function (res) { //console.log(options); //console.log(res.statusCode); callback(options.host+options.path+" : "+res.statusCode); }).on('error', function(e) { //console.log(options); //console.log(e.message); callback(options.host+options.path+" : "+ e.message); }); }
위 버전은 현재 standalone 버전으로 작성해두었고 원래 진행하고 있는 satm쪽으로 모듈을 추가할 예정입니다.
월, 화 이틀동안 급조하느라 소스가 매우 허접합니다. ㅠ _ㅠ 혹시나 해당 포스팅을 보시게 되면 가감없이
수정할 부분이나 부족한 부분에 대해 지적해주시면 매우 감사하겠습니다.