From ec64b5ea0bddfbd628c4a86c321a6c1141b61e42 Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 7 Mar 2022 15:10:16 +0900 Subject: [PATCH] feat: add active to federation chart --- CHANGELOG.md | 1 + .../1646633030285-chart-federation-active.js | 13 +++++++++++++ .../services/chart/charts/entities/federation.ts | 1 + .../backend/src/services/chart/charts/federation.ts | 9 ++++++++- packages/client/src/components/chart.vue | 8 +++++++- 5 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 packages/backend/migration/1646633030285-chart-federation-active.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 03bad049b..fb3314834 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ You should also include the user name that made the change. - アンケートが終了したときに通知が作成されるように @syuilo - プロフィールの追加情報を最大16まで保存できるように @syuilo - 連合チャートにPub&Subを追加 @syuilo +- 連合チャートにActiveを追加 @syuilo - デフォルトで10秒以上時間がかかるデータベースへのクエリは中断されるように @syuilo - 設定ファイルの`db.extra`に`statement_timeout`を設定することでタイムアウト時間を変更できます diff --git a/packages/backend/migration/1646633030285-chart-federation-active.js b/packages/backend/migration/1646633030285-chart-federation-active.js new file mode 100644 index 000000000..952289c8f --- /dev/null +++ b/packages/backend/migration/1646633030285-chart-federation-active.js @@ -0,0 +1,13 @@ +export class chartFederationActive1646633030285 { + name = 'chartFederationActive1646633030285' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "___active" smallint NOT NULL DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "___active" smallint NOT NULL DEFAULT '0'`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "___active"`); + await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "___active"`); + } +} diff --git a/packages/backend/src/services/chart/charts/entities/federation.ts b/packages/backend/src/services/chart/charts/entities/federation.ts index 9d2b860b1..c6d59b67f 100644 --- a/packages/backend/src/services/chart/charts/entities/federation.ts +++ b/packages/backend/src/services/chart/charts/entities/federation.ts @@ -9,6 +9,7 @@ export const schema = { 'sub': { accumulate: true, range: 'small' }, 'pub': { accumulate: true, range: 'small' }, 'pubsub': { accumulate: true, range: 'small' }, + 'active': { accumulate: true, range: 'small' }, } as const; export const entity = Chart.schemaToEntity(name, schema); diff --git a/packages/backend/src/services/chart/charts/federation.ts b/packages/backend/src/services/chart/charts/federation.ts index 89670194d..2a28500ac 100644 --- a/packages/backend/src/services/chart/charts/federation.ts +++ b/packages/backend/src/services/chart/charts/federation.ts @@ -2,6 +2,7 @@ import Chart, { KVs } from '../core.js'; import { Followings, Instances } from '@/models/index.js'; import { name, schema } from './entities/federation.js'; import { fetchMeta } from '@/misc/fetch-meta.js'; +import { In, MoreThan, Not } from 'typeorm'; /** * フェデレーションに関するチャート @@ -28,7 +29,7 @@ export default class FederationChart extends Chart { .select('f.followerHost') .where('f.followerHost IS NOT NULL'); - const [sub, pub, pubsub] = await Promise.all([ + const [sub, pub, pubsub, active] = await Promise.all([ Followings.createQueryBuilder('following') .select('COUNT(DISTINCT following.followeeHost)') .where('following.followeeHost IS NOT NULL') @@ -52,12 +53,18 @@ export default class FederationChart extends Chart { .setParameters(pubsubSubQuery.getParameters()) .getRawOne() .then(x => parseInt(x.count, 10)), + Instances.count({ + host: Not(In(meta.blockedHosts)), + isSuspended: false, + lastCommunicatedAt: MoreThan(new Date(Date.now() - (1000 * 60 * 60 * 24 * 30))), + }), ]); return { 'sub': sub, 'pub': pub, 'pubsub': pubsub, + 'active': active, }; } diff --git a/packages/client/src/components/chart.vue b/packages/client/src/components/chart.vue index dc1ea2b2d..7a716036b 100644 --- a/packages/client/src/components/chart.vue +++ b/packages/client/src/components/chart.vue @@ -71,6 +71,7 @@ const colors = { purple: '#e300db', orange: '#fe6919', lime: '#c7f400', + cyan: '#00efef', }; const colorSets = [colors.blue, colors.green, colors.yellow, colors.red, colors.purple]; const getColor = (i) => { @@ -388,11 +389,16 @@ export default defineComponent({ type: 'area', data: format(raw.stalled), color: colors.red, + }, { + name: 'Active', + type: 'line', + data: format(raw.active), + color: colors.lime, }, { name: 'Pub & Sub', type: 'line', data: format(raw.pubsub), - color: colors.lime, + color: colors.cyan, }, { name: 'Pub', type: 'line',