我有一个 NodeJS 应用程序,我在其中使用applicationinsights
NodeJS 包(this)。根据此处描述的 ApplicationInsights 数据模型,它表示该属性存在,但我无法找到关于如何在我发送的遥测事件中设置此属性的代码。
任何描述如何执行此操作的片段都会有所帮助!
根据您的描述,我只找到了有关在 ITelemetryInitializer和Authenticated 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 id、Account id或其他上下文字段,您只需要选择相关的上下文标签键即可。
以防万一有人仍然在为每个请求向遥测事件添加用户信息而苦苦挣扎,这就是我所做的:
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
客户端库中的其中一些也可以在服务器端库中设置,这就是我在填充浏览器信息client_Browser
后让属性显示在 Azure 门户中的方式ai.device.browserVersion
这是文档中有关如何创建自己的自定义遥测处理器的示例:
以下是 GitHub 上帮助我找到正确解决方案的问题:
最后,这applicationinsights
是我正在使用的版本:
applicationinsights v1.8.8