跟踪数据库查询时间 - Bookshelf/knex

2023-12-09

我想监控 API 数据库查询所花费的时间。我因此使用书架信号(一个书架插件)创建了以下函数。 :

bookshelf.on('fetching', () => {
  server.app.fetching = new Date().valueOf();
});

bookshelf.on('counting', () => {
  server.app.fetching = new Date().valueOf(); 
});

bookshelf.on('fetched', () => {
  server.statsd.gauge('db_query', new Date().valueOf() - server.app.fetching);
});

...这样我就可以检索获取/计数之前和之后的时间;我对删除-删除和保存-保存也做了同样的事情。

我认为我无法理解的是何时应该触发 fetching 和 fetched...当我试图查看何时触发 fetching 和 fetched 时,基本上结果是这样的:

'fetching event A'
'fetching event B'
'fetching event C'
'fetched event C'
'fetched event B'
'fetched event A'

导致计时器明显返回错误值,您有任何线索/线索吗?

我还看到可以在 Knex 上触发“查询”事件,并考虑使用它作为替代解决方案。但是,似乎只有当我指定查询的表时它才有效,即:

 knex('whatever_table').on('query', () => {///});

在我想在每个模型上应用事件处理程序的情况下,这变得不切实际...... 我想我应该坚持使用 Bookshelf,但是我该如何处理事件的处理方式呢?

先感谢您!


我刚刚编写了一些小测试代码,如何使用 knex 跟踪事务持续时间。

https://runkit.com/embed/679qu91ylu4w

/**
 * Calculate transaction durations in knex
 * 
 */
require('sqlite3');
var knex = require("knex")({
  client: 'sqlite', 
  connection: ':memory:', 
  pool: { min: 1, max: 10 }
});

function isTransactionStart(querySpec) {
  return querySpec.sql === 'BEGIN;';
}

function isTransactionEnd(querySpec) {
  return querySpec.sql === 'COMMIT;' || querySpec.sql === 'ROLLBACK;';
}

const transactionDurations = {};

knex.on('query', querySpec => {
  console.log('On query', querySpec);

  if (isTransactionStart(querySpec)) {
    if (transactionDurations[querySpec.__knexUid]) {
      console.error('New transaction started, before earlier was ended');
      return;
    }
    transactionDurations[querySpec.__knexUid] = new Date().getTime();
  }

  if (isTransactionEnd(querySpec)) {
    const startTime = transactionDurations[querySpec.__knexUid];
    if (!startTime) {
      console.error('Transaction end detected, but start time not found');
    }
    const endTime = new Date().getTime();
    transactionDurations[querySpec.__knexUid] = null;
    console.log('TRANSACTION DURATION', endTime - startTime);
  }
}); 

// just as an example of other available events to show when they are called
knex.on('query-response', (res, querySpec) => {
  // console.log('On query response', res, querySpec);
}); 

knex.on('query-error', (err, querySpec) => {
  // console.log('On query error', err, querySpec);
}); 

try {
    a = await Promise.all([
      knex.transaction(trx => {
        return trx.raw('select 1');
      }),
      knex.transaction(trx => {
        return trx.raw('select 2');
      }),
      knex.transaction(trx => {
        return trx.raw('error me');
      })
    ]);
} catch (e) {
  console.log('Got ERROR:', e);
}

同样的方法也应该适用于查询计时。为了防止计时器簿记泄漏内存,您应该添加一些清理代码。

查询持续时间计时器应启动于query事件并停在query-response or query-error取决于哪个先触发。

为了能够匹配query - query-response pair querySpec.__knexQueryUid可以使用属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跟踪数据库查询时间 - Bookshelf/knex 的相关文章

  • 测验程序的 MySql 数据库设计

    我目前正在开发一个项目 主要是创建一个测验应用程序 它将能够进行包含 10 到 20 个问题的多项选择题或简答题的测验 它需要能够根据正确答案检查用户的答案 然后对用户的答案进行评分 稍后 我可能会实现一个后端功能来在线创建测验 但现在我将
  • MySQL:记录之间的平均间隔

    假设这张表 id date 1 2010 12 12 2 2010 12 13 3 2010 12 18 4 2010 12 22 5 2010 12 23 如何仅使用 MySQL 查询找到这些日期之间的平均间隔 例如 此表上的计算将是 2
  • 可以有多个用户作为 MySQL 存储过程的定义者吗?

    我在 MySQL 存储过程方面遇到了一些困难 并且感到有点沮丧 我有一组由 Bob 创建的 SP 由于他是定义者 只有他才能看到它们的 CREATE 语句 修改它们等 Mary 可以在 MySQL Workbench 的架构中看到 Bob
  • MySQL - 替换列中的字符

    作为一个自学成才的新手 我给自己制造了一个大问题 在将数据插入数据库之前 我将字符串中的撇号 转换为双引号 而不是 MySQL 实际需要的反斜杠和撇号 在我的表增长到超过 200 000 行之前 我认为最好立即纠正此问题 所以我做了一些研究
  • MySQL 过去 12 个月的月度销售情况,包括没有销售的月份

    SELECT DATE FORMAT date b AS month SUM total price as total FROM cart WHERE date lt NOW and date gt Date add Now interva
  • 将程序存储在 phpMyAdmin 中

    我必须将存储过程添加到 MySQL 数据库 问题是托管提供php我的管理员来管理数据库 我在网上搜索了一下 想法是运行创建程序的MySQL本机语句 但由于程序的代码通常可能有 我们必须更改 MySQL 中的分隔符 php我的管理员没有这个选
  • MySql JOINS 的优点/缺点

    当我从多个表中选择数据时 我经常使用 JOINS 最近我开始使用另一种方式 但我不确定从长远来看会产生什么影响 例子 SELECT FROM table 1 LEFT JOIN table 2 ON table 1 column table
  • 如何对主索引重新编号

    我有一个简单的 MySQL 表 主索引 id 不是一一编号的 1 31 35 100 等 我希望它们的编号如 1 2 3 4 请告诉我该怎么做 我还想指出的是 我知道该操作可能产生的后果 但我只是想整理一下表格 我同意其他方法也可以 但我只
  • 从数据库中给定时间起经过的时间

    我有一个 HTML 表 其中包含从数据库中提取的记录 我正在使用 PHP MySQL 我的表中名为 Timer 的列未从数据库中检索 我需要在此处显示经过的时间 从数据库中的特定时间开始 例如 假设现在的时间是2013年2月21日下午6点2
  • Java/Hibernate - 异常:内部连接池已达到其最大大小,当前没有可用的连接

    我第一次在大学项目中使用 Hibernate 而且我还是个新手 我想我遵循了我的教授和我阅读的一些教程给出的所有指示 但我不断收到标题中的异常 Exception in thread main org hibernate Hibernate
  • 优化mysql中日期类型字段的查询

    我目前准备了以下查询 select sum amount as total from incomes where YEAR date 2019 and MONTH date 07 and incomes deleted at is null
  • mysql jdbc 与 SSL 连接在 tls 握手级别失败

    我们的 mysql 服务器配置为仅接受与 ssl 密码 DHE RSA AES256 GCM SHA384 的连接 我正在使用 java mysql connector java 8 0 15 和 java 8 openjdk 版本 1 8
  • 如何在php中正确显示另一种语言的mysql表数据

    我有一个 mySQL 表 其中一列中的数据采用英语以外的语言 波斯语 当我在表中输入数据时 它会正确显示 但是当我想在 php 文件中显示数据时 它会显示如下 好吧 我应该怎么做才能以正确的形式显示数据 由于我经常使用 非英语 字符 因此要
  • PHP实现的机票预订系统

    如何防止预订系统中的座位被重复预订 我正在用 PHP 和 MYSQL 制作一个航空旅行预订系统模型作为一个项目 我有一个小问题 仅在付款后 门票和座位详细信息才会永久存储在此处 座位号在付款前分配 假设人 1 预订了飞机上的座位 x 并支付
  • java中如何知道一条sql语句是否执行了?

    我想知道这个删除语句是否真的删除了一些东西 下面的代码总是执行 else 是否删除了某些内容 执行此操作的正确方法是什么 public Deleter String pname String pword try PreparedStatem
  • 将错误保存到 MySQL 数据库

    我有一个 php 查询来更新 MySQL 数据库 请参见下文 sql update hr payroll set payroll number payroll number tax code tax bacs ref bacs ref pa
  • MySQL 将 ÅäÖ 视为 AAO?

    这两个查询给了我完全相同的结果 select from topics where name Harligt select from topics where name H rligt 这怎么可能 看起来mysql在搜索时会将 翻译成aao
  • 数据库中的持久日期不等于检索日期

    我有一个具有 Date 属性的简单实体类 此属性对应于 MySQL 日期时间列 Entity public class Entity Column name start date Temporal TemporalType TIMESTAM
  • MySQL #1093 - 您无法在 FROM 子句中指定用于更新的目标表“赠品”

    I tried UPDATE giveaways SET winner 1 WHERE ID SELECT MAX ID FROM giveaways 但它给出了 1093 您无法指定目标表 赠品 进行更新FROM clause 本文 ht
  • 使用 DBCP 配置 Tomcat

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat

随机推荐

  • .net WebService,绕过 ssl 验证!

    好吧 我正在使用一个 Web 服务 该服务的证书未 100 正确设置 该证书是为域 domain1 com 设置的 并且 api 位于soap shop domain1 com SOAP 现在我无法连接到此webservice 然后我得到一
  • GetModuleHandle(),用于另一个进程中的 DLL

    标题确实解释了这一切 我有一个进程利用另一个进程 我需要能够在该程序上获取某个非 Windows 标准的 DLL 并且我没有主程序的源代码 我需要使用它通过 GetProcAddress 调用导出函数 并最终在 CreateRemoteTh
  • 比较Java中不同类的对象字段

    我有两个对象 每个对象都有数十个字段 Class1 int firstProperty String secondProperty Class2 int propertyOne String propertyTwo 虽然有些字段的名称不同
  • 使 WooCommerce 中不需要结账地址字段

    在 Woocommerce 中 我试图使用下面的代码使结账地址字段不需要 但我有这个错误提交结帐表格时 请输入地址以继续 我设置不需要的地址结帐字段的代码 add filter woocommerce billing fields wc n
  • JSON 到 PHP 关联数组

    你们中有人知道将其放入关联数组的好方法吗 我努力了json decode但发现并没有太大帮助 这是我需要放入关联数组的数据 data name Joe Bloggs id 203403465 name Fred Bloggs id 2547
  • IBM Worklight - 在哪里可以找到以前的版本

    我希望使用 IBM Worklight v5 0 5 Fix pack 1 设置 Eclipse 开发环境 我可以获得有关旧版本 Worklight 的安装链接的一些指示吗 请参阅下面的可用下载 请注意 这些链接并不能保证每次下载都是每个版
  • KeyHolder插入db2表后获取主键值

    再会 我在 db2 中有一个表 其中主表is autoincrement被设定为Yes 意味着每次向该表插入数据时 不需要传入主键值 因为它会自动生成 但是 我需要在插入后取回主键值 代码如下 public integer insertRe
  • PHP Traits:如何解决属性名称冲突?

    当类使用两个 Traits 时如何解决属性名称冲突同名属性 Example
  • 通过互操作接收字符串

    我无法从我编写的一些 C 代码中获取字符串 首先是一些通常不相关的背景信息 我想从 TAPI API 接收 TAPI TSP 的用户可读字符串 我已经实现了一个半可行的 TAPI 解决方案 依赖于将驱动程序名称与存储的字符串相匹配 但希望将
  • 尝试为 API Gateway 设置用户池身份验证

    我正在尝试使用 Cognito 用户池在 API 上设置安全性 我回来了 401 未经授权 API 和用户池已经存在 并且我一直在使用用户池登录应用程序 我现在正在尝试保护 API 调用的安全 我在 API 上创建了一个授权者 然后我将授权
  • 如何识别sql中的unicode文本?

    表 1 有一个名为 umsg 的 nvarchar 列 其中包含 unicode 文本 有时还包含英语 我想找出 umsg 列中存在的英文文本 select from table1 where RDate gt 01 01 2014 and
  • Fraction 对象没有 __int__ 但 int(Fraction(...)) 仍然有效

    在Python中 当你有一个对象时 你可以使用以下命令将其转换为整数 int功能 例如int 1 3 将返回1 这在内部通过使用 int 在这种特殊情况下 对象的魔术方法float int 在Python中Fraction对象可用于构造精确
  • 更改气球图中点的大小并保持零值

    有了这些数据 Data lt structure list ObsVal c 22L 50L 8L 15L 54L 30L 11L 90L 6L 53L 9L 42L 72L 40L 60L 58L 1L 20L 37L 2L 50L 68
  • 如何部署 IBM Filenet P8 订阅?

    在我当前使用 Filenet P8 Content Platform Engine 5 2 1 和 WebSphere 8 5 5 3 的项目中 我想知道如何将内容引擎订阅部署到系统 我搜索了 IBM 文档 但它告诉我如何建立订阅 但没有告
  • Python:使用正则表达式从字符串中解析数值

    我正在编写 python 代码来使用正则表达式从字符串中解析不同类型的数字 但遇到了一个我不明白的恼人问题 我的代码如下 import re test string Distributions 54 00 bob 26 and 0 30 5
  • 有没有简单的 awk/sed 方法来打印 YAML 文件中的列表?

    我正在寻找一种优化方法来使用 sed 或 和 awk 打印 YAML 文件中的特定列表 例如 在下面的示例 yaml 文件中 如何单独打印在屏幕上的水果列表 例如 以逗号分隔 输入文件 boston mart yaml 我能够使用 awk
  • 如何自动更新在powershell中运行的后台作业的数量?

    我在 powershell 中运行的后台作业很少 我正在尝试找到一种方法来获取作业 正在运行 和 已完成 的计数 一旦作业完成 该计数就会自动更新 function jobDetails d Get Job Measure Object P
  • 使用 json.dump 引发 JSONDecodeError("Extra data", s, end)

    我需要创建一个包含许多 json 的 json 文件 例如 我实际上可以创建该文件 但是当我尝试读取它时 出现此错误 raise JSONDecodeError Extra data s end JSONDecodeError Extra
  • 在 ASP.Net Core 中间件中调用服务/存储库方法

    ASP Net Core 菜鸟在这里 我正在使用 ASP Net Core WebAPI 核心项目 该项目使用 DNX451 和 EF 6 我需要在我们的服务中实现 API 密钥身份验证 为此 我创建了中间件 该中间件从请求中获取信息并继续
  • 跟踪数据库查询时间 - Bookshelf/knex

    我想监控 API 数据库查询所花费的时间 我因此使用书架信号 一个书架插件 创建了以下函数 bookshelf on fetching gt server app fetching new Date valueOf bookshelf on