Ajout du support de cstrike

This commit is contained in:
2020-10-06 22:09:11 +02:00
parent 3ba9b79e7e
commit 14fdcc39c2

View File

@@ -62,7 +62,8 @@ function isValidResponse(response) {
return !response.includes('Unknown'); return !response.includes('Unknown');
} }
function csgoRequest(response) { function gameRequest(response, game) {
if (game === 'csgo') {
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])));
@@ -74,9 +75,7 @@ function csgoRequest(response) {
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])));
} } else {
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])));
@@ -85,45 +84,51 @@ function gmodRequest(response) {
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])));
}
} }
async function getStats(client, game) { async function getStats(client, game) {
const stats = await rconCommand(client, 'stats'); const stats = await rconCommand(client, 'stats');
if (game === 'csgo') { let statusLine = null;
const resultArray = stats.split(/\r?\n/); if (stats) {
resultArray.pop(); statusLine = stats.split(/\r?\n/);
resultArray.shift(); } else {
const finalArray = resultArray[0].split(/\s+/);
finalArray.shift();
return finalArray;
} if (game === 'gmod') {
const resultArray = stats.split(/\r?\n/);
resultArray.shift();
const finalArray = resultArray[0].split(/\s+/);
return finalArray;
}
return null; return null;
}
if (game === 'csgo') {
statusLine = stats.split(/\r?\n/);
statusLine.pop();
}
statusLine.shift();
statusLine = statusLine[0].split(/\s+/);
return statusLine;
} }
const csgoRegistry = new prometheus.Registry(); const csgoRegistry = new prometheus.Registry();
const gmodRegistry = new prometheus.Registry(); const gmodRegistry = new prometheus.Registry();
const cstrikeRegistry = new prometheus.Registry();
// Global metrics, used accross all Source gameservers // Global metrics, used accross all Source gameservers
const status = new Gauge({ name: 'srcds_status', help: "The server's status, 0 = offline/bad password, 1 = online", registers: [csgoRegistry, gmodRegistry] }); const status = new Gauge({ name: 'srcds_status', help: "The server's status, 0 = offline/bad password, 1 = online", registers: [csgoRegistry, gmodRegistry, cstrikeRegistry] });
const cpu = new Gauge({ name: 'srcds_cpu', help: 'Probably the priority level of the srcds executable from an operating system point of view (0 - No priority, 10 - biggest priority)', registers: [csgoRegistry, gmodRegistry] }); const cpu = new Gauge({ name: 'srcds_cpu', help: 'Probably the priority level of the srcds executable from an operating system point of view (0 - No priority, 10 - biggest priority)', registers: [csgoRegistry, gmodRegistry, cstrikeRegistry] });
const netin = new Gauge({ name: 'srcds_netin', help: 'Incoming bandwidth, in kbps, received by the server', registers: [csgoRegistry, gmodRegistry] }); const netin = new Gauge({ name: 'srcds_netin', help: 'Incoming bandwidth, in kbps, received by the server', registers: [csgoRegistry, gmodRegistry, cstrikeRegistry] });
const netout = new Gauge({ name: 'srcds_netout', help: 'Incoming bandwidth, in kbps, sent by the server', registers: [csgoRegistry, gmodRegistry] }); const netout = new Gauge({ name: 'srcds_netout', help: 'Incoming bandwidth, in kbps, sent by the server', registers: [csgoRegistry, gmodRegistry, cstrikeRegistry] });
const uptime = new Gauge({ name: 'srcds_uptime', help: "The server's uptime, in minutes", registers: [csgoRegistry, gmodRegistry] }); const uptime = new Gauge({ name: 'srcds_uptime', help: "The server's uptime, in minutes", registers: [csgoRegistry, gmodRegistry, cstrikeRegistry] });
const maps = new Gauge({ name: 'srcds_maps', help: "The number of maps played on that server since it's start", registers: [csgoRegistry, gmodRegistry] }); const maps = new Gauge({ name: 'srcds_maps', help: "The number of maps played on that server since it's start", registers: [csgoRegistry, gmodRegistry, cstrikeRegistry] });
const fps = new Gauge({ name: 'srcds_fps', help: "The server's tick (10 fps on idle, 64 fps for 64 ticks server, 128 fps for 128 ticks..)", registers: [csgoRegistry, gmodRegistry] }); const fps = new Gauge({ name: 'srcds_fps', help: "The server's tick (10 fps on idle, 64 fps for 64 ticks server, 128 fps for 128 ticks..)", registers: [csgoRegistry, gmodRegistry, cstrikeRegistry] });
const players = new Gauge({ name: 'srcds_players', help: 'The number of real players actually connected on the server', registers: [csgoRegistry, gmodRegistry] }); const players = new Gauge({ name: 'srcds_players', help: 'The number of real players actually connected on the server', registers: [csgoRegistry, gmodRegistry, cstrikeRegistry] });
// CSGO metrics // CSGO metrics
const svms = new Gauge({ name: 'srcds_svms', help: 'ms per sim frame', registers: [csgoRegistry] }); const svms = new Gauge({ name: 'srcds_svms', help: 'ms per sim frame', registers: [csgoRegistry] });
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] }); // Metamod metrics
const metamodEnabledGauge = new Gauge({ name: 'srcds_metamod_enabled', help: 'Is metamod enabled', registers: [csgoRegistry] }); const metamodEnabledGauge = new Gauge({ name: 'srcds_metamod_enabled', help: 'Is metamod enabled', registers: [csgoRegistry] });
// Sourcemod metrics
const sourcemodEnabledGauge = new Gauge({ name: 'srcds_sourcemod_enabled', help: 'Is sourcemod enabled', registers: [csgoRegistry] });
// SourcePython metrics
const sourcepythonEnabledGauge = new Gauge({ name: 'srcds_sourcepython_enabled', help: 'Is sourcepython 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) => {
@@ -138,26 +143,26 @@ app.get('/metrics', async (req, res) => {
const metamod = req.query.metamod || false; const metamod = req.query.metamod || false;
const sourcemod = req.query.sourcemod || false; const sourcemod = req.query.sourcemod || false;
const sourcepython = req.query.sourcepython || false; const 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=&lt;srcds ip&gt;&port=&lt;srcds port&gt;&password=&lt;rcon password&gt;&game=&lt;game&gt;&sm=<boolean>&meta=<boolean>sp=<boolean> to get data'); res.send('Missing parameter, either IP, port, RCON password or game<br />use /metrics?ip=&lt;srcds ip&gt;&port=&lt;srcds port&gt;&password=&lt;rcon password&gt;&game=&lt;game&gt;&sm=<boolean>&meta=<boolean>sp=<boolean> to get data');
return; return;
} }
if (game === 'csgo' || game === 'gmod') {
if (game !== 'csgo' && game !== 'gmod' && game !== 'cstrike') {
res.send('Incorrect game value, currently supported games are : csgo, gmod, cstrike');
return;
}
const client = await connect(ip, port, password, 5000); const client = await connect(ip, port, password, 5000);
const statsResponse = await getStats(client, game); const statsResponse = await getStats(client, game);
try { try {
if (game === 'csgo') {
const defaultLabels = { server: `${ip}:${port}`, game };
csgoRegistry.setDefaultLabels(defaultLabels);
csgoRequest(statsResponse);
if (metamod) { if (metamod) {
const metamodResponse = await getMetamod(client); const metamodResponse = await getMetamod(client);
metamodRequest(metamodResponse); metamodRequest(metamodResponse);
} else { } else {
metamodRequest(null); metamodRequest(null);
} }
if (sourcemod) { if (sourcemod) {
const sourcemodResponse = await getSourcemod(client); const sourcemodResponse = await getSourcemod(client);
sourcemodRequest(sourcemodResponse); sourcemodRequest(sourcemodResponse);
@@ -171,11 +176,16 @@ app.get('/metrics', async (req, res) => {
sourcepythonRequest(null); sourcepythonRequest(null);
} }
res.end(csgoRegistry.metrics());
} else if (game === 'gmod') {
const defaultLabels = { server: `${ip}:${port}`, game }; const defaultLabels = { server: `${ip}:${port}`, game };
gameRequest(statsResponse, game);
if (game === 'csgo') {
csgoRegistry.setDefaultLabels(defaultLabels);
res.end(csgoRegistry.metrics());
} else if (game === 'cstrike') {
cstrikeRegistry.setDefaultLabels(defaultLabels);
res.end(cstrikeRegistry.metrics());
} else if (game === 'gmod') {
gmodRegistry.setDefaultLabels(defaultLabels); gmodRegistry.setDefaultLabels(defaultLabels);
gmodRequest(statsResponse);
res.end(gmodRegistry.metrics()); res.end(gmodRegistry.metrics());
} }
} catch (e) { } catch (e) {
@@ -198,12 +208,11 @@ app.get('/metrics', async (req, res) => {
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 if (game === 'cstrike') {
res.end(cstrikeRegistry.metrics());
} }
} }
await client.disconnect(); await client.disconnect();
} else {
res.send('Incorrect game value, currently supported games are : csgo, gmod');
}
}); });
app.listen(9591); app.listen(9591);