<<上篇 | 首页 | 下篇>>

孩子上课注意力不集中,爱走神,怎么办?_王金战_新浪博客

如果家长发现孩子上课注意力不能集中,可参考如下几方面对孩子及时去矫正:

1、培养兴趣

解决孩子上课走神,首要的是想办法培养孩子对学习的兴趣。一是让孩子把学到的东西及时应用到实际生活中,让孩子感觉知识是非常重要、非常有用和有意思的,通过知识的运用过程激发孩子学习的兴趣。

2、培养孩子的自制力

家长在日常生活中,要有意识地培养孩子的自我控制能力,使注意力服从于活动的目的和任务。可以通过让孩子在一段时间内专心做一件事入手,如做作业、绘画、练琴、手工制作等等来培养孩子的自制力。从开始的十分钟,慢慢过渡到四十分钟,也就是一节课。要循序渐进,一次增加五分钟,心急吃不了热豆腐。让孩子在固定的时间和固定的地点,完成固定的任务,以便形成一种心理活动的定向。

3、注意劳逸结合

学习是脑力劳动,大脑要消耗大量的氧。因此,家长要合理安排孩子的作息时间,控制看电视和玩电子游戏的时间,保证孩子充足的睡眠,养成劳逸结合的好习惯。这样,孩子才能有充足的精力专心听课。

4、和老师沟通

孩子上课走神,请老师帮忙配合效果应该是最好的。家长要耐心和老师交流、沟通,请老师帮忙,课堂上如发现孩子走神能及时提醒,或有意识的安排孩子上黑板做题、回答老师的提问等具体任务,帮孩子尽快把心收回来。

5、专业指导

如果孩子是因为营养方面或心理因素导致的上课走神,家长就要请专业儿童教育的专家和医生,对孩子进行综合考察、诊断,然后再对孩子进行针对性的治疗和矫正。

纠正孩子的不良习惯,家长一要有耐心,给孩子一段时间适应。只要我们耐心坚持,相信孩子会进步的。

 

培养孩子注意力六大金律


俄国教育家乌申斯基说过,“注意是心灵的天窗”。只有打开注意力的这扇窗户,智慧的阳光才能撒满心田。
注意力是孩子学习和生活的基本能力,注意力的好与坏直接影响孩子的认知和社会性情感等身心各方面的发展及其入学后学业成绩的高低。
孩子注意力的形成虽然与先天的遗传有一定关系,但后天的环境与教育的影响更为重要。家长应当根据孩子的身心发展规律与特点,为他创造良好的教育环境,从孩子出生起就有意识地培养孩子的注意力,帮助孩子养成良好的注意品质与能力。

(一)营造安静、简单的环境
幼儿注意稳定性差,容易因新异刺激而转移,这是学前期幼儿的普遍特点。因此,父母应根据这一特点,排除各种可能分散孩子注意的因素,为孩子创造安静、简朴的物质环境。
例如,孩子玩安静游戏或看图书的地方应远离过道,避免他人的来回走动影响孩子的活动;墙面布置不应过于花哨;电视、糖果等可能吸引孩子注意力的物品也应摆放在较远的位置。
父母还应注意调整自己的言行举止,适时地对孩子提出适当的要求,与孩子形成良好的互动模式。
例如,当孩子全神贯注地做某件事时,成人不应随意地去打扰孩子。我们经常会看到,孩子正聚精会神地玩着插塑或搭积木,爸爸走过来问一问吃饱了吗,一会儿,奶奶又走过来让孩子去喝果汁,又一会儿,妈妈又叫他帮忙去拿样东西。孩子短短几分钟的活动被大人们打断数次,时间一长,自然无法集中注意力。所以,在孩子专心做事时,家长最好也坐下来做些安静的活动,切忌在旁边走来走去,打扰孩子。

(二)有规律的生活
孩子一日生活的节奏以及各种活动的时间长短都会影响他的注意力。因此,家长应当注意安排好孩子的生活作息。
让孩子的生活有张有弛、动静交替。不同性质活动之间的转换要平和,给孩子一个过渡准备。
例如,孩子在户外跑来跑去,心跳加速,全身的每一个细胞都处于一种兴奋状态。进到户内后,孩子很难立刻进入到绘画或读书等安静活动中。一些家长却要求孩子立刻安静下来,集中注意力。这种要求本身就是不合理的,是违背孩子的身体器官的运作规律的。
要求孩子集中注意力的时间不宜太长。研究表明,大班末期的幼儿能够集中注意力的时间为15分钟左右。因此,家长在安排孩子的活动时,应当注意调整时间,切忌一天到晚强迫孩子坐着一动不动。

(三)培养孩子的自我约束力
孩子的自控能力较差是注意力容易分散的另一个重要原因。当有新异刺激出现时,成人可以约束自己不去关注它,但孩子却很难做到。因此,为培养孩子的注意力,成人可以有意识地创设情景逐渐提高孩子的自我约束能力。
采用游戏的方式,将持久注意的要求变为游戏角色本身的行为规则。
例如,与孩子一起玩“指挥交通”的游戏,让孩子扮演交通警察,事先约定每班交通警察要站3分钟的岗,时间到后才能换岗。在游戏中,对注意力持续时间的要求可以循序渐进地提高。通过不同的游戏活动,幼儿可以慢慢地将外在的游戏规则内化为内在的自我约束。
有意识地增加干扰因素来增强孩子的自我控制能力。
比如,家长可以偶尔在孩子做事时,假装无意地把他感兴趣的玩具、图书或糖果等放在他旁边。当孩子表现出要放弃当前的活动去选择新的诱惑时,家长应及时地明确提出要求,让孩子集中注意力。

(四)培养孩子注意事物的广度
幼儿注意力差的另一表现是不能同时注意多个事物。为此,家长应当有意识地设计一些活动来培养孩子的注意广度。
“猜物游戏”
先在孩子面前摆放上汽车、小球、铅笔等多种物品,让孩子观察几秒种,然后让他闭上眼睛,趁机悄悄拿走几样物品,然后让他说出哪些东西不见了。这个游戏要求孩子在观察时,能快速地注意到几个物品,从而锻炼了孩子的注意广度。
注意事项
家长应当注意幼儿的年龄和个体之间的差异,呈现的物品的数量多少、拿走的物品的多少以及观察时间的长短等都应当适当。对于年龄大的孩子,呈现的物品可以多一些,观察的时间可以短一些。

(五)激发孩子对活动的兴趣与需要
兴趣与需要是孩子活动的内在推动力,是直接影响孩子注意力的情感系统。为维持孩子对某一活动的持续兴趣,父母应当注意活动内容的难度要适合孩子的水平,既要让孩子体验到成功的快乐,同时又能感受到一定的挑战。
如果活动内容与孩子的先前经验无关,孩子没有充分的经验准备和能力准备,活动任务超出了其驾驭的范围,即使形式再活泼有趣,也不能吸引他们的注意;如果任务难度过低,对孩子来说没有一点挑战,孩子也不会感兴趣,不能集中注意力。

(六)明确活动的目的和要求
注意是为任务服务的,任务越明确,完成任务的愿望越迫切,注意就越能集中和持久。要想使孩子的注意持久,成人不能强迫他做什么,而要让他知道为什么要这样做,激发他做好这件事的愿望。
因此,在活动之前,家长应当帮助孩子明确活动的目的和要求。在活动过程中,家长应当及时提醒孩子,使其注意力始终指向某个方向。
例如,家长和孩子种一颗豆放在窗台上。最初几天,孩子可能出于好奇而经常来看一看。但时间久了,兴趣趋于淡化,自然不会来光顾了。
如果家长能在种豆之前对孩子说:“这颗豆不久会长出绿色的长长的叶子,你要是看到它发芽了,就赶紧来告诉妈妈”。这样就交给孩子一个任务,为了完成妈妈交给的任务,他就必须经常注意它。
小提示
家长向孩子提出活动目的和要求时,应当注意要求一定要具体,要有明确的指向性。笼统模糊的要求对于孩子维持注意并没有太多的积极作用,因为孩子并不明白应当如何去关注,什么时候去关注以及去关注什么。
如在上述例子中,如果家长仅仅说“你要注意它的变化”,孩子可能会感到无所适从,从而失去对观察的兴趣,不能持久注意。这时就要求家长能明确地提出具体要求,将孩子的注意指向具体的某物。所以,如果家长能说出“有没有长出绿色的叶子”,或“看一看它的叶子有什么变化”,效果会更好一些。



解决策略:

 

  1.教给孩子一些小技巧,来延长孩子的注意力集中时间。

  比如,让孩子看着老师的脸,这样能通过动作提醒自己跟着老师的节奏来听课;桌上不要放与学习无关的东西,也不要放太花哨的学习用具,等。

 

  游戏也是延长孩子注意力时间的好方式。比如搭积木、 “一二三木头人”等。“一二三木头人”是一个传统的团体游戏,即家长说“一二三”,孩子就小心翼翼地挪动脚步;当家长喊“木头人”的时候,孩子就马上站住不动。四岁以上的孩子就可以玩得很好,也可以变化成一二三机器人、一二三睡美人等。您在家里陪孩子玩一玩,让他练习控制身体,在一段时间不动。

 

  2.让孩子知道上课的纪律。

  针对孩子暂时还未适应小学的学习特点,我们家长需要配合老师给孩子讲一讲上课的纪律,让他知道上课应该怎么做,如果说话或者有其他动作,会影响到其他同学的学习的。同时,家长朋友也可以多一些耐心,不要吵孩子。随着对新的学习环境的适应,他会逐渐学会听课。

 

  3.正确对待孩子为获取关注的心理。

  如果孩子是为了满足自己被关注的心理,家长可以多给孩子一些关爱,对孩子的行为和情绪表示理解,让孩子得到被关注的满足。也可以告诉孩子,只有良好的行为才能更被关注,改变孩子原有的观念。如果想得到老师和同学的关注,就正确做一个积极思考、热爱学习的学生。

 

  另外,家长也可以联系老师,请老师对孩子因希望得到关注而不专心听课的行为进行冷处理。这样孩子就能逐渐认识到“小动作”不能引起大家的关注,没什么意思,会减少不专心听课的行为。

 

  4.请教老师给孩子“开小灶”。

  对于孩子觉得课程内容过难或过易,家长朋友也可以有针对性地帮孩子进行调整。如果孩子觉得内容比较简单,家长可以事与老师沟通好,让老师针对孩子的特别需要准备一些课程内容,如更难的题目、更深入的内容等。如果孩子因为觉得内容过于简单而注意力不集中,家长朋友也可以向老师请教一下如何辅导孩子,争取让孩子尽快跟上老师上课的进度。

 

  好动是孩子的天性,家长对于孩子上课注意力不集中的问题,一定要有足够的耐心,帮孩子分析原因并给予恰当地引导。 “教育是慢的艺术!”家长浓浓的爱、足够的耐心与恰当的引导,一定能让孩子在自己的求学之路上变得成熟。


 

孩子上课注意力不集中问题的方法


孩子注意力不集中将严重影响孩子的学习和生活。专家为我们提出了以下解决孩子上课注意力不集中问题的方法:
一、为孩子营造安静、舒适的学习与生活环境。因为青少年多以无意注意为主,一切好奇、多变的事物都会很容易地分散他们的注意力,干扰他们正在进行的活动。所以安静舒适的学习环境对他们很重要。
二、充分提高孩子的学习兴趣,将孩子的兴趣与注意力的培养结合起来。
三、注意让孩子在学习中劳逸结合、避免疲劳战术,这样才不会打击孩子学习的积极性。
四、通过有效的训练方法提高孩子的注意力水平。
   1、拼图及七巧板练习 。这是二维空间中最有效的集中注意力的练习项目,要求孩子在相当长的一段时间内,保持连续不断的判断力、观察能力、想象能力和分析能力。而这种游戏的挑战性又会给孩子带来成就感,成就感是孩子将注意力集中到底的一个巨大推动力。
   2、传话游戏。 找篇文章。六人一组,一个人说话的人在屋里,然后由小组的第一个人进屋听故事,然后这个人再将故事讲给小组里第二个人,依次类推直到最后一个人,然后让最后一个人陈述故事内容。
   3、听口令做动作。玩法:在爷爷妈妈、幼儿中任选一人喊口令,其余两人做动作。 游戏开始,喊口令的人说一个动作,做动作的人做和口令相反的动作,如口令为“向右转”,则做“向左转”,口令为“踏步”,则做“立定”等。可交换角色继续做游戏。
4、多米诺骨牌练习 。 大约有七成“难以集中注意力”的孩子,通过这个骨牌堆放的游戏,其耐心得到长足的进步。
   5、舒尔特方格游戏训练。舒尔特方格是在一张方形卡片上画上 1CM × 1CM 的 25 个方格,格子内任意填写上阿拉伯数字 1 — 25 的共 25 个数字。训练时,要求被测者用手指按 1 — 25 的顺序依次指出其位置,同时诵读出声,施测者一旁记录所用时间。数完 25 个数字所用时间越短,注意力水平越高。以 7—12 岁年龄组为例,能达到26"以上为优秀,学习成绩应是名列前茅, 42"属于中等水平,班级排名会在中游或偏下, 50"则问题较大,考试会出现不及格现象。
    18 岁及以上成年人最好可达到 8"的水平, 25"为中等水平。“舒尔特方格”不但可以简单测量注意力水平,而且是很好的训练方法。又是心理咨询师进行心理治疗时常用的基本方法。 运用这种方法的时候,家长可以自制几套卡片,绘制表格,任意填上数字。从1开始,边念边指出相应的数字,直到25为止。同时诵读出声,施测者一旁记录所用时间。数完 25 个数字所用时间越短,注意力水平越高。以 12 —14 岁年龄组为例,能达到 16 "以上为优秀,学习成绩应是名列前茅, 26 "属于中等水平,班级排名会在中游或偏下, 36 "则问题较大,考试会出现不及格现象。 18 岁及以上成年人最好可达到 8 "的水平, 20 "为中等水平。
该心理训练系统适用于 1 — 12 年级学生及成年人,由家长主持,每日坚持对学生进行 5 分钟训练,可有效地改善学生注意力分散的症状,明显改善和提高学生的注意力水平,从根本上做到上课注意听讲,高效率、高质量完成作业,提高学习效率,自然而然地降低考试错误率,顺理成章地达到提高考试成绩的目的。(舒尔特方格在线小游戏)
相信通过上述方法,您的孩子一定会改变现状,提高上课的注意力水平,使学习成绩大幅提升。

阅读全文……

标签 :

Metrics 1.3.6

Metrics是一个十分强大的分析工具,主要分析代码的复杂性。同时可以统计如包的依赖性、代码的有效行数、方法的有效行数、包的数量、属性的数量等等。

 

Run Eclipse, go to Help menu -> Software Updates -> Find and Install ... On the opening dialog choose Search for new features to install. Add a new Remote site with the following url http://metrics.sourceforge.net/update and follow the instructions for installation.

To use the metrics plugin you have to be in a Java or Java Browsing perspective or any other perspective that shows java resources as source folders, packages and compilation units. The simple resource perspective won't do. This makes sense since the metrics are all about counting aspects of your java code.

To start using the Metrics View, use Windows -> Show View -> Other and navigate to the Metrics View, as shown in the next image.

 

Initially the resulting view will show a brief usage message because no metrics have been calculated yet. To start collecting metrics for a project, right click on the project and from the popup menu select "Metrics->Enable" (or alternatively, use the properties page ).This will tell Eclipse to calculate metrics every time a compile happens. Now that you've enabled a project, the easiest way to calculate all its metrics is to do a full rebuild of that project. The metrics view will indicate the progress of the metrics calculations as they are being performed in the background. When it's all done, the metrics view will look something like this:

 

Note that any metric shown in blue can be double-clicked to navigate to the resource causing the maximum value for the metric. Since 1.2.0, the metrics table is actualy a table tree, allowing you to expand each metric to show the values at levels below the selected resource. The child elements at each level are sorted in descending metric (maximum) value order.

阅读全文……

标签 : ,

java版的Metric工具介绍-hustfxj-ChinaUnix博客

Metrics是一个给JAVA服务的各项指标提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控,同时,Metrics能够很好的跟Ganlia、Graphite结合,方便的提供图形化接口。基本使用方式直接将core包(目前稳定版本3.0.1)导入pom文件即可,配置如下:

<dependency> <groupId>com.codahale.metrics</groupId> <artifactId>metrics-core</artifactId> <version>3.0.1</version> </dependency>

core包主要提供如下核心功能:

  • Metrics Registries类似一个metrics容器,维护一个Map,可以是一个服务一个实例。
  • 支持五种metric类型:Gauges、Counters、Meters、Histograms和Timers。
  • 可以将metrics值通过JMX、Console,CSV文件和SLF4J loggers发布出来。

五种Metrics类型:

1.       Gauges

Gauges是一个最简单的计量,一般用来统计瞬时状态的数据信息,比如系统中处于pending状态的job。测试代码
 

点击(此处)折叠或打开

  1. package com.netease.test.metrics;
  2.  
  3. import com.codahale.metrics.ConsoleReporter;
  4. import com.codahale.metrics.Gauge;
  5. import com.codahale.metrics.JmxReporter;
  6. import com.codahale.metrics.MetricRegistry;
  7.  
  8. import java.util.Queue;
  9. import java.util.concurrent.LinkedBlockingDeque;
  10. import java.util.concurrent.TimeUnit;
  11.  
  12. /**
  13.  * User: hzwangxx
  14.  * Date: 14-2-17
  15.  * Time: 14:47
  16.  * 测试Gauges,实时统计pending状态的job个数
  17.  */
  18. public class TestGauges {
  19.     /**
  20.      * 实例化一个registry,最核心的一个模块,相当于一个应用程序的metrics系统的容器,维护一个Map
  21.      */
  22.     private static final MetricRegistry metrics = new MetricRegistry();
  23.  
  24.     private static Queue<String> queue = new LinkedBlockingDeque<String>();
  25.  
  26.     /**
  27.      * 在控制台上打印输出
  28.      */
  29.     private static ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).build();
  30.  
  31.     public static void main(String[] args) throws InterruptedException {
  32.         reporter.start(3, TimeUnit.SECONDS);
  33.  
  34.         //实例化一个Gauge
  35.         Gauge<Integer> gauge = new Gauge<Integer>() {
  36.             @Override
  37.             public Integer getValue() {
  38.                 return queue.size();
  39.             }
  40.         };
  41.  
  42.         //注册到容器中
  43.         metrics.register(MetricRegistry.name(TestGauges.class, "pending-job", "size"), gauge);
  44.  
  45.         //测试JMX
  46.         JmxReporter jmxReporter = JmxReporter.forRegistry(metrics).build();
  47.         jmxReporter.start();
  48.  
  49.         //模拟数据
  50.         for (int i=0; i<20; i++){
  51.             queue.add("a");
  52.             Thread.sleep(1000);
  53.         }
  54.  
  55.     }
  56. }
  57.  
  58. /*
  59. console output:
  60. 14-2-17 15:29:35 ===============================================================
  61.  
  62. -- Gauges ----------------------------------------------------------------------
  63. com.netease.test.metrics.TestGauges.pending-job.size
  64.              value = 4
  65.  
  66.  
  67. 14-2-17 15:29:38 ===============================================================
  68.  
  69. -- Gauges ----------------------------------------------------------------------
  70. com.netease.test.metrics.TestGauges.pending-job.size
  71.              value = 6
  72.  
  73.  
  74. 14-2-17 15:29:41 ===============================================================
  75.  
  76. -- Gauges ----------------------------------------------------------------------
  77. com.netease.test.metrics.TestGauges.pending-job.size
  78.              value = 9
  79.  */

 

通过以上步骤将会向MetricsRegistry容器中注册一个名字为com.netease.test.metrics .TestGauges.pending-job.size的metrics,实时获取队列长度的指标。另外,Core包种还扩展了几种特定的Gauge:
  • JMX Gauges—提供给第三方库只通过JMX将指标暴露出来。
  • Ratio Gauges—简单地通过创建一个gauge计算两个数的比值。
  • Cached Gauges—对某些计量指标提供缓存

Derivative Gauges—提供Gauge的值是基于其他Gauge值的接口。

2.       Counter

Counter是Gauge的一个特例,维护一个计数器,可以通过inc()和dec()方法对计数器做修改。使用步骤与Gauge基本类似,在MetricRegistry中提供了静态方法可以直接实例化一个Counter。

 

点击(此处)折叠或打开

  1. package com.netease.test.metrics;
  2.  
  3. import com.codahale.metrics.ConsoleReporter;
  4. import com.codahale.metrics.Counter;
  5. import com.codahale.metrics.MetricRegistry;
  6.  
  7. import java.util.LinkedList;
  8. import java.util.Queue;
  9. import java.util.concurrent.TimeUnit;
  10. import static com.codahale.metrics.MetricRegistry.*;
  11. /**
  12.  * User: hzwangxx
  13.  * Date: 14-2-14
  14.  * Time: 14:02
  15.  * 测试Counter
  16.  */
  17. public class TestCounter {
  18.  
  19.     /**
  20.      * 实例化一个registry,最核心的一个模块,相当于一个应用程序的metrics系统的容器,维护一个Map
  21.      */
  22.     private static final MetricRegistry metrics = new MetricRegistry();
  23.  
  24.     /**
  25.      * 在控制台上打印输出
  26.      */
  27.     private static ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).build();
  28.  
  29.     /**
  30.      * 实例化一个counter,同样可以通过如下方式进行实例化再注册进去
  31.      * pendingJobs = new Counter();
  32.      * metrics.register(MetricRegistry.name(TestCounter.class, "pending-jobs"), pendingJobs);
  33.      */
  34.     private static Counter pendingJobs = metrics.counter(name(TestCounter.class, "pedding-jobs"));
  35. // private static Counter pendingJobs = metrics.counter(MetricRegistry.name(TestCounter.class, "pedding-jobs"));
  36.  
  37.  
  38.  
  39.     private static Queue<String> queue = new LinkedList<String>();
  40.  
  41.     public static void add(String str) {
  42.         pendingJobs.inc();
  43.         queue.offer(str);
  44.     }
  45.  
  46.     public String take() {
  47.         pendingJobs.dec();
  48.         return queue.poll();
  49.     }
  50.  
  51.     public static void main(String[]args) throws InterruptedException {
  52.         reporter.start(3, TimeUnit.SECONDS);
  53.         while(true){
  54.             add("1");
  55.             Thread.sleep(1000);
  56.         }
  57.  
  58.     }
  59. }
  60.  
  61. /*
  62. console output:
  63. 14-2-17 17:52:34 ===============================================================
  64.  
  65. -- Counters --------------------------------------------------------------------
  66. com.netease.test.metrics.TestCounter.pedding-jobs
  67.              count = 4
  68.  
  69.  
  70. 14-2-17 17:52:37 ===============================================================
  71.  
  72. -- Counters --------------------------------------------------------------------
  73. com.netease.test.metrics.TestCounter.pedding-jobs
  74.              count = 6
  75.  
  76.  
  77. 14-2-17 17:52:40 ===============================================================
  78.  
  79. -- Counters --------------------------------------------------------------------
  80. com.netease.test.metrics.TestCounter.pedding-jobs
  81.              count = 9
  82.  
  83.  */

 

3.       Meters

Meters用来度量某个时间段的平均处理次数(request per second),每1、5、15分钟的TPS。比如一个service的请求数,通过metrics.meter()实例化一个Meter之后,然后通过meter.mark()方法就能将本次请求记录下来。统计结果有总的请求数,平均每秒的请求数,以及最近的1、5、15分钟的平均TPS。

 

点击(此处)折叠或打开

  1. package com.netease.test.metrics;
  2.  
  3. import com.codahale.metrics.ConsoleReporter;
  4. import com.codahale.metrics.Meter;
  5. import com.codahale.metrics.MetricRegistry;
  6.  
  7. import java.util.concurrent.TimeUnit;
  8.  
  9. import static com.codahale.metrics.MetricRegistry.*;
  10.  
  11. /**
  12.  * User: hzwangxx
  13.  * Date: 14-2-17
  14.  * Time: 18:34
  15.  * 测试Meters
  16.  */
  17. public class TestMeters {
  18.     /**
  19.      * 实例化一个registry,最核心的一个模块,相当于一个应用程序的metrics系统的容器,维护一个Map
  20.      */
  21.     private static final MetricRegistry metrics = new MetricRegistry();
  22.  
  23.     /**
  24.      * 在控制台上打印输出
  25.      */
  26.     private static ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).build();
  27.  
  28.     /**
  29.      * 实例化一个Meter
  30.      */
  31.     private static final Meter requests = metrics.meter(name(TestMeters.class, "request"));
  32.  
  33.     public static void handleRequest() {
  34.         requests.mark();
  35.     }
  36.  
  37.     public static void main(String[] args) throws InterruptedException {
  38.         reporter.start(3, TimeUnit.SECONDS);
  39.         while(true){
  40.             handleRequest();
  41.             Thread.sleep(100);
  42.         }
  43.     }
  44.  
  45. }
  46.  
  47. /*
  48. 14-2-17 18:43:08 ===============================================================
  49.  
  50. -- Meters ----------------------------------------------------------------------
  51. com.netease.test.metrics.TestMeters.request
  52.              count = 30
  53.          mean rate = 9.95 events/second
  54.      1-minute rate = 0.00 events/second
  55.      5-minute rate = 0.00 events/second
  56.     15-minute rate = 0.00 events/second
  57.  
  58.  
  59. 14-2-17 18:43:11 ===============================================================
  60.  
  61. -- Meters ----------------------------------------------------------------------
  62. com.netease.test.metrics.TestMeters.request
  63.              count = 60
  64.          mean rate = 9.99 events/second
  65.      1-minute rate = 10.00 events/second
  66.      5-minute rate = 10.00 events/second
  67.     15-minute rate = 10.00 events/second
  68.  
  69.  
  70. 14-2-17 18:43:14 ===============================================================
  71.  
  72. -- Meters ----------------------------------------------------------------------
  73. com.netease.test.metrics.TestMeters.request
  74.              count = 90
  75.          mean rate = 9.99 events/second
  76.      1-minute rate = 10.00 events/second
  77.      5-minute rate = 10.00 events/second
  78.     15-minute rate = 10.00 events/second
  79. */

 

4.       Histograms

Histograms主要使用来统计数据的分布情况,最大值、最小值、平均值、中位数,百分比(75%、90%、95%、98%、99%和99.9%)。例如,需要统计某个页面的请求响应时间分布情况,可以使用该种类型的Metrics进行统计。具体的样例代码如下:

 

点击(此处)折叠或打开

  1. package com.netease.test.metrics;
  2.  
  3. import com.codahale.metrics.ConsoleReporter;
  4. import com.codahale.metrics.Histogram;
  5. import com.codahale.metrics.MetricRegistry;
  6.  
  7. import java.util.Random;
  8. import java.util.concurrent.TimeUnit;
  9.  
  10. import static com.codahale.metrics.MetricRegistry.name;
  11.  
  12. /**
  13.  * User: hzwangxx
  14.  * Date: 14-2-17
  15.  * Time: 18:34
  16.  * 测试Histograms
  17.  */
  18. public class TestHistograms {
  19.     /**
  20.      * 实例化一个registry,最核心的一个模块,相当于一个应用程序的metrics系统的容器,维护一个Map
  21.      */
  22.     private static final MetricRegistry metrics = new MetricRegistry();
  23.  
  24.     /**
  25.      * 在控制台上打印输出
  26.      */
  27.     private static ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).build();
  28.  
  29.     /**
  30.      * 实例化一个Histograms
  31.      */
  32.     private static final Histogram randomNums = metrics.histogram(name(TestHistograms.class, "random"));
  33.  
  34.     public static void handleRequest(double random) {
  35.         randomNums.update((int) (random*100));
  36.     }
  37.  
  38.     public static void main(String[] args) throws InterruptedException {
  39.         reporter.start(3, TimeUnit.SECONDS);
  40.         Random rand = new Random();
  41.         while(true){
  42.             handleRequest(rand.nextDouble());
  43.             Thread.sleep(100);
  44.         }
  45.     }
  46.  
  47. }
  48.  
  49. /*
  50. 14-2-17 19:39:11 ===============================================================
  51.  
  52. -- Histograms ------------------------------------------------------------------
  53. com.netease.test.metrics.TestHistograms.random
  54.              count = 30
  55.                min = 1
  56.                max = 97
  57.               mean = 45.93
  58.             stddev = 29.12
  59.             median = 39.50
  60.               75% <= 71.00
  61.               95% <= 95.90
  62.               98% <= 97.00
  63.               99% <= 97.00
  64.             99.9% <= 97.00
  65.  
  66.  
  67. 14-2-17 19:39:14 ===============================================================
  68.  
  69. -- Histograms ------------------------------------------------------------------
  70. com.netease.test.metrics.TestHistograms.random
  71.              count = 60
  72.                min = 0
  73.                max = 97
  74.               mean = 41.17
  75.             stddev = 28.60
  76.             median = 34.50
  77.               75% <= 69.75
  78.               95% <= 92.90
  79.               98% <= 96.56
  80.               99% <= 97.00
  81.             99.9% <= 97.00
  82.  
  83.  
  84. 14-2-17 19:39:17 ===============================================================
  85.  
  86. -- Histograms ------------------------------------------------------------------
  87. com.netease.test.metrics.TestHistograms.random
  88.              count = 90
  89.                min = 0
  90.                max = 97
  91.               mean = 44.67
  92.             stddev = 28.47
  93.             median = 43.00
  94.               75% <= 71.00
  95.               95% <= 91.90
  96.               98% <= 96.18
  97.               99% <= 97.00
  98.             99.9% <= 97.00
  99. */



5.       Timers

 

Timers主要是用来统计某一块代码段的执行时间以及其分布情况,具体是基于Histograms和Meters来实现的。样例代码如下:
 

点击(此处)折叠或打开

  1. package com.netease.test.metrics;
  2.  
  3. import com.codahale.metrics.ConsoleReporter;
  4. import com.codahale.metrics.MetricRegistry;
  5. import com.codahale.metrics.Timer;
  6.  
  7. import java.util.Random;
  8. import java.util.concurrent.TimeUnit;
  9.  
  10. import static com.codahale.metrics.MetricRegistry.name;
  11.  
  12. /**
  13.  * User: hzwangxx
  14.  * Date: 14-2-17
  15.  * Time: 18:34
  16.  * 测试Timers
  17.  */
  18. public class TestTimers {
  19.     /**
  20.      * 实例化一个registry,最核心的一个模块,相当于一个应用程序的metrics系统的容器,维护一个Map
  21.      */
  22.     private static final MetricRegistry metrics = new MetricRegistry();
  23.  
  24.     /**
  25.      * 在控制台上打印输出
  26.      */
  27.     private static ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).build();
  28.  
  29.     /**
  30.      * 实例化一个Meter
  31.      */
  32. // private static final Timer requests = metrics.timer(name(TestTimers.class, "request"));
  33.     private static final Timer requests = metrics.timer(name(TestTimers.class, "request"));
  34.  
  35.     public static void handleRequest(int sleep) {
  36.         Timer.Context context = requests.time();
  37.         try {
  38.             //some operator
  39.             Thread.sleep(sleep);
  40.         } catch (InterruptedException e) {
  41.             e.printStackTrace();
  42.         } finally {
  43.             context.stop();
  44.         }
  45.  
  46.     }
  47.  
  48.     public static void main(String[] args) throws InterruptedException {
  49.         reporter.start(3, TimeUnit.SECONDS);
  50.         Random random = new Random();
  51.         while(true){
  52.             handleRequest(random.nextInt(1000));
  53.         }
  54.     }
  55.  
  56. }
  57.  
  58. /*
  59. 14-2-18 9:31:54 ================================================================
  60.  
  61. -- Timers ----------------------------------------------------------------------
  62. com.netease.test.metrics.TestTimers.request
  63.              count = 4
  64.          mean rate = 1.33 calls/second
  65.      1-minute rate = 0.00 calls/second
  66.      5-minute rate = 0.00 calls/second
  67.     15-minute rate = 0.00 calls/second
  68.                min = 483.07 milliseconds
  69.                max = 901.92 milliseconds
  70.               mean = 612.64 milliseconds
  71.             stddev = 196.32 milliseconds
  72.             median = 532.79 milliseconds
  73.               75% <= 818.31 milliseconds
  74.               95% <= 901.92 milliseconds
  75.               98% <= 901.92 milliseconds
  76.               99% <= 901.92 milliseconds
  77.             99.9% <= 901.92 milliseconds
  78.  
  79.  
  80. 14-2-18 9:31:57 ================================================================
  81.  
  82. -- Timers ----------------------------------------------------------------------
  83. com.netease.test.metrics.TestTimers.request
  84.              count = 8
  85.          mean rate = 1.33 calls/second
  86.      1-minute rate = 1.40 calls/second
  87.      5-minute rate = 1.40 calls/second
  88.     15-minute rate = 1.40 calls/second
  89.                min = 41.07 milliseconds
  90.                max = 968.19 milliseconds
  91.               mean = 639.50 milliseconds
  92.             stddev = 306.12 milliseconds
  93.             median = 692.77 milliseconds
  94.               75% <= 885.96 milliseconds
  95.               95% <= 968.19 milliseconds
  96.               98% <= 968.19 milliseconds
  97.               99% <= 968.19 milliseconds
  98.             99.9% <= 968.19 milliseconds
  99.  
  100.  
  101. 14-2-18 9:32:00 ================================================================
  102.  
  103. -- Timers ----------------------------------------------------------------------
  104. com.netease.test.metrics.TestTimers.request
  105.              count = 15
  106.          mean rate = 1.67 calls/second
  107.      1-minute rate = 1.40 calls/second
  108.      5-minute rate = 1.40 calls/second
  109.     15-minute rate = 1.40 calls/second
  110.                min = 41.07 milliseconds
  111.                max = 968.19 milliseconds
  112.               mean = 591.35 milliseconds
  113.             stddev = 302.96 milliseconds
  114.             median = 650.56 milliseconds
  115.               75% <= 838.07 milliseconds
  116.               95% <= 968.19 milliseconds
  117.               98% <= 968.19 milliseconds
  118.               99% <= 968.19 milliseconds
  119.             99.9% <= 968.19 milliseconds
  120.  
  121. */

 

6  Health Checks

Metrics提供了一个独立的模块:Health Checks,用于对Application、其子模块或者关联模块的运行是否正常做检测。该模块是独立metrics-core模块的,使用时则导入metrics-healthchecks包。

<dependency> <groupId>com.codahale.metrics</groupId> <artifactId>metrics-healthchecks</artifactId> <version>3.0.1</version> </dependency>

使用起来和与上述几种类型的Metrics有点类似,但是需要重新实例化一个Metrics容器HealthCheckRegistry,待检测模块继承抽象类HealthCheck并实现check()方法即可,然后将该模块注册到HealthCheckRegistry中,判断的时候通过isHealthy()接口即可。如下示例代码:

 

点击(此处)折叠或打开

  1. package com.netease.test.metrics;
  2.  
  3. import com.codahale.metrics.health.HealthCheck;
  4. import com.codahale.metrics.health.HealthCheckRegistry;
  5.  
  6. import java.util.Map;
  7. import java.util.Random;
  8.  
  9. /**
  10.  * User: hzwangxx
  11.  * Date: 14-2-18
  12.  * Time: 9:57
  13.  */
  14. public class DatabaseHealthCheck extends HealthCheck{
  15.     private final Database database;
  16.  
  17.     public DatabaseHealthCheck(Database database) {
  18.         this.database = database;
  19.     }
  20.  
  21.     @Override
  22.     protected Result check() throws Exception {
  23.         if (database.ping()) {
  24.             return Result.healthy();
  25.         }
  26.         return Result.unhealthy("Can't ping database.");
  27.     }
  28.  
  29.     /**
  30.      * 模拟Database对象
  31.      */
  32.     static class Database {
  33.         /**
  34.          * 模拟database的ping方法
  35.          * @return 随机返回boolean值
  36.          */
  37.         public boolean ping() {
  38.             Random random = new Random();
  39.             return random.nextBoolean();
  40.         }
  41.     }
  42.  
  43.     public static void main(String[] args) {
  44. // MetricRegistry metrics = new MetricRegistry();
  45. // ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).build();
  46.         HealthCheckRegistry registry = new HealthCheckRegistry();
  47.         registry.register("database1", new DatabaseHealthCheck(new Database()));
  48.         registry.register("database2", new DatabaseHealthCheck(new Database()));
  49.         while (true) {
  50.             for (Map.Entry<String, Result> entry : registry.runHealthChecks().entrySet()) {
  51.                 if (entry.getValue().isHealthy()) {
  52.                     System.out.println(entry.getKey() + ": OK");
  53.                 } else {
  54.                     System.err.println(entry.getKey() + ": FAIL, error message: " + entry.getValue().getMessage());
  55.                     final Throwable e = entry.getValue().getError();
  56.                     if (e != null) {
  57.                         e.printStackTrace();
  58.                     }
  59.                 }
  60.             }
  61.             try {
  62.                 Thread.sleep(1000);
  63.             } catch (InterruptedException e) {
  64.  
  65.             }
  66.         }
  67.     }
  68. }
  69.  
  70. /*
  71. console output:
  72. database1: OK
  73. database2: FAIL, error message: Can't ping database.
  74. database1: FAIL, error message: Can't ping database.
  75. database2: OK
  76. database1: OK
  77. database2: FAIL, error message: Can't ping database.
  78. database1: FAIL, error message: Can't ping database.
  79. database2: OK
  80. database1: FAIL, error message: Can't ping database.
  81. database2: FAIL, error message: Can't ping database.
  82. database1: FAIL, error message: Can't ping database.
  83. database2: FAIL, error message: Can't ping database.
  84. database1: OK
  85. database2: OK
  86. database1: OK
  87. database2: FAIL, error message: Can't ping database.
  88. database1: FAIL, error message: Can't ping database.
  89. database2: OK
  90. database1: OK
  91. database2: OK
  92. database1: FAIL, error message: Can't ping database.
  93. database2: OK
  94. database1: OK
  95. database2: OK
  96. database1: OK
  97. database2: OK
  98. database1: OK
  99. database2: FAIL, error message: Can't ping database.
  100. database1: FAIL, error message: Can't ping database.
  101. database2: FAIL, error message: Can't ping database.
  102.  
  103.  */

 

其他支持

metrics提供了对Ehcache、Apache HttpClient、JDBI、Jersey、Jetty、Log4J、Logback、JVM等的集成,可以方便地将Metrics输出到Ganglia、Graphite中,供用户图形化展示。

阅读全文……

标签 : ,