你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

无代码连接器框架的 RestApiPoller 数据连接器参考

可以使用本文作为数据连接器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-HeaderBearer apikey

"auth": { 
    "type": "APIKey",
    "ApiKey": "123123123",
}

此示例使用默认值,并在以下标头中生成结果: Authorizationtoken 123123123

"auth": { 
    "type": "APIKey",
    "ApiKey": "123123123",
    "ApiKeyName": ""
}

由于 ApiKeyName 显式设置为 "",因此结果为以下标头: Authorization123123123

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_codeclient_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"
}

遵循以下身份验证流:

  1. 使用 userNamepasswordIsCredentialsInHeaders 时,将凭据TokenEndpoint发送到 以获取 JWT 令牌,用于确定在请求中放置凭据的位置。

    • 如果 IsCredentialsInHeaders: true:使用 发送基本身份验证标头 username:password
    • 如果 IsCredentialsInHeaders: false:在正文中 POST 发送凭据。
  2. 使用 JwtTokenJsonPath 或 从响应标头中提取令牌。

  3. JWT 令牌的 Authorization 标头是一个常量,将始终为“Authorization”。

字段 必需 类型 说明
type True String 类型。 必须是 JwtToken
userName 如果未 userToken 使用) ,则为 True ( Object 凭据的 userName 键/值对。 如果在 userName 标头请求中发送和 password ,请使用 value 用户名指定 属性。 如果在 userName 正文请求中发送 和 password ,请指定 KeyValue
password 如果未 userToken 使用) ,则为 True ( Object 密码凭据的键/值对。 如果在 userName 标头请求中发送 和 password ,请使用 value 指定 属性 userName。 如果在 userName 正文请求中发送 和 password ,请指定 KeyValue
userToken 如果未 userName 使用) ,则为 True ( String 客户端生成的用户令牌,用于获取用于身份验证的系统令牌。
UserTokenPrepend False String 一个值,该值指示是否在标记前添加文本。 默认值:Bearer
NoAccessTokenPrepend False 布尔值 一个访问标志,指示令牌不应在前面添加任何内容。
TokenEndpointHttpMethod False String 令牌终结点的 HTTP 方法。 它可以是 GetPost。 默认值为 Post
TokenEndpoint True String 用于获取 JWT 令牌的 URL 终结点。
IsCredentialsInHeaders 布尔值 指示是否将凭据作为基本身份验证标头发送 () true 与正文 (false) ,在使用 userTokenPOST忽略。 默认值为 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 都使用当前日期和时间。 可能的值为常量: UnixTimestampUnixTimestampInMills或日期和时间的任何其他有效表示形式。 例如: yyyy-MM-ddMM/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 需要复杂参数时,请使用 queryParametersqueryParametersTemplate。 这些命令包括一些内置变量。

内置变量 用于 queryParameters 用于 queryParametersTemplate
_QueryWindowStartTime
_QueryWindowEndTime
_APIKeyName
_APIKey

StartTimeAttributeName 示例

请考虑此示例:

  • StartTimeAttributeName = from
  • EndTimeAttributeName = until
  • ApiEndpoint = https://www.example.com

发送到远程服务器的查询为: https://www.example.com?from={QueryTimeFormat}&until={QueryTimeFormat + QueryWindowInMin}

QueryTimeIntervalAttributeName 示例

请考虑此示例:

  • QueryTimeIntervalAttributeName = interval
  • QueryTimeIntervalPrepend = 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 确定格式是 jsoncsv还是 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 响应包括:

  • Link HTTP 响应标头。
  • 用于从响应正文检索链接的 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": ["$"]
      }
   }
}