Dashboard Annotations: 加载期间无法切换开关的问题

概述

在 Grafana 等可观测性平台的仪表板中,注释(Annotations)是一项关键功能,它允许用户在时间序列图上叠加事件标记,从而关联基础设施变更、部署或告警事件与性能指标的变化。对于 SRE 而言,准确、及时地查看和管理注释对于根因分析和事件响应至关重要。

然而,一个影响操作流畅性的用户体验(UX)问题被报告出来:当注释数据源正在加载数据时(例如,连接了一个响应缓慢的日志服务或云 API),其对应的开关控件会被禁用。这意味着,如果用户启动了一个耗时较长的注释查询后改变主意,或发现查询可能因参数错误而无法及时返回结果,他们无法通过切换开关来中止该操作,只能被动等待加载完成。这不仅降低了操作效率,在某些紧急排错场景下,也可能延误对关键信息的判断。

核心概念

  • 仪表板注释 (Dashboard Annotations): 在 Grafana 中,注释是标记在时间轴上的离散事件。它们可以从多种数据源查询,如 Elasticsearch、Loki、云监控 API 等,用于在图表背景中显示事件时间线。
  • 注释叠加层 (Annotation Overlay): 指当注释数据加载完成后,在图表上渲染的视觉标记层。其加载状态(加载中、已加载、加载失败)直接影响该图层的显示和相关控件的可用性。
  • UI 状态管理: 在前端应用(如 Grafana 的 React 应用)中,一个组件的交互状态(如按钮是否可点击)通常由其内部或全局的状态管理器控制。在此问题中,加载状态的管理逻辑错误地导致了切换开关的 disabled 属性被设置为 true,并且未提供基于用户操作(点击开关)中断后台异步请求(如数据源查询)的机制。
  • 可取消的异步操作 (Cancellable Asynchronous Operations): 现代前端框架(如 React 配合 AbortController)支持创建可取消的 Promise。一个健壮的 UX 设计应当允许用户在发起一个长时间运行的异步操作(如网络请求)后,通过界面交互来主动取消它。

实践

问题现象与复现

  1. 场景: 创建一个仪表板,其中至少包含一个配置了注释数据源的面板。该数据源需要连接一个响应缓慢的服务(例如,复杂的跨集群日志查询、未优化的第三方 API 调用)。
  2. 操作:
    • 打开仪表板,触发注释数据的加载。你会看到加载指示器(如旋转图标),同时与该注释关联的开关控件变为灰色且不可点击(禁用状态)。
    • 在此期间,尝试点击该开关。系统不会响应你的点击,你无法取消正在进行的加载操作。
    • 只能等待查询超时或最终完成(无论成功与否),之后开关才会恢复可用状态。

临时解决方案与最佳实践

虽然这是一个需要 Grafana 团队修复的产品缺陷,但 SRE 可以采取以下措施来缓解影响:

  1. 优化数据源查询: 这是根本解决方法。审查并优化导致注释加载缓慢的查询。
    • 确保查询时间范围合理,避免全量扫描。
    • 在数据源层面创建索引、优化 schema。
    • 对于云 API 调用,检查是否有速率限制或预聚合指标可用。
  2. 设置合理的超时: 在仪表板或数据源配置中设置查询超时(timeout)。这可以防止单个慢查询无限期地阻塞前端和后端资源,是保障系统整体可靠性的重要实践。虽然它不能让用户主动取消,但可以限制最长等待时间。
  3. 拆分与分层展示: 如果非必需,考虑将注释分散到不同的行(Row)中,或为不同的注释组使用单独的开关,从而将慢查询的影响隔离,避免阻塞整个仪表板的交互。
  4. 监控 Grafana 前端性能: 从可观测性角度看,可以关注 Grafana 本身的服务指标(如 grafana_frontend_query_duration_seconds),识别出哪些注释查询是性能瓶颈,并进行针对性优化。

SRE 要点

  • 与可靠性、可观测性的关联: 这个看似是 UX 的问题,实则深刻影响可观测性工具自身的可靠性和用户体验。一个让用户陷入“被动等待”状态的仪表板,在紧急故障排查期间是不可靠的。SRE 的工具链必须保持敏捷和可控,才能有效支撑 SRE 本身的实践活动。
  • 最佳实践与常见反模式:
    • 最佳实践: 确保所有面向用户的异步操作都提供明确的进度反馈和中断选项(如取消按钮或可点击的加载图标)。在系统设计层面,查询应具有超时和熔断机制。
    • 常见反模式: 在加载期间完全禁用相关 UI 控件,剥夺用户的控制权。这是典型的“开发视角”而非“用户视角”的设计反模式。
  • 相关指标(SLI/SLO/SLA):
    • SLI (Service Level Indicator): 可以将 “仪表板加载后,注释数据首次渲染完成的平均时间 (P95)” 作为一个 SLI,直接衡量关键功能的可用性和性能。
    • SLO (Service Level Objective): 基于上述 SLI 设定目标,例如:“95% 的仪表板在打开后 10 秒内完成其注释数据的加载。” 这个 SLO 驱动团队对慢查询进行优化。
    • 与 Error Budget 的关联: 如果由于此类 UX 缺陷或性能问题导致 SRE 在故障排查中花费了额外的时间(例如,等待不可取消的注释加载),这可以间接计入 Error Budget 的消耗,因为它降低了团队整体运维效率。

对于需要深入了解 Grafana 架构或仪表板通用问题的读者,可以参考 grafana-dashboard-overview。若需探讨如何为系统功能设定可靠性目标,可阅读 slo-error-budget。