Guru Meditation Reports

Nova 包含一种机制,允许开发人员和系统管理员生成有关正在运行的 Nova 可执行文件的状态报告。该报告称为Guru Meditation Report(简称GMR)。

生成 GMR

可以通过向任何支持此功能的 Nova 进程发送 USR2 信号来生成 GMR(参见下文)。然后,GMR 将输出到该特定进程的标准错误流。

例如,假设 nova-compute 的进程 ID 为 8675,并且使用 2>/var/log/nova/nova-compute-err.log 运行。那么,kill -USR2 8675 将触发 Guru Meditation 报告打印到 /var/log/nova/nova-compute-err.log

Nova API 通常在 uWSGI 下运行,后者会拦截 SIGUSR2 信号。在这种情况下,可以使用文件触发器代替

[oslo_reports]
log_dir = /var/log/nova
file_event_handler = /var/log/nova/gmr_trigger

每当触发文件被修改时,都会生成一个 GMR。要获取报告,可以使用 touch /var/log/nova/gmr_trigger。请注意,配置的文件触发器必须在 Nova 启动时存在。

如果指定了日志目录,则报告将写入该目录中的文件,而不是 stderr。报告文件将命名为 ${serviceName}_gurumeditation_${timestamp}

GMR 的结构

GMR 旨在可扩展;任何特定的可执行文件都可以添加自己的部分。但是,基本的 GMR 由几个部分组成

软件包

显示有关此进程所属的软件包的信息,包括版本信息

线程

显示此进程中每个线程的堆栈跟踪和线程 ID

绿色线程

显示此进程中每个绿色线程的堆栈跟踪(绿色线程没有线程 ID)

配置

列出当前进程可以通过 CONF 对象访问的所有配置选项

为新的可执行文件添加 GMR 支持

为给定的可执行文件添加 GMR 支持非常容易。

首先导入模块,以及 Nova 版本模块

from oslo_reports import guru_meditation_report as gmr
from oslo_reports import opts as gmr_opts
from nova import version

然后,注册任何附加部分(可选)

gmr.TextGuruMeditation.register_section('Some Special Section',
                                        some_section_generator)

最后(在 main 下),在运行可执行文件的“主循环”之前(通常是 service.server(server) 或类似内容),注册 GMR 钩子

gmr_opts.set_defaults(CONF)
gmr.TextGuruMeditation.setup_autorun(
  version, conf=CONF, service_name=service_name)

服务名称用于生成报告文件。如果未指定,GMR 会尝试使用堆栈跟踪自动检测二进制文件名,但通常最终会得到 thread.py

扩展 GMR

如上所述,可以为特定的可执行文件向 GMR 添加额外的部分。有关更多信息,请参阅 oslo.reports 下的内联文档