从 Ceph CLI 和 GUI 报告 Ceph 问题

shreyaa

你好!我是 Shreyaa,Ceph 的 2021 年 GSoC 学生开发者。这个博客系列记录了我与 Ceph 组织的合作历程。自 6 月 6 日 GSoC 编码期开始以来,我一直在与仪表盘团队合作。Ernesto Puerta 和 Alfonso Martínez 是我的导师。

我希望感谢我的导师和 Ceph 仪表盘团队在整个夏天给予我的持续支持和指导。他们总是在我遇到困难时提供帮助,并激励我遵循良好的编码实践。在整个项目中,他们指导我做出更好的设计选择,并不断通过建设性的反馈帮助我提高作为开发者的能力。

我的项目

我的 GSoC 项目是将 Ceph 问题跟踪器与 Ceph 仪表盘集成。

问题陈述

当 Ceph 用户遇到错误、面临问题或有功能请求时,他/她必须前往 Ceph 问题跟踪器来报告或请求。这会导致几个问题,例如

  1. 糟糕的用户体验
    用户的流程被打断。他们必须从一个站点收集相关信息,并访问另一个站点才能创建新问题。

  2. 转化率降低 当用户遇到问题时,他/她通常会联系 Ceph 用户或开发者邮件列表以询问。并非所有用户都能得到回复。假设有 100 个用户报告,只有 75% 的用户得到回复(粗略数字,仅用于说明)。在得到回复的 75 个用户中,大约 50 个用户被要求在 Ceph 问题跟踪器上创建一个新问题。在被要求创建问题的用户中,并非所有用户都会因为每个阶段的不便而访问 Ceph 问题跟踪器。因此,最终报告问题的用户数量明显较少。我们可以使用下面的图表更好地理解这一点

Funnel Diagram

拟议的解决方案

我们提出的解决方案是将 Ceph 问题跟踪器与 Ceph 仪表盘集成。Ceph 仪表盘是 Ceph 项目的前端组件。它可以用于监控和更新 Ceph 环境中运行的服务。

用户应该能够从 Ceph CLI 以及 Ceph 仪表盘报告问题。

Ceph User Workflow

我的工作

Ceph 问题跟踪器基于 Redmine。Ceph 问题跟踪器公开了可用于创建、获取和更新问题的端点。我添加了 Ceph 仪表盘模块中的端点,这些端点调用服务,这些服务内部使用这些公开的 Ceph 问题跟踪器端点。用户可以使用问题编号获取问题,也可以创建新问题。

要创建问题,用户必须在 Ceph 问题跟踪器上拥有一个帐户。这是强制性的,以避免在问题跟踪器上发送垃圾邮件。

我的帐户 选项卡下,存储了 API 访问密钥。该 API 密钥用于用户的身份验证和授权。

创建问题时可用的组件

  1. 仪表盘
  2. 块 (rbd)
  3. 对象 (rgw)
  4. 文件系统 (cephfs)
  5. ceph_manager
  6. 编排器
  7. ceph_volume
  8. 核心 Ceph

可用的跟踪器类型

  1. 错误
  2. 功能

使用 CLI

用户使用以下命令在 Ceph 集群中设置此密钥

ceph dashboard set-issue-tracker-api-key -i <包含密钥的文件>

然后用户可以使用以下命令获取问题

ceph dashboard get issue <问题编号>

此命令可以在未设置 API 访问密钥的情况下运行

要创建新问题

ceph dashboard create issue <组件名称> <跟踪器类型> <主题> <描述>

使用仪表盘

单击窗口右上角的设置图标,在导航栏中用户需要单击“提出问题”。这将打开一个如下所示的模态框

Ceph Dashboard

用户必须从各自的下拉菜单列表中选择组件和跟踪器。然后他们可以输入问题的标题和描述。然后他们可以继续在 ceph 问题跟踪器中创建问题。之后打开的模态框显示了创建问题的详细信息以及重定向到 Ceph 问题跟踪器或停留在当前页面的选项。

面临的挑战

最初,我使用 python-redmine 库来创建问题并熟悉基于 redmine 的问题跟踪器。但我无法使用此库继续进行,因为它未打包用于 CentOS,而 CentOS 是 Ceph 支持的操作系统。

然后我决定使用原始 API 请求,但 redmine 上的文档不准确。我无法使用 curl 调用和文档中给出的请求体描述创建问题。

下一个方法是转储 python-redmine 库发送的请求。为此,我使用了 wireshark,但由于 POST 请求是加密的,并且该库仅将请求发送到 https 安全链接,因此这不起作用。在 stackoverflow 上花费了无数个小时后,我遇到了这些日志行,这足以帮助我发现一些参数作为查询参数被发送。原始请求在之后工作了。

Ceph 问题跟踪器默认情况下会创建一个错误。我无法创建功能。然后我发现了 webhook.site,它可以记录发送到唯一生成的 API 端点的请求。因此,我记录了一个使用
python-redmine 库发送的功能创建请求,并以类似的方式在我的原始请求中发送了请求体。现在功能创建可以工作了!