mirror of https://github.com/wg-easy/wg-easy
6 changed files with 114 additions and 81 deletions
@ -1,4 +0,0 @@ |
|||
export default defineMetricsHandler('prometheus', async ({ event }) => { |
|||
setHeader(event, 'Content-Type', 'text/plain'); |
|||
return getPrometheusResponse(); |
|||
}); |
@ -1,3 +1,35 @@ |
|||
export default defineMetricsHandler('prometheus', async () => { |
|||
return getMetricsJSON(); |
|||
}); |
|||
|
|||
async function getMetricsJSON() { |
|||
const clients = await WireGuard.getClients(); |
|||
let wireguardPeerCount = 0; |
|||
let wireguardEnabledPeersCount = 0; |
|||
let wireguardConnectedPeersCount = 0; |
|||
for (const client of clients) { |
|||
wireguardPeerCount++; |
|||
if (client.enabled === true) { |
|||
wireguardEnabledPeersCount++; |
|||
} |
|||
if (isPeerConnected(client)) { |
|||
wireguardConnectedPeersCount++; |
|||
} |
|||
} |
|||
return { |
|||
wireguard_configured_peers: wireguardPeerCount, |
|||
wireguard_enabled_peers: wireguardEnabledPeersCount, |
|||
wireguard_connected_peers: wireguardConnectedPeersCount, |
|||
clients: clients.map((client) => ({ |
|||
name: client.name, |
|||
enabled: client.enabled, |
|||
ipv4Address: client.ipv4Address, |
|||
ipv6Address: client.ipv6Address, |
|||
publicKey: client.publicKey, |
|||
endpoint: client.endpoint, |
|||
latestHandshakeAt: client.latestHandshakeAt, |
|||
transferRx: client.transferRx, |
|||
transferTx: client.transferTx, |
|||
})), |
|||
}; |
|||
} |
|||
|
@ -0,0 +1,67 @@ |
|||
export default defineMetricsHandler('prometheus', async ({ event }) => { |
|||
setHeader(event, 'Content-Type', 'text/plain'); |
|||
return getPrometheusResponse(); |
|||
}); |
|||
|
|||
async function getPrometheusResponse() { |
|||
const clients = await WireGuard.getClients(); |
|||
let wireguardPeerCount = 0; |
|||
let wireguardEnabledPeersCount = 0; |
|||
let wireguardConnectedPeersCount = 0; |
|||
const wireguardSentBytes = []; |
|||
const wireguardReceivedBytes = []; |
|||
const wireguardLatestHandshakeSeconds = []; |
|||
for (const client of clients) { |
|||
wireguardPeerCount++; |
|||
if (client.enabled === true) { |
|||
wireguardEnabledPeersCount++; |
|||
} |
|||
|
|||
if (isPeerConnected(client)) { |
|||
wireguardConnectedPeersCount++; |
|||
} |
|||
|
|||
const id = `interface="wg0",enabled="${client.enabled}",ipv4Address="${client.ipv4Address}",ipv6Address="${client.ipv6Address}",name="${client.name}"`; |
|||
|
|||
wireguardSentBytes.push( |
|||
`wireguard_sent_bytes{${id}} ${client.transferTx ?? 0}` |
|||
); |
|||
wireguardReceivedBytes.push( |
|||
`wireguard_received_bytes{${id}} ${client.transferRx ?? 0}` |
|||
); |
|||
// TODO: if latestHandshakeAt is null this would result in client showing as online?
|
|||
wireguardLatestHandshakeSeconds.push( |
|||
`wireguard_latest_handshake_seconds{${id}} ${client.latestHandshakeAt ? (Date.now() - client.latestHandshakeAt.getTime()) / 1000 : 0}` |
|||
); |
|||
} |
|||
|
|||
const returnText = [ |
|||
'# HELP wg-easy and wireguard metrics', |
|||
'', |
|||
'# HELP wireguard_configured_peers', |
|||
'# TYPE wireguard_configured_peers gauge', |
|||
`wireguard_configured_peers{interface="wg0"} ${wireguardPeerCount}`, |
|||
'', |
|||
'# HELP wireguard_enabled_peers', |
|||
'# TYPE wireguard_enabled_peers gauge', |
|||
`wireguard_enabled_peers{interface="wg0"} ${wireguardEnabledPeersCount}`, |
|||
'', |
|||
'# HELP wireguard_connected_peers', |
|||
'# TYPE wireguard_connected_peers gauge', |
|||
`wireguard_connected_peers{interface="wg0"} ${wireguardConnectedPeersCount}`, |
|||
'', |
|||
'# HELP wireguard_sent_bytes Bytes sent to the peer', |
|||
'# TYPE wireguard_sent_bytes counter', |
|||
`${wireguardSentBytes.join('\n')}`, |
|||
'', |
|||
'# HELP wireguard_received_bytes Bytes received from the peer', |
|||
'# TYPE wireguard_received_bytes counter', |
|||
`${wireguardReceivedBytes.join('\n')}`, |
|||
'', |
|||
'# HELP wireguard_latest_handshake_seconds UNIX timestamp seconds of the last handshake', |
|||
'# TYPE wireguard_latest_handshake_seconds gauge', |
|||
`${wireguardLatestHandshakeSeconds.join('\n')}`, |
|||
]; |
|||
|
|||
return returnText.join('\n'); |
|||
} |
@ -1,74 +0,0 @@ |
|||
// TODO: rewrite
|
|||
|
|||
export async function getPrometheusResponse() { |
|||
const clients = await WireGuard.getClients(); |
|||
let wireguardPeerCount = 0; |
|||
let wireguardEnabledPeersCount = 0; |
|||
let wireguardConnectedPeersCount = 0; |
|||
let wireguardSentBytes = ''; |
|||
let wireguardReceivedBytes = ''; |
|||
let wireguardLatestHandshakeSeconds = ''; |
|||
for (const client of clients) { |
|||
wireguardPeerCount++; |
|||
if (client.enabled === true) { |
|||
wireguardEnabledPeersCount++; |
|||
} |
|||
if (client.endpoint !== null) { |
|||
wireguardConnectedPeersCount++; |
|||
} |
|||
wireguardSentBytes += `wireguard_sent_bytes{interface="wg0",enabled="${client.enabled}",ipv4Address="${client.ipv4Address}",ipv6Address="${client.ipv6Address}",name="${client.name}"} ${Number(client.transferTx)}\n`; |
|||
wireguardReceivedBytes += `wireguard_received_bytes{interface="wg0",enabled="${client.enabled}",ipv4Address="${client.ipv4Address}",ipv6Address="${client.ipv6Address}",name="${client.name}"} ${Number(client.transferRx)}\n`; |
|||
wireguardLatestHandshakeSeconds += `wireguard_latest_handshake_seconds{interface="wg0",enabled="${client.enabled}",ipv4Address="${client.ipv4Address}",ipv6Address="${client.ipv6Address}",name="${client.name}"} ${client.latestHandshakeAt ? (new Date().getTime() - new Date(client.latestHandshakeAt).getTime()) / 1000 : 0}\n`; |
|||
} |
|||
|
|||
let returnText = '# HELP wg-easy and wireguard metrics\n'; |
|||
|
|||
returnText += '\n# HELP wireguard_configured_peers\n'; |
|||
returnText += '# TYPE wireguard_configured_peers gauge\n'; |
|||
returnText += `wireguard_configured_peers{interface="wg0"} ${wireguardPeerCount}\n`; |
|||
|
|||
returnText += '\n# HELP wireguard_enabled_peers\n'; |
|||
returnText += '# TYPE wireguard_enabled_peers gauge\n'; |
|||
returnText += `wireguard_enabled_peers{interface="wg0"} ${wireguardEnabledPeersCount}\n`; |
|||
|
|||
returnText += '\n# HELP wireguard_connected_peers\n'; |
|||
returnText += '# TYPE wireguard_connected_peers gauge\n'; |
|||
returnText += `wireguard_connected_peers{interface="wg0"} ${wireguardConnectedPeersCount}\n`; |
|||
|
|||
returnText += '\n# HELP wireguard_sent_bytes Bytes sent to the peer\n'; |
|||
returnText += '# TYPE wireguard_sent_bytes counter\n'; |
|||
returnText += `${wireguardSentBytes}`; |
|||
|
|||
returnText += |
|||
'\n# HELP wireguard_received_bytes Bytes received from the peer\n'; |
|||
returnText += '# TYPE wireguard_received_bytes counter\n'; |
|||
returnText += `${wireguardReceivedBytes}`; |
|||
|
|||
returnText += |
|||
'\n# HELP wireguard_latest_handshake_seconds UNIX timestamp seconds of the last handshake\n'; |
|||
returnText += '# TYPE wireguard_latest_handshake_seconds gauge\n'; |
|||
returnText += `${wireguardLatestHandshakeSeconds}`; |
|||
|
|||
return returnText; |
|||
} |
|||
|
|||
export async function getMetricsJSON() { |
|||
const clients = await WireGuard.getClients(); |
|||
let wireguardPeerCount = 0; |
|||
let wireguardEnabledPeersCount = 0; |
|||
let wireguardConnectedPeersCount = 0; |
|||
for (const client of clients) { |
|||
wireguardPeerCount++; |
|||
if (client.enabled === true) { |
|||
wireguardEnabledPeersCount++; |
|||
} |
|||
if (client.endpoint !== null) { |
|||
wireguardConnectedPeersCount++; |
|||
} |
|||
} |
|||
return { |
|||
wireguard_configured_peers: wireguardPeerCount, |
|||
wireguard_enabled_peers: wireguardEnabledPeersCount, |
|||
wireguard_connected_peers: wireguardConnectedPeersCount, |
|||
}; |
|||
} |
@ -0,0 +1,10 @@ |
|||
export function isPeerConnected(client: { latestHandshakeAt: Date | null }) { |
|||
if (!client.latestHandshakeAt) { |
|||
return false; |
|||
} |
|||
|
|||
const lastHandshakeMs = Date.now() - client.latestHandshakeAt.getTime(); |
|||
|
|||
// connected if last handshake was less than 10 minutes ago
|
|||
return lastHandshakeMs < 1000 * 60 * 10; |
|||
} |
Loading…
Reference in new issue