mirror of
https://github.com/DIYgod/RSSHub.git
synced 2025-12-05 04:11:26 +08:00
feat: add error routes and error paths info
This commit is contained in:
@@ -61,6 +61,8 @@ if (cluster.isMaster && config.enableCluster && process.env.NODE_ENV !== 'test'
|
|||||||
paths: [],
|
paths: [],
|
||||||
routes: [],
|
routes: [],
|
||||||
ips: [],
|
ips: [],
|
||||||
|
errorPaths: [],
|
||||||
|
errorRoutes: [],
|
||||||
};
|
};
|
||||||
app.use(debug);
|
app.use(debug);
|
||||||
|
|
||||||
|
|||||||
@@ -10,5 +10,15 @@ module.exports = async (ctx, next) => {
|
|||||||
});
|
});
|
||||||
ctx.body = `RSSHub 发生了一些意外: <pre>${err instanceof Error ? err.stack : err}</pre>`;
|
ctx.body = `RSSHub 发生了一些意外: <pre>${err instanceof Error ? err.stack : err}</pre>`;
|
||||||
ctx.status = 404;
|
ctx.status = 404;
|
||||||
|
|
||||||
|
if (!ctx.debug.errorPaths[ctx.request.path]) {
|
||||||
|
ctx.debug.errorPaths[ctx.request.path] = 0;
|
||||||
|
}
|
||||||
|
ctx.debug.errorPaths[ctx.request.path]++;
|
||||||
|
|
||||||
|
if (!ctx.debug.errorRoutes[ctx._matchedRoute]) {
|
||||||
|
ctx.debug.errorRoutes[ctx._matchedRoute] = 0;
|
||||||
|
}
|
||||||
|
ctx.debug.errorRoutes[ctx._matchedRoute]++;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -29,6 +29,24 @@ module.exports = async (ctx) => {
|
|||||||
hotPathsValue += `${ctx.debug.paths[item]} ${item}<br>`;
|
hotPathsValue += `${ctx.debug.paths[item]} ${item}<br>`;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let hotErrorRoutesValue = '';
|
||||||
|
if (ctx.debug.errorRoutes) {
|
||||||
|
const errorRoutes = Object.keys(ctx.debug.errorRoutes).sort((a, b) => ctx.debug.errorRoutes[b] - ctx.debug.errorRoutes[a]);
|
||||||
|
const hotErrorRoutes = errorRoutes.slice(0, 30);
|
||||||
|
hotErrorRoutes.forEach((item) => {
|
||||||
|
hotErrorRoutesValue += `${ctx.debug.errorRoutes[item]} ${item}<br>`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let hotErrorPathsValue = '';
|
||||||
|
if (ctx.debug.errorPaths) {
|
||||||
|
const errorPaths = Object.keys(ctx.debug.errorPaths).sort((a, b) => ctx.debug.errorPaths[b] - ctx.debug.errorPaths[a]);
|
||||||
|
const hotErrorPaths = errorPaths.slice(0, 30);
|
||||||
|
hotErrorPaths.forEach((item) => {
|
||||||
|
hotErrorPathsValue += `${ctx.debug.errorPaths[item]} ${item}<br>`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const ips = Object.keys(ctx.debug.ips).sort((a, b) => ctx.debug.ips[b] - ctx.debug.ips[a]);
|
const ips = Object.keys(ctx.debug.ips).sort((a, b) => ctx.debug.ips[b] - ctx.debug.ips[a]);
|
||||||
const hotIPs = ips.slice(0, 50);
|
const hotIPs = ips.slice(0, 50);
|
||||||
let hotIPsValue = '';
|
let hotIPsValue = '';
|
||||||
@@ -97,6 +115,14 @@ module.exports = async (ctx) => {
|
|||||||
name: '热门IP',
|
name: '热门IP',
|
||||||
value: hotIPsValue,
|
value: hotIPsValue,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: '报错路由',
|
||||||
|
value: hotErrorRoutesValue,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '报错路径',
|
||||||
|
value: hotErrorPathsValue,
|
||||||
|
},
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -91,7 +91,7 @@
|
|||||||
<details>
|
<details>
|
||||||
<summary>debug</summary>
|
<summary>debug</summary>
|
||||||
{{ each debug }}
|
{{ each debug }}
|
||||||
{{ if $value }}
|
{{ if $value && $value.value }}
|
||||||
<div class="debug-item">
|
<div class="debug-item">
|
||||||
<span class="debug-key">{{ $value.name }}: </span>
|
<span class="debug-key">{{ $value.name }}: </span>
|
||||||
<span class="debug-value">{{@ $value.value }}</span>
|
<span class="debug-value">{{@ $value.value }}</span>
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ describe('debug', () => {
|
|||||||
await request.get('/test/1').set('X-Forwarded-For', '233.233.233.234');
|
await request.get('/test/1').set('X-Forwarded-For', '233.233.233.234');
|
||||||
await request.get('/test/2').set('X-Forwarded-For', '233.233.233.233');
|
await request.get('/test/2').set('X-Forwarded-For', '233.233.233.233');
|
||||||
await request.get('/test/2').set('X-Forwarded-For', '233.233.233.234');
|
await request.get('/test/2').set('X-Forwarded-For', '233.233.233.234');
|
||||||
|
await request.get('/test/empty').set('X-Forwarded-For', '233.233.233.233');
|
||||||
|
await request.get('/test/empty').set('X-Forwarded-For', '233.233.233.234');
|
||||||
|
|
||||||
const response = await request.get('/').set('X-Forwarded-For', '233.233.233.233');
|
const response = await request.get('/').set('X-Forwarded-For', '233.233.233.233');
|
||||||
|
|
||||||
@@ -46,13 +48,19 @@ describe('debug', () => {
|
|||||||
expect(value).toBe('6');
|
expect(value).toBe('6');
|
||||||
break;
|
break;
|
||||||
case '热门路由:':
|
case '热门路由:':
|
||||||
expect(value).toBe(`5 /test/:id<br>`);
|
expect(value).toBe(`7 /test/:id<br>`);
|
||||||
break;
|
break;
|
||||||
case '热门路径:':
|
case '热门路径:':
|
||||||
expect(value).toBe(`3 /test/1<br>2 /test/2<br>1 /<br>`);
|
expect(value).toBe(`3 /test/1<br>2 /test/2<br>2 /test/empty<br>1 /<br>`);
|
||||||
break;
|
break;
|
||||||
case '热门IP:':
|
case '热门IP:':
|
||||||
expect(value).toBe(`4 233.233.233.233<br>2 233.233.233.234<br>`);
|
expect(value).toBe(`5 233.233.233.233<br>3 233.233.233.234<br>`);
|
||||||
|
break;
|
||||||
|
case '报错路由:':
|
||||||
|
expect(value).toBe(`2 /test/:id<br>`);
|
||||||
|
break;
|
||||||
|
case '报错路径:':
|
||||||
|
expect(value).toBe(`2 /test/empty<br>`);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user