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 下的内联文档