From 336912e4422394499cb47ea1b8d42cf2020ec93f Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 7 Feb 2019 15:00:44 +0900 Subject: Improve instance stats --- src/models/instance.ts | 20 ++++++++++++++++++ src/queue/processors/http/deliver.ts | 26 +++++++++++++++++++++++- src/remote/activitypub/models/person.ts | 4 ++-- src/services/following/create.ts | 28 ++++++++++++++++++++++++++ src/services/note/create.ts | 4 ++-- src/services/register-instance.ts | 22 -------------------- src/services/register-or-fetch-instance-doc.ts | 22 ++++++++++++++++++++ 7 files changed, 99 insertions(+), 27 deletions(-) delete mode 100644 src/services/register-instance.ts create mode 100644 src/services/register-or-fetch-instance-doc.ts (limited to 'src') 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 => { 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 { + 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-instance.ts deleted file mode 100644 index 6576a9ed06..0000000000 --- a/src/services/register-instance.ts +++ /dev/null @@ -1,22 +0,0 @@ -import Instance, { IInstance } from '../models/instance'; -import federationChart from '../chart/federation'; - -export default async function(host: string): Promise { - if (host == null) return null; - - const index = await Instance.findOne({ host }); - - if (index == null) { - const i = await Instance.insert({ - host, - caughtAt: new Date(), - system: null // TODO - }); - - federationChart.update(true); - - return i; - } else { - return index; - } -} diff --git a/src/services/register-or-fetch-instance-doc.ts b/src/services/register-or-fetch-instance-doc.ts new file mode 100644 index 0000000000..3b338b48af --- /dev/null +++ b/src/services/register-or-fetch-instance-doc.ts @@ -0,0 +1,22 @@ +import Instance, { IInstance } from '../models/instance'; +import federationChart from '../chart/federation'; + +export async function registerOrFetchInstanceDoc(host: string): Promise { + if (host == null) return null; + + const index = await Instance.findOne({ host }); + + if (index == null) { + const i = await Instance.insert({ + host, + caughtAt: new Date(), + system: null // TODO + }); + + federationChart.update(true); + + return i; + } else { + return index; + } +} -- cgit v1.2.3-freya