持久化错误信息

在 Trove 中发生的错误应该易于检索,以便最终用户可以清楚地了解其数据库实例正在发生什么情况。

Launchpad 蓝图:https://blueprints.launchpad.net/trove/+spec/persist-error-message

问题描述

从历史上看,确定 Trove 中故障的原因一直非常困难。这是因为错误可能记录在多个位置,而这些位置都无法供最终用户访问。然而,随着 Trove 中通知机制的出现,现在可以将错误消息持久化到数据库中,以便检索和显示。

提议的变更

每个服务器将向通知框架注册一个回调函数。每当发送通知时,都会触发此回调函数,然后可以将发生的任何错误保存到数据库中。然后,用户可以使用“trove show”命令来检索这些信息。

对于在通知框架之外发生的错误,将直接调用以持久化该错误。并非所有错误都需要持久化,因此将首先提出一组错误,可以根据需要随着时间的推移进行增强。

配置

预计不会进行任何配置更改。

数据库

将在 Trove 模式中添加一张新表 (instance_faults)

类型

允许空值

描述

id

varchar(64)

故障 ID(自动生成)

instance_id

varchar(64)

发生故障的实例 ID

message

varchar(255)

故障的错误消息

details

text(65535)

额外细节(例如,堆栈跟踪)

created

DateTime

创建日期

updated

DateTime

更新日期

deleted

tinyint(1)

删除标志

deleted_at

DateTime

删除日期

公共 API

对公共 API 的唯一更改是添加一个“fault”数据结构,该结构在请求实例详细信息时返回。它将如下所示

'fault' :
{
    'created': <date>,
    'message': 'error message',
    'details': 'potential stack trace',
},

“details”值仅在管理员用户执行请求时可用。

公共 API 安全

预计不会出现安全问题。由于持久化的消息都是作为通知广播的异常消息,因此都不应包含敏感信息。如果发现任何包含敏感信息的消息,应将其视为错误并进行相应修改(目前尚未发现)。

Python API

预计不会对 python API 进行任何更改。

CLI (python-troveclient)

“show”Trove CLI 命令现在可能显示新的数据

+-------------------+----------------------------------------------------+
| Property          | Value                                              |
+-------------------+----------------------------------------------------+
| created           | 2016-05-06T21:28:53                                |
| datastore         | mysql                                              |
| datastore_version | 5.6                                                |
| fault_date        | 2016-05-06T21:30:06                                |
| fault_details     | Traceback (most recent call last):                 |
|                   |   File "/<snip>/manager.py", line 265, in prepare  |
|                   |     cluster_config, snapshot, modules)             |
|                   |   File "/<snip>/manager.py", line 355, in _prepare |
|                   |     raise RuntimeError("A  guest error occurred")  |
|                   | RuntimeError: A guest error occurred               |
| fault_message     | A guest error occured                              |
| flavor            | 15                                                 |
| id                | 73cfc462-dd59-4dc1-9d32-95954171775f               |
| ip                | 10.66.25.8                                         |
| name              | myinst2                                            |
| status            | ACTIVE                                             |
| updated           | 2016-05-06T21:28:58                                |
| volume            | 1                                                  |
| volume_used       | 0.1                                                |
+-------------------+----------------------------------------------------+

内部 API

无需对此 API 进行任何更改。

Guest Agent

无需对客户代理进行任何更改。

备选方案

我们仍然可能需要访问日志和/或 Nova 实例,以确定发生错误时的情况。

Dashboard 影响 (UX)

需要在“show”命令期间公开相关字段。

实现

负责人

主要负责人

[peterstac]

里程碑

Newton

工作项

这项工作将在单个任务中完成。

升级影响

预计不会出现升级问题。

依赖项

无。

测试

将增强场景测试,以验证错误是否已持久化到数据库中并可以检索到。

文档影响

这是一个全新的功能,因此需要文档。

参考资料

附录