diff --git a/lib/index.js b/lib/index.js index 4746d6cdcb..90a3088f45 100644 --- a/lib/index.js +++ b/lib/index.js @@ -61,6 +61,8 @@ if (cluster.isMaster && config.enableCluster && process.env.NODE_ENV !== 'test' paths: [], routes: [], ips: [], + errorPaths: [], + errorRoutes: [], }; app.use(debug); diff --git a/lib/middleware/onerror.js b/lib/middleware/onerror.js index fade21bad1..5b6a3c189c 100644 --- a/lib/middleware/onerror.js +++ b/lib/middleware/onerror.js @@ -10,5 +10,15 @@ module.exports = async (ctx, next) => { }); ctx.body = `RSSHub 发生了一些意外:
${err instanceof Error ? err.stack : err}
`; 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]++; } }; diff --git a/lib/routes/index.js b/lib/routes/index.js index ac75aa6905..8fe908062f 100644 --- a/lib/routes/index.js +++ b/lib/routes/index.js @@ -29,6 +29,24 @@ module.exports = async (ctx) => { hotPathsValue += `${ctx.debug.paths[item]}  ${item}
`; }); + 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}
`; + }); + } + + 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}
`; + }); + } + const ips = Object.keys(ctx.debug.ips).sort((a, b) => ctx.debug.ips[b] - ctx.debug.ips[a]); const hotIPs = ips.slice(0, 50); let hotIPsValue = ''; @@ -97,6 +115,14 @@ module.exports = async (ctx) => { name: '热门IP', value: hotIPsValue, }, + { + name: '报错路由', + value: hotErrorRoutesValue, + }, + { + name: '报错路径', + value: hotErrorPathsValue, + }, ], }); }; diff --git a/lib/views/welcome.art b/lib/views/welcome.art index c7835df201..13a9563ae5 100644 --- a/lib/views/welcome.art +++ b/lib/views/welcome.art @@ -91,7 +91,7 @@
debug {{ each debug }} - {{ if $value }} + {{ if $value && $value.value }}
{{ $value.name }}: {{@ $value.value }} diff --git a/test/middleware/debug.js b/test/middleware/debug.js index dbdec5733a..9baa4ae5be 100644 --- a/test/middleware/debug.js +++ b/test/middleware/debug.js @@ -22,6 +22,8 @@ describe('debug', () => { 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.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'); @@ -46,13 +48,19 @@ describe('debug', () => { expect(value).toBe('6'); break; case '热门路由:': - expect(value).toBe(`5  /test/:id
`); + expect(value).toBe(`7  /test/:id
`); break; case '热门路径:': - expect(value).toBe(`3  /test/1
2  /test/2
1  /
`); + expect(value).toBe(`3  /test/1
2  /test/2
2  /test/empty
1  /
`); break; case '热门IP:': - expect(value).toBe(`4  233.233.233.233
2  233.233.233.234
`); + expect(value).toBe(`5  233.233.233.233
3  233.233.233.234
`); + break; + case '报错路由:': + expect(value).toBe(`2  /test/:id
`); + break; + case '报错路径:': + expect(value).toBe(`2  /test/empty
`); break; } });