skywalking链路监控8.1.0集安装及性能测试
Skywalking链路监控
1、Skywalking概述
请求链路追踪,故障快速定位:可以通过调⽤链结合业务⽇志快速定位错误信息。
可视化:各个阶段耗时,进⾏性能分析。
依赖优化:各个调⽤环节的可⽤性、梳理服务依赖关系以及优化。
数据分析,优化链路:可以得到⽤户的⾏为路径,汇总分析应⽤在很多业务场景
1.1 APM系统概述
APM (Application Performance Management) 即应⽤性能管理系统,是对企业系统即时监控以实现
对应⽤程序性能管理和故障管理的系统化的解决⽅案。应⽤性能管理,主要指对企业的关键业务应⽤进
⾏监测、优化,提⾼企业应⽤的可靠性和质量,保证⽤户得到良好的服务,降低IT总拥有成本。
APM系统是可以帮助理解系统⾏为、⽤于分析性能问题的⼯具,以便发⽣故障的时候,能够快速定位和解决问题。
1.2 分布式链路追踪
随着分布式系统和微服务架构的出现,⼀次⽤户的请求会经过多个系统,不同服务之间的调⽤关系⼗分
复杂,任何⼀个系统出错都可能影响整个请求的处理结果。以往的监控系统往往只能知道单个系统的健
康状况、⼀次请求的成功失败,⽆法快速定位失败的根本原因。
1.3 主流的开源APM产品
SkyWalking
SkyWalking是apache基⾦会下⾯的⼀个开源APM项⽬,为微服务架构和云原⽣架构系统设计。它通过探针⾃动收集所需的指标,并进⾏分布式追踪。通过这些调⽤链路以及指标,Skywalking APM会感知应⽤间关系和服务间关系,并进⾏相应的指标统计。Skywalking⽀持链路追踪和监控应⽤组件基本涵盖
Zipkin
Zipkin是由Twitter开源,是分布式链路调⽤监控系统,聚合各业务系统调⽤延迟数据,达到链路调⽤监控跟踪。Zipkin基于Google的Dapper论⽂实现,主要完成数据的收集、存储、搜索与界⾯展⽰。
PinPoint
Pinpoint是由⼀个韩国团队实现并开源,针对Java编写的⼤规模分布式系统设计,通过JavaAgent的机制做字节代码植⼊,实现加⼊traceid和获取性能数据的⽬的,对应⽤代码零侵⼊。
CAT
CAT是由⼤众点评开源的项⽬,基于Java开发的实时应⽤监控平台,包括实时应⽤监控,业务监控,可以提供⼗⼏张报表展⽰。
2、Skywalking原理
2.1 java agent原理
使⽤Skywalking去监控服务,需要在其 VM 参数中添加 “-
javaagent:/usr/local/skywalking/agent//skywalking-agent.jar"。这⾥就 使⽤到了java agent技术。
2.1.1、Java agent 是什么?
Java agent是java命令的⼀个参数。参数 javaagent 可以⽤于指定⼀个 jar 包。
1. 这个 jar 包的 MANIFEST.MF ⽂件必须指定 Premain-Class 项。
2. Premain-Class 指定的那个类必须实现 premain() ⽅法。
当Java 虚拟机启动时,在执⾏ main 函数之前,JVM 会先运⾏ -javaagent所指定 jar 包内 Premain- Class 这个类的 premain ⽅法 。
2.1.2、如何使⽤java agent?
使⽤ java agent 需要⼏个步骤:
1. 定义⼀个 MANIFEST.MF ⽂件,必须包含 Premain-Class 选项,通常也会加⼊Can-Redefine- Classes 和 Can-Retransform-
Classes 选项。
2. 创建⼀个Premain-Class 指定的类,类中包含 premain ⽅法,⽅法逻辑由⽤户⾃⼰确定。
3. 将 premain 的类和 MANIFEST.MF ⽂件打成 jar 包。
4. 使⽤参数 -javaagent: jar包路径 启动要代理的⽅法。
** ⽰例代码**
import net.bytebuddy.agent.builder.AgentBuilder;
import net.hod.MethodDescription;
import net.pe.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.matcher.ElementMatchers;
import net.bytebuddy.utility.JavaModule;
import java.lang.instrument.Instrumentation;
public class PreMainAgent {
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("=========premain⽅法执⾏1========");
System.out.println(agentArgs);
}
}
类中提供两个静态⽅法,⽅法名均为premain,不能拼错
在pom⽂件中添加打包插件
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<!--⾃动添加META-INF/MANIFEST.MF -->
<manifest>
<addClasspath>true</addClasspath>
</manifest>
<manifestEntries>
<Premain-Class>PreMainAgent</Premain-Class>
<Agent-Class>PreMainAgent</Agent-Class>
<Can-Redefine-Classes>true</Can-Redefine-Classes>
<Can-Retransform-Classes>true</Can-Retransform-Classes>
</manifestEntries>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
该插件会在⾃动⽣成META-INF/MANIFEST.MF⽂件时,帮我们添加agent相关的配置信息。 使⽤maven的package命令进⾏打包:
2.1.3、 统计⽅法调⽤时间
Skywalking中对每个调⽤的时长都进⾏了统计,使⽤ByteBuddy和Java agent技术来 统计⽅法的调⽤时长。
Byte Buddy是开源的、基于Apache 2.0许可证的库,它致⼒于解决字节码操作和instrumentation API 的复杂性。Byte Buddy所声称的⽬标是将显式的字节码操作隐藏在⼀个类型安全的领域特定语⾔背 后。通过使⽤Byte Buddy,任何熟悉Java编程语⾔的⼈都有望⾮常容易地进⾏字节码操作。Byte Buddy提供了额外的API来⽣成Java agent,可以轻松的增强我们已有的代码。
添加依赖:
<dependencies>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy-agent</artifactId>
</dependency>
</dependencies>
修改PreMainAgent代码
public class PreMainAgent {
public static void premain(String agentArgs, Instrumentation inst) {
//创建⼀个转换器,转换器可以修改类的实现
//ByteBuddy对java agent提供了转换器的实现,直接使⽤即可
AgentBuilder.Transformer transformer = new AgentBuilder.Transformer() {
public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModu le javaModule) {
return builder
// 拦截任意⽅法
.method(ElementMatchers.<MethodDescription>any())
// 拦截到的⽅法委托给TimeInterceptor
.(MyInterceptor.class));
}
};
new AgentBuilder // Byte Buddy专门有个AgentBuilder来处理Java Agent的场景
.Default()
// 根据包名前缀拦截类
.type(ElementMatchers.nameStartsWith("com.agent"))
// 拦截到的类由transformer处理
.transform(transformer)
.installOn(inst);
}
}
先⽣成⼀个转换器,ByteBuddy提供了java agent专⽤的转换器。通过实现Transformer接⼝利⽤ builder对象来创建⼀个转换器。转换器可以配置拦截⽅法的格式,⽐如⽤名称,本例中拦截所有⽅ 法,并定义⼀个类MyInterceptor。
public class MyInterceptor {
@RuntimeType
public static Object intercept(@Origin Method method,
@SuperCall Callable<?> callable)
throws Exception {
long start = System.currentTimeMillis();
try {
//执⾏原⽅法
return callable.call();
} finally {
//打印调⽤时长
System.out.Name() + ":" + (System.currentTimeMillis() - start) + "ms");
}
}
}
MyInterceptor就是⼀个的实现,统计的调⽤的时长。参数中的method是反射出的⽅法对象,⽽ callable就是调⽤对象,可以通过callable.call()⽅法来执⾏原⽅法。
3、Skywalking 环境搭建
3.1 软件准备
软件包版本已经上传140Gitlab
apache-skywalking-apm-8.1.
39.100.254.140:12011/loit-Infrastructure-doc/loit-initproject-doc/tree/master/3%E3%80%81other/%E9%9B%86%E6%88%90loit%E9%97%A8%E6%88 %B7/skywalking/8.1.0/apache-skywalking-apm-8.1.
将以上三个软件包上传⾄服务器/usr/local/src/路径下
3.2 安装Skywalking服务端
解压安装包
cd /usr/local/src
tar -zxvf apache-skywalking-apm-8.1.
mv apache-skywalking-apm-bin skywalking
mv skywalking/ /usr/local/
修改配置⽂件
vim /usr/local/skywalking/l
分布式和微服务的关系1、其中修改:selector与clusterNodes
storage:
selector: ${SW_STORAGE:elasticsearch}
elasticsearch:
nameSpace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:172.16.203.79:9200,172.16.203.78:9200,172.16.203.79:9200}
2、其中 gRPCHost改成本机服务器IP
core:
selector: ${SW_CORE:default}
default:
gRPCHost: ${SW_CORE_GRPC_HOST:172.16.203.77}
2、其中存储为es
storage:
selector: ${SW_STORAGE:elasticsearch}
elasticsearch:
nameSpace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:172.16.203.77:9200,172.16.203.78:9200,172.16.203.79:9200} collector 集
分别在⼀下3台服务器启动collector :
172.16.203.76
172.16.203.77 172.16.203.78
cd /usr/local/skywalking/bin/sh oapService.sh
dashboard配置及启动
在其中⼀台172.16.203.76配置及其启动
vim /usr/local/skywalking/l
修改端⼝号server.port 与 listOfServers(根据实际情况修改)
server:
port: 8051
collector:
path: /graphql
ribbon:
ReadTimeout: 10000
# Point to all backend's restHost:restPort, split by ,
listOfServers: 172.16.203.76:12800,172.16.203.77:12800,172.16.203.78:12800
启动dashboard:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论