【问题标题】:Measure gRPC bandwidth per stream测量每个流的 gRPC 带宽
【发布时间】:2018-05-18 16:37:41
【问题描述】:

我有一个用 Go 编写的 gRPC 服务,它运行时间很长。我想要一种方法来测量每个流的网络/带宽使用情况,并将该信息提供给prometheus

我找到了grpc.StreamServerInterceptor,但据我所知,它无法让您访问编组的消息(我需要弄清楚它的大小)。

我找到了this第三方中间件,但是好像没有导出任何网络相关信息。

【问题讨论】:

  • StreamServerInterceptor 不会让您访问编组的消息,而是让您访问流。您可以轻松地代理流并在它们经过时计算字节数。
  • @Adrian 如果需要,我会使用外部代理,但我更愿意将网络使用情况与服务器的其他指标一起导出。
  • 不是外部代理,是内部proxy
  • @Adrian 如果我正在代理未编组的消息流,我该如何“计算字节数”?
  • 我刚刚找到了 proto.Size 方法。我会编组两次,但我会一直担心它,直到它成为瓶颈。

标签: go grpc prometheus


【解决方案1】:

您可以在 gRPC serversclients 上设置 stats.Handler。您可以在提供的上下文中放置您需要的任何标签。

然后gRPC 将使用stats.OutPayloadstats.InPayload 调用处理程序的HandleRPC 方法,其中包含消息(原始和编码)、其未压缩和线路长度以及时间戳。

我是all in the source code

【讨论】:

  • 这是完美的
  • 我需要一种方法来确定有效负载来自哪个流。我想我需要以某种方式标记上下文,但我不知道在哪里做。
  • 您的stats.HandlerTagConnTagRPC 方法应该 使用有关连接和RPC 的信息进行调用。您应该将与您相关的位放入您返回的Context 中,并且Context(或基于它的位)应该在HandleConnHandleRPC 方法调用中传递给您的处理程序获取。
  • 如果TagRPC参数中包含请求消息就好了。
  • HandleRPC 将为您提供消息。 TagRPC 旨在提供元数据,例如这是什么方法。
猜你喜欢
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2021-12-12
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 2011-08-29
相关资源
最近更新 更多