Compartilhar via


Referência do conector de dados RestApiPoller para o Codeless Connector Framework

Para criar um RestApiPoller conector de dados com o CCF (Codeless Connector Framework), use essa referência como um suplemento para os documentos da API REST do Microsoft Sentinel para Conectores de Dados .

Cada dataConnector um representa uma conexão específica de um conector de dados do Microsoft Sentinel. Um conector de dados pode ter várias conexões, que buscam dados de diferentes pontos de extremidade. A configuração JSON criada usando este documento de referência é usada para concluir o modelo de implantação do conector de dados CCF.

Para obter mais informações, confira Criar um conector sem código para o Microsoft Sentinel.

Conectores de dados - Criar ou atualizar

Consulte a operação Criar ou Atualizar nos documentos da API REST para encontrar a versão mais recente da API estável ou de visualização. A diferença entre a operação de criação e atualização é que a atualização requer o valor etag.

Método PUT

https://management.azure.com/subscriptions/{{subscriptionId}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.OperationalInsights/workspaces/{{workspaceName}}/providers/Microsoft.SecurityInsights/dataConnectors/{{dataConnectorId}}?api-version={{apiVersion}}

Parâmetros do URI

Para obter mais informações sobre a versão mais recente da API, consulte Conectores de dados – Criar ou atualizar parâmetros de URI.

Nome Descrição
dataConnectorId A ID do conector de dados deve ser um nome exclusivo e é o mesmo que o name parâmetro no corpo da solicitação.
resourceGroupName O nome do grupo de recursos, sem distinção entre maiúsculas e minúsculas.
subscriptionId A ID da assinatura de destino.
workspaceName O nome do workspace, não a ID.
Padrão Regex: ^[A-Za-z0-9][A-Za-z0-9-]+[A-Za-z0-9]$
api-version A versão da API a ser usada para esta operação.

Corpo da solicitação

O corpo da solicitação de um RestApiPoller conector de dados CCF tem a seguinte estrutura:

{
   "name": "{{dataConnectorId}}",
   "kind": "RestApiPoller",
   "etag": "",
   "properties": {
        "connectorDefinitionName": "",
        "auth": {},
        "request": {},
        "response": {},
        "paging": "",
        "dcrConfig": ""
   }
}

RestApiPoller

RestApiPoller representa um conector de dados CCF do Poller da API em que você personaliza conteúdos de paginação, autorização e solicitação/resposta para sua fonte de dados.

Nome Obrigatória Tipo Descrição
nome Verdade cadeia O nome exclusivo da conexão correspondente ao parâmetro URI
amável Verdade cadeia Precisa ser RestApiPoller
etag GUID Deixe vazio para a criação de novos conectores. Para operações de atualização, a etag deve corresponder à etag (GUID) do conector existente.
properties.connectorDefinitionName cadeia O nome do recurso DataConnectorDefinition que define a configuração da interface do usuário do conector de dados. Para obter mais informações, consulte Definição do conector de dados.
Propriedades.Auth Verdade JSON aninhado Descreve as propriedades de autenticação para sondar os dados. Para obter mais informações, consulte configuração de autenticação.
Propriedades.pedir Verdade JSON aninhado Descreve o conteúdo da solicitação para sondar os dados, como o ponto de extremidade da API. Para mais informações, confira configuração de request.
Propriedades.resposta Verdade JSON aninhado Descreve o objeto de resposta e a mensagem aninhada retornada da API ao sondar os dados. Para mais informações, confira configuração de response.
Propriedades.Paginação JSON aninhado Descreve o conteúdo de paginação ao sondar os dados. Para obter mais informações, confira configuração de paging.
Propriedades.dcrConfig JSON aninhado Parâmetros necessários quando os dados são enviados para uma Regra de Coleta de Dados (DCR). Para obter mais informações, consulte Configuração do DCR.

Configuração de autenticação

O CCF dá suporte aos seguintes tipos de autenticação:

Observação

A implementação do CCF OAuth2 não dá suporte a credenciais de certificado do cliente.

Como prática recomendada, use parâmetros na seção auth em vez de credenciais codificadas. Para obter mais informações, consulte Proteger a entrada confidencial.

Para criar o modelo de implantação que também usa parâmetros, você precisa escapar dos parâmetros nesta seção com um .[ Isso permite que os parâmetros atribuam um valor com base na interação do usuário com o conector. Para obter mais informações, consulte Caracteres de escape de expressões de modelo.

Para permitir que as credenciais sejam inseridas na interface do usuário, a connectorUIConfig seção requer instructions os parâmetros desejados. Para obter mais informações, consulte a referência de definições do conector de dados para o Codeless Connector Framework.

Autenticação básica

Campo Obrigatória Tipo
UserName Verdade cadeia
Senha Verdade cadeia

Exemplo Autenticação básica usando parâmetros definidos em connectorUIconfig:

"auth": {
    "type": "Basic",
    "UserName": "[[parameters('username')]",
    "Password": "[[parameters('password')]"
}

APIKey

Campo Obrigatória Tipo Descrição Valor padrão
Chave de Api Verdade cadeia Chave secreta do usuário
Nome da Chave Api cadeia nome do cabeçalho Uri que contém o valor ApiKey Authorization
Identificador de ApiKey cadeia string para preceder o token token
IsApiKeyInPostPayload booleano enviar segredo no corpo do POST em vez do cabeçalho false

Exemplos de autenticação APIKey:

"auth": {
    "type": "APIKey",
    "ApiKey": "[[parameters('apikey')]",
    "ApiKeyName": "X-MyApp-Auth-Header",
    "ApiKeyIdentifier": "Bearer"
}

Este exemplo resulta no segredo definido da entrada do usuário enviada no seguinte cabeçalho: X-MyApp-Auth-Header: Portador apikey

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

Este exemplo usa os valores padrão e resulta no seguinte cabeçalho: Authorization: token 123123123

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

Como o ApiKeyName é explicitamente definido como "", o resultado é o seguinte cabeçalho: Autorização: 123123123

OAuth2

O Codeless Connector Framework dá suporte à concessão de código de autorização do OAuth 2.0 e às credenciais do cliente. O tipo de concessão de Código de Autorização é usado por clientes confidenciais e públicos para trocar um código de autorização por um token de acesso. Depois que o usuário retornar ao cliente por meio da URL de redirecionamento, o aplicativo obterá o código de autorização da URL e usará para solicitar um token de acesso.

Campo Obrigatória Tipo Descrição
ID do cliente Verdade fio O ID do cliente
Segredo do cliente Verdade fio O segredo do cliente
Código de autorização True quando grantType = authorization_code fio Se o tipo de concessão for authorization_code esse valor de campo será o código de autorização retornado do servidor de autenticação.
Escopo True para authorization_code o tipo de concessão
opcional para client_credentials o tipo de concessão
fio Uma lista separada por espaços de escopos para consentimento do usuário. Para obter mais informações, consulte Escopos e permissões do OAuth2.
RedirectUri True quando grantType = authorization_code fio URL para redirecionamento, deve ser https://portal.azure.com/TokenAuthorize/ExtensionName/Microsoft_Azure_Security_Insights
Tipo de concessão Verdade fio authorization_code ou client_credentials
TokenEndpoint Verdade fio URL para trocar código com token válido na authorization_code concessão ou ID do cliente e segredo com token válido na client_credentials concessão.
TokenEndpointHeaders Objeto Um objeto de valor de chave opcional para enviar cabeçalhos personalizados para o servidor de token
TokenEndpointQueryParameters Objeto Um objeto de valor de chave opcional para enviar parâmetros de consulta personalizados para o servidor de token
Ponto de Autorização Verdade fio URL para consentimento do usuário para authorization_code fluxo
AuthorizationEndpointHeaders Objeto Um objeto de valor de chave opcional para enviar cabeçalhos personalizados ao servidor de autenticação
ParâmetrosDeConsultaDoPontoDeAutorização Objeto Um par de valores de chave opcional usado na solicitação de fluxo de código de autorização OAuth2

O fluxo de código de autenticação é para buscar dados em nome das permissões de um usuário e as credenciais do cliente são para buscar dados com permissões de aplicativo. O servidor de dados concede acesso ao aplicativo. Como não há nenhum usuário no fluxo de credenciais do cliente, nenhum endpoint de autorização é necessário, apenas um endpoint de token.

Exemplo: tipo de concessão 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"
}

Exemplo: tipo de concessão 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

A autenticação JWT (Token Web JSON) dá suporte à obtenção de tokens por meio de credenciais de nome de usuário/senha e ao usá-los para solicitações de API.

Exemplo básico:

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

Credenciais no corpo do POST (padrão):

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

Credenciais em Cabeçalhos (Autenticação Básica):

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

Credenciais em cabeçalhos (token de usuário):

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

Fluxo de autenticação:

  1. Enviar credenciais para TokenEndpoint obter o token JWT

    • Se IsCredentialsInHeaders: true: envia o cabeçalho de autenticação básica com username:password
    • Se IsCredentialsInHeaders: false: envia credenciais no corpo do POST
  2. Extrair token usando JwtTokenJsonPath ou de cabeçalho de resposta

  3. Usar token em solicitações de API subsequentes com ApiKeyName cabeçalho

Propriedades:

Campo Obrigatória Tipo Descrição
type Verdade fio Precisa ser JwtToken
userName True (se userToken não for usado) Objeto Par chave-valor para credencial de nome de usuário. Se userName e password forem enviados na solicitação de cabeçalho, especifique a value propriedade com o nome de usuário. Se userName e password enviado na solicitação do corpo, especifique o Key e Value
senha True (se userToken não for usado) Objeto Par chave-valor para credencial de senha. Se userName e password forem enviados na solicitação de cabeçalho, especifique a value propriedade com o nome de usuário. Se userName e password enviado na solicitação do corpo, especifique o Key e Value
userToken True (se userName não for usado) fio Token de usuário gerado pelo cliente para obter o token do sistema para autenticação
UserTokenPrepend Falso fio Prepare o texto antes do token. Exemplo: Bearer
NoAccessTokenPrepend Falso booleano O sinalizador de acesso para indicar que o token não deve acrescentar nada
TokenEndpointHttpMethod Falso fio Método HTTP para ponto de extremidade de token. Pode ser Get ou Post. Padrão: Post
TokenEndpoint Verdade fio Ponto de extremidade de URL para obter o token JWT
IsCredentialsInHeaders booleano Enviar credenciais como cabeçalho de autenticação básica (true) versus corpo POST (false). Padrão: false
IsJsonRequest booleano Enviar solicitação como JSON (cabeçalho Content-Type = application/json) vs codificado em formulário (cabeçalho Content-Type = application/x-www-form-urlencoded). Padrão: false
JwtTokenJsonPath fio JSONPath para extrair o token da resposta (por exemplo, "$.access_token")
JwtTokenInResponseHeader booleano Extraia o token do cabeçalho de resposta versus corpo. Padrão: false
JwtTokenHeaderName fio Nome do cabeçalho quando o token estiver no cabeçalho de resposta. Padrão: "Authorization"
JwtTokenIdentifier fio Identificador usado para extrair o JWT de uma cadeia de caracteres de token prefixada
QueryParameters Objeto Parâmetros de consulta personalizados a serem incluídos ao enviar a solicitação para o ponto de extremidade do token
Cabeçalhos Objeto Cabeçalhos personalizados a serem incluídos ao enviar a solicitação para o ponto de extremidade do token
RequestTimeoutInSeconds Inteiro Tempo limite da solicitação em segundos. Padrão: 100, Máximo 180

Fluxo de autenticação:

  1. Enviar credenciais para TokenEndpoint obter o token JWT

    • Se IsCredentialsInHeaders: true: envia o cabeçalho de autenticação básica com username:password
    • Se IsCredentialsInHeaders: false: envia credenciais no corpo do POST
  2. Extrair token usando JwtTokenJsonPath ou de cabeçalho de resposta

  3. Usar token em solicitações de API subsequentes com ApiKeyName cabeçalho

Observação

Limitations:

  • Requer autenticação de nome de usuário/senha para aquisição de token
  • Não dá suporte a solicitações de token baseadas em chave de API
  • Não há suporte para autenticação de cabeçalho personalizado (sem nome de usuário/senha)

Configuração de solicitação

A seção de solicitação define como o conector de dados CCF envia solicitações para sua fonte de dados, como o ponto de extremidade da API e com que frequência sondar esse ponto de extremidade.

Campo Obrigatória Tipo Descrição
ApiEndpoint Verdade fio URL para servidor remoto. Define o ponto de extremidade do qual efetuar pull dos dados.
TaxaLimitQPS Inteiro Define o número de chamadas ou consultas permitidas em um segundo.
RateLimitConfig Objeto Define a configuração do limite de taxa para a API RESTful. Confira o exemplo.
QueryWindowInMin Inteiro Define a janela de consulta disponível em minutos. O mínimo é de 1 minuto. O padrão é de 5 minutos.
Método HTTP fio Define o método da API: GET(padrão) ou POST
QueryTimeFormat fio Define o formato de data e hora que o ponto de extremidade (servidor remoto) espera. O CCF usa a data e a hora atuais onde quer que essa variável seja usada. Os valores possíveis são as constantes: UnixTimestamp, UnixTimestampInMills ou qualquer outra representação válida de data e hora, por exemplo: yyyy-MM-dd, MM/dd/yyyy HH:mm:ss
o padrão é ISO 8601 UTC
Contagem de Tentativas Inteiro (1...6) Define 1 como 6 novas tentativas permitidas para se recuperar de uma falha. O padrão é 3.
Tempo limite em segundos Inteiro (1...180) Define o tempo limite da solicitação, em segundos. O padrão é 20
IsPostPayloadJson booleano Determina se o conteúdo POST está no formato JSON. O padrão é false
Cabeçalhos Objeto Pares de chave-valor que definem os cabeçalhos de solicitação.
QueryParameters Objeto Pares de valores-chave que definem os parâmetros de consulta de solicitação.
StartTimeAttributeName True quando EndTimeAttributeName é definido fio Define o nome do parâmetro de consulta para a hora de início da consulta. Confira o exemplo.
EndTimeAttributeName True quando StartTimeAttributeName é definido fio Define o nome do parâmetro de consulta para a hora de término da consulta.
QueryTimeIntervalAttributeName fio Se o ponto de extremidade exigir um formato especializado para consultar os dados em um período de tempo, use essa propriedade com os QueryTimeIntervalPrepend parâmetros e .QueryTimeIntervalDelimiter Confira o exemplo.
QueryTimeIntervalPrepend True quando QueryTimeIntervalAttributeName é definido fio Veja QueryTimeIntervalAttributeName
QueryTimeIntervalDelimiter True quando QueryTimeIntervalAttributeName é definido fio Veja QueryTimeIntervalAttributeName
QueryParametersTemplate fio Modelo de consulta a ser usado ao passar parâmetros em cenários avançados.
>br Por exemplo:"queryParametersTemplate": "{'cid': 1234567, 'cmd': 'reporting', 'format': 'siem', 'data': { 'from': '{_QueryWindowStartTime}', 'to': '{_QueryWindowEndTime}'}, '{_APIKeyName}': '{_APIKey}'}"

Quando a API exigir parâmetros complexos, use o queryParameters ou queryParametersTemplate que inclui algumas variáveis integradas.

variável embutida para uso em queryParameters para uso em queryParametersTemplate
_QueryWindowStartTime sim sim
_QueryWindowEndTime sim sim
_APIKeyName não sim
_APIKey não sim

Exemplo de StartTimeAttributeName

Considere este exemplo:

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

A consulta enviada ao servidor remoto é: https://www.example.com?from={QueryTimeFormat}&until={QueryTimeFormat + QueryWindowInMin}

Exemplo de QueryTimeIntervalAttributeName

Considere este exemplo:

  • QueryTimeIntervalAttributeName = interval
  • QueryTimeIntervalPrepend = time:
  • QueryTimeIntervalDelimiter = ..
  • ApiEndpoint = https://www.example.com

A consulta enviada ao servidor remoto é: https://www.example.com?interval=time:{QueryTimeFormat}..{QueryTimeFormat + QueryWindowInMin}

Exemplo do RateLimitConfig

Considere este exemplo:

  • 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
  }
}

Quando a resposta inclui cabeçalhos de limite de taxa, o conector pode usar essas informações para ajustar sua taxa de solicitação.

Exemplos de solicitação usando o Microsoft Graph como API de fonte de dados

Este exemplo consulta mensagens com um parâmetro de consulta de filtro. Para obter mais informações, consulte Parâmetros de consulta da API do Microsoft Graph.

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

O exemplo anterior envia uma GET solicitação para .https://graph.microsoft.com/v1.0/me/messages?filter=receivedDateTime gt {time of request} and receivedDateTime lt 2019-09-01T17:00:00.0000000 O carimbo de data/hora é atualizado para cada queryWindowInMin vez.

Os mesmos resultados são obtidos com este exemplo:

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

Outra opção é quando a fonte de dados espera 2 parâmetros de consulta, um para a hora de início e outro para a hora de término.

Exemplo:

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

Isso envia uma GET solicitação para https://graph.microsoft.com/me/calendarView?startDateTime=2019-09-01T09:00:00.0000000&endDateTime=2019-09-01T17:00:00.0000000

Para consultas complexas, use QueryParametersTemplate. O próximo exemplo envia uma POST solicitação com parâmetros no corpo.

Exemplo:

"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}))\"}"
}

Configuração de resposta

Defina o tratamento de resposta do conector de dados com os seguintes parâmetros:

Campo Obrigatória Tipo Descrição
EventosJsonPaths Verdade Lista de strings Define o caminho para a mensagem no JSON de resposta. Uma expressão de caminho JSON especifica um caminho para um elemento ou um conjunto de elementos em uma estrutura JSON
SuccessStatusJsonPath fio Define o caminho para a mensagem de êxito no JSON de resposta. Quando esse parâmetro é definido, o SuccessStatusValue parâmetro também deve ser definido.
SuccessStatusValue fio Define o caminho para o valor da mensagem de êxito no JSON de resposta
IsGzipCompressed booleano Determina se a resposta é compactada em um arquivo gzip
formato Verdade fio json ou csv ou xml
CompressãoAlgo fio O algoritmo de compressão, ou multi-gzipdeflate. Para o algoritmo de compactação gzip, basta configurar IsGzipCompressed para True em vez de definir um valor para este parâmetro.
CsvDelimiter fio Se o formato de resposta for CSV e você quiser alterar o delimitador CSV padrão de ","
HasCsvLimite booleano Indique se os dados CSV têm um limite
HasCsvHeader booleano Indique se os dados CSV têm um cabeçalho, o padrão é True
Fuga CsvEscape fio Caractere de escape para um limite de campo, o padrão é "

Por exemplo, um CSV com cabeçalhos id,name,avg e uma linha de dados contendo espaços como 1,"my name",5.5 requer o limite do " campo.
ConvertChildPropertiesToArray booleano Caso especial em que o servidor remoto retorna um objeto em vez de uma lista de eventos em que cada propriedade contém dados.

Observação

O tipo de formato CSV é analisado pela especificação RFC4180.

Exemplos de configuração de resposta

Uma resposta do servidor com o formato JSON é esperada, com os dados solicitados no valor da propriedade. O status da propriedade

"response": {
  "EventsJsonPaths ": ["$.value"],
  "format": "json",
  "SuccessStatusJsonPath": "$.status",
  "SuccessStatusValue": "success",
  "IsGzipCompressed": true
 }

A resposta esperada neste exemplo se prepara para um CSV sem cabeçalho.

"response": {
  "EventsJsonPaths ": ["$"],
  "format": "csv",
  "HasCsvHeader": false
 }

Configuração de paginação

Quando a fonte de dados não pode enviar todo o conteúdo de resposta de uma só vez, o conector de dados CCF precisa saber como receber partes dos dados em páginas de resposta. Os tipos de paginação a serem escolhidos são:

Tipo de paginação fator de decisão
A resposta da API tem links para as páginas seguintes e anteriores?
A resposta da API tem um token ou cursor para as páginas seguinte e anterior?
A resposta da API oferece suporte a um parâmetro para o número de objetos a serem ignorados durante a paginação?
A resposta à API dá suporte a um parâmetro para o número de objetos a serem retornados?

Configurar LinkHeader ou PersistentLinkHeader

O tipo de paginação mais comum é quando uma API de fonte de dados do servidor fornece URLs para as páginas de dados seguintes e anteriores. Para obter mais informações sobre a especificação do cabeçalho do link, consulte RFC 5988.

LinkHeader paginação significa que a resposta da API inclui:

  • o cabeçalho de Link resposta HTTP
  • ou um caminho JSON para recuperar o link do corpo da resposta.

PersistentLinkHeader A paginação tem as mesmas propriedades LinkHeaderque , exceto que o cabeçalho do link persiste no armazenamento de back-end. Essa opção habilita links de paginação entre janelas de consulta. Por exemplo, algumas APIs não dão suporte a horários de início ou término de consulta. Em vez disso, eles suportam um cursor do lado do servidor. Os tipos de página persistentes podem ser usados para lembrar o cursor do lado do servidor. Para obter mais informações, consulte O que é um cursor?.

Observação

Pode haver apenas uma consulta em execução para o conector com PersistentLinkHeader para evitar condições de corrida no cursor do lado do servidor. Isso pode afetar a latência.

Campo Obrigatória Tipo Descrição
LinkHeaderTokenJsonPath Falso fio Use essa propriedade para indicar onde obter o valor no corpo da resposta.

Por exemplo, se a fonte de dados retornar o seguinte JSON: { nextPage: "foo", value: [{data}]} then LinkHeaderTokenJsonPath será $.nextPage
Tamanho da Página Falso Inteiro Quantos eventos por página
PageSizeParameterName Falso fio Nome do parâmetro de consulta para o tamanho da página
PagingInfoPlacement Falso fio Como as informações de paginação são preenchidas. Aceita tanto "QueryString" quanto "RequestBody"
PagingQueryParamOnly Falso booleano Se definido como true, omitirá todos os outros parâmetros de consulta, exceto os parâmetros de paginação.

Veja alguns exemplos:

"paging": {
  "pagingType": "LinkHeader",
  "linkHeaderTokenJsonPath" : "$.metadata.links.next"
}
"paging": {
 "pagingType" : "PersistentLinkHeader", 
 "pageSizeParameterName" : "limit", 
 "pageSize" : 500 
}

Configurar NextPageUrl

NextPageUrl paginação significa que a resposta da API inclui um link complexo no corpo da resposta semelhante a LinkHeader, mas a URL é incluída no corpo da resposta em vez do cabeçalho.

Campo Obrigatória Tipo Descrição
Tamanho da Página Falso Inteiro Quantos eventos por página
PageSizeParameterName Falso fio Nome do parâmetro de consulta para o tamanho da página
Url da próxima página Falso fio Somente se o conector for para a API Coralogix
Parâmetros de consulta de URL da próxima página Falso Pares de valores de chave de objeto – adicionando parâmetro de consulta personalizado a cada solicitação para a próxima página
PróximoPageParaName Falso fio Determina o nome da próxima página na solicitação.
HasNextFlagJsonPath Falso fio Define o caminho para o atributo de sinalizador HasNextPage
NextPageRequestHeader Falso fio Determina o nome do cabeçalho da próxima página na solicitação.
PróximoPageUrlQueryParametersTemplate Falso fio Somente se o conector for para a API Coralogix
PagingInfoPlacement Falso fio Como as informações de paginação são preenchidas. Aceita tanto "QueryString" quanto "RequestBody"
PagingQueryParamOnly Falso booleano Se definido como true, omitirá todos os outros parâmetros de consulta, exceto os parâmetros de paginação.

Exemplo:

"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\")}" 
}

Configurar NextPageToken ou PersistentToken

NextPageToken A paginação usa um token (um hash ou um cursor) que representa o estado da página atual. O token é incluído na resposta da API e o cliente o anexa à próxima solicitação para buscar a próxima página. Esse método geralmente é usado quando o servidor precisa manter o estado exato entre as solicitações.

PersistentToken A paginação usa um token que persiste no lado do servidor. O servidor lembra o último token recuperado pelo cliente e fornece o próximo token em solicitações subsequentes. O cliente continua de onde parou, mesmo que faça novas solicitações posteriormente.

Campo Obrigatória Tipo Descrição
Tamanho da Página Falso Inteiro Quantos eventos por página
PageSizeParameterName Falso cadeia Nome do parâmetro de consulta para o tamanho da página
PróximoPageTokenJsonPath Falso cadeia Caminho JSON para o token da próxima página no corpo da resposta.
NextPageTokenResponseHeader Falso cadeia Se NextPageTokenJsonPath estiver vazio, use o token está neste nome de cabeçalho para a próxima página.
PróximoPageParaName Falso cadeia Determina o nome da próxima página na solicitação.
HasNextFlagJsonPath Falso cadeia Define o caminho para um atributo de sinalizador HasNextPage ao determinar se mais páginas são deixadas na resposta.
NextPageRequestHeader Falso cadeia Determina o nome do cabeçalho da próxima página na solicitação.
PagingInfoPlacement Falso fio Como as informações de paginação são preenchidas. Aceita tanto "QueryString" quanto "RequestBody"
PagingQueryParamOnly Falso booleano Se definido como true, omitirá todos os outros parâmetros de consulta, exceto os parâmetros de paginação.

Exemplos:

"paging": {
 "pagingType" : "NextPageToken", 
 "nextPageRequestHeader" : "ETag", 
 "nextPageTokenResponseHeader" : "ETag" 
}
"paging": {
 "pagingType" : "PersistentToken", 
    "nextPageParaName" : "gta", 
    "nextPageTokenJsonPath" : "$.alerts[-1:]._id" 
}

Configurar deslocamento

Offset A paginação especifica o número de páginas a serem ignoradas e um limite no número de eventos a serem recuperados por página na solicitação. Os clientes buscam um intervalo específico de itens do conjunto de dados.

Campo Obrigatória Tipo Descrição
Tamanho da Página Falso Inteiro Quantos eventos por página
PageSizeParameterName Falso fio Nome do parâmetro de consulta para o tamanho da página
OffsetParaName Falso fio O nome do parâmetro de consulta da próxima solicitação. O CCF calcula o valor de deslocamento para cada solicitação (todos os eventos ingeridos + 1)
PagingInfoPlacement Falso fio Como as informações de paginação são preenchidas. Aceita tanto "QueryString" quanto "RequestBody"
PagingQueryParamOnly Falso booleano Se definido como true, omitirá todos os outros parâmetros de consulta, exceto os parâmetros de paginação.

Exemplo:

"paging": {
  "pagingType": "Offset", 
  "offsetParaName": "offset",
  "pageSize": 50,
  "pagingQueryParamOnly": true,
  "pagingInfoPlacement": "QueryString"
}

Configurar CountBasedPaging

CountBasedPaging permite que o cliente especifique o número de itens a serem retornados na resposta. Isso é útil para APIs que dão suporte à paginação com base em um parâmetro de contagem como parte do conteúdo de resposta.

Campo Obrigatória Tipo Descrição
pageNumberParaName Verdade fio Nome do parâmetro do número da página na solicitação HTTP
Tamanho da Página Falso Inteiro Quantos eventos por página
ZeroBasedIndexing Falso booleano Sinalizador para indicar se a contagem é baseada em zero
HasNextFlagJsonPath Falso fio Caminho JSON do sinalizador no conteúdo de resposta HTTP para indicar que há mais páginas
TotalResultsJsonPath Falso fio Caminho JSON do número total de resultados no conteúdo de resposta HTTP
PageNumberJsonPath Falso fio Obrigatório se totalResultsJsonPath for fornecido. Caminho JSON do número da página no conteúdo de resposta HTTP
PageCountJsonPath Falso fio Obrigatório se totalResultsJsonPath for fornecido. Caminho JSON da contagem de páginas no conteúdo de resposta HTTP
PagingInfoPlacement Falso fio Como as informações de paginação são preenchidas. Aceita tanto "QueryString" quanto "RequestBody"
PagingQueryParamOnly Falso booleano Se definido como true, omitirá todos os outros parâmetros de consulta, exceto os parâmetros de paginação.

Exemplo:

"paging": {
 "pagingType" : "CountBasedPaging", 
 "pageNumberParaName" : "page", 
 "pageSize" : 10, 
 "zeroBasedIndexing" : true, 
 "hasNextFlagJsonPath" : "$.hasNext", 
 "totalResultsJsonPath" : "$.totalResults", 
 "pageNumberJsonPath" : "$.pageNumber", 
 "pageCountJsonPath" : "$.pageCount"
}

Configuração DCR

Campo Obrigatória Tipo Descrição
DataCollectionEndpoint Verdade fio DCE (Data Collection Endpoint), por exemplo: https://example.ingest.monitor.azure.com.
DataCollectionRuleImmutableId Verdade fio A ID imutável do DCR. Encontre-o exibindo a resposta de criação do DCR ou usando a API do DCR
StreamName Verdade cadeia Esse valor é definido streamDeclaration no DCR (o prefixo deve começar com Custom-)

Conector de dados CCF de exemplo

Aqui está um exemplo de todos os componentes do conector de dados CCF JSON juntos.

{
   "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": ["$"]
      }
   }
}