From f4e28983a1355caf842825ec71037b956b7b98ac Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Tue, 8 Feb 2022 23:43:51 +0900
Subject: [PATCH] feat: improve federation chart

---
 .../migration/1644331238153-chart-v13.js      | 19 +++++++++++++++++++
 .../backend/src/queue/processors/deliver.ts   |  3 ++-
 .../chart/charts/entities/federation.ts       |  1 +
 .../src/services/chart/charts/federation.ts   |  6 ++++--
 packages/client/src/components/chart.vue      | 17 +++++++++++++----
 5 files changed, 39 insertions(+), 7 deletions(-)
 create mode 100644 packages/backend/migration/1644331238153-chart-v13.js

diff --git a/packages/backend/migration/1644331238153-chart-v13.js b/packages/backend/migration/1644331238153-chart-v13.js
new file mode 100644
index 0000000000..ed36659b34
--- /dev/null
+++ b/packages/backend/migration/1644331238153-chart-v13.js
@@ -0,0 +1,19 @@
+const { MigrationInterface, QueryRunner } = require("typeorm");
+
+module.exports = class chartV131644331238153 {
+    name = 'chartV131644331238153'
+
+    async up(queryRunner) {
+        await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "unique_temp___stalled" character varying array NOT NULL DEFAULT '{}'`);
+        await queryRunner.query(`ALTER TABLE "__chart__federation" ADD "___stalled" smallint NOT NULL DEFAULT '0'`);
+        await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "unique_temp___stalled" character varying array NOT NULL DEFAULT '{}'`);
+        await queryRunner.query(`ALTER TABLE "__chart_day__federation" ADD "___stalled" smallint NOT NULL DEFAULT '0'`);
+    }
+
+    async down(queryRunner) {
+        await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "___stalled"`);
+        await queryRunner.query(`ALTER TABLE "__chart_day__federation" DROP COLUMN "unique_temp___stalled"`);
+        await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "___stalled"`);
+        await queryRunner.query(`ALTER TABLE "__chart__federation" DROP COLUMN "unique_temp___stalled"`);
+    }
+}
diff --git a/packages/backend/src/queue/processors/deliver.ts b/packages/backend/src/queue/processors/deliver.ts
index e29f991307..bd91dfc3b5 100644
--- a/packages/backend/src/queue/processors/deliver.ts
+++ b/packages/backend/src/queue/processors/deliver.ts
@@ -62,7 +62,7 @@ export default async (job: Bull.Job<DeliverJobData>) => {
 
 			instanceChart.requestSent(i.host, true);
 			apRequestChart.deliverSucc();
-			federationChart.deliverd(i.host);
+			federationChart.deliverd(i.host, true);
 		});
 
 		return 'Success';
@@ -77,6 +77,7 @@ export default async (job: Bull.Job<DeliverJobData>) => {
 
 			instanceChart.requestSent(i.host, false);
 			apRequestChart.deliverFail();
+			federationChart.deliverd(i.host, false);
 		});
 
 		if (res instanceof StatusError) {
diff --git a/packages/backend/src/services/chart/charts/entities/federation.ts b/packages/backend/src/services/chart/charts/entities/federation.ts
index 5a76c4918c..0c8c20991d 100644
--- a/packages/backend/src/services/chart/charts/entities/federation.ts
+++ b/packages/backend/src/services/chart/charts/entities/federation.ts
@@ -8,6 +8,7 @@ export const schema = {
 	'instance.dec': { range: 'small' },
 	'deliveredInstances': { uniqueIncrement: true, range: 'small' },
 	'inboxInstances': { uniqueIncrement: true, range: 'small' },
+	'stalled': { uniqueIncrement: 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 3aa448e66f..19c75c98ad 100644
--- a/packages/backend/src/services/chart/charts/federation.ts
+++ b/packages/backend/src/services/chart/charts/federation.ts
@@ -33,9 +33,11 @@ export default class FederationChart extends Chart<typeof schema> {
 	}
 
 	@autobind
-	public async deliverd(host: string): Promise<void> {
-		await this.commit({
+	public async deliverd(host: string, succeeded: boolean): Promise<void> {
+		await this.commit(succeeded ? {
 			'deliveredInstances': [host],
+		} : {
+			'stalled': [host],
 		});
 	}
 
diff --git a/packages/client/src/components/chart.vue b/packages/client/src/components/chart.vue
index da7d378bd9..f297db7e13 100644
--- a/packages/client/src/components/chart.vue
+++ b/packages/client/src/components/chart.vue
@@ -372,18 +372,27 @@ export default defineComponent({
 					name: 'Instances total',
 					type: 'area',
 					data: format(raw.instance.total),
+					color: '#888888',
 				}, {
 					name: 'Instances inc/dec',
 					type: 'area',
 					data: format(sum(raw.instance.inc, negate(raw.instance.dec))),
-				}, {
-					name: 'Delivered instances',
-					type: 'area',
-					data: format(raw.deliveredInstances),
+					color: colors.purple,
 				}, {
 					name: 'Inbox instances',
 					type: 'area',
 					data: format(raw.inboxInstances),
+					color: colors.blue,
+				}, {
+					name: 'Delivered instances',
+					type: 'area',
+					data: format(raw.deliveredInstances),
+					color: colors.green,
+				}, {
+					name: 'Stalled instances',
+					type: 'area',
+					data: format(raw.stalled),
+					color: colors.red,
 				}],
 			};
 		};