注意:此类是 Rakudo 特有功能,不是标准 Raku。
创建时,Telemetry 对象包含虚拟机当前状态的各个方面的快照。这本身很有用,但通常需要两个快照来表示差异(这是一个 Telemetry::Period 对象)。
Telemetry 对象实际上是不同“仪器”拍摄的一系列快照的集合。默认情况下,Telemetry::Instrument::Usage 和 Telemetry::Instrument::ThreadPool 仪器处于激活状态。
Telemetry(和 Telemetry::Period)对象也是 Associative。这意味着你可以将 Telemetry 对象视为只读 Hash,其中仪器的所有数据值都是键。
你可以通过设置 $*SAMPLER 动态变量(这是一个 Telemetry::Sampler 对象)来确定 Telemetry 应使用哪些仪器。
目前,Rakudo 核心支持以下仪器
Telemetry::Instrument::Usage
按字母顺序提供:cpu、cpu-sys、cpu-user、cpus、id-rss、inb、invcsw、is-rss、ix-rss、majf、max-rss、minf、mrcv、msnd、nsig、nswp、volcsw、outb、util% 和 wallclock。有关这些数据值的含义的完整文档,请参阅 Telemetry::Instrument::Usage。
Telemetry::Instrument::Thread
按字母顺序提供:tad、tcd、thid、tjd、tsd 和 tys。有关这些数据值的含义的完整文档,请参阅 Telemetry::Instrument::Thread。
Telemetry::Instrument::ThreadPool
按字母顺序提供:atc、atq、aw、gtc、gtq、gw、s、ttc、ttq 和 tw。有关这些数据值的含义的完整文档,请参阅 Telemetry::Instrument::ThreadPool。
Telemetry::Instrument::AdHoc
本身不提供任何数据:必须指明要监视哪些变量,然后这些变量将作为仪器上具有相同名称的方法提供。
例程 T§
sub T()
Telemetry.new 的快捷方式。它默认导出。由于 Telemetry 类还提供 Associative 接口,因此可以轻松地在单个语句中内插多个值
use Telemetry;say "Used (KiB CPU) so far";
例程 snap§
multi snap(--> Nil)multi snap(Str --> Nil)multi snap(Str = "taking heap snapshot...", :!)multi snap( --> Nil)
snap 子例程是创建新的 Telemetry 对象并将其推送到数组以供以后处理的简写。它默认导出。从 2021.12 版本开始,如果为其提供了 :$heap 关联参数,它将返回存储快照的文件名。
use Telemetry;my ;for ^5
如果没有指定数组,它将出于方便考虑使用内部数组。
例程 snapper§
sub snapper( = 0.1, :, : --> Nil)
snapper 例程启动一个单独的线程,该线程将重复调用 snap 直到程序结束。它默认导出。
默认情况下,它将每 0.1 秒调用一次 snap。唯一的定位参数被视为 snap 之间的延迟。
请参阅 snapper 模块,了解如何在不更改代码的情况下从外部启动 snapper。只需将 -Msnapper 作为命令行参数添加,即可为您启动 snapper。
例程 periods§
multi periods( --> Seq)multi periods( --> Seq)
periods 子例程处理一个 Telemetry 对象数组,并从中生成一个 Seq 的 Telemetry::Period 对象。它默认导出。
.<cpu wallclock>.say for periods();# OUTPUT:# ====================# (164 / 160)# (23 / 21)# (17 / 17)# (15 / 16)# (29 / 28)
如果没有指定数组,它将使用 snap 的内部数组,不带参数 并且 在完成时将重置该数组(以便可以再次添加新的 snap)。
use Telemetry;for ^5say .<cpu wallclock>.join(" / ") for periods;# OUTPUT:# ====================# 172 / 168# 24 / 21# 17 / 18# 17 / 16# 27 / 27
如果只执行了一个 snap,则将执行另一个 snap 以至少创建一个 Telemetry::Period 对象。
例程 report§
multi report(:, :, :, :, :)
report 子例程生成有关 Telemetry 对象数组的报告。它默认导出。这些可以通过定期调用 snap 创建,或者通过运行 snapper 创建。如果没有使用定位参数,它将假定无参数 snap 推送到的内部数组。
以下是 report 的其他命名参数。
:columns
指定要包含在报告中的列的名称。名称可以使用列名称指定(例如 gw)。如果未指定,则默认为 RAKUDO_REPORT_COLUMNS 环境变量中指定的内容。如果也没有设置,则默认为
wallclock util% max-rss gw gtc tw ttc aw atc
:header-repeat
指定在报告中重复标题的次数。如果未指定,则默认为 RAKUDO_REPORT_HEADER_REPEAT 环境变量中指定的内容。如果也没有设置,则默认为 32。
:legend
指定是否应将图例添加到报告中。如果未指定,则默认为 RAKUDO_REPORT_LEGEND 环境变量中指定的内容。如果也没有设置,则默认为 True。
如果在程序结束时内部数组中有可用的 snap,则将自动生成 report 并打印在 STDERR 上。
模块 snapper§
启动一个线程,获取重复的系统状态快照。
此模块不包含子例程或方法或任何内容。它旨在作为启动 Telemetry 模块的 snapper 子例程的快捷方式,允许在无需更改程序的情况下获取程序执行的快照。只需使用 -Msnapper 加载模块即可完成启动 snapper 所需的所有操作,并在程序完成后在 STDERR 上打印报告。
RAKUDO_SNAPPER 环境变量可以设置为指示快照之间的时间。如果未指定,它将默认为 0.1 秒。
snapper 模块假定进程有序关闭。终止进程(例如通过按 Control-c)不会生成报告。
模块 safe-snapper§
自 Rakudo 编译器 2021.09 版本起可用。
此模块提供了一个对 snapper 模块的安全的替代:通过按 Control-c 终止进程将生成报告。它能够通过安装 信号处理程序 来实现此目的,这可能会干扰交互式程序的正常运行。
以任何其他方式终止进程不会生成报告。
类型图§
Telemetry 的类型关系