zipkin+owin wep api集成

这里的zipkin 是应用再owin模式下的简单web api集成,结合网上资料和本人动手尝试作为本人笔记使用,如有不足的地方,欢迎各位大神提建议。

zipkin参考地址:https://github.com/openzipkin/zipkin4net

使用编程环境:

开发环境:vs2017

.net版本 4.6.1

  1. 创建控制台应用程序
    image.png

  2. 这里通过NUGET引入

a. Microsoft.AspNet.WebApi.OwinSelfHost 这个包 用来做 webapi宿主服务

b. zipkin4net 引入zipkin客户端方法

  1. 添加Startup类 作为zipkin设置和宿主服务设置的主方法(这里“cxzczx” 为给本次痕迹的服务名,建议做成可配置)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    using Newtonsoft.Json.Serialization;
    using Owin;
    using System.Web.Http;
    using zipkin4net;
    using zipkin4net.Tracers.Zipkin;
    using zipkin4net.Transport.Http;

    namespace ConsoleApp1
    {
    public class Startup
    {
    public void Configuration(IAppBuilder appBuilder)
    {

    //注册成webapi
    HttpConfiguration config = new HttpConfiguration();
    config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}",
    defaults: new { id = RouteParameter.Optional }
    );

    appBuilder.UseWebApi(config);
    var json = config.Formatters.JsonFormatter;
    json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();



    var logger =new ConsoleLogger(); //实现ILogger
    TraceManager.SamplingRate = 1.0f; //完全跟踪

    var httpSender = new HttpZipkinSender("http://localhost:9411", "application/json");//设置zipkin服务端地址
    var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer());
    TraceManager.RegisterTracer(tracer);
    TraceManager.Start(logger);



    //关闭
    // TraceManager.Stop();

    var trace = Trace.Create();
    trace.Record(Annotations.ServerRecv());
    trace.Record(Annotations.ServiceName("cxzczx"));
    trace.Record(Annotations.Rpc("GET"));
    trace.Record(Annotations.ServerSend());
    trace.Record(Annotations.Tag("http.url", "<url>")); //adds binary annotation

    //Trace.Current = trace;
    }
    }
    }
  2. 设置的端口地址
    在控制台的Program文件的main方法里面添加启动(baseAddress 请设置成你想设置的端口地址,注意不要与已存在的端口冲突)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    static void Main(string[] args)
    {
    string baseAddress = "http://localhost:7400/";

    // Start OWIN host
    using (WebApp.Start<Startup>(url: baseAddress))
    {
    Console.WriteLine("Start server on {0}", baseAddress);
    Console.ReadLine();
    }
    }
    5.再添加一个记录过程ConsoleLogger.cs
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    using System;
    using zipkin4net;

    namespace ConsoleApp1
    {
    public class ConsoleLogger : ILogger
    {
    public void LogError(string message)
    {
    Console.Error.WriteLine(message);
    }

    public void LogInformation(string message)
    {
    Console.WriteLine(message);
    }

    public void LogWarning(string message)
    {
    Console.ForegroundColor = ConsoleColor.Yellow;
    Console.WriteLine(message);
    Console.ResetColor();
    }
    }
    }
    6.测试
    此时webapi+zipkin已经注册完成,现在我们添加一个api接口来测试,新建HomeController
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class HomeController : ApiController
    {
    [HttpGet]
    public HttpResponseMessage GetPhone(int id)
    {
    Random random = new Random();
    var product = new { id = id, name = "小米mix2", ran = random.Next(10000, 99999) };

    HttpResponseMessage result = new HttpResponseMessage();
    result.Content = new StringContent(JsonConvert.SerializeObject(product), Encoding.GetEncoding("UTF-8"), "application/json");
    return result;
    }
    }
    进行测试 api调用成功!(请允许我打码掉我的收藏栏-.-)
    image.png
    查看zipkin服务端发现,调用痕迹已记录成功!
    image.png
    OK 简单的dome已完成,如需要更加详细痕迹记录请前前往https://github.com/openzipkin/zipkin4net 另外本人小菜一枚刚开始研究zipkin,结合网上各类资料自己动手试了一下,文中如有不足的地方欢迎指出,各位大神如有更好的解决方案欢迎交流。