Consolidate stats module
This commit is contained in:
parent
49c55af59d
commit
2e3c9ff526
|
@ -1,6 +1,6 @@
|
||||||
import { subDays, startOfDay, startOfSecond } from 'date-fns';
|
import { subDays, startOfDay, startOfSecond } from 'date-fns';
|
||||||
|
|
||||||
import { getStats } from '../utils/stats';
|
import getStats from './utils/getStats.js';
|
||||||
|
|
||||||
export default function serveStats(req, res) {
|
export default function serveStats(req, res) {
|
||||||
let since, until;
|
let since, until;
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
import fetch from 'isomorphic-fetch';
|
import fetch from 'isomorphic-fetch';
|
||||||
import invariant from 'invariant';
|
import invariant from 'invariant';
|
||||||
import gunzip from 'gunzip-maybe';
|
|
||||||
import ndjson from 'ndjson';
|
|
||||||
|
|
||||||
const cloudflareURL = 'https://api.cloudflare.com/client/v4';
|
const cloudflareURL = 'https://api.cloudflare.com/client/v4';
|
||||||
const cloudflareEmail = process.env.CLOUDFLARE_EMAIL;
|
const cloudflareEmail = process.env.CLOUDFLARE_EMAIL;
|
||||||
|
@ -14,7 +12,7 @@ invariant(
|
||||||
|
|
||||||
invariant(cloudflareKey, 'Missing the $CLOUDFLARE_KEY environment variable');
|
invariant(cloudflareKey, 'Missing the $CLOUDFLARE_KEY environment variable');
|
||||||
|
|
||||||
export function get(path, headers) {
|
function get(path, headers) {
|
||||||
return fetch(`${cloudflareURL}${path}`, {
|
return fetch(`${cloudflareURL}${path}`, {
|
||||||
headers: Object.assign({}, headers, {
|
headers: Object.assign({}, headers, {
|
||||||
'X-Auth-Email': cloudflareEmail,
|
'X-Auth-Email': cloudflareEmail,
|
||||||
|
@ -23,7 +21,7 @@ export function get(path, headers) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getJSON(path, headers) {
|
function getJSON(path, headers) {
|
||||||
return get(path, headers)
|
return get(path, headers)
|
||||||
.then(res => {
|
.then(res => {
|
||||||
return res.json();
|
return res.json();
|
||||||
|
@ -72,21 +70,3 @@ export function getZoneAnalyticsDashboard(zones, since, until) {
|
||||||
})
|
})
|
||||||
).then(results => results.reduce(reduceResults));
|
).then(results => results.reduce(reduceResults));
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getJSONStream(path, headers) {
|
|
||||||
const gzipHeaders = Object.assign({}, headers, {
|
|
||||||
'Accept-Encoding': 'gzip'
|
|
||||||
});
|
|
||||||
|
|
||||||
return get(path, gzipHeaders)
|
|
||||||
.then(res => res.body.pipe(gunzip()))
|
|
||||||
.then(stream => stream.pipe(ndjson.parse()));
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getLogs(zoneId, startTime, endTime, fieldsArray) {
|
|
||||||
const fields = fieldsArray.join(',');
|
|
||||||
|
|
||||||
return getJSONStream(
|
|
||||||
`/zones/${zoneId}/logs/received?start=${startTime}&end=${endTime}&fields=${fields}`
|
|
||||||
);
|
|
||||||
}
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
import * as cloudflare from './cloudflare.js';
|
||||||
|
|
||||||
|
function extractPublicInfo(data) {
|
||||||
|
return {
|
||||||
|
since: data.since,
|
||||||
|
until: data.until,
|
||||||
|
requests: {
|
||||||
|
all: data.requests.all,
|
||||||
|
cached: data.requests.cached,
|
||||||
|
country: data.requests.country,
|
||||||
|
status: data.requests.http_status
|
||||||
|
},
|
||||||
|
bandwidth: {
|
||||||
|
all: data.bandwidth.all,
|
||||||
|
cached: data.bandwidth.cached,
|
||||||
|
country: data.bandwidth.country
|
||||||
|
},
|
||||||
|
threats: {
|
||||||
|
all: data.threats.all,
|
||||||
|
country: data.threats.country
|
||||||
|
},
|
||||||
|
uniques: {
|
||||||
|
all: data.uniques.all
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const DomainNames = ['unpkg.com', 'npmcdn.com'];
|
||||||
|
|
||||||
|
export default async function getStats(since, until) {
|
||||||
|
const zones = await cloudflare.getZones(DomainNames);
|
||||||
|
const dashboard = await cloudflare.getZoneAnalyticsDashboard(
|
||||||
|
zones,
|
||||||
|
since,
|
||||||
|
until
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
timeseries: dashboard.timeseries.map(extractPublicInfo),
|
||||||
|
totals: extractPublicInfo(dashboard.totals)
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,145 +0,0 @@
|
||||||
// import data from './data';
|
|
||||||
import * as cloudflare from './cloudflare';
|
|
||||||
|
|
||||||
export function createDayKey(date) {
|
|
||||||
return `${date.getUTCFullYear()}-${date.getUTCMonth()}-${date.getUTCDate()}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function createHourKey(date) {
|
|
||||||
return `${createDayKey(date)}-${date.getUTCHours()}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function createMinuteKey(date) {
|
|
||||||
return `${createHourKey(date)}-${date.getUTCMinutes()}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
// function createScoresMap(array) {
|
|
||||||
// const map = {};
|
|
||||||
|
|
||||||
// for (let i = 0; i < array.length; i += 2) {
|
|
||||||
// map[array[i]] = parseInt(array[i + 1], 10);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// return map;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// function getScoresMap(key, n = 100) {
|
|
||||||
// return new Promise((resolve, reject) => {
|
|
||||||
// data.zrevrange(key, 0, n, 'withscores', (error, value) => {
|
|
||||||
// if (error) {
|
|
||||||
// reject(error);
|
|
||||||
// } else {
|
|
||||||
// resolve(createScoresMap(value));
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
|
|
||||||
// function getPackageRequests(date, n = 100) {
|
|
||||||
// return getScoresMap(`stats-packageRequests-${createDayKey(date)}`, n);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// function getPackageBandwidth(date, n = 100) {
|
|
||||||
// return getScoresMap(`stats-packageBytes-${createDayKey(date)}`, n);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// function getProtocolRequests(date) {
|
|
||||||
// return getScoresMap(`stats-protocolRequests-${createDayKey(date)}`);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// function addDailyMetricsToTimeseries(timeseries) {
|
|
||||||
// const since = new Date(timeseries.since);
|
|
||||||
|
|
||||||
// return Promise.all([
|
|
||||||
// getPackageRequests(since),
|
|
||||||
// getPackageBandwidth(since),
|
|
||||||
// getProtocolRequests(since)
|
|
||||||
// ]).then(results => {
|
|
||||||
// timeseries.requests.package = results[0];
|
|
||||||
// timeseries.bandwidth.package = results[1];
|
|
||||||
// timeseries.requests.protocol = results[2];
|
|
||||||
// return timeseries;
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
|
|
||||||
// function sumMaps(maps) {
|
|
||||||
// return maps.reduce((memo, map) => {
|
|
||||||
// Object.keys(map).forEach(key => {
|
|
||||||
// memo[key] = (memo[key] || 0) + map[key];
|
|
||||||
// });
|
|
||||||
|
|
||||||
// return memo;
|
|
||||||
// }, {});
|
|
||||||
// }
|
|
||||||
|
|
||||||
// function addDailyMetrics(result) {
|
|
||||||
// return Promise.all(result.timeseries.map(addDailyMetricsToTimeseries)).then(
|
|
||||||
// () => {
|
|
||||||
// result.totals.requests.package = sumMaps(
|
|
||||||
// result.timeseries.map(timeseries => {
|
|
||||||
// return timeseries.requests.package;
|
|
||||||
// })
|
|
||||||
// );
|
|
||||||
|
|
||||||
// result.totals.bandwidth.package = sumMaps(
|
|
||||||
// result.timeseries.map(timeseries => timeseries.bandwidth.package)
|
|
||||||
// );
|
|
||||||
|
|
||||||
// result.totals.requests.protocol = sumMaps(
|
|
||||||
// result.timeseries.map(timeseries => timeseries.requests.protocol)
|
|
||||||
// );
|
|
||||||
|
|
||||||
// return result;
|
|
||||||
// }
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
function extractPublicInfo(data) {
|
|
||||||
return {
|
|
||||||
since: data.since,
|
|
||||||
until: data.until,
|
|
||||||
requests: {
|
|
||||||
all: data.requests.all,
|
|
||||||
cached: data.requests.cached,
|
|
||||||
country: data.requests.country,
|
|
||||||
status: data.requests.http_status
|
|
||||||
},
|
|
||||||
bandwidth: {
|
|
||||||
all: data.bandwidth.all,
|
|
||||||
cached: data.bandwidth.cached,
|
|
||||||
country: data.bandwidth.country
|
|
||||||
},
|
|
||||||
threats: {
|
|
||||||
all: data.threats.all,
|
|
||||||
country: data.threats.country
|
|
||||||
},
|
|
||||||
uniques: {
|
|
||||||
all: data.uniques.all
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
const DomainNames = ['unpkg.com', 'npmcdn.com'];
|
|
||||||
|
|
||||||
function fetchStats(since, until) {
|
|
||||||
return cloudflare.getZones(DomainNames).then(zones => {
|
|
||||||
return cloudflare
|
|
||||||
.getZoneAnalyticsDashboard(zones, since, until)
|
|
||||||
.then(dashboard => {
|
|
||||||
return {
|
|
||||||
timeseries: dashboard.timeseries.map(extractPublicInfo),
|
|
||||||
totals: extractPublicInfo(dashboard.totals)
|
|
||||||
};
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// const oneMinute = 1000 * 60;
|
|
||||||
// const oneHour = oneMinute * 60;
|
|
||||||
// const oneDay = oneHour * 24;
|
|
||||||
|
|
||||||
export function getStats(since, until) {
|
|
||||||
const promise = fetchStats(since, until);
|
|
||||||
// return until - since > oneDay ? promise.then(addDailyMetrics) : promise;
|
|
||||||
return promise;
|
|
||||||
}
|
|
Loading…
Reference in New Issue