/// <summary> /// 创建运行sql信息 /// </summary> /// <param name="runtimeSqlModel"></param> /// <returns></returns> private async Task <RuntimeSqlInfo> CreateAsync(RuntimeSqlModel runtimeSqlModel) { var runtimeSqlInfo = new RuntimeSqlInfo { FCreateTime = DateTimeUtil.Now, FExecutedTime = runtimeSqlModel.FExecutedTime, FIsDeleted = false, FIsSuccess = runtimeSqlModel.FIsSuccess, FProjectName = runtimeSqlModel.FProjectName, FRequestGuid = runtimeSqlModel.FRequestGuid, FServicerMac = runtimeSqlModel.FServerMac, FSqlDbType = runtimeSqlModel.FSqlDbType, FSqlText = runtimeSqlModel.FSqlText, FTimeElapsed = runtimeSqlModel.FTimeElapsed, FMemberName = runtimeSqlModel.FMemberName, FSource = runtimeSqlModel.FSource, FDatabaseName = runtimeSqlModel.FDatabaseName }; if (runtimeSqlInfo.FProjectName.IsNotNullAndNotEmptyWhiteSpace()) { runtimeSqlInfo.FProjectID = await _projectDomainService.GetProjectIDAsync(runtimeSqlInfo.FProjectName); } if (runtimeSqlInfo.FServicerMac.IsNotNullAndNotEmptyWhiteSpace()) { runtimeSqlInfo.FServicerID = await _servicerDomainService.GetServerIDAsync(runtimeSqlInfo.FServicerMac); } if (runtimeSqlModel.FDatabaseName.IsNotNullAndNotEmptyWhiteSpace()) { runtimeSqlInfo.FDatabeseID = await _databaseDomainService.GetDatabaseIDAsync(runtimeSqlModel.FDatabaseName, runtimeSqlModel.FSqlDbType); } return(runtimeSqlInfo); }
/// <summary> /// 判断是否需要预警 /// </summary> /// <param name="runtimeSqlInfo"></param> /// <returns></returns> private async Task <bool> IsNeedWarningAsync(RuntimeSqlInfo runtimeSqlInfo) { if (runtimeSqlInfo != null) { if (!runtimeSqlInfo.FIsSuccess) { return(true); } var minWarningTimeElapsed = (await _sysConfigCache.GetValueAsync(SysConfigKey.SqlWarningMinTimeElapsed)).ToSafeDouble(2000); return(runtimeSqlInfo.FTimeElapsed >= minWarningTimeElapsed); } return(false); }
/// <summary> /// 创建sql的警告信息 /// </summary> /// <param name="runtimeSqlInfo"></param> /// <returns></returns> public WarningSqlInfo Create(RuntimeSqlInfo runtimeSqlInfo) { return(new WarningSqlInfo { FCreateTime = DateTimeUtil.Now, FCreateUserID = -1, FDealState = Constant.DealState.WaitDeal, FIsDeleted = false, FNoticeState = Constant.NoticeState.WaitNotice, FRuntimeSqlID = runtimeSqlInfo.FID, FSqlSign = runtimeSqlInfo.GetSafeHashID() }); }
/// <summary> /// 分析运行的sql信息 /// </summary> /// <param name="runtimeSqlInfo"></param> /// <returns></returns> public async Task AnalysisRuntimeSqlAsync(RuntimeSqlInfo runtimeSqlInfo) { await Task.Delay(1); if (await IsNeedWarningAsync(runtimeSqlInfo)) { var warningSqlInfo = _warningSqlDomainService.Create(runtimeSqlInfo); //判断一小时之内有没有超出五条同样sql标识的记录,假如超出则不发送邮件, int waitDealCount = await _warningSqlRepository.QueryCountAsync(m => m.FSqlSign == warningSqlInfo.FSqlSign && m.FCreateTime >= DateTimeUtil.Now.AddHours(-1) && m.FNoticeState == NoticeState.WaitNotice && m.FIsDeleted == false); if (waitDealCount <= 5) { //发送邮件 await _emailSendedRecordDomainService.SendEmailAsync($"你有来自项目【{runtimeSqlInfo.FProjectName}】新的警告邮件", runtimeSqlInfo.FSqlText, runtimeSqlInfo.FProjectID); warningSqlInfo.FNoticeState = NoticeState.Noticed; } await _warningSqlRepository.InsertOneAsync(warningSqlInfo, keyName : "FID", ignoreFields : FID); } }