你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
可以使用本文作为数据连接器Microsoft Sentinel REST API 文档的补充,使用无代码连接器框架 (CCF) 创建RestApiPoller数据连接器。
每个数据连接器表示Microsoft Sentinel数据连接器的特定连接。 一个数据连接器可能有多个连接,这些连接从不同的终结点提取数据。 可以使用本文生成的 JSON 配置完成 CCF 数据连接器的部署模板。
有关详细信息,请参阅为Microsoft Sentinel创建无代码连接器。
创建或更新数据连接器
通过引用 REST API 文档中的 或 操作,查找最新的稳定或update预览版 API 版本。create和 操作之间的区别create在于,update需要 etag 值。update
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 参数。
| 名称 | 说明 |
|---|---|
dataConnectorId |
数据连接器 ID。 它必须是与请求正文中的 参数相同的name唯一名称。 |
resourceGroupName |
资源组的名称,不区分大小写。 |
subscriptionId |
目标订阅的 ID。 |
workspaceName |
工作区 的名称 ,而不是 ID。 正则表达式模式为 ^[A-Za-z0-9][A-Za-z0-9-]+[A-Za-z0-9]$。 |
api-version |
要用于此操作的 API 版本。 |
请求正文
CCF 数据连接器的请求正文 RestApiPoller 具有以下结构:
{
"name": "{{dataConnectorId}}",
"kind": "RestApiPoller",
"etag": "",
"properties": {
"connectorDefinitionName": "",
"auth": {},
"request": {},
"response": {},
"paging": "",
"dcrConfig": ""
}
}
RestApiPoller
RestApiPoller 是一个 API 轮询器 CCF 数据连接器,可用于自定义数据源的分页、授权和请求/响应有效负载。
| Name | 必需 | 类型 | 说明 |
|---|---|---|---|
name |
True | String | 与 URI 参数匹配的连接的唯一名称。 |
kind |
True | String | 值 kind 。 此字段必须设置为 RestApiPoller。 |
etag |
GUID | 值 etag 。 此字段必须留空才能创建新连接器。 对于更新操作, etag 必须与现有连接器 etag (GUID) 匹配。 |
|
properties.connectorDefinitionName |
String | 定义数据连接器的 UI 配置的资源的名称 DataConnectorDefinition 。 有关详细信息,请转到 数据连接器定义。 |
|
properties.auth |
True | 嵌套 JSON | 用于轮询数据的身份验证属性。 有关详细信息,请转到 身份验证配置。 |
properties.request |
True | 嵌套 JSON | 用于轮询数据的请求有效负载,例如 API 终结点。 有关详细信息,请转到 请求配置。 |
properties. response |
True | 嵌套 JSON | API 轮询数据时返回的响应对象和嵌套消息。 有关详细信息,请转到 响应配置。 |
properties.paging |
嵌套 JSON | 轮询数据时的分页有效负载。 有关详细信息,请转到 分页配置。 | |
properties.dcrConfig |
嵌套 JSON | 将数据发送到数据收集规则时所需的参数 (DCR) 。 有关详细信息,请转到 DCR 配置。 |
身份验证配置
CCF 支持以下身份验证类型:
注意
CCF OAuth2 实现不支持客户端证书凭据。
最佳做法是使用身份验证部分中的参数,而不是硬编码凭据。 有关详细信息,请参阅 保护机密输入。
若要创建部署模板(该模板也使用参数),需要使用额外的起始 [对本节中的参数进行转义。 此步骤允许参数基于用户与连接器的交互分配值。 有关详细信息,请参阅 模板表达式转义字符。
若要启用从 UI 输入凭据,部分 connectorUIConfig 要求在 中 instructions输入所需的参数。 有关详细信息,请参阅 无代码连接器框架的数据连接器定义参考。
基本身份验证
| 字段 | 必需 | 类型 |
|---|---|---|
UserName |
True | String |
Password |
True | String |
下面是使用 中 connectorUIconfig定义的参数的基本身份验证示例:
"auth": {
"type": "Basic",
"UserName": "[[parameters('username')]",
"Password": "[[parameters('password')]"
}
API 密钥
| 字段 | 必需 | 类型 | 说明 | 默认值 |
|---|---|---|---|---|
ApiKey |
True | String | 用户密钥。 | |
ApiKeyName |
String | 包含值的 URI 标头的名称 ApiKey 。 |
Authorization |
|
ApiKeyIdentifier |
String | 要在标记前面追加的字符串值。 | 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 |
正确。 | String | 客户端 ID。 |
ClientSecret |
正确。 | String | 客户端密码。 |
AuthorizationCode |
如果值为 ,则grantTypeauthorization_code为 True。 |
String | 如果授权类型为 authorization_code,则此字段值是身份验证服务器返回的授权代码。 |
Scope |
对于授予类型,为 authorization_code True。client_credentials授权类型的可选。 |
String | 以空格分隔的用户同意范围列表。 有关详细信息,请参阅 OAuth2 范围和权限。 |
RedirectUri |
如果值为 ,则grantTypeauthorization_code为 True。 |
String | 重定向的 URL 必须为 https://portal.azure.com/TokenAuthorize/ExtensionName/Microsoft_Azure_Security_Insights。 |
GrantType |
正确。 | String | 授权类型。 可以是 authorization_code 或 client_credentials。 |
TokenEndpoint |
正确。 | String | 用于在授权中使用有效令牌交换代码的 authorization_code URL,或者在授权中使用 client_credentials 有效令牌交换客户端 ID 和机密。 |
TokenEndpointHeaders |
Object | 用于将自定义标头发送到令牌服务器的可选键/值对象。 | |
TokenEndpointQueryParameters |
Object | 用于将自定义查询参数发送到令牌服务器的可选键/值对象。 | |
AuthorizationEndpoint |
正确。 | String | 用户同意 authorization_code 流的 URL。 |
AuthorizationEndpointHeaders |
Object | 用于将自定义标头发送到身份验证服务器的可选键/值对象。 | |
AuthorizationEndpointQueryParameters |
Object | 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"
}
遵循以下身份验证流:
使用
userName和passwordIsCredentialsInHeaders时,将凭据TokenEndpoint发送到 以获取 JWT 令牌,用于确定在请求中放置凭据的位置。- 如果
IsCredentialsInHeaders: true:使用 发送基本身份验证标头username:password。 - 如果
IsCredentialsInHeaders: false:在正文中POST发送凭据。
- 如果
使用
JwtTokenJsonPath或 从响应标头中提取令牌。JWT 令牌的 Authorization 标头是一个常量,将始终为“Authorization”。
| 字段 | 必需 | 类型 | 说明 |
|---|---|---|---|
type |
True | String | 类型。 必须是 JwtToken |
userName |
如果未 userToken 使用) ,则为 True ( |
Object | 凭据的 userName 键/值对。 如果在 userName 标头请求中发送和 password ,请使用 value 用户名指定 属性。 如果在 userName 正文请求中发送 和 password ,请指定 Key 和 Value。 |
password |
如果未 userToken 使用) ,则为 True ( |
Object | 密码凭据的键/值对。 如果在 userName 标头请求中发送 和 password ,请使用 value 指定 属性 userName。 如果在 userName 正文请求中发送 和 password ,请指定 Key 和 Value。 |
userToken |
如果未 userName 使用) ,则为 True ( |
String | 客户端生成的用户令牌,用于获取用于身份验证的系统令牌。 |
UserTokenPrepend |
False | String | 一个值,该值指示是否在标记前添加文本。 默认值:Bearer。 |
NoAccessTokenPrepend |
False | 布尔值 | 一个访问标志,指示令牌不应在前面添加任何内容。 |
TokenEndpointHttpMethod |
False | String | 令牌终结点的 HTTP 方法。 它可以是 Get 或 Post。 默认值为 Post。 |
TokenEndpoint |
True | String | 用于获取 JWT 令牌的 URL 终结点。 |
IsCredentialsInHeaders |
布尔值 | 指示是否将凭据作为基本身份验证标头发送 () true 与正文 (false) ,在使用 userToken时POST忽略。 默认值为 false。 |
|
IsJsonRequest |
布尔值 | 一个值,该值指示是将请求发送到 JSON (标头 Content-Type = application/json) 还是表单编码的 (标头 Content-Type = application/x-www-form-urlencoded) 。 默认值为 false。 |
|
JwtTokenJsonPath |
String | 该值指示 JSONPath 用于从响应中提取令牌的值。 例如:$.access_token。 |
|
JwtTokenInResponseHeader |
布尔值 | 一个值,该值指示是从响应标头中提取令牌还是从正文中提取令牌。 默认值为 false。 |
|
JwtTokenHeaderName. |
String | 当令牌位于响应标头中时,指示标头名称的值。 默认值为 Authorization。 |
|
JwtTokenIdentifier |
String | 用于从带前缀的令牌字符串中提取 JWT 的标识符。 | |
QueryParameters |
Object | 在将请求发送到令牌终结点时要包括的自定义查询参数。 | |
Headers |
Object | 向令牌终结点发送请求时要包括的自定义标头。 | |
RequestTimeoutInSeconds |
整数 | 请求超时(以秒为单位)。 默认值 100为 ,最大值 180为 。 |
注意
限制
- 需要用户名和密码身份验证以获取令牌
- 不支持基于 API 密钥的令牌请求
- 不支持没有用户名和密码的自定义标头身份验证 ()
请求配置
请求部分定义 CCF 数据连接器如何将请求发送到数据源 (例如 API 终结点,以及轮询该终结点) 的频率。
| 字段 | 必需 | 类型 | 说明 |
|---|---|---|---|
ApiEndpoint |
正确。 | String | 此字段确定远程服务器的 URL,并定义从中拉取数据的终结点。 |
RateLimitQPS |
整数 | 此字段定义初始请求在一秒内允许的调用数或查询数。 它不适用于分页请求。 若要限制分页,还要设置 PaginatedCallsPerSecond。 |
|
PaginatedCallsPerSecond |
双 (0...1000) | 此字段定义每秒允许对 RESTful API 的分页请求的调用数。 它在每个分页 API 调用之间引入毫秒延迟 (1000 / paginatedCallsPerSecond) 。 此限制仅适用于分页请求,独立于 RateLimitQPS控制初始请求速率的 。 通常,将设置与 相同的值 RateLimitQPS ,以在所有请求中遵循数据源的速率限制。
0 value 表示不应用分页限制。 |
|
RateLimitConfig |
Object | 此字段定义 RESTful API 的速率限制配置。 有关详细信息,请转到 RateLimitConfig 示例。 |
|
QueryWindowInMin |
整数 | 此字段定义可用查询窗口(以分钟为单位)。 最小值为 1 分钟。 默认值为 5 分钟。 | |
HttpMethod |
String | 此字段定义 API 方法: GET (默认) 或 POST。 |
|
QueryTimeFormat |
String | 此字段定义终结点 (远程服务器) 预期的日期和时间格式。 无论在何处使用此变量,CCF 都使用当前日期和时间。 可能的值为常量: UnixTimestamp、 UnixTimestampInMills或日期和时间的任何其他有效表示形式。 例如: yyyy-MM-dd、 MM/dd/yyyy HH:mm:ss。默认值为 ISO 8601 UTC。 |
|
RetryCount |
整数 (1...6) | 此字段定义允许 对 重试的值16从故障中恢复。 默认值为 3。 |
|
TimeoutInSeconds |
整数 (1...180) | 此字段定义请求超时(以秒为单位)。 默认值为 20。 |
|
IsPostPayloadJson |
布尔值 | 此字段确定有效负载是否 POST 为 JSON 格式。 默认值为 false。 |
|
Headers |
Object | 此字段包括定义请求标头的键/值对。 | |
QueryParameters |
Object | 此字段包括定义请求查询参数的键/值对。 | |
StartTimeAttributeName |
设置值时为 EndTimeAttributeName True。 |
String | 此字段定义查询开始时间的查询参数名称。 有关详细信息,请转到 StartTimeAttributeName 示例。 |
EndTimeAttributeName |
设置 时 StartTimeAttributeName 为 True。 |
String | 此字段定义查询结束时间的查询参数名称。 |
QueryTimeIntervalAttributeName |
String | 如果终结点需要专用格式来查询某个时间范围内的数据,则使用此字段。 将此属性与 和 QueryTimeIntervalDelimiter 参数一起使用QueryTimeIntervalPrepend。 有关详细信息,请转到 QueryTimeIntervalAttributeName 示例。 |
|
QueryTimeIntervalPrepend |
设置 时 QueryTimeIntervalAttributeName 为 True。 |
String | 引用 QueryTimeIntervalAttributeName。 |
QueryTimeIntervalDelimiter |
设置 时 QueryTimeIntervalAttributeName 为 True。 |
String | 引用 QueryTimeIntervalAttributeName。 |
QueryParametersTemplate |
String | 此字段引用在高级方案中传递参数时使用的查询模板。 例如: "queryParametersTemplate": "{'cid': 1234567, 'cmd': 'reporting', 'format': 'siem', 'data': { 'from': '{_QueryWindowStartTime}', 'to': '{_QueryWindowEndTime}'}, '{_APIKeyName}': '{_APIKey}'}"。 |
|
InitialCheckpointTimeUtc |
日期时间 (UTC) | 指定不存在存储检查点时首次轮询的查询开始时间。 在第一次成功轮询后保留检查点后,此值将被忽略。 仅当连接器的请求配置定义了开始时间查询参数 (例如 startTimeAttributeName 或 {_QueryWindowStartTime} 替换令牌) 没有相应的结束时间参数时,此设置才会生效。 它不会影响仅依赖于分页游标或令牌的连接器。 格式:ISO 8601 UTC 日期/时间 (, 2024-01-15T00:00:00Z 例如,) 。 |
当 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图形 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}"
}
}
对于数据源需要两个查询参数的情况,还有另一个选项 (一个查询参数用于开始时间,另一个用于结束时间) 。
示例:
"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",
}
此选项将请求发送到 GEThttps://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 |
True | 字符串列表 | 在响应 JSON 中定义消息的路径。 JSON 路径表达式指定 JSON 结构中元素或元素集的路径。 |
SuccessStatusJsonPath |
String | 在响应 JSON 中定义成功消息的路径。 定义此参数时, SuccessStatusValue 还应定义 参数。 |
|
SuccessStatusValue |
String | 在响应 JSON 中定义成功消息值的路径。 | |
IsGzipCompressed |
布尔值 | 确定是否在 GZIP 文件中压缩响应。 | |
format |
True | String | 确定格式是 json、 csv还是 xml。 |
CompressionAlgo |
String | 定义压缩算法 或 multi-gzipdeflate。 对于 GZIP 压缩算法,请将 配置为 IsGzipCompressedTrue ,而不是为此参数设置值。 |
|
CsvDelimiter |
String | 如果响应格式为 CSV,并且你想要更改 的默认 CSV 分隔符, ","则引用。 |
|
HasCsvBoundary |
布尔值 | 指示 CSV 数据是否具有边界。 | |
HasCsvHeader |
布尔值 | 指示 CSV 数据是否具有标头。 默认值为 True。 |
|
CsvEscape |
String | 定义字段边界的转义字符。 默认值为 "例如,具有标头 id,name,avg 的 CSV 和包含类似 1,"my name",5.5 空格的数据行需要 " 字段边界。 |
|
ConvertChildPropertiesToArray |
布尔值 | 引用一种特殊情况,其中远程服务器返回对象,而不是每个属性包含数据的事件列表。 |
注意
CSV 格式类型由 RFC4180 规范分析。
响应配置示例
应采用 JSON 格式的服务器响应。 响应的 属性值中包含请求的数据。 仅当值为 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-type 分页具有与 LinkHeader相同的属性,只是链接标头保留在后端存储中。 此选项启用跨查询窗口的分页链接。
例如,某些 API 不支持查询开始时间或结束时间。 相反,它们支持服务器端 游标。 可以使用持久页类型来记住服务器端 游标。 有关详细信息,请参阅 什么是游标?。
注意
对于连接器,只能运行一个查询, PersistentLinkHeader 以避免服务器端 游标出现争用情况。 此问题可能会影响延迟。
| 字段 | 必需 | 类型 | 说明 |
|---|---|---|---|
LinkHeaderTokenJsonPath |
False | String | 使用此属性指示在响应正文中获取值的位置。 例如,如果数据源返回以下 JSON: { nextPage: "foo", value: [{data}]},则 LinkHeaderTokenJsonPath 值为 $.nextPage。 |
PageSize |
False | 整数 | 使用此属性可以确定每页的事件数。 |
PageSizeParameterName |
False | String | 使用此查询参数名称来指示页面大小。 |
PagingInfoPlacement |
False | String | 使用此属性可确定如何填充分页信息。
QueryString接受 或 RequestBody。 |
PagingQueryParamOnly |
False | 布尔值 | 使用此属性指定查询参数。 如果设置为 true,则省略除分页查询参数以外的所有其他查询参数。 |
下面是一些示例:
"paging": {
"pagingType": "LinkHeader",
"linkHeaderTokenJsonPath" : "$.metadata.links.next"
}
"paging": {
"pagingType" : "PersistentLinkHeader",
"pageSizeParameterName" : "limit",
"pageSize" : 500
}
配置 NextPageUrl
NextPageUrl-type 分页表示 API 响应在响应正文 LinkHeader中包含类似于 的复杂链接,但 URL 包含在响应正文中,而不是标头中。
| 字段 | 必需 | 类型 | 说明 |
|---|---|---|---|
PageSize |
False | 整数 | 每页的事件数。 |
PageSizeParameterName |
False | String | 页面大小的查询参数名称。 |
NextPageUrl |
False | String | 仅在连接器用于 Coralogix API 时使用的字段。 |
NextPageUrlQueryParameters |
False | Object | 向下一页的每个请求添加自定义查询参数的键/值对。 |
NextPageParaName |
False | String | 请求中的下一页名称。 |
HasNextFlagJsonPath |
False | String | 标志属性的路径 HasNextPage 。 |
NextPageRequestHeader |
False | String | 请求中的下一页标题名称。 |
NextPageUrlQueryParametersTemplate |
False | String | 仅在连接器用于 Coralogix API 时使用的字段。 |
PagingInfoPlacement |
False | String | 确定如何填充分页信息的字段。
QueryString接受 或 RequestBody。 |
PagingQueryParamOnly |
False | 布尔值 | 确定查询参数的字段。 如果设置为 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-type 分页使用标记 (表示当前页状态的哈希或游标) 。 该令牌包含在 API 响应中,客户端将其追加到下一个请求以提取下一页。 当服务器需要维护请求之间的确切状态时,通常使用此方法。
PersistentToken 分页使用保留服务器端的令牌。 服务器会记住客户端检索到的最后一个令牌,并在后续请求中提供下一个令牌。 客户端在中断的位置继续,即使稍后发出新请求也是如此。
| 字段 | 必需 | 类型 | 说明 |
|---|---|---|---|
PageSize |
False | 整数 | 每页的事件数。 |
PageSizeParameterName |
False | String | 页面大小的查询参数名称。 |
NextPageTokenJsonPath |
False | String | 响应正文中下一页令牌的 JSON 路径。 |
NextPageTokenResponseHeader |
False | String | 指定如果 NextPageTokenJsonPath 为空,则在此标头名称中为下一页使用令牌的字段。 |
NextPageParaName |
False | String | 确定请求中的下一页名称的字段。 |
HasNextFlagJsonPath |
False | String | 在确定响应中是否还剩下更多页时定义标志属性路径 HasNextPage 的字段。 |
NextPageRequestHeader |
False | String | 确定请求中的下一页标题名称的字段。 |
PagingInfoPlacement |
False | String | 确定如何填充分页信息的字段。
QueryString接受 或 RequestBody。 |
PagingQueryParamOnly |
False | 布尔值 | 确定查询参数的字段。 如果设置为 true,则省略除分页查询参数以外的所有其他查询参数。 |
示例:
"paging": {
"pagingType" : "NextPageToken",
"nextPageRequestHeader" : "ETag",
"nextPageTokenResponseHeader" : "ETag"
}
"paging": {
"pagingType" : "PersistentToken",
"nextPageParaName" : "gta",
"nextPageTokenJsonPath" : "$.alerts[-1:]._id"
}
配置 Offset
Offset-type 分页指定要跳过的页数,以及请求中每页要检索的事件数的限制。 客户端从数据集中提取特定范围的项。
| 字段 | 必需 | 类型 | 说明 |
|---|---|---|---|
PageSize |
False | 整数 | 每页的事件数。 |
PageSizeParameterName |
False | String | 页面大小的查询参数名称。 |
OffsetParaName |
False | String | 下一个请求查询参数名称。 CCF 计算每个请求的偏移值, (所有引入的事件 + 1) 。 |
PagingInfoPlacement |
False | String | 确定如何填充分页信息的字段。
QueryString接受 或 RequestBody。 |
PagingQueryParamOnly |
False | 布尔值 | 确定查询参数的字段。 如果设置为 true,则省略除分页查询参数以外的所有其他查询参数。 |
示例:
"paging": {
"pagingType": "Offset",
"offsetParaName": "offset",
"pageSize": 50,
"pagingQueryParamOnly": true,
"pagingInfoPlacement": "QueryString"
}
配置 CountBasedPaging
CountBasedPaging-type 分页允许客户端指定要在响应中返回的项数。 此功能对于支持基于计数参数作为响应有效负载一部分的分页的 API 非常有用。
| 字段 | 必需 | 类型 | 说明 |
|---|---|---|---|
pageNumberParaName |
True | String | HTTP 请求中页码的参数名称。 |
PageSize |
False | 整数 | 每页的事件数。 |
ZeroBasedIndexing |
False | 布尔值 | 指示计数从零开始的标志。 |
HasNextFlagJsonPath |
False | String | HTTP 响应有效负载中标志的 JSON 路径,指示存在更多页。 |
TotalResultsJsonPath |
False | String | HTTP 响应有效负载中结果总数的 JSON 路径。 |
PageNumberJsonPath |
False | String | HTTP 响应有效负载中页码的 JSON 路径。 如果 totalResultsJsonPath 提供 ,则为 必需。 |
PageCountJsonPath |
False | String | HTTP 响应有效负载中页计数的 JSON 路径。 如果 totalResultsJsonPath 提供 ,则为 必需。 |
PagingInfoPlacement |
False | String | 确定如何填充分页信息的字段。
QueryString接受 或 RequestBody。 |
PagingQueryParamOnly |
False | 布尔值 | 确定查询参数的字段。 如果设置为 true,则省略除分页查询参数以外的所有其他查询参数。 |
示例:
"paging": {
"pagingType" : "CountBasedPaging",
"pageNumberParaName" : "page",
"pageSize" : 10,
"zeroBasedIndexing" : true,
"hasNextFlagJsonPath" : "$.hasNext",
"totalResultsJsonPath" : "$.totalResults",
"pageNumberJsonPath" : "$.pageNumber",
"pageCountJsonPath" : "$.pageCount"
}
DCR 配置
| 字段 | 必需 | 类型 | 说明 |
|---|---|---|---|
DataCollectionEndpoint |
True | String | 数据收集终结点 (DCE) 。 例如:https://example.ingest.monitor.azure.com。 |
DataCollectionRuleImmutableId |
True | String | DCR 不可变 ID。 通过查看 DCR 创建响应或使用 DCR API 找到它。 |
StreamName |
True | String | 此值是在 streamDeclaration DCR 中定义的 。 前缀必须以 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": ["$"]
}
}
}