feat: add error routes and error paths info

This commit is contained in:
DIYgod
2019-08-23 00:15:13 +08:00
parent 6dc109b55c
commit f7e8682ba8
5 changed files with 50 additions and 4 deletions

View File

@@ -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);

View File

@@ -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]++;
} }
}; };

View File

@@ -29,6 +29,24 @@ module.exports = async (ctx) => {
hotPathsValue += `${ctx.debug.paths[item]}&nbsp;&nbsp;${item}<br>`; hotPathsValue += `${ctx.debug.paths[item]}&nbsp;&nbsp;${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]}&nbsp;&nbsp;${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]}&nbsp;&nbsp;${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,
},
], ],
}); });
}; };

View File

@@ -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>

View File

@@ -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&nbsp;&nbsp;/test/:id<br>`); expect(value).toBe(`7&nbsp;&nbsp;/test/:id<br>`);
break; break;
case '热门路径:': case '热门路径:':
expect(value).toBe(`3&nbsp;&nbsp;/test/1<br>2&nbsp;&nbsp;/test/2<br>1&nbsp;&nbsp;/<br>`); expect(value).toBe(`3&nbsp;&nbsp;/test/1<br>2&nbsp;&nbsp;/test/2<br>2&nbsp;&nbsp;/test/empty<br>1&nbsp;&nbsp;/<br>`);
break; break;
case '热门IP:': case '热门IP:':
expect(value).toBe(`4&nbsp;&nbsp;233.233.233.233<br>2&nbsp;&nbsp;233.233.233.234<br>`); expect(value).toBe(`5&nbsp;&nbsp;233.233.233.233<br>3&nbsp;&nbsp;233.233.233.234<br>`);
break;
case '报错路由:':
expect(value).toBe(`2&nbsp;&nbsp;/test/:id<br>`);
break;
case '报错路径:':
expect(value).toBe(`2&nbsp;&nbsp;/test/empty<br>`);
break; break;
} }
}); });