[patches] Re: [daemon 1/1] daemon: Introduce feedback daemon
Konstantin Osipov
kostja at tarantool.org
Mon Feb 12 21:15:14 MSK 2018
* imarkov <imarkov at tarantool.org> [18/02/12 10:39]:
> From: Roman Proskin <opomuc at gmail.com>
>
> * feedback daemon sends information about instance to the
> specified host.
> * Add new options to box.cfg:
> - feedback_enabled - switch on/off daemon, default=true.
> - feedback_host - host to which feedbacks are sent,
> default="https://report.tarantool.io".
> - feedback_interval - time interval in seconds of feedbacks
> sending, default=3600.
This looks good.
> * Add possibility to generate feedback file in json format with
> function box.feedback_save
box.feedback.save then.
> +
> +local function fill_in_feedback(feedback)
> + if box.info.status ~= "running" then
> + return false
> + end
> + feedback.tarantool_version = box.info.version
> + feedback.server_id = box.info.uuid
> + feedback.cluster_id = box.info.cluster.uuid
> + return feedback
> +end
Please follow our Lua coding style for return values.
> + elseif feedback ~= false then
> + pcall(http.post, self.host, json.encode(feedback), {timeout=1})
> + end
Did you test if this blocks? How many send per second can you
perform? Could you play with iptables and see what happens if the
address is behind a firewall?
> +box.feedback_save = function(file_name)
> + local feedback = json.encode(box.internal.feedback_daemon.generate_feedback())
> + local fh, err = fio.open(file_name, {'O_CREAT', 'O_RDWR', 'O_TRUNC'},
> + tonumber('0777', 8))
> + if not fh then
> + error(err)
> + end
> + fh:write(feedback)
> + fh:close()
> +end
Does mariadb save it to a file? Would it help to add
feedback.post() as well?
> +-- set up mock for feedback server
> +local function get_feedback(self, req)
> + local body = req:read()
> + local ok, data = pcall(json.decode, body)
> + if ok then
> + self:put({ 'feedback', body })
> + end
> +end
> +
> +local interval = 0.1
0.01
> +
> +box.cfg{
> + feedback_host = '0.0.0.0:4444/feedback',
> + feedback_interval = interval,
> +}
> +
> +-- check it does not fail without server
> +local daemon = box.internal.feedback_daemon
> +daemon.start()
> +daemon.send_test()
> +local httpd = require('http.server').new('0.0.0.0', '4444')
> +httpd:route(
> + { path = '/feedback', method = 'POST' },
> + self_decorator(box.space._schema)(get_feedback)
> +)
> +httpd:start()
> +
> +local function check(message)
> + while box.space._schema:get('feedback') == nil do fiber.sleep(0.001) end
> + local data = box.space._schema:get('feedback')
> + test:ok(data ~= nil, message)
> + box.space._schema:delete('feedback')
> +end
> +
> +-- check if feedback has been sent and received
> +daemon.reload()
> +check("feedback received after reload")
> +
> +local errinj = box.error.injection
> +errinj.set("ERRINJ_HTTPC", true)
> +check('feedback received after errinj')
> +errinj.set("ERRINJ_HTTPC", false)
> +
> +daemon.send_test()
> +check("feedback received after explicit sending")
> +
> +box.cfg{feedback_enabled = false}
> +daemon.send_test()
> +fiber.sleep(2 * interval)
> +test:ok(box.space._schema:get('feedback') == nil, "no feedback after disabling")
> +
> +box.cfg{feedback_enabled = true}
> +daemon.send_test()
> +check("feedback after start")
> +
> +daemon.stop()
> +daemon.send_test()
> +fiber.sleep(2 * interval)
> +test:ok(box.space._schema:get('feedback') == nil, "no feedback after stop")
> +
> +daemon.start()
> +daemon.send_test()
> +check("feedback after start")
> +
> +box.feedback_save("feedback.json")
> +daemon.send_test()
> +while box.space._schema:get('feedback') == nil do fiber.sleep(0.001) end
> +local data = box.space._schema:get('feedback')
> +local fio = require("fio")
> +local fh = fio.open("feedback.json")
> +test:ok(fh, "file is created")
> +local file_data = fh:read()
> +test:is(file_data, data[2], "data is equal")
> +fh:close()
> +fio.unlink("feedback.json")
> +
> +test:check()
> +os.exit(0)
Looks like a good test to me, thanks!
--
Konstantin Osipov, Moscow, Russia, +7 903 626 22 32
http://tarantool.org - www.twitter.com/kostja_osipov
More information about the Tarantool-patches
mailing list