是否可以为Glimpses现有的SQL表编写插件?

时间:2014-10-01 11:16:31

标签: sql asp.net performance-testing glimpse

是否可以为Glimpse现有的SQL选项卡编写插件?

我正在尝试记录我的SQL查询,当前可用的扩展不支持我们的内部SQL库。我编写了一个自定义插件来记录我想要的内容,但它的功能有限,并且它没有与现有的SQL选项卡集成。

目前,我正在使用DAL基类中的单个辅助方法登录我的自定义插件。此函数看起来采用SqlCommand和Duration,以便在我的自定义选项卡上显示数据:

// simplified example:
Stopwatch sw = Stopwatch.StartNew();

sqlCommand.Connection = sqlConnection;
sqlConnection.Open();
object result = sqlCommand.ExecuteScalar();
sqlConnection.Close();

sw.Stop();

long duration = sw.ElapsedMilliseconds;
LogSqlActivity(sqlCommand, null, duration);

这在我的“自定义”标签上运行良好,但不幸的是,我没有在Glimpse的HUD上显示指标:

enter image description here

有没有办法可以直接为Glimpse提供所需的信息(方法名称和参数),以便在SQL选项卡上本地显示?

1 个答案:

答案 0 :(得分:1)

以下建议基于以下事实:您无法使用DbProviderFactory而您无法使用代理的SqlCommand等

开箱即用的数据"开箱即用" SQL选项卡基于通过我们的内部Message Broker发布的给定类型的消息(请参阅下面的相关信息)。由于您的情况有上述限制,为了使事情正确点亮(即您的数据显示在HUD和SQL选项卡中),您需要模拟我们在发布这些消息时所做的工作。这不应该是那么困难,一旦完成,应该继续前进。

如果您查看我们here的各种代理,您将在上面查看我们在什么情况下发布的消息。以下是一些亮点:

  • 的DbCommand
    • 记录命令开始 - here
    • 记录命令错误 - here
    • 记录命令结束 - here
  • 的DbConnection:
    • 日志连接已打开 - here
    • 日志连接已关闭 - here
  • DbTransaction
    • 开始日志 - here
    • 提交日志 - here
    • 日志回滚 - here
  • 其他
    • 命令行数here - Glimpses在DbDataReader级别进行计算,但您也可以在其他地方进行计算

既然您已经了解了我们期望的消息以及我们如何生成它们,只要您在发布这些消息时传递正确的数据,一切都应该亮起 - 如果您感兴趣{{3}是寻找您要发布的消息的代码。


Message Broker:如果您在GlimpseConfiguration here,您将看到如何访问Broker。如果需要,这可以静态完成(正如我们here所述)。从这里,您可以发布所需的消息。

帮助者:要生成上述某些消息,您可以使用Supporthere中的帮助程序。我本可以将所有代码发布到本课程中,但我并不认为会有太多人在做你正在做的事情。


更新1

起点:使用上述方法,您不需要编写自己的插件。您应该只能访问经纪人GlimpseConfiguration.GetConfiguredMessageBroker()(确保检查其是否为空,如果Glimpse已关闭则为空,等等)并发布您的消息。

我想你会把利用代理并发布消息的检查放在哪里,你知道需要收集的信息(即在你的自定义lib中)。通常这需要你的lib中的引用来瞥见(你可能不想要),所以为了防止这种情况,你可以调用一个具有瞥见依赖性的代理(可能是另一个VS proj)。因此,您的ado lib仅引用您自己的代码。

为了让你的脚趾湿透,请尝试发布一些虚假的连接和命令消息。假设您从GlimpseConfiguration.GetConfiguredMessageBroker()获得的经纪人不是空的,这些应该只显示出来。然后,您可以尝试从lib中获取实际数据。


更新2

过时的经纪人访问 它标记为过时,因为它将在v2中发生变化。您仍然可以执行您需要执行的操作,但访问代理的方式已更改。对于你目前需要做的事情,这是可以的。

有时为null 您发现这实际上取决于您当前所处的页面生命周期中的位置。为了解决这个问题,我可能会稍微改变一下原来的建议。

在您当前正在创建消息并将其推送到消息总线的代码中,尝试将它们放入HttpContext.Current.Items。如果您以前没有使用它,那么这是一个asp.net提供的商店,它可以持续使用给定请求的生命周期。您可以在其中放置一个列表,仍然创建您正在执行的消息对象,但将它们放入该列表中,而不是通过代理推送它们。

然后,创建一个HttpModule(它真的很简单),它可以进入PostLogRequest事件。在此处理程序中,您可以将列表从上下文中拉出来,遍历它并将消息推送到消息代理(以与您相同的方式访问)。