你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
若要使用无代码连接器框架(CCF)创建 RestApiPoller 数据连接器,请使用此参考作为数据 连接器文档Microsoft Sentinel REST API 的 补充。
每个 dataConnector 都表示 Microsoft Sentinel 数据连接器的一个特定连接。 一个数据连接器可能有多个连接,这些连接从不同的终结点提取数据。 使用此参考文档生成的 JSON 配置用于完成 CCF 数据连接器的部署模板。
有关详细信息,请参阅为 Microsoft Sentinel 创建无代码连接器。
数据连接器 - 创建或更新
请参考 REST API 文档中的创建或更新操作来查找最新的 API 稳定版或预览版。 “创建”和“更新”操作之间的区别在于更新需要 etag 值。
PUT 方法
https://management.azure.com/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.OperationalInsights/workspaces/{{workspaceName}}/providers/Microsoft.SecurityInsights/dataConnectors/{{dataConnectorId}}?api-version={{apiVersion}}
URI 参数
有关最新 API 版本的详细信息,请参阅 数据连接器 - 创建或更新 URI 参数。
请求正文
CCF 数据连接器的请求正文 RestApiPoller 具有以下结构:
{
"name": "{{dataConnectorId}}",
"kind": "RestApiPoller",
"etag": "",
"properties": {
"connectorDefinitionName": "",
"auth": {},
"request": {},
"response": {},
"paging": "",
"dcrConfig": ""
}
}
RestApiPoller
RestApiPoller 表示 API Poller CCF 数据连接器,可在其中自定义数据源的分页、授权和请求/响应有效负载。
| 名称 | 必需 | 类型 | 描述 |
|---|---|---|---|
| 名字 | 真 实 | 字符串 | 与 URI 参数匹配的连接的唯一名称 |
| kind | 真 实 | 字符串 | 必须是 RestApiPoller |
| etag | GUID | 为创建新连接器留空。 对于更新操作,etag 必须与现有连接器的 etag (GUID) 匹配。 | |
| properties.connectorDefinitionName | 字符串 | 定义数据连接器 UI 配置的 DataConnectorDefinition 资源的名称。 有关详细信息,请参阅数据连接器定义。 | |
| properties.auth | 真 实 | 嵌套的 JSON | 描述用于轮询数据的身份验证属性。 有关详细信息,请参阅身份验证配置。 |
| properties.request | 真 实 | 嵌套的 JSON | 描述用于轮询数据的请求有效负载,例如 API 终结点。 有关详细信息,请参阅请求配置。 |
| properties.response | 真 实 | 嵌套的 JSON | 描述在轮询数据时从 API 返回的响应对象和嵌套消息。 有关详细信息,请参阅响应配置。 |
| properties.paging | 嵌套的 JSON | 描述轮询数据时的分页有效负载。 有关详细信息,请参阅分页配置。 | |
| properties.dcrConfig | 嵌套的 JSON | 将数据发送到数据收集规则 (DCR) 时所需的参数。 有关详细信息,请参阅 DCR 配置。 |
身份验证配置
CCF 支持以下身份验证类型:
注意
CCF OAuth2 实现不支持客户端证书凭据。
最佳做法是在身份验证部分中使用参数,而不是硬编码凭据。 有关详细信息,请参阅安全机密输入。
若要创建同时使用参数的部署模板,需要通过额外的起始 [ 对本节中的参数进行转义。 这样,参数可以根据用户与连接器的交互来分配值。 有关详细信息,请参阅模板表达式转义字符。
若要允许从 UI 输入凭据,connectorUIConfig 部分需要具有所需参数的 instructions。 有关详细信息,请参阅 无代码连接器框架的数据连接器定义参考。
基本身份验证
| 字段 | 必需 | 类型 |
|---|---|---|
| UserName | 真 实 | 字符串 |
| 密码 | 真 实 | 字符串 |
使用 connectorUIconfig 中定义的参数进行基本身份验证的示例:
"auth": {
"type": "Basic",
"UserName": "[[parameters('username')]",
"Password": "[[parameters('password')]"
}
APIKey
| 字段 | 必需 | 类型 | 描述 | 默认值 |
|---|---|---|---|---|
| ApiKey | 真 实 | 字符串 | 用户密钥 | |
| ApiKeyName | 字符串 | 包含 ApiKey 值的 Uri 标头的名称 | Authorization |
|
| ApiKeyIdentifier | 字符串 | 在令牌前添加的字符串值 | token |
|
| IsApiKeyInPostPayload | 布尔 | 在 POST 正文(而不是标头)中发送机密 | false |
APIKey 身份验证示例:
"auth": {
"type": "APIKey",
"ApiKey": "[[parameters('apikey')]",
"ApiKeyName": "X-MyApp-Auth-Header",
"ApiKeyIdentifier": "Bearer"
}
此示例生成根据以下标头中发送的用户输入定义的机密:X-MyApp-Auth-Header: Bearer apikey
"auth": {
"type": "APIKey",
"ApiKey": "123123123",
}
此示例使用以下标头中的默认值和结果:Authorization: token 123123123
"auth": {
"type": "APIKey",
"ApiKey": "123123123",
"ApiKeyName": ""
}
由于 ApiKeyName 显式设置为 "",因此结果是以下标头:Authorization: 123123123
OAuth2
无代码连接器框架支持 OAuth 2.0 授权代码授予和客户端凭据。 机密客户端和公共客户端使用授权代码授权类型将授权代码兑换为访问令牌。 用户通过重定向 URL 返回到客户端后,应用程序将从 URL 中获取授权代码,并使用它来请求访问令牌。
| 字段 | 必需 | 类型 | 描述 |
|---|---|---|---|
| ClientId | 真 实 | 字符串 | 客户端 ID |
| ClientSecret | 真 实 | 字符串 | 客户端密码 |
| AuthorizationCode | 当 grantType = authorization_code 时为 True |
字符串 | 如果授权类型为 authorization_code,此字段值将是从身份验证服务返回的授权代码。 |
| 范围 | 对于 authorization_code 授权类型,True对于 client_credentials 授权类型,可选 |
字符串 | 用户同意的范围的空格分隔列表。 有关详细信息,请参阅 OAuth2 范围和权限。 |
| RedirectUri | 当 grantType = authorization_code 时为 True |
字符串 | 重定向的 URL 必须为 https://portal.azure.com/TokenAuthorize/ExtensionName/Microsoft_Azure_Security_Insights |
| GrantType | 真 实 | 字符串 |
authorization_code 或 client_credentials |
| TokenEndpoint | 真 实 | 字符串 | 用于与 authorization_code 授权中的有效令牌交换代码或与 client_credentials 授权中的有效令牌交换客户端 ID 和机密的 URL。 |
| TokenEndpointHeaders | 物体 | 用于将自定义标头发送到令牌服务器的可选键值对象 | |
| TokenEndpointQueryParameters | 物体 | 用于将自定义查询参数发送到令牌服务器的可选键值对象 | |
| AuthorizationEndpoint | 真 实 | 字符串 |
authorization_code 流的用户同意 URL |
| AuthorizationEndpointHeaders | 物体 | 用于将自定义标头发送到身份验证服务器的可选键值对象 | |
| AuthorizationEndpointQueryParameters | 物体 | OAuth2 授权代码流请求中使用的可选键值对 |
身份验证代码流用于代表用户的权限提取数据,而客户端凭据用于使用应用程序权限提取数据。 数据服务器授予对应用程序的访问权限。 由于客户端凭据流中没有用户,因此不需要授权终结点,只需令牌终结点。
示例:OAuth2 authorization_code 授予类型
"auth": {
"type": "OAuth2",
"ClientId": "[[parameters('appId')]",
"ClientSecret": "[[parameters('appSecret')]",
"tokenEndpoint": "https://login.microsoftonline.com/{{tenantId}}/oauth2/v2.0/token",
"authorizationEndpoint": "https://login.microsoftonline.com/{{tenantId}}/oauth2/v2.0/authorize",
"authorizationEndpointHeaders": {},
"authorizationEndpointQueryParameters": {
"prompt": "consent"
},
"redirectUri": "https://portal.azure.com/TokenAuthorize/ExtensionName/Microsoft_Azure_Security_Insights",
"tokenEndpointHeaders": {
"Accept": "application/json",
"Content-Type": "application/x-www-form-urlencoded"
},
"TokenEndpointQueryParameters": {},
"scope": "openid offline_access some_scope",
"grantType": "authorization_code"
}
示例:OAuth2 client_credentials 授予类型
"auth": {
"type": "OAuth2",
"ClientId": "[[parameters('appId')]",
"ClientSecret": "[[parameters('appSecret')]",
"tokenEndpoint": "https://login.microsoftonline.com/{{tenantId}}/oauth2/v2.0/token",
"tokenEndpointHeaders": {
"Accept": "application/json",
"Content-Type": "application/x-www-form-urlencoded"
},
"TokenEndpointQueryParameters": {},
"scope": "openid offline_access some_scope",
"grantType": "client_credentials"
}
JWT
JSON Web 令牌 (JWT) 身份验证支持通过用户名/密码凭据获取令牌,并将其用于 API 请求。
基本示例:
"auth": {
"type": "JwtToken",
"userName": {
"key": "username",
"value": "[[parameters('UserName')]"
},
"password": {
"key": "password",
"value": "[[parameters('Password')]"
},
"TokenEndpoint": "https://token_endpoint.contoso.com",
"IsJsonRequest": true,
"JwtTokenJsonPath": "$.access_token"
}
POST 正文中的凭据(默认值):
"auth": {
"type": "JwtToken",
"userName": {
"key": "username",
"value": "[[parameters('UserName')]"
},
"password": {
"key": "password",
"value": "[[parameters('Password')]"
},
"TokenEndpoint": "https://api.example.com/token",
"Headers": {
"Accept": "application/json",
"Content-Type": "application/json"
},
"IsCredentialsInHeaders": false,
"IsJsonRequest": true,
"JwtTokenJsonPath": "$.access_token"
}
标头中的凭据(基本身份验证):
"auth": {
"type": "JwtToken",
"userName": {
"key": "client_id",
"value": "[[parameters('ClientId')]"
},
"password": {
"key": "client_secret",
"value": "[[parameters('ClientSecret')]"
},
"TokenEndpoint": "https://api.example.com/oauth/token",
"Headers": {
"Accept": "application/json"
},
"IsCredentialsInHeaders": true,
"IsJsonRequest": true,
"JwtTokenJsonPath": "$.access_token",
"RequestTimeoutInSeconds": 30
}
标头中的凭据(用户令牌):
"auth": {
"type": "JwtToken",
"UserToken": "[[parameters('userToken')]",
"UserTokenPrepend": "Bearer",
"TokenEndpoint": "https://api.example.com/oauth/token",
"Headers": {
"Accept": "application/json"
},
"TokenEndpointHttpMethod": "GET",
"NoAccessTokenPrepend": true,
"JwtTokenJsonPath": "$.systemToken"
}
身份验证流:
发送凭据以获取
TokenEndpointJWT 令牌- 如果
IsCredentialsInHeaders: true:使用 username:password 发送基本身份验证标头 - 如果
IsCredentialsInHeaders: false:在 POST 正文中发送凭据
- 如果
使用
JwtTokenJsonPath或从响应标头中提取令牌在后续 API 请求中使用令牌和
ApiKeyName标头
性能:
| 字段 | 必需 | 类型 | 描述 |
|---|---|---|---|
| 类型 | 真 实 | 字符串 | 必须是 JwtToken |
| userName | True (如果未使用 userToken ) | 物体 | 用户名凭据的键值对。 如果在 userName 标头请求中发送并 password 发送,请使用 value 用户名指定属性。 如果在 userName 正文请求中发送, password 请指定 Key 和 Value |
| password | True (如果未使用 userToken ) | 物体 | 密码凭据的键值对。 如果在 userName 标头请求中发送并 password 发送,请使用 value 用户名指定属性。 如果在 userName 正文请求中发送, password 请指定 Key 和 Value |
| userToken | True (如果未使用 userName ) | 字符串 | 客户端生成的用于获取系统令牌进行身份验证的用户令牌 |
| UserTokenPrepend | 假 | 字符串 | 标记前追加文本。 示例: Bearer |
| NoAccessTokenPrepend | 假 | 布尔 | 用于指示令牌的访问标志不应追加任何内容 |
| TokenEndpointHttpMethod | 假 | 字符串 | 用于令牌终结点的 HTTP 方法。 可以是 Get 或 Post。 默认值:Post |
| TokenEndpoint | 真 实 | 字符串 | 用于获取 JWT 令牌的 URL 终结点 |
| IsCredentialsInHeaders | 布尔 | 将凭据作为基本身份验证标头 (true) 与 POST 正文 (false) 发送。 默认值:false |
|
| IsJsonRequest | 布尔 | 将请求作为 JSON(标头 Content-Type = application/json)与表单编码(标头 Content-Type = application/x-www-form-urlencoded)发送。 默认值:false |
|
| JwtTokenJsonPath | 字符串 | 用于从响应中提取令牌的 JSONPath(例如“$.access_token”) |
|
| JwtTokenInResponseHeader | 布尔 | 从响应标头与正文中提取令牌。 默认值:false |
|
| JwtTokenHeaderName | 字符串 | 令牌位于响应标头中时的标头名称。 默认值:“Authorization” |
|
| JwtTokenIdentifier | 字符串 | 用于从前缀令牌字符串中提取 JWT 的标识符 | |
| QueryParameters | 物体 | 将请求发送到令牌终结点时要包括的自定义查询参数 | |
| 标头 | 物体 | 将请求发送到令牌终结点时要包括的自定义标头 | |
| RequestTimeoutInSeconds | 整数 | 请求超时(以秒为单位)。 默认值: 100、最大值 180 |
身份验证流:
发送凭据以获取
TokenEndpointJWT 令牌- 如果
IsCredentialsInHeaders: true:使用 username:password 发送基本身份验证标头 - 如果
IsCredentialsInHeaders: false:在 POST 正文中发送凭据
- 如果
使用
JwtTokenJsonPath或从响应标头中提取令牌在后续 API 请求中使用令牌和
ApiKeyName标头
注意
Limitations:
- 需要用户名/密码身份验证进行令牌获取
- 不支持基于 API 密钥的令牌请求
- 不支持自定义标头身份验证(没有用户名/密码)
请求配置
请求部分定义 CCF 数据连接器如何将请求发送到数据源,例如 API 终结点以及轮询该终结点的频率。
| 字段 | 必需 | 类型 | 描述 |
|---|---|---|---|
| ApiEndpoint | 真 实 | 字符串 | 远程服务器的 URL。 定义要从中拉取数据的终结点。 |
| RateLimitQPS | 整数 | 定义一秒钟内允许的调用或查询次数。 | |
| RateLimitConfig | 物体 | 定义了RESTful API的速率限制配置。 请查看示例。 | |
| QueryWindowInMin | 整数 | 定义可用的查询时段(以分钟为单位)。 最小值为 1 分钟。 默认值为 5 分钟。 | |
| HttpMethod | 字符串 | 定义 API 方法:GET(默认)或 POST |
|
| QueryTimeFormat | 字符串 | 定义终结点(远程服务器)预期的日期和时间格式。 无论在何处使用此变量,CCF 都使用当前日期和时间。 可能的值为常量:UnixTimestamp、UnixTimestampInMills 或日期时间的任何其他有效表示形式,例如:yyyy-MM-dd、MM/dd/yyyy HH:mm:ss默认为 ISO 8601 UTC |
|
| RetryCount | 整数 (1...6) | 定义允许从故障中恢复的重试次数为 1 到 6 次。 默认为 3。 |
|
| TimeoutInSeconds | 整数 (1...180) | 定义请求超时,以秒为单位。 默认为 20 |
|
| IsPostPayloadJson | 布尔 | 确定 POST 有效负载是否采用 JSON 格式。 默认为 false |
|
| 标头 | 物体 | 定义请求头的键值对。 | |
| QueryParameters | 物体 | 定义请求查询参数的键值对。 | |
| StartTimeAttributeName | 设置 EndTimeAttributeName 时为 True |
字符串 | 定义查询开始时间的查询参数名称。 请查看示例。 |
| EndTimeAttributeName | 设置 StartTimeAttributeName 时为 True |
字符串 | 定义查询结束时间的查询参数名称。 |
| QueryTimeIntervalAttributeName | 字符串 | 如果终结点需要一种专用格式来查询期限内的数据,则将此属性与 QueryTimeIntervalPrepend 和 QueryTimeIntervalDelimiter 参数配合使用。 请查看示例。 |
|
| QueryTimeIntervalPrepend | 设置 QueryTimeIntervalAttributeName 时为 True |
字符串 | 请参见QueryTimeIntervalAttributeName |
| QueryTimeIntervalDelimiter | 设置 QueryTimeIntervalAttributeName 时为 True |
字符串 | 请参见QueryTimeIntervalAttributeName |
| QueryParametersTemplate | 字符串 | 在高级方案中传递参数时使用的查询模板。 br>例如: "queryParametersTemplate": "{'cid': 1234567, 'cmd': 'reporting', 'format': 'siem', 'data': { 'from': '{_QueryWindowStartTime}', 'to': '{_QueryWindowEndTime}'}, '{_APIKeyName}': '{_APIKey}'}" |
当 API 需要复杂参数时,请使用 queryParameters 或 queryParametersTemplate,其中包括某些内置变量。
| 内置变量 | 用于 queryParameters |
用于 queryParametersTemplate |
|---|---|---|
_QueryWindowStartTime |
是 | 是 |
_QueryWindowEndTime |
是 | 是 |
_APIKeyName |
否 | 是 |
_APIKey |
否 | 是 |
StartTimeAttributeName 示例
请看以下示例:
StartTimeAttributeName=fromEndTimeAttributeName=untilApiEndpoint=https://www.example.com
发送到远程服务器的查询为:https://www.example.com?from={QueryTimeFormat}&until={QueryTimeFormat + QueryWindowInMin}
QueryTimeIntervalAttributeName 示例
请看以下示例:
QueryTimeIntervalAttributeName=intervalQueryTimeIntervalPrepend=time:QueryTimeIntervalDelimiter=..ApiEndpoint=https://www.example.com
发送到远程服务器的查询为:https://www.example.com?interval=time:{QueryTimeFormat}..{QueryTimeFormat + QueryWindowInMin}
RateLimitConfig 示例
请看以下示例:
ApiEndpoint=https://www.example.com
"rateLimitConfig": {
"evaluation": {
"checkMode": "OnlyWhen429"
},
"extraction": {
"source": "CustomHeaders",
"headers": {
"limit": {
"name": "X-RateLimit-Limit",
"format": "Integer"
},
"remaining": {
"name": "X-RateLimit-Remaining",
"format": "Integer"
},
"reset": {
"name": "X-RateLimit-RetryAfter",
"format": "UnixTimeSeconds"
}
}
},
"retryStrategy": {
"useResetOrRetryAfterHeaders": true
}
}
当响应包含速率限制头部时,连接器可以利用这些信息调整请求速率。
使用 Microsoft Graph 作为数据源 API 的请求示例
此示例使用筛选器查询参数查询消息。 有关详细信息,请参阅 Microsoft Graph API 查询参数。
"request": {
"apiEndpoint": "https://graph.microsoft.com/v1.0/me/messages",
"httpMethod": "Get",
"queryTimeFormat": "yyyy-MM-ddTHH:mm:ssZ",
"queryWindowInMin": 10,
"retryCount": 3,
"rateLimitQPS": 20,
"headers": {
"Accept": "application/json",
"User-Agent": "Example-app-agent"
},
"QueryTimeIntervalAttributeName": "filter",
"QueryTimeIntervalPrepend": "receivedDateTime gt ",
"QueryTimeIntervalDelimiter": " and receivedDateTime lt "
}
上一个示例向 GET 发送 https://graph.microsoft.com/v1.0/me/messages?filter=receivedDateTime gt {time of request} and receivedDateTime lt 2019-09-01T17:00:00.0000000 请求。 每个 queryWindowInMin 时间都会更新时间戳。
此示例获得了相同的结果:
"request": {
"apiEndpoint": "https://graph.microsoft.com/v1.0/me/messages",
"httpMethod": "Get",
"queryTimeFormat": "yyyy-MM-ddTHH:mm:ssZ",
"queryWindowInMin": 10,
"retryCount": 3,
"rateLimitQPS": 20,
"headers": {
"Accept": "application/json",
},
"queryParameters": {
"filter": "receivedDateTime gt {_QueryWindowStartTime} and receivedDateTime lt {_QueryWindowEndTime}"
}
}
另一个选项是数据源需要 2 个查询参数,一个用于开始时间,另一个用于结束时间。
示例:
"request": {
"apiEndpoint": "https://graph.microsoft.com/v1.0/me/calendarView",
"httpMethod": "Get",
"queryTimeFormat": "yyyy-MM-ddTHH:mm:ssZ",
"queryWindowInMin": 10,
"retryCount": 3,
"rateLimitQPS": 20,
"headers": {
"Accept": "application/json",
},
"StartTimeAttributeName": "startDateTime",
"EndTimeAttributeName": "endDateTime",
}
这会向 GET 发送 https://graph.microsoft.com/me/calendarView?startDateTime=2019-09-01T09:00:00.0000000&endDateTime=2019-09-01T17:00:00.0000000 请求
对于复杂查询,请使用 QueryParametersTemplate。 下一个示例使用正文中的参数发送 POST 请求。
示例:
"request": {
"apiEndpoint": "https://graph.microsoft.com/v1.0/me/messages",
"httpMethod": "POST",
"queryTimeFormat": "yyyy-MM-ddTHH:mm:ssZ",
"queryWindowInMin": 10,
"retryCount": 3,
"rateLimitQPS": 20,
"headers": {
"Accept": "application/json",
},
"isPostPayloadJson": true,
"queryParametersTemplate": "{\"query":"TableName | where createdTimestamp between (datetime({_QueryWindowStartTime}) .. datetime({_QueryWindowEndTime}))\"}"
}
响应配置
使用以下参数定义数据连接器的响应处理:
| 字段 | 必需 | 类型 | 描述 |
|---|---|---|---|
| EventsJsonPaths | 真 实 | 字符串列表 | 定义响应 JSON 中消息的路径。 JSON 路径表达式以 JSON 结构指定一个或一组元素的路径 |
| SuccessStatusJsonPath | 字符串 | 定义响应 JSON 中成功消息的路径。 定义此参数时,还应定义 SuccessStatusValue 参数。 |
|
| SuccessStatusValue | 字符串 | 定义响应 JSON 中成功消息值的路径 | |
| IsGzipCompressed | 布尔 | 确定响应是否压缩为 gzip 文件 | |
| format | 真 实 | 字符串 |
json 或 csv 或 xml |
| CompressionAlgo | 字符串 | 压缩算法 multi-gzip 或 deflate。 对于 gzip 压缩算法,只需将 IsGzipCompressed 配置为 True,不为此参数设置值。 |
|
| CsvDelimiter | 字符串 | 如果响应格式为 CSV,并且需要更改默认 CSV 分隔符 "," |
|
| HasCsvBoundary | 布尔 | 指示 CSV 数据是否具有边界 | |
| HasCsvHeader | 布尔 | 指示 CSV 数据是否具有标头,默认为 True |
|
| CsvEscape | 字符串 | 字段边界的转义字符,默认为 "例如,带有标头 id,name,avg 和一行包含空格(如 1,"my name",5.5)的数据的 CSV 需要 " 字段边界。 |
|
| ConvertChildPropertiesToArray | 布尔 | 特殊情况,远程服务器返回一个对象而不是事件列表,其中每个属性都包含数据。 |
注意
CSV 格式类型由 RFC4180 规范进行分析。
响应配置示例
需要 JSON 格式的服务器响应,并在属性 value 中包含请求的数据。 响应属性 status 指示仅在值为 时才引入数据。success
"response": {
"EventsJsonPaths ": ["$.value"],
"format": "json",
"SuccessStatusJsonPath": "$.status",
"SuccessStatusValue": "success",
"IsGzipCompressed": true
}
本示例中的预期响应为没有标头的 CSV 做准备。
"response": {
"EventsJsonPaths ": ["$"],
"format": "csv",
"HasCsvHeader": false
}
分页配置
当数据源无法同时发送整个响应有效负载时,CCF 数据连接器需要知道如何在响应 页中接收部分数据。 分页类型从以下类型中选择:
| 分页类型 | 决策因子 |
|---|---|
| API 响应是否具有指向下一页和上一页的链接? | |
| API 响应是否具有下一页和上一页的令牌或游标? | |
| API 响应是否支持分页时要跳过的对象数的参数? | |
| API 响应是否支持要返回的对象数的参数? |
配置 LinkHeader 或 PersistentLinkHeader
最常用的分页类型是服务器数据源 API 为数据的下一页和上一页提供 URL。 有关“链接标头”规范的详细信息,请参阅 RFC 5988。
LinkHeader 分页意味着 API 响应包括以下任一项:
-
LinkHTTP 响应头 - 用于从响应正文中检索链接的 JSON 路径。
PersistentLinkHeader 分页的属性与 LinkHeader 相同,但链接标头保留在后端存储中。 此选项支持跨查询窗口的分页链接。 例如,某些 API 不支持查询开始时间或结束时间。 而是支持服务器端游标。 永久性页类型可用于记住服务器端游标。 有关详细信息,请参阅什么是游标?。
注意
只能为具有 PersistentLinkHeader 的连接器运行一个查询,以避免服务器端游标上的争用条件。 这可能会影响延迟。
| 字段 | 必需 | 类型 | 描述 |
|---|---|---|---|
| LinkHeaderTokenJsonPath | 假 | 字符串 | 使用此属性指示在响应正文中获取值的位置。 例如,如果数据源返回以下 JSON: { nextPage: "foo", value: [{data}]},则 LinkHeaderTokenJsonPath 将为 $.nextPage |
| PageSize | 假 | 整数 | 每页的事件数 |
| PageSizeParameterName | 假 | 字符串 | 页面大小的查询参数名称 |
| 分页信息置入 | 假 | 字符串 | 分页信息是如何填充的。 接受“QueryString”或“RequestBody” |
| PagingQueryParamOnly | 假 | 布尔 | 如果设置为 true,则会省略除分页查询参数外的所有其他查询参数。 |
以下是一些示例:
"paging": {
"pagingType": "LinkHeader",
"linkHeaderTokenJsonPath" : "$.metadata.links.next"
}
"paging": {
"pagingType" : "PersistentLinkHeader",
"pageSizeParameterName" : "limit",
"pageSize" : 500
}
配置 NextPageUrl
NextPageUrl 分页意味着 API 响应在响应正文中包含一个与 LinkHeader 类似的复杂链接,但 URL 包含在响应正文而不是标头中。
| 字段 | 必需 | 类型 | 描述 |
|---|---|---|---|
| PageSize | 假 | 整数 | 每页的事件数 |
| PageSizeParameterName | 假 | 字符串 | 页面大小的查询参数名称 |
| NextPageUrl | 假 | 字符串 | 仅当连接器用于 Coralogix API 时 |
| NextPageUrlQueryParameters | 假 | 对象键值对 - 向下一页的每个请求中添加自定义查询参数 | |
| NextPageParaName | 假 | 字符串 | 确定请求中的下一页名称。 |
| HasNextFlagJsonPath | 假 | 字符串 | 定义 HasNextPage 标志属性的路径 |
| NextPageRequestHeader | 假 | 字符串 | 确定请求中的下一页标头名称。 |
| NextPageUrlQueryParametersTemplate | 假 | 字符串 | 仅当连接器用于 Coralogix API 时 |
| 分页信息置入 | 假 | 字符串 | 分页信息是如何填充的。 接受“QueryString”或“RequestBody” |
| PagingQueryParamOnly | 假 | 布尔 | 如果设置为 true,则会省略除分页查询参数外的所有其他查询参数。 |
示例:
"paging": {
"pagingType" : "NextPageUrl",
"nextPageTokenJsonPath" : "$.data.repository.pageInfo.endCursor",
"hasNextFlagJsonPath" : "$.data.repository.pageInfo.hasNextPage",
"nextPageUrl" : "https://api.github.com/graphql",
"nextPageUrlQueryParametersTemplate" : "{'query':'query{repository(owner:\"xyz\")}"
}
配置 NextPageToken 或 PersistentToken
NextPageToken 分页使用表示当前页状态的令牌(哈希或游标)。 令牌包含在 API 响应中,客户端将其添加到下一个请求后以提取下一页。 当服务器需要在请求之间保持准确的状态时,通常会使用此方法。
PersistentToken 分页使用保留在服务器端的令牌。 服务器会记住客户端检索的最后一个令牌,并在后续请求中提供下一个令牌。 即使客户端稍后发出新请求,也会从上次中断的地方继续。
| 字段 | 必需 | 类型 | 描述 |
|---|---|---|---|
| PageSize | 假 | 整数 | 每页的事件数 |
| PageSizeParameterName | 假 | 字符串 | 页面大小的查询参数名称 |
| NextPageTokenJsonPath | 假 | 字符串 | 响应正文中下一页令牌的 JSON 路径。 |
| NextPageTokenResponseHeader | 假 | 字符串 | 如果 NextPageTokenJsonPath 为空,则在下一页的标头名称中使用令牌。 |
| NextPageParaName | 假 | 字符串 | 确定请求中的下一页名称。 |
| HasNextFlagJsonPath | 假 | 字符串 | 在确定响应中是否还有更多页面时,定义 HasNextPage 标志属性的路径。 |
| NextPageRequestHeader | 假 | 字符串 | 确定请求中的下一页标头名称。 |
| 分页信息置入 | 假 | 字符串 | 分页信息是如何填充的。 接受“QueryString”或“RequestBody” |
| PagingQueryParamOnly | 假 | 布尔 | 如果设置为 true,则会省略除分页查询参数外的所有其他查询参数。 |
示例:
"paging": {
"pagingType" : "NextPageToken",
"nextPageRequestHeader" : "ETag",
"nextPageTokenResponseHeader" : "ETag"
}
"paging": {
"pagingType" : "PersistentToken",
"nextPageParaName" : "gta",
"nextPageTokenJsonPath" : "$.alerts[-1:]._id"
}
配置偏移
Offset 分页指定要跳过的页数,以及请求中每页检索的事件数的限制。 客户端从数据集中提取特定范围的项目。
| 字段 | 必需 | 类型 | 描述 |
|---|---|---|---|
| PageSize | 假 | 整数 | 每页的事件数 |
| PageSizeParameterName | 假 | 字符串 | 页面大小的查询参数名称 |
| OffsetParaName | 假 | 字符串 | 下一个请求查询参数名称。 CCF 计算每个请求的偏移值(所有引入的事件 + 1) |
| 分页信息置入 | 假 | 字符串 | 分页信息是如何填充的。 接受“QueryString”或“RequestBody” |
| PagingQueryParamOnly | 假 | 布尔 | 如果设置为 true,则会省略除分页查询参数外的所有其他查询参数。 |
示例:
"paging": {
"pagingType": "Offset",
"offsetParaName": "offset",
"pageSize": 50,
"pagingQueryParamOnly": true,
"pagingInfoPlacement": "QueryString"
}
配置 CountBasedPaging
CountBasedPaging 允许客户端指定要在响应中返回的项数。 这对于支持基于计数参数作为响应有效负载一部分的分页的 API 非常有用。
| 字段 | 必需 | 类型 | 描述 |
|---|---|---|---|
| pageNumberParaName | 真 实 | 字符串 | HTTP 请求中的页码的参数名称 |
| PageSize | 假 | 整数 | 每页的事件数 |
| ZeroBasedIndexing | 假 | 布尔 | 用于指示计数是否基于零的标志 |
| HasNextFlagJsonPath | 假 | 字符串 | HTTP 响应有效负载中标志的 JSON 路径,以指示有更多的页面 |
| TotalResultsJsonPath | 假 | 字符串 | HTTP 响应有效负载中结果总数的 JSON 路径 |
| PageNumberJsonPath | 假 | 字符串 | 如果提供了 totalResultsJsonPath,则为必需。 HTTP 响应有效负载中页码的 JSON 路径 |
| PageCountJsonPath | 假 | 字符串 | 如果提供了 totalResultsJsonPath,则为必需。 HTTP 响应有效负载中页计数的 JSON 路径 |
| 分页信息置入 | 假 | 字符串 | 分页信息是如何填充的。 接受“QueryString”或“RequestBody” |
| PagingQueryParamOnly | 假 | 布尔 | 如果设置为 true,则会省略除分页查询参数外的所有其他查询参数。 |
示例:
"paging": {
"pagingType" : "CountBasedPaging",
"pageNumberParaName" : "page",
"pageSize" : 10,
"zeroBasedIndexing" : true,
"hasNextFlagJsonPath" : "$.hasNext",
"totalResultsJsonPath" : "$.totalResults",
"pageNumberJsonPath" : "$.pageNumber",
"pageCountJsonPath" : "$.pageCount"
}
DCR 配置
| 字段 | 必需 | 类型 | 描述 |
|---|---|---|---|
| DataCollectionEndpoint | 真 实 | 字符串 | DCE(数据收集终结点),例如:https://example.ingest.monitor.azure.com。 |
| DataCollectionRuleImmutableId | 真 实 | 字符串 | DCR 不可变 ID。 通过查看 DCR 创建响应或使用 DCR API 查找 |
| StreamName | 真 实 | 字符串 | 此值是在 DCR 中定义的 streamDeclaration(前缀必须以 Custom- 开头) |
CCF 数据连接器示例
下面是 CCF 数据连接器 JSON 的所有组件的示例。
{
"kind": "RestApiPoller",
"properties": {
"connectorDefinitionName": "ConnectorDefinitionExample",
"dcrConfig": {
"streamName": "Custom-ExampleConnectorInput",
"dataCollectionEndpoint": "https://example-dce-sbsr.location.ingest.monitor.azure.com",
"dataCollectionRuleImmutableId": "dcr-32_character_hexadecimal_id"
},
"dataType": "ExampleLogs",
"auth": {
"type": "Basic",
"password": "[[parameters('username')]",
"userName": "[[parameters('password')]"
},
"request": {
"apiEndpoint": "https://rest.contoso.com/example",
"rateLimitQPS": 10,
"rateLimitConfig": {
"evaluation": {
"checkMode": "OnlyWhen429"
},
"extraction": {
"source": "CustomHeaders",
"headers": {
"limit": {
"name": "X-RateLimit-Limit",
"format": "Integer"
},
"remaining": {
"name": "X-RateLimit-Remaining",
"format": "Integer"
},
"reset": {
"name": "X-RateLimit-RetryAfter",
"format": "UnixTimeSeconds"
}
}
},
"retryStrategy": {
"useResetOrRetryAfterHeaders": true
}
},
"queryWindowInMin": 5,
"httpMethod": "POST",
"queryTimeFormat": "UnixTimestamp",
"startTimeAttributeName": "t0",
"endTimeAttributeName": "t1",
"retryCount": 3,
"timeoutInSeconds": 60,
"headers": {
"Accept": "application/json",
"User-Agent": "Example-app-agent"
}
},
"paging": {
"pagingType": "LinkHeader",
"pagingInfoPlacement": "RequestBody",
"pagingQueryParamOnly": true
},
"response": {
"eventsJsonPaths": ["$"]
}
}
}