OpenTelemetry之Metrics

什么是Metrics

指标(Metrics)是代表系统健康和性能的数值数据点,例如CPU利用率、网络流量和数据库连接。我们可以使用指标来测量、监控和比较性能,例如,可以测量服务器的响应时间、内存利用率、错误率等。

有一些常见的指标:

  1. CPU利用率:衡量系统的处理器使用情况,可以帮助确定系统的负载和性能压力。
  2. 内存使用率:衡量系统内存的使用情况,可以检查是否存在内存泄漏或过度使用的情况。
  3. 磁盘空间:衡量磁盘使用情况,可以监测磁盘空间的消耗情况,防止空间不足导致系统故障。
  4. 网络流量:衡量网络传输的数据量,可以分析网络的使用情况、带宽需求和流量模式。
  5. 响应时间:衡量系统在处理请求时的响应时间,可以评估系统的性能和用户体验。
  6. 错误率:衡量系统在处理请求时出现错误的比例,可以帮助检测和解决问题。

它和SLIs有什么关系呢:

指标是用于衡量和监控系统的各个方面的数值数据,而SLIs则是服务质量和性能的具体度量标准。通过实时和历史的指标数据,我们可以计算和评估SLIs,从而了解服务是否达到了预定的质量要求。如果SLIs未达到预期水平,相应的指标将提供有关问题的详细信息,以便进行故障排除和性能优化。
总的来说,指标不一定是SLIs,但SLIs是通过对指标进行度量和分析而得出的量化指标,用于评估和验证服务的性能和质量。

如何捕获Metrics

Instruments

在软件开发和性能监测领域,仪器(Instruments)是一种用于捕获、记录和分析系统运行时的数据和指标的工具或库。它们可用于测量应用程序的各个方面,如执行时间、资源利用、调用频率等。

  • 它可以用来收集各种类型的数据,包括性能指标、日志、异常和事件。以此来帮助开发人员和运维团队了解应用程序的行为、性能特征以及可能存在的问题。

  • 它可以与应用程序代码集成,以提供实时的数据收集和监控。它们可以被插入到代码中的关键点,例如函数调用、请求处理或关键业务逻辑中。

在使用它捕获数据时,需要创建有以下特点的仪器:

  1. 唯一名称:每个仪器都应具有唯一的名称,例如 http.server.duration

  2. 仪器类型:仪器类型指定了如何对数据进行收集和聚合。一些常见的仪器类型包括:

    • 直方图(Histogram):用于收集数据的分布情况,可以统计数据的取值范围、频率和分布情况。

    • 计数器(Counter):用于累积计数,每次观测时都会递增。

    • 计时器(Timer):用于测量时间间隔,可以统计操作的持续时间、平均响应时间等。

    • 范围计时器(Summary):与计时器类似,但可以统计更多分位数(如中位数、95th百分位数等)。

    • 枚举(Enum):用于记录离散的状态或标签。

  3. 可选的计量单位:仪器的计量单位用于指定数据的度量标准,例如毫秒、字节等。

  4. 可选的描述:为了更好地理解仪器的用途和数据含义,可以提供一个可选的描述。

关于Metrics他有很多种类型的指标,根据具体需求定,以下部分主要按照Timeseries Metrics要用的仪器

Timeseries

时间序列(Timeseries)是指具有唯一属性集的度量指标,它是由单个仪器(Instrument)生成的。换句话说,同一个度量名称在不同的主机上可以生成独立的时间序列。
它是一组按照时间顺序排列的数据点或观测值的集合。它们记录了在一段时间内连续的时间间隔内发生的事件、测量或观察到的数值,并不是里面全是记录时间的指标。

时间序列由以下特点组成:

  1. 度量指标名称:每个时间序列都对应一个特定的度量指标名称,用于描述所测量的特定指标,比如 CPU 使用率、内存占用等。

  2. 属性集合:时间序列的独特之处在于它具有一组唯一的属性,用于标识和区分不同的实体或维度。例如,可以使用主机名作为属性来区分不同主机上的时间序列。

使用不同的属性集合,时间序列能够跟踪和记录不同维度的数据。通过对时间序列的属性进行过滤和聚合,可以更详细地了解不同实体之间的差异和关联。

举个例子,假设我们有一个名为 “CPU 使用率” 的度量指标。如果我们有多个主机,每个主机都会生成自己的时间序列,其中每个时间序列都具有相同的度量指标名称,但属性集包含不同的主机名,以区分各个主机的CPU使用率。

时间序列的独特性使得我们可以对系统中不同实体的性能和行为进行个别追踪和分析,以便更好地理解系统的整体运行状况和不同组件之间的差异。

什么仪器会生成时间序列

Additive instruments

加法仪器(Additive instruments)或可求和仪器会产生时间序列,当这些序列相加时,会生成另一个有意义且准确的时间序列。通过测量非递减的数值的加法仪器也被称为单调仪器(Monotonic instruments)。

例如,http.server.requests 是一个加法时间序列,因为您可以将来自不同主机的请求总数相加,得到总请求数。

但是 system.memory.utilization(百分比)不是加法序列,因为不同主机的内存利用率之和并无实际意义(90% + 90% = 180%)。

换句话说,在不适用于所有度量指标的情况下,加法仪器的特性允许我们将多个时序数据相加从而得到一个合理且有意义的总时间序列。但对于具有百分比类型的度量指标来说,简单地将它们相加通常是不合适的,因为百分比的数值相加并不能得到有实际意义的结果。

Synchronous instruments

同步仪器(Synchronous instruments)是与其测量操作同时调用的仪器。例如,要测量请求的次数,可以在每次有新请求时调用counter.Add(ctx, 1)。同步测量可以有关联的追踪上下文(trace context)。

对于同步仪器,加法仪器(additive instruments)和分组仪器(grouping instruments)的区别在于,加法仪器生成可累加的时间序列(summable timeseries),而分组仪器生成直方图(histogram)。

仪器属性聚合方式举例
计数器单调递增求和 -> 增量请求数量、请求大小
上下计数器可累加最后一个值 -> 求和连接数量
直方图分组直方图请求持续时间、请求大小

Asynchronous instruments

异步仪器(Asynchronous instruments),也称为观察者(observers),会定期调用回调函数来收集测量数据。例如,可以使用观察者来定期测量内存或CPU使用情况。异步测量不可以有关联的追踪上下文(trace context)。

在选择 UpDownCounterObserver(加法)和 GaugeObserver(分组)之间时,如果需要可累加的时间序列,则选择 UpDownCounterObserver;否则选择 GaugeObserver。例如,要测量 “system.memory.usage”(字节数),应使用 UpDownCounterObserver;而要测量 “system.memory.utilization”(百分比),应使用 GaugeObserver。

仪器属性聚合方式举例
计数器观察者单调递增求和聚合 -> 增量CPU时间
上下计数器观察者可累加最后一个值 -> 求和内存使用量(字节)
测量观察者分组最后一个值 -> 无/平均聚合内存利用率(百分比)

如何选择仪器呢

  1. 如果需要直方图、热图或百分位数,使用直方图(Histogram)。
  2. 如果想通过记录增量值来进行计数:
  • 如果值是单调递增的,使用计数器(Counter)。
  • 否则,使用上下计数器(UpDownCounter)。
  1. 如果想通过记录绝对值来进行测量:
  • 如果值是可累加的/可求和的:
    • 如果值是单调递增的,使用计数器观察者(CounterObserver)。
    • 否则,请使用上下计数器观察者(UpDownCounterObserver)。
  • 如果值不是可累加的/可求和的,使用测量观察者(GaugeObserver)。

Counter(计数器):

特点:同步、单调递增
计数器是一种同步的仪器,用于测量可累加、非递减的值,例如:

  • 处理的请求数量
  • 接收的字节数
  • 磁盘读取次数

对于计数器时间序列,后端通常会计算增量并显示速率值,例如,per_min(http.server.requests) 返回每分钟处理的请求数量

CounterObserver(计数器观察者):

特点:异步、单调递增
它相当于是计数器的异步版本
计数器观察者通常用于长期收集和监测统计信息,例如:

  • 记录数据库查询次数
  • 文件写入次数

UpDownCounter(上下计数器):

特点:同步、可添加
它也是一种同步仪器,用于测量随时间增加或减少的可添加值,例如:

  • 活跃的请求数量
  • 打开的连接数
  • 使用的内存(兆字节)

上下计数器时间序列在后端通常会显示最后一个值,也就是当前时间点的值。意味着后端会记录并显示上下计数器的最新测量结果。
但是,不同的上下计数器时间序列可以相加在一起。意味着可以将具有相同度量标准的多个上下计数器时间序列相加,以得到它们的总和。

让我们以一个示例说明这一点:

假设我们有一个应用程序,其中有多个服务同时处理请求,并且我们希望跟踪每个服务的打开连接数。
使用上下计数器:

  • 我们创建一个名为"go.sql.connections_open"的上下计数器。
  • 对于每个服务,当连接被打开时,我们通过增加上下计数器来记录增加的连接数。
  • 当连接关闭时,我们通过减少上下计数器来记录连接数的减少。
  • 在任何需要时,我们可以获取上下计数器的当前值,这将给出所有服务的打开连接总数。

UpDownCounterObserver(上下计数器观察者):

特点:异步、可添加

是上下计数器仪器的异步版本,它可以在在多线程、分布式系统或事件驱动的应用程序中使用,用上面的例子来说:
使用上下计数器观察者:

  • 我们创建一个名为"go.sql.connections_open"的上下计数器观察者。
  • 对于每个服务,我们将注册一个回调函数或事件处理机制,每当连接被打开或关闭时,会调用该回调函数。
  • 在回调函数中,我们通过增加或减少上下计数器观察者来记录连接数的变化。
  • 上下计数器观察者会异步地在后台收集和更新测量数据,而不会阻塞主线程的执行。
  • 在需要时,我们可以获取上下计数器观察者的当前值,这将给出每个服务的打开连接数。

Histogram(直方图):

特点:同步、分组
直方图是一种同步仪器,可以从记录的值生成一个直方图,例如:

  • 请求延迟(request latency)
  • 请求大小

对于直方图时间序列,后端通常显示百分位数、直方图或热图。
百分位数用于衡量数据中特定百分比的位置。
直方图用于可视化数据的分布情况和频率直方图。
热图用于可视化数据的相对强度、密度或频率,并通过颜色来表示值的大小。

GaugeObserver(测量观察者):

特点:异步、分组
测量观察者是一种异步仪器,用于测量非可添加值,对于这些值,求和不会产生有意义的正确结果,例如:

  • 错误率(error rate)
  • 内存利用率(memory utilization)
  • 缓存命中率(cache hit rate)

对于测量观察者时间序列,后端通常显示最后一个值,并且不能将不同时间序列相加。
例如错误率、内存利用率和缓存命中率。对于这些值,求和不会产生有意义的正确结果。因此,后端通常只显示最后一个值,因为它能提供最近一次测量的信息,并且不会将不同时间序列的值相加。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值