diff --git a/CHANGELOG.md b/CHANGELOG.md index 63b76d07..779ecbc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `tnt_synchro_queue_len` metric type - Reset callbacks on hotreload +- Fix queries in quantile ## [0.15.0] - 2022-08-09 ### Fixed diff --git a/metrics/quantile.lua b/metrics/quantile.lua index 3460cbdc..3cf5af38 100644 --- a/metrics/quantile.lua +++ b/metrics/quantile.lua @@ -165,7 +165,7 @@ function stream:query(q) local p = s.l[0] local r = 0 - for i = 1, s.l_len do + for i = 1, s.l_len-1 do -- samples buffer indexing starts from 0 to length-1 local c = s.l[i] if r + c.Width + c.Delta > t then return p.Value diff --git a/test/integration/highload_test.lua b/test/integration/highload_test.lua new file mode 100644 index 00000000..8e365732 --- /dev/null +++ b/test/integration/highload_test.lua @@ -0,0 +1,49 @@ +require('strict').on() + +local fio = require('fio') + +local t = require('luatest') +local g = t.group('highload') + +g.test_eventloop = function() + local tmpdir = fio.tempdir() + if type(box.cfg) == 'function' then + box.cfg { + wal_dir = tmpdir, + memtx_dir = tmpdir, + } + end + + local metrics = require('metrics') + local fiber = require('fiber') + local clock = require('clock') + local utils = require('test.utils') + + local function monitor(collector) + local time_before + while true do + time_before = clock.monotonic() + fiber.yield() + collector:observe(clock.monotonic() - time_before) + end + end + + metrics.set_global_labels({ alias = 'my_instance' }) + + local collector = metrics.summary('tnt_fiber_event_loop', 'event loop time', + { [0.5] = 0.01, [0.9] = 0.01, [0.99] = 0.01, }) + local fiber_object = fiber.create(function() monitor(collector) end) + + for _ = 1, 10 do + fiber.sleep(0.1) + local observations = metrics.collect() + + local obs_summary = utils.find_obs('tnt_fiber_event_loop', + { alias = 'my_instance', quantile = 0.99 }, observations) + + t.assert_not_inf(obs_summary.value) + end + + fiber.kill(fiber_object:id()) + +end