3.2 MySql调用监控
3.2.1 使用docker启动Mysql
此处省略docker上传至linux操作
启动docker
代码语言:javascript复制systemctl start docker
使用docker命令启动mysql:
代码语言:javascript复制docker run -di --name=skywalking_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7
MYSQL_ROOT_PASSWORD环境变量指定root的密码为123456 这样就可以在外部访问mysql了。使用工具连接mysql,端口为33306密码为123456。创建数据库:
备注: 如果要使用公司dev环境的数据库, 记得修改一下MySQL的密码
执行建表语句:
代码语言:javascript复制CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
插入几条数据
代码语言:javascript复制insert into `t_user`(`name`) values ('张三'),('李四'),('王五');
3.2.2 Spring Data JDBC访问Mysql
创建一个Spring Boot工程,集成Spring Data JDBC。
pom文件
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.sf.saas</groupId>
<artifactId>skywalking_mysql</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>skywalking_mysql</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
引入了 spring-boot-starter-data-jdbc,由于使用了5.7的mysql版本,所以驱动版本固定为 5.1.46。
POJO
代码语言:javascript复制import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;
@Table("t_user")
public class User {
@Id
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{"
"id=" id
", name='" name '''
'}';
}
}
添加Table注解,修改表明为t_user。
DAO接口
代码语言:javascript复制import com.itcast.skywalking_mysql.pojo.User;
import org.springframework.data.repository.CrudRepository;
public interface UserRepository extends CrudRepository<User, Integer> {
}
controller
代码语言:javascript复制import com.itcast.skywalking_mysql.dao.UserRepository;
import com.itcast.skywalking_mysql.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
public class MysqlController {
@Autowired
private UserRepository userRepository;
@GetMapping("/users")
public List<User> findAll(){
List<User> result = new ArrayList<>();
userRepository.findAll().forEach((user) -> {
result.add(user);
});
return result;
}
}
由于Spring Data JDBC的findAll方法返回的是一个迭代器,所以需要遍历迭代器将数据进行返 回。
启动类
代码语言:javascript复制import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SkywalkingMysqlApplication {
public static void main(String[] args) {
SpringApplication.run(SkywalkingMysqlApplication.class, args);
}
}
application.properties
代码语言:javascript复制spring.datasource.url=jdbc:mysql://localhost:33306/skywalking
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
server.port=8087
请根据具体情况进行修改
3.2.3 部署方式
- 将上述代码打包并且上传至 /usr/local/skywalking目录下。
- 首先我们复制agent,防止使用的冲突。
cd /usr/local/skywalking/apache-skywalking-apm-bin/ cp -r agent agent_mysql
vi agent_mysql/config/agent.config
修改agent_mysql配置中的应用名为
代码语言:javascript复制# The service name in UI
agent.service_name=${SW_AGENT_NAME:skywalking_mysql}
- 启动skywalking_mysql应用,等待启动成功。
#切换到目录下
cd /usr/local/skywalking
#启动spring boot
java -javaagent:/usr/local/skywalking/apache-skywalking-apm-
bin/agent_mysql/skywalking-agent.jar -jar skywalking_mysql.jar &
- 调用接口,接口地址为:http://虚拟机IP地址:8087/users
- 此时如果页面显示
那么mysql的调用就成功了。
- 打开skywalking查看mysql调用的监控情况 服务仪表盘
数据库仪表盘
点击数据库仪表盘可以看到详细的数据库响应时长、吞吐量、SLA等数据。
拓扑图
该图中已经表示出了一个调用的链路关系:
代码语言:javascript复制User(浏览器) ----> skywalking_mysql ----> localhost:33306
并且在服务的上方标识出了每个服务代表的内容,skywalking_mysql是SpringMvc的服务,而 localhost:33306是mysql的服务。
追踪
追踪图中显示本次调用耗时5ms,其中spring MVC接口耗时4ms,那么另外的1ms是调用Mysql的耗 时。
点击mysql的调用,可以看到详细的sql语句。
这样可以很好的定位问题产生的原因,特别是在某些sql语句执行慢的场景下