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