From d05240899cb00e0431b4c6b63d1be2efaed6eecf Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sat, 18 Oct 2014 23:37:27 +0200 Subject: reverted to old nginx-lua model --- src/daq/nginx-lua/s5-nginx-log.lua | 100 +++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 src/daq/nginx-lua/s5-nginx-log.lua (limited to 'src/daq/nginx-lua/s5-nginx-log.lua') diff --git a/src/daq/nginx-lua/s5-nginx-log.lua b/src/daq/nginx-lua/s5-nginx-log.lua new file mode 100644 index 0000000..43d2394 --- /dev/null +++ b/src/daq/nginx-lua/s5-nginx-log.lua @@ -0,0 +1,100 @@ +-- +-- 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 /path/to/hls { +-- log_by_lua_file '/path/to/s5-nginx-log.lua'; +-- } +-- + +local cleanup_delay = 1200 +local log_exptime = 600 + +local log_cleanup = function(premature) + local sfive = ngx.shared.sfive + sfive:flush_expired() + if premature then + return + end + local ok, err = ngx.timer.at(cleanup_delay, log_cleanup) + if not ok then + ngx.log(ngx.ERR, "SFive(log): failed to reenqueue log_cleanup: ", err) + sfive:delete("log:cleanup_running") + return + end +end + +local start_cleanup_thread = function(sfive) + local ok, err, force = sfive:add("log:cleanup_running", 1) + if not ok then + if err ~= "exists" then + ngx.log(ngx.ERR, "SFive(log): failed to set cleanup_running flag: " .. err) + end + return + end + ok, err = ngx.timer.at(cleanup_delay, log_cleanup) + if not ok then + ngx.log(ngx.ERR, "SFive(log): failed to enqueue log_cleanup: ", err) + sfive:delete("log:cleanup_running") + return + end +end + +local status = ngx.var.status + +if status == '200' or status == '206' then + local sfive = ngx.shared.sfive + local idx, err = sfive:incr("log:idx", 1) + if not idx then + ngx.log(ngx.ERR, "SFive(log): incrementing log index failed: " .. err) + else + local json = '{' + json = json .. '"time": "' .. string.gsub(ngx.utctime(), " ", "T", 1) .. 'Z",' + json = json .. '"client": "' .. ngx.var.remote_addr .. '",' + json = json .. '"port": ' .. ngx.var.remote_port .. ',' + json = json .. '"ua": "' .. ngx.var.http_user_agent .. '",' + json = json .. '"uri": "' .. ngx.var.uri .. '",' + json = json .. '"status": ' .. status .. ',' + json = json .. '"bytes_sent": ' .. ngx.var.bytes_sent + json = json .. '}' + + local sfive_data = ngx.shared.sfive_data + local ok, err, force = sfive_data:add(idx, json, log_exptime) + if not ok then + ngx.log(ngx.ERR, "SFive(log): adding log line (".. idx .. ") to log store failed: " .. err) + elseif force then + ngx.log(ngx.WARN, "SFive(log): adding log line has overwritten other log lines - consider increasing the log store!") + end + start_cleanup_thread(sfive) + end +end -- cgit v1.2.3