使用statsd+graphite+grafana构建业务及性能监控模块

    近些年随着DevOps概念越来越收到重视,除了传统的Splunk,Zabbix外在开源领域也有越来越多的软件可供使用.从数据收集,时序数据库,图形展示等主要方面有各类可扩展的软件用于搭建一个数据监控平台(详细列表),Logstash+elasticsearch+kibana算是被写的比较多的,本文将偏重于业务数据及性能的监控而不是传统的机器参数的监控,所以本文以statsd+graphite+grafana在centos6上的安装配置为例。

   三个组件的说明(https://blog.pkhamre.com/understanding-statsd-and-graphite/):

   Statsd:一个nodejs的客户端,用于向graphite的收集器发送数据,使用各类编程语言的客户端响起发送timer,counter等统计数据后,其通过udp定时向graphite发送数据。c#客户端

   Graphite:分为监听器carbon+时序数据库whisper+图形展示django-webapp。由于安装是要配置数据库等建议对django有一定了解

   Grafana:一个图形展示器,相对graphite自带的展示功能更加强大灵活。配置grafana时添加新的dashbord时要注意绿色的小条是可以点击的,点击后出现配置项设置显示等。

   前两者在centos上的安装请参考(安装),该文章还附带说明了安装collectd收集系统性能数据的过程,对于graphana的安装请参考官方文档。需要说明的是本人按文章配置后使用django-admin 启动程序能正常访问,但是通过apache前端登陆后在graphite的管理界面无法看到Metrics的展示最终使用了docker的方式。docker版本说明请参考github说明

   客户端主要发送counter和timer两类数据进行监控和分析,counter主要用于实时展示重点业务的量是否运行正常。timer主要用于展示应用程序的调用性能等方面是否正常。

  counter的集成主要是开发人员写代码发送计数信息(异常信息计数以及正常计数):

 Metrics.Configure(new MetricsConfig
{
    StatsdServerName = "X.X.X.X",
    Prefix = "MallOrderCmd"
});

 
Metrics.Counter("SyncOrderInfo.Error");

timer的跟踪可以考虑使用PostSharp或者Fody插件进行实现

 

[Serializable]
public sealed class GraphiteTimingAttribute : OnMethodBoundaryAspect
{
    [NonSerialized]
    private Stopwatch _stopwatch;

    public override void OnEntry(MethodExecutionArgs args)
    {
        _stopwatch = Stopwatch.StartNew();
        base.OnEntry(args);
    }

    public override void OnExit(MethodExecutionArgs args)
    {
            StatsdClient.Metrics.Timer(
                string.Format("{0}.{1}.{2}.{3}", 
                "ApplicationName", 
                System.Environment.MachineName, 
                args.Method.DeclaringType.Name, 
                args.Method.Name), 
                (int)_stopwatch.Elapsed.TotalMilliseconds
            );
        base.OnExit(args);
    }

    public override void OnException(MethodExecutionArgs args)
    {
        StatsdClient.Metrics.Counter(
            string.Format("{0}.{1}.error",
            args.Method.DeclaringType.Name,
            args.Method.Name),
            (int)_stopwatch.Elapsed.TotalMilliseconds);
        base.OnException(args);
    }
}

 

 

posted @ 2015-10-31 16:28 sdhjl2000 阅读(...) 评论(...) 编辑 收藏