使用Steampipe和GitHub Actions创建一个 "作为代码的仪表板",以探索数以千计的Hacker News故事,直到当前小时。
在上一集里,我们看了一个Steampipe仪表盘,它将不同API的搜索结果连接起来。这个元搜索仪表板完全是用两种语言混合的代码定义的。用SQL查询API,用HCL(HashiCorp Configuration Language)将结果输入仪表盘表格。
这种仪表盘即代码的方法倾向于 "基础设施即代码 "的理念。我们认为,仪表盘是另一种基础设施,应该用软件来定义,用版本控制的存储库来管理,并从存储库中部署。
在这一集里,我们将看到一个探索发布在Hacker News上的项目的仪表盘。它说明了Steampipe参与软件定义的工作流程的几种方式。
可视化涵盖了自6月21日以来的15,000多个故事。这比你从Hacker News API上一口气吞下的历史要多得多。那么,历史数据是从哪里来的?它就在 repo 里。
历史数据
每小时,GitHub Action 会检查 repo,运行 Steampipe,查询新项目,将它们导出到 CSV 文件,提交该文件,并推送到源文件。因此,当你克隆或更新回购时,你会得到新的数据。在安装了Steampipe和CSV插件后,你可以这样查看仪表板:
cd ~/steampipe-samples/all/hackernews
./update.sh
steampipe dashboard
然后访问https://localhost:9194 。在任何时候重复./update.sh ,以拉动和纳入最新的数据。计划每小时运行的GitHub动作做了以下工作:
- 查看 repo
- 在GitHub运行器中安装Steampipe
- 安装Hacker News插件
- 查询最新的故事,并将输出结果发送到一个CSV文件中
- 提交新的CSV文件并推送修改内容
我在GitHub行动派对上迟到了,但我现在已经到了。这是一个持久地积累小快照的好方法
对于那些记分的人来说,这个工作流程中有三个Steampipe的实例:
#1号在GitHub行动中使用Hacker News插件拍摄快照。
#2号使用CSV插件在你的本地Steampipe数据库中建立了表格。
#3号启动你的浏览器连接的本地仪表板服务器。
HCL + SQL
来源面板提供了一个域的选单,并找到URL与所选域相匹配的故事。这里是读取所有URL并提取其域名的SQL查询。最棘手的部分是正则表达式,但所有语言的正则表达式都是如此。SQL本身很简单,容易理解:
with domains as (
select distinct
substring(url from 'http[s]*://([^/$]+)') as domain
from
hn_items_all
)
select
domain as label,
domain as value
from
domains
order by
domain
创建提取列表的HCL也同样简单易懂:
input "domain" {
width = 3
sql = <<EOQ
-- as above
EOQ
}
这就是各地的模式。用SQL来获取数据,用一个薄薄的HCL包装器将结果流向一个小部件。这两种类型的代码,共同定义了仪表盘,诞生在一个 repo 中,在那里发展,并从那里进行部署。在低代码或无代码系统中,所有相同的信息都生活在一个由应用程序管理的数据存储中。你可能(我曾经做过)不得不导出这些信息,以便在 repo 中记录系统的演变。最好的办法是让它一直在那里。
当然,低代码或无代码系统的重点是将代码包裹在工具中,以释放那些不懂代码的人的创造力。目前还没有这样的工具,用于HCL+SQL的组合,但可以有。在代码中定义的系统对读取和写入代码的工具本身是友好的。例如,Hacker News repo包括一个异想天开的例子,它通过程序化地编辑一个仪表盘文件和改变某些HCL值来实现图表的动画。
虽然我在这个例子中没有使用解析器,但当然也有将代码渲染成数据的HCL和SQL解析器。在之前的一集中,我们展示了另一个Steampipe插件如何将Terraform文件转化为Steampipe表格,从而实现验证Terraform定义的合规性检查器。当你建立和发展仪表盘时,你难道不希望以同样的方式验证它们吗?一个作为代码的架构保证了这是可能的。
也就是说,用纯粹的HCL+SQL来编码Steampipe仪表盘是很容易的,很有趣的,而且很有成效。以下是我最喜欢的两件事,使它成为可能。
实时编辑
当你在一个自动保存的编辑器中编辑仪表盘代码时,仪表盘会立即做出反应。如图所示,对于协调数据的HCL代码和获取数据的SQL代码的改变都是如此。
这是一种直接操作的界面。"一种处理界面的方法,它涉及感兴趣的对象的连续表示,以及快速、可逆和增量的行动和反馈"。(维基百科)
布雷特-维克多是这种方法的伟大倡导者。在《原则性发明》的这一段中,他指出了直接操纵所要解决的问题:
我有这段代码,我有这幅图,我必须在我的脑海中保持这两者之间的映射关系
看到代码修改的结果所需的时间越长,就越难维持这种映射关系。即时的反馈是无价的,但往往无法得到。在早期的网络编码中,我们认为这是理所当然的,但现在往往有一个构建步骤,阻碍了直接操作。
当编码一个Steampipe仪表盘时,你可以从HCL和SQL中得到即时反馈。近年来,我写了很多Postgres查询。在一个能在我打字时刷新查询结果,或在我犯错时显示Postgres错误信息的环境中编写它们,是一种变革。
网络感性
编写Steampipe仪表盘在其他方面也让我想起了早期的网络。例如,链接是Steampipe仪表盘的第一等公民,而这在今天并不总是如此。提交面板将用户名链接到另一个仪表盘,以探索来自选定用户的所有提交。这一切都像一个网络开发者所期望的那样工作。
还有一个查看来源的按钮。还记得 "查看来源 "吗?它曾经在网络上很重要。现在,它通常只是向你显示最小化的行噪声。但是,HCL+SQL的组合让我想起了早期的HTML+JS组合--这是一个好办法下面是对其中一个仪表盘面板背后的来源的窥视。
伴随着直接的反馈,这种可观察性有助于早期网络的起飞。你会看到一些东西,想知道它是如何完成的,查看源代码,学习和模仿。新手网络建设者不能再参与这种良性循环了。新手Steampipe仪表盘制作者可以,这对一个繁荣的生态系统是个好兆头。
以思维的速度实现数据的可视化
由于Steampipe扩展了Postgres,你可以使用任何工具来创建由Steampipe数据支持的仪表盘。如果你精通Metabase、Tableau或其他连接到Postgres的工具,Steampipe的API到数据库表的超级能力将加速你在这些环境中对不同来源的数据进行可视化的能力。但如果你真的尝试用Steampipe的方式做仪表盘,请让我知道情况如何。根据我自己的经验,这是把一个想法变成一个有用的仪表盘的最快和最愉快的方式。