diff --git a/src/api.ts b/src/api.ts index a6d6d578..384f8895 100644 --- a/src/api.ts +++ b/src/api.ts @@ -65,6 +65,9 @@ export const apiFactory = (serviceId: number) => { return res.sendStatus(400); } metrics.inc(Metrics.OnlineDevices); + metrics.inc(Metrics.OnlineDevicesByUuid, undefined, { + device_uuid: req.body.common_name, + }); metrics.inc(Metrics.TotalDevices); if ( @@ -106,6 +109,9 @@ export const apiFactory = (serviceId: number) => { `AUTH FAIL: API Authentication failed for ${req.body.username}`, ); metrics.inc(Metrics.AuthFailures); + metrics.inc(Metrics.AuthFailuresByUuid, undefined, { + device_uuid: req.body.common_name, + }); return res.sendStatus(401); } }) @@ -146,6 +152,9 @@ export const apiFactory = (serviceId: number) => { clients .disconnected(serviceId, req.params.worker, req.body) .then(logStateUpdate); + metrics.dec(Metrics.OnlineDevicesByUuid, undefined, { + device_uuid: req.body.common_name, + }); res.send('OK'); }); diff --git a/src/utils/metrics.ts b/src/utils/metrics.ts index 1635800a..ac5f1bee 100644 --- a/src/utils/metrics.ts +++ b/src/utils/metrics.ts @@ -6,11 +6,14 @@ export const enum Metrics { SessionRxBitrate = 'vpn_session_avg_rx_bitrate', SessionTxBitrate = 'vpn_session_avg_tx_bitrate', RxBytes = 'vpn_rx_bytes_total', + RxBytesByUuid = 'vpn_rx_bytes_by_uuid_total', TxBytes = 'vpn_tx_bytes_total', + TxBytesByUuid = 'vpn_tx_bytes_by_uuid_total', OnlineDevices = 'vpn_online_devices', + OnlineDevicesByUuid = 'vpn_online_devices_by_uuid', TotalDevices = 'vpn_devices_total', AuthFailures = 'vpn_auth_failures_total', - + AuthFailuresByUuid = 'vpn_auth_failures_by_uuid_total', ActiveTunnels = 'vpn_proxy_active_tunnels', TotalTunnels = 'vpn_proxy_total_tunnels', } @@ -19,6 +22,14 @@ export const describeMetrics = () => { if (cluster.isWorker) { metrics.describe(Metrics.OnlineDevices, 'vpn current online devices'); metrics.gauge(Metrics.OnlineDevices, 0); + metrics.describe( + Metrics.OnlineDevicesByUuid, + 'vpn current online devices', + { + labelNames: ['device_uuid'], + }, + ); + metrics.gauge(Metrics.OnlineDevicesByUuid, 0); metrics.describe(Metrics.TotalDevices, 'vpn total devices since restart'); metrics.counter(Metrics.TotalDevices, 0); metrics.describe( @@ -26,10 +37,34 @@ export const describeMetrics = () => { 'vpn device auth failures since restart', ); metrics.counter(Metrics.AuthFailures, 0); + metrics.describe( + Metrics.AuthFailuresByUuid, + 'vpn device auth failures since restart', + { + labelNames: ['device_uuid'], + }, + ); + metrics.counter(Metrics.AuthFailuresByUuid, 0); metrics.describe(Metrics.RxBytes, 'total rx bytes across all vpn sessions'); metrics.counter(Metrics.RxBytes, 0); + metrics.describe( + Metrics.RxBytesByUuid, + 'total rx bytes across all vpn sessions', + { + labelNames: ['device_uuid'], + }, + ); + metrics.counter(Metrics.RxBytesByUuid, 0); metrics.describe(Metrics.TxBytes, 'total tx bytes across all vpn sessions'); metrics.counter(Metrics.TxBytes, 0); + metrics.describe( + Metrics.TxBytesByUuid, + 'total tx bytes across all vpn sessions', + { + labelNames: ['device_uuid'], + }, + ); + metrics.counter(Metrics.TxBytesByUuid, 0); const min = 60; const hour = 60 * min; const day = 24 * hour; diff --git a/src/vpn-worker.ts b/src/vpn-worker.ts index 9fe86e0e..43f12665 100644 --- a/src/vpn-worker.ts +++ b/src/vpn-worker.ts @@ -72,7 +72,9 @@ const worker = (instanceId: number, serviceId: number) => { const txDelta = data.bytes_sent - clientCache[clientId].bytes_sent; const timeDelta = process.hrtime()[0] - clientCache[clientId].ts; metrics.inc(Metrics.RxBytes, rxDelta); + metrics.inc(Metrics.RxBytesByUuid, rxDelta, { device_uuid: uuid }); metrics.inc(Metrics.TxBytes, txDelta); + metrics.inc(Metrics.TxBytesByUuid, txDelta, { device_uuid: uuid }); if (timeDelta > 0 && process.send != null) { process.send({ type: 'bitrate',