skywalking 跟蹤grpc的鏈路

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實例對象
詳情可以參考示例代碼,效果截圖
image

 

以及官方提供的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啦");

        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章