快速学习-Skywalking-MySql调用监控

2020-08-10 10:28:17 浏览数 (1)

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 部署方式

  1. 将上述代码打包并且上传至 /usr/local/skywalking目录下。
  2. 首先我们复制agent,防止使用的冲突。
代码语言:javascript复制
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}
  1. 启动skywalking_mysql应用,等待启动成功。
代码语言:javascript复制
#切换到目录下 
cd /usr/local/skywalking 
#启动spring boot 
java -javaagent:/usr/local/skywalking/apache-skywalking-apm- 
bin/agent_mysql/skywalking-agent.jar -jar skywalking_mysql.jar &
  1. 调用接口,接口地址为:http://虚拟机IP地址:8087/users
  2. 此时如果页面显示

那么mysql的调用就成功了。

  1. 打开skywalking查看mysql调用的监控情况 服务仪表盘

数据库仪表盘

点击数据库仪表盘可以看到详细的数据库响应时长、吞吐量、SLA等数据。

拓扑图

该图中已经表示出了一个调用的链路关系:

代码语言:javascript复制
User(浏览器) ----> skywalking_mysql ----> localhost:33306 

并且在服务的上方标识出了每个服务代表的内容,skywalking_mysql是SpringMvc的服务,而 localhost:33306是mysql的服务。

追踪

追踪图中显示本次调用耗时5ms,其中spring MVC接口耗时4ms,那么另外的1ms是调用Mysql的耗 时。

点击mysql的调用,可以看到详细的sql语句。

这样可以很好的定位问题产生的原因,特别是在某些sql语句执行慢的场景下

0 人点赞