6

我有一个 NodeJS 应用程序,我在其中使用applicationinsightsNodeJS 包(this)。根据此处描述的 ApplicationInsights 数据模型,它表示该属性存在,但我无法找到关于如何在我发送的遥测事件中设置此属性的代码。

任何描述如何执行此操作的片段都会有所帮助!

4

2 回答 2

9

根据您的描述,我只找到了有关在 ITelemetryInitializerAuthenticated users for JavaScript 中设置用户上下文的 ASP.NET 教程。

然后我查看了Microsoft Application Insights SDK for JavaScript的User.ts下的setAuthenticatedUserContext方法,在TelemetryContext.ts下找到相关代码片段如下:

if (typeof userContext.authenticatedId === "string") {
      envelope.tags[tagKeys.userAuthUserId] = userContext.authenticatedId;
}

然后查看ContextTagKeys.ts,发现上下文标签如下:

this.sessionId = "ai.session.id";
this.userAccountId = "ai.user.accountId";
this.userId = "ai.user.id";
this.userAuthUserId = "ai.user.authUserId";
...

但我无法找到关于如何在我发送的遥测事件中设置此属性的代码。

对于 NodeJS SDK,上下文标签键位于ContextTagKeys.ts下。根据您的要求,您可以利用以下代码片段:

appInsights.defaultClient.context.tags[appInsights.defaultClient.context.keys.userAuthUserId] ="xxxx";

对于Session idAccount id或其他上下文字段,您只需要选择相关的上下文标签键即可。

于 2018-06-13T07:20:38.733 回答
3

以防万一有人仍然在为每个请求向遥测事件添加用户信息而苦苦挣扎,这就是我所做的:

const appInsights = require("applicationinsights");

appInsights.setup().start()
appInsights.defaultClient.addTelemetryProcessor(
  (envelope, context) => {
    // context keys from the `ContextTagKeys` contract
    const contextKeys = {
      userId: "userId",
      sessionId: "sessionId",
    }
    const getContextKey = (key) => {
      return appInsights.defaultClient.context.keys[key]
    }
    const setContextKey = (key, value) => {
      envelope.tags[key] = value;
    }

    // custom context that I set on per-request basis
    const requestContext = appInsights.getCorrelationContext().requestContext
    const data = envelope.data.baseData;

    for (const [key, value] of Object.entries(requestContext)) {
      switch (key) {
        case "userId":
          setContextKey(
            getContextKey("userId"),  // ai.user.id
            value                     // bob@example.com
          )
          break
        case "sessionId":
          setContextKey(
            getContextKey("userId"),  // ai.session.id
            value                     // 507f191e810c19729de860ea
          )
          break
        default:
          // if it's a custom property that doesn't belong in the
          // `ContextTagKeys` contract, such as browser information, add
          // it as a custom property on the `envelope.data.baseData` object
          data.properties[key] = value
      }
    }

    return true
  }
)

然后,由于我使用的是Express,我创建了一个中间件函数,用于在上下文对象上设置每个请求的信息:

const express = require('express')
const Bowser = require("bowser");

const app = express();

// ...

app.use((req, res, next) => {
  const session = req.session;
  const userAgent = req.get('User-Agent')

  const sessionId = session.id
  const userId = session.userId
  const browser = Bowser.getParser(userAgent) 

  const currentRequestContext = 
    appInsights.getCorrelationContext().requestContext || {}

  const nextRequestContext = {
    ...currentRequestContext,
    sessionId,      // 507f191e810c19729de860ea 
    userId,         // bob@example.com
    browser:        // custom property, e.g. Firefox 83
      browser.getBrowserName() + " " + browser.getBrowserVersion()
  }

  appInsights.getCorrelationContext().requestContext = nextRequestContext

  next()
})

要获取所有可用ContextTagKeys合同的列表,请查看此处:

  • ContextTagKeys.ts
  • ContextTagKeys.ts(客户端库)
    • 似乎ContextTagKeys客户端库中的其中一些也可以在服务器端库中设置,这就是我在填充浏览器信息client_Browser后让属性显示在 Azure 门户中的方式ai.device.browserVersion

这是文档中有关如何创建自己的自定义遥测处理器的示例:

以下是 GitHub 上帮助我找到正确解决方案的问题:

最后,这applicationinsights是我正在使用的版本:

  • applicationinsights v1.8.8
于 2020-12-11T13:32:27.770 回答