-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprocessor.js
113 lines (98 loc) · 3.23 KB
/
processor.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
const cron = require('node-cron');
const mongo = require('mongodb').MongoClient
const url = 'mongodb://localhost:27017'
const admin = require("firebase-admin");
const secrets = require("./private/keys.json")
const moment = require('moment-timezone')
const bunyan = require('bunyan');
const fetch = require('node-fetch')
let log = bunyan.createLogger({name: "stomprocket-status-processor"});
const serviceAccount = secrets.firebase;
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(secrets.sendgrid);
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://stomprocket-status.firebaseio.com"
});
log.info(`Initialized Stomp Rocket Status Processor ${moment().tz("America/Los_Angeles").format('dddd, MMMM Do YYYY, h:mm:ss a')}`);
function check() {
log.info('starting a check')
mongo.connect(url, {
useNewUrlParser: true,
useUnifiedTopology: true
}, (err, client) => {
if (err) {
console.error(err)
return
}
const db = client.db('status-db')
db.collection('properties').find({}, {_id: 1, name: 1, url: 1}).toArray((err, properties) => {
client.close()
properties.forEach(async property => {
log.info('checking', property.url, property.name, property._id)
const startTime = moment()
let result = {}
const res = await fetch(property.url, {
method: 'get'
})
const endTime = moment()
const endTimeUnix = endTime.unix()
//console.log(endTimeUnix)
if (res.ok) {
result = {
timeStamp: endTimeUnix,
status: res.status,
ok: res.ok,
responseTime: endTime.diff(startTime, 'milliseconds')
}
log.info(`${property._id} status good ${res.status} response time: ${result.responseTime}`)
} else {
log.info(`${property._id} status ${res.status}`)
result = {
timeStamp: endTimeUnix,
status: res.status,
ok: res.ok
}
}
//console.log(property.id, result.timeStamp, result)
/*
db.collection('properties').doc(property.id).collection('logs').add(result).then(i => {
log.info('written property to firebase', i.error)
})*/
mongo.connect(url, {
useNewUrlParser: true,
useUnifiedTopology: true
}, async (err, client) => {
if (err) {
console.error(err)
return
}
const db = client.db('status-db')
log.info(`updating: ${property._id}`)
await db.collection('properties').updateOne({_id: property._id}, {
$push: {logArray: result}
}).catch(err => {
console.log(err)
})
log.info(`updated: ${property._id}`)
client.close()
})
})
})
})
}
/*
db.collection('properties').onSnapshot(snapshot => {
properties = []
snapshot.forEach(snap => {
properties.push({id: snap.id, data: snap.data()})
})
log.info('updated properties ', properties.length, 'in total')
check()
})
*/
check()
cron.schedule('*/5 * * * *', () => {
log.info('running checks every 5 minutes', moment().tz("America/Los_Angeles").format('h:mm:s a'));
check()
});