Improve instance stats
This commit is contained in:
		
							parent
							
								
									0bf602bae6
								
							
						
					
					
						commit
						336912e442
					
				
					 6 changed files with 78 additions and 6 deletions
				
			
		|  | @ -32,4 +32,24 @@ export interface IInstance { | |||
| 	 * このインスタンスから受け取った投稿数 | ||||
| 	 */ | ||||
| 	notesCount: number; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * このインスタンスのユーザーからフォローされている、自インスタンスのユーザーの数 | ||||
| 	 */ | ||||
| 	followingCount: number; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * このインスタンスのユーザーをフォローしている、自インスタンスのユーザーの数 | ||||
| 	 */ | ||||
| 	followersCount: number; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * 最近の通信日時 | ||||
| 	 */ | ||||
| 	latestRequestSentAt?: Date; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * 最近の通信のHTTPステータス | ||||
| 	 */ | ||||
| 	latestStatus?: number; | ||||
| } | ||||
|  |  | |||
|  | @ -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 { | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 }); | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue