Skip to content

Commit

Permalink
+ collectors manager
Browse files Browse the repository at this point in the history
  • Loading branch information
ekho committed Aug 4, 2016
1 parent 224e1a4 commit 169c705
Show file tree
Hide file tree
Showing 6 changed files with 187 additions and 80 deletions.
3 changes: 2 additions & 1 deletion .luacov
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@ return {
modules = {
['nginx-metrix'] = 'src/nginx-metrix.lua',
['nginx-metrix.aggregator'] = 'src/nginx-metrix/aggregator.lua',
['nginx-metrix.collectors'] = 'src/nginx-metrix/collectors.lua',
['nginx-metrix.logger'] = 'src/nginx-metrix/logger.lua',
['nginx-metrix.serializer'] = 'src/nginx-metrix/serializer.lua',
['nginx-metrix.scheduler'] = 'src/nginx-metrix/scheduler.lua',
['nginx-metrix.serializer'] = 'src/nginx-metrix/serializer.lua',
['nginx-metrix.storage'] = 'src/nginx-metrix/storage.lua',
['nginx-metrix.validator'] = 'src/nginx-metrix/validator.lua',
['nginx-metrix.vhosts'] = 'src/nginx-metrix/vhosts.lua',
Expand Down
3 changes: 2 additions & 1 deletion rockspecs/nginx-metrix-local-1.rockspec
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,10 @@ build = {
modules = {
['nginx-metrix'] = 'src/nginx-metrix.lua',
['nginx-metrix.aggregator'] = 'src/nginx-metrix/aggregator.lua',
['nginx-metrix.collectors'] = 'src/nginx-metrix/collectors.lua',
['nginx-metrix.logger'] = 'src/nginx-metrix/logger.lua',
['nginx-metrix.serializer'] = 'src/nginx-metrix/serializer.lua',
['nginx-metrix.scheduler'] = 'src/nginx-metrix/scheduler.lua',
['nginx-metrix.serializer'] = 'src/nginx-metrix/serializer.lua',
['nginx-metrix.storage'] = 'src/nginx-metrix/storage.lua',
['nginx-metrix.validator'] = 'src/nginx-metrix/validator.lua',
['nginx-metrix.vhosts'] = 'src/nginx-metrix/vhosts.lua',
Expand Down
54 changes: 54 additions & 0 deletions spec/nginx-metrix/collectors_spec.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
require('spec.bootstrap')(assert)

describe('nginx-metrix.collectors', function()
local collectors

setup(function()
collectors = require 'nginx-metrix.collectors'
end)

---------------------------------------------------------------------------
it('__call', function()
stub(collectors, 'init')
local options_emu = { some_option = 'some_value' }
local storage_emu = { 'storage' }

local result = collectors(options_emu, storage_emu)

assert.spy(collectors.init).was_called_with(options_emu, storage_emu)
assert.is_equal(collectors, result)

collectors.init:revert()
end)

it('init', function()
stub(collectors, 'register')
local storage_emu = { 'storage' }

local collector_request_mock = { 'request' }
local collector_status_mock = { 'status' }
local collector_upstream_mock = { 'upstream' }

package.loaded['nginx-metrix.collectors.request'] = collector_request_mock
package.loaded['nginx-metrix.collectors.status'] = collector_status_mock
package.loaded['nginx-metrix.collectors.upstream'] = collector_upstream_mock

-- skip builtin collectors
collectors.init({ skip_register_builtin_collectors = true }, storage_emu)
assert.spy(collectors.register).was_not_called()
assert.is_equal(storage_emu, collectors._storage)


-- process builtin collectors
collectors.init({}, storage_emu)
assert.spy(collectors.register).was_called_with(collector_request_mock)
assert.spy(collectors.register).was_called_with(collector_status_mock)
assert.spy(collectors.register).was_called_with(collector_upstream_mock)
assert.spy(collectors.register).was_called(3)

collectors.register:revert()
package.loaded['nginx-metrix.collectors.request'] = nil
package.loaded['nginx-metrix.collectors.status'] = nil
package.loaded['nginx-metrix.collectors.upstream'] = nil
end)
end)
104 changes: 47 additions & 57 deletions spec/nginx-metrix_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -29,35 +29,35 @@ describe('nginx-metrix', function()
it('init', function()
nginx_metrix._inited = nil

stub(nginx_metrix, 'init_storage')
stub(nginx_metrix, 'init_vhosts')
stub(nginx_metrix, 'init_scheduler')
stub(nginx_metrix, 'init_builtin_collectors')
stub(nginx_metrix, '_init_storage')
stub(nginx_metrix, '_init_vhosts')
stub(nginx_metrix, '_init_scheduler')
stub(nginx_metrix, '_init_collectors')
local options_emu = { some_option = 'some_value' }

nginx_metrix.init(options_emu)

assert.spy(nginx_metrix.init_storage).was_called_with(options_emu)
assert.spy(nginx_metrix.init_vhosts).was_called_with(options_emu)
assert.spy(nginx_metrix.init_scheduler).was_called_with(options_emu)
assert.spy(nginx_metrix.init_builtin_collectors).was_called_with(options_emu)
assert.spy(nginx_metrix._init_storage).was_called_with(options_emu)
assert.spy(nginx_metrix._init_vhosts).was_called_with(options_emu)
assert.spy(nginx_metrix._init_scheduler).was_called_with(options_emu)
assert.spy(nginx_metrix._init_collectors).was_called_with(options_emu)
assert.is_true(nginx_metrix._inited)

nginx_metrix.init_storage:revert()
nginx_metrix.init_vhosts:revert()
nginx_metrix.init_scheduler:revert()
nginx_metrix.init_builtin_collectors:revert()
nginx_metrix._init_storage:revert()
nginx_metrix._init_vhosts:revert()
nginx_metrix._init_scheduler:revert()
nginx_metrix._init_collectors:revert()
end)

it('init handles error', function()
nginx_metrix._inited = nil

stub(nginx_metrix, 'init_storage')
stub(nginx_metrix, 'init_vhosts')
stub(nginx_metrix, 'init_scheduler')
stub(nginx_metrix, 'init_builtin_collectors')
stub(nginx_metrix, '_init_storage')
stub(nginx_metrix, '_init_vhosts')
stub(nginx_metrix, '_init_scheduler')
stub(nginx_metrix, '_init_collectors')

nginx_metrix.init_storage.on_call_with({}).invokes(function() error('init_storage error') end)
nginx_metrix._init_storage.on_call_with({}).invokes(function() error('_init_storage error') end)

local logger_bak = nginx_metrix._logger
nginx_metrix._logger = mock({ err = function() end })
Expand All @@ -66,29 +66,29 @@ describe('nginx-metrix', function()
nginx_metrix.init({})
end)

assert.spy(nginx_metrix.init_storage).was_called_with({})
assert.spy(nginx_metrix.init_storage).was_called(1)
assert.spy(nginx_metrix.init_vhosts).was_not_called()
assert.spy(nginx_metrix.init_scheduler).was_not_called()
assert.spy(nginx_metrix.init_builtin_collectors).was_not_called()
assert.spy(nginx_metrix._logger.err).was_called_with(nginx_metrix._logger, 'Init failed. Metrix disabled.', match.matches('init_storage error'))
assert.spy(nginx_metrix._init_storage).was_called_with({})
assert.spy(nginx_metrix._init_storage).was_called(1)
assert.spy(nginx_metrix._init_vhosts).was_not_called()
assert.spy(nginx_metrix._init_scheduler).was_not_called()
assert.spy(nginx_metrix._init_collectors).was_not_called()
assert.spy(nginx_metrix._logger.err).was_called_with(nginx_metrix._logger, 'Init failed. Metrix disabled.', match.matches('_init_storage error'))
assert.is_false(nginx_metrix._inited)

nginx_metrix._logger = logger_bak
nginx_metrix.init_storage:revert()
nginx_metrix.init_vhosts:revert()
nginx_metrix.init_scheduler:revert()
nginx_metrix.init_builtin_collectors:revert()
nginx_metrix._init_storage:revert()
nginx_metrix._init_vhosts:revert()
nginx_metrix._init_scheduler:revert()
nginx_metrix._init_collectors:revert()
end)

it('init_storage', function()
it('_init_storage', function()
local storage_emu = { 'storage' }
local storage_module_mock = spy.new(function() return storage_emu end)
local options_emu = { some_option = 'some_value' }

package.loaded['nginx-metrix.storage'] = storage_module_mock

nginx_metrix.init_storage(options_emu)
nginx_metrix._init_storage(options_emu)

assert.spy(storage_module_mock).was_called_with(options_emu)
assert.spy(storage_module_mock).was_called(1)
Expand All @@ -97,7 +97,7 @@ describe('nginx-metrix', function()
package.loaded['nginx-metrix.storage'] = nil
end)

it('init_vhosts', function()
it('_init_vhosts', function()
local vhosts_emu = { 'vhosts' }
local vhosts_module_mock = spy.new(function() return vhosts_emu end)
local options_emu = { some_option = 'some_value' }
Expand All @@ -106,7 +106,7 @@ describe('nginx-metrix', function()
package.loaded['nginx-metrix.vhosts'] = vhosts_module_mock

nginx_metrix.storage = storage_emu
nginx_metrix.init_vhosts(options_emu)
nginx_metrix._init_vhosts(options_emu)

assert.spy(vhosts_module_mock).was_called_with(options_emu, storage_emu)
assert.spy(vhosts_module_mock).was_called(1)
Expand All @@ -115,7 +115,7 @@ describe('nginx-metrix', function()
package.loaded['nginx-metrix.vhosts'] = nil
end)

it('init_aggregator', function()
it('_init_aggregator', function()
local aggregator_emu = { 'aggregator' }
local aggregator_module_mock = spy.new(function() return aggregator_emu end)
local options_emu = { some_option = 'some_value' }
Expand All @@ -124,7 +124,7 @@ describe('nginx-metrix', function()
package.loaded['nginx-metrix.aggregator'] = aggregator_module_mock

nginx_metrix.storage = storage_emu
nginx_metrix.init_aggregator(options_emu)
nginx_metrix._init_aggregator(options_emu)

assert.spy(aggregator_module_mock).was_called_with(options_emu, storage_emu)
assert.spy(aggregator_module_mock).was_called(1)
Expand All @@ -133,7 +133,7 @@ describe('nginx-metrix', function()
package.loaded['nginx-metrix.aggregator'] = nil
end)

it('init_scheduler', function()
it('_init_scheduler', function()
local scheduler_emu = mock({ attach_action = function() end })
local scheduler_module_mock = spy.new(function() return scheduler_emu end)
local options_emu = { some_option = 'some_value' }
Expand All @@ -143,7 +143,7 @@ describe('nginx-metrix', function()

nginx_metrix._aggregator = { aggregate = function() end }

nginx_metrix.init_scheduler(options_emu, storage_emu)
nginx_metrix._init_scheduler(options_emu, storage_emu)

assert.spy(scheduler_module_mock).was_called_with(options_emu, storage_emu)
assert.spy(scheduler_module_mock).was_called(1)
Expand All @@ -155,31 +155,21 @@ describe('nginx-metrix', function()
nginx_metrix._aggregator = nil
end)

it('init_builtin_collectors', function()
local collector_request_mock = { 'request' }
local collector_status_mock = { 'status' }
local collector_upstream_mock = { 'upstream' }

package.loaded['nginx-metrix.collectors.request'] = collector_request_mock
package.loaded['nginx-metrix.collectors.status'] = collector_status_mock
package.loaded['nginx-metrix.collectors.upstream'] = collector_upstream_mock
it('_init_collectors', function()
local collectors_emu = { 'collectors' }
local collectors_module_mock = spy.new(function() return collectors_emu end)
local options_emu = { some_option = 'some_value' }
local storage_emu = { 'storage' }

stub(nginx_metrix, 'register_collector')
package.loaded['nginx-metrix.collectors'] = collectors_module_mock

-- skip builtin collectors
nginx_metrix.init_builtin_collectors({ skip_register_builtin_collectors = true })
assert.spy(nginx_metrix.register_collector).was_not_called()
nginx_metrix.storage = storage_emu
nginx_metrix._init_collectors(options_emu)

-- process builtin collectors
nginx_metrix.init_builtin_collectors({})
assert.spy(nginx_metrix.register_collector).was_called_with(collector_request_mock)
assert.spy(nginx_metrix.register_collector).was_called_with(collector_status_mock)
assert.spy(nginx_metrix.register_collector).was_called_with(collector_upstream_mock)
assert.spy(nginx_metrix.register_collector).was_called(3)
assert.spy(collectors_module_mock).was_called_with(options_emu, storage_emu)
assert.spy(collectors_module_mock).was_called(1)
assert.is_same(collectors_emu, nginx_metrix._collectors)

nginx_metrix.register_collector:revert()
package.loaded['nginx-metrix.collectors.request'] = nil
package.loaded['nginx-metrix.collectors.status'] = nil
package.loaded['nginx-metrix.collectors.upstream'] = nil
package.loaded['nginx-metrix.collectors'] = nil
end)
end)
60 changes: 39 additions & 21 deletions src/nginx-metrix.lua
Original file line number Diff line number Diff line change
@@ -1,76 +1,70 @@
local fun = require 'fun'
local Logger = require 'nginx-metrix.logger'

local M = {}

M._version = '2.0-dev'
M._inited = nil
M._do_not_track = false
M._builtin_collectors = fun.iter { 'request', 'status', 'upstream' }

M._logger = Logger()
M._storage = nil
M._vhosts = nil
M._aggregator = nil
M._collectors = nil
M._scheduler = nil

---
-- @param options
--
function M.init_storage(options)
function M._init_storage(options)
M._storage = require 'nginx-metrix.storage'(options)
end

---
-- @param options
--
function M.init_vhosts(options)
function M._init_vhosts(options)
M._vhosts = require 'nginx-metrix.vhosts'(options, M._storage)
end

---
-- @param options
--
function M.init_aggregator(options)
function M._init_aggregator(options)
M._aggregator = require 'nginx-metrix.aggregator'(options, M._storage)
end

---
-- @param options
--
function M.init_scheduler(options)
function M._init_scheduler(options)
M._scheduler = require 'nginx-metrix.scheduler'(options, M._storage)
M._scheduler.attach_action('aggregator.aggregate', M._aggregator.aggregate)
end

---
-- @param collector
-- @param options
--
function M.register_collector(collector)
M._logger:debug('Registering collector', collector)
function M._init_collectors(options)
M._collectors = require 'nginx-metrix.collectors'(options, M._storage)
end

---
-- @param options
-- @param collector
--
function M.init_builtin_collectors(options)
if not options.skip_register_builtin_collectors then
M._builtin_collectors:each(function(name)
local collector = require('nginx-metrix.collectors.' .. name)
M.register_collector(collector)
end)
end
function M.register_collector(collector)
M._collectors.register(collector)
end

---
-- @param options
--
function M.init(options)
xpcall(function()
M.init_storage(options)
M.init_vhosts(options)
M.init_scheduler(options)
M.init_builtin_collectors(options)
M._init_storage(options)
M._init_vhosts(options)
M._init_scheduler(options)
M._init_collectors(options)
M._inited = true
end,
function(err)
Expand All @@ -79,6 +73,30 @@ function M.init(options)
end)
end

---
-- @param phase
--
function M._apply_markers(phase)
M._logger:debug('_apply_markers', phase)
end

---
-- @param phase
--
function M._exec_collectors(phase)
M._collectors.exec_all(phase)
end

---
--
function M.handle_ngx_phase()
local phase = ngx.get_phase()

M._apply_markers(phase)

M._exec_collectors(phase)
end

------------------------------------------------------------------------------
return setmetatable(M, {
__call = function(_, ...)
Expand Down
Loading

0 comments on commit 169c705

Please sign in to comment.