Skip to content

Commit

Permalink
reset mean counter on next zero
Browse files Browse the repository at this point in the history
Closes #21
  • Loading branch information
Boris Gorbylev committed Jun 3, 2016
1 parent 02c8174 commit 4f2d2a6
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 46 deletions.
94 changes: 48 additions & 46 deletions nginx-metrix/storage/collector_wrapper_factory.lua
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ local key_sep_collector = '¦'
-- @return string
---
local normalize_string = function(str)
return str:gsub(key_sep_namespace, '_'):gsub(key_sep_collector, '_')
return str:gsub(key_sep_namespace, '_'):gsub(key_sep_collector, '_')
end

local wrapper_metatable = {}
Expand All @@ -21,38 +21,38 @@ wrapper_metatable.__index = wrapper_metatable
-- @return string
---
wrapper_metatable.prepare_key = function(self, key)
assert(key ~= nil, ('key can not be nil'))
if type(key) ~= 'string' then key = tostring(key) end
assert(key ~= nil, ('key can not be nil'))
if type(key) ~= 'string' then key = tostring(key) end

key = normalize_string(key)
key = normalize_string(key)

local key_prefix = ''
local key_prefix = ''

if self.collector_name ~= nil then
key_prefix = normalize_string(self.collector_name) .. key_sep_collector .. key_prefix
end
if self.collector_name ~= nil then
key_prefix = normalize_string(self.collector_name) .. key_sep_collector .. key_prefix
end

if namespaces.active() ~= nil then
key_prefix = normalize_string(namespaces.active()) .. key_sep_namespace .. key_prefix
end
if namespaces.active() ~= nil then
key_prefix = normalize_string(namespaces.active()) .. key_sep_namespace .. key_prefix
end

return key_prefix .. key
return key_prefix .. key
end

---
-- @param key string
-- @return mixed,int
---
wrapper_metatable.get = function(self, key)
return storage_dict.get(self:prepare_key(key))
return storage_dict.get(self:prepare_key(key))
end

---
-- @param key string
-- @return mixed,int,bool
----
wrapper_metatable.get_stale = function(self, key)
return storage_dict.get_stale(self:prepare_key(key))
return storage_dict.get_stale(self:prepare_key(key))
end

---
Expand All @@ -63,7 +63,7 @@ end
-- @return mixed
---
wrapper_metatable.set = function(self, key, value, exptime, flags)
return storage_dict.set(self:prepare_key(key), value, exptime, flags)
return storage_dict.set(self:prepare_key(key), value, exptime, flags)
end

---
Expand All @@ -74,7 +74,7 @@ end
-- @return mixed
---
wrapper_metatable.safe_set = function(self, key, value, exptime, flags)
return storage_dict.safe_set(self:prepare_key(key), value, exptime, flags)
return storage_dict.safe_set(self:prepare_key(key), value, exptime, flags)
end

---
Expand All @@ -85,7 +85,7 @@ end
-- @return mixed
---
wrapper_metatable.add = function(self, key, value, exptime, flags)
return storage_dict.add(self:prepare_key(key), value, exptime, flags)
return storage_dict.add(self:prepare_key(key), value, exptime, flags)
end

---
Expand All @@ -96,7 +96,7 @@ end
-- @return mixed
---
wrapper_metatable.safe_add = function(self, key, value, exptime, flags)
return storage_dict.safe_add(self:prepare_key(key), value, exptime, flags)
return storage_dict.safe_add(self:prepare_key(key), value, exptime, flags)
end

---
Expand All @@ -107,14 +107,14 @@ end
-- @return mixed
---
wrapper_metatable.replace = function(self, key, value, exptime, flags)
return storage_dict.replace(self:prepare_key(key), value, exptime, flags)
return storage_dict.replace(self:prepare_key(key), value, exptime, flags)
end

---
-- @param key string
--
wrapper_metatable.delete = function(self, key)
storage_dict.delete(self:prepare_key(key))
storage_dict.delete(self:prepare_key(key))
end

---
Expand All @@ -123,7 +123,7 @@ end
-- @return mixed
---
wrapper_metatable.incr = function(self, key, value)
return storage_dict.incr(self:prepare_key(key), value)
return storage_dict.incr(self:prepare_key(key), value)
end

---
Expand All @@ -132,7 +132,7 @@ end
-- @return mixed
---
wrapper_metatable.safe_incr = function(self, key, value)
return storage_dict.safe_incr(self:prepare_key(key), value)
return storage_dict.safe_incr(self:prepare_key(key), value)
end

---
Expand All @@ -141,22 +141,24 @@ end
-- @return mixed
---
wrapper_metatable.mean_add = function(self, key, value)
key = self:prepare_key(key)
local prev_value, counter = storage_dict.get(key)
value = ((prev_value or 0) * counter + value) / (counter + 1)
return storage_dict.set(key, value, nil, counter + 1)
key = self:prepare_key(key)
local prev_value, counter = storage_dict.get(key)
value = ((prev_value or 0) * counter + value) / (counter + 1)
return storage_dict.set(key, value, nil, counter + 1)
end

---
-- @param key string
---
wrapper_metatable.mean_flush = function(self, key)
key = self:prepare_key(key)
local prev_value, counter = storage_dict.get(key)
if counter > 0 then
counter = 1
end
storage_dict.set(key, (prev_value or 0), 0, counter)
key = self:prepare_key(key)
local prev_value, counter = storage_dict.get(key)
if counter > 0 then
counter = prev_value > 0 and 1 or 0
else
prev_value = 0
end
storage_dict.set(key, (prev_value or 0), 0, counter)
end

---
Expand All @@ -165,32 +167,32 @@ end
-- @return mixed
---
wrapper_metatable.cyclic_incr = function(self, key, value)
return storage_dict.safe_incr(self:prepare_key(key) .. '^^next^^', value)
return storage_dict.safe_incr(self:prepare_key(key) .. '^^next^^', value)
end

---
-- @param key string
---
wrapper_metatable.cyclic_flush = function(self, key)
key = self:prepare_key(key)
local next_key = key .. '^^next^^'
local next_value = storage_dict.get(next_key) or 0
storage_dict.delete(next_key)
storage_dict.set(key, next_value, 0, 0)
key = self:prepare_key(key)
local next_key = key .. '^^next^^'
local next_value = storage_dict.get(next_key) or 0
storage_dict.delete(next_key)
storage_dict.set(key, next_value, 0, 0)
end

---
-- Factory method
-- @param collector
---
local create = function(collector)
local wrapper = {
collector_name = collector.name
}
local wrapper = {
collector_name = collector.name
}

setmetatable(wrapper, wrapper_metatable)
setmetatable(wrapper, wrapper_metatable)

return wrapper
return wrapper
end

--------------------------------------------------------------------------------
Expand All @@ -201,9 +203,9 @@ local exports = {}
exports.create = create

if __TEST__ then
exports.__private__ = {
wrapper_metatable = wrapper_metatable
}
exports.__private__ = {
wrapper_metatable = wrapper_metatable
}
end

return exports
13 changes: 13 additions & 0 deletions tests/storage/collector_wrapper_factory_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ describe('storage.collector_wrapper_factory', function()

after_each(function()
namespaces.reset_active()
mock.clear(dict_mock)
end)

it('create', function()
Expand Down Expand Up @@ -195,6 +196,18 @@ describe('storage.collector_wrapper_factory', function()
dict_mock.get:revert()
end)

it('wrapper_metatable.mean_flush [existent, zero]', function()
local wrapper_metatable = mk_wrapper_metatable_mock('collector-mock')

stub.new(dict_mock, 'get').on_call_with('collector_mock¦test-key').returns(0, 1)

wrapper_metatable:mean_flush('test-key')
assert.spy(dict_mock.get).was.called_with('collector_mock¦test-key')
assert.spy(dict_mock.set).was.called_with('collector_mock¦test-key', 0, 0, 0)

dict_mock.get:revert()
end)

it('wrapper_metatable.cyclic_incr', function()
local wrapper_metatable = mk_wrapper_metatable_mock('collector-mock')

Expand Down

0 comments on commit 4f2d2a6

Please sign in to comment.