关于metrics:微服务性能监控系列基于Metrics的实时监控系统

原文链接 Metrics是一个提供服务性能检测工具的Java类库,它提供了功能强大的性能指标工具库用于度量生产环境中的各要害组件性能。度量类型Metrics提供了以下几种根本的度量类型: Gauge:用于提供自定义度量。Counter:计数器,实质是一个java.util.concurrent.atomic.LongAdder。Histogram:直方图数据。Meter:统计零碎中某一事件的响应速率,如TPS、QPS。该项指标值间接反馈零碎以后的解决能力Timer:计时器,是Meter和Histogram的联合,能够统计接口申请速率和响应时长。GaugeGauge是对一项值的刹时度量。咱们能够通过实现Gauge接口来依据业务场景自定义度量。 例如,想要度量队列中处于期待状态的作业数量: public class QueueManager { private final Queue queue; public QueueManager(MetricRegistry metrics, String name) { this.queue = new Queue(); // 通过MetricRegistry 的register办法注册Gauge度量 metrics.register(MetricRegistry.name(QueueManager.class, name, "size"), new Gauge<Integer>() { @Override public Integer getValue() { return queue.size(); } }); }}官网目前提供了以下几种Gauge实现: CounterCounter是一个惯例计数器,用于对某项指标值进行累加或者递加操作。 Counter实质是一个java.util.concurrent.atomic.LongAdder,在多线程同时更新计数器的场景下,当并发量较大时,LongAdder比AtomicLong具备更高的吞吐量,当然空间资源耗费也更大一些。 final Counter evictions = registry.counter(name(SessionStore.class, "cache-evictions"));evictions.inc();evictions.inc(3);evictions.dec();evictions.dec(2);HistogramsHistogram反馈的是数据流中的值的散布状况。蕴含最小值、最大值、平均值、中位数、p75、p90、p95、p98、p99以及p999数据分布状况。 private final Histogram responseSizes = metrics.histogram(name(RequestHandler.class, "response-sizes"));public void handleRequest(Request request, Response response) { // etc responseSizes.update(response.getContent().length);}Histogram计算分位数的办法是先对整个数据集进行排序,而后取排序后的数据集中特定地位的值(比方p99就是取倒序1%地位的值)。这种形式适宜于小数据集或者批处理零碎,不适用于要求高吞吐量、低延时的服务。 对于数据量较大,系统对吞吐量、时延要求较大的场景,咱们能够采纳抽样的形式获取数据。通过动静地抽取程序运行过程中的可能代表零碎实在运行状况的一小部分数据来实现对整个零碎运行指标的近似度量,这种办法叫做蓄水池算法(reservoir sampling)。 Metrics中提供了各式各样的Reservoir实现: ...

December 31, 2021 · 2 min · jiezi

机器学习Rank-中使用的指标及示例代码

作者:LogM 本文原载于 https://segmentfault.com/u/logm/articles ,不允许转载~ 1. P@KP@K,代表前 K 个预测值中有多少的准确率 (Precision)。 比如,一个模型输出了一组排序,其输出的好坏依次为:好、坏、好、坏、好。 那么, Prec@3 = 2/3 Prec@4 = 2/4 Prec@5 = 3/5 def precision(gt, pred, K): """ Computes the average precision. gt: list, ground truth, all relevant docs' index pred: list, prediction """ hit_num = len(gt & set(pred[:K])) return float(1.0 * hit_num / K)2. MAPAP 是 average precision 的缩写,计算方式是把所有相关文档的 P@K 求平均。 借用上面的例子,一个模型输出了一组排序,依次为:好的结果、坏的结果、好的结果、坏的结果、好的结果。 那么, AP = (1/1 + 2/3 + 3/5) / 3 = 0.76 ...

July 6, 2019 · 2 min · jiezi

Prometheus hotspot监控指标解读

简介Prometheus 是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,由工作在 SoundCloud 的 google 前员工在 2012 年创建,作为社区开源项目进行开发,并于 2015 年正式发布。2016 年,Prometheus 正式加入 Cloud Native Computing Foundation,成为受欢迎度仅次于 Kubernetes 的项目。特性强大的多维度数据模型:时间序列数据通过 metric 名和键值对来区分。所有的 metrics 都可以设置任意的多维标签。数据模型更随意,不需要刻意设置为以点分隔的字符串。可以对数据模型进行聚合,切割和切片操作。支持双精度浮点类型,标签可以设为全 unicode。灵活而强大的查询语句(PromQL):在同一个查询语句,可以对多个 metrics 进行乘法、加法、连接、取分数位等操作。易于管理: Prometheus server 是一个单独的二进制文件,可直接在本地工作,不依赖于分布式存储。高效:平均每个采样点仅占 3.5 bytes,且一个 Prometheus server 可以处理数百万的 metrics。使用 pull 模式采集时间序列数据,这样不仅有利于本机测试而且可以避免有问题的服务器推送坏的 metrics。可以采用 push gateway 的方式把时间序列数据推送至 Prometheus server 端。可以通过服务发现或者静态配置去获取监控的 targets。有多种可视化图形界面。易于伸缩。架构相关概念hotspot 监控Java Hotspot虚拟机监控指标收集BufferPoolsExportsJVM缓冲区监控指标。 bufferPool指标是从MBean获取的,BufferPoolsExports构造函数:public BufferPoolsExports() { try { final Class<?> bufferPoolMXBeanClass = Class.forName(“java.lang.management.BufferPoolMXBean”); bufferPoolMXBeans.addAll(accessBufferPoolMXBeans(bufferPoolMXBeanClass)); getName = bufferPoolMXBeanClass.getMethod(“getName”); getMemoryUsed = bufferPoolMXBeanClass.getMethod(“getMemoryUsed”); getTotalCapacity = bufferPoolMXBeanClass.getMethod(“getTotalCapacity”); getCount = bufferPoolMXBeanClass.getMethod(“getCount”); } catch (ClassNotFoundException e) { LOGGER.fine(“BufferPoolMXBean not available, no metrics for buffer pools will be exported”); } catch (NoSuchMethodException e) { LOGGER.fine(“Can not get necessary accessor from BufferPoolMXBean: " + e.getMessage()); }}获取Mean类对象获取可访问的MBean实例并添加到成员变量中获取getName方法Method对象(缓冲池名称)获取getMemoryUsed方法的Method对象(估算的jvm已使用内存大小)获取getTotalCapacity方法的Method对象(预估的总的缓冲池大小)获取getCount方法的Method对象(缓冲池中大致的数量)collect()方法返回buffer pool指标收集器收集的所有指标信息。jvm_buffer_pool_used_bytesjvm缓冲区使用情况,包括Code Cache(编译后的代码缓存,不同版本的jvm默认大小不同)、PS Old Gen(老年代)、PS Eden Space(伊甸园)、PS Survivor Space(幸存者)、PS Perm Gen(永久代)。jvm_buffer_pool_capacity_bytes给定jvm的估算缓冲区大小。这个metrics数据没有收集到,可能和jvm的版本有关,部署服务器使用的是jdk 6。jvm_buffer_pool_used_buffers给定jvm的已使用缓冲区大小。这个metrics没有收集到,可能和jvm的版本有关,部署服务器使用的是jdk 6。ClassLoadingExports提供jvm类加载指标。jvm类加载指标数据由ClassLoadingMXBean提供。jvm_classes_loaded当前jvm已加载类数量。 jvm_classes_loaded_total从jvm运行开始加载的类的数量,这是一个Counter指标,递增。jvm_classes_unloaded_totaljvm运行后卸载的类数量,这是一个Counter指标。生产环境一直是0。GarbageCollectorExports提供jvm 垃圾收集器指标,指标数据有GarbageCollectorMXBean列表提供。jvm_gc_collection_seconds这是一个Summary指标,与Histogram类似,可以对指标数据进行采样。MemoryAllocationExports内存分配情况指标,这个指标因java版本不兼容而没有做监控。MemoryPoolsExportsjvm 内存区域指标。jvm_memory_bytes_usedjvm已用内存区域。jvm_memory_bytes_committedCommitted (bytes) of a given JVM memory areajvm_memory_bytes_maxjvm内存区域的最大字节数jvm_memory_bytes_initjvm内存区域的初始化字节数jvm_memory_pool_bytes_usedjvm内存池使用情况jvm_memory_pool_bytes_committedCommitted bytes of a given JVM memory pool.jvm_memory_pool_bytes_maxjvm内存池最大数jvm_memory_pool_bytes_initjvm内存池初始化数ThreadExportsjvm线程区域监控。jvm_threads_currentjvm当前线程数。jvm_threads_daemonjvm后台线程数。jvm_threads_peakjvm线程峰值jvm_threads_started_totaljvm总启动线程数量,Counter指标。jvm_threads_deadlocked死锁线程数量jvm_threads_deadlocked_monitorCycles of JVM-threads that are in deadlock waiting to acquire object monitorsjvm_threads_state当前线程的状态VersionInfoExportsjvm版本信息jvm_info版本信息,可以看到生产环境使用的是:1.6.0.29-b11StandardExports所有prometheus 客户端共有的标准指标。process_cpu_seconds_total用户和系统的总cpu使用时间process_start_time_secondsStart time of the process since unix epoch in secondsprocess_open_fds打开的文件描述符数量process_max_fds看支持打开的最大文件描述符数量PromQLtodo参考资料Prometheus 入门与实践 ...

April 20, 2019 · 1 min · jiezi

探秘 Dubbo 的度量统计基础设施 - Dubbo Metrics

对服务进行实时监控,了解服务当前的运行指标和健康状态,是微服务体系中不可或缺的环节。Metrics 作为微服务的重要组件,为服务的监控提供了全面的数据基础。近日,Dubbo Metrics 发布了2.0.1版本,本文将为您探秘 Dubbo Metrics 的起源,及 7 大改进。Dubbo Metrics 的起源Dubbo Metrics(原Alibaba Metrics)是阿里巴巴集团内部广泛使用的度量埋点基础类库,有 Java 和 Node.js 两个版本,目前开源的是 Java 版本。内部版本诞生于2016年,经历过近三年的发展和双十一的考验,已经成为阿里巴巴集团内部微服务监控度量的事实标准,覆盖了从系统、JVM、中间件到应用各层的度量,并且在命名规则、数据格式、埋点方式和计算规则等方面,形成了一套统一的规范。Dubbo Metrics 的代码是基于 Dropwizard Metrics 衍生而来,版本号是3.1.0,当时决定 fork 到内部进行定制化开发的主要原因有两个。一是社区的发展非常缓慢,3.1.0之后的第3年才更新了下一个版本,我们担心社区无法及时响应业务需求;另一个更重要的原因是当时的3.1.0还不支持多维度的 Tag,只能基于 a.b.c 这样传统的指标命名方法,这就意味着 Dropwizard Metrics 只能在单维度进行度量。然后,在实际的业务过程中,很多维度并不能事先确定,而且在大规模分布式系统下,数据统计好以后,需要按照各种业务维度进行聚合,例如按机房、分组进行聚合,当时的 Dropwizard 也无法满足,种种原因使得我们做了一个决定,内部fork一个分支进行发展。Dubbo Metrics 做了哪些改进相对于 Dropwizard Metrics ,Dubbo Metrics 做的改进主要有以下几个方面:一、引入基于 Tag 的命名规范如前文所描述,多维度 Tag 在动态埋点,数据聚合等方面相对于传统的 metric 命名方法具有天然的优势,这里举一个例子,要统计一个 Dubbo 服务 DemoService 调用次数和 RT,假设这个服务叫做 DemoService,那么按照传统的命名方式,通常会命名为dubbo.provider.DemoService.qps和dubbo.provider.DemoService.rt。如果只有1个服务的话,这种方法并无太大的问题,但是如果一个微服务应用同时提供了多个 Dubbo 的 Service,那么要聚合统计所有Service 的 QPS 和 RT 就比较困难了。由于 metric 数据具有天然的时间序列属性,因此数据非常适合存储到时间序列数据库当中,要统计所有的 Dubbo 服务的 QPS,那么就需要查找所有名称为dubbo.provider..qps的指标,然后对他们进行求和。由于涉及到模糊搜索,这对于绝大部分数据库的实现都是比较费时的。如果要统计更加详细的 Dubbo 方法级别的 QPS 和 RT,那么实现上就会更加复杂了。Metric Key:用英文点号分隔的字符串,来表征这个指标的含义Metric Tag:定义了这个指标的不同切分维度,可以是单个,也可以是多个;tag key:用于描述维度的名称;tag value:用于描述维度的值;同时,考虑到一个公司所有微服务产生的所有指标,都会统一汇总到同一个平台进行处理,因此Metric Key 的命名方式为应当遵循同一套规范,避免发生命名冲突,其格式为appname.category[.subcategory].suffixappname: 应用名;category: 这个指标在该应用下的分类,多个单词用’‘连接,字母采用小写;subcategory: 这个指标在该应用下的某个分类下的子分类,多个单词用’‘连接,字母采用小写;suffix: 这个关键的后缀描述了这个指标所度量的具体类型,可以是计数,速率,或者是分布;在上述例子中,同样的指标可以命名为dubbo.provider.service.qps{service=“DemoService”},其中前面部分的名称是固定的,不会变化,括号里面的Tag,可以动态变化,甚至增加更多的维度,例如增加 method 维度dubbo.provider.service.qps{service=“DemoService”,method=“sayHello”},也可以是机器的 IP、机房信息等。这样的数据存储是时间序列数据库亲和的,基于这些数据可以轻松实现任意维度的聚合,筛选等操作。P.s. 2017年12月底,Dropwizard Metrics4.0 开始支持 Tag,Dubbo Metrics 中 ag 的实现参考了Dropwizard。spring-boot 2.0中提供的 MicroMeter 和 Prometheus 也均已引入了 Tag 的概念。二、添加精准统计功能Dubbo Metrics 的精准统计是和 Dropwizard,或者其他开源项目埋点统计库实现不太一样的地方。下面分别通过时间窗口的选择和吞吐率统计方式这两个纬度进行阐述。在统计吞吐率(如 QPS)的时候,Dropwizard的实现方式是滑动窗口+指数加权移动平均,也就是所谓的EWMA,在时间窗口上只提供1分钟、5分钟、15分钟的选择。固定窗口 vs 滑动窗口在数据统计的时候,我们需要事先定义好统计的时间窗口,通常有两种确立时间窗口的方法,分别是固定窗口和滑动窗口。固定时间窗口指的是以绝对时间为参考坐标系,在一个绝对时间窗口内进行统计,无论何时访问统计数据,时间窗口不变;而滑动窗口则是以当前时间为参考系,从当前时间往前推一个指定的窗口大小进行统计,窗口随着时间,数据的变化而发生变化。固定窗口的优点在于:一是窗口不需要移动,实现相对简单;二是由于不同的机器都是基于相同的时间窗口,集群聚合起来比较容易,只需按照相同的时间窗口聚合即可。其缺点是:如果窗口较大,实时性会受到影响,无法立即得到当前窗口的统计信息。例如,如果窗口为1分钟,则必须等到当前1分钟结束,才能得到这1分钟内的统计信息。滑动窗口的优点在于实时性更好,在任意时刻,能都看到当前时刻往前推演一个时间窗口内统计好的信息。相对而言,由于不同机器的采集时刻不同,要把不同机器上的数据聚合到一起,则需要通过所谓的 Down-Sampling 来实现。即按照固定时间窗口把窗口内收集到的数据应用到某一个聚合函数上。举个例子来说,假设集群有5台机器,按照15秒的频率按照平均值进行 Down-Sampling,若在00:00~00:15的时间窗口内,在00:01,00:03,00:06,00:09,00:11各收集到一个指标数据,则把这5个点的加权平均认为是00:00这个点的经过 Down- Sampling 之后的平均值。但在我们的实践过程中,滑动窗口仍会遇到了以下问题:很多业务场景都要求精确的时间窗口的数据,比如在双11的时候,想知道双11当天0点第1秒创建了多少订单,这种时候 Dropwizard 的滑动窗口很明显就不适用了。Dropwizard 提供的窗口仅仅是分钟级,双11的场景下需要精确到秒级。集群数据聚合的问题,每台机器上的滑动时间窗口可能都不一样,数据采集的时间也有间隔,导致聚合的结果并不准确。为了解决这些问题,Dubbo Metrics 提供了 BucketCounter 度量器,可以精确统计整分整秒的数据,时间窗口可以精确到1秒。只要每台机器上的时间是同步的,那么就能保证集群聚合后的结果是准确的。同时也支持基于滑动窗口的统计。瞬时速率(Rate) vs 指数移动加权平均(EWMA)经过多年的实践,我们逐渐发现,用户在观察监控的时候,首先关注的其实是集群数据,然后才是单机数据。然而单机上的吞吐率其实并没有太大意义。怎么理解呢?比如有一个微服务,共有2台机器,某个方法在某一段时间内产生了5次调用,所花的时间分别是机器1上的[5,17],机器2上的[6,8,8](假设单位为毫秒)。如果要统计集群范围内的平均 RT,一种方法可以先统计单机上的平均 RT,然后统计整体的平均 RT,按照这种方法,机器1上平均 RT 为11ms,机器2的平均 RT 为7.33ms,两者再次平均后,得到集群平均 RT 为9.17ms,但实际的结果是这样吗?如果我们把机器1和机器2上的数据整体拉到一起整体计算的话,会发现实际的平均 RT 为(5+17+6+8+8)/5=8.8ms,两者相差很明显。而且考虑到计算浮点数的精度丢失,以及集群规模扩大,这一误差会愈加明显。因此,我们得出一个结论:单机上的吞吐率对于集群吞吐率的计算没有意义,仅在在单机维度上看才是有意义的。而 Dropwizard 提供的指数加权移动平均其实也是一种平均,同时考虑了时间的因素,认为距离当前时间越近,则数据的权重越高,在时间拉的足够长的情况下,例如15分钟,这种方式是有意义的。而通过观察发现,其实在较短的时间窗口内,例如1s、5s,考虑时间维度的权重并没有太大的意义。因此在内部改造的过程中,Dubbo Metrics 做了如下改进:提供瞬时速率计算,反应单机维度的情况,同时去掉了加权平均,采用简单平均的方式计算;为了集群聚合需要,提供了时间窗口内的总次数和总 RT 的统计,方便精确计算集群维度的吞吐率;三、极致性能优化在大促场景下,如何提升统计性能,对于 Dubbo Metrics 来说是一个重要话题。在阿里的业务场景下,某个统计接口的 QPS 可能达到数万,例如访问 Cache 的场景,因此这种情况下 metrics 的统计逻辑很可能成为热点,我们做了一些针对性的优化:高并发场景下,数据累加表现最好的就是java.util.concurrent.atomic.LongAdder,因此几乎所有的操作最好都会归结到对这个类的操作上。避免调用 LongAdder#reset当数据过期之后,需要对数据进行清理,之前的实现里面为了重用对象,使用了LongAdder#reset进行清空,但实测发现LongAdder#reset其实是一个相当耗费cpu的操作,因此选择了用内存换 CPU,当需要清理的时候用一个新的 LongAdder 对象来代替。去除冗余累加操作某些度量器的实现里面,有些统计维度比较多,需要同时更新多个 LongAdder,例如 Dropwizard Metrics的 meter 实现里面计算1分/5分/15分移动平均,每次需要更新3个 LongAdder,但实际上这3次更新操作是重复的,只需要更新一次就行了。RT为0时避免调用Add方法大多数场景下对 RT 的统计都以毫秒为单位,有些时候当 RT 计算出来小于1ms的时候,传给metrics的 RT 为0。当我们发现 JDK 原生的 LongAdder 并没有对add(0)这个操作做优化,即使输入为0,还是把逻辑都走一遍,本质上调用的是sun.misc.Unsafe.UNSAFE.compareAndSwapLong。如果这个时候,metrics 判断 RT 为0的时候不对计数器进行 Add 操作,那么可以节省一次 Add 操作。这对于并发度较高的中间件如分布式缓存很有帮助,在我们内部某个应用实测中发现,在30%的情况下,访问分布式缓存的 RT 都是0ms。通过这个优化可以节约大量无意义的更新操作。QPS 和 RT 合并统计只需要对一个Long的更新,即可实现同时对调用次数和时间进行统计,已经逼近理论上的极限。经过观测发现,通常对于中间件的某些指标,成功率都非常高,正常情况下都在100%。为了统计成功率,需要统计成功次数和总次数,这种情况下几乎一样多,这样造成了一定的浪费,白白多做了一次加法。而如果反过来,只统计失败的次数,只有当失败的情况才会更新计数器,这样能大大降低加法操作。事实上,如果我们把每一种情况进行正交拆分,例如成功和失败,这样的话,总数可以通过各种情况的求和来实现。这样能进一步确保一次调用只更新一次计数。但别忘了,除了调用次数,还有方法执行 RT 要统计。还能再降低吗?答疑是可以的!假设 RT 以毫秒为单位进行统计,我们知道1个 Long 有64个bits(实际上Java里面的Long是有符号的,所以理论上只有63个 bits 可用),而 metrics 的一个统计周期最多只统计60s的数据,这64个 bits 无论怎样用都是用不掉的。那能不能把这63个 bits 拆开来,同时统计 count 和 RT 呢?实际上是可以的。我们把一个 Long 的63个 bits 的高25位用来表示一个统计周期内的总 count,低38位用于表示总 RT。——————————————| 1 bit | 25 bit | 38 bit || signed bit | total count | total rt |——————————————当一次调用过来来的时候,假设传过来的 RT 是n,那么每次累加的数不是1,也不是n,而是1 * 2^38 + n这么设计主要有一下几个考虑:count是每调用一次加一,RT 是每调用一次加N的操作,如果 count 在高位的话,每次加一,实际是一个固定的常数,而如果rt放在高位的话,每次都加的内容不一样,所以每次都要计算一次;25 bits 最多可以表示 2^25 = 33554432 个数,所以1分钟以内对于方法调用的统计这种场景来说肯定是不会溢出的;RT 可能会比较大,所以低位给了38bits, 2^38=274877906944 基本也是不可能超的。如果真的overflow了怎么办? 由于前面分析过,几乎不可能overflow,因此这个问题暂时没有解决,留待后面在解决。无锁 BucketCounter在之前的代码中,BucketCounter 需要确保在多线程并发访问下保证只有一个线程对 Bucket 进行更新,因此使用了一个对象锁,在最新版本中,对 BucketCounter 进行了重新实现,去掉了原来实现中的锁,仅通过 AtomicReference 和 CAS 进行操作,本地测试发现性能又提升了15%左右。四、全面的指标统计Dubbo Metrics 全面支持了从操作系统,JVM,中间件,再到应用层面的各级指标,并且对统一了各种命名指标,可以做到开箱即用,并支持通过配置随时开启和关闭某类指标的收集。目前支持的指标,主要包括:操作系统支持Linux/Windows/Mac,包含CPU/Load/Disk/Net Traffic/TCP。JVM支持classload, GC次数和时间, 文件句柄,young/old区占用,线程状态, 堆外内存,编译时间,部分指标支持自动差值计算。中间件Tomcat: 请求数,失败次数,处理时间,发送接收字节数,线程池活跃线程数等;Druid: SQL 执行次数,错误数,执行时间,影响行数等;Nginx: 接受,活跃连接数,读,写请求数,排队数,请求QPS,平均 RT 等;更详细的指标可以参见这里, 后续会陆续添加对Dubbo/Nacos/Sentinel/Fescar等的支持。五、REST支持Dubbo Metrics 提供了基于 JAX-RS 的 REST 接口暴露,可以轻松查询内部的各种指标,既可以独立启动HTTP Server提供服务(默认提供了一个基于Jersey+ sun Http server的简单实现),也可以嵌入已有的HTTP Server进行暴露指标。具体的接口可以参考这里:https://github.com/dubbo/metrics/wiki/query-from-http六、单机数据落盘数据如果完全存在内存里面,可能会出现因为拉取失败,或者应用本身抖动,导致数据丢失的可能。为了解决该问题,metrics引入了数据落盘的模块,提供了日志方式和二进制方式两种方式的落盘。日志方式默认通过JSON方式进行输出,可以通过日志组件进行拉取和聚合,文件的可读性也比较强,但是无法查询历史数据;二进制方式则提供了一种更加紧凑的存储,同时支持了对历史数据进行查询。目前内部使用的是这种方式。七、易用性和稳定性优化将埋点的API和实现进行拆分,方便对接不用的实现,而用户无需关注;支持注解方式进行埋点;借鉴了日志框架的设计,获取度量器更加方便;增加Compass/FastCompass,方便业务进行常用的埋点,例如统计qps,rt,成功率,错误数等等指标;Spring-boot-starter,即将开源,敬请期待;支持指标自动清理,防止长期不用的指标占用内存;URL 指标收敛,最大值保护,防止维度爆炸,错误统计导致的内存。如何使用使用方式很简单,和日志框架的Logger获取方式一致。Counter hello = MetricManager.getCounter(“test”, MetricName.build(“test.my.counter”));hello.inc();支持的度量器包括:Counter(计数器)Meter(吞吐率度量器)Histogram(直方分布度量器)Gauge(瞬态值度量器)Timer(吞吐率和响应时间分布度量器)Compass(吞吐率, 响应时间分布, 成功率和错误码度量器)FastCompass(一种快速高效统计吞吐率,平均响应时间,成功率和错误码的度量器)ClusterHistogram(集群分位数度量器)后续规划提供Spring-boot starter支持Prometheus,Spring MicroMeter对接Dubbo,Dubbo 中的数据统计实现替换为 Dubbo Metrics在 Dubbo Admin 上展示各种 metrics 数据对接 Dubbo 生态中的其他组件,如Nacos, Sentinel, Fescar等参考资料Dubbo Metrics @Github:https://github.com/dubbo/metricsWiki:https://github.com/dubbo/metrics/wiki (持续更新)本文作者:望陶,GitHub ID @ralf0131,Apache Dubbo PPMC Member,Apache Tomcat PMCMember,阿里巴巴技术专家。子观,GitHub ID @min,Apache Dubbo Commiter,阿里巴巴高级开发工程师,负责 Dubbo Admin 和 Dubbo Metrics 项目的开发和社区维护。本文作者:中间件小哥阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

March 15, 2019 · 2 min · jiezi

Cortex:多租户、可横向扩展的Prometheus即服务

作者:Luc PerkinsPrometheus是用于监控和可观察性的标准开源解决方案之一。 Prometheus于2012年起源于SoundCloud,迅速获得广泛采用,后来成为首批CNCF项目之一,第二个毕业项目(仅次于Kubernetes)。它被许多具有前瞻性思维的公司用于生产,包括DigitalOcean、Fastly和Weaveworks等重量级公司,并拥有自己的年度会议PromCon。Prometheus:强大但有意地限制Prometheus之所以成功,部分原因是核心Prometheus服务器及其各种补充程序,如Alertmanager、Grafana和导出生态系统,形成了一个引人注目的端到端解决方案,解决了一个至关重要的难题。但是,Prometheus并没有提供你期望从一个成熟的“即服务”平台中获得的一些功能,例如多租户、身份验证和授权以及内置的长期存储。Cortex于9月作为沙箱项目加入CNCF,是一个开源的Prometheus即服务平台,旨在填补这些空白,从而提供完整、安全、多租户的Prometheus体验。我会在以下说很多关于Cortex的,首先,让我们短暂地游览更熟悉的Prometheus世界。为何选择Prometheus?作为CNCF开发者的倡导者,我有机会熟悉Prometheus社区和Prometheus作为工具(主要研究文档和Prometheus Playground)。由于各种原因,它的巨大成功对我来说并不奇怪:Prometheus实例易于部署和管理。我特别喜欢近乎即时的配置重新加载,以及所有Prometheus组件都提供静态二进制文件。Prometheus提供了简单易用的指标展示格式,可以轻松编写自己的指标导出器。这种格式甚至通过OpenMetrics项目(最近也加入了CNCF沙箱)变成了开放标准。Prometheus提供了简单,但功能强大的基于标签的查询语言PromQL,用于处理时间序列数据。我觉得PromQL非常直观。为何选择Prometheus即服务?早期,Prometheus的核心工程师做出明智的决定,让Prometheus保持简洁和可组合。从一开始,Prometheus设计成可以很好地完成一小部分工作,并与其他可选组件无缝协作(而不是让Prometheus负担过重,增加了一系列硬编码功能和集成)。以下是Prometheus设计范围外的一些内容:长期存储 - 单个Prometheus实例提供持久存储时间序列数据,但它们不能作为分布式数据存储系统,不提供像具有跨节点复制和自动修复等功能。这意味着,耐久性保证仅限于单台机器。幸运的是,Prometheus提供了一个远程写入API,可用于将时间序列数据传输到其他系统。全局数据视图 - 如上面要点所述,Prometheus实例充当隔离数据存储单元。Prometheus实例可以联邦,但这会给Prometheus设置增加很多复杂性,而且Prometheus不是设计为分布式数据库。这意味着,没有简单的途径来实现时间序列数据的单一,一致的“全局”视图。多租户 - Prometheus本身没有的租户概念。这意味着,它无法对特定于租户的数据访问和资源使用配额等事物,提供任何形式的细粒度控制。为何选择Cortex?作为Prometheus即服务平台,Cortex充分填补所有这些关键缺口,为即使是最苛刻的监控和可观察性使用案例,提供了完整的开箱即用解决方案。它支持四种开箱即用的长期存储系统:AWS DynamoDB、AWS S3、Apache Cassandra和Google Cloud Bigtable。它提供了Prometheus时间序列数据的全局视图,其中包括长期存储中的数据,极大地扩展了PromQL用于分析目的的有用性。它的核心支持多租户。通过Cortex的所有Prometheus指标都与特定租户相关联。Cortex的架构Cortex具有基于服务的设计,其基本功能分为单个用途组件,可以独立扩展:Distributor - 使用Prometheus的远程写入API处理由Prometheus实例写入Cortex的时间序列数据。传入数据会自动复制和分片,并且并行发送到多个Cortex Ingester。Ingester - 从distributor节点接收时间序列数据,然后将该数据写入长期存储后端,压缩数据到Prometheus块以提高效率。Ruler - 执行规则并生成警报,将它们发送到Alertmanager(Cortex安装包括Alertmanager)。Querier - 处理来自客户端(包括Grafana仪表板)的PromQL查询,对短期时间序列数据和长期存储中的样本进行抽象。这些组件每一个都可以独立管理,这是Cortex可扩展性和运营的关键。你可以在下面看到Cortex及与其交互的系统的基本图表:如图所示,Cortex“完成”Prometheus监控系统。要适应现有的Prometheus安装,你只需重新配置Prometheus实例以远程写入Cortex群集,Cortex将处理其余部分。多租户单租户系统往往适用于小型用例和非生产环境,但对于拥有大量团队、用例和环境的大型组织而言,这些系统变得站不住脚(没有双关语意)。为了满足这些大型组织的严格要求,Cortex不是作为附加组件或插件提供多租户,而是作为头等功能。多租户被编织到Cortex的结构中。从Prometheus实例到达Cortex的所有时间序列数据,都在请求元数据中标记所属于的特定租户。从那里,该数据只能由同一个租户查询。警报也是多租户,每个租户都可以使用Alertmanager配置设定自己的警报。从本质上讲,每个租户都有自己的系统“视图”,其自身以Prometheus为中心的世界。如果你以单租户的方式使用Cortex,你可以随时扩展到无限大的租户群。用例经过几年的发展,Cortex的用户倾向于分为两大类:服务供应商构建托管的管理平台,提供监控和可观察性组件。例如,如果你正在构建像Heroku或Google App Engine这样的平台即服务产品,Cortex使你能够为平台上运行的每个应用程序,提供Prometheus提供的全部功能,并处理每个应用程序( 或者每个帐户或客户)作为系统的单独租户。Weave Cloud和Grafana Labs使用Cortex使客户能够充分利用Prometheus,他们是综合云平台的示例。企业拥有许多内部客户,运行自己的应用程序、服务和“堆栈”。EA和StorageOS是受益于Cortex的大型企业的例子。Cortex、Prometheus的生态系统和CNCFCortex有一些非常引人注目的技术特性,但在当前的行业氛围下,我也认为指出其开源特性也很重要:Cortex使用Apache 2.0许可授权,并由CNCF支持。它仅与其他Apache 2.0 CNCF项目紧密耦合,没有与闭源、专有或特定于供应商技术的强链接。项目合作者包括像Goutham Veeramachaneni和Tom Wilkie这样的Prometheus核心维护者,来自Weaveworks、Grafana Labs、Platform9等公司的工程师,以及其他大量投资于监控和可观察性领域的工程师。Cortex已经投入生产,为Weave Cloud和Grafana Cloud提供支持,这两个云产品(和核心贡献者)的成功关键取决于Cortex未来的发展轨迹。通过在CNCF沙箱中添加Cortex,现在CNCF保护伞下有三个与Prometheus相关的项目(包括Prometheus本身和OpenMetrics)。我们知道监控和可观察性是云原生范式的重要组成部分,我们很高兴看到围绕Prometheus社区有机出现的一些核心基础的持续融合。Cortex项目正在大力推进这项工作,我很兴奋Prometheus生态系统的Prometheus即服务分支成型。

December 21, 2018 · 1 min · jiezi