diff --git a/src/shadowbox/server/manager_metrics.spec.ts b/src/shadowbox/server/manager_metrics.spec.ts index a66097b1a..33931e51b 100644 --- a/src/shadowbox/server/manager_metrics.spec.ts +++ b/src/shadowbox/server/manager_metrics.spec.ts @@ -41,6 +41,19 @@ describe('PrometheusManagerMetrics', () => { const managerMetrics = new PrometheusManagerMetrics( new QueryMapPrometheusClient( { + 'sum(increase(shadowsocks_data_bytes_per_location{dir=~"c
t"}[300s]))': { + resultType: 'vector', + result: [ + { + metric: { + location: 'US', + asn: '49490', + asorg: 'Test AS Org', + }, + value: [1739284734, '1234'], + }, + ], + }, 'sum(increase(shadowsocks_data_bytes_per_location{dir=~"c
t"}[0s])) by (location, asn, asorg)': { resultType: 'vector', @@ -93,6 +106,22 @@ describe('PrometheusManagerMetrics', () => { }, }, { + 'sum(increase(shadowsocks_data_bytes_per_location{dir=~"c
t"}[300s]))': { + resultType: 'matrix', + result: [ + { + metric: { + location: 'US', + asn: '49490', + asorg: 'Test AS Org', + }, + values: [ + [1738959398, '5678'], + [1739284734, '1234'], + ], + }, + ], + }, 'sum(increase(shadowsocks_data_bytes{dir=~"c
t"}[300s])) by (access_key)': { resultType: 'matrix', result: [ @@ -102,7 +131,7 @@ describe('PrometheusManagerMetrics', () => { }, values: [ [1738959398, '1000'], - [1738959398, '2000'], + [1739284734, '2000'], ], }, ], @@ -116,7 +145,7 @@ describe('PrometheusManagerMetrics', () => { }, values: [ [1738959398, '1000'], - [1738959398, '0'], + [1739284734, '0'], ], }, ], @@ -128,19 +157,38 @@ describe('PrometheusManagerMetrics', () => { const serverMetrics = await managerMetrics.getServerMetrics({seconds: 0}); expect(JSON.stringify(serverMetrics, null, 2)).toEqual(`{ - "server": [ - { - "location": "US", - "asn": 49490, - "asOrg": "Test AS Org", - "dataTransferred": { + "server": { + "tunnelTime": { + "seconds": 1000 + }, + "dataTransferred": { + "total": { "bytes": 1000 }, - "tunnelTime": { - "seconds": 1000 + "current": { + "bytes": 1234 + }, + "peak": { + "data": { + "bytes": 5678 + }, + "timestamp": 1738959398 } - } - ], + }, + "locations": [ + { + "location": "US", + "asn": 49490, + "asOrg": "Test AS Org", + "dataTransferred": { + "bytes": 1000 + }, + "tunnelTime": { + "seconds": 1000 + } + } + ] + }, "accessKeys": [ { "accessKeyId": 0, @@ -152,9 +200,9 @@ describe('PrometheusManagerMetrics', () => { }, "connection": { "lastConnected": 1738959398, - "lastTrafficSeen": 1738959398, - "peakDevices": { - "count": 4, + "lastTrafficSeen": 1739284734, + "peakDeviceCount": { + "data": 4, "timestamp": 1738959398 } } @@ -168,6 +216,19 @@ describe('PrometheusManagerMetrics', () => { const managerMetrics = new PrometheusManagerMetrics( new QueryMapPrometheusClient( { + 'sum(increase(shadowsocks_data_bytes_per_location{dir=~"c
t"}[300s]))': { + resultType: 'vector', + result: [ + { + metric: { + location: 'US', + asn: '49490', + asorg: 'Test AS Org', + }, + value: [1739284734, '1234'], + }, + ], + }, 'sum(increase(shadowsocks_data_bytes_per_location{dir=~"c
t"}[0s])) by (location, asn, asorg)': { resultType: 'vector', @@ -218,6 +279,22 @@ describe('PrometheusManagerMetrics', () => { }, }, { + 'sum(increase(shadowsocks_data_bytes_per_location{dir=~"c
t"}[300s]))': { + resultType: 'matrix', + result: [ + { + metric: { + location: 'US', + asn: '49490', + asorg: 'Test AS Org', + }, + values: [ + [1738959398, '5678'], + [1739284734, '1234'], + ], + }, + ], + }, 'sum(increase(shadowsocks_data_bytes{dir=~"c
t"}[300s])) by (access_key)': {
resultType: 'matrix',
result: [
@@ -253,30 +330,49 @@ describe('PrometheusManagerMetrics', () => {
const serverMetrics = await managerMetrics.getServerMetrics({seconds: 0});
expect(JSON.stringify(serverMetrics, null, 2)).toEqual(`{
- "server": [
- {
- "location": "CA",
- "asn": null,
- "asOrg": null,
- "dataTransferred": {
- "bytes": 0
+ "server": {
+ "tunnelTime": {
+ "seconds": 1000
+ },
+ "dataTransferred": {
+ "total": {
+ "bytes": 1000
},
- "tunnelTime": {
- "seconds": 1000
+ "current": {
+ "bytes": 1234
+ },
+ "peak": {
+ "data": {
+ "bytes": 5678
+ },
+ "timestamp": 1738959398
}
},
- {
- "location": "US",
- "asn": 49490,
- "asOrg": "Test AS Org",
- "dataTransferred": {
- "bytes": 1000
+ "locations": [
+ {
+ "location": "CA",
+ "asn": null,
+ "asOrg": null,
+ "dataTransferred": {
+ "bytes": 0
+ },
+ "tunnelTime": {
+ "seconds": 1000
+ }
},
- "tunnelTime": {
- "seconds": 0
+ {
+ "location": "US",
+ "asn": 49490,
+ "asOrg": "Test AS Org",
+ "dataTransferred": {
+ "bytes": 1000
+ },
+ "tunnelTime": {
+ "seconds": 0
+ }
}
- }
- ],
+ ]
+ },
"accessKeys": [
{
"accessKeyId": 1,
@@ -289,8 +385,8 @@ describe('PrometheusManagerMetrics', () => {
"connection": {
"lastConnected": null,
"lastTrafficSeen": null,
- "peakDevices": {
- "count": 0,
+ "peakDeviceCount": {
+ "data": 0,
"timestamp": null
}
}
@@ -306,8 +402,8 @@ describe('PrometheusManagerMetrics', () => {
"connection": {
"lastConnected": 1738959398,
"lastTrafficSeen": 1738959398,
- "peakDevices": {
- "count": 4,
+ "peakDeviceCount": {
+ "data": 4,
"timestamp": 1738959398
}
}
diff --git a/src/shadowbox/server/manager_metrics.ts b/src/shadowbox/server/manager_metrics.ts
index 1afeab175..1f372fdde 100644
--- a/src/shadowbox/server/manager_metrics.ts
+++ b/src/shadowbox/server/manager_metrics.ts
@@ -29,18 +29,30 @@ interface Data {
bytes: number;
}
-interface PeakDevices {
- count: number;
+interface TimedData t"}[${PROMETHEUS_RANGE_QUERY_STEP_SECONDS}s]))`
+ ),
+ this.prometheusClient.queryRange(
+ `sum(increase(shadowsocks_data_bytes_per_location{dir=~"c t"}[${PROMETHEUS_RANGE_QUERY_STEP_SECONDS}s]))`,
+ start,
+ end,
+ `${PROMETHEUS_RANGE_QUERY_STEP_SECONDS}s`
+ ),
this.prometheusClient.query(
`sum(increase(shadowsocks_data_bytes_per_location{dir=~"c t"}[${timeframe.seconds}s])) by (location, asn, asorg)`
),
@@ -135,28 +157,56 @@ export class PrometheusManagerMetrics implements ManagerMetrics {
),
]);
- const serverMap = new Map