mirror of
https://github.com/Sithranduil/srcds_exporter.git
synced 2025-07-22 05:28:26 +02:00
Add basic support for metamod/sourcemod/sourcepython
This commit is contained in:
186
index.js
186
index.js
@@ -6,7 +6,62 @@ const Gauge = prometheus.Gauge;
|
|||||||
|
|
||||||
const app = express();
|
const app = express();
|
||||||
|
|
||||||
function csgoRequest(response, res){
|
async function rconCommand(client, command) {
|
||||||
|
try {
|
||||||
|
return client.command(command);
|
||||||
|
} catch (err) {
|
||||||
|
if (err instanceof TimeoutError) {
|
||||||
|
console.error('request timed out')
|
||||||
|
} else {
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getMetamod(client) {
|
||||||
|
return rconCommand(client, 'meta');
|
||||||
|
}
|
||||||
|
|
||||||
|
function metamodRequest(response) {
|
||||||
|
if (response) {
|
||||||
|
isEnabled = isValidResponse(response);
|
||||||
|
metamodEnabledGauge.set(isEnabled ? Number(0) : Number(1));
|
||||||
|
} else {
|
||||||
|
metamodEnabledGauge.set((Number(-1)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getSourcemod(client) {
|
||||||
|
return rconCommand(client, 'sm');
|
||||||
|
}
|
||||||
|
|
||||||
|
function sourcemodRequest(response) {
|
||||||
|
if (response) {
|
||||||
|
isEnabled = isValidResponse(response);
|
||||||
|
sourcemodEnabledGauge.set(isEnabled ? Number(0) : Number(1));
|
||||||
|
} else {
|
||||||
|
sourcemodEnabledGauge.set((Number(-1)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getSourcepython(client) {
|
||||||
|
return rconCommand(client, 'sp');
|
||||||
|
}
|
||||||
|
|
||||||
|
function sourcepythonRequest(response) {
|
||||||
|
if (response) {
|
||||||
|
isEnabled = isValidResponse(response);
|
||||||
|
sourcepythonEnabledGauge.set(isEnabled ? Number(0) : Number(1));
|
||||||
|
} else {
|
||||||
|
sourcepythonEnabledGauge.set(Number(-1))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function isValidResponse(response) {
|
||||||
|
return !response.includes('Unknown');
|
||||||
|
}
|
||||||
|
|
||||||
|
function csgoRequest(response){
|
||||||
status.set((Number(1)));
|
status.set((Number(1)));
|
||||||
cpu.set((Number(response[0])));
|
cpu.set((Number(response[0])));
|
||||||
netin.set((Number(response[1])));
|
netin.set((Number(response[1])));
|
||||||
@@ -18,10 +73,9 @@ function csgoRequest(response, res){
|
|||||||
svms.set((Number(response[7])));
|
svms.set((Number(response[7])));
|
||||||
varms.set((Number(response[8])));
|
varms.set((Number(response[8])));
|
||||||
tick.set((Number(response[9])));
|
tick.set((Number(response[9])));
|
||||||
res.end(csgoRegistry.metrics());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function gmodRequest(response, res){
|
function gmodRequest(response){
|
||||||
status.set((Number(1)));
|
status.set((Number(1)));
|
||||||
cpu.set((Number(response[0])));
|
cpu.set((Number(response[0])));
|
||||||
netin.set((Number(response[1])));
|
netin.set((Number(response[1])));
|
||||||
@@ -30,32 +84,19 @@ function gmodRequest(response, res){
|
|||||||
maps.set((Number(response[4])));
|
maps.set((Number(response[4])));
|
||||||
fps.set((Number(response[5])));
|
fps.set((Number(response[5])));
|
||||||
players.set((Number(response[6])));
|
players.set((Number(response[6])));
|
||||||
res.end(gmodRegistry.metrics());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getStats(ip, port, password, game) {
|
async function getStats(client, game) {
|
||||||
let result;
|
const stats = await rconCommand(client, 'stats');
|
||||||
try {
|
|
||||||
const client = await connect(ip, port, password, 5000);
|
|
||||||
const stats = await client.command('stats');
|
|
||||||
await client.disconnect();
|
|
||||||
result = stats;
|
|
||||||
} catch (err) {
|
|
||||||
if (err instanceof TimeoutError) {
|
|
||||||
console.error('request timed out')
|
|
||||||
} else {
|
|
||||||
throw err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (game === "csgo"){
|
if (game === "csgo"){
|
||||||
var resultArray = result.split(/\r?\n/);
|
var resultArray = stats.split(/\r?\n/);
|
||||||
resultArray.pop();
|
resultArray.pop();
|
||||||
resultArray.shift();
|
resultArray.shift();
|
||||||
var finalArray = resultArray[0].split(/\s+/);
|
var finalArray = resultArray[0].split(/\s+/);
|
||||||
finalArray.shift();
|
finalArray.shift();
|
||||||
return finalArray;
|
return finalArray;
|
||||||
} else if (game === "gmod") {
|
} else if (game === "gmod") {
|
||||||
var resultArray = result.split(/\r?\n/);
|
var resultArray = stats.split(/\r?\n/);
|
||||||
resultArray.shift();
|
resultArray.shift();
|
||||||
var finalArray = resultArray[0].split(/\s+/);
|
var finalArray = resultArray[0].split(/\s+/);
|
||||||
return finalArray;
|
return finalArray;
|
||||||
@@ -79,52 +120,87 @@ const svms = new Gauge({name: "srcds_svms", help: "ms per sim frame", registers:
|
|||||||
const varms = new Gauge({name: "srcds_varms", help: "ms variance", registers: [csgoRegistry]});
|
const varms = new Gauge({name: "srcds_varms", help: "ms variance", registers: [csgoRegistry]});
|
||||||
const tick = new Gauge({name: "srcds_tick", help: "The time in MS per tick", registers: [csgoRegistry]});
|
const tick = new Gauge({name: "srcds_tick", help: "The time in MS per tick", registers: [csgoRegistry]});
|
||||||
|
|
||||||
|
const sourcemodEnabledGauge = new Gauge({name: "srcds_sourcemod_enabled", help: "Is sourcemod enabled", registers: [csgoRegistry]});
|
||||||
|
const metamodEnabledGauge = new Gauge({name: "srcds_metamod_enabled", help: "Is metamod enabled", registers: [csgoRegistry]});
|
||||||
|
const sourcepythonEnabledGauge = new Gauge({name: "srcds_sourcepython_enabled", help: "Is sourcepython enabled", registers: [csgoRegistry]});
|
||||||
|
|
||||||
app.get('/', (req, res) => {
|
app.get('/', (req, res) => {
|
||||||
res.send('use /metrics?ip=<srcds ip>&port=<srcds port>&password=<rcon password>&game=<game> to get data');
|
res.send('use /metrics?ip=<srcds ip>&port=<srcds port>&password=<rcon password>&game=<game>&sm=<boolean>&meta=<boolean>sp=<boolean> to get data');
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get('/metrics', (req, res) => {
|
app.get('/metrics', async (req, res) => {
|
||||||
var ip = req.query.ip;
|
var ip = req.query.ip;
|
||||||
var port = req.query.port;
|
var port = req.query.port;
|
||||||
var password = req.query.password;
|
var password = req.query.password;
|
||||||
var game = req.query.game;
|
var game = req.query.game;
|
||||||
|
let metamod = req.query.metamod || false;
|
||||||
|
let sourcemod = req.query.sourcemod || false;
|
||||||
|
let sourcepython = req.query.sourcepython || false;
|
||||||
if (ip == null || port == null || password == null || game == null){
|
if (ip == null || port == null || password == null || game == null){
|
||||||
res.send("Missing parameter, either IP, port, RCON password or game<br />use /metrics?ip=<srcds ip>&port=<srcds port>&password=<rcon password>&game=<game> to get data");
|
res.send("Missing parameter, either IP, port, RCON password or game<br />use /metrics?ip=<srcds ip>&port=<srcds port>&password=<rcon password>&game=<game>&sm=<boolean>&meta=<boolean>sp=<boolean> to get data");
|
||||||
} else {
|
return;
|
||||||
if (game === "csgo" || game === "gmod"){
|
}
|
||||||
getStats(ip, port, password, game, res).then(result => {
|
if (game === "csgo" || game === "gmod"){
|
||||||
if (game === "csgo"){
|
const client = await connect(ip, port, password, 5000);
|
||||||
const defaultLabels = { server: ip+':'+port, game: game };
|
const statsResponse = await getStats(client, game)
|
||||||
csgoRegistry.setDefaultLabels(defaultLabels);
|
try {
|
||||||
csgoRequest(result, res);
|
if (game === "csgo"){
|
||||||
} else if (game === "gmod"){
|
const defaultLabels = { server: ip+':'+port, game: game};
|
||||||
const defaultLabels = { server: ip+':'+port, game: game };
|
csgoRegistry.setDefaultLabels(defaultLabels);
|
||||||
gmodRegistry.setDefaultLabels(defaultLabels);
|
|
||||||
gmodRequest(result, res);
|
csgoRequest(statsResponse);
|
||||||
|
if (metamod) {
|
||||||
|
const metamodResponse = await getMetamod(client);
|
||||||
|
metamodRequest(metamodResponse);
|
||||||
|
} else {
|
||||||
|
metamodRequest(null);
|
||||||
}
|
}
|
||||||
}).catch(e => {
|
|
||||||
status.set((Number(0)));
|
if (sourcemod) {
|
||||||
cpu.set((Number(0)));
|
const sourcemodResponse = await getSourcemod(client);
|
||||||
netin.set((Number(0)));
|
sourcemodRequest(sourcemodResponse);
|
||||||
netout.set((Number(0)));
|
} else {
|
||||||
uptime.set((Number(0)));
|
sourcemodRequest(null);
|
||||||
maps.set((Number(0)));
|
}
|
||||||
fps.set((Number(0)));
|
if (sourcepython) {
|
||||||
players.set((Number(0)));
|
const sourcepythonResponse = await getSourcepython(client);
|
||||||
svms.set((Number(0)));
|
sourcepythonRequest(sourcepythonResponse);
|
||||||
varms.set((Number(0)));
|
} else {
|
||||||
tick.set((Number(0)));
|
sourcepythonRequest(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
res.end(csgoRegistry.metrics());
|
||||||
|
} else if (game === "gmod"){
|
||||||
|
const defaultLabels = { server: ip+':'+port, game: game };
|
||||||
|
gmodRegistry.setDefaultLabels(defaultLabels);
|
||||||
|
gmodRequest(result, res);
|
||||||
|
res.end(gmodRegistry.metrics());
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
status.set((Number(0)));
|
||||||
|
cpu.set((Number(0)));
|
||||||
|
netin.set((Number(0)));
|
||||||
|
netout.set((Number(0)));
|
||||||
|
uptime.set((Number(0)));
|
||||||
|
maps.set((Number(0)));
|
||||||
|
fps.set((Number(0)));
|
||||||
|
players.set((Number(0)));
|
||||||
|
svms.set((Number(0)));
|
||||||
|
varms.set((Number(0)));
|
||||||
|
tick.set((Number(0)));
|
||||||
|
metamodEnabledGauge.set((Number(-1)));
|
||||||
|
sourcemodEnabledGauge.set((Number(-1)));
|
||||||
|
sourcepythonEnabledGauge.set((Number(-1)));
|
||||||
|
|
||||||
if (game === "csgo"){
|
if (game === "csgo"){
|
||||||
res.end(csgoRegistry.metrics());
|
res.end(csgoRegistry.metrics());
|
||||||
} else if (game === "gmod"){
|
} else if (game === "gmod"){
|
||||||
res.end(gmodRegistry.metrics());
|
res.end(gmodRegistry.metrics());
|
||||||
}
|
}
|
||||||
})
|
|
||||||
} else {
|
|
||||||
res.send("Incorrect game value, currently supported games are : csgo, gmod");
|
|
||||||
}
|
}
|
||||||
|
await client.disconnect();
|
||||||
|
} else {
|
||||||
|
res.send("Incorrect game value, currently supported games are : csgo, gmod");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user