Revision 58478
Added by Konstantinos Triantafyllou about 4 years ago
modules/uoa-services-portal/trunk/services/cache/mecache/cache.js | ||
---|---|---|
10 | 10 |
app.use(cors()); |
11 | 11 |
|
12 | 12 |
const register = new prom.Registry(); |
13 |
prom.collectDefaultMetrics({register: register}); |
|
13 | 14 |
|
14 | 15 |
const responses = new prom.Counter({ |
15 | 16 |
name: 'cache_http_responses_total', |
16 | 17 |
help: 'A counter for cache response codes for every API request.', |
17 |
labelNames: ['url', 'code'],
|
|
18 |
labelNames: ['scheme', 'target', 'code', 'cache'],
|
|
18 | 19 |
registers: [register] |
19 | 20 |
}); |
20 | 21 |
|
22 |
const entries = new prom.Counter({ |
|
23 |
name: 'cache_used_entries', |
|
24 |
help: 'A counter to count cache entries', |
|
25 |
registers: [register] |
|
26 |
}); |
|
27 |
|
|
21 | 28 |
const histogram = new prom.Histogram({ |
22 | 29 |
name: 'cache_http_request_duration_seconds', |
23 |
help: 'A Histogram for cache. Providing information about API request and load latency in seconds.',
|
|
24 |
labelNames: ['url'],
|
|
30 |
help: 'A Histogram for cache. Providing information about a cache request and load latency in seconds.',
|
|
31 |
labelNames: ['scheme', 'target'],
|
|
25 | 32 |
registers: [register], |
26 | 33 |
buckets: [0.1, 0.2, 0.5, 1, 2] |
27 | 34 |
}); |
28 | 35 |
|
29 | 36 |
let cache = (duration) => { |
30 | 37 |
return (req, res, next) => { |
31 |
let key = '__express__' + req.originalUrl || req.url |
|
32 |
console.log(req.originalUrl || req.url); |
|
38 |
let key = '__express__' + req.originalUrl || req.url; |
|
33 | 39 |
let cachedBody = mcache.get(key); |
40 |
const url = new URL(req.query.url); |
|
41 |
const target = url.host + '/' + url.pathname.split('/')[1]; |
|
42 |
const scheme = url.protocol.replace(':', ''); |
|
43 |
const end = histogram.startTimer({scheme: scheme, target: target}); |
|
44 |
entries.inc(); |
|
34 | 45 |
if (cachedBody) { |
35 |
res.send(JSON.parse(cachedBody)) |
|
46 |
res.send(JSON.parse(cachedBody)); |
|
47 |
responses.inc({scheme: scheme, target: target, code: res.statusCode, cache: 'hit'}); |
|
48 |
end(); |
|
36 | 49 |
} else { |
50 |
end(); |
|
37 | 51 |
res.sendResponse = res.send; |
38 | 52 |
res.send = (body) => { |
39 | 53 |
if (res.statusCode === 200) { |
40 | 54 |
mcache.put(key, body, duration * 1000); |
41 | 55 |
} |
42 |
res.sendResponse(body) |
|
43 |
|
|
56 |
res.sendResponse(body);
|
|
57 |
responses.inc({scheme: scheme, target: target, code: res.statusCode, cache: 'miss'}); |
|
44 | 58 |
}; |
45 | 59 |
next(); |
46 | 60 |
} |
... | ... | |
57 | 71 |
setTimeout(() => { |
58 | 72 |
const url = (req.query) ? req.query.url : null; |
59 | 73 |
if (!url) { |
60 |
responses.inc({url: null, code: 404}); |
|
61 | 74 |
res.status(404).send(getResponse(404, "Not Found ")) //not found |
62 | 75 |
} else { |
63 |
request.get(url, function (err, response) {
|
|
76 |
request.get(encodeURI(url), function (err, response) {
|
|
64 | 77 |
// res.header("Access-Control-Allow-Origin", "http://localhost:3000"); |
65 | 78 |
res.header("Access-Control-Allow-Headers", "Origin, Content-Type, Content-Length"); |
66 | 79 |
res.header("Access-Control-Allow-Methods", "GET, OPTIONS"); |
... | ... | |
69 | 82 |
if (!response && err) { |
70 | 83 |
res.status(500).send(getResponse(500, "An error occurred for " + url)) |
71 | 84 |
} else { |
72 |
const end = histogram.startTimer({url: url}); |
|
73 | 85 |
res.status(response.status).send(response.body); |
74 |
res.on('finish', function () { |
|
75 |
responses.inc({url: url, code: res.statusCode}); |
|
76 |
end(); |
|
77 |
}); |
|
78 | 86 |
} |
79 | 87 |
}) |
80 | 88 |
} |
Also available in: Unified diff
[Cache | Trunk]: Add new metrics, encode url