summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2019-02-07 15:00:44 +0900
committersyuilo <syuilotan@yahoo.co.jp>2019-02-07 15:00:44 +0900
commit336912e4422394499cb47ea1b8d42cf2020ec93f (patch)
tree0bd8c6ef58834a2640ae83b56cb7b70cd756790b /src
parent10.82.3 (diff)
downloadsharkey-336912e4422394499cb47ea1b8d42cf2020ec93f.tar.gz
sharkey-336912e4422394499cb47ea1b8d42cf2020ec93f.tar.bz2
sharkey-336912e4422394499cb47ea1b8d42cf2020ec93f.zip
Improve instance stats
Diffstat (limited to 'src')
-rw-r--r--src/models/instance.ts20
-rw-r--r--src/queue/processors/http/deliver.ts26
-rw-r--r--src/remote/activitypub/models/person.ts4
-rw-r--r--src/services/following/create.ts28
-rw-r--r--src/services/note/create.ts4
-rw-r--r--src/services/register-or-fetch-instance-doc.ts (renamed from src/services/register-instance.ts)2
6 files changed, 78 insertions, 6 deletions
diff --git a/src/models/instance.ts b/src/models/instance.ts
index d3906df427..7a94a0a041 100644
--- a/src/models/instance.ts
+++ b/src/models/instance.ts
@@ -32,4 +32,24 @@ export interface IInstance {
* このインスタンスから受け取った投稿数
*/
notesCount: number;
+
+ /**
+ * このインスタンスのユーザーからフォローされている、自インスタンスのユーザーの数
+ */
+ followingCount: number;
+
+ /**
+ * このインスタンスのユーザーをフォローしている、自インスタンスのユーザーの数
+ */
+ followersCount: number;
+
+ /**
+ * 最近の通信日時
+ */
+ latestRequestSentAt?: Date;
+
+ /**
+ * 最近の通信のHTTPステータス
+ */
+ latestStatus?: number;
}
diff --git a/src/queue/processors/http/deliver.ts b/src/queue/processors/http/deliver.ts
index d1dad55cd7..cb92a4d760 100644
--- a/src/queue/processors/http/deliver.ts
+++ b/src/queue/processors/http/deliver.ts
@@ -2,19 +2,43 @@ import * as bq from 'bee-queue';
import request from '../../../remote/activitypub/request';
import { queueLogger } from '../../logger';
+import { registerOrFetchInstanceDoc } from '../../../services/register-or-fetch-instance-doc';
+import Instance from '../../../models/instance';
export default async (job: bq.Job, done: any): Promise<void> => {
try {
await request(job.data.user, job.data.to, job.data.content);
+
+ // Update stats
+ registerOrFetchInstanceDoc(job.data.user.host).then(i => {
+ Instance.update({ _id: i._id }, {
+ $set: {
+ latestRequestSentAt: new Date(),
+ latestStatus: 200
+ }
+ });
+ });
+
done();
} catch (res) {
+ // Update stats
+ registerOrFetchInstanceDoc(job.data.user.host).then(i => {
+ Instance.update({ _id: i._id }, {
+ $set: {
+ latestRequestSentAt: new Date(),
+ latestStatus: res != null && res.hasOwnProperty('statusCode') ? res.statusCode : null
+ }
+ });
+ });
+
if (res != null && res.hasOwnProperty('statusCode')) {
+ queueLogger.warn(`deliver failed: ${res.statusCode} ${res.statusMessage} to=${job.data.to}`);
+
if (res.statusCode >= 400 && res.statusCode < 500) {
// HTTPステータスコード4xxはクライアントエラーであり、それはつまり
// 何回再送しても成功することはないということなのでエラーにはしないでおく
done();
} else {
- queueLogger.warn(`deliver failed: ${res.statusCode} ${res.statusMessage} to=${job.data.to}`);
done(res.statusMessage);
}
} else {
diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts
index a4173c5e82..2902b4b7f9 100644
--- a/src/remote/activitypub/models/person.ts
+++ b/src/remote/activitypub/models/person.ts
@@ -12,7 +12,7 @@ import { fromHtml } from '../../../mfm/fromHtml';
import usersChart from '../../../chart/users';
import { URL } from 'url';
import { resolveNote, extractEmojis } from './note';
-import registerInstance from '../../../services/register-instance';
+import { registerOrFetchInstanceDoc } from '../../../services/register-or-fetch-instance-doc';
import Instance from '../../../models/instance';
import getDriveFileUrl from '../../../misc/get-drive-file-url';
import { IEmoji } from '../../../models/emoji';
@@ -188,7 +188,7 @@ export async function createPerson(uri: string, resolver?: Resolver): Promise<IU
}
// Register host
- registerInstance(host).then(i => {
+ registerOrFetchInstanceDoc(host).then(i => {
Instance.update({ _id: i._id }, {
$inc: {
usersCount: 1
diff --git a/src/services/following/create.ts b/src/services/following/create.ts
index 936655d7d1..4df271a977 100644
--- a/src/services/following/create.ts
+++ b/src/services/following/create.ts
@@ -10,6 +10,8 @@ import renderReject from '../../remote/activitypub/renderer/reject';
import { deliver } from '../../queue';
import createFollowRequest from './requests/create';
import perUserFollowingChart from '../../chart/per-user-following';
+import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc';
+import Instance from '../../models/instance';
export default async function(follower: IUser, followee: IUser, requestId?: string) {
// check blocking
@@ -97,6 +99,32 @@ export default async function(follower: IUser, followee: IUser, requestId?: stri
});
//#endregion
+ //#region Update instance stats
+ if (isRemoteUser(follower) && isLocalUser(followee)) {
+ registerOrFetchInstanceDoc(follower.host).then(i => {
+ Instance.update({ _id: i._id }, {
+ $inc: {
+ followingCount: 1
+ }
+ });
+
+ // TODO
+ //perInstanceChart.newFollowing();
+ });
+ } else if (isLocalUser(follower) && isRemoteUser(followee)) {
+ registerOrFetchInstanceDoc(followee.host).then(i => {
+ Instance.update({ _id: i._id }, {
+ $inc: {
+ followersCount: 1
+ }
+ });
+
+ // TODO
+ //perInstanceChart.newFollower();
+ });
+ }
+ //#endregion
+
perUserFollowingChart.update(follower, followee, true);
// Publish follow event
diff --git a/src/services/note/create.ts b/src/services/note/create.ts
index 6afdcbbfbd..7b5975bace 100644
--- a/src/services/note/create.ts
+++ b/src/services/note/create.ts
@@ -27,7 +27,7 @@ import activeUsersChart from '../../chart/active-users';
import { erase, concat } from '../../prelude/array';
import insertNoteUnread from './unread';
-import registerInstance from '../register-instance';
+import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc';
import Instance from '../../models/instance';
import extractMentions from '../../misc/extract-mentions';
import extractEmojis from '../../misc/extract-emojis';
@@ -222,7 +222,7 @@ export default async (user: IUser, data: Option, silent = false) => new Promise<
// Register host
if (isRemoteUser(user)) {
- registerInstance(user.host).then(i => {
+ registerOrFetchInstanceDoc(user.host).then(i => {
Instance.update({ _id: i._id }, {
$inc: {
notesCount: 1
diff --git a/src/services/register-instance.ts b/src/services/register-or-fetch-instance-doc.ts
index 6576a9ed06..3b338b48af 100644
--- a/src/services/register-instance.ts
+++ b/src/services/register-or-fetch-instance-doc.ts
@@ -1,7 +1,7 @@
import Instance, { IInstance } from '../models/instance';
import federationChart from '../chart/federation';
-export default async function(host: string): Promise<IInstance> {
+export async function registerOrFetchInstanceDoc(host: string): Promise<IInstance> {
if (host == null) return null;
const index = await Instance.findOne({ host });