【问题标题】:How to monitor the cloud function error rate with Google Cloud Monitoring?如何使用 Google Cloud Monitoring 监控云功能错误率?
【发布时间】:2021-04-13 11:43:13
【问题描述】:

当云函数在 30 分钟内超过 90% 的执行返回非 OK 状态代码时,我希望收到警报。

我过滤的系列是cloudfunctions.googleapis.com/function/execution_count。在所有记录中,我想计算那些满足metric.status != 'ok' 的记录。如果过去 30 分钟内 90% 的记录满足此条件,我想发出警报。

我查看了 Google Cloud 的 Monitoring Query Language 文档并找到了有关比率的部分:https://cloud.google.com/monitoring/mql/examples#qlx-ratio-ratio

我是这样写的:

fetch cloud_function
| metric 'cloudfunctions.googleapis.com/function/execution_count'
| { filter metric.status != 'ok'
  ; ident }
| group_by [resource.function_name]
| ratio
| window 30m
| condition ratio >= 0.9 '1'

它似乎有效,并且图表显示了正确的值。但是,似乎只要函数返回错误代码,即使有其他成功执行以补偿问题,也会引发警报。

例如,这是引发警报时的指标图表,我在 Monitoring > Alerting > 中获得(单击事件部分中的最后一个警报)

警报中报告的函数是processPurchase

我是否遗漏了一些可能导致问题的东西?查看图表,似乎警报不应触发。然而,我有关于警报的事件和通知。它会在几分钟后解决。

【问题讨论】:

  • 需要指定对齐周期,window 30m 不够。尝试查看everyalignment period in alerts
  • 您可能同时需要alignevery,但我现在不记得了.. 如果您能弄清楚,请随意自行回答问题。

标签: google-cloud-functions monitoring google-cloud-monitoring


【解决方案1】:

我不认为ratio 可能是您的最佳选择,因为ratio 计算两个对齐输入表的值列的比率。

我想你可以试试下面的代码:

fetch cloud_function
| metric 'cloudfunctions.googleapis.com/function/execution_count'
| align rate(30m)
| every 30m
| group_by [metric.status],
    [value_execution_count_percentile: percentile(value.execution_count, 90)]

如您所见,我使用的是相同的指标 cloudfunctions.googleapis.com/function/execution_count 但是使用 30 分钟的周期,以及 90% 的百分比而不是条件比率。

编辑1

我创建了一个简单的云函数来生成随机错误,

import random
def hello_world(request):
    request_json = request.get_json()
    x = random.randint(1,2)
    if x%2 ==0:
        raise NameError("my error x.x")
    else:
        return f'Hello World!'

然后我使用您发布的指标作为基础来生成我的指标:

fetch cloud_function
| metric 'cloudfunctions.googleapis.com/function/execution_count'
| { t_0:
      filter metric.status != 'ok'
      | align delta()
      | group_by [resource.function_name],
          [value_execution_count_aggregate: aggregate(value.execution_count)]
  ; t_1:
      ident
      | align delta()
      | group_by [resource.function_name],
          [value_execution_count_aggregate: aggregate(value.execution_count)] }
| ratio
| window 5m
| condition ratio >= 0.5 '1'

我只将比率移动到ratio >= 0.5 '1' 而不是 0.9,并将窗口缩小到 5m,以免整天都在获取数据。

但在我的警报配置中,我使用了: 如果所有时间序列都违反,则条件触发 在查询编辑器中使用条件运算符编辑阈值 = 5

使用此配置,我仅在条件满足时才会收到警报,而不是在函数返回错误代码时立即收到警报。

【讨论】:

  • every 30m 部分似乎在 30 分钟内给了我相同的数字,看起来数据在过去 30 分钟内没有聚合,而是每 30 分钟生成一个数据点。有没有办法计算每分钟过去 30 分钟的函数执行次数? (1-31, 2-32, 3-33,...)
  • @ThomasP。我已经编辑了我原来的答案。
  • 感谢您的编辑,每次函数崩溃或返回错误时,我仍然会收到警报。也许聚合被破坏了?
  • 也许它是你的触发条件,在我的情况下,如果我每 30 分钟配置一次,警报只会在第 30 分钟触发,而不是每次函数崩溃或返回错误时触发。或者正如您所提到的,聚合可能不适用于您当前的指标配置。
  • 我找到了filter_ratio_by,这似乎是为这种需求量身定做的,也许这行得通? cloud.google.com/monitoring/mql/examples#qlx-filter-ratio
猜你喜欢
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 2021-10-21
  • 2016-10-13
  • 1970-01-01
  • 2020-05-23
相关资源
最近更新 更多