跟踪类别和名称
ITracer 的基本前提是向中央 APM 系统提交一个度量和相关的名称。此活动由 trace 方法实现,该方法因提交的度量而有所不同。各 trace 方法都接受一个 String[] name 参数,其中包含复合名称的上下文组件,其结构特定于 APM 系统。复合名称向 APM 系统指示提交的名称空间和实际的指标名称;因此,复合名称中通常至少包括根类别和度量说明。底层 ITracer 实现应该知道如何通过传递的 String[] 构建复合名称。表 1 演示了复合命名约定的两个示例:
表 1. 示例复合名称
名称结构
复合名称
简单斜杠分隔
Hosts/SalesDatabaseServer/CPU Utilization/CPU3
JMX MBean ObjectName
com.myco.datacenter.apm:type=Hosts,service=SalesDatabaseServer,group=CPU Utilization,instance=CPU3
清单 1 是使用此 API 跟踪调用的简短示例:
清单 1. 跟踪 API 调用示例
ITracer simpleTracer = TracerFactory.getInstance(sprops);
ITracer jmxTracer = TracerFactory.getInstance(jprops);
.
.
simpleTracer.trace(37, "Hosts", "SalesDatabaseServer",
"CPU Utilization", "CPU3", "Current Utilization %");
jmxTracer.trace(37,
"com.myco.datacenter.apm",
"type=Hosts",
"service=SalesDatabaseServer",
"group=CPU Utilization",
"instance=CPU3", "Current Utilization %");
);
跟踪程序度量数据类型
在此接口中,度量数据可以是以下类型:
int
long
java.util.Date
String
APM 系统提供商可能支持其他数据类型的收集度量数据。
跟踪程序类型
选定了具体的度量数据类型(如 long)之后,可以根据 APM 系统支持的类型来选择解释特定值的方式。还需记住,各 APM 实现可以使用不同的术语来表示本质相同的类型,并且 ITracer 使用了一些通用的命名规则.
ITracer 中表示的跟踪程序类型:
平均时间间隔:trace(long value, String[] name) 和 trace(int value, String[] name) 方法将发出时间间隔平均值的跟踪(请参阅 时间间隔 侧栏)。这表示每个提交将被转化为当前时间间隔的聚合值。当新时间间隔开始时,聚合值计数器将重置为零。
粘附: traceSticky(value long, String[] name) 和 traceSticky(value int, String[] name) 方法发出粘附值跟踪。这表示,与时间间隔平均指标相反,聚合将它们的值保留在时间间隔中。如果现在跟踪值 5,而此后不再执行跟踪直到第二天某个时刻,则该指标将保持为 5,直到提供了新值。
增量:增量跟踪将传递一个数值,但提供给 APM 系统(或由 APM 系统解释)的实际值是此度量与前一度量之间的增量。它们有时被称作 rate 类型,用于反映自己的性能优势。请考虑事务管理程序的提交总数度量值。该数字始终在增加,并且其绝对值几乎没有用处。该数字有用的地方是它增加的速率,因此定期收集它的绝对值并跟踪每次读取数据之间的增量可以反映事务提交的速率。增量跟踪比平均时间间隔和粘附方式的跟踪更为常用,但仍有些用例采用了平均时间间隔。增量跟踪必须能够区分只能增加的度量和同时能增减的度量。小于前值的提交度量应被忽略或造成底层增量重置。
事件:这种类型是一种简单的非聚合指标,它表示特定事件在时间间隔内发生的次数的增量计算。由于收集器和跟踪程序都不期望知道特定时刻的运行总数,因此基本的 traceIncident(String[] name) 调用没有指定任何值,并且隐式只增加一次事件增量。当需要计算多次增量时,除了在循环中多次调用该方法之外,另一种较好的方法是通过 traceIncident(int value, String[] name) 方法根据 value 来计算合值。
智能:智能跟踪程序是一个参数化的类型,它与跟踪程序中的某种其他类型相映射。度量值和跟踪类型将作为 String 传递,并且可将可用类型作为常量定义在接口中。当收集器不知道正在收集的数据的类型或跟踪程序类型时,这是一个非常方便的方法,但是也可以直接将收集值和配置的类型名称传递给跟踪程序。
TracerFactory 是一个普通的工厂类,用于根据传递的配置属性创建新 ITracer 实例,或者从缓存中引用已创建的 ITracer。 收集器模式
收集通常有三种可选模式,这影响到应该使用的跟踪程序类型:
轮询:按固定频繁调用收集器,它将检索和跟踪 PDS 中的指标或指标集的当前值。例如,可以每分钟调用一次收集器来读取主机的 CPU 利用率,或通过 JXM 接口从事务管理器读取提交事务的总数。轮询模式的前提是对目标指标的定期采样。因此,对于轮询事件,指标的值将提供给 APM 系统,但是,假定中间时期的值不变。因而,轮询收集器通常使用粘附跟踪程序类型:APM 系统在生成报告时将假定所有轮询事件之间的值不变。
图 4 演示了此模式: 图4.轮询收集模式
图 5:监听收集模式
监听:这种通用数据模式是 Observer 模式的一种形式。收集器将其自身注册为目标 PDS 的事件监听程序,它将在相关的事件发生时接受回调。作为回调结果发出的跟踪值取决于回调有效负荷本身的内容,但收集器至少可以跟踪每个回调的事件。图 5 演示了此模式:
图 5:监听收集模式
截取:在此模式中,收集器将自己作为截取程序插入到目标和它的调用程序之间。对于通过该截取程序的各个活动实例,截取程序将生成一个度量并跟踪它。当截取模式是 request/response 时,收集器可以测定请求数量、响应时间、请求或响应的有效负荷。例如,HTTP 代码服务器可以充当收集器,它可以:
计算请求数,可以选择根据 HTTP 类型(GET 和 POST 等)或统一资源标识符(URI)来分类。
请求的响应时间。
测定请求和响应的大小。
由于您可以假定截取收集器能 “看到” 每一个事件,因此实现的跟踪程序通常为平均时间间隔类型。因此,如果时间间隔到期且没有活动发生,则该时间间隔的聚合值将为零,而与之前时间间隔中的活动无关。
图 6 演示了此模式: