agent探针可以让我们不修改代码的情况下,对java应用上使用到的组件进行动态监控,获取运行数据发送到OAP上进行统计和存储。agent探针在java中是使用java agent技术实现的,不需要更改任何代码,java agent会通过虚拟机(VM)接口来在运行期更改代码。
Agent探针支持JDK1.6 - 12的版本,Agent探针所有的文件在Skywalking的agent文件夹下。文件目录如下:
+-- agent
+-- activations
apm-toolkit-log4j-1.x-activation.jar
apm-toolkit-log4j-2.x-activation.jar
apm-toolkit-logback-1.x-activation.jar
...
//配置文件
+-- config
agent.config
//组件的所有插件
+-- plugins
apm-dubbo-plugin.jar
apm-feign-default-http-9.x.jar
apm-httpClient-4.x-plugin.jar
.....
//可选插件
+-- optional-plugins
apm-gson-2.x-plugin.jar
.....
+-- bootstrap-plugins
jdk-http-plugin.jar
.....
+-- logs
skywalking-agent.jar
部分插件在使用上会影响整体的性能或者由于版权问题放置于可选插件包中,不会直接加载,如果需要使用,将可选插件中的jar包拷贝到plugins包下。
由于没有修改agent探针中的应用名,所以默认显示的是Your_ApplicationName。我们修改下应用名称,让他显示的更加正确。编辑agent配置文件:
[root@izuf66wqqqhhqzkhd61vnoz logs]# cd /usr/local/skywalking/apache-skywalking-apm-bin/agent/config/
[root@izuf66wqqqhhqzkhd61vnoz config]# vi agent.config
我们在配置中找到这么一行:
# The service name in UI
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
这里的配置含义可以读取到SW_AGENT_NAME配置属性,如果该配置没有指定,那么默认名称为Your_ApplicationName。这里我们把Your_ApplicationName替换成skywalking_tomcat
# The service name in UI
agent.service_name=${SW_AGENT_NAME:skywalking_tomcat}
1、要使用Skywalking监控Tomcat中的应用,需要先准备一个Spring MVC项目。
skywalking_springmvc-1.0-SNAPSHOT.war
以下是该项目的接口代码:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/hello")
//hello/sayHello.do
public class HelloController {
@RequestMapping("/sayHello")
@ResponseBody
public String sayHello(String name){
return "hello world";
}
}
2、将apache-tomcat-8.5.47.tar.gz文件上传至虚拟机/usr/local/skywalking目录下,然后解压:
tar -zxvf apache-tomcat-8.5.47.tar.gz
3、将war包上传至/usr/local/skywalking/apache-tomcat-8.5.47/webapps/下。编辑/usr/local/skywalking/apache-tomcat-8.5.47/bin/catalina.sh文件,在文件顶部添加:
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar"; export CATALINA_OPTS
4、修改tomcat启动端口:
vi conf/server.xml
#修改这一行的端口为8081
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
5、执行bin目录下的./startup.sh 文件启动tomcat。然后访问地址:
http://192.168.75.103:8081/skywalking_springmvc-1.0-SNAPSHOT/hello/sayHello.do
6、此时再访问Skywalking的页面,会发现出现了一个服务和端点,同时有一笔调用显示了调用的应用名和接口地址。
7、由于没有修改agent探针中的应用名,所以默认显示的是Your_ApplicationName。接下来我们修改下应用名称,让他显示的更加正确。编辑agent配置文件:
cd /usr/local/skywalking/apache-skywalking-apm-bin/agent/config
vi agent.config
8、我们在配置中找到这么一行:
# The service name in UI
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
9、这里的配置含义是可以读取到SW_AGENT_NAME配置属性,如果该配置没有指定,那么默认名称为Your_ApplicationName。这里我们把Your_ApplicationName替换成skywalking_tomcat。
# The service name in UI
agent.service_name=${SW_AGENT_NAME:skywalking_tomcat}
10、然后将tomcat重启
./shutdown.sh
./startup.sh
Skywalking与Spring Boot集成提供了完善的支持。
1、首先我们复制一份agent,防止与tomcat使用的冲突。
cd /usr/local/skywalking/apache-skywalking-apm-bin/
cp -r agent/ agent_boot
vi agent_boot/config/agent.config
修改配置中的应用名为:
# The service name in UI
agent.service_name=${SW_AGENT_NAME:skywalking_boot}
2、将skywalking_springboot.jar文件上传到/usr/local/skywalking目录下。Controller层代码如下,提供了一个正常访问的接口和一个异常访问接口:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
//正常访问接口
@RequestMapping("/sayBoot")
public String sayBoot(){
return "Hello Boot!";
}
//异常访问接口
@RequestMapping("/exception")
public String exception(){
int i = 1/0;
return "Hello Boot!";
}
}
3、使用命令启动spring boot项目
java -javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent_boot/skywalking-agent.jar -Dserver.port=8082 -jar skywalking_springboot.jar &
使用jar包启动的项目如果需要集成skywalking,需要添加-javaagent参数,参数值为agent的jar包位置。
-Dserver.port参数用于指定端口号,防止与tomcat冲突。
末尾添加&后台运行模式启动Spring Boot项目。
此时我们可以访问http://虚拟机IP:8082/sayBoot地址来进行访问,访问之后稍等片刻访问Skywalking的UI页面。
Skywalking的监控UI页面称为RocketBot,我们可以通过8080端口进行访问,由于8080端口很容器冲突,可以修改webapp/webapp.yml来更改启动端口:
server:
port: 8080
1、仪表盘
打开RocketBot默认会出现仪表盘页面:
仪表盘页面分为两大块:
(1) 服务仪表盘,展示服务的调用情况
(2) 数据库仪表盘,展示数据库的响应时间等数据
选中服务仪表盘,有四个维度的统计数据可以进行查看:
(1) 全局,查看全局接口的调用,包括全局响应时长的百分比,最慢的端点,服务的吞吐量等
(2) 服务,显示服务的响应时长、SLA、吞吐量等信息
(3) 端点,显示端点的响应时长、SLA、吞吐量等信息
(4) 实例,显示实例的响应时长、SLA、吞吐量等信息,还可以查看实例的JVM的GC信息、CPU信息、内存信息
2、拓扑图
Skywalking提供拓扑图,直观的查看服务之间的调用关系:
User代表用户应用,目前案例中其实是浏览器
图中skywalking_boot应用被User调用,同时显示它是一个Spring MVC的应用。后续案例中会出现多个应用调用,使用拓扑图就能清楚的分析其调用关系了。
左侧是追踪列表,也可以通过上方的追踪ID来进行查询。点击追踪列表某一条记录之后,右侧会显示出此条追踪的详细信息。有三种显示效果:
(1) 列表
(2) 树结构
(3) 表格
可以很好的展现此条追踪的调用链情况而链路上每个节点,可以通过左键点击节点查看详细信息:
当前的接口是HTTP的GET请求,相对比较简单,后续的示例中出现异常情况或者数据库访问,可以打印出异常信息、堆栈甚至详细的SQL语句。