【问题标题】:Track User Session in Wildfly Application Server to a DB session将 Wildfly 应用程序服务器中的用户会话跟踪到数据库会话
【发布时间】:2020-01-23 15:35:26
【问题描述】:

让我们看一个基本的网络应用架构,即客户端 网络服务器 应用服务器 数据库

在很多情况下,我们需要在应用程序中端到端地跟踪用户活动。例如:哪个用户会话对应于 DB 中运行不佳的查询?等等

我们有一个明确的方法来获取数据库中的会话数据(我们(或任何)Oracle DB 的 v$session)。如果我们一直返回到客户端,我们会通过 M&A 工具 (Dynatrace) 跟踪 cookie,以及在 Web 服务器和应用服务器日志中跟踪用户 ID。

但是我无法在数据库会话记录和特定用户 http 会话之间建立连接,因为数据库中的所有会话都标记有相同的应用程序用户 ID(Wildfly 用户 ID 用于建立数据源连接)。

能否请您帮助如何建立这种联系,以便可以追踪整个用户旅程?

我尝试在 jmx 控制台中检查可以提供此信息但找不到的 mbean。表 v$sql_bind_capture 提供绑定变量数据。如果幸运的话,一些绑定变量可用于指示单个用户[变量,如用户 ID(或)位置(如果使用)],但不是跟踪所有用户的可靠方法。

【问题讨论】:

    标签: oracle session wildfly session-cookies jmx


    【解决方案1】:

    欢迎来到 StackOverflow。

    如果您有权访问客户端应用程序代码,则可以在客户端中设置信息,从而将会话链接到特定的客户端计算机。哦,但这假设客户端服务器连接&可能不适用于网络,因为您可能有池连接。

    您可以随时在客户端使用DBMS_APPLICATION_INFO包和SET_MODULE功能。然后您可以在查看 Oracle 会话信息时看到此信息。检查文档以了解这些字段的大小,第一个大约 64 个字符,并且操作非常短。

    -- Set Connection Info on Client
    DBMS_APPLICATION_INFO.SET_MODULE( 
      'app_name_v1.2.3.4 3rd floor, office 212', 
      'Opened the main window'); 
    
    -- Clear out connection info on Client (not necessary)
    DBMS_APPLICATION_INFO.SET_MODULE(null,null); 
    

    【讨论】:

      【解决方案2】:

      在您的架构中,应用服务器是唯一拥有所有信息以跟踪整个旅程的组件。数据库应该被视为对上下文一无所知的存储。 我通常使用 MessageDiagnosticContext (MDC) 来提供从 Web 客户端层到应用程序服务器层的上下文信息,以记录这样的旅程。如果这还不够,您可以设置类似 logstash 的东西来收集来自所有组件的所有信息。

      【讨论】:

        猜你喜欢
        • 2022-10-17
        • 1970-01-01
        • 2012-01-18
        • 2011-02-18
        • 2011-05-20
        • 2011-09-25
        • 2019-06-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多