Coder Social home page Coder Social logo

dubbokeeper's Introduction

Build Status Latest Version License

Dubbokeeper

Dubbokeeper是什么

dubbokeeper是一个开源版本基于spring mvc开发的社区版dubboadmin,同时修复了官方admin存在的一些问题,以及添加了一下必要的功能 例如服务统计,依赖关系等图表展示功能,当前dubbokeeper还属于开发阶段。最终dubbokeeper会集成服务管理以及服务监控一体的DUBBO服务管理系统

Dubbokeeper包含哪些功能

应用管理

包含当前系统所有子应用信息列表,以及各个引用服务引用消费列表信息,同时可以对某个应用的服务进行上下线操作,权重调整等,同时可以查看应用部署实体信息列表。目的是实现服务的可管理

动态配置

这是利用dubbo基于注册中心来管理服务实现对服务的参数在服务运行状态进行调整,比如对服务的超时时间调整,对服务的mock以及可以添加自定义参数的调整等,目的是服务的可配置。

统计信息

除了对服务的可管理,可配置。同时通过图表的方式对服务相关信息进行统计,例如对整体系统的应用暴露,消费服务统计信息,应用依赖关系图信息等

Dubbo服务监控

通过扩展dubbo提供的MonitorService接口来实现对服务的监控,由于官方版本的监控功能比较局限,所以将通过收集各方意见重新开发一套监控系统,从而可以实时对服务可控。

zookeeper信息查看

通过配置zookeeper地址,可以查看多个zookeeper中的节点信息

1.0.1版本变动内容

dubbokeeper在1.0.1版本对监控数据存储模块抽离出来,做为单独的应用部署,而不是和1.0.0版本和前端展示集成在一个应用里面

在1.0.0版本中暂时提供了mysql以及1.0.0中已有的lucene存储

这样做的目的是使得dubbokeeper的监控数据收集端能够集群部署(使用lucene,将不支持集群部署,如果使用lucene存储,需要jdk1.7+)

所以1.0.1以后的版本,对dubbokeeper的部署将包含两部分,一部分是监控数据存储端以及另一部分是监控数据展示的部署

规划中的功能

服务调用Trace

将基于dubbo的框架可扩展性,对服务的调用过程进行跟踪,并且汇总分析,通过形象的方式呈现服务调用过程,从而帮助对服务问题进行定位。具体将参考谷歌的Dapper

Zookeeper

基于zookeeper的四字命令完成对zookeeper的基本监控

部署过程:

1、下载源码

git clone https://github.com/dubboclub/dubbokeeper.git

2、编译打包

由于监控数据的存储和展示显示进行了分离,那么打包有所变动。在下载源码的根目录会发现install-xxx.bat(sh),这个可以根据你想要的不同存储执行对应的脚本。

执行完之后在target目录下面会发现xxx-dubbokeeper-ui,xxx-dubbokeeper-server以及xxx-dubbokeeper-server.tar.gz

其中xxx-dubbokeeper-ui下会有一个war包,将该war包部署到tomcat或者jetty里面(或者其他servlet容器),那么就部署好了监控展示应用了

3、监控数据暂时端调整配置

对上面的war包解压出来后对其中WEB-INF/classes/dubbo.properties文件中的配置项进行调整。

#monitor的应用名,可根据自己情况自定义
dubbo.application.name=monitor-ui
#应用的拥有者
dubbo.application.owner=bieber
#连接的dubbo注册中心地址,保持部署监控数据存储的zk地址一样
dubbo.registry.address=zookeeper://localhost:2181

#use netty4
dubbo.reference.client=netty4

#peeper config
#监控的zookeeper连接列表,多个通过‘,’(英文逗号)隔开。
peeper.zookeepers=localhost:2181
#监控的zookeeper连接会话超时时间
peeper.zookeeper.session.timeout=60000

#被监控端同步监控数据周期时间,可不配置,默认是一分钟同步一次
monitor.collect.interval=60000

#logger
#dubbokeeper的日志目录
monitor.log.home=/usr/dev/op_disk/monitor-log

4、监控数据存储端配置调整以及启动

通过上面编译后会得到xxx-dubbokeeper-server目录,在改名了的xxx-server下面包含三个子目录bin,conf以及lib

bin:启动存储端的脚本,实行start-xx.sh(bat)则启动该应用

conf:存储端的相关配置,具体配置下面会介绍

lib:应用依赖的相关jar包

下面列出不同存储的对配置的相关描述

lucene存储配置介绍

mysql存储配置介绍

mongodb存储配置介绍

按照上面对应存储配置完毕之后,执行start-xx.sh(bat),便启动了dk的存储

dubbokeeper's People

Contributors

356082462 avatar banyeliangzhong avatar bieber314 avatar bieberhe avatar dependabot[bot] avatar heipacker avatar hidehai avatar linzhiqiang0514 avatar mauersu avatar qct avatar sdcuike avatar shevawen avatar xzs7190966 avatar zylele avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dubbokeeper's Issues

[优化]节点名可读性优化

Zoopeeper菜单->Dubbo-服务->configurators
下面的子节点可读性差,如:

override%3A%2F%2F192.168.29.1%3A20882%2Fcom.bieber.dubbo.service.MyFirstDubboService%3Fcategory%3Dconfigurators%26dynamic%3Dfalse%26enabled%3Dtrue%26weight%3D200

应该转为Decoded后可读性更佳

override://192.168.29.1:20882/com.bieber.dubbo.service.MyFirstDubboService?category=configurators&dynamic=false&enabled=true&weight=200

监控信息一览报错

admin-应用列表-操作(该应用的发布服务列表)-操作(该服务监控信息一览),点击提示后端系统出现异常,具体异常信息为:Servlet.service() for servlet [dispatcherServlet] in context with path [/dubbokeeper-ui] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: topNGroups must be >= 1 (got 0)] with root cause
java.lang.IllegalArgumentException: topNGroups must be >= 1 (got 0)
at org.apache.lucene.search.grouping.AbstractFirstPassGroupingCollector.(AbstractFirstPassGroupingCollector.java:66)
at org.apache.lucene.search.grouping.term.TermFirstPassGroupingCollector.(TermFirstPassGroupingCollector.java:60)
at com.dubboclub.monitor.storage.lucene.LuceneStatisticsStorage.queryMethodMonitorOverview(LuceneStatisticsStorage.java:211)
at com.dubboclub.web.controller.MonitorController.overviewService(MonitorController.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

监控图表的BUG

image

操作步骤: (先保证图表有数据),先点击除图表以之外的任意tab,然后再点击上面的搜索条件,最后切换到图表,结果就呈现了。

应用依赖图节点信息错误

你好,在生成应用更依赖图时,发现生成的节点信息有误,可以看下图:
image 4
图中有一个节点信息同时依赖其他应用,也被其他应用依赖,为既是消费者又是提供者类型。
但是显示的时候,类型为纯提供者。
在查找代码中,发现可能是ApplicationServiceImpl中此处break有问题:
image 5

在得到多个url信息后,url可以来自多个不同的应用,但是break了之后,只处理了第一个url信息。
不知道我说的是否正确,麻烦看一下这个问题,谢谢!

如果某一个服务的消费者部署在一个机器上,那么获取改服务的消费者的时候改机器上的消费者只会出现最后一个

@RequestMapping("/{id}/consumer-apps.htm") public @ResponseBody List<Application> getConsumerAppByService(@PathVariable("id")long id ){ Provider provider = providerService.getProviderById(id); List<Consumer> consumers = consumerService.listConsumerByConditions(Constants.INTERFACE_KEY,Tool.getInterface(provider.getServiceKey()),Constants.VERSION_KEY,Tool.getVersion(provider.getServiceKey()),Constants.GROUP_KEY,Tool.getGroup(provider.getServiceKey())); List<Application> applicationList = new ArrayList<Application>(); List<String> containMark = new ArrayList<String>(); for(Consumer consumer:consumers){ //如果某一个服务的消费者部署在一个机器上,那么获取改服务的消费者的时候改机器上的消费者只会出现最后一个 if(containMark.contains(consumer.getAddress())){ continue; } containMark.add(consumer.getAddress()); Application application = new Application(); application.setUsername(consumer.getUsername()); application.setApplication(consumer.getApplication()); application.setType(Application.CONSUMER); List<Provider> providers = providerService.listProviderByApplication(consumer.getApplication()); if(providers.size()>0){ application.setType(Application.PROVIDER_AND_CONSUMER); } applicationList.add(application); } return applicationList; }

选择Lucene存储监控文件时,应用失败详情显示问题

在应用大盘中,实际应用失败次数为0。
在选择查看详情时,应用失败列表会显示一个显示失败次数为0的列表。
理论上,如果失败次数为0,是不需要显示的。
image 6

可以修改代码中LuceneStatisticsStorage 类 queryoverview 方法,将add方法放在判断之后。
image 7

在判断是否为0后,为0则跳出循环,不为0则添加到对象中。
不知道这样改是否正确,麻烦看下这个问题。

lueneServer启动报错啊。

[NettyServerWorker-thread-1] WARN 2016-05-09 16:24:48313 com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:131) - [DUBBO] Skip input stream 435, dubbo version: 2.5.3, current host: 127.0.0.1
[DubboServerHandler-134.132.66.207:20884-thread-88] DEBUG 2016-05-09 16:24:48314 com.alibaba.dubbo.remoting.transport.DecodeHandler.decode(DecodeHandler.java:60) - [DUBBO] Decode decodeable message com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation, dubbo version: 2.5.3, current host: 127.0.0.1
[NettyServerWorker-thread-1] WARN 2016-05-09 16:24:49319 com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:74) - [DUBBO] Decode rpc invocation failed: expected map/object at java.lang.String (Lcom/alibaba/dubbo/common/URL;), dubbo version: 2.5.3, current host: 127.0.0.1
com.alibaba.com.caucho.hessian.io.HessianProtocolException: expected map/object at java.lang.String (Lcom/alibaba/dubbo/common/URL;)
at com.alibaba.com.caucho.hessian.io.AbstractDeserializer.error(AbstractDeserializer.java:108)
at com.alibaba.com.caucho.hessian.io.AbstractMapDeserializer.readObject(AbstractMapDeserializer.java:70)
at com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject(Hessian2Input.java:1696)
at com.alibaba.dubbo.common.serialize.support.hessian.Hessian2ObjectInput.readObject(Hessian2ObjectInput.java:94)
at com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:119)
at com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation.decode(DecodeableRpcInvocation.java:71)
at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCodec.decodeBody(DubboCodec.java:137)
at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:126)
at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:87)
at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCountCodec.decode(DubboCountCodec.java:46)
at net.dubboclub.netty4.Netty4CodecAdapter$InternalDecoder.channelRead0(Netty4CodecAdapter.java:104)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:787)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:130)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)
at java.lang.Thread.run(Thread.java:745)
[NettyServerWorker-thread-1] WARN 2016-05-09 16:24:49320 com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:131) - [DUBBO] Skip input stream 435, dubbo version: 2.5.3, current host: 127.0.0.1

监控问题

1.监控中,有些项目会出现 “后端系统出现异常,请稍后再试”
2.监控数据是保存在哪个目录下的?
3.监控详细列表中的触发时间,最好修改“yyyy-MM-dd HH:mm:ss”格式,不然不好区分是上午还是下午
4.详细列表top200数据,应该按照时间来排序,把最新的数据放在最上面
5.监控数据总感觉统计的不准,测试条件:开启dubbo服务端和客户端,单线程调用

提供者服务禁用功能没生效是怎么回事?

我把提供者某个查询服务禁用了,程序调用此服务还是能正常使用,尝试重启服务,在dubbokeeper-ui监控里看到的也确实是被禁用,但该服务还可正常使用且查询出数据。

mysql

mysql存储方式在压力下特别慢,耗CPU。判断是addStatistics方法在insert表时空转引起的,如代码:
while(isWriting){ //waiting write finished }
把它换成异步队列的offer形式就好了。
有类似的问题的,可以留言,我pull代码上来。

无法显示监控信息

点击“Monitor” 系统异常信息: 后端系统出现异常,请稍后再试!从后台日志中找不出问题来?麻烦解释下,或者留下QQ交流下,谢谢!

zookeeper循环创建节点 到 崩溃

qq20160511-0

dubbokeeper-ui : mvn clean jetty:run 启动后 zookeeper就挂了;

我是用dubbo 启动了一个thrift服务 ; 然后在启动dubbokeeper-ui 就一直在zookeeper的 /dubbo下面 循环创建子节点 直到子节点的字节超过最大限制崩溃。。。。。。。。。。。。。。。。

monitor 模块空指针问题

Hi
.
项目启动后,点击monitor报了空指针的问题。在UI Control 调用 statisticsStorage.queryApplications() 是返回出现了问题。请问下这个问题是配置出现了问题? 还是需要启动其他的服务?多谢。

Error Log:
Caused by: java.lang.NullPointerException: null
at com.dubboclub.dk.web.controller.MonitorController.monitorIndex(MonitorController.java:101) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_65]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_65]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_65]
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_65]
.
Thanks

监控出不来数据

数据库是mysql,并初始化好了,zookeeper集群也配置好了,dubbokeeper-ui可以运行,可以出来数据除了monitor那一块,但是start-mysql.bat也启东了,就是看不到数据,而且数据库表application也是空的,不知到我哪里漏配置了,求指导

缺少javassist.jar包

mysql-dubbokeeper-server and mysql-dubbokeeper-ui 项目 似乎缺少javassist.jar包,否则启动编译异常,查找了pom.xml 未发现有引入相关javassist.jar包.

image

启动报关于log4j的问题

log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.

希望可以增加维度更细的图表分析

按服务方法进行统计的相关图表。

还有类似solr的统计数据:
avgTimePerRequest:Was: 211.7414608, Now: 178.77673166666665, Delta: -32.965
medianRequestTime:Was: 0.56604, Now: 7.259563000000001, Delta: 6.694
75thPcRequestTime:Was: 881.82926, Now: 664.8602165, Delta: -216.969
95thPcRequestTime:881.82926
99thPcRequestTime:881.82926
999thPcRequestTime:881.82926

平均值、中值、各分位点数据,感觉非常有意义。

如何试下Lucene的分布部署?

请问如何能实现Lucene的分布部署?
我在两台机器上布置了工程,共享一个NAS空间来存储生成的lucene文件,
但是一台启动成功后,另一台会因为write.lock被占用无法正常启动。
请问有什么解决方法吗?
READ.ME中的网盘存储,是如何实现的?

mysql查询语句中limit使用

limit的使用好像有点儿问题,limit的初始记录行的偏移量是应该是0吧
以查询最大成功量为例,这里应该写成limit 0,1吧

   <select id="queryMaxSuccess" resultType="int">
        select successCount from `statistics_${application}` where
        <if test="service!=null">
            serviceInterface=#{service} and
        </if>
        <![CDATA[
         timestamp>=#{start} and timestamp<=#{end}  order by successCount DESC limit 1,1
      ]]>
    </select>

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.