事件跟踪

本文介绍如何在 Microsoft Dynamics 365 欺诈保护中使用事件跟踪。

借助 Microsoft Dynamics 365 欺诈保护中的事件跟踪功能,可以建立一个在门户外可扩展且可操作的实时遥测平台。 每个事件都由用户级或系统级操作计划或触发。 可以订阅感兴趣的事件,并将事件有效负载转发到Azure 事件中心或 Azure Blob 存储。 还可以同时从多个事件跟踪会话请求事件。 然后,系统按时间顺序传递事件。

可以聚合事件,并用于定义可用于监视和管理服务成本和使用情况的指标。 事件还可用于开发使用事务数据的自定义报告,或维护系统日志,以便在欺诈保护门户中执行的操作(例如,“用户 A 编辑的日期 C 列表 B)。 使用 Microsoft Power Automate 和Azure 逻辑应用中提供的Azure 事件中心连接器时,还可以使用发送到Azure 事件中心的数据发出警报或高度自定义的工作流。 同样,使用 Azure Blob 存储,可以创建一个新订阅,用于将所有历史数据复制到冷存储帐户,以便进一步分析。

如果欺诈保护实例有多个环境,则可以使用环境切换器查找每个环境的事件跟踪。 如果环境具有子环境,则为父环境订阅的事件跟踪会自动包括所有子环境相同的事件。

注意

事件跟踪客户必须订阅其他 Azure 服务,例如事件中心或 Blob 存储。 有关详细信息,请联系 Microsoft 帐户主管。 如果有 Azure 全局管理员凭据,请登录到Azure 门户以确定可用的订阅。

开始使用

若要开始使用事件跟踪功能,请执行以下步骤。

  1. 在欺诈保护门户中,选择“数据,然后选择“事件跟踪”。

  2. 选择“ 新建订阅”。

  3. 输入订阅显示名称。

  4. 选择存储位置:

    1. 对于事件中心:在 Azure 密钥库中输入事件中心实例的连接字符串。 Azure 密钥库应与欺诈保护订阅位于同一租户中。 向 Azure 密钥库授予对欺诈保护应用的机密访问权限。 在欺诈保护门户中输入 Azure 密钥库的机密标识符 URL。 有关详细信息,请参阅获取事件中心连接字符串
    2. 对于 Blob 存储:在 Azure 密钥库中输入Azure Blob 存储帐户的连接字符串。 Azure 密钥库应与欺诈保护订阅位于同一租户中。 向 Azure 密钥库授予对欺诈保护应用的机密访问权限。 在欺诈保护门户中,输入来自 Azure 密钥库的机密标识符 URL,以及事件跟踪数据所在的容器名称。 有关详细信息,请参阅 “查看帐户访问密钥”。
  5. 选择“测试连接”。 成功测试连接后,会显示从 Azure 密钥库中的连接字符串中提取的帐户相关信息。 对于Azure 事件中心,此只读信息包括事件中心命名空间事件中心名称。 对于Azure Blob 存储,将显示存储帐户名称。 验证此信息是否与要使用的存储帐户匹配。 如果没有成功的连接测试, 则不会启用“创建 ”按钮。

  6. 选择事件并查看 JSON 有效负载的说明和示例。 然后选择“创建保存订阅。 事件从该时间点立即发送到事件中心实例。 如果选择 Blob 存储,则开始写入所有历史数据的复制过程,并且所有事件每 30 分钟发布到容器。

  7. 返回到欺诈保护门户,查看事件/Hr.指标的计数,并确保数据发送到事件中心和 Blob 存储。 事件/小时故障/Hr 指标显示过去 24 小时内的平均值。

    提示

    有关事件中心的其他监视,请转到Azure 门户并设置指标。 有关详细信息,请参阅 Azure Monitor 中的Azure 事件中心指标。

  8. 可选:将自己的入口管道从事件中心设置为 Power BI。 有关如何开始开发自定义报表的信息,请参阅 “使用 Power BI”。

  9. 可选:从 Power Automate 连接事件中心以定义自定义工作流。 有关详细信息,请参阅 使用逻辑应用或 Power Automate

事件架构

事件跟踪中当前提供了五种受支持的事件分类:事务事件跟踪事件、评估事件审核事件监视事件

事务事件

使用事务事件创建自定义分数卡和自动化工作流,并使用评估和非评估 API 调用中提供的数据。 使用 Blob 存储,还可以从历史 API 调用复制数据,为企业创建数据仓库。 此事件的有效负载包括每个 API 调用的整个请求和响应。

命名空间:FraudProtection.Observe。<API 名称> 或 FraudProtection.Assessment。<API 名称>
{
    "uniqueId": "unique event id and used to deduplicate events",
    "request": {
        //API request payload
    },
    "response": {
        //API response payload
    },
    "name": "FraudProtection.Observe.AccountLabel",
    "version": "1.0",
    "metadata": {
        "tenantId": "63f55d63-9653-4ed9-be77-294da21202ae",
        "timestamp": "2020-09-25T03:46:53.3716978Z"
    }
}

跟踪事件

使用跟踪事件报告和监视包含 Trace() 返回类型的所有规则的性能。 此事件的有效负载包括标准化字段,例如触发事件的规则的名称、与该规则的评估类型相关的事件类型、相关 ID 等。然后,可以使用 Trace() 返回类型中的键:值对发送自定义属性,以包含示例有效负载中的变量、风险评分和自定义字段。 有关如何在规则中使用 Trace() 触发这些事件的详细信息,请参阅 规则语言指南中的观察函数

命名空间:FraudProtection.Trace.Rule。
{
    "name": "FraudProtection.Trace.Rule",
    "version": "1.0",
    "metadata":
{
    "tenantId": "63f55d63-9653-4ed9-be77-294da21202ae",
    "timestamp": "2020-06-10T23:43:33.4526859Z" 
}
    "ruleName": "Risk Score Policy",
    "eventType": "Purchase",
    "correlationId": "e49319e6-0bea-4567-9f3e-c9f873fc958a",
    "eventId": "e75e703c-1e54-4d41-af4b-a4c1b8866f02",
    "attributes":
{
      "example": "ManualReview” //key:value pairs defined in the Trace() return type
} 

    }

评估事件

评估和关联的标签和观察事件可以跟踪到事件中心和 Blob。

命名空间:FraudProtection.Assessments。
{
    "request": "",
    "response": "",
    "eventId": "uniqueId",
    "assessmentApiName": "<your assessment api name>",
    "assessmentName": "<your assessment name>"
}
命名空间:FraudProtection.CaseManagement.Events。

案例管理决策状态和案例管理发出的标签。

{
	"name": "FraudProtection.CaseManagement.Events",
	"version": "1.0",
	"metadata": {
		"tenantId": "<your tenantID>",
		"timestamp": "2020-09-25T03:46:53.3716978Z"
	},
	"assessmentId": "<your assessment uniqueId>",
	"assessmentName": "<your assessment name>",
	"caseId": "uniqueId of the case record",
	"queueId": "uniqueId of the queue the case was routed to",
	"queueName": "name of the queue the case was routed to",
	"eventType": "<your assessment uniqueId>",
	"eventId": "<your assessment transaction uniqueId>",
	"creationDate": "creation datetime",
	"reviewStartDate": "review start datetime",
	"reviewedDate": "reviewed datetime",
	"decision": "decision of the review agent",
	"reason": "decision reason",
	"reasonNote": "decision note",
	"agentId": "uniqueId of the review agent",
	"agentName": "name of the review agent",
	"status": "status of the decision",
	"fraudFlag": "fraud flag (label) of the decision"
}
命名空间:FraudProtection.Observations。
{
    "request": "",
    "primaryEventId": "<assessment event id>",
    "observationApiName": "<your observation api name>",
    "observationName": "<your observation name>",
    "observationEventId": "<your observation event id>",
    "assessmentApiName": "<your assessment api name>",
    "assessmentName": "<your assessment name>"
}
命名空间:FraudProtection.Labels。
{
    "request": "",
    "labelEventId": "",
    "assessmentApiName": "<your assessment api name>",
    "assessmentName": "<your assessment name>"
}

审核事件

使用审核事件跟踪门户操作并开发审核日志。 审核事件当前支持对规则、列表、速度和外部调用进行新的/编辑/删除操作。

命名空间:FraudProtection.Audit。
"audit": {
    "entityId": "cde1518f-305e-42e8-8d05-9b955efe3f46",
    "entityName": "Manual Review Rule",
    "entityType": "Rule",
    "operationName": "NewRule",
    "userId": "user@contoso.com"
},
"name": "FraudProtection.Audit",
"version": "1.0",
"metadata": {
    "tenantId": "63f55d63-9653-4ed9-be77-294da21202ae",
    "timestamp": "2020-06-10T23:43:33.4526859Z"
}

审核日志访问

可通过两种方式访问审核日志。 可以设置事件跟踪,也可以通过创建客户支持票证来请求发送自动生成的审核日志。 如果你决定不使用事件跟踪,而是提交支持票证,则支持票证将路由到欺诈保护工程团队。 团队提取日志,并将它们返回给你。 审核日志将捕获并存储在预配环境的同一地理位置中。 捕获日志后无法编辑日志,日志保留期为 365 天。 超过 365 天的日志会自动删除。

可以使用审核日志跟踪生成的五个事件。 这些事件包括:

  • 用户首次分配到欺诈保护角色。
  • 更新了现有用户的角色。
  • 将删除特定用户的所有角色分配。
  • 用户接受 FCRA 同意。
  • 用户更新事务接受提升器(TAB)设置。 对这些设置所做的任何更改都被视为更新。

活动日志事件

使用活动日志事件可获取欺诈保护中某些操作执行哪些操作、时间和位置的详细记录。 例如,可以看到谁对规则进行了最后一次更改。 结果与活动日志搜索结果匹配

命名空间:FraudProtection.ActivityLog。
{
"eventId": "0c6e1948-75a9-4513-bb4c-4828c9a8ab05",
"operationType": "Create",
"resourceType": "Decision rule",
"resourceId": "b1053216-2fc4-4ef6-94e8-c4da706d87fa",
"resourceName": "Rule Test",
"userId": "fb88ba00-58e0-421c-8742-10ae04dddb86"
}

“userID”后跟操作和特定的资源类型字段。

监视事件

可以使用监视事件对 API 和外部调用性能进行自定义报告和警报,以及欺诈保护门户中提供的报告。 以下每个事件都提供每个服务的延迟和错误见解。

命名空间:FraudProtection.Monitoring.RequestLatencyMsDistribution。

对于 API 调用,请求计数和延迟分布(以 ms 为单位)在此事件中每 20 秒发送一次。 这些事件包括 startTime 和 endTime 字段,用于确定聚合周期和维度名称和值,这些字段可用于根据需要筛选指标。


{
"Index": [
             1
],
"BucketSamples": [
             2
],
"NumberOfBuckets": 10000,
"BucketSize": 10,
"MinimumValue": 0,
"CounterName": "RequestLatencyMsDistribution",
"DimensionNames": [
   "EnvironmentId",
   "TenantId",
   "ApiName",
   "ExperienceType",
   "IsTestRequest",
   "RequestType",
   "HttpRequestStatus",
   "HttpStatusCode"
],
"DimensionValues": [
   "63f55d63-9653-4ed9-be77-294da21202ae",
   "63f55d63-9653-4ed9-be77-294da21202ae",
   "v1.0/Observe/Create",
   "N/A",
   "False",
   "REALTIME",
   "Success",
   "200"
],
"StartTime": "2020-06-22T23:43:20",
"EndTime": "2020-06-22T23:43:40",
"Samples": 2,
"Min": 3,
"Max": 7,
"name": "FraudProtection.Monitoring.RequestLatencyMsDistribution",
"version": "1.0",
"metadata": {
   "tenantId": "63f55d63-9653-4ed9-be77-294da21202ae",
   "timestamp": "2020-06-22T23:43:20.0947542Z"
}
}

“示例字段表示每个 API 的请求计数。

命名空间:FraudProtection.Monitoring.ExternalCalls

此事件包括从规则触发的外部调用文档>的每个外部调用<链接的延迟(以 ms 为单位)和 HTTP 状态代码。 还提供了触发调用的规则和子句的其他维度。

对于外部调用,延迟(以 ms 为单位)和 http 状态代码指标会随此事件中的每个请求一起发送。 如果有兴趣调查单个呼叫的性能,还提供了触发呼叫的规则的其他维度,以提高故障排除体验。


{
    "name": "FraudProtection.Monitoring.ExternalCalls",
    "version": "1.0",
    "metadata": {
        "tenantId": "63f55d63-9653-4ed9-be77-294da21202ae",
        "timestamp": "2020-06-10T23:43:33.4526859Z"
    },
    "externalCallName": "SampleExternalCall",
    "requestStatus": "Success",
    "httpStatusCode": 200,
    "correlationId": "50BFA0D6-1E3D-4700-A2B3-1DD01162C08A",
    "latencyMs": 123,
    "assessment": "PURCHASE",
    "rule": "SampleRule",
    "clause": "SampleClause"
}

命名空间:FraudProtection.Errors.ExternalCalls

此事件日志记录每个失败的外部调用的错误,并且对于调试可能与外部调用性能相关的任何问题都很有用。 记录调用的完整请求和响应,以及触发调用的规则和子句的延迟和子句。


{
    "name": "FraudProtection.Errors.ExternalCalls",
    "version": "1.0",
    "metadata": {
        "tenantId": "63f55d63-9653-4ed9-be77-294da21202ae",
        "timestamp": "2020-06-10T23:43:33.4526859Z"
    },
    "externalCallName": "SampleExternalCall",
    "requestStatus": "ResponseFailure",
    "httpStatusCode": 404,
    "correlationId": "50BFA0D6-1E3D-4700-A2B3-1DD01162C08A",
    "latencyMs": 123,
    "assessment": "PURCHASE",
    "rule": "SampleRule",
    "clause": "SampleClause",
    "response": "{}",
    "requestUri": "https://samplewebsite/sample",
    "requestBody": "{}"
}