-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathindex.js
91 lines (84 loc) · 2.94 KB
/
index.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
let requests = [];
let requestStartTime, requestEndTime;
let batchIsRunning = false;
const maxRequestsPerBatch = 150;
addEventListener('fetch', event => {
event.passThroughOnException();
event.respondWith(logRequests(event));
})
async function logRequests(event) {
if (!batchIsRunning) {
event.waitUntil(handleBatch(event));
}
if (requests.length >= maxRequestsPerBatch) {
event.waitUntil(postRequests())
}
requestStartTime = Date.now();
const response = await fetch(event.request)
requestEndTime = Date.now();
await requests.push(getRequestData(event.request, response));
return response
}
async function handleBatch(event) {
batchIsRunning = true;
await sleep(10000)
try {
if (requests.length) event.waitUntil(postRequests())
} catch (e) {
}
requests = [];
batchIsRunning = false;
}
function sleep(ms) {
return new Promise(resolve => {
setTimeout(resolve, ms)
})
}
function getRequestData(request, re) {
let data = {
'app': 'myApp',
'timestamp': Date.now(),
'meta': {
'ua': request.headers.get('user-agent'),
'referer': request.headers.get('Referer') || 'empty',
'ip': request.headers.get('CF-Connecting-IP'),
'countryCode': (request.cf || {}).country,
'colo': (request.cf || {}).colo,
'url': request.url,
'method': request.method,
'x_forwarded_for': request.headers.get('x_forwarded_for') || "0.0.0.0",
'asn': (request.cf || {}).asn,
'cfRay': request.headers.get('cf-ray'),
'tlsCipher': (request.cf || {}).tlsCipher,
'tlsVersion': (request.cf || {}).tlsVersion,
'clientTrustScore': (request.cf || {}).clientTrustScore,
'status': (re || {}).status,
'originTime': (requestEndTime - requestStartTime),
'cfCache': (re) ? (re.headers.get('CF-Cache-Status') || 'miss') : 'MISS',
}
};
data.line = data.meta.status + " " + data.meta.countryCode + " " + data.meta.cfCache + " " + data.meta.originTime + 'ms' + " " + data.meta.ip + " " + data.meta.url;
return data;
}
async function postRequests() {
//console.log('posting',data);
let data = JSON.stringify({'lines': requests});
const username = 'My logdna Ingestion key';
const password = '';
const compiledPass = '';
const hostname = 'example.com';
let myHeaders = new Headers();
myHeaders.append('Content-Type', 'application/json; charset=UTF-8');
myHeaders.append('Authorization', 'Basic ' + (compiledPass || btoa(username + ':' + password)));
try {
return fetch('https://logs.logdna.com/logs/ingest?tag=worker&hostname=' + hostname, {
method: 'POST',
headers: myHeaders,
body: data
}).then(function (r) {
requests = [];
});
} catch (err) {
//console.log(err.stack || err);
}
}