view mod_http_stats_stream/mod_http_stats_stream.lua @ 5516:f25df3af02c1

mod_client_management: Include client software version number in listing Should you ever wish to revoke a client by version number, e.g. for security reasons affecting certain versions, then it would be good to at the very least see which version is used. Also includes the OAuth2 software ID, an optional unique identifier that should be the same for all installations of a particular software.
author Kim Alvefur <zash@zash.se>
date Sat, 03 Jun 2023 19:21:39 +0200
parents bac3dae031ee
children
line wrap: on
line source

module:set_global();

local statsman = require "core.statsmanager";
local http = require "net.http.server";
local json = require "util.json";

assert(statsman.get_stats, "not compatible with trunk based on openmetrics");

local sessions = {};

local function updates_client_closed(response)
	module:log("debug", "Streamstats client closed");
	sessions[response] = nil;
end

local function get_updates(event)
	local request, response = event.request, event.response;

	response.on_destroy = updates_client_closed;

	response.headers.content_type = "text/event-stream";
	response.headers.x_accel_buffering = "no"; -- for nginx maybe?
	local resp = http.prepare_header(response);
	table.insert(resp, "event: stats-full\r\n");
	table.insert(resp, "data: ");
	table.insert(resp, json.encode(statsman.get_stats()));
	table.insert(resp, "\r\n\r\n");
	response.conn:write(table.concat(resp));

	sessions[response] = request;
	return true;
end


module:hook("stats-updated", function (event)
	local data = table.concat({
		"event: stats-updated";
		"data: "..json.encode(event.changed_stats);
		"";
		"";
	}, "\r\n")
	for response in pairs(sessions) do
		response.conn:write(data);
	end
end);


module:depends("http");
module:provides("http", {
	route = {
		GET = get_updates;
	}
});