博客/工程

仔细看看Grafana为Loki设计的用户界面

2019年1月2日 6分钟

简介

在Grbob电竞频道afana Labs,我们为托管产品运行了大量的微服务。我们非常满意使用Graphite和Prometheus进行的监控,以及使用Jaeger进行的分布式跟踪。但是我们很难找到一个适合我们需求的日志聚合系统。现有的解决方案提供bob彩票中奖计划了许多特性,但是这些相同的特性在某种程度上阻碍了快速查找日志。我们决定构建自己的简化日志聚合:洛基.它是设计为后端精简.此外,我们尝试用一种干净直观的方式来读取Grafana内部的日志。这篇文章详细介绍了一些用户体验目标,我们必须更简单、更快地交付日志。

洛基和格拉夫娜。

没有分页

所有结果都显示在一个页面上

分页将内容分割到多个页面。结果是,您只能看到一页上所能容纳的日志行数,无论是20行、50行还是100行。要查看更多行,您需要转到下一页,并等待这些结果加载。

这种方法有三个问题。第一个是,它假设log行是单独读取的,并且在读取了大约20行之后,您将移动到下一组。这忽略了一个事实,即我们人类非常擅长模式识别。日志输出有节奏和结构。正常的日志输出可能看起来像正常的心电图。分页会中断多行模式,使您更难发现正在寻找的问题。就像您不需要查看一个单词的每一个c-h-a-r-a-c-t-e-r来识别它一样,您不需要查看每一个日志行来发现模式。

第二个问题是延迟。每当我前进一个页面,就会发送一个加载新页面的请求。由于该请求返回的行也同样很少,所以我可能不得不再次请求下一页。然而,我们发现的最糟糕的问题是分页剥夺了用户的控制权。如果呈现的行集很小,那么内置的浏览器搜索功能就会大打折扣。

那么我们该怎么做呢?我们返回并渲染相当数量的日志行,这些日志行足够大,可以在向下滚动时发现模式。由于这些日志已经加载到浏览器中,因此可以使用浏览器的搜索功能进一步搜索它们。缺省限制是1000行,但是可以配置。

过滤日志行

在没有分页的情况下,您需要确保要查找的内容位于1000行的结果集中。你可以通过过滤来做到这一点。时间、标签和正则表达式的组合应该足以返回一个合适的结果集以供滚动。日志结果上方的图表显示了在给定查询中,随着时间的推移,根据日志级别可以看到多少日志行。如果看到峰值,可以使用图表根据图表中的模式进一步放大。

在直线直方图中过滤对数线。

查询字段可以采用合适的正则表达式,并且在输入时突出显示匹配的正则表达式。这在测试各种表达式以进一步筛选现有结果时非常有用。当再次运行查询时,只返回匹配的结果以获得更有意义的结果。最终,我们希望用户能够选择多个日志流(就像他们可以在Grafana中从多个数据源中图形化数据一样),将它们复用到单个流中,然后允许链式过滤,类似于经典的日志记录grep用例:...| grep foo | grep -v bar

特别的统计数据

通过日志行进行统计对于发现不健康的行为非常有用。例如,如果您的数据库集群有3个只读节点,但只有2个正在处理请求,那么一定有问题。在繁忙的日志行中,这种模式很难发现。

我们认为,1000行数据集足以运行这样的分析。我们已经实现了一些解析器来从日志行中提取字段,例如,实例=foo_1 status=400….这允许我们按需构建动态场匹配器,以收集跨行集的场值分布,例如,实例foo_155%的行有场实例

字段上的临时统计信息。

因为我们计算的是浏览器中已经存在的结果集的统计信息,所以结果会立即显示出来。值得注意的是,良好的过滤对于最大限度地增加您想要匹配的字段的行数非常重要。我们正在扩展解析和匹配逻辑,以允许基于数值绘制图形,例如,如果您的日志行包含某些行时间= 11.3女士,这应该是一个临时的时间序列。

性能

在浏览器上呈现1000行并不容易。大约需要500毫秒,在此期间主线程被阻塞,浏览器会感觉冻结。为了保持页面的互动性,我们使用了分阶段方法。首先,渲染图形以快速概述日志线随时间的分布。然后呈现前100行,这将覆盖整个屏幕几次以上。这是为了确保我们能够快速呈现有意义的日志。在进一步延迟之后,将呈现剩下的行,以允许对所有结果进行滚动和浏览器内搜索。注意,行数限制在Loki数据源中是可配置的,以防您想根据浏览器的性能调整行数。

探索和分屏视图

Grafana为Loki设计的用户界面是Grafana新功能的一部分探索.Explore从一个更面向查询的工作流程开始,围绕故障排除普罗米修斯指标。

度量和日志并排

一旦你完善了你的普罗米修斯查询来显示不健康的行为,您可能已经确定了正在发生故障的服务和/或实例。这就是洛基的用武之地。洛基使用的选择器逻辑和普罗米修斯一样。考虑这样一个普罗米修斯查询http_requests_total{= =“应用服务器”,工作实例app1,路线= " / foo "}您可以使用它来识别故障实例。当切换到Loki时,它会重用日志存在的相关选择器标签,例如,{工作=“应用服务器”,实例= " app1 "}.注意它是如何自动删除路线标签和指标名称。因此,使用Explore的Split视图,你可以让Prometheus和Loki并排显示相关指标和日志。

结论

洛基和格拉夫娜是绝配。后端保持精简和节省空间,而用户界面允许特别的字段解析和简单的统计。目前,我们还不能在很长一段时间内回答“X的上n”这样的问题,但我们仍然相信这种权衡对于故障排除是非常有用的。现在还处于早期阶段,所以请尝试一下,提供GitHub上的反馈或者做出贡献,这样我们就能让每个人都过得更好。

洛基可以在预存中运行,也可以在Grafana Cloud上作为免费演示版本运行。参观洛基主页从今天开始。