【问题标题】:Want architecture for storage and tracking of application metrics需要用于存储和跟踪应用程序指标的架构
【发布时间】:2019-11-28 21:05:02
【问题描述】:

与许多现代应用程序一样,我在当前应用程序中有几个活动部分:

  • 网络服务
  • 各种队列
  • 各种工作进程

为了正确管理我的应用程序,我想跟踪各种与应用程序相关的任意指标,例如:

  • 一段时间内的平均队列长度
  • 平均队列处理时间和/或最大处理时间
  • 每单位时间处理的项目数,或每单位时间处理的类型 X 的项目数,例如最后一分钟、一小时、一天有多少
  • 等等

我无法为此提出一个逻辑模型,然后是一个实际的实现。我正在努力解决的一些问题:

  • 这些计算是如何进行的?通过与我正在测量的事情相同的过程?通过单独的流程?
  • 这些计算何时进行?例如,计算当然不应该与应用程序流程同步。
  • 如何存储这些计算的结果?是否有适合存储此类指标的数据库架构?

我的一部分感觉这是一个已解决的问题,我应该采用或重用一种架构或模式。

我故意提出这个问题,但没有提及我的应用程序使用的具体技术,因为我的直觉告诉我这对模式并不重要。

想法?

【问题讨论】:

    标签: monitoring metrics performance-measuring application-monitoring


    【解决方案1】:

    以下是每个问题的一些提示

    这些计算是如何进行的?通过相同的过程 我正在测量的东西?通过单独的流程?

    肯定不是同一个过程。原因是,如果你将这些计算绑定到任何不完全服务于这个唯一目的的进程,你的服务中就会出现一些分散的逻辑,并且很快就会变得无法维护。有一个集中的地方来执行所有的计算。让你的每一个架构都通过一些不可知的传输来发送它们的有效负载,比如 REST(或者如果你每秒有数百个传输速度,比如你提到的消息队列)。

    这些计算是什么时候进行的?计算当然不应该 例如,与应用程序流程同步。

    这取决于您的用例。如果您不需要实时执行所有计算,您可以拥有一个静态组件,它接收来自其他参与者的所有传入数据流,然后临时存储它们(稍后会详细介绍),另一个组件会遍历所有新获取的数据(或全部)来执行计算。后者可以由像 Celery 这样的库调度,或者使用标准的 cron 作业。

    我如何存储这些计算的结果?有没有 适合存储此类指标的数据库架构?

    标准 SQL 几乎可以用于任何实现。现在,如果您有主要是时间戳或时间序列数据的指标,您可以查看Time Series Databases (TSDB)

    【讨论】:

    • 思考如何进入下一步。现在我更愿意(可能是人为地)将自己限制在关系数据库中。我听说过的一件事是架构会是什么样子。例如,如果我想跟踪一个给定的指标 - 最后一分钟的事情数,最后一小时的事情数,最后一天等。或者它可能是同一时间段内某些值的平均值。例如,某些指标表中的每一列是否会出现?计算过程如何“了解”这些事件?我正在尝试正确看待问题。
    • 你的数据库应该有一个非常简单的模式,可能是一个单独的表(我不知道你想要存储什么),它包含关于你感兴趣的事件的简单基本记录(例如带有 id 的客户端X 在时间 Z 查询数据 Y)。这些表对“前 10 名”、“X 和 Y 之间的平均值”等一无所知。相反,这些特定信息由您进行的 SQL 查询检索(有专门为此设计的关键字,例如select top 50 from)。如果您想扩大规模,您可能希望避免过于频繁地进行这些昂贵的查询,并将它们临时存储在特定的表中。
    • 我看到基本上我会有一些“事件”表,我会为每个事件发布一条记录。假设这是一个队列消息的处理。列可能是队列类型、消息类型、时间戳”。等等。所以没有预聚合,只有原始事件。我会有各种独立于该进程运行的查询来执行计算并将它们显示到某个仪表板。这就是你的意思?
    • 是的,没错。强调如果您的查询变得更重/更频繁/更多数据,您可能只想执行一次并将结果保存在单独的表中。
    猜你喜欢
    • 2014-10-19
    • 2018-01-28
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多