reworked the extension init/de-init logic to be asynchronous

This commit is contained in:
2023-04-14 11:17:41 -07:00
parent 5d30b1931c
commit 6cf4297ab9
6 changed files with 108 additions and 63 deletions

View File

@@ -2,7 +2,7 @@ class CfgPatches {
class RangerMetrics { class RangerMetrics {
units[] = {}; units[] = {};
weapons[] = {}; weapons[] = {};
requiredVersion = 0.1; requiredVersion = 2.10;
requiredAddons[] = {}; requiredAddons[] = {};
author[] = {"EagleTrooper","Gary","IndigoFox"}; author[] = {"EagleTrooper","Gary","IndigoFox"};
authorUrl = "http://example.com"; authorUrl = "http://example.com";
@@ -10,6 +10,13 @@ class CfgPatches {
}; };
class CfgFunctions { class CfgFunctions {
class RangerMetrics_callback {
class functions {
file = "\RangerMetrics\functions\callbackHandlers";
class callbackHandler {};
class loadSettings {};
};
};
class RangerMetrics_event { class RangerMetrics_event {
class functions { class functions {
file = "\RangerMetrics\functions\capture\EHOnly"; file = "\RangerMetrics\functions\capture\EHOnly";
@@ -23,7 +30,7 @@ class CfgFunctions {
class MarkerUpdated {}; class MarkerUpdated {};
class milsim_serverEfficiency {}; class milsim_serverEfficiency {};
}; };
} };
class RangerMetrics_cDefinitions { class RangerMetrics_cDefinitions {
class functions { class functions {
file = "\RangerMetrics\functions\captureDefinitions"; file = "\RangerMetrics\functions\captureDefinitions";
@@ -62,7 +69,6 @@ class CfgFunctions {
class log {}; class log {};
class queue {}; class queue {};
class send {}; class send {};
class callbackHandler {};
class sendClientPoll {}; class sendClientPoll {};
class startServerPoll {}; class startServerPoll {};
class classHandlers {}; class classHandlers {};

View File

@@ -0,0 +1,45 @@
params ["_name", "_function", "_data"];
if !(_name == "RangerMetrics") exitWith {};
// Validate data param
if (isNil "_data") then {_data = ""};
if (_data isEqualTo "") exitWith {
[
format ["Callback empty data: %1", _function],
"WARN"
] call RangerMetrics_fnc_log;
false;
};
// Parse response from string array
private "_response";
try {
diag_log format ["Raw callback: %1: %2", _function, _data];
_response = parseSimpleArray _data;
} catch {
[
format ["Callback invalid data: %1: %2", _function, _data],
"WARN"
] call RangerMetrics_fnc_log;
};
switch (_function) do {
case "deinitExtension": {
diag_log format ["RangerMetrics: deinitExtension: %1", _response];
// Our first call is deinitExtension. When we received a single "true" value, we can then run init processes for the extension connections.
if ((_response select 0) isEqualTo true) then {
"RangerMetrics" callExtension "initExtension";
} else {
_response call RangerMetrics_fnc_log;
};
};
case "loadSettings": {
// Load settings
_response call RangerMetrics_callback_fnc_loadSettings;
};
default {
_response call RangerMetrics_fnc_log;
}
}

View File

@@ -0,0 +1,33 @@
private _data = _this;
switch (_data select 0) do {
case "CREATED SETTINGS": {
[
"settings.json did not exist and has been created - you will need to update it with your own settings before the addon will initialize further.",
"ERROR"
] call RangerMetrics_fnc_log;
};
case "SETTINGS LOADED": {
RangerMetrics_settings = createHashMapFromArray (_data # 1);
[
format [
"Settings loaded successfully from JSON. %1",
RangerMetrics_settings
],
"INFO"
] call RangerMetrics_fnc_log;
// send server profile name to all clients with JIP, so HC or player reporting knows what server it's connected to
if (isServer) then {
["RangerMetrics_serverProfileName", profileName] remoteExecCall ["setVariable", 0, true];
RangerMetrics_serverProfileName = profileName;
};
};
default {
[
_data select 0,
"INFO"
] call RangerMetrics_fnc_log;
};
};

View File

@@ -1,14 +0,0 @@
params ["_name", "_function", "_data"];
if (_name == "RangerMetrics") then {
if (isNil "_data") then {_data = ""};
try {
if (_data isEqualType "") exitWith {
_data = parseSimpleArray _data;
_data call RangerMetrics_fnc_log;
};
diag_log format ["Callback unsupported type: %1: %2", _function, _data];
} catch {
_data = format ["%1", _data];
};
};

View File

@@ -19,49 +19,18 @@ RangerMetrics_sendBatchHandle = scriptNull;
[format ["CBA detected: %1", RangerMetrics_cbaPresent]] call RangerMetrics_fnc_log; [format ["CBA detected: %1", RangerMetrics_cbaPresent]] call RangerMetrics_fnc_log;
["Initializing v0.1"] call RangerMetrics_fnc_log; ["Initializing v0.1"] call RangerMetrics_fnc_log;
// Create listener - extension calls are async, so we need to listen for the response
// load settings from extension / settings.json addMissionEventHandler [
private _settingsLoaded = "RangerMetrics" callExtension "loadSettings"; "ExtensionCallback",
// if (isNil "_settingsLoaded") exitWith { RangerMetrics_callback_fnc_callbackHandler
// ["Extension not found, disabling"] call RangerMetrics_fnc_log;
// RangerMetrics_run = false;
// };
if (_settingsLoaded isEqualTo [] || _settingsLoaded isEqualTo "") exitWith {
["Failed to load settings, exiting", "ERROR"] call RangerMetrics_fnc_log;
};
_settingsLoaded = parseSimpleArray (_settingsLoaded);
[format["Settings loaded: %1", _settingsLoaded]] call RangerMetrics_fnc_log;
RangerMetrics_settings = createHashMap;
RangerMetrics_settings set [
"influxDB",
createHashMapFromArray [
["host", _settingsLoaded#1],
["org", _settingsLoaded#2]
]
];
RangerMetrics_settings set [
"arma3",
createHashMapFromArray [
["refreshRateMs", _settingsLoaded#3]
]
]; ];
// Deinit to start fresh. See callback handler for the remainder of async init code
"RangerMetrics" callExtension "deinitExtension";
// connect to DB, extension is now ready
private _dbConnection = "RangerMetrics" callExtension "connectToInflux";
if (_dbConnection isEqualTo "") exitWith {
["Failed to connect to InfluxDB, disabling"] call RangerMetrics_fnc_log;
};
_response = parseSimpleArray _dbConnection;
(_response) call RangerMetrics_fnc_log;
systemChat str _response;
// send server profile name to all clients with JIP, so HC or player reporting knows what server it's connected to if (true) exitWith {};
if (isServer) then {
["RangerMetrics_serverProfileName", profileName] remoteExecCall ["setVariable", 0, true];
RangerMetrics_serverProfileName = profileName;
};
// define the metrics to capture by sideloading definition files // define the metrics to capture by sideloading definition files
@@ -158,10 +127,7 @@ RangerMetrics_captureDefinitions = createHashMapFromArray [
[] spawn { [] spawn {
sleep 1; sleep 1;
isNil { isNil {
addMissionEventHandler [
"ExtensionCallback",
RangerMetrics_fnc_callbackHandler
];
// set up CBA class inits if CBA loaded // set up CBA class inits if CBA loaded
call RangerMetrics_fnc_classHandlers; call RangerMetrics_fnc_classHandlers;

View File

@@ -1,6 +1,15 @@
{ {
"host" : "http://INFLUX_URL:8086", "influxdb": {
"token": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX_AUTH_TOKEN_XXXXXXXXXXXXXXXXXXXXXXXXXXX", "host": "http://host:8086",
"org" : "ORG_NAME", "token": "my-token",
"bucket" : "BUCKET_NAME", "org": "ranger-metrics"
},
"timescaledb": {
"connectionUrl": "postgresql://postgres:password@host:5432",
"databaseName": "ranger_metrics",
"description": "TimescaleDB is an open-source time-series database built on Postgres. Please leave the final section of the connection URL as 'postgres' as this is the maintenance database name. The extension will connect here first and create the database with desired name, then shift connections to the newly created database to create the schema and conduct write operations."
},
"arma3": {
"refreshRateMs": 1000
}
} }