扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:开发者在线 来源:开发者在线 2007年9月3日
关键字:
限制条件
如上所述,每个警报都会有一系列的限制条件,这些限制条件用来判断是否发送警报信息。
例如,例子中的第一个警报包含了一下的限制条件:
<Constraint Check="LastValue" GreaterThan="0"/>
<Constraint Check="UnchangedSeconds" GreaterThan="2"/>
您可以从中读出限制条件的含义:
如果性能计数器的读数超过零,并且持续两秒钟没有改变,那么就发送警报。
如果任何一个限制条件的返回值是“否”,那么就不会发送警报信息。
限制条件可以被分解为两部分,“ContraintCheck”值和“ConstraintType”值:
1、 ContraintCheck设定了限制条件的检测对象,以下是一些合法的ContraintCheck值:
l LastValue – 性能计数器的最后读数;
l UnchangedSeconds – 性能计数器读数没有发生的改变的持续时间;
l IncreasedSeconds – 性能计数器读数持续增加的时间(以秒为时间单位);
l DecreasedSeconds -性能计数器读数持续减少的时间(以秒为时间单位)。
2、ConstraintType设定了如何比较ContraintCheck值和您设定的目标值,以下是合法的限制条件,它们的含义很好理解:
l GreaterThan(大于)
l LessThan(小于)
l NotEqualTo(不等于)
l EqualTo(等于)
下面让我们来看一些例子,首先假定我需要在性能计数器读数达到1000或超过1000的时候获得通知,我创建以下的限制条件:
<Constraint Check="LastValue" GreaterThan="1000"/>
下面我们把这个限制条件修改得复杂些:如果性能计数器的读书超过1000并且维持一分钟没有改变,那么就发出警报。
<Constraint Check="LastValue" GreaterThan="1000"/>
<Constraint Check="UnchangedSeconds" GreaterThan="60"/>
尽管复杂了一点,但是这些限制条件还是可以理解的。您可以通过这种方法来添加限制条件,直到设定好您全部的需求。
测试限制条件
在Logic.xml文件的MonitorEntry节点,“PollTime”属性设定了读取性能监视器读数的时间间隔,每次MonitorEntry运行的时候会存储性能计数器的当前值,然后使用该值与前一次的读数进行比较,来确认计数器的读数是否发生了改变,列表B中的代码实现了这一功能:
列表B
private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
if(Counter.RawValue != this.LastValue)
lastChanged = DateTime.Now;
if(Counter.RawValue > this.LastValue)
this.lastIncrease = DateTime.Now;
if(Counter.RawValue < this.LastValue)
this.lastDecrease = DateTime.Now;
IncreasedSpan = new TimeSpan(DateTime.Now.Ticks - lastDecrease.Ticks);
DecreasedSpan = new TimeSpan(DateTime.Now.Ticks - lastIncrease.Ticks);
UnchangedSpan = new TimeSpan(DateTime.Now.Ticks - lastChanged.Ticks);
this.LastValue = Counter.RawValue;
SignalAlerts();
if(this.OnPolled != null)
this.OnPolled(this);
}
在供您下载的项目文件包里,这个文件的名称是MonitorEntry.cs。在调用SignalAlerts之前,以上的代码只是简单地记录计数器的数据并确认是否发生的改变。SignalAlerts的功能是测试限制条件来决定是否发送警报信息,这一功能是通过Alert类的CheckConstraints方法实现的,代码如列表C所示:
列表C:
bool allMet = false;
long checkValue = 0;
for(int i = 0; i < Constraints.Count; i++)
{
Constraint constraint = (Constraint)Constraints[i];
if(constraint.ConstraintCheck == ConstraintCheck.LastValue)
checkValue = entry.LastValue;
else if(constraint.ConstraintCheck == ConstraintCheck.UnchangedSeconds)
checkValue =
Convert.ToInt64(Math.Round(entry.UnchangedSpan.TotalSeconds, 0));
else if(constraint.ConstraintCheck == ConstraintCheck.IncreasedSeconds)
checkValue = Convert.ToInt64(Math.Round(entry.IncreasedSpan.TotalSeconds, 0));
else if(constraint.ConstraintCheck == ConstraintCheck.DecreasedSeconds)
checkValue = Convert.ToInt64(Math.Round(entry.DecreasedSpan.TotalSeconds, 0));
if(constraint.Check(checkValue))
allMet = true;
else
{
allMet = false;
break;
}
}
if(allMet && this.OnConstraintsMet != null)
this.OnConstraintsMet(this);
这个方法只是简单地检查每个限制条件,如果所有的限制条件都满足了,那么就会触发OnConstraintsMet事件,此时,一封电子邮件就会发送给预先设定好的收件人。
下载项目文件包
这个监控器工具最复杂的部分已经在这篇文章中进行了讲解,项目文件包里包含了运行这个工具所需的全部代码,我建议您下载这个项目文件包,并针对您的需求进行修改。另外,性能计数器具备远程读取的功能,因此您不必在将这个工具安装在产品服务器上,只要在客户端使用这个工具就可以实现监控功能了。
责任编辑:德东
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。