开发者学堂课程【分布式链路追踪 Skywalking:Mysql 调用监控】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/743/detail/13160
Mysql调用监控
内容介绍:
一、搭建 MySQL
二、使用 sqlyog 连接虚拟机端口
三、使用 Spring Date JDBC 访问数据库
四、Spring Date JDBC的实现
五、将skywalking_mysql 发布到虚拟机
六、确认应用是否被 skywalking 监控
一、搭建 MySQL
skywalking 对 MySQL 进行调用监控。
使用 Spring Date JDBC 的代码来对 MySQL 进行访问,需要在虚拟机先搭建 MySQL ,才能对代码进行访问。选用docker来进行 MySQL 的安装,首先进入到虚拟机来查。
使用docker的命令查看docker版本,命令:docker - v ,之后使用 systemctl start docter 命令启动 docker,启动成功后。通过命令 docker images 来查看docker 本地的镜象。如下图所示:
使用 mysql -57-centos7 这个镜像进行 MySQL 的安装。输入启动命令: docker -di 。因为是将 MySQL 启动成后端服务,并需要添加一个环境变量作为root的初始密码来进行设置。最终将命令写成:
Docker run -di --name=skywa1king_mysq1 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/my sq1-57-centos7。
二、使用 sqlyog 连接虚拟机端口:
镜像启动完毕。使用 sqlyog 连接虚拟机端口 :33306 来进行登录。创建新连接,名字为 skywalking_mysql 。连接地址填写自己虚拟机的地址。用户名 root ,密码:123456。端口 :33306,测试连接,点击连接。然后创建 skywalking 数据库,字符集为utf8
排序规则为 utf8_unicode_ci 。然后创建表,代码如下:
CREATE TABLE't_user'
idint(11) NOT NULL AUTO_INCREMENT, namevarchar(50)DEFAULT NULL. PRIMARY KEY Cid
ENGINE=InnoDB DEFAULT CHARSET=utf8
粘贴,如下:
执行成功后,刷新(f5),当前没有数据,表结构中只有ID和name 两条字段,ID是int型,自增的主件,name为字符型,varchar(50),长度50,然后在数据库中插入数据,插入数据的 sql 如下: insert into ‘t_user ‘( ‘name’)values ('张三'),('李四'),('王五’) ;由于主件自增,故将这个sql粘贴到如下图所示地方即可。
执行,刷新。如下结果:
三、使用 Spring Date JDBC 访问数据库:
使用 Spring Date JDBC 进行数据库的访问。建立项目 skywalking_mysql ,代码使用如下图安装包:
放到虚拟机,直接运行。查看该项目文件,发现pom文件使用了2.1.0的版本,与其他应用保持一致,引入了 spring-boot-starter-data-jdbc //数据访问层,用来做数据库的访问。也引入了 spring-boot-starter-data-web 来进行前端浏览器的访问。MySQL的驱动版本为5.1.46。建议使用5.1的版本,保证访问的正确性。接下来观看配置文件,如下图所示:
datasource连接的是localhost下的33306端口, jar 包(springboot应用)会在虚拟机中进行运行,所以要访问本地的3306端口,也就是访问我们 docker 中的 sky walking_mysql 。访问sky walking 数据库。填写驱动名字:com.mysql,jdbc.Driver 。填写用户名: root 密码:123456。Pory端口:8087。如下图所示:
首先提供了mysqlcontroller,通过浏览器的接口进行访问,接口为 get 请求: /users 。作用为捅过 Spring Date JDBC 去访问数据库数据,获取所有数据,并打印,返回给前端。
四、Spring Date JDBC的实现:
接下来学习Spring Date JDBC怎么实现。代码如下图所示:
首先,定义一个 public 类,因为这个 public 类与数据库名没有直接映射关系,故添加一个注解@Table,将表名 t_user 做一个映射,Spring Date JDBC 就可以知道数据实体与这张表的关联,同时在id 的字段上添加注解 @ID ,表明这是主件。再添加 name 字段, public 类完成。接下来看数据访问层的接口,如下图所示:
由于使用了Spring Date JDBC,故只需要定制一个接口,继承一个CrudRepository 接口就可以。该接口提供了标准的增删改查及方法,如下图所示:
需要用到 findAll() 方法去查询所有的数据。所有的数据会返回一个迭代器接口,使用这个迭代器接口进行数据的访问。注意需要声明两个泛型,第一个泛型为 public 类:user类,第二个为它的主件的类型: integer 。调用时通过 @Autwired 进行的 userPepostitory 的注入,这时,Spring Date JDBC生成一个动态代理对象,使用动态代理对象进行数据的访问。这里有泛型为 list 的user,然后通过userPepostitory 的findAll() 方法返回一个迭代器,通过迭代器的forEach()方法来遍历所有的数据,最后将数据放到result中。返回给前端。该流程就是向数据库去获取 t_user 这张表的所有数据,然后运行一个接口返回给前端。
五、将 skywalking_mysql 发布到虚拟机:
接下来将 skywalking_mysql 发布到虚拟机,然后在 WinSCP 中
将jar包上传到user/local/skywalking/*.*目录下。如下图所示:
可以看到已经上传:
通过命令jar-jar 启动他,注意启动将agent再拷贝一份。进到 apache-skywalking-apm-bin 目录下,命令:cd apache-skywalking-apm-bin。找到 agent ,将 agent拷贝到agent_mysql 下,命令如下:cp -r agent agent_mysql 。然后进入 agent_mysql 中,编辑服务名,命令: cd config ,回车,之后再vi agent.config。找到服务名称,如下图所示:
将 skywalking_tomcat 改为 skywalking_mysql 。保存。准备工作就绪,接下来启动应用,启动命令为: java -java agent:/usr/1oca1/skywalking/apache-skywalking-apm-bin/agent_mysq1/skywalking-a gent.jar -jar skywalking_mysq1.jar &。应用在后端发布,然后后台退出。然后在浏览器地址栏输入:192.168.62.141:8087/users ,回车。显示如下:
到此为止,对MySQL的访问成功。
六、确认应用是否被 skywalking 监控:
之后确认应用有没有被 skywalking 监控到,刷新。可以看到一个应用名被查询到,属性,users调用时间如下图所示:
查看Dashboard有没有出现数据库,结果如下图所示:
还可以通过Datebase来查看数据库的指标:响应时间,吞吐量,时间线等。如图所示:
接下来看追踪的记录,点击搜索进行刷新,发现调用,将调用改成表格状,这笔调用在前端,前端通过 get 请求去调用,到了8087端口上一个接口,这个接口通过 spring MVC 来进行调用。它通过 MYSQL的调用去执行 SQL 语句。如下图所示:
最终执行的sql 语句为:
SELECT _user.id AS id, t_user.name AS name FROM t user
通过 skywalking 可以方便的监控到有多少 sql 语句在数据库中执行,如图所示:
通过点击详情可以明确发现那条 sql 语句耗时最长,sql 语句包含哪些内容,是否存在性能较低的 sql 语句。这就是 skywalking 对 MySQL 进行调用监控。只要应用连接到musql数据库,发起调用时,
skywalking 就可以将信息自动统计到 Rockrtbot中,通过仪表盘可以看到详细信息。在拓扑图中也可以看到链路。如下图所示:
通过 user 去访问 skywalking_mysql 的这么一个 spring mvc 的应用,spring mvc 的应用去访问 mysql。