Squzy-具有事件和通知的免费开源自托管监视系统

一个炎热的冬天晚上,我们想到了编写一个应用程序来检查我们工作的公司的站点地图的想法,并能够在发生错误时进行通知。



渐渐地,这个想法转移到了实现上,他们有了改进的想法,出现了对主机的监视,然后对应用程序进行监视,并且像锦上添花一样,发出了通知事件。



结果,我们得到了一个完善的监视系统,它是一个完全开源的自托管解决方案,它没有外部通信,完全由用户定义了事件。



在这篇文章中,我们想向您介绍所产生的产品。



技术细节



选择了一种微服务架构进行开发。后端是在GoLang中开发的,是用于开发微服务的快速便捷的语言。我们使用gRPC在服务之间进行通信。除了gRPC可以在HTTP / 2上运行的事实之外,它还具有所有暗示的功能,通过原型对服务接口的描述将使您作为用户在必要时为系统的各个部分创建自己的实现。



该项目使用Mongo作为快速访问数据库,并使用Postgres来存储收集的统计信息。



Bazel用于组装和部署。Bazel允许您声明性地描述Golang中软件包之间的依赖关系。此外,我们开始使用远程缓存测试Bazel,这对系统速度有积极影响。Bazel还收集了Docker中的所有应用程序并组织了单元测试。所有这些都集成到Github动作中。



系统的仪表板是用Angular 9编写的。在



覆盖每个实体的那一刻,我们尝试将其保留在单元测试中。在不久的将来,将实施集成和端到端测试以提供最完整的系统支持



系统描述



如上所述,Squazy是一组彼此交互的微服务,每个微服务处理单独的任务。



服务清单:



  • Agent Client — , . , . Agent Server.
  • Agent Server — , . Mongo, Storage.
  • Application Monitoiring — , / Squzy , . GoLang NodeJS, — PHP & Java .
  • Monitoring — external/internal .
  • Storage — . Postgres, ClickHouse.
  • Incident Manager- . ( ). Mongo, Storage.
  • Notification Manager — . Webhook & Slack.
  • API — API Gateway


服务交互方案如下:







为了演示Squzy的功能,开发了一个演示程序来监视其自己的服务器,并允许您监视仪表板上的系统:https : //demo.squzy.app/



演示中禁用了某些功能(例如添加/删除新实体),但是它使您可以查看和感觉系统的所有部分。下面,我们将详细介绍每种监视类型。



系统的这一部分负责外部/内部检查。目前,它允许您发送请求并期望对以下类型的端点的响应:



  1. TCP-打开端口检查;
  2. gRPC协议检查;
  3. Http-检查是否符合状态码;
  4. SiteMap-检查Sitemap中的所有URL都响应200 OK
  5. JsonValue-从JSON响应中收集特定值。


Squzy允许您向各种HTTP检查添加自定义标头。



通过Squzy仪表板添加检查的界面如下所示:







这里的时间间隔是检查之间的时间间隔(以秒为单位),而超时则是检查被认为不成功的时间。



创建后,用户可以访问检查器配置:







对于每种检查类型,您都可以编写事件规则。有关事件的更多详细信息将在下面描述,但在这里我们仅举一个例子:







在这种情况下,我们从站点测量美元汇率的价值,如果该值超过80,我们将创建一个事件。



链接到演示。



可以在以下事件上创建事件:



  • 验证持续时间(从服务器收到响应的时间);
  • 状态(返回的状态代码);
  • 值(检查器中传输的信息)。


蠕动剂



安装在服务器上的Squzy Agent用于监视系统中的主机。目前,它正在收集以下统计信息:



  • CPU-处理器负载;
  • 内存-已使用/免费/总计/共享;
  • 磁盘-每个磁盘的已用/可用/总计;
  • Net-每个网络接口。


代理时间表:



  1. 代理在代理服务器上注册并接收ID(注册期间可以指定监视间隔和代理名称);
  2. 代理每隔一定时间将统计信息发送到服务器。
  3. …。
  4. 代理将关闭通知给服务器。


如果没有与服务器的连接,则代理将继续收集统计信息,并在恢复连接后将其发送出去。



代理的演示版本可以在这里查看:https : //demo.squzy.app/agents/5f142b6141a1c6518723483a/live



代理还可以具有一组检查事件的规则:





Squzy应用监控



对于监视应用程序,已经使用Go / NodeJ的流行框架开发了集成(如成功的营销人员所说,该框架进一步扩展)。集成确定事务的类型(Http / Router / gRPC / WebSocket等)并解析引擎/请求的响应。



Squzy还支持事务跟踪,这使您可以监视多个服务器/服务的相关事务。在仪表板上监视此类交易的示例:https : //demo.squzy.app/transactions/om8l8LP96PRsvx67UxkES



用于集成到Go和Node Js中的库。





库的核心是中间件,它对发送事务之前的时间和处理之后的时间进行计时,并分析响应。我们还编写了一个示例GO监视应用程序:https : //github.com/squzy/test_tracing。



您可以创建自己的事务并评估其执行时间,状态和错误。为此,请使用Core软件包。为了简化产品支持,所有语言将为定义行为的程序包使用相同的名称。



您可以基于以下数据为每个事务创建事件:



  • 交易期限;
  • 交易状态;
  • 收到错误;
  • 交易类型。


Squzy事件管理器+通知管理器



Squzy中的事件基于规则。在向存储中添加新实体时,将检查所描述的规则,如果存在,则会创建一个事件(如果尚未创建)。



规则是expr的扩展版本,考虑到系统规范,已向其中添加了特定规则,例如Last(从Storage中获取最后n条记录),Use(为此使用了特定的过滤器)等等。有关所有规则的详细说明,请参见https://squzy.app/usage/squzy-incident/incident-rules,此处我们将重点放在一个说明性示例上。



假设您有一台具有1,792个处理器,256 GB RAM和16 TB硬盘空间的服务器。您真的想检查一下您的devops是否在CPU负载监视器上没有运行Doom。您知道维护一个为您的服务器提供服务的页面站点不会在一分钟内加载超过8个处理器的100%。此外,RAM的剩余空间超过一半。尽管硬盘驱动器具有TB的可用空间(如果您不在家中存储知名档案,则您的妻子会看到)。在这种情况下,知道每10秒收集一次指标,您可以定义以下规则来验证服务器是否正常运行:



any(Last(7, UseType(All)), 
    {all(.CpuInfo.Cpus, {.Load > 80}) &&
    .MemoryInfo.Mem.UsedPercent < 50 &&
    .DiskInfo.Disks["System"].Free > 1000000000000}
)


同样,Squiz允许您描述各种有害系统行为的模式。



规则检查成功(或不太成功)之后,将创建一个事件并通知用户(如果已配置)。



活动的事件,即尚未由用户验证的事件,可以自动关闭,即,如果在某个时候未通过验证,则选择适当的选项。



对于每个被检查的实体,无论是应用程序/检查器/代理,您都可以创建自己的事件通知。



结论



我们现在正在收集来自IT社区的反馈和意见。



我们已经制定了许多产品开发计划:



  1. 添加Java / PHP集成;
  2. 数据库检查器;
  3. 从Postgres迁移到ClickHouse;
  4. 更多通知方式;
  5. 与kubernetes集成;
  6. 改善文件;
  7. GQL API;
  8. 集成和端到端测试;
  9. 监控移动应用程序。
  10. 在UI上自动完成事件规则


我们很高兴收到任何反馈或建议。



链接





PS:

感谢您的文章Vonotirax



尝试1单击



All Articles