博客/社区

如何使用Grafana和Prometheus去Rickroll你的朋友(或敌人)

2021年7月30日8分钟

Jacob Colvin是84.51°网站可靠性工程师,这是一家零售数据科学、洞察和媒体公司。在他的空闲时间,他喜欢在开源和他的家庭实验室工作。

一段时间以来,使用创造性或意想不到的媒介播放视频已经成为一种持续的趋势。举几个例子,你可以找到玩的解决方案bob彩票中奖计划坏苹果通过一切不溶任务管理器

与此同时,也有一些项目在普罗米修斯中存储图像,我第一次接触它是通过Giedrius关于在普罗米修斯存储ASCII图像的博客文章.最近,Atibhi Agrawal介绍了支持通过promtool回填Prometheus指标,这使得这类项目更快更容易。同时,Łukasz Mierzwa最近我们在《Prometheus》UI中添加了暗黑模式,这为我们提供了更多显示选项。

所有这些都意味着——你猜对了——这是一些可观察性A/V恶作剧的完美时机。

在这里,您将学习如何使用Grafana和Prometheus创建流行的Rickroll表情包,当一个看似无辜的超链接用Rick Astley经典的80年代热门歌曲“Never Gonna Give you Up”的音乐视频给用户带来惊喜。

和普罗米修斯玩视频

要用Prometheus播放视频,首先我们需要通过Prometheus UI显示单个图像。为此,我们可以将样本值看作给定像素的y坐标,时间戳看作x坐标,它的存在与否作为颜色。然后我们给每个样本一个等于其y坐标/值的标签,为每个值创建一个惟一的维度。例如,we can draw by hand:

现在我们只需要从图像文件自动生成这些指标,并通过promtool回填所有这些指标。我们可以用围棋/ png图像这个包,还有文档举例说明如何读取每个像素的亮度。如果亮度高于50%,我们可以写一个样本,如果亮度低于50%,我们什么都不写。坐标也非常简单,我们只需要反转y轴,因为png文件的左上角是(0,0),而我们的左下角是。我们还可以预先确定样本在x轴上的距离(我仍然称其为“刮擦间隔”,尽管我们在回填所有内容),并将x坐标乘以时间。

对于视频,我们只需要对视频中的每一帧做这个,连续的。我们可以假设每一幅图像都是相同的分辨率,这使得计算每一帧的开始和结束时间变得简单。从本质上讲,我们在普罗米修斯内部制作了一段影片。

现在,如果我们把我们的图形定位为我们正在观看一帧,时间向前移动会把我们移到两帧之间,再次移动会让我们进入下一帧。我们可以通过快速点击两次或编辑calcShiftRange函数在我们的浏览器中不除以2。我们可以记录自己以固定的间隔在帧中循环(可能稍后会加速视频),也可以在指标加载后截屏并使用ffmpeg将这些截屏转换为视频。

搬到格拉弗纳

在Prometheus UI中播放视频是很酷的,但是从设计上来看,图像是非常简单的。如果我们想用黑色或白色显示不可见的东西,或者至少是不能理解的东西,该怎么办呢?Grafana非常适合这项任务,因为它具有覆盖功能,允许我们将选择的颜色分配给特定的度量。所以,为了让这个工作,我们只需要在我们的指标中添加一个额外的标签来定义像素的亮度。例如,颜色= " 0 "黑色或颜色= " 255 "为白色。

然后,我们可以为颜色的每个可能值添加覆盖。例如,匹配0会将颜色设置为rgb(0,0,0)。我花了大约2个小时在Grafana UI中添加每个覆盖…只是开玩笑。幸运的是,Grafana有一个Jsonnet库,Grafonnet,这使得创建这个仪表板变得非常简单。你可以找到我所有的代码在这里

现在,我们可以再次回填Prometheus,这次用我们的附加标签,并加载我们的生成的仪表板

然而,这里的数据比以前多得多。除非你能接受<0.1 FPS的播放,否则反复点击前进按钮就不再实用了。在这一点上,我转向grafana-image-renderer,这让我们可以卷曲Grafana,得到一个带有特定开始和结束时间戳的仪表板截图。我们可以用正确的时间发出几千个请求,并用ffmpeg将结果转换为视频。最后,我写了一个小的围棋程序来帮助实现这一点,你可以找到它在这里.使用Go还允许我们轻松地利用grafana-image-renderer的集群渲染模式并并发请求大量图像。

变得五彩缤纷

我猜下一步是以某种方式映射UI中使用的颜色和视频中的颜色,这样就可以不仅仅用黑白视频来做这件事
- @stag1e的推特

扩展到全色应该很容易,对吧?我们可以只为红色、绿色和蓝色设置一个标签,或者为像素的十六进制颜色设置一个单独的标签。

然而,这种方法揭示了一个经典问题。对于一个从黑到白的通道,256个可能的亮度级别对应于256个覆盖。然而,如果我们增加一个额外的通道,我们最终会乘以可能的组合。所以对于两个通道(如红色和绿色),每个通道有256个关卡,我们需要65,536个覆盖。为全RGB颜色添加第三通道意味着我们需要16,777,216次覆盖。在我的Prometheus实例上,这种度量基数的程度可能是可以管理的,但我对Chrome没有这么高的期望,而且复制大量的1亿行仪表板的想法似乎也没有吸引力。

在这一点上,我想到了另一个解决方案,一个可以提供完整的RGB颜色,更重要的是,我认为它会很酷。

答案是…屏幕感知。基本上,你正在使用的设备上的像素非常小。它们可能会大得多,但仍然会保持混合颜色的错觉。

这里我们有三个不同的渠道:

把它们搅在一起,对我来说看起来很像白色!

这样的结果基本上是三个以前的灰度面板并排运行。由于所有繁重的乘法都是由您的眼球完成的,因此每个通道只需要256次覆盖,总共768次覆盖。所以,我们可以模拟尽可能多的颜色,不受任何基数爆炸的影响。通过生成新的覆盖和目标并将其传递到相同的仪表板,我们可以重用之前的Jsonnet来生成此操作。

现在的可能性是无穷无尽的。(请务必观看4k全屏视频,以获得最佳体验。)

音频

下一个是声音吗?
-在Reddit上

整个项目的画龙点睛之笔是为音频找到某种解决方案。我们不能通过Grafana直接播放任何东西,除非为此制作某种插件,我想让我的Grafana实例保持香草风格。但是,可以编写一个简单的客户机直接从Prometheus读取数据并回放。

如果你仔细想想,普罗米修斯是非常理想的音频存储设备。每个音频通道都是一个波,而这个波就是一系列的数字。我用了go-wav包将wav文件读入一个整数片,然后将其与相关元数据(例如抽样率)一起作为标签回填。

任何时候我们想要回放我们的文件,我们可以使用普罗米修斯的client_golang要按顺序拉回小块,用相同的go-wav包将时间序列转换回wav,并通过我们的扬声器播放音频哔哔的声音

虽然音频并不是通过Grafana播放的,但是我们仍然可以通过完美地排列音频和视频样本来获得可视化效果。这将导致相对较低的音频质量,因为频率有效地受制于每帧的水平分辨率。从技术上讲,我们可以提高分辨率,或者为视频和音频使用不同的抓取间隔,但我不想增加这种复杂性。而且这让整件事更可信一点!

回到原点:《普罗米修斯开发峰会》的录音

这些努力的结果就是创造了这个普罗米修斯开发峰会视频.这个视频以24帧/秒的速度超过2小时,这意味着大约有17.5万帧,相当于30GB的普罗米修斯度量压实。整个视频花了3天渲染,grafana-image-renderer集群最大并发数设置为25。

结论

这一切之所以成为可能,是因为许多不同的人做出了大量的贡献。如果你是其中之一,谢谢你。如果没有2021年推出的新功能,这个项目可能就不可能实现。

最后,如果您想亲自尝试其中的任何一个,您可以找到我的所有代码和文档在这里