-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathmetrics.js
112 lines (94 loc) · 3.82 KB
/
metrics.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
import { Rate, Trend } from 'k6/metrics'
export default class Metrics {
constructor () {
this.metrics = {
/**
* WordPress
*/
'hits': new Trend('wp_hits'),
// 'misses': new Trend('wp_misses'),
'hit-ratio': new Trend('wp_hit_ratio'),
// 'bytes': new Trend('wp_bytes'),
'prefetches': new Trend('wp_prefetches'),
'store-reads': new Trend('wp_store_reads'),
'store-writes': new Trend('wp_store_writes'),
// 'store-hits': new Trend('wp_store_hits'),
// 'store-misses': new Trend('wp_store_misses'),
'sql-queries': new Trend('wp_sql_queries'),
'ms-total': new Trend('wp_ms_total', true),
'ms-cache': new Trend('wp_ms_cache', true),
'ms-cache-avg': new Trend('wp_ms_cache_avg', true),
'ms-cache-ratio': new Trend('wp_ms_cache_ratio'),
/**
* Client
*/
'using-relay': new Rate('x_using_relay'),
'using-phpredis': new Rate('x_using_phpredis'),
/**
* Redis
*/
// 'redis-hits': new Trend('redis_hits'),
// 'redis-misses': new Trend('redis_misses'),
'redis-hit-ratio': new Trend('redis_hit_ratio'),
'redis-ops-per-sec': new Trend('redis_ops_per_sec'),
// 'redis-evicted-keys': new Trend('redis_evicted_keys'),
// 'redis-used-memory': new Trend('redis_used_memory'),
// 'redis-used-memory-rss': new Trend('redis_used_memory_rss'),
'redis-memory-fragmentation-ratio': new Trend('redis_memory_frag_ratio'),
// 'redis-connected-clients': new Trend('redis_connected_clients'),
// 'redis-tracking-clients': new Trend('redis_tracking_clients'),
// 'redis-rejected-connections': new Trend('redis_rejected_connections'),
'redis-keys': new Trend('redis_keys'),
/**
* Relay
*/
// 'relay-hits': new Trend('relay_hits'),
// 'relay-misses': new Trend('relay_misses'),
'relay-hit-ratio': new Trend('relay_hit_ratio'),
'relay-ops-per-sec': new Trend('relay_ops_per_sec'),
'relay-keys': new Trend('relay_keys'),
'relay-memory-active': new Trend('relay_memory_active'),
// 'relay-memory-total': new Trend('relay_memory_total'),
'relay-memory-ratio': new Trend('relay_memory_ratio'),
}
}
addResponseMetrics (response) {
const metrics = this.parseMetricsFromResponse(response)
if (! metrics) {
return;
}
for (const metric in metrics) {
if (metric in this.metrics) {
this.metrics[metric].add(metrics[metric])
}
}
}
parseMetricsFromResponse (response) {
if (! response.body) {
return false
}
const comment = response.body.match(/<!-- plugin=object-cache-pro (.+?) -->/g)
if (! comment) {
return false
}
const metrics = [...comment[0].matchAll(/(metric|sample)#([\w-]+)=([\d.]+)/g)]
.reduce((map, metric) => {
map[metric[2]] = this.parseMetricType(metric[3])
return map
}, {})
const client = comment[0].toLowerCase().match(/client=(.+?) /)
const clientName = client[1] ? client[1] : ''
metrics['using-relay'] = clientName.includes('relay')
metrics['using-phpredis'] = clientName.includes('phpredis')
return metrics
}
parseMetricType (value) {
if (/^-?\d+$/.test(value)) {
return parseInt(value)
}
if (/^-?\d*(\.\d+)?$/.test(value)) {
return parseFloat(value)
}
return value
}
}