科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件使用.NET设计性能监视器

使用.NET设计性能监视器

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

您可能需要在软件开发中使用性能计数器(performance counter)提供的信息,比如内存使用量和ASP.NET页面的重新编译信息。

作者:开发者在线 来源:开发者在线 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 -性能计数器读数持续减少的时间(以秒为时间单位)。 

2ConstraintType设定了如何比较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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章