skywalking對http請求實現了無代碼入侵的跟蹤,但是對grpc則需要修改相應的代碼。
根據官方的提示:
https://github.com/SkyAPM/SkyAPM-dotnet/pull/236
1.由於Grpc沒有Diagnostics機制,只能通過它本身提供的Interceptor攔截器去實現追蹤,因此貌似沒有辦法做到代碼無浸入,必須要注入該追蹤攔截器
2.Grpc客戶端需要在new Channel().Intercept()中傳入ClientDiagnosticInterceptor實例對象
3.Grpc服務端需要在start()服務之前傳入ServerDiagnosticInterceptor實例對象
詳情可以參考示例代碼,效果截圖
以及官方提供的demo,我們在grpc的客戶端代碼進行調整:
1、構造函數注入一個攔截器 ClientDiagnosticInterceptor interceptor
2、構造函數創建client ,並且將該攔截器添加進來。
3、具體的代碼如下,里面包含了 grpc和http這2種類型的簡單實現。
[ApiController] [Route("api/[controller]/[action]")] public class WeatherForecastController : ControllerBase { private readonly IHttpClientFactory _clientFactory; private readonly ILogger<WeatherForecastController> _logger; private readonly Greeter.GreeterClient _client; public WeatherForecastController(ClientDiagnosticInterceptor interceptor,ILogger<WeatherForecastController> logger, IHttpClientFactory clientFactory) { _logger = logger; _clientFactory = clientFactory; var target = "localhost:5000"; var channel = new Channel(target, ChannelCredentials.Insecure); var invoker = channel.Intercept(interceptor); _client = new Greeter.GreeterClient(invoker).WithHost(target); } [HttpGet] public async Task<IActionResult> GetGrpc() { try { var reply = _client.SayHello(new HelloRequest { Name = "曉晨222" }); Console.WriteLine("Greeter 服務返回數據: " + reply.Message); } catch (Exception ex) { int i = 0; } return Ok("ok啦"); } [HttpPost] public async Task<IActionResult> PostHttp() { var request = new HttpRequestMessage(HttpMethod.Get, "http://10.10.1.204:31927/api/Health/Get"); request.Headers.Add("Accept", "application/vnd.github.v3+json"); request.Headers.Add("User-Agent", "HttpClientFactory-Sample"); var client = _clientFactory.CreateClient(); var response = await client.SendAsync(request); if (response.IsSuccessStatusCode) { return Ok(response.Content.ReadAsStringAsync()); } else { return Ok("error000001"); } return Ok("ok-post啦"); } }