SkyWalking系列之skywalking go agent 使用问题
概述
Method not found: skywalking.v3.ManagementService/reports Instance Properties
环境搭建
golang 1.15.10 gin v1.7.2 go2sky v1.0.0 go2sky-plugins v0.6.0 go2sky-plugins/gin/v3 v3.0.0 skywalking: v8.1.0/v8.5.0
问题描述和解决
集成go2sky 到gin框架后,启动后发现报错,错误提示:
Method not found: skywalking.v3.ManagementService/reports Instance Properties
分析发现是gpc请求访问skywalking服务器报错引发,由skywalking服务器返回错误信息,找不对对应的方法,执行流程:
方法执行流程: go2sky.NewTracer -> reporter.Boot-> reporter.check-> reporter.reportInstanceProperties-> managementClient.ReportInstanceProperties 流程描述:创建Tracer,校验过程需要调用ReportInstanceProperties方法,给skywalking服务器上报实例信息,使用rpc请求的方式。 managementClient.ReportInstanceProperties方法:
func (c *managementServiceClient) ReportInstanceProperties(ctx context.Context, in *InstanceProperties, opts ...grpc.CallOption) (*v3.Commands, error) { out := new(v3.Commands) err := c.cc.Invoke(ctx, "/skywalking.v3.ManagementService/reportInstanceProperties", in, out, opts...) if err != nil { return nil, err } return out, nil }
通过问题描述发现,应该是skywalking服务器,没有这个对应的方法,我们去v8.1.0的源码里去一探究竟
public void reportInstanceProperties(org.apache.skywalking.apm.network.management.v3.InstanceProperties request, io.grpc.stub.StreamObserver<org.apache.skywalking.apm.network.common.v3.Commands> responseObserver) { asyncUnimplementedUnaryCall(getReportInstancePropertiesMethod(), responseObserver); }
同时看到通过protobuf协议生成的代码,服务名称为:ManagementService,我们在go client中调用的是:skywalking.v3.ManagementService,应该是我们使用的client版本跟skywalking不匹配导致的 这里我们将skywalking服务升级为v8.5.0的版本,重新启动gin 服务,发现可以正常运行,可以上报链路的数据,我们翻看v8.5.0的源码看下,我们到底错在哪里: 可以清晰的看到 SERVICE_NAME = "skywalking.v3.ManagementService"
问题定位了,Method not found: skywalking.v3.ManagementService/reports Instance Properties报错由go agent版本跟skywalking版本不配做,导致grpc请求失败引起,升级skywalking版本到对应的版本,解决该问题。
后记
使用go agent client需要注意,不是skywalking官方推出的版本,文档和坑相对较多,需要摸索解决