【译】监控 API 响应中缺少数据点? 使用页面迭代器!

131 阅读5分钟

开始使用谷歌云监控API - 第三部分

迭代器简化了对API响应进行分页的过程。学习使用页面迭代器从`list_time_series`调用中获取所有数据点。

在GCP上运行的企业通常在不同的地区/区域有多个资源实例,以实现HA(高可用性),即在较长的时间内提供一致的正常运行时间。

与我合作的一个GCP客户,在他们的云环境中设置了9个路由器。这些路由器每分钟产生一个数据点,其值为0或1,其中'1'表示路由器的停机时间。你能在脑子里想象一下数据点的数量吗?

9 * 30 * 24 * 60 = 一些东西!吁。

我的上一篇博文讨论了如何获取这些指标数据点。当API响应返回超过10万个数据点时,比如上面的案例-388800点,响应只包含前10万个点和一个nextPageToken,可以用来获取下一组点。这可能有点令人困惑。你如何使用 nextPageToken?这篇博客提出了两种方法,你可以用它来获取所有的数据点。

缺少一些数据?[照片:Franki ChamakionUnsplash]

我所有的数据点都在哪里?

作为一个使用监控API的初学者,很难理解为什么响应中没有包含所有的数据点,特别是当你在请求中没有传递pageSize以及过滤器或间隔等参数时。
答案是,如果请求中传递的pageSize是空的(没有传递)或者超过10万个结果,有效的pageSize就是10万个结果。如果视图被设置为FULL,这就是返回的最大点数。

我怎样才能得到剩余的数据点?

请参考这里的API响应的详细内容。

{

直接使用 nextPageToken

正如文档所说,如果有更多的结果被返回,那么nextPageToken被设置为一个非空值。

要看到额外的结果,请在下次调用此方法的请求中把nextPageToken作为pageToken传给他。响应是一个带有下一页标记的结果/数据点的列表,直到你达到一个nextPageToken为空的调用,意味着所有的值都被返回。

你在想这不是一个相当长的过程吗?是的,自己调用并在每个值中添加令牌值就是这样。这就是为什么我们要使用页面。

使用页面迭代器

迭代器简化了对API响应进行分页的过程。那些拥有遵循列表分页模式的方法的API客户端可以返回一个 迭代器.你可以使用这个迭代器来获取所有页面的所有结果。

results = client.list_time_series(request={ ... })

以一个案例为例,结果包含了你最后一次API调用的响应,请求中包含了适当的参数。现在,我们知道,如果响应包含超过100,000个点,响应将被分页。简单地使用下面的代码片段来迭代这些页面,并将所有的点存储在一个单独的列表中。这个列表保持在内存中。稍后,我们可以使用列表中的点,而不是为每个页面调用API。

all_points = []

由于我们没有对任何点进行突变或将其改为列表对象,我们仍然可以使用点所具有的本地方法来获得当时的时间和相应的值(公制值)。

medium.com/media/b43ec…

一些直接来自监控API开发者的建议------。

正如我们可以想象的那样,分页是每页进行一次服务器调用,因此是相当慢的。当你有大量的点时,一个更好的方法是更好地组织你的过滤器,使响应中的点的数量少于100,000。用博客开头的路由器的例子来解释 -

现在收回所有的数据 :)[ 摄影:Franki ChamakionUnsplash]

如果所有的路由器都有差不多的点数,你可以尝试发送9个查询,每个查询都有一个 "路由器=x "的过滤器,只需单独获取每个路由器的数据。然后,每个回复都可以在一个页面上显示出合适的数值。你可以使用list_time_series,并将视图设置为HEADERS,以获得x的值(HEADERS只给你哪些时间序列存在,而没有任何实际数据)。

详细了解 "列表分页 "的情况

由于这些方法遵循所有具有分页响应的API的通用方案,你可以查看Google API风格指南中的列表分页以了解更多细节。
实际上,我是参考了很多关于google APIs的日历的答案,找到了监控API问题的解决方案,因为,是的,它们遵循同样的风格指南。这也说明了在编写代码时遵循最佳实践是多么重要。样式使人们容易吸收信息,并进一步使用它。

希望你觉得这很有用

[作者的照片--在这里用我尝试的一点数字艺术来结束监测系列的工作 !👋🏼]


在你的监测API响应中缺少数据点?使用页面迭代器!最初发表在Medium上的Towards Data Science,在那里人们通过强调和回应这个故事继续对话。