乐趣区

关于sql:SQL审核-如何利用-OpenAPI-实现自己的扫描任务

作者:蔡传旺

前端工程师,负责写写页面并改改 bug,岂不快哉;

本文起源:原创投稿

* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。


一、SQLE 介绍

SQLE 是一款由爱可生开源社区发动,面向数据库开发与管理人员,实现了 SQL 的「开发」-「测试」-「上线」等全流程笼罩,资源与权限精细化治理,兼顾简洁与高效,易保护、易扩大的的开源我的项目,旨在为用户提供一套安全可靠、自主可控的 SQL 品质管控计划。

二、性能介绍

智能扫描工作是咱们能够应用一系列的形式调用 sqle 的 openAPI,将数据传输到 sqle 上进行扫描审核的性能,咱们能够从数据库中传输建库建表语句审核、能够将慢日志传输到 sqle,由 sqle 解析扫描 sql、也能够将 Mybatis 传输到 sqle 中扫描解析其中的 sql,所以 sqle 的智能扫描工作是十分弱小的,那智能扫描能解析那些数据呢?

三、如何应用扫描工作的 OpenAPI

介绍扫描工作的 OpenAPI

智能扫描就是咱们可用首先定义一个扫描工作,这个工作是针对某个特定的数据路类型,比方 MySQL,同时咱们也会设置工作的执行周期,只有工夫一到,sqle 就会主动执行这个扫描工作,刚接触 sqle 的小伙伴可能比拟懵,这个扫描工作创立了,然而没有内容,是我应用的形式不对吗?其实不然,sqle 凋谢了相应的 OpenAPI 接口,咱们能够调用 OpenAPI 来将咱们要审核的语句发送给 sqle 中相应的工作。那这个 OpenAPI 在哪里?怎么应用这个 OpenAPI 呢?

首先在你依照 官网文档的搭建形式 (https://actiontech.github.io/…) 搭建了一个 sqle 后,咱们拜访 http://${your address}:10000/swagger/index.html 就会失去一个 swagger 文档,咱们在其中能够找到下图的两个 api,而这两个 api 就是咱们能够间接将 sql 语句传给扫描工作的 OpenAPI。

应用办法

  1. 比方我在环境中创立了一个自定义类型的扫描工作

这样我就失去了这个扫描工作,在工作中我定义了工作类型、审核周期、数据库等,失去了一个拜访凭证,这个拜访凭证就是咱们应用 OpenAPI 拜访扫描工作中须要应用到的 token。

  1. 应用相似 postman 的工具,开启一个 post 申请,这里的 zidingyi 是动静参数,你要改成你的扫描工作的名称即可

申请的 header 是

Content-Type application/json
Authorization 该扫描工作的拜访凭证

申请的 body 是

   {"audit_plan_sql_list": [
       {
         "audit_plan_sql_counter": "1", #匹配到该指纹的语句数量
         "audit_plan_sql_fingerprint": "select * from users where id  = ?", #SQL 指纹
         "audit_plan_sql_last_receive_text": "select * from users where id = 1", #最初一次匹配到该指纹的语句
         "audit_plan_sql_last_receive_timestamp": "2022-08-23T19:30:46.00Z", #最初一次匹配到该指纹的工夫(RFC3339 格局)"audit_plan_sql_schema": "db1" #还不晓得
       }
     ]
   }
  1. 通过发送后就能够在该扫描工作的详情页面看到你的 sql

在这个工作达到审核工夫,就会主动审核该工作并反馈审核后果

  1. 这两个接口分为全量同步和增量同步,全量同步会笼罩之前的记录,而增量同步会在之前的记录下新增
  2. 有这个 api 咱们就能够将智能扫描工作和咱们的日常开发运维连接起来,实现审核 sql 自动化,比方能够sqle 联合 jenkins 加一个构建流程,在 Jenkins 工作触发时会进行 sql 审核,这里有分享文章(https://mp.weixin.qq.com/s/09…)

四、利用 OpenAPI 实现本人的扫描工作工具

后面我介绍了这个 OpenAPI 的高度的自定义性,上面我就给大家展现一下我写的一个小工具。就算有了 sqle,然而我还想实现高度的自动化(其实就是比拟懒,不想做反复工作),我心愿有一个工具间接一键就能够将我的 sql 全副上传到扫描工作里,而后进行审核。于是我写了小工具,能够将文件或者文件夹里的 sql 扫描进去并上传到指定的扫描工作中

自定义配置文件

host: your IP and port
path: your sql file path  eg: ./test.sql
audit-name: your audit name  eg:zidingyi
type: full  #full or partial 代表全量同步或者增量同步
isIndependent: true  #是否应用独立 sql 语句传入(也就是一个 sql 语句调用一次接口传入)token: your token

自定义配置文件反对命令和参数和配置文件绑定,命令行参数优先级高,也就是优先采纳命令行的参数,没有命令行参数则应用配置文件的参数

读取 sql

这一步将分成四种形式读取 sql 文件,别离取是否读取整个文件夹和是否应用独立 sql 语句传入的笛卡尔积,共 4 个函数

发送申请到 api

依据不必的参数将解析的 sql 生成 OpenAPI 的 body 参数,而后能够发送给 sqle 服务器,并获取返回参数。


    client := http.Client{}
    req, err := http.NewRequest("POST", fmt.Sprintf("http://%s/v1/audit_plans/%s/sqls/%s", cmd.Host, cmd.AuditName, cmd.Type), body)
    if err != nil {fmt.Println(err.Error())
    }
    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("Authorization", cmd.Token)

    res, err := client.Do(req)
    if err != nil {fmt.Println(err.Error())
    }
    defer res.Body.Close()
    b, _ := ioutil.ReadAll(res.Body)
    var r = modal.Result{}
    _ = json.Unmarshal(b, &r)
    fmt.Println(r)
    if r.Code != 0 || res.StatusCode != 200 {panic(r.Message)
    }
}

这里只是简略的解决一下谬误,还能够退出产生谬误主动发送邮件,或者对接第三方办公软件的 api 发送到指定的群等性能

综上,一个简略的小工具就实现了,这样我就能够一键解析 sql 并且将解析的 sql 传送到 sqle 的扫描工作中了,同时能够依据本人的理论状况减少不同的性能。由此可见,slqe 的扫描工作的自定义水平是十分高的。

这个小工具也是放到 github 上了,喜爱的能够 看一看(https://github.com/caichuanwa…)

性能演示

  • 将须要上传的 sql 筹备成一个 sql 文件,如果须要读取同一文件夹下多个 sql 文件,只须要将配置文件门路设置成文件夹门路即可
select * from audit_plans where id = 6;
  
select * from execute_sql_detail where id = 5;
  • 配置自定义配置文件,这个依据本人的理论状况配置,如果没有配置,也能够应用命令行参数配置,命令行参数权重大于配置文件
  • 首次运行对我的项目进行编译后执行

前期运行只须要间接执行二进制文件并应用命令行参数批改局部参数即可

  • 再次查看扫描工作的详情即可

其余业务场景类型

为了适应不同的业务场景,同时使 sqle 更加弱小,扫描工作反对多种类型的 sql 的采集工作,包含有 TopSQL 慢日志 Mybatis 扫描 等场景的解决,这里在咱们的 文档有介绍(https://actiontech.github.io/…)

五、总结

sqle 的智能扫描工作的覆盖面很广,而且能够高度自定义,在日常的开发运维中能够主动帮忙咱们解析 sql,及时发现谬误的 sql。大家能够下载安装 SQLE 并联合本人公司的需要试一下智能扫描,SQLE 的装置参考主页:https://github.com/actiontech…;

更多应用场景能够参考:https://actiontech.github.io/…。

退出移动版