精华内容
参与话题
问答
  • Sklearn.metrics

    2020-03-18 10:46:03
    sklearn.metrics 评价模型好坏的指标

    分类指标

    1. accuracy_score(y_true, y_pre)
      精度
    2. auc(x, y, reorder=False)
      ROC曲线下的面积;较大的AUC代表了较好的performance。
    3. average_precision_score(y_true, y_score, average=‘macro’, sample_weight=None)
      根据预测得分计算平均精度
    4. brier_score_loss(y_true, y_prob, sample_weight=None, pos_label=None)
      The smaller the Brier score, the better.
    5. confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)
      通过计算混淆矩阵来评估分类的准确性 返回混淆矩阵
    6. f1_score(y_true, y_pred, labels=None, pos_label=1, average=‘binary’, sample_weight=None)
      F1值
    7. log_loss(y_true, y_pred, eps=1e-15, normalize=True, sample_weight=None, labels=None)
      对数损耗,又称逻辑损耗或交叉熵损耗
    8. precision_score(y_true, y_pred, labels=None, pos_label=1, average=‘binary’,)
      查准率
    9. recall_score(y_true, y_pred, labels=None, pos_label=1, average=‘binary’, sample_weight=None)
      查全率
    10. roc_auc_score(y_true, y_score, average=‘macro’, sample_weight=None)
      计算ROC曲线下的面积就是AUC的值,the larger the better
    11. roc_curve(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=True)
      计算ROC曲线的横纵坐标值,TPR,FPR
      TPR = TP/(TP+FN) = recall(真正例率,敏感度)
      FPR = FP/(FP+TN)(假正例率,1-特异性)
    12. classification_report(y_true, y_pred)
      分类结果分析汇总

    回归指标

    1. explained_variance_score(y_true, y_pred, sample_weight=None, multioutput=‘uniform_average’)
      回归方差(反应自变量与因变量之间的相关程度)
    2. mean_absolute_error(y_true, y_pred, sample_weight=None, multioutput=‘uniform_average’)
      平均绝对误差
    3. mean_squared_error(y_true, y_pred, sample_weight=None, multioutput=‘uniform_average’)
      均方差
    4. median_absolute_error(y_true, y_pred)
      中值绝对误差
    5. r2_score(y_true, y_pred, sample_weight=None, multioutput=‘uniform_average’)
      R平方值
    展开全文
  • accuracy_score 分类准确率分数是指所有分类正确的百分比。分类准确率这一衡量分类器的标准比较容易理解,...sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None) normalize:默认
    1. accuracy_score

    分类准确率分数是指所有分类正确的百分比。分类准确率这一衡量分类器的标准比较容易理解,但是它不能告诉你响应值的潜在分布,并且它也不能告诉你分类器犯错的类型。

    • 形式

    sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)

    normalize:默认值为True,返回正确分类的比例;如果为False,返回正确分类的样本数

    • 示例

     

    >>>import numpy as np
    >>>from sklearn.metrics import accuracy_score
    >>>y_pred = [0, 2, 1, 3]
    >>>y_true = [0, 1, 2, 3]
    >>>accuracy_score(y_true, y_pred)
    0.5
    >>>accuracy_score(y_true, y_pred, normalize=False)
    2

     

    1. recall_score

    召回率 =提取出的正确信息条数 /样本中的信息条数。通俗地说,就是所有准确的条目有多少被检索出来了。

    • 形式

    klearn.metrics.recall_score(y_true, y_pred, labels=None, pos_label=1,average='binary', sample_weight=None)

    参数average : string, [None, ‘micro’, ‘macro’(default), ‘samples’, ‘weighted’]

    将一个二分类matrics拓展到多分类或多标签问题时,我们可以将数据看成多个二分类问题的集合,每个类都是一个二分类。接着,我们可以通过跨多个分类计算每个二分类metrics得分的均值,这在一些情况下很有用。你可以使用average参数来指定。

    macro:计算二分类metrics的均值,为每个类给出相同权重的分值。当小类很重要时会出问题,因为该macro-averging方法是对性能的平均。另一方面,该方法假设所有分类都是一样重要的,因此macro-averaging方法会对小类的性能影响很大。

    weighted:对于不均衡数量的类来说,计算二分类metrics的平均,通过在每个类的score上进行加权实现。

    micro:给出了每个样本类以及它对整个metrics的贡献的pair(sample-weight),而非对整个类的metrics求和,它会每个类的metrics上的权重及因子进行求和,来计算整个份额。Micro-averaging方法在多标签(multilabel)问题中设置,包含多分类,此时,大类将被忽略。

    samples:应用在multilabel问题上。它不会计算每个类,相反,它会在评估数据中,通过计算真实类和预测类的差异的metrics,来求平均(sample_weight-weighted)

    average:average=None将返回一个数组,它包含了每个类的得分.

    • 示例:

     

    >>>from sklearn.metrics import recall_score
    >>>y_true = [0, 1, 2, 0, 1, 2]
    >>>y_pred = [0, 2, 1, 0, 0, 1]
    >>>recall_score(y_true, y_pred, average='macro') 
    0.33...
    >>>recall_score(y_true, y_pred, average='micro') 
    0.33...
    >>>recall_score(y_true, y_pred, average='weighted') 
    0.33...
    >>>recall_score(y_true, y_pred, average=None)
    array([1.,  0., 0.])

     

    1. roc_curve

    ROC曲线指受试者工作特征曲线/接收器操作特性(receiver operating characteristic,ROC)曲线,是反映灵敏性和特效性连续变量的综合指标,是用构图法揭示敏感性和特异性的相互关系,它通过将连续变量设定出多个不同的临界值,从而计算出一系列敏感性和特异性。ROC曲线是根据一系列不同的二分类方式(分界值或决定阈),以真正例率(也就是灵敏度)(True Positive Rate,TPR)为纵坐标,假正例率(1-特效性)(False Positive Rate,FPR)为横坐标绘制的曲线。

    ROC观察模型正确地识别正例的比例与模型错误地把负例数据识别成正例的比例之间的权衡。TPR的增加以FPR的增加为代价。ROC曲线下的面积是模型准确率的度量,AUC(Area under roccurve)。

    纵坐标真正率(True Positive Rate , TPR)或灵敏度(sensitivity)

    TPR = TP /(TP + FN)  (正样本预测结果数 / 正样本实际数)

    横坐标假正率(False Positive Rate , FPR)

    FPR = FP /(FP + TN) (被预测为正的负样本结果数 /负样本实际数)

    • 形式:

    sklearn.metrics.roc_curve(y_true,y_score, pos_label=None, sample_weight=None, drop_intermediate=True)

    该函数返回这三个变量:fpr,tpr,和阈值thresholds;

    这里理解thresholds:

    分类器的一个重要功能“概率输出”,即表示分类器认为某个样本具有多大的概率属于正样本(或负样本)。

    “Score”表示每个测试样本属于正样本的概率。

    接下来,我们从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。每次选取一个不同的threshold,我们就可以得到一组FPR和TPR,即ROC曲线上的一点。当我们将threshold设置为1和0时,分别可以得到ROC曲线上的(0,0)和(1,1)两个点。将这些(FPR,TPR)对连接起来,就得到了ROC曲线。当threshold取值越多,ROC曲线越平滑。其实,我们并不一定要得到每个测试样本是正样本的概率值,只要得到这个分类器对该测试样本的“评分值”即可(评分值并不一定在(0,1)区间)。评分越高,表示分类器越肯定地认为这个测试样本是正样本,而且同时使用各个评分值作为threshold。我认为将评分值转化为概率更易于理解一些。

    • 示例

     

    >>>import numpy as np
    >>>from sklearn import metrics
    >>>y = np.array([1, 1, 2, 2])
    >>>scores = np.array([0.1, 0.4, 0.35, 0.8])
    >>>fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
    >>>fpr
    array([0. ,  0.5,  0.5, 1. ])
    >>>tpr
    array([0.5,  0.5,  1. , 1. ])
    >>>thresholds
    array([0.8 ,  0.4 ,  0.35, 0.1 ])
    >>>from sklearn.metrics import auc 
    >>>metrics.auc(fpr, tpr) 
    0.75 

     

    1. Auc

    计算AUC值,其中x,y分别为数组形式,根据(xi,yi)在坐标上的点,生成的曲线,然后计算AUC值;

    • 形式:

    sklearn.metrics.auc(x, y, reorder=False)

     

    1. roc_auc_score

    直接根据真实值(必须是二值)、预测值(可以是0/1,也可以是proba值)计算出auc值,中间过程的roc计算省略。

    • 形式:

    sklearn.metrics.roc_auc_score(y_true, y_score, average='macro', sample_weight=None)

    average : string, [None, ‘micro’, ‘macro’(default), ‘samples’, ‘weighted’]

    • 示例:

     

    >>>import numpy as np
    >>>from sklearn.metrics import roc_auc_score
    >>>y_true = np.array([0, 0, 1, 1])
    >>>y_scores = np.array([0.1, 0.4, 0.35, 0.8])
    >>>roc_auc_score(y_true, y_scores)
    0.75

     

    1. confusion_matrix
    • 用一个例子来理解混淆矩阵:

    假设有一个用来对猫(cats)、狗(dogs)、兔子(rabbits)进行分类的系统,混淆矩阵就是为了进一步分析性能而对该算法测试结果做出的总结。假设总共有 27 只动物:8只猫, 6条狗, 13只兔子。结果的混淆矩阵如下图:

    在这个混淆矩阵中,实际有 8只猫,但是系统将其中3只预测成了狗;对于 6条狗,其中有 1条被预测成了兔子,2条被预测成了猫。从混淆矩阵中我们可以看出系统对于区分猫和狗存在一些问题,但是区分兔子和其他动物的效果还是不错的。所有正确的预测结果都在对角线上,所以从混淆矩阵中可以很方便直观的看出哪里有错误,因为他们呈现在对角线外面

    • 形式:

    sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)

    返回一个混淆矩阵;

    labels:混淆矩阵的索引(如上面猫狗兔的示例),如果没有赋值,则按照y_true, y_pred中出现过的值排序

    • 示例

     

    >>>from sklearn.metrics import confusion_matrix
    >>>y_true = [2, 0, 2, 2, 0, 1]
    >>>y_pred = [0, 0, 2, 2, 0, 2]
    >>>confusion_matrix(y_true, y_pred)
    array([[2,0, 0],
           [0, 0, 1],
           [1, 0, 2]])
     
    >>>y_true = ["cat", "ant", "cat", "cat","ant", "bird"]
    >>>y_pred = ["ant", "ant", "cat", "cat","ant", "cat"]
    >>>confusion_matrix(y_true, y_pred, labels=["ant", "bird","cat"])
    array([[2,0, 0],
           [0, 0, 1],
           [1, 0, 2]])

    欢迎关注公众号,不定期更新~

     

     

     

    展开全文
  • Metrics使用简介

    千次阅读 2018-05-02 10:00:51
    Metrics可以为你的代码的运行提供无与伦比的洞察力。作为一款监控指标的度量类库,它提供了很多模块可以为第三方库或者应用提供辅助统计信息, 比如Jetty, Logback, Log4j, Apache HttpClient, Ehcache, JDBI, ...

    Metrics可以为你的代码的运行提供无与伦比的洞察力。作为一款监控指标的度量类库,它提供了很多模块可以为第三方库或者应用提供辅助统计信息, 比如Jetty, Logback, Log4j, Apache HttpClient, Ehcache, JDBI, Jersey, 它还可以将度量数据发送给Ganglia和Graphite以提供图形化的监控。

    Metrics提供了Gauge、Counter、Meter、Histogram、Timer等度量工具类以及Health Check功能。

    引用Metric库

    将metrics-core加入到maven pom.xml中:

    <dependencies>
        <dependency>
            <groupId>com.codahale.metrics</groupId>
            <artifactId>metrics-core</artifactId>
            <version>${metrics.version}</version>
        </dependency>
    </dependencies>

    metrics.version 设置为metrics最新的版本。
    现在你可以在你的程序代码中加入一些度量了。

    Registry

    Metric的中心部件是MetricRegistry。 它是程序中所有度量metric的容器。让我们接着在代码中加入一行:

    final MetricRegistry metrics = new MetricRegistry();

    Gauge (仪表)

    Gauge代表一个度量的即时值。 当你开汽车的时候, 当前速度是Gauge值。 你测体温的时候, 体温计的刻度是一个Gauge值。 当你的程序运行的时候, 内存使用量和CPU占用率都可以通过Gauge值来度量。
    比如我们可以查看一个队列当前的size。

    public class QueueManager {
        private final Queue queue;
        public QueueManager(MetricRegistry metrics, String name) {
            this.queue = new Queue();
            metrics.register(MetricRegistry.name(QueueManager.class, name, "size"),
                             new Gauge<Integer>() {
                                 @Override
                                 public Integer getValue() {
                                     return queue.size();
                                 }
                             });
        }
    }

    registry 中每一个metric都有唯一的名字。 它可以是以.连接的字符串。 如"things.count" 和 "com.colobu.Thing.latency"。 MetricRegistry 提供了一个静态的辅助方法用来生成这个名字:

    MetricRegistry.name(QueueManager.class, "jobs", "size")

    生成的name为com.colobu.QueueManager.jobs.size

    实际编程中对于队列或者类似队列的数据结构,你不会简单的度量queue.size(), 因为在java.util和java.util.concurrent包中大部分的queue的#size是O(n),这意味的调用此方法会有性能的问题, 更深一步,可能会有lock的问题。

    RatioGauge可以计算两个Gauge的比值。 Meter和Timer可以参考下面的代码创建。下面的代码用来计算计算命中率 (hit/call)。

    public class CacheHitRatio extends RatioGauge {
        private final Meter hits;
        private final Timer calls;
        public CacheHitRatio(Meter hits, Timer calls) {
            this.hits = hits;
            this.calls = calls;
        }
        @Override
        public Ratio getValue() {
            return Ratio.of(hits.oneMinuteRate(),
                            calls.oneMinuteRate());
        }
    }

    CachedGauge可以缓存耗时的测量。DerivativeGauge可以引用另外一个Gauage。

    Counter (计数器)

    Counter是一个AtomicLong实例, 可以增加或者减少值。 例如,可以用它来计数队列中加入的Job的总数。 

    private final Counter pendingJobs = metrics.counter(name(QueueManager.class, "pending-jobs"));
    public void addJob(Job job) {
        pendingJobs.inc();
        queue.offer(job);
    }
    public Job takeJob() {
        pendingJobs.dec();
        return queue.take();
    }

    和上面Gauage不同,这里我们使用的是metrics.counter方法而不是metrics.register方法。 使用metrics.counter更简单。

    Meter ()

    Meter用来计算事件的速率。 例如 request per second。 还可以提供1分钟,5分钟,15分钟不断更新的平均速率。


    private final Meter requests = metrics.meter(name(RequestHandler.class, "requests"));
    public void handleRequest(Request request, Response response) {
        requests.mark();
        // etc
    }

    Histogram (直方图)

    Histogram可以为数据流提供统计数据。 除了最大值,最小值,平均值外,它还可以测量 中值(median),百分比比如XX%这样的Quantile数据 。

    private final Histogram responseSizes = metrics.histogram(name(RequestHandler.class, "response-sizes");
    public void handleRequest(Request request, Response response) {
        // etc
        responseSizes.update(response.getContent().length);
    }

    这个例子用来统计response的字节数。
    Metrics提供了一批的Reservoir实现,非常有用。例如SlidingTimeWindowReservoir 用来统计最新N个秒(或其它时间单元)的数据。

    Timer (计时器)

    Timer用来测量一段代码被调用的速率和用时。

    private final Timer responses = metrics.timer(name(RequestHandler.class, "responses"));
    public String handleRequest(Request request, Response response) {
        final Timer.Context context = responses.time();
        try {
            // etc;
            return "OK";
        } finally {
            context.stop();
        }
    }

    这段代码用来计算中间的代码用时以及request的速率。

    Health Check (健康检查)

    Metric还提供了服务健康检查能力, 由metrics-healthchecks模块提供。
    先创建一个HealthCheckRegistry实例。

    final HealthCheckRegistry healthChecks = new HealthCheckRegistry();

    再实现一个HealthCheck子类, 用来检查数据库的状态。

    public class DatabaseHealthCheck extends HealthCheck {
        private final Database database;
        public DatabaseHealthCheck(Database database) {
            this.database = database;
        }
        @Override
        public HealthCheck.Result check() throws Exception {
            if (database.isConnected()) {
                return HealthCheck.Result.healthy();
            } else {
                return HealthCheck.Result.unhealthy("Cannot connect to " + database.getUrl());
            }
        }
    }

    注册一下。

    healthChecks.register("mysql", new DatabaseHealthCheck(database));

    最后运行健康检查并查看检查结果。


    final Map<String, HealthCheck.Result> results = healthChecks.runHealthChecks();
    for (Entry<String, HealthCheck.Result> entry : results.entrySet()) {
        if (entry.getValue().isHealthy()) {
            System.out.println(entry.getKey() + " is healthy");
        } else {
            System.err.println(entry.getKey() + " is UNHEALTHY: " + entry.getValue().getMessage());
            final Throwable e = entry.getValue().getError();
            if (e != null) {
                e.printStackTrace();
            }
        }
    }

    Metric内置一个ThreadDeadlockHealthCheck, 它使用java内置的线程死锁检查方法来检查程序中是否有死锁。

    JMX报表

    通过JMX报告Metric。

    final JmxReporter reporter = JmxReporter.forRegistry(registry).build();
    reporter.start();

    一旦启动, 所有registry中注册的metric都可以通过JConsole或者VisualVM查看 (通过MBean插件)。

    HTTP报表

    Metric也提供了一个servlet (AdminServlet)提供JSON风格的报表。它还提供了单一功能的servlet (MetricsServlet, HealthCheckServlet, ThreadDumpServlet, PingServlet)。
    你需要在pom.xml加入metrics-servlets。

    <dependency>
        <groupId>com.codahale.metrics</groupId>
        <artifactId>metrics-servlets</artifactId>
        <version>${metrics.version}</version>
    </dependency>

    其它报表

    除了JMX和HTTP, metric还提供其它报表。

    • STDOUT, using ConsoleReporter from metrics-core
    final ConsoleReporter reporter = ConsoleReporter.forRegistry(registry)
                                                    .convertRatesTo(TimeUnit.SECONDS)
                                                    .convertDurationsTo(TimeUnit.MILLISECONDS)
                                                    .build();
    reporter.start(1, TimeUnit.MINUTES);
    • CSV files, using CsvReporter from metrics-core
    final CsvReporter reporter = CsvReporter.forRegistry(registry)
                                            .formatFor(Locale.US)
                                            .convertRatesTo(TimeUnit.SECONDS)
                                            .convertDurationsTo(TimeUnit.MILLISECONDS)
                                            .build(new File("~/projects/data/"));
    reporter.start(1, TimeUnit.SECONDS);
    • SLF4J loggers, using Slf4jReporter from metrics-core
    final Slf4jReporter reporter = Slf4jReporter.forRegistry(registry)
                                                .outputTo(LoggerFactory.getLogger("com.example.metrics"))
                                                .convertRatesTo(TimeUnit.SECONDS)
                                                .convertDurationsTo(TimeUnit.MILLISECONDS)
                                                .build();
    reporter.start(1, TimeUnit.MINUTES);
    • Ganglia, using GangliaReporter from metrics-ganglia
    final GMetric ganglia = new GMetric("ganglia.example.com", 8649, UDPAddressingMode.MULTICAST, 1);
    final GangliaReporter reporter = GangliaReporter.forRegistry(registry)
                                                    .convertRatesTo(TimeUnit.SECONDS)
                                                    .convertDurationsTo(TimeUnit.MILLISECONDS)
                                                    .build(ganglia);
    reporter.start(1, TimeUnit.MINUTES);
    • Graphite, using GraphiteReporter from metrics-graphite

    MetricSet

    可以将一组Metric组织成一组便于重用。


    final Graphite graphite = new Graphite(new InetSocketAddress("graphite.example.com", 2003));
    final GraphiteReporter reporter = GraphiteReporter.forRegistry(registry)
                                                      .prefixedWith("web1.example.com")
                                                      .convertRatesTo(TimeUnit.SECONDS)
                                                      .convertDurationsTo(TimeUnit.MILLISECONDS)
                                                      .filter(MetricFilter.ALL)
                                                      .build(graphite);
    reporter.start(1, TimeUnit.MINUTES);

    一些模块

      • metrics-json提供了json格式的序列化。
        以及为其它库提供度量的能力
      • metrics-ehcache
      • metrics-httpclient
      • metrics-jdbi
      • metrics-jersey
      • metrics-jetty
      • metrics-log4j
      • metrics-logback
      • metrics-jvm
      • metrics-servlet 注意不是metrics-servlets

    第三方库

    这里重点介绍一下Metrics for Spring

    Metrics for Spring

    这个库为Spring增加了Metric库, 提供基于XML或者注解方式。

    • 可以使用注解创建metric和代理类。 @Timed, @Metered, @ExceptionMetered, @Counted
    • 为注解了 @Gauge 和 @CachedGauge的bean注册Gauge
    • 为@Metric注解的字段自动装配
    • 注册HealthCheck
    • 通过XML配置产生报表
    • 通过XML注册metric和metric组

    你需要在pom.xml加入

    <dependency>
        <groupId>com.ryantenney.metrics</groupId>
        <artifactId>metrics-spring</artifactId>
        <version>3.0.1</version>
    </dependency>

    基本用法

    1. XML风格的配置
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:metrics="http://www.ryantenney.com/schema/metrics"
           xsi:schemaLocation="
               http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
               http://www.ryantenney.com/schema/metrics
               http://www.ryantenney.com/schema/metrics/metrics-3.0.xsd">
        <!-- Registry should be defined in only one context XML file -->
        <metrics:metric-registry id="metrics" />
        <!-- annotation-driven must be included in all context files -->
        <metrics:annotation-driven metric-registry="metrics" />
        <!-- (Optional) Registry should be defined in only one context XML file -->
        <metrics:reporter type="console" metric-registry="metrics" period="1m" />
        <!-- (Optional) The metrics in this example require the metrics-jvm jar-->
        <metrics:register metric-registry="metrics">
            <bean metrics:name="jvm.gc" class="com.codahale.metrics.jvm.GarbageCollectorMetricSet" />
            <bean metrics:name="jvm.memory" class="com.codahale.metrics.jvm.MemoryUsageGaugeSet" />
            <bean metrics:name="jvm.thread-states" class="com.codahale.metrics.jvm.ThreadStatesGaugeSet" />
            <bean metrics:name="jvm.fd.usage" class="com.codahale.metrics.jvm.FileDescriptorRatioGauge" />
        </metrics:register>
        <!-- Beans and other Spring config -->
    </beans>
    1. java注解的方式
    import java.util.concurrent.TimeUnit;
    import org.springframework.context.annotation.Configuration;
    import com.codahale.metrics.ConsoleReporter;
    import com.codahale.metrics.MetricRegistry;
    import com.codahale.metrics.SharedMetricRegistries;
    import com.ryantenney.metrics.spring.config.annotation.EnableMetrics;
    import com.ryantenney.metrics.spring.config.annotation.MetricsConfigurerAdapter;
    @Configuration
    @EnableMetrics
    public class SpringConfiguringClass extends MetricsConfigurerAdapter {
        @Override
        public void configureReporters(MetricRegistry metricRegistry) {
            ConsoleReporter
                .forRegistry(metricRegistry)
                .build()
                .start(1, TimeUnit.MINUTES);
        }
    }


    展开全文
  • Metrics介绍

    万次阅读 2018-07-09 10:58:10
    Metrics可以为你的代码的运行提供无与伦比的洞察力。作为一款监控指标的度量类库,它提供了很多模块可以为第三方库或者应用提供辅助统计信息, 比如Jetty, Logback, Log4j, Apache HttpClient, Ehcache, JDBI, ...

    Metrics可以为你的代码的运行提供无与伦比的洞察力。作为一款监控指标的度量类库,它提供了很多模块可以为第三方库或者应用提供辅助统计信息, 比如Jetty, Logback, Log4j, Apache HttpClient, Ehcache, JDBI, Jersey, 它还可以将度量数据发送给Ganglia和Graphite以提供图形化的监控。

    Metrics提供了Gauge、Counter、Meter、Histogram、Timer等度量工具类以及Health Check功能。

    引用Metric库

    将metrics-core加入到maven pom.xml中:

    复制代码
    <dependencies>
        <dependency>
            <groupId>com.codahale.metrics</groupId>
            <artifactId>metrics-core</artifactId>
            <version>${metrics.version}</version>
        </dependency>
    </dependencies>
    复制代码

    metrics.version 设置为metrics最新的版本。
    现在你可以在你的程序代码中加入一些度量了。

    Registry

    Metric的中心部件是MetricRegistry。 它是程序中所有度量metric的容器。让我们接着在代码中加入一行:

    final MetricRegistry metrics = new MetricRegistry();

    Gauge (仪表)

    Gauge代表一个度量的即时值。 当你开汽车的时候, 当前速度是Gauge值。 你测体温的时候, 体温计的刻度是一个Gauge值。 当你的程序运行的时候, 内存使用量和CPU占用率都可以通过Gauge值来度量。
    比如我们可以查看一个队列当前的size。

    复制代码
    public class QueueManager {
        private final Queue queue;
        public QueueManager(MetricRegistry metrics, String name) {
            this.queue = new Queue();
            metrics.register(MetricRegistry.name(QueueManager.class, name, "size"),
                             new Gauge<Integer>() {
                                 @Override
                                 public Integer getValue() {
                                     return queue.size();
                                 }
                             });
        }
    }
    复制代码

    registry 中每一个metric都有唯一的名字。 它可以是以.连接的字符串。 如"things.count" 和 "com.colobu.Thing.latency"。 MetricRegistry 提供了一个静态的辅助方法用来生成这个名字:

    MetricRegistry.name(QueueManager.class, "jobs", "size")

    生成的name为com.colobu.QueueManager.jobs.size

    实际编程中对于队列或者类似队列的数据结构,你不会简单的度量queue.size(), 因为在java.util和java.util.concurrent包中大部分的queue的#size是O(n),这意味的调用此方法会有性能的问题, 更深一步,可能会有lock的问题。

    RatioGauge可以计算两个Gauge的比值。 Meter和Timer可以参考下面的代码创建。下面的代码用来计算计算命中率 (hit/call)。

    复制代码
    public class CacheHitRatio extends RatioGauge {
        private final Meter hits;
        private final Timer calls;
        public CacheHitRatio(Meter hits, Timer calls) {
            this.hits = hits;
            this.calls = calls;
        }
        @Override
        public Ratio getValue() {
            return Ratio.of(hits.oneMinuteRate(),
                            calls.oneMinuteRate());
        }
    }
    复制代码

    CachedGauge可以缓存耗时的测量。DerivativeGauge可以引用另外一个Gauage。

    Counter (计数器)

    Counter是一个AtomicLong实例, 可以增加或者减少值。 例如,可以用它来计数队列中加入的Job的总数。 

    复制代码
    private final Counter pendingJobs = metrics.counter(name(QueueManager.class, "pending-jobs"));
    public void addJob(Job job) {
        pendingJobs.inc();
        queue.offer(job);
    }
    public Job takeJob() {
        pendingJobs.dec();
        return queue.take();
    }
    复制代码

    和上面Gauage不同,这里我们使用的是metrics.counter方法而不是metrics.register方法。 使用metrics.counter更简单。

    Meter ()

    Meter用来计算事件的速率。 例如 request per second。 还可以提供1分钟,5分钟,15分钟不断更新的平均速率。

    private final Meter requests = metrics.meter(name(RequestHandler.class, "requests"));
    public void handleRequest(Request request, Response response) {
        requests.mark();
        // etc
    }

    Histogram (直方图)

    Histogram可以为数据流提供统计数据。 除了最大值,最小值,平均值外,它还可以测量 中值(median),百分比比如XX%这样的Quantile数据 。

    private final Histogram responseSizes = metrics.histogram(name(RequestHandler.class, "response-sizes");
    public void handleRequest(Request request, Response response) {
        // etc
        responseSizes.update(response.getContent().length);
    }

    这个例子用来统计response的字节数。
    Metrics提供了一批的Reservoir实现,非常有用。例如SlidingTimeWindowReservoir 用来统计最新N个秒(或其它时间单元)的数据。

    Timer (计时器)

    Timer用来测量一段代码被调用的速率和用时。

    复制代码
    private final Timer responses = metrics.timer(name(RequestHandler.class, "responses"));
    public String handleRequest(Request request, Response response) {
        final Timer.Context context = responses.time();
        try {
            // etc;
            return "OK";
        } finally {
            context.stop();
        }
    }
    复制代码

    这段代码用来计算中间的代码用时以及request的速率。

    Health Check (健康检查)

    Metric还提供了服务健康检查能力, 由metrics-healthchecks模块提供。
    先创建一个HealthCheckRegistry实例。

    final HealthCheckRegistry healthChecks = new HealthCheckRegistry();

    再实现一个HealthCheck子类, 用来检查数据库的状态。

    复制代码
    public class DatabaseHealthCheck extends HealthCheck {
        private final Database database;
        public DatabaseHealthCheck(Database database) {
            this.database = database;
        }
        @Override
        public HealthCheck.Result check() throws Exception {
            if (database.isConnected()) {
                return HealthCheck.Result.healthy();
            } else {
                return HealthCheck.Result.unhealthy("Cannot connect to " + database.getUrl());
            }
        }
    }
    复制代码

    注册一下。

    healthChecks.register("mysql", new DatabaseHealthCheck(database));

    最后运行健康检查并查看检查结果。

    复制代码
    final Map<String, HealthCheck.Result> results = healthChecks.runHealthChecks();
    for (Entry<String, HealthCheck.Result> entry : results.entrySet()) {
        if (entry.getValue().isHealthy()) {
            System.out.println(entry.getKey() + " is healthy");
        } else {
            System.err.println(entry.getKey() + " is UNHEALTHY: " + entry.getValue().getMessage());
            final Throwable e = entry.getValue().getError();
            if (e != null) {
                e.printStackTrace();
            }
        }
    }
    复制代码

    Metric内置一个ThreadDeadlockHealthCheck, 它使用java内置的线程死锁检查方法来检查程序中是否有死锁。

    JMX报表

    通过JMX报告Metric。

    final JmxReporter reporter = JmxReporter.forRegistry(registry).build();
    reporter.start();

    一旦启动, 所有registry中注册的metric都可以通过JConsole或者VisualVM查看 (通过MBean插件)。

    HTTP报表

    Metric也提供了一个servlet (AdminServlet)提供JSON风格的报表。它还提供了单一功能的servlet (MetricsServlet, HealthCheckServlet, ThreadDumpServlet, PingServlet)。
    你需要在pom.xml加入metrics-servlets。

    <dependency>
        <groupId>com.codahale.metrics</groupId>
        <artifactId>metrics-servlets</artifactId>
        <version>${metrics.version}</version>
    </dependency>

    其它报表

    除了JMX和HTTP, metric还提供其它报表。

    • STDOUT, using ConsoleReporter from metrics-core
    final ConsoleReporter reporter = ConsoleReporter.forRegistry(registry)
                                                    .convertRatesTo(TimeUnit.SECONDS)
                                                    .convertDurationsTo(TimeUnit.MILLISECONDS)
                                                    .build();
    reporter.start(1, TimeUnit.MINUTES);
    • CSV files, using CsvReporter from metrics-core
    final CsvReporter reporter = CsvReporter.forRegistry(registry)
                                            .formatFor(Locale.US)
                                            .convertRatesTo(TimeUnit.SECONDS)
                                            .convertDurationsTo(TimeUnit.MILLISECONDS)
                                            .build(new File("~/projects/data/"));
    reporter.start(1, TimeUnit.SECONDS);
    • SLF4J loggers, using Slf4jReporter from metrics-core
    final Slf4jReporter reporter = Slf4jReporter.forRegistry(registry)
                                                .outputTo(LoggerFactory.getLogger("com.example.metrics"))
                                                .convertRatesTo(TimeUnit.SECONDS)
                                                .convertDurationsTo(TimeUnit.MILLISECONDS)
                                                .build();
    reporter.start(1, TimeUnit.MINUTES);
    • Ganglia, using GangliaReporter from metrics-ganglia
    final GMetric ganglia = new GMetric("ganglia.example.com", 8649, UDPAddressingMode.MULTICAST, 1);
    final GangliaReporter reporter = GangliaReporter.forRegistry(registry)
                                                    .convertRatesTo(TimeUnit.SECONDS)
                                                    .convertDurationsTo(TimeUnit.MILLISECONDS)
                                                    .build(ganglia);
    reporter.start(1, TimeUnit.MINUTES);
    • Graphite, using GraphiteReporter from metrics-graphite

    MetricSet

    可以将一组Metric组织成一组便于重用。

    复制代码
    final Graphite graphite = new Graphite(new InetSocketAddress("graphite.example.com", 2003));
    final GraphiteReporter reporter = GraphiteReporter.forRegistry(registry)
                                                      .prefixedWith("web1.example.com")
                                                      .convertRatesTo(TimeUnit.SECONDS)
                                                      .convertDurationsTo(TimeUnit.MILLISECONDS)
                                                      .filter(MetricFilter.ALL)
                                                      .build(graphite);
    reporter.start(1, TimeUnit.MINUTES);
    复制代码

    一些模块

      • metrics-json提供了json格式的序列化。
        以及为其它库提供度量的能力
      • metrics-ehcache
      • metrics-httpclient
      • metrics-jdbi
      • metrics-jersey
      • metrics-jetty
      • metrics-log4j
      • metrics-logback
      • metrics-jvm
      • metrics-servlet 注意不是metrics-servlets

    第三方库

    这里重点介绍一下Metrics for Spring

    Metrics for Spring

    这个库为Spring增加了Metric库, 提供基于XML或者注解方式。

    • 可以使用注解创建metric和代理类。 @Timed, @Metered, @ExceptionMetered, @Counted
    • 为注解了 @Gauge 和 @CachedGauge的bean注册Gauge
    • 为@Metric注解的字段自动装配
    • 注册HealthCheck
    • 通过XML配置产生报表
    • 通过XML注册metric和metric组

    你需要在pom.xml加入

    <dependency>
        <groupId>com.ryantenney.metrics</groupId>
        <artifactId>metrics-spring</artifactId>
        <version>3.0.1</version>
    </dependency>

    基本用法

    1. XML风格的配置
    复制代码
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:metrics="http://www.ryantenney.com/schema/metrics"
           xsi:schemaLocation="
               http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
               http://www.ryantenney.com/schema/metrics
               http://www.ryantenney.com/schema/metrics/metrics-3.0.xsd">
        <!-- Registry should be defined in only one context XML file -->
        <metrics:metric-registry id="metrics" />
        <!-- annotation-driven must be included in all context files -->
        <metrics:annotation-driven metric-registry="metrics" />
        <!-- (Optional) Registry should be defined in only one context XML file -->
        <metrics:reporter type="console" metric-registry="metrics" period="1m" />
        <!-- (Optional) The metrics in this example require the metrics-jvm jar-->
        <metrics:register metric-registry="metrics">
            <bean metrics:name="jvm.gc" class="com.codahale.metrics.jvm.GarbageCollectorMetricSet" />
            <bean metrics:name="jvm.memory" class="com.codahale.metrics.jvm.MemoryUsageGaugeSet" />
            <bean metrics:name="jvm.thread-states" class="com.codahale.metrics.jvm.ThreadStatesGaugeSet" />
            <bean metrics:name="jvm.fd.usage" class="com.codahale.metrics.jvm.FileDescriptorRatioGauge" />
        </metrics:register>
        <!-- Beans and other Spring config -->
    </beans>

    1. java注解的方式

    import java.util.concurrent.TimeUnit;
    import org.springframework.context.annotation.Configuration;
    import com.codahale.metrics.ConsoleReporter;
    import com.codahale.metrics.MetricRegistry;
    import com.codahale.metrics.SharedMetricRegistries;
    import com.ryantenney.metrics.spring.config.annotation.EnableMetrics;
    import com.ryantenney.metrics.spring.config.annotation.MetricsConfigurerAdapter;
    @Configuration
    @EnableMetrics
    public class SpringConfiguringClass extends MetricsConfigurerAdapter {
        @Override
        public void configureReporters(MetricRegistry metricRegistry) {
            ConsoleReporter
                .forRegistry(metricRegistry)
                .build()
                .start(1, TimeUnit.MINUTES);
        }
    }
    展开全文
  • Metrics,入门到应用

    2019-09-06 10:34:32
    Metrics
  • Metrics应用监控详细介绍与使用说明

    千次阅读 2019-07-10 16:16:47
    Metrics是个很好的选择。java、python、go均可支持。 Metrics可以为你的代码的运行提供无与伦比的洞察力。作为一款监控指标的度量类库,它提供了很多模块可以为第三方库或者应用提供辅助统计信息, 比如Jetty, ...
  • metrics-server最新版本有坑,慎用

    千次阅读 2019-05-28 14:36:00
    参考文档:... 版本:metrics-server-amd64:v0.3.3 addon-resizer:1.8.4 [root@master metrics]# vim metrics-server-deployment.yaml 查看: 莫名其妙的一对报错,不错最终搞好了。 毫...
  • metrics-server

    2019-05-06 01:40:00
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • Metrics监控

    千次阅读 2019-04-08 15:01:34
    Metrics是一个给JAVA服务的各项指标提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控,同时,Metrics能够很好的跟Ganlia、Graphite结合,方便的提供图形化接口。基本使用...
  • metrics入门:API性能监控

    万次阅读 2018-07-01 11:07:03
    Metrics,我们听到的太多了,熟悉大数据系统的不可能没听说过metrics,当我们需要为某个系统某个服务做监控、做统计,就需要用到Metrics。 举个例子,一个图片压缩服务: 每秒钟的请求数是多少(TPS)?平均每个...
  • metrics

    千次阅读 2016-10-28 16:00:15
    对于分布式软件系统来说Metrics已经成为了不可缺少的组成部分,通过它我们可以了解系统的运行状况、健康状况、性能状况,通过对历史数据的分析,也可以帮助我们发现系统缺陷以及避免系统不稳定的发生。比如通过JVM...
  • Metrics

    2018-06-06 11:11:00
    Metrics is a Java library which gives you unparalleled insight into what your code does in production. User Manual This goal of this document is to provide you with all the information required to e...
  • Metrics 入门教程

    万次阅读 2017-04-25 13:54:25
    Metrics,谷歌翻译就是度量的意思。当我们需要为某个系统某个服务做监控、做统计,就需要用到Metrics。 举个栗子,一个图片压缩服务: 每秒钟的请求数是多少(TPS)? 平均每个请求处理的时间? 请求处理的最长...
  • Java Metrics

    千次阅读 2014-10-24 10:33:52
    Java Metrics Java Metrics是一个功能比较强大的java统计库,它的输出组件也很强大,帮我们做好了: 输出到Ganglia输出到控制台输出到JMX输出Json 详细见:dropwizard.github.io/metrics/ 依赖 添加...
  • JAVA Metrics度量工具 - Metrics Core 翻译

    万次阅读 2012-12-20 22:04:11
    Metrics核心 翻译自Metrics官方文档: http://metrics.codahale.com/manual/core/ JAVA Metrics是一个用于度量的一个JAVA的类库,使用请参见 Java Metric使用介绍1 > ...
  • codahale Metrics

    千次阅读 2017-05-10 15:52:31
    Metrics可以为你的代码的运行提供无与伦比的洞察力。作为一款监控指标的度量类库,它提供了很多模块可以为第三方库或者应用提供辅助统计信息, 比如Jetty, Logback, Log4j, Apache HttpClient, Ehcache, JDBI, ...
  • metrics小常识

    万次阅读 2016-07-13 17:27:09
    Metrics,我们听到的太多了,熟悉大数据系统的不可能没听说过metrics,当我们需要为某个系统某个服务做监控、做统计,就需要用到Metrics。 举个例子,一个图片压缩服务: 每秒钟的请求数是多少(TPS)?平均每...
  • springboot的metrics

    2016-08-30 01:26:30
    类结构 PublicMetricsAutoConfiguration @Configuration @AutoConfigureBefore(EndpointAutoConfiguration.class) @AutoConfigureAfter({ DataSourceAutoConfiguration.class, CacheAut...
  • Yammer Metrics的使用

    2018-12-22 10:31:45
    最近用到的某个框架,其官网提到利用Yammer Metrics来测量系统运行状态,需要对其统计的具体参数有个基本的了解,OK,那就需要弄清几个简单的问题: Yammer Metrics是什么? Yammer Metrics收集哪些数据? Yammer...
  • Ambari Metrics 详解

    2018-11-30 15:55:23
    其中 Ambari Metrics System 为第三方服务以及集群机器提供了性能相关的监察功能。本文主要讲解 Ambari Metrics 框架的原理,以及如何集成该系统与第三方服务。 Ambari 现状 Ambari 最新的发行版已经到了 2.2.1 的...

空空如也

1 2 3 4 5 ... 20
收藏数 134,914
精华内容 53,965
关键字:

Metrics