日志请求 ID 映射¶
https://blueprints.launchpad.net/nova/+spec/log-request-id-mappings
在多个 OpenStack 服务之间跟踪请求非常困难。
问题描述¶
每个 OpenStack 服务都会在 HTTP 响应中发送一个请求 ID 头部。这个值对于在日志中追踪问题很有用。但是,当操作跨越服务边界时,这种追踪变得困难,因为服务为每个入站请求生成一个新的 ID;nova 的请求 ID 无法帮助用户找到由 nova 在满足请求时调用的其他服务的调试信息。当大量请求同时到达时,尤其是在 gate 环境下,tempest 现在并行运行测试时,这个问题变得更加突出。仅仅匹配服务日志之间的时间戳不再是一种可行的解决方案。因此,需要另一种请求追踪方法来帮助调试。
提议的变更¶
请求 ID 在请求处理开始时生成。这是用户在请求返回时看到的 ID。nova 调用到的其他 OpenStack 服务(例如 glance)会在响应中以头部形式发送它们自己的请求 ID。通过记录两个请求 ID 的映射(nova->glance),用户将能够轻松地在 n-api 日志中查找 glance 返回的请求 ID。有了 glance 的请求 ID,用户就可以检查 glance 日志,以获取与 nova 发起的请求相对应的调试信息。
需要两个请求 ID 来形成日志消息:一个由 nova 生成,另一个包含在来自另一个服务的响应中。nova 生成的请求 ID 位于传递到 python 客户端包装器中的上下文中。其他服务的请求 ID 尚未到达 nova 的客户端包装器;该值的返回取决于某些客户端蓝图的实现(参见依赖项)。一旦两个请求 ID 都可用,日志记录将使用 request_utils 中的 link_request_ids() 进行。
备选方案¶
这个想法在之前的周期中出现过[1],提出的解决方案是在服务之间传递一个统一的请求 ID。虽然已经开始进行这项工作,但最终认为这种方法不令人满意,因为它允许客户端篡改请求 ID 值。客户端重用相同的请求 ID 将消除请求追踪的好处。使用精心选择的请求 ID,甚至一个用户可以干扰另一个用户的调试工作。因此,请求 ID 由服务器生成至关重要。
数据模型影响¶
无。
REST API 影响¶
无。
安全影响¶
无。
通知影响¶
使用的 request_utils 模块将为每个记录的请求 ID 映射生成一个 INFO 通知。
其他最终用户影响¶
最终用户只会看到这些信息在 nova 日志或生成的通知中。
性能影响¶
无。
其他部署者影响¶
为了使 nova 记录其他服务的请求 ID 值,该服务的 python 客户端需要将从服务 HTTP 响应中获取的请求 ID 返回。为了实现这一点,需要发布新版本的 python-glanceclient、python-cinderclient 等。因此,部署者需要运行较新版本的客户端才能记录请求 ID 映射。如果客户端没有返回请求 ID,则不会进行任何日志记录。
开发人员影响¶
无。
实现¶
负责人¶
- 主要负责人
chris-buccella
工作项¶
同步 oslo 中的 request_utils 模块
随着各种服务的 python 客户端更新为返回请求 ID,使用 request_utils.link_request_ids() 记录请求 ID 映射: 1. python-glanceclient 2. python-cinderclient 3. python-neutronclient
使用新版本的客户端更新 requirements.txt
依赖项¶
测试¶
可以添加一个 tempest 测试来确保以正确的格式生成通知。
文档影响¶
应更新操作指南,特别是
第 11 章,在“确定哪个组件损坏”下
第 13 章,在“追踪实例请求”下
参考资料¶
[0] 来自 Icehouse 周期的 nova<->glance 日志记录的提议变更:https://review.openstack.org/#/c/68518
[1] 来自 HK Summit 的讨论:https://etherpad.openstack.org/p/icehouse-summit-nova-cross-project-request-ids
[2] 来自邮件列表的改进:http://lists.openstack.org/pipermail/openstack-dev/2013-December/020774.html