文档章节

zipkin 分布式日志收集处理工具

 我在哪
发布于 2014/10/28 11:44
字数 1124
阅读 1290
收藏 5

Zipkin 是 Twitter 的一个开源项目,允许开发者收集 Twitter 各个服务上的监控数据,并提供查询接口。分为三个模块,collector、query、web,官网地址是https://twitter.github.io/zipkin/index.html。这个系统的web前端使用了ruby收集数据,然后保存到collector里面。collector的实现有hbase、redis、cassandra等。然后可以通过query查询。关于zipkin的论文有http://bigbully.github.io/Dapper-translation/,它详细的解释了如何跟踪收集日志。

我使用的项目是zipkin-1.1.0,下载地址是https://github.com/twitter/zipkin/releases/tag/1.1.0,启动命令:

collector:bin/sbt 'project zipkin-collector-service' "run -f zipkin-collector-service/config/collector-${SERVICE_TYPE}.scala"

service:bin/sbt 'project zipkin-query-service' "run -f zipkin-query-service/config/query-${SERVICE_TYPE}.scala"

web:bin/sbt 'project zipkin-web' 'run -f zipkin-web/config/web-dev.scala -D local_docroot=zipkin-web/src/main/resources'

启动成功后,就可以在web页面打开查看是否启动成功。

 

下面分别说一下这三个模块的功能(以存储结构使用hbase):

collector

* Collector Core :封装Collector的服务总线,并定义出存储、索引创建、过滤器、抽样器的接口,通过对上述接口的对外的服务接口封装。Core中只对接口进行了封装,接口的具体实现全部以类似于模板设计模式的方法延迟到了子类去真正实现,提高了代码的扩展性,也使Collector总线服务与具体的存储完全解耦。
* Filter:目前看适用于过滤一些客户端发送到Collector服务的噪音数据。
* Sampler:当服务数据非常庞大的时候,考虑使用采样器对数据进行采样,按照一些概率基础推断应该可以将采样数据看为是全部服务数据的代替(类似于Mentor Carlo方法),目前观察有两种实现,一种为local按均匀分布采样,一种是通过zookeeper中的一些算法进行采样。
* Collector Service:服务的启动方法,通过读取用户的配置文件适配总线服务以及各种不同存储之间的接口实现。
* util:工具类模块。

collector:当前zipkin server实现的存储有Cassandra、Hbase、Redis、RMDB、kafka,类型很丰富,包括了kv NoSQL、列存储 NoSQL、RMDB以及消息中间件。
同时,zipkin collector server端提供了Thrift远程调用方式来进行数据采集。

* 启动
    * collector启动时,会根据读取配置文件中的Store.Builder来创建Core总线流程与具体存储接口实现的绑定,具体StorageBuilder、IndexBuilder以及AggregatesBuilder组件的创建过程见各存储实现说明,一下以Hbase为例,代码如下:

 

val hbaseBuilder = Store.Builder(
  hbase.StorageBuilder(zkServers = Some("192.168.33.100"), zkPort = Some(2181)),
  hbase.IndexBuilder(zkServers = Some("192.168.33.100"), zkPort = Some(2181)),
  hbase.AggregatesBuilder(zkServers = Some("192.168.33.100"), zkPort = Some(2181))
)
CollectorServiceBuilder(Scribe.Interface(categories = Set("zipkin")))
  .writeTo(hbaseBuilde

**在CollectorServiceBuilder中,初始化了保存表到接口,StorageService和IndexService,下面是CollectorServiceBuilder到apply工厂方法执行代码:**
def apply() = (runtime: RuntimeEnvironment) => {
 serverBuilder.apply().apply(runtime)
 log.info("Building %d stores: %s".format(storeBuilders.length, storeBuilders.toString))
 val stores = storeBuilders map {
 _.apply()
 }
 **val storeProcessors ****= stores flatMap { store =>
 Seq(new StorageService(store.storage), new ClientIndexFilter andThen new IndexService(store.index))
 }**
 val sampleRate = sampleRateBuilder.apply()
 val processor: Service[T, Unit] = {
 interface.filter andThen
 new SamplerFilter(new ZooKeeperGlobalSampler(sampleRate)) andThen
 new ServiceStatsFilter andThen
 new FanoutService[Span](storeProcessors)
 }
 val queue = new WriteQueue(queueMaxSize, queueNumWorkers, processor)
 queue.start()
 val server = interface.apply().apply(queue,
 stores,
 new InetSocketAddress(serverBuilder.serverAddress, serverBuilder.serverPort),
 serverBuilder.statsReceiver,
 serverBuilder.tracer)
 /**
 * Add config endpoints with the sampleRate endpoint. Available via:
 * GET /config/<name>
 * POST /config/<name>?value=0.2
 */
 val configEndpoints = ("/config/sampleRate", sampleRate) +: additionalConfigEndpoints.map { case (path, builder) =>
 ("/config/%s".format(path), builder.apply())
 }
 configEndpoints foreach { case (path, adjustable) =>
 serverBuilder.adminHttpService map { _.addContext(path, new ConfigRequestHandler(adjustable)) }
 }
 /* Start additional services (server sets) */
 additionalServices foreach { builder =>
 val s = builder.apply().apply(serverBuilder.socketAddress, serverBuilder.statsReceiver, serverBuilder.timer)
 s.start()
 ServiceTracker.register(s)
 }
 adaptiveSamplerBuilder foreach { builder =>
 val config = builder.apply()
 val service = config.apply()
 service.start()
 ServiceTracker.register(service)
 }
 **new ZipkinCollector(server)**
 }

query:

* query core:定义query到服务接口,初始化查询server。具体到查询方法在启动时指定的query-*.scala实现。
* Adjuster:以某种方式调整输入到trace数据,一般用来调整时间戳或者填充丢失的span
* storage:收集传入到traceid,然后批量到对每个traceid获取执行的延迟时间
* SliceQuery:分片查询接口,只返回制定结束时间戳前到最大的一个。

根据选择到collector(hbase,redis,cassandra..)存储不同,query service也提供了相应到查询实现。内部提供thrift接口。

* 启动:
    * query service 启动时,寻找配置文件query-*.scala,加载内部实现,下面以hbase为例:
    * val hbaseBuilder = Store.Builder(
          hbase.StorageBuilder(zkServers = Some("192.168.33.100"), zkPort = Some(2181)),
          hbase.IndexBuilder(zkServers = Some("192.168.33.100"), zkPort = Some(2181))
        //  hbase.AggregatesBuilder(zkServers = Some("192.168.33.100"), zkPort = Some(2181))
        )
        QueryServiceBuilder(hbaseBuilder)

    * query service对外接口:
        * 仅提供thrift接口,实例:
        * def querySpan(service: String, span: String, annotation: String,
                            kvAnnotation: (String, ByteBuffer), maxTraces: Int): Unit = {
                val protocol = new TBinaryProtocol.Factory()
                val serviceClient = ClientBuilder()
            }

 

© 著作权归作者所有

粉丝 1
博文 1
码字总数 1124
作品 0
郑州
私信 提问
Spring Cloud微服务之 sleuth+zipkin日志聚合

1.简介 (1)什么是服务追踪 Sleuth 在微服务架构中,要完成一个功能,通过Rest请求服务API调用服务来完成,整个调用过程可能会聚合多个后台服务器协同完成。在整个链路上,任何一处调用超时...

编程SHA
03/25
58
0
微服务监控zipkin+asp.net core

0、目录 整体架构目录:ASP.NET Core分布式项目实战-目录 监控目录:微服务监控zipkin、skywalking以及日志ELK监控系列 一、zipkin介绍 zipkin是一种分布式跟踪系统,有助于收集微服务架构中...

如痴如醉
01/11
0
0
部署Zipkin分布式性能追踪日志系统的操作记录

Zipkin是Twitter的一个开源项目,是一个致力于收集Twitter所有服务的监控数据的分布式跟踪系统,它提供了收集数据,和查询数据两大接口服务。 部署Zipkin环境的操作记录: 部署Zipkin,比较麻...

konglongaa
2017/02/27
0
0
分布式调用跟踪系统调研笔记

分布式调用链跟踪系统通常有几个设计目标 低侵入性 -- 作为非业务组件,应当尽可能少侵入或者无侵入其他业务系统,对于使用方透明,减少开发人员的负担; 灵活的应用策略 -- 可以(最好随时)...

ginobefun
2017/05/25
0
0
各大厂分布式链路跟踪系统架构对比

随着互联网架构的扩张,分布式系统变得日趋复杂,越来越多的组件开始走向分布式化,如微服务、消息收发、分布式数据库、分布式缓存、分布式对象存储、跨域调用,这些组件共同构成了繁杂的分布...

james8888
2018/04/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
8
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
6
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部