Skip to content

Commit ccf6bb6

Browse files
Add include and exclude section in config (#268)
Co-authored-by: Yaroslav Dynnikov <[email protected]>
1 parent 9c41c9f commit ccf6bb6

26 files changed

+446
-163
lines changed

CHANGELOG.md

+7
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
- metrics registry refactoring to search with `O(1)` [#188](https://github.com/tarantool/metrics/issues/188)
1111
- `ipairs` instead of `pairs` while iteration in `histogram` [#196](https://github.com/tarantool/metrics/issues/196)
1212
- `set_export` function provide default metrics config to make role reloadable [#248](https://github.com/tarantool/metrics/issues/248)
13+
- metrics registry refactoring to add and remove callbacks with `O(1)` [#276](https://github.com/tarantool/metrics/issues/276)
1314

1415
### Fixed
1516
- be gentle to http routes, don't leave gaps in the array
@@ -19,6 +20,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1920
### Added
2021
- `tnt_clock_delta` metric to compute clock difference on instances
2122
- set custom global labels in config and with `set_labels` function [#259](https://github.com/tarantool/metrics/issues/259)
23+
- allow to include and exclude default metrics in config and in `enable_default_metrics` function
24+
[#222](https://github.com/tarantool/metrics/issues/222)
25+
- `unregister_callback` function [#262](https://github.com/tarantool/metrics/issues/262)
26+
27+
### Deprecated
28+
- `enable_cartridge_metrics` function
2229

2330
## [0.9.0] - 2021-05-28
2431
### Fixed

cartridge/roles/metrics.lua

+7-2
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,16 @@ local function set_labels(custom_labels)
4646
metrics_vars.custom_labels = custom_labels
4747
end
4848

49-
local function check_config(_)
49+
local function check_config(config)
5050
checks({
5151
export = 'table',
5252
['global-labels'] = '?table',
53+
include = '?table',
54+
exclude = '?table',
5355
})
56+
if config.include and config.exclude then
57+
error("don't use exclude and include sections together", 0)
58+
end
5459
end
5560

5661
local function delete_route(httpd, name)
@@ -153,6 +158,7 @@ local function apply_config(conf)
153158
end
154159
end
155160
apply_routes(paths)
161+
metrics.enable_default_metrics(metrics_conf.include, metrics_conf.exclude)
156162
end
157163

158164
local function set_export(export)
@@ -186,7 +192,6 @@ end
186192
local function init()
187193
set_labels(metrics_vars.custom_labels)
188194
metrics.enable_default_metrics()
189-
metrics.enable_cartridge_metrics()
190195
local current_paths = table.copy(metrics_vars.config)
191196
for path, format in pairs(metrics_vars.default) do
192197
if current_paths[path] == nil then

doc/monitoring/api_reference.rst

+33-6
Original file line numberDiff line numberDiff line change
@@ -266,15 +266,33 @@ You can also set global labels by calling
266266
Metrics functions
267267
-------------------------------------------------------------------------------
268268

269-
.. function:: enable_default_metrics()
269+
.. function:: enable_default_metrics([include, exclude])
270270

271-
Enables Tarantool metrics collections. See :ref:`metrics reference <metrics-reference>`
272-
for details.
271+
Enables Tarantool metrics collections.
273272

274-
.. function:: enable_cartridge_metrics()
273+
:param table include: Table containing names of default metrics which you need to enable.
275274

276-
Enables Cartridge metrics collections. See :ref:`metrics reference <metrics-cartridge>`
277-
for details.
275+
:param table exclude: Table containing names of default metrics which you need to exclude.
276+
277+
Default metrics names:
278+
279+
* "network"
280+
* "operations"
281+
* "system"
282+
* "replicas"
283+
* "info"
284+
* "slab"
285+
* "runtime"
286+
* "memory"
287+
* "spaces"
288+
* "fibers"
289+
* "cpu"
290+
* "vinyl"
291+
* "luajit"
292+
* "cartridge_issues"
293+
* "clock"
294+
295+
See :ref:`metrics reference <metrics-reference>` for details.
278296

279297
.. function:: metrics.set_global_labels(label_pairs)
280298

@@ -301,6 +319,15 @@ Metrics functions
301319

302320
Most common usage is for gauge metrics updates.
303321

322+
.. function:: unregister_callback(callback)
323+
324+
Unregisters a function ``callback`` which will be called right before metrics
325+
collection on plugin export.
326+
327+
:param function callback: Function which takes no parameters.
328+
329+
Most common usage is for unregister enabled callbacks.
330+
304331
.. _collecting-http-statistics:
305332

306333
-------------------------------------------------------------------------------

doc/monitoring/getting_started.rst

+33-1
Original file line numberDiff line numberDiff line change
@@ -217,4 +217,36 @@ via configuration.
217217
.. code-block:: lua
218218
219219
local metrics = require('cartridge.roles.metrics')
220-
metrics.set_labels({ ['my-custom-label'] = 'label-value'} )
220+
metrics.set_labels({ ['my-custom-label'] = 'label-value' })
221+
222+
#. To choose which default metrics are exported, you may use the following configuration.
223+
224+
When you add include section, only metrics from this section are exported:
225+
226+
.. code-block:: yaml
227+
228+
metrics:
229+
export:
230+
- path: '/metrics'
231+
format: 'json'
232+
# export only vinyl, luajit and memory metrics:
233+
include:
234+
- vinyl
235+
- luajit
236+
- memory
237+
238+
When you add exclude section, metrics from this section are removed from default metrics list:
239+
240+
.. code-block:: yaml
241+
242+
metrics:
243+
export:
244+
- path: '/metrics'
245+
format: 'json'
246+
# export all metrics except vinyl, luajit and memory:
247+
exclude:
248+
- vinyl
249+
- luajit
250+
- memory
251+
252+
You can see full list of default metrics in :ref:`API reference <metrics-functions>`.

metrics/cartridge/clock.lua

+11-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
local utils = require('metrics.utils')
2-
local membership = require('membership')
2+
local ok, membership = pcall(require, 'membership')
3+
4+
if not ok then
5+
return { update = function() end }
6+
end
7+
8+
local collectors_list = {}
39

410
-- from https://github.com/tarantool/cartridge/blob/cc607f5a6508449608f3953a3f93669e8c8c4ab0/cartridge/issues.lua#L375
511
local function update_clock_metrics()
@@ -19,10 +25,11 @@ local function update_clock_metrics()
1925
end
2026
end
2127

22-
utils.set_gauge('clock_delta', 'Clock difference', min_delta * 1e-6, {delta = 'min'})
23-
utils.set_gauge('clock_delta', 'Clock difference', max_delta * 1e-6, {delta = 'max'})
28+
collectors_list.clock_delta = utils.set_gauge('clock_delta', 'Clock difference', min_delta * 1e-6, {delta = 'min'})
29+
collectors_list.clock_delta = utils.set_gauge('clock_delta', 'Clock difference', max_delta * 1e-6, {delta = 'max'})
2430
end
2531

2632
return {
27-
update = update_clock_metrics
33+
update = update_clock_metrics,
34+
list = collectors_list,
2835
}

metrics/cartridge/issues.lua

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
local utils = require('metrics.utils');
1+
local utils = require('metrics.utils')
22
local fun = require('fun')
33

4+
local collectors_list = {}
5+
46
local function update_info_metrics()
57
local list_on_instance = rawget(_G, '__cartridge_issues_list_on_instance')
68

@@ -14,11 +16,12 @@ local function update_info_metrics()
1416

1517
for _, level in ipairs(levels) do
1618
local len = fun.iter(issues):filter(function(x) return x.level == level end):length()
17-
utils.set_gauge('cartridge_issues', 'Tarantool Cartridge issues', len, {level = level})
19+
collectors_list.cartridge_issues =
20+
utils.set_gauge('cartridge_issues', 'Tarantool Cartridge issues', len, {level = level})
1821
end
19-
2022
end
2123

2224
return {
2325
update = update_info_metrics,
26+
list = collectors_list,
2427
}

metrics/default_metrics/tarantool/cpu.lua

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
local ffi = require('ffi')
22
local utils = require('metrics.utils')
33

4+
local collectors_list = {}
5+
46
if not pcall(ffi.typeof, "struct timeval") then
57
if ffi.os == 'OSX' then
68
ffi.cdef[[
@@ -68,11 +70,12 @@ end
6870
local function update_info_metrics()
6971
local cpu_time = ss_get_rusage()
7072
if cpu_time then
71-
utils.set_gauge('cpu_user_time', 'CPU user time usage', cpu_time.ru_utime)
72-
utils.set_gauge('cpu_system_time', 'CPU system time usage', cpu_time.ru_stime)
73+
collectors_list.cpu_user_time = utils.set_gauge('cpu_user_time', 'CPU user time usage', cpu_time.ru_utime)
74+
collectors_list.cpu_system_time = utils.set_gauge('cpu_system_time', 'CPU system time usage', cpu_time.ru_stime)
7375
end
7476
end
7577

7678
return {
7779
update = update_info_metrics,
80+
list = collectors_list,
7881
}

metrics/default_metrics/tarantool/fibers.lua

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
local fiber = require('fiber')
22
local utils = require('metrics.utils')
33

4+
local collectors_list = {}
5+
46
local function update_fibers_metrics()
57
local fibers_info = fiber.info()
68
local fibers = 0
@@ -15,12 +17,13 @@ local function update_fibers_metrics()
1517
fused = fused + f.memory.used
1618
end
1719

18-
utils.set_gauge('fiber_count', 'Amount of fibers', fibers)
19-
utils.set_gauge('fiber_csw', 'Fibers csw', csws)
20-
utils.set_gauge('fiber_memalloc', 'Fibers memalloc', falloc)
21-
utils.set_gauge('fiber_memused', 'Fibers memused', fused)
20+
collectors_list.fiber_count = utils.set_gauge('fiber_count', 'Amount of fibers', fibers)
21+
collectors_list.fiber_csw = utils.set_gauge('fiber_csw', 'Fibers csw', csws)
22+
collectors_list.fiber_memalloc = utils.set_gauge('fiber_memalloc', 'Fibers memalloc', falloc)
23+
collectors_list.fiber_memused = utils.set_gauge('fiber_memused', 'Fibers memused', fused)
2224
end
2325

2426
return {
2527
update = update_fibers_metrics,
28+
list = collectors_list,
2629
}
+9-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
local utils = require('metrics.utils');
1+
local utils = require('metrics.utils')
2+
3+
local collectors_list = {}
24

35
local function update_info_metrics()
46
if not utils.box_is_configured() then
@@ -7,20 +9,23 @@ local function update_info_metrics()
79

810
local info = box.info()
911

10-
utils.set_gauge('info_lsn', 'Tarantool lsn', info.lsn)
11-
utils.set_gauge('info_uptime', 'Tarantool uptime', info.uptime)
12+
collectors_list.info_lsn = utils.set_gauge('info_lsn', 'Tarantool lsn', info.lsn)
13+
collectors_list.info_uptime = utils.set_gauge('info_uptime', 'Tarantool uptime', info.uptime)
1214

1315
for k, v in ipairs(info.vclock) do
1416
utils.set_gauge('info_vclock', 'VClock', v, {id = k})
1517
end
1618

1719
for k, v in ipairs(info.replication) do
1820
if v.upstream ~= nil then
19-
utils.set_gauge('replication_' .. k .. '_lag', 'Replication lag for instance ' .. k, v.upstream.lag)
21+
local metric_name = 'replication_' .. k .. '_lag'
22+
collectors_list[metric_name] =
23+
utils.set_gauge(metric_name, 'Replication lag for instance ' .. k, v.upstream.lag)
2024
end
2125
end
2226
end
2327

2428
return {
2529
update = update_info_metrics,
30+
list = collectors_list,
2631
}

metrics/default_metrics/tarantool/init.lua

+59-15
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,67 @@
11
local metrics = require('metrics')
22

33
local default_metrics = {
4-
require('metrics.default_metrics.tarantool.network'),
5-
require('metrics.default_metrics.tarantool.operations'),
6-
require('metrics.default_metrics.tarantool.system'),
7-
require('metrics.default_metrics.tarantool.replicas'),
8-
require('metrics.default_metrics.tarantool.info'),
9-
require('metrics.default_metrics.tarantool.slab'),
10-
require('metrics.default_metrics.tarantool.runtime'),
11-
require('metrics.default_metrics.tarantool.memory'),
12-
require('metrics.default_metrics.tarantool.spaces'),
13-
require('metrics.default_metrics.tarantool.fibers'),
14-
require('metrics.default_metrics.tarantool.cpu'),
15-
require('metrics.tarantool.vinyl')
4+
network = require('metrics.default_metrics.tarantool.network'),
5+
operations = require('metrics.default_metrics.tarantool.operations'),
6+
system = require('metrics.default_metrics.tarantool.system'),
7+
replicas = require('metrics.default_metrics.tarantool.replicas'),
8+
info = require('metrics.default_metrics.tarantool.info'),
9+
slab = require('metrics.default_metrics.tarantool.slab'),
10+
runtime = require('metrics.default_metrics.tarantool.runtime'),
11+
memory = require('metrics.default_metrics.tarantool.memory'),
12+
spaces = require('metrics.default_metrics.tarantool.spaces'),
13+
fibers = require('metrics.default_metrics.tarantool.fibers'),
14+
cpu = require('metrics.default_metrics.tarantool.cpu'),
15+
vinyl = require('metrics.tarantool.vinyl'),
16+
luajit = require('metrics.tarantool.luajit'),
17+
cartridge_issues = require('metrics.cartridge.issues'),
18+
clock = require('metrics.cartridge.clock'),
1619
}
1720

18-
local function enable()
19-
for _, metric in ipairs(default_metrics) do
20-
metrics.register_callback(metric.update)
21+
local function delete_collectors(list)
22+
if list == nil then
23+
return
24+
end
25+
for _, collector in pairs(list) do
26+
metrics.registry:unregister(collector)
27+
end
28+
table.clear(list)
29+
end
30+
31+
local function enable(include, exclude)
32+
include = include or {}
33+
exclude = exclude or {}
34+
if next(include) ~= nil and next(exclude) ~= nil then
35+
error('Only one of "exclude" or "include" should present')
36+
end
37+
38+
local exclude_map = {}
39+
for _, name in ipairs(exclude) do
40+
exclude_map[name] = true
41+
end
42+
local include_map = {}
43+
for _, name in ipairs(include) do
44+
include_map[name] = true
45+
end
46+
47+
for name, value in pairs(default_metrics) do
48+
if next(include) ~= nil then
49+
if include_map[name] ~= nil then
50+
metrics.register_callback(value.update)
51+
else
52+
metrics.unregister_callback(value.update)
53+
delete_collectors(value.list)
54+
end
55+
elseif next(exclude) ~= nil then
56+
if exclude_map[name] ~= nil then
57+
metrics.unregister_callback(value.update)
58+
delete_collectors(value.list)
59+
else
60+
metrics.register_callback(value.update)
61+
end
62+
else
63+
metrics.register_callback(value.update)
64+
end
2165
end
2266
end
2367

Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
local utils = require('metrics.utils')
22

3+
local collectors_list = {}
4+
35
local function update_memory_metrics()
46
if not utils.box_is_configured() then
57
return
@@ -8,11 +10,13 @@ local function update_memory_metrics()
810
if box.info.memory ~= nil then
911
local i = box.info.memory()
1012
for k, v in pairs(i) do
11-
utils.set_gauge('info_memory_' .. k, 'Memory' .. k, v)
13+
local metric_name = 'info_memory_' .. k
14+
collectors_list[metric_name] = utils.set_gauge(metric_name, 'Memory ' .. k, v)
1215
end
1316
end
1417
end
1518

1619
return {
17-
update = update_memory_metrics
18-
}
20+
update = update_memory_metrics,
21+
list = collectors_list,
22+
}

0 commit comments

Comments
 (0)