首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >grpc低层遥测测井

grpc低层遥测测井
EN

Stack Overflow用户
提问于 2019-04-03 19:23:13
回答 1查看 1.3K关注 0票数 0

我试图在较低的级别上度量我的服务的延迟。环顾四周,我发现可以向grpc构建器添加一个addStreamTracerFactory

我完成了这样一个简单的实现,并打印了日志:

代码语言:javascript
复制
val server = io.grpc.netty.NettyServerBuilder.forPort(ApplicationConfig.Service.bindPort).addStreamTracerFactory(ServerStreamTracerFactory)....

class Telemetry(fullMethodName: String, headers: Metadata) extends ServerStreamTracer with LazyLogging {
  override def serverCallStarted(callInfo: ServerStreamTracer.ServerCallInfo[_, _]): Unit = {
    logger.info(s"Telemetry '$fullMethodName' '$headers' callinfo:$callInfo")
    super.serverCallStarted(callInfo)
  }

  override def inboundMessage(seqNo: Int): Unit = {
    logger.info(s"inboundMessage $seqNo")
    super.inboundMessage(seqNo)
  }
  override def inboundMessageRead(seqNo: Int, optionalWireSize: Long, optionalUncompressedSize: Long): Unit = {
    logger.info(s"inboundMessageRead $seqNo $optionalWireSize $optionalUncompressedSize")
    super.inboundMessageRead(seqNo, optionalWireSize, optionalUncompressedSize)
  }
  override def outboundMessage(seqNo: Int): Unit = {
    logger.info(s"outboundMessage $seqNo")
    super.outboundMessage(seqNo)
  }
  override def outboundMessageSent(seqNo: Int, optionalWireSize: Long, optionalUncompressedSize: Long): Unit = {
    logger.info(s"outboundMessageSent $seqNo $optionalWireSize $optionalUncompressedSize")
    super.outboundMessageSent(seqNo, optionalWireSize, optionalUncompressedSize)
  }
  override def streamClosed(status: Status): Unit = {
    logger.info(s"streamClosed $status")
    super.streamClosed(status)
  }

}

object ServerStreamTracerFactory extends Factory with LazyLogging{
  logger.info("called")
  override def newServerStreamTracer(fullMethodName: String, headers: Metadata): ServerStreamTracer = {
    logger.info(s"called with $fullMethodName $headers")
    new Telemetry(fullMethodName, headers)
  }
}

我正在循环中运行一个简单的grpc客户机,并检查服务器流跟踪器的输出。

我看到日志的“生命周期”重复了自己。下面是一个迭代(但它一次又一次地发出完全相同的结果):

代码语言:javascript
复制
22:15:06 INFO  [grpc-default-worker-ELG-3-2] [newServerStreamTracer:38] [ServerStreamTracerFactory$] called with com.dy.affinity.service.AffinityService/getAffinities Metadata(content-type=application/grpc,user-agent=grpc-python/1.15.0 grpc-c/6.0.0 (osx; chttp2; glider),grpc-accept-encoding=identity,deflate,gzip,accept-encoding=identity,gzip)
22:15:06 INFO  [grpc-default-executor-0] [serverCallStarted:8] [Telemetry] Telemetry 'com.dy.affinity.service.AffinityService/getAffinities' 'Metadata(content-type=application/grpc,user-agent=grpc-python/1.15.0 grpc-c/6.0.0 (osx; chttp2; glider),grpc-accept-encoding=identity,deflate,gzip,accept-encoding=identity,gzip)' callinfo:io.grpc.internal.ServerCallInfoImpl@5badffd8
22:15:06 INFO  [grpc-default-worker-ELG-3-2] [inboundMessage:13] [Telemetry] inboundMessage 0
22:15:06 INFO  [grpc-default-worker-ELG-3-2] [inboundMessageRead:17] [Telemetry] inboundMessageRead 0 19 -1
22:15:06 INFO  [pool-1-thread-5] [outboundMessage:21] [Telemetry] outboundMessage 0
22:15:06 INFO  [pool-1-thread-5] [outboundMessageSent:25] [Telemetry] outboundMessageSent 0 0 0
22:15:06 INFO  [grpc-default-worker-ELG-3-2] [streamClosed:29] [Telemetry] streamClosed Status{code=OK, description=null, cause=null}

通过查看这些日志,有些事情对我来说还不太清楚:

  1. 为什么要为每个请求创建一个新的流?我认为grpc客户端应该重用连接。“溪流关闭”不应该叫做对吧?
  2. 如果流被重复使用,我怎么会看到inboundMessage数字(和outboundMessage)总是"0“。(同样,当我并行地启动多个客户机时,这个值总是0)。在什么情况下,消息号不应该是0?
  3. 如果流没有被重用,我应该如何以不同的方式配置客户机来重用连接?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-05 00:10:11

在gRPC中,为每个RPC创建一个HTTP2流(如果启用了重试或对冲,则每个RPC可以有多个流)。HTTP2流在一个连接上被复用,打开和关闭流非常便宜。所以,这是连接被重复使用,而不是流。

从跟踪器方法中获得的seqNo是该流的消息的seqNo,它从0开始。看起来你在做一元RPC,它发出一个请求,得到一个响应,然后关闭。你看到的是完全正常的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55502817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档