OpenAQ、Sensor.Community、Grafana。
把这三个名字交给 Agent,很容易得到一条看似完整的方案:接入数据,统一格式,展示图表。它几乎适用于任何有数据源和可视化工具的项目。真正决定工作内容的部分,仍然没有说出来。
OpenAQ 提供近实时与历史空气质量数据及其元数据;Sensor.Community 是由贡献者组成的环境传感器网络;Grafana 用于查询和展示数据。它们各自已有能力,但这些能力可以被组织成不同的产品。OpenAQ API、Sensor.Community、Grafana 基础说明
ToWow 一份历史候选记录为这组工具提出了三条路径:数据转接、差异探针、空气质量图集。它们当时都是有来源依据的未验证设计。本文沿着这些候选继续分析:选择哪一种产品,会让接下来的工作发生什么变化。
转接器交付一条可重复的数据通路
转接器的使用者,可能已经有分析方式,只是不想每次都手工处理另一种输入。它首先需要交付一份稳定的转换结果。
这里值得做的工作是字段映射。测量对象怎样表示,时间戳采用什么约定,原始来源如何保留,缺少某个字段时怎样处理。一个源中的字段,可能在目标中没有对应位置;转接器必须说明这部分信息被放在哪里。
第一份可检查的产物可以很小:一份输入样本、对应的转换结果,以及逐字段映射说明。使用者应能拿这份结果进入自己的下一步,而不是重新猜一遍转换程序的意思。
这一方向的价值,是减少重复接入的劳动。因此它适合与现有连接器或一个短脚本比较:同样的输入,哪种方法更容易维持正确转换,来源变化以后又要修多少东西。
差异探针交付一组值得调查的记录
差异探针面对另一位使用者:他已经拿到两侧数据,想知道哪些差别值得继续检查。
它需要的中间物可以是一张比较表。下面仅以虚构字段说明设计,不代表项目的真实 API 格式或实际观测。
| 来源 A 的记录 | 来源 B 的记录 | 对应条件 | 后续动作 |
|---|---|---|---|
| 某位置、某时段的一项测量 | 邻近位置、同一时段的同类测量 | 单位相同,位置存在距离 | 保留距离与采样条件,再调查差值 |
| 一小时平均值 | 某一分钟的即时值 | 时间统计口径不同 | 先取得相同时间口径 |
| 有测量值,无设备说明 | 有测量值与设备信息 | 缺少解释测量差异的背景 | 补查元数据 |
这张表多做了一件单纯画图不会替你决定的事:把“为什么放在一起比较”留下来。出现差值以后,读者可以追问它来自数值本身,还是时间、位置、设备与处理方式的差别。
设计上,可以先只做一处地点和一小段时间,保留原始记录、映射过程和未能对应的原因。第一轮的目标是让一个使用者据此找到值得调查的观测。若使用者仍需重新清洗所有数据,比较表就没有接住主要工作。
这里,接上 Grafana 是展示选择;定义可比较关系才是探针的核心。先把比较表做好,甚至用普通表格查看,也能检验这个方向有没有用。
图集交付一段可以独立阅读的解释
图集的读者可能既不维护管道,也不准备逐条排查异常。他想理解某个地点在一段时间里出现了怎样的变化。
因此,一张可导出的快照要携带足够背景:地点、时段、测量对象、单位、来源,以及理解图形所必需的说明。读者把图片保存下来,脱离原系统以后,仍应知道它在描述什么。
这会改变可视化的安排。默认仪表板适合操作者不断切换筛选条件;供他人阅读的图集,需要作者选择视角、标注值得看的变化,并保留回到原始记录的入口。截图只是交付的一部分,解释也是。
图集可以先做一个地点、一个时间窗口,交给目标读者。观察他读出了什么,哪里需要追问,再决定是否增加交互或扩展范围。页面数量和图表数量,都不如一次准确理解更接近它的目的。
先选一种中间物
这三条路径并不互斥,但它们也无需一起开工。转接器先产出可重复的转换;探针先产出可调查的对应;图集先产出可独立阅读的解释。三种第一步,对代码、数据和使用者的要求各不相同。
历史运行后来实际生成过一份三项目文档快照的清单,统计字节数、行数、标题和哈希。它完成的是资料准备,尚未取得观测数据。因此,本文三条路径的下一次验证,都应从真实输入和目标使用者开始。该历史工件的细节保留在来源记录。
在生成系统里,我希望候选提案能具体到这个程度:第一份交付是什么,谁会用它做哪一步,什么反馈会使我们改变方向。这样,一串工具名称才开始变成一项可以推进的工作。