-- -- sfive -- -- sfive - spreadspace streaming statistics suite is a generic -- statistic collection tool for streaming server infrastuctures. -- The system collects and stores meta data like number of views -- and throughput from a number of streaming servers and stores -- it in a global data store. -- The data acquisition is designed to be generic and extensible in -- order to support different streaming software. -- sfive also contains tools and applications to filter and visualize -- live and recorded data. -- -- -- Copyright (C) 2014 Christian Pointner -- Markus Grueneis -- -- This file is part of sfive. -- -- sfive is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License version 3 -- as published by the Free Software Foundation. -- -- sfive is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with sfive. If not, see . -- -- -- Install this by adding the following to your nginx.conf -- -- location /sfive { -- allow localhost; -- deny all; -- -- lua_check_client_abort on; -- content_by_lua_file '/path/to/s5-nginx-fetch.lua'; -- } -- local sfive = ngx.shared.sfive local function fetch_cleanup() ngx.log(ngx.INFO, "SFive(fetch): cleanup fetch") sfive:delete("fetch:connected") end local ok, err, force = sfive:add("fetch:connected", 1) -- TODO: race condition: when client disconnects here we won't free up the singleton... if not ok then if err == "exists" then ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE) else ngx.log(ngx.ERR, "SFive(fetch): failed to set connected flag: " .. err) ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end else local ok, err = ngx.on_abort(fetch_cleanup) if not ok then ngx.log(ngx.ERR, "SFive(fetch): failed to register the on_abort callback: ", err) ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end ngx.log(ngx.INFO, "SFive(fetch): client connected") local sfive_log = ngx.shared.sfive_log while true do logs = sfive_log:get_keys() for i, k in ipairs(logs) do local ok, err = ngx.say(sfive_log:get(k)) if not ok then ngx.log(ngx.ERR, "SFive(fetch): failed to register the on_abort callback: ", err) break end sfive_log:delete(k) end ngx.flush() ngx.sleep(0.1) end fetch_cleenup() end