文章目录

  • ⭐前言
  • ⭐node-koa+mysql实现数据表的增删改查
  • ✏️mysql数据库表设计
  • ✏️post添加数据
  • 💖 apifox 测试post添加数据接口
  • ✏️post查询分页数据
  • 💖 apifox 测试post查询数据接口
  • ✏️post查询分页数据
  • 💖 apifox 测试post删除数据接口
  • ⭐结束



性能监控系统搭建——node_koa实现性能监控数据上报(第一章)_sql

⭐前言

大家好,我是yma16,本文分享node_koa实现性能监控数据上报(第一章)。

背景

为了实现前端性能耗时的数据监控,前端对外发布js的sdk,sdk的功能主要是性能耗时计算和数据上报。同时使用vue3和node开发一个数据监控的后台管理系统,主要功能是展示数据,提供一个api_key和token对外暴露的api接口去添加数据监控数据。

功能:
对外暴露性能上报接口,用户通过api_key请求上报数据到后台。

由于在往期文章已经介绍过如何实现jwt权限登录,所有这篇文章主要讲解node_koa对数据监控表的查询、增加、删除和更新。

⭐node-koa+mysql实现数据表的增删改查

✏️mysql数据库表设计

字段取名灵感来源于性能指标参考mdn的官方文档
https://developer.mozilla.org/zh-CN/docs/Web/API/PerformanceNavigationTiming

性能监控系统搭建——node_koa实现性能监控数据上报(第一章)_数据分析_02


表名 性能表 perf_table

perf_table表中的字段

字段

含义

id

唯一标识

name

名称

type

类型

path

前端url路径

fmp_count

页面首屏的渲染耗时

fp_count

页面白屏的渲染耗时

dns_count

dns查询耗时

tcp_count

tcp连接耗时

dcl_count

dom内容加载耗时

create_time

创建时间

update_time

更新时间

create_user_id

创建关联的用户id

sql建表语句

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for  perf_record
-- ----------------------------
DROP TABLE IF EXISTS `perf_record`;
CREATE TABLE ` perf_record`  (
  `id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '唯一标识',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '名称',
  `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '类型',
  `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '前端url路径',
  `fmp_count` double NULL DEFAULT NULL COMMENT '页面首屏的渲染耗时',
  `fp_count` double NULL DEFAULT NULL COMMENT '页面白屏的渲染耗时',
  `dns_count` double NULL DEFAULT NULL COMMENT 'dns查询耗时',
  `dcl_count` double NULL DEFAULT NULL COMMENT 'dom内容加载耗时',
  `tcp_count` double NULL DEFAULT NULL COMMENT 'tcp连接耗时',
  `create_time` datetime(0) NOT NULL COMMENT '创建时间',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  `create_user_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '创建用户id',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

✏️post添加数据

insert sql语句

insert into perf_record (id,name) values('add-id','前端性能')

node koa 封装post接口添加数据,用户id信息使用jsonwebtoken解析token得到,自定义生产唯一id和当前时间,其他参数从body得到

const Router = require('koa-router');
const router = new Router();
const { execMysql } = require('../../utils/mysql/index')
const { uuid, getCurrentTime } = require('../../utils/index');
// jwtToken
const jwtToken = require("jsonwebtoken");
const { appKey } = require('../../common/const');
// 添加perf_record 表数据
router.post('/perf/add', async(ctx) => {
    try {
        // 解析 header参数
        if (!ctx.header || !ctx.header.authorization) { // 判断请求头里面是否有 authorization
            console.warn('no header')
            return;
        }
        const parts = ctx.header.authorization.trim().split(' '); // authorization是 Bearer + ' ' + jwt字符串
        const token = parts[1]
        const payload = jwtToken.verify(token, appKey);
        const { username } = payload;
        // 获取创建用户 作为user_id
        const create_user_id = username
            // 解析 post 参数
        const bodyParams = ctx.request.body
        console.log('bodyParams', bodyParams)
        const { name, type, path, fmp_count, fp_count, dns_count, dcl_count, tcp_count } = bodyParams;

        const create_time = getCurrentTime()
        const id = uuid();
        // sql 插入 数据
        const createRes = await execMysql(`INSERT INTO perf_record 
            (id,name,type,path,fmp_count,fp_count,dns_count,dcl_count,tcp_count,create_time,create_user_id)
            VALUES ('${id}', '${name}','${type}','${path}','${fmp_count}','${fp_count}','${dns_count}','${dcl_count}','${tcp_count}','${create_time}','${create_user_id}');`)
        ctx.body = {
            code: 200,
            data: createRes,
            msg: 'create perf  success'
        };
    } catch (r) {
        console.error('error', r)
        ctx.body = {
            code: 0,
            data: null,
            msg: r.toString()
        };
    }
});

💖 apifox 测试post添加数据接口

post接口的auth配置 bearer token 参数

性能监控系统搭建——node_koa实现性能监控数据上报(第一章)_koa_03


传递post参数

{
    "name":"a",
    "type":"b",
    "path":"yongma16.xyz/",
    "fmp_count":0,
    "fp_count":0,
    "dns_count":0,
    "dcl_count":0,
    "tcp_count":0
}

性能监控系统搭建——node_koa实现性能监控数据上报(第一章)_sql_04


sql表中数据通过api添加成功!

性能监控系统搭建——node_koa实现性能监控数据上报(第一章)_性能监控_05

✏️post查询分页数据

模糊查询name,sql分页 限制结果 start-end,按创建时间排序

select * from perf_record 
where title like '%${name}%' 
order by create_time 
desc limit ${start},${end};

cout查询总数sql

select count(1 ) as total from perf_record where name like '%${name||''}%';

koa接口实现

// 获取perf list
router.post('/perf/list', async(ctx) => {
    try {
        // 解析参数
        const bodyParams = ctx.request.body
        const { pageSize, page, name } = bodyParams;
        const start = Number(pageSize) * Number(page - 1)
        const end = Number(pageSize)
        const search = await execMysql(`select * from perf_record where name like '%${name}%' order by create_time desc limit ${start},${end};`);
        const searchTotal = await execMysql(`select count(1 ) as total from perf_record where name like '%${name||''}%';`);
        ctx.body = {
            code: 200,
            data: search,
            total: searchTotal ? searchTotal[0].total : 0,
            msg: 'get perf list success'
        };
    } catch (r) {
        ctx.body = {
            code: 0,
            data: null,
            msg: r.toString()
        };
    }
});

💖 apifox 测试post查询数据接口

分页查询数据成功

性能监控系统搭建——node_koa实现性能监控数据上报(第一章)_数据_06


删除成功!

✏️post查询分页数据

根据id删除数据的sql

delete from perf_record  where id='${id}';

koa封装api

// 删除perf  根据id删除
router.post('/perf/delete', async(ctx) => {
    try {
        // 解析参数
        const bodyParams = ctx.request.body
        const { id } = bodyParams;
        const delRes = await execMysql(`delete from perf_record  where id='${id}';`)
        ctx.body = {
            code: 200,
            data: delRes,
            msg: 'delete perf_record success'
        };
    } catch (r) {
        ctx.body = {
            code: 0,
            data: null,
            msg: r.toString()
        };
    }
});

💖 apifox 测试post删除数据接口

根据id删除成功!

性能监控系统搭建——node_koa实现性能监控数据上报(第一章)_sql_07

⭐结束

性能监控系统搭建——node_koa实现性能监控数据上报(第一章)_数据分析_08

👍 点赞,是我创作的动力!

⭐️ 收藏,是我努力的方向!

✏️ 评论,是我进步的财富!

💖 最后,感谢你的阅读!