diff --git a/index.js b/index.js
index 76b83b6..78dd53f 100644
--- a/index.js
+++ b/index.js
@@ -62,68 +62,73 @@ function isValidResponse(response) {
return !response.includes('Unknown');
}
-function csgoRequest(response) {
- status.set((Number(1)));
- cpu.set((Number(response[0])));
- netin.set((Number(response[1])));
- netout.set((Number(response[2])));
- uptime.set((Number(response[3])));
- maps.set((Number(response[4])));
- fps.set((Number(response[5])));
- players.set((Number(response[6])));
- svms.set((Number(response[7])));
- varms.set((Number(response[8])));
- tick.set((Number(response[9])));
-}
-
-function gmodRequest(response) {
- status.set((Number(1)));
- cpu.set((Number(response[0])));
- netin.set((Number(response[1])));
- netout.set((Number(response[2])));
- uptime.set((Number(response[3])));
- maps.set((Number(response[4])));
- fps.set((Number(response[5])));
- players.set((Number(response[6])));
+function gameRequest(response, game) {
+ if (game === 'csgo') {
+ status.set((Number(1)));
+ cpu.set((Number(response[0])));
+ netin.set((Number(response[1])));
+ netout.set((Number(response[2])));
+ uptime.set((Number(response[3])));
+ maps.set((Number(response[4])));
+ fps.set((Number(response[5])));
+ players.set((Number(response[6])));
+ svms.set((Number(response[7])));
+ varms.set((Number(response[8])));
+ tick.set((Number(response[9])));
+ } else {
+ status.set((Number(1)));
+ cpu.set((Number(response[0])));
+ netin.set((Number(response[1])));
+ netout.set((Number(response[2])));
+ uptime.set((Number(response[3])));
+ maps.set((Number(response[4])));
+ fps.set((Number(response[5])));
+ players.set((Number(response[6])));
+ }
}
async function getStats(client, game) {
const stats = await rconCommand(client, 'stats');
- if (game === 'csgo') {
- const resultArray = stats.split(/\r?\n/);
- resultArray.pop();
- resultArray.shift();
- 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;
+ let statusLine = null;
+ if (stats) {
+ statusLine = stats.split(/\r?\n/);
+ } else {
+ 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 gmodRegistry = new prometheus.Registry();
+const cstrikeRegistry = new prometheus.Registry();
// 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 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 netin = new Gauge({ name: 'srcds_netin', help: 'Incoming bandwidth, in kbps, received 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] });
-const uptime = new Gauge({ name: 'srcds_uptime', help: "The server's uptime, in minutes", 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] });
-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 players = new Gauge({ name: 'srcds_players', help: 'The number of real players actually connected on the server', 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, cstrikeRegistry] });
+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, cstrikeRegistry] });
+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, 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, cstrikeRegistry] });
+const players = new Gauge({ name: 'srcds_players', help: 'The number of real players actually connected on the server', registers: [csgoRegistry, gmodRegistry, cstrikeRegistry] });
// CSGO metrics
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 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] });
+
+// 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] });
app.get('/', (req, res) => {
@@ -138,72 +143,76 @@ app.get('/metrics', async (req, res) => {
const metamod = req.query.metamod || false;
const sourcemod = req.query.sourcemod || false;
const sourcepython = req.query.sourcepython || false;
+
if (ip == null || port == null || password == null || game == null) {
res.send('Missing parameter, either IP, port, RCON password or game
use /metrics?ip=<srcds ip>&port=<srcds port>&password=<rcon password>&game=<game>&sm=&meta=sp= to get data');
return;
}
- if (game === 'csgo' || game === 'gmod') {
- const client = await connect(ip, port, password, 5000);
- const statsResponse = await getStats(client, game);
- try {
- if (game === 'csgo') {
- const defaultLabels = { server: `${ip}:${port}`, game };
- csgoRegistry.setDefaultLabels(defaultLabels);
- csgoRequest(statsResponse);
- if (metamod) {
- const metamodResponse = await getMetamod(client);
- metamodRequest(metamodResponse);
- } else {
- metamodRequest(null);
- }
-
- if (sourcemod) {
- const sourcemodResponse = await getSourcemod(client);
- sourcemodRequest(sourcemodResponse);
- } else {
- sourcemodRequest(null);
- }
- if (sourcepython) {
- const sourcepythonResponse = await getSourcepython(client);
- sourcepythonRequest(sourcepythonResponse);
- } else {
- sourcepythonRequest(null);
- }
-
- res.end(csgoRegistry.metrics());
- } else if (game === 'gmod') {
- const defaultLabels = { server: `${ip}:${port}`, game };
- gmodRegistry.setDefaultLabels(defaultLabels);
- gmodRequest(statsResponse);
- 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') {
- res.end(csgoRegistry.metrics());
- } else if (game === 'gmod') {
- res.end(gmodRegistry.metrics());
- }
- }
- await client.disconnect();
- } else {
- res.send('Incorrect game value, currently supported games are : csgo, 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 statsResponse = await getStats(client, game);
+ try {
+ if (metamod) {
+ const metamodResponse = await getMetamod(client);
+ metamodRequest(metamodResponse);
+ } else {
+ metamodRequest(null);
+ }
+ if (sourcemod) {
+ const sourcemodResponse = await getSourcemod(client);
+ sourcemodRequest(sourcemodResponse);
+ } else {
+ sourcemodRequest(null);
+ }
+ if (sourcepython) {
+ const sourcepythonResponse = await getSourcepython(client);
+ sourcepythonRequest(sourcepythonResponse);
+ } else {
+ sourcepythonRequest(null);
+ }
+
+ 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);
+ 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') {
+ res.end(csgoRegistry.metrics());
+ } else if (game === 'gmod') {
+ res.end(gmodRegistry.metrics());
+ } else if (game === 'cstrike') {
+ res.end(cstrikeRegistry.metrics());
+ }
+ }
+ await client.disconnect();
});
app.listen(9591);