APM监控

Wesley13
• 阅读 634

一,基础知识储备
分布式跟踪的目标
一个分布式系统由若干分布式服务构成,每一个请求会经过多个业务系统并留下足迹,但是这些分散的数据对于问题排查,或是流程优化都很有限,要能做到追踪每个请求的完整链路调用,收集链路调用上每个服务的性能数据,计算性能数据和比对性能指标(SLA),甚至能够再反馈到服务治理中,那么这就是分布式跟踪的目标。

分布式跟踪的目的
zipkin分布式跟踪系统的目的:

zipkin为分布式链路调用监控系统,聚合各业务系统调用延迟数据,达到链路调用监控跟踪;
zipkin通过采集跟踪数据可以帮助开发者深入了解在分布式系统中某一个特定的请求时如何执行的;
假如我们现在有一个用户请求超时,我们就可以将这个超时的请求调用链展示在UI当中;我们可以很快度的定位到导致响应很慢的服务究竟是什么。如果对这个服务细节也很很清晰,那么我们还可以定位是服务中的哪个问题导致超时;
zipkin系统让开发者可通过一个Web前端轻松的收集和分析数据,例如用户每次请求服务的处理时间等,可方便的监测系统中存在的瓶颈。
ZipKin介绍
Zipkin是一个致力于收集分布式服务的时间数据的分布式跟踪系统。

Zipkin 主要涉及四个组件:collector(数据采集),storage(数据存储),search(数据查询),UI(数据展示)。

github源码地址: https://github.com/openzipkin/zipkin。

Zipkin提供了可插拔数据存储方式:In-Memory,MySql, Cassandra, Elasticsearch

brave 介绍
Brave 是用来装备 Java 程序的类库,提供了面向标准Servlet、Spring MVC、Http Client、JAX RS、Jersey、Resteasy 和 MySQL 等接口的装备能力,可以通过编写简单的配置和代码,让基于这些框架构建的应用可以向 Zipkin 报告数据。同时 Brave 也提供了非常简单且标准化的接口,在以上封装无法满足要求的时候可以方便扩展与定制。

本文主要介绍springmvc+dubbo下的brave使用。

二,dubbo项目下快速搭建
Zipkin+brave追踪

1、zipkin安装使用
此处主要介绍linux下的安装使用,zipkin官网地址 http://zipkin.io/pages/quickstart.html

wget -O zipkin.jar 'https://search.maven.org/remote\\\_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec'

说明:zipkin是springboot项目,该jar包可直接通过java -jar zipkin.jar启动。启动完成后可访问 http://ip:9411查看。

2、zipkin存储与启动
详情参考官网: https://github.com/openzipkin/zipkin/tree/master/zipkin-server

(1)In-Memory方式
nohup java -jar zipkin.jar &

注意:内存存储,zipkin重启后数据会丢失, 建议测试环境使用

(2)MySql方式
目前只与MySQL的5.6-7。它的设计是易于理解,使用简单。但是,当数据量大时,查询很慢。性能不是很好。

创建数据库zipkin
建表
CREATETABLEIFNOTEXISTS zipkin_spans (

trace_id_highBIGINTNOTNULLDEFAULT0COMMENT'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',

trace_idBIGINTNOTNULL,

idBIGINTNOTNULL,

nameVARCHAR(255) NOTNULL,

parent_idBIGINT,

debugBIT(1),

start_tsBIGINTCOMMENT'Span.timestamp(): epoch micros used for endTs query and to implement TTL',

durationBIGINTCOMMENT'Span.duration(): micros used for minDuration and maxDuration query'

) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTERSET=utf8 COLLATE utf8_general_ci;

ALTERTABLE zipkin_spans ADDUNIQUEKEY(trace_id_high, trace_id, id) COMMENT'ignore insert on duplicate';

ALTERTABLE zipkin_spans ADDINDEX(trace_id_high, trace_id, id) COMMENT'for joining with zipkin_annotations';

ALTERTABLE zipkin_spans ADDINDEX(trace_id_high, trace_id) COMMENT'for getTracesByIds';

ALTERTABLE zipkin_spans ADDINDEX(name) COMMENT'for getTraces and getSpanNames';

ALTERTABLE zipkin_spans ADDINDEX(start_ts) COMMENT'for getTraces ordering and range';

CREATETABLEIFNOTEXISTS zipkin_annotations (

trace_id_highBIGINTNOTNULLDEFAULT0COMMENT'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',

trace_idBIGINTNOTNULLCOMMENT'coincides with zipkin_spans.trace_id',

span_idBIGINTNOTNULLCOMMENT'coincides with zipkin_spans.id',

a_keyVARCHAR(255) NOTNULLCOMMENT'BinaryAnnotation.key or Annotation.value if type == -1',

a_valueBLOBCOMMENT'BinaryAnnotation.value(), which must be smaller than 64KB',

a_typeINTNOTNULLCOMMENT'BinaryAnnotation.type() or -1 if Annotation',

a_timestampBIGINTCOMMENT'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',

endpoint_ipv4INTCOMMENT'Null when Binary/Annotation.endpoint is null',

endpoint_ipv6BINARY(16) COMMENT'Null when Binary/Annotation.endpoint is null, or no IPv6 address',

endpoint_portSMALLINTCOMMENT'Null when Binary/Annotation.endpoint is null',

endpoint_service_nameVARCHAR(255) COMMENT'Null when Binary/Annotation.endpoint is null'

) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTERSET=utf8 COLLATE utf8_general_ci;

ALTERTABLE zipkin_annotations ADDUNIQUEKEY(trace_id_high, trace_id, span_id, a_key, a_timestamp) COMMENT'Ignore insert on duplicate';

ALTERTABLE zipkin_annotations ADDINDEX(trace_id_high, trace_id, span_id) COMMENT'for joining with zipkin_spans';

ALTERTABLE zipkin_annotations ADDINDEX(trace_id_high, trace_id) COMMENT'for getTraces/ByIds';

ALTERTABLE zipkin_annotations ADDINDEX(endpoint_service_name) COMMENT'for getTraces and getServiceNames';

ALTERTABLE zipkin_annotations ADDINDEX(a_type) COMMENT'for getTraces';

ALTERTABLE zipkin_annotations ADDINDEX(a_key) COMMENT'for getTraces';

ALTERTABLE zipkin_annotations ADDINDEX(trace_id, span_id, a_key) COMMENT'for dependencies job';

CREATETABLEIFNOTEXISTS zipkin_dependencies (

dayDATENOTNULL,

parentVARCHAR(255) NOTNULL,

childVARCHAR(255) NOTNULL,

call_countBIGINT

) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTERSET=utf8 COLLATE utf8_general_ci;

ALTERTABLE zipkin_dependencies ADDUNIQUEKEY(day, parent, child);

启动zipkin命令
$ STORAGE_TYPE=mysql MYSQL_HOST= IP MYSQL_TCP_PORT=3306 MYSQL_DB= zipkin MYSQL_USER= username MYSQL_PASS= password nohup java -jar zipkin.jar &

(3)Elasticsearch方式
本文建议使用此方法。

Elasticsearch官网
创建elasticsearch用户,安装启动Elasticsearch服务
官方文档: https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
zipkin启动命令
$ STORAGE_TYPE=elasticsearch ES_HOSTS=http:// IP :9200 nohup java -jar zipkin.jar &

3、dubbo项目快速接入
(1)pom
项目pom中添加brave-dubbo.jar的依赖, brave-dubbo简化dubbo项目接入zipkin的步骤。

<dependency>

<groupId>io.zipkin.brave</groupId>
<artifactId>brave-dubbo</artifactId>

<version>1.0.0-SNAPSHOT</version>
</dependency>
(2)配置brave
在spring-application.xml中配置brave

<beanid="brave"class="com.github.kristofa.brave.dubbo.BraveFactoryBean"p:serviceName="serviceName"p:zipkinHost="http://zipkin-server-ip:9411/"p:rate="1.0" />
说明:

zipkin-server-ip 是zipkin服务器ip地址。
p:serviceName 项目名称。
只要是dubbo项目,无论是普通服务,还是web项目,都需要添加此包,并配置brave Bean。
大功告成

---------------------
版权声明:本文为CSDN博主「许恕」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xvshu/article/details/79714491

https://github.com/openzipkin/zipkin/tree/master/zipkin-server

https://github.com/openzipkin/zipkin/tree/master/zipkin-server

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Dubbo日志链路追踪TraceId选型
!mark(https://oscimg.oschina.net/oscnet/updd1ad9729fb807ee6dc473bdc283b1a4481.png)一、目的开发排查系统问题用得最多的手段就是查看系统日志,但是在分布式环境下使用日志定位问题还是比较麻烦,需要借助全链路追踪ID把上下文串联起来,本文主要分享基于
Stella981 Stella981
2年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Easter79 Easter79
2年前
SpringCloud系列:利用SpringCloud Sleuth和Zipkin实现分布式服务调用链跟踪(一)
一、概述在单体应用时代,接口缓慢能够被迅速定位和发现,而随着分布式微服务的流行,服务之间的调用关系越来越复杂,错中复杂的调用关系使得我们想找到某一个接口的效率缓慢变得非常困难,而分布式服务调用跟踪组件就解决了这个问题。Sleuth是SprinCloud在分布式系统中提供追踪解决方案,zipkin是基于GoogleDapper的分布式链路调用监
京东云开发者 京东云开发者
6个月前
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
分布式系统中的分布式链路追踪与分布式调用链路
在分布式系统中,由于服务间的调用关系复杂,需要实现分布式链路追踪来跟踪请求在各个服务中的调用路径和时间消耗。这对问题排查和性能监控都很重要。常用的分布式链路追踪实现有基于日志的和基于分布式追踪系统的两种方式: