Enviar dados de log para Azure Monitor com a API do coletor de dados HTTP (visualização pública)Send log data to Azure Monitor with the HTTP Data Collector API (public preview)

Este artigo mostra como usar a API do coletor de dados HTTP para enviar dados de log para Azure Monitor de um cliente de API REST.This article shows you how to use the HTTP Data Collector API to send log data to Azure Monitor from a REST API client. Ele descreve como formatar dados coletados pelo seu script ou aplicativo, incluí-los em uma solicitação e ter essa solicitação autorizada por Azure Monitor.It describes how to format data collected by your script or application, include it in a request, and have that request authorized by Azure Monitor. Os exemplos são fornecidos para PowerShell C#, e Python.Examples are provided for PowerShell, C#, and Python.

Nota

Este artigo foi atualizado recentemente para usar o termo Azure Monitor logs em vez de Log Analytics.This article was recently updated to use the term Azure Monitor logs instead of Log Analytics. Os dados de log ainda são armazenados em um espaço de trabalho Log Analytics e ainda são coletados e analisados pelo mesmo serviço Log Analytics.Log data is still stored in a Log Analytics workspace and is still collected and analyzed by the same Log Analytics service. Estamos atualizando a terminologia para refletir melhor a função dos logs em Azure monitor.We are updating the terminology to better reflect the role of logs in Azure Monitor. Confira Azure monitor alterações de terminologia para obter detalhes.See Azure Monitor terminology changes for details.

Nota

A API do coletor de dados HTTP Azure Monitor está em visualização pública.The Azure Monitor HTTP Data Collector API is in public preview.

ConceitosConcepts

Você pode usar a API do coletor de dados HTTP para enviar dados de log para um espaço de trabalho Log Analytics no Azure Monitor de qualquer cliente que possa chamar uma API REST.You can use the HTTP Data Collector API to send log data to a Log Analytics workspace in Azure Monitor from any client that can call a REST API. Isso pode ser um runbook na automação do Azure que coleta dados de gerenciamento do Azure ou de outra nuvem, ou pode ser um sistema de gerenciamento alternativo que usa Azure Monitor para consolidar e analisar dados de log.This might be a runbook in Azure Automation that collects management data from Azure or another cloud, or it might be an alternate management system that uses Azure Monitor to consolidate and analyze log data.

Todos os dados no espaço de trabalho Log Analytics são armazenados como um registro com um tipo de registro específico.All data in the Log Analytics workspace is stored as a record with a particular record type. Você formata seus dados para enviar para a API do coletor de dados HTTP como vários registros em JSON.You format your data to send to the HTTP Data Collector API as multiple records in JSON. Quando você envia os dados, um registro individual é criado no repositório para cada registro na carga de solicitação.When you submit the data, an individual record is created in the repository for each record in the request payload.

Visão geral do coletor de dados HTTP

Criar uma solicitaçãoCreate a request

Para usar a API do coletor de dados HTTP, você cria uma solicitação POST que inclui os dados a serem enviados em JavaScript Object Notation (JSON).To use the HTTP Data Collector API, you create a POST request that includes the data to send in JavaScript Object Notation (JSON). As próximas três tabelas listam os atributos necessários para cada solicitação.The next three tables list the attributes that are required for each request. Descrevemos cada atributo em mais detalhes posteriormente neste artigo.We describe each attribute in more detail later in the article.

URI de solicitaçãoRequest URI

AtributoAttribute PropriedadeProperty
MétodoMethod PostarPOST
URIURI https://<CustomerId>. ods.opinsights.azure.com/api/logs?api-version=2016-04-01https://<CustomerId>.ods.opinsights.azure.com/api/logs?api-version=2016-04-01
Tipo de conteúdoContent type application/jsonapplication/json

Parâmetros de URI de solicitaçãoRequest URI parameters

ParâmetroParameter DescriçãoDescription
CustomerIDCustomerID O identificador exclusivo para o espaço de trabalho Log Analytics.The unique identifier for the Log Analytics workspace.
RecursoResource O nome do recurso de API:/API/logs.The API resource name: /api/logs.
Versão da APIAPI Version A versão da API a ser usada com esta solicitação.The version of the API to use with this request. Atualmente, é 2016-04-01.Currently, it's 2016-04-01.

Cabeçalhos de solicitaçãoRequest headers

CabeçalhoHeader DescriçãoDescription
AutorizaçãoAuthorization A assinatura de autorização.The authorization signature. Mais adiante neste artigo, você pode ler sobre como criar um cabeçalho HMAC-SHA256.Later in the article, you can read about how to create an HMAC-SHA256 header.
Tipo de logLog-Type Especifique o tipo de registro dos dados que estão sendo enviados.Specify the record type of the data that is being submitted. Pode conter apenas letras, números e sublinhado () e não pode exceder 100 caracteres.Can only contain letters, numbers, and underscore (), and may not exceed 100 characters.
x-MS-Datex-ms-date A data em que a solicitação foi processada, no formato RFC 1123.The date that the request was processed, in RFC 1123 format.
x-MS-AzureResourceIdx-ms-AzureResourceId ID de recurso do recurso do Azure ao qual os dados devem ser associados.Resource ID of the Azure resource the data should be associated with. Isso popula a propriedade _ResourceId e permite que os dados sejam incluídos em consultas de contexto de recurso .This populates the _ResourceId property and allows the data to be included in resource-context queries. Se esse campo não for especificado, os dados não serão incluídos nas consultas de contexto de recurso.If this field isn't specified, the data will not be included in resource-context queries.
tempo gerado-campotime-generated-field O nome de um campo nos dados que contém o carimbo de data/hora do item de dados.The name of a field in the data that contains the timestamp of the data item. Se você especificar um campo, seu conteúdo será usado para TimeGenerated.If you specify a field then its contents are used for TimeGenerated. Se esse campo não for especificado, o padrão para TimeGenerated é a hora em que a mensagem é ingerida.If this field isn’t specified, the default for TimeGenerated is the time that the message is ingested. O conteúdo do campo de mensagem deve seguir o formato ISO 8601 AAAA-MM-DDThh: mm: ssZ.The contents of the message field should follow the ISO 8601 format YYYY-MM-DDThh:mm:ssZ.

AutorizaçãoAuthorization

Qualquer solicitação para a API do coletor de dados HTTP Azure Monitor deve incluir um cabeçalho de autorização.Any request to the Azure Monitor HTTP Data Collector API must include an authorization header. Para autenticar uma solicitação, você deve assinar a solicitação com a chave primária ou secundária para o espaço de trabalho que está fazendo a solicitação.To authenticate a request, you must sign the request with either the primary or the secondary key for the workspace that is making the request. Em seguida, passe essa assinatura como parte da solicitação.Then, pass that signature as part of the request.

Este é o formato do cabeçalho de autorização:Here's the format for the authorization header:

Authorization: SharedKey <WorkspaceID>:<Signature>

Workspaceid é o identificador exclusivo para o espaço de trabalho log Analytics.WorkspaceID is the unique identifier for the Log Analytics workspace. Assinatura é um HMAC (Message Authentication Code baseado em hash) que é construído a partir da solicitação e, em seguida, calculado usando o algoritmo SHA256.Signature is a Hash-based Message Authentication Code (HMAC) that is constructed from the request and then computed by using the SHA256 algorithm. Em seguida, você o codifica usando a codificação Base64.Then, you encode it by using Base64 encoding.

Use este formato para codificar a cadeia de caracteres de assinatura SharedKey :Use this format to encode the SharedKey signature string:

StringToSign = VERB + "\n" +
                  Content-Length + "\n" +
               Content-Type + "\n" +
                  x-ms-date + "\n" +
                  "/api/logs";

Aqui está um exemplo de uma cadeia de caracteres de assinatura:Here's an example of a signature string:

POST\n1024\napplication/json\nx-ms-date:Mon, 04 Apr 2016 08:00:00 GMT\n/api/logs

Quando você tiver a cadeia de caracteres de assinatura, codifique-a usando o algoritmo HMAC-SHA256 na cadeia de caracteres codificada em UTF-8 e, em seguida, codifique o resultado como Base64.When you have the signature string, encode it by using the HMAC-SHA256 algorithm on the UTF-8-encoded string, and then encode the result as Base64. Use este formato:Use this format:

Signature=Base64(HMAC-SHA256(UTF8(StringToSign)))

Os exemplos nas seções a seguir têm um código de exemplo para ajudá-lo a criar um cabeçalho de autorização.The samples in the next sections have sample code to help you create an authorization header.

Corpo do pedidoRequest body

O corpo da mensagem deve estar em JSON.The body of the message must be in JSON. Ele deve incluir um ou mais registros com os pares nome e valor da propriedade no formato a seguir.It must include one or more records with the property name and value pairs in the following format. O nome da propriedade só pode conter letras, números e sublinhado ().The property name can only contain letters, numbers, and underscore ().

[
    {
        "property 1": "value1",
        "property 2": "value2",
        "property 3": "value3",
        "property 4": "value4"
    }
]

Você pode agrupar vários registros em lote em uma única solicitação usando o formato a seguir.You can batch multiple records together in a single request by using the following format. Todos os registros devem ser do mesmo tipo de registro.All the records must be the same record type.

[
    {
        "property 1": "value1",
        "property 2": "value2",
        "property 3": "value3",
        "property 4": "value4"
    },
    {
        "property 1": "value1",
        "property 2": "value2",
        "property 3": "value3",
        "property 4": "value4"
    }
]

Tipo de registro e propriedadesRecord type and properties

Você define um tipo de registro personalizado ao enviar dados por meio da API do coletor de dados HTTP Azure Monitor.You define a custom record type when you submit data through the Azure Monitor HTTP Data Collector API. No momento, não é possível gravar dados em tipos de registros existentes que foram criados por outros tipos de dados e soluções.Currently, you can't write data to existing record types that were created by other data types and solutions. Azure Monitor lê os dados de entrada e, em seguida, cria propriedades que correspondem aos tipos de dados dos valores inseridos.Azure Monitor reads the incoming data and then creates properties that match the data types of the values that you enter.

Cada solicitação para a API do coletor de dados deve incluir um cabeçalho de tipo de log com o nome para o tipo de registro.Each request to the Data Collector API must include a Log-Type header with the name for the record type. O sufixo _CL é automaticamente anexado ao nome inserido para distingui-lo de outros tipos de log como um log personalizado.The suffix _CL is automatically appended to the name you enter to distinguish it from other log types as a custom log. Por exemplo, se você inserir o nome MyNewRecordType, Azure monitor criará um registro com o tipo MyNewRecordType_CL.For example, if you enter the name MyNewRecordType, Azure Monitor creates a record with the type MyNewRecordType_CL. Isso ajuda a garantir que não haja conflitos entre os nomes de tipo criados pelo usuário e os fornecidos nas soluções atuais ou futuras da Microsoft.This helps ensure that there are no conflicts between user-created type names and those shipped in current or future Microsoft solutions.

Para identificar o tipo de dados de uma propriedade, Azure Monitor adiciona um sufixo ao nome da propriedade.To identify a property's data type, Azure Monitor adds a suffix to the property name. Se uma propriedade contiver um valor nulo, a propriedade não será incluída nesse registro.If a property contains a null value, the property is not included in that record. Esta tabela lista o tipo de dados de propriedade e o sufixo correspondente:This table lists the property data type and corresponding suffix:

Tipo de dados de propriedadeProperty data type SufixoSuffix
StringString _s_s
BooleanoBoolean _b_b
CliqueDouble _d_d
Data/horaDate/time _t_t
GUID (armazenado como uma cadeia de caracteres)GUID (stored as a string) _g_g

O tipo de dados que Azure Monitor usa para cada propriedade depende se o tipo de registro para o novo registro já existe.The data type that Azure Monitor uses for each property depends on whether the record type for the new record already exists.

  • Se o tipo de registro não existir, Azure Monitor criará um novo usando a inferência de tipo JSON para determinar o tipo de dados para cada propriedade para o novo registro.If the record type does not exist, Azure Monitor creates a new one using the JSON type inference to determine the data type for each property for the new record.
  • Se o tipo de registro existir, Azure Monitor tentará criar um novo registro com base nas propriedades existentes.If the record type does exist, Azure Monitor attempts to create a new record based on existing properties. Se o tipo de dados de uma propriedade no novo registro não corresponder e não puder ser convertido para o tipo existente, ou se o registro incluir uma propriedade que não existe, Azure Monitor criará uma nova propriedade com o sufixo relevante.If the data type for a property in the new record doesn’t match and can’t be converted to the existing type, or if the record includes a property that doesn’t exist, Azure Monitor creates a new property that has the relevant suffix.

Por exemplo, essa entrada de envio criaria um registro com três propriedades, number_d, boolean_be string_s:For example, this submission entry would create a record with three properties, number_d, boolean_b, and string_s:

Registro de exemplo 1

Se você enviou essa próxima entrada, com todos os valores formatados como cadeias de caracteres, as propriedades não seriam alteradas.If you then submitted this next entry, with all values formatted as strings, the properties would not change. Esses valores podem ser convertidos em tipos de dados existentes:These values can be converted to existing data types:

Registro de exemplo 2

Mas, se você fez esse próximo envio, Azure Monitor criaria as novas propriedades boolean_d e string_d.But, if you then made this next submission, Azure Monitor would create the new properties boolean_d and string_d. Esses valores não podem ser convertidos:These values can't be converted:

Registro de exemplo 3

Se você tiver enviado a seguinte entrada, antes de o tipo de registro ter sido criado, Azure Monitor criaria um registro com três propriedades, núm_s, boolean_se string_s.If you then submitted the following entry, before the record type was created, Azure Monitor would create a record with three properties, number_s, boolean_s, and string_s. Nessa entrada, cada um dos valores iniciais é formatado como uma cadeia de caracteres:In this entry, each of the initial values is formatted as a string:

Registro de exemplo 4

Propriedades reservadasReserved properties

As propriedades a seguir são reservadas e não devem ser usadas em um tipo de registro personalizado.The following properties are reserved and should not be used in a custom record type. Você receberá um erro se sua carga incluir qualquer um desses nomes de propriedade.You will receive an error if your payload includes any of these property names.

  • váriostenant

Limites de dadosData limits

Há algumas restrições em relação aos dados postados na API de coleta de dados do Azure Monitor.There are some constraints around the data posted to the Azure Monitor Data collection API.

  • Máximo de 30 MB por postagem para Azure Monitor API do coletor de dados.Maximum of 30 MB per post to Azure Monitor Data Collector API. Esse é um limite de tamanho para uma única postagem.This is a size limit for a single post. Se os dados de uma única postagem excederem 30 MB, você deverá dividir os dados em partes de tamanho menor e enviá-los simultaneamente.If the data from a single post that exceeds 30 MB, you should split the data up to smaller sized chunks and send them concurrently.
  • Limite máximo de 32 KB para valores de campo.Maximum of 32 KB limit for field values. Se o valor do campo for maior que 32 KB, os dados serão truncados.If the field value is greater than 32 KB, the data will be truncated.
  • O número máximo recomendado de campos para um determinado tipo é 50.Recommended maximum number of fields for a given type is 50. Esse é um limite prático de uma perspectiva de experiência de pesquisa e usabilidade.This is a practical limit from a usability and search experience perspective.
  • Uma tabela em um espaço de trabalho Log Analytics só dá suporte a até 500 colunas (conhecidas como um campo neste artigo).A table in a Log Analytics workspace only supports up to 500 columns (referred to as a field in this article).
  • O número máximo de caracteres para o nome da coluna é 500.The maximum number of characters for the column name is 500.

Códigos de retornoReturn codes

O código de status HTTP 200 significa que a solicitação foi recebida para processamento.The HTTP status code 200 means that the request has been received for processing. Isso indica que a operação foi concluída com êxito.This indicates that the operation completed successfully.

Esta tabela lista o conjunto completo de códigos de status que o serviço pode retornar:This table lists the complete set of status codes that the service might return:

CódigoCode EstadoStatus Código de erroError code DescriçãoDescription
200200 OKOK A solicitação foi aceita com êxito.The request was successfully accepted.
400400 Solicitação inadequadaBad request InactiveCustomerInactiveCustomer O espaço de trabalho foi fechado.The workspace has been closed.
400400 Solicitação inadequadaBad request InvalidApiVersionInvalidApiVersion A versão da API que você especificou não foi reconhecida pelo serviço.The API version that you specified was not recognized by the service.
400400 Solicitação inadequadaBad request InvalidCustomerIdInvalidCustomerId A ID do espaço de trabalho especificada é inválida.The workspace ID specified is invalid.
400400 Solicitação inadequadaBad request InvalidDataFormatInvalidDataFormat JSON inválido foi enviado.Invalid JSON was submitted. O corpo da resposta pode conter mais informações sobre como resolver o erro.The response body might contain more information about how to resolve the error.
400400 Solicitação inadequadaBad request InvalidLogTypeInvalidLogType O tipo de log especificado continha caracteres especiais ou numéricos.The log type specified contained special characters or numerics.
400400 Solicitação inadequadaBad request MissingApiVersionMissingApiVersion A versão da API não foi especificada.The API version wasn’t specified.
400400 Solicitação inadequadaBad request MissingContentTypeMissingContentType O tipo de conteúdo não foi especificado.The content type wasn’t specified.
400400 Solicitação inadequadaBad request MissingLogTypeMissingLogType O tipo de log de valor necessário não foi especificado.The required value log type wasn’t specified.
400400 Solicitação inadequadaBad request UnsupportedContentTypeUnsupportedContentType O tipo de conteúdo não foi definido como Application/JSON.The content type was not set to application/json.
403403 ProibidoForbidden InvalidAuthorizationInvalidAuthorization Falha do serviço ao autenticar a solicitação.The service failed to authenticate the request. Verifique se a ID do espaço de trabalho e a chave de conexão são válidas.Verify that the workspace ID and connection key are valid.
404404 Não encontradoNot Found A URL fornecida está incorreta ou a solicitação é muito grande.Either the URL provided is incorrect, or the request is too large.
429429 Número excessivo de solicitaçõesToo Many Requests O serviço está apresentando um alto volume de dados de sua conta.The service is experiencing a high volume of data from your account. Repita a solicitação mais tarde.Please retry the request later.
500500 Erro interno do servidorInternal Server Error UnspecifiedErrorUnspecifiedError O serviço encontrou um erro interno.The service encountered an internal error. Repita a solicitação.Please retry the request.
503503 Serviço indisponívelService Unavailable ServiceUnavailableServiceUnavailable O serviço atualmente não está disponível para receber solicitações.The service currently is unavailable to receive requests. Repita a solicitação.Please retry your request.

Consultar dadosQuery data

Para consultar os dados enviados pelo Azure Monitor API do coletor de dados HTTP, pesquise registros com o tipo que seja igual ao valor de LogType que você especificou, anexado com _CL.To query data submitted by the Azure Monitor HTTP Data Collector API, search for records with Type that is equal to the LogType value that you specified, appended with _CL. Por exemplo, se você usou MyCustomLog, retornará todos os registros com MyCustomLog_CL.For example, if you used MyCustomLog, then you'd return all records with MyCustomLog_CL.

Solicitações de amostraSample requests

Nas próximas seções, você encontrará exemplos de como enviar dados para a API do coletor de dados HTTP Azure Monitor usando linguagens de programação diferentes.In the next sections, you'll find samples of how to submit data to the Azure Monitor HTTP Data Collector API by using different programming languages.

Para cada exemplo, siga estas etapas para definir as variáveis para o cabeçalho de autorização:For each sample, do these steps to set the variables for the authorization header:

  1. Na portal do Azure, localize seu espaço de trabalho do Log Analytics.In the Azure portal, locate your Log Analytics workspace.
  2. Selecione Configurações avançadas e, em seguida, fontes conectadas.Select Advanced Settings and then Connected Sources.
  3. À direita da ID do espaço de trabalho, selecione o ícone de cópia e cole a ID como o valor da variável Customer ID .To the right of Workspace ID, select the copy icon, and then paste the ID as the value of the Customer ID variable.
  4. À direita da chave primária, selecione o ícone de cópia e cole a ID como o valor da variável de chave compartilhada .To the right of Primary Key, select the copy icon, and then paste the ID as the value of the Shared Key variable.

Como alternativa, você pode alterar as variáveis para o tipo de log e dados JSON.Alternatively, you can change the variables for the log type and JSON data.

Exemplo do PowerShellPowerShell sample

# Replace with your Workspace ID
$CustomerId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"  

# Replace with your Primary Key
$SharedKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# Specify the name of the record type that you'll be creating
$LogType = "MyRecordType"

# You can use an optional field to specify the timestamp from the data. If the time field is not specified, Azure Monitor assumes the time is the message ingestion time
$TimeStampField = "DateValue"


# Create two records with the same set of properties to create
$json = @"
[{  "StringValue": "MyString1",
    "NumberValue": 42,
    "BooleanValue": true,
    "DateValue": "2019-09-12T20:00:00.625Z",
    "GUIDValue": "9909ED01-A74C-4874-8ABF-D2678E3AE23D"
},
{   "StringValue": "MyString2",
    "NumberValue": 43,
    "BooleanValue": false,
    "DateValue": "2019-09-12T20:00:00.625Z",
    "GUIDValue": "8809ED01-A74C-4874-8ABF-D2678E3AE23D"
}]
"@

# Create the function to create the authorization signature
Function Build-Signature ($customerId, $sharedKey, $date, $contentLength, $method, $contentType, $resource)
{
    $xHeaders = "x-ms-date:" + $date
    $stringToHash = $method + "`n" + $contentLength + "`n" + $contentType + "`n" + $xHeaders + "`n" + $resource

    $bytesToHash = [Text.Encoding]::UTF8.GetBytes($stringToHash)
    $keyBytes = [Convert]::FromBase64String($sharedKey)

    $sha256 = New-Object System.Security.Cryptography.HMACSHA256
    $sha256.Key = $keyBytes
    $calculatedHash = $sha256.ComputeHash($bytesToHash)
    $encodedHash = [Convert]::ToBase64String($calculatedHash)
    $authorization = 'SharedKey {0}:{1}' -f $customerId,$encodedHash
    return $authorization
}


# Create the function to create and post the request
Function Post-LogAnalyticsData($customerId, $sharedKey, $body, $logType)
{
    $method = "POST"
    $contentType = "application/json"
    $resource = "/api/logs"
    $rfc1123date = [DateTime]::UtcNow.ToString("r")
    $contentLength = $body.Length
    $signature = Build-Signature `
        -customerId $customerId `
        -sharedKey $sharedKey `
        -date $rfc1123date `
        -contentLength $contentLength `
        -method $method `
        -contentType $contentType `
        -resource $resource
    $uri = "https://" + $customerId + ".ods.opinsights.azure.com" + $resource + "?api-version=2016-04-01"

    $headers = @{
        "Authorization" = $signature;
        "Log-Type" = $logType;
        "x-ms-date" = $rfc1123date;
        "time-generated-field" = $TimeStampField;
    }

    $response = Invoke-WebRequest -Uri $uri -Method $method -ContentType $contentType -Headers $headers -Body $body -UseBasicParsing
    return $response.StatusCode

}

# Submit the data to the API endpoint
Post-LogAnalyticsData -customerId $customerId -sharedKey $sharedKey -body ([System.Text.Encoding]::UTF8.GetBytes($json)) -logType $logType  

Exemplo C#C# sample

using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace OIAPIExample
{
    class ApiExample
    {
        // An example JSON object, with key/value pairs
        static string json = @"[{""DemoField1"":""DemoValue1"",""DemoField2"":""DemoValue2""},{""DemoField3"":""DemoValue3"",""DemoField4"":""DemoValue4""}]";

        // Update customerId to your Log Analytics workspace ID
        static string customerId = "xxxxxxxx-xxx-xxx-xxx-xxxxxxxxxxxx";

        // For sharedKey, use either the primary or the secondary Connected Sources client authentication key   
        static string sharedKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

        // LogName is name of the event type that is being submitted to Azure Monitor
        static string LogName = "DemoExample";

        // You can use an optional field to specify the timestamp from the data. If the time field is not specified, Azure Monitor assumes the time is the message ingestion time
        static string TimeStampField = "";

        static void Main()
        {
            // Create a hash for the API signature
            var datestring = DateTime.UtcNow.ToString("r");
            var jsonBytes = Encoding.UTF8.GetBytes(json);
            string stringToHash = "POST\n" + jsonBytes.Length + "\napplication/json\n" + "x-ms-date:" + datestring + "\n/api/logs";
            string hashedString = BuildSignature(stringToHash, sharedKey);
            string signature = "SharedKey " + customerId + ":" + hashedString;

            PostData(signature, datestring, json);
        }

        // Build the API signature
        public static string BuildSignature(string message, string secret)
        {
            var encoding = new System.Text.ASCIIEncoding();
            byte[] keyByte = Convert.FromBase64String(secret);
            byte[] messageBytes = encoding.GetBytes(message);
            using (var hmacsha256 = new HMACSHA256(keyByte))
            {
                byte[] hash = hmacsha256.ComputeHash(messageBytes);
                return Convert.ToBase64String(hash);
            }
        }

        // Send a request to the POST API endpoint
        public static void PostData(string signature, string date, string json)
        {
            try
            {
                string url = "https://" + customerId + ".ods.opinsights.azure.com/api/logs?api-version=2016-04-01";

                System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
                client.DefaultRequestHeaders.Add("Accept", "application/json");
                client.DefaultRequestHeaders.Add("Log-Type", LogName);
                client.DefaultRequestHeaders.Add("Authorization", signature);
                client.DefaultRequestHeaders.Add("x-ms-date", date);
                client.DefaultRequestHeaders.Add("time-generated-field", TimeStampField);

                System.Net.Http.HttpContent httpContent = new StringContent(json, Encoding.UTF8);
                httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                Task<System.Net.Http.HttpResponseMessage> response = client.PostAsync(new Uri(url), httpContent);

                System.Net.Http.HttpContent responseContent = response.Result.Content;
                string result = responseContent.ReadAsStringAsync().Result;
                Console.WriteLine("Return Result: " + result);
            }
            catch (Exception excep)
            {
                Console.WriteLine("API Post Exception: " + excep.Message);
            }
        }
    }
}

Exemplo de Python 2Python 2 sample

import json
import requests
import datetime
import hashlib
import hmac
import base64

# Update the customer ID to your Log Analytics workspace ID
customer_id = 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'

# For the shared key, use either the primary or the secondary Connected Sources client authentication key   
shared_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# The log type is the name of the event that is being submitted
log_type = 'WebMonitorTest'

# An example JSON web monitor object
json_data = [{
   "slot_ID": 12345,
    "ID": "5cdad72f-c848-4df0-8aaa-ffe033e75d57",
    "availability_Value": 100,
    "performance_Value": 6.954,
    "measurement_Name": "last_one_hour",
    "duration": 3600,
    "warning_Threshold": 0,
    "critical_Threshold": 0,
    "IsActive": "true"
},
{   
    "slot_ID": 67890,
    "ID": "b6bee458-fb65-492e-996d-61c4d7fbb942",
    "availability_Value": 100,
    "performance_Value": 3.379,
    "measurement_Name": "last_one_hour",
    "duration": 3600,
    "warning_Threshold": 0,
    "critical_Threshold": 0,
    "IsActive": "false"
}]
body = json.dumps(json_data)

#####################
######Functions######  
#####################

# Build the API signature
def build_signature(customer_id, shared_key, date, content_length, method, content_type, resource):
    x_headers = 'x-ms-date:' + date
    string_to_hash = method + "\n" + str(content_length) + "\n" + content_type + "\n" + x_headers + "\n" + resource
    bytes_to_hash = bytes(string_to_hash).encode('utf-8')  
    decoded_key = base64.b64decode(shared_key)
    encoded_hash = base64.b64encode(hmac.new(decoded_key, bytes_to_hash, digestmod=hashlib.sha256).digest())
    authorization = "SharedKey {}:{}".format(customer_id,encoded_hash)
    return authorization

# Build and send a request to the POST API
def post_data(customer_id, shared_key, body, log_type):
    method = 'POST'
    content_type = 'application/json'
    resource = '/api/logs'
    rfc1123date = datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')
    content_length = len(body)
    signature = build_signature(customer_id, shared_key, rfc1123date, content_length, method, content_type, resource)
    uri = 'https://' + customer_id + '.ods.opinsights.azure.com' + resource + '?api-version=2016-04-01'

    headers = {
        'content-type': content_type,
        'Authorization': signature,
        'Log-Type': log_type,
        'x-ms-date': rfc1123date
    }

    response = requests.post(uri,data=body, headers=headers)
    if (response.status_code >= 200 and response.status_code <= 299):
        print 'Accepted'
    else:
        print "Response code: {}".format(response.status_code)

post_data(customer_id, shared_key, body, log_type)

Alternativas e consideraçõesAlternatives and considerations

Embora a API do coletor de dados deva abranger a maioria das suas necessidades de coletar dados de forma livre nos logs do Azure, há instâncias em que uma alternativa pode ser necessária para superar algumas das limitações da API.While the Data Collector API should cover most of your needs to collect free-form data into Azure Logs, there are instances where an alternative might be required to overcome some of the limitations of the API. Todas as suas opções são as seguintes principais considerações incluídas:All your options are as follows, major considerations included:

OpcionalAlternative DescriçãoDescription Mais adequado paraBest suited for
Eventos personalizados: ingestão baseada em SDK nativo no Application insightsCustom events: Native SDK-based ingestion in Application Insights Application Insights, normalmente instrumentados por meio de um SDK dentro de seu aplicativo, oferece a capacidade de enviar dados personalizados por meio de eventos personalizados.Application Insights, typically instrumented through an SDK within your application, offers the ability for you to send custom data through Custom Events.
  • Dados que são gerados em seu aplicativo, mas não são selecionados pelo SDK por meio de um dos tipos de dados padrão (solicitações, dependências, exceções e assim por diante).Data that is generated within your application, but not picked up by SDK through one of the default data types (requests, dependencies, exceptions, and so on).
  • Dados que costumam ser correlacionados a outros dados de aplicativo no Application InsightsData that is most often correlated to other application data in Application Insights
API do coletor de dados em logs de Azure MonitorData Collector API in Azure Monitor Logs A API do coletor de dados em logs de Azure Monitor é uma maneira completamente aberta de ingerir dados.The Data Collector API in Azure Monitor Logs is a completely open-ended way to ingest data. Todos os dados formatados em um objeto JSON podem ser enviados aqui.Any data formatted in a JSON object can be sent here. Depois de enviado, ele será processado e estará disponível nos logs para serem correlacionados a outros dados nos logs ou a outros dados de Application Insights.Once sent, it will be processed, and available in Logs to be correlated with other data in Logs or against other Application Insights data.

É bem fácil carregar os dados como arquivos em um blob de blob do Azure, de onde esses arquivos serão processados e carregados em Log Analytics.It is fairly easy to upload the data as files to an Azure Blob blob, from where these files will be processed and uploaded to Log Analytics. Consulte este artigo para obter uma implementação de exemplo desse pipeline.Please see this article for a sample implementation of such a pipeline.
  • Dados que não são necessariamente gerados em um aplicativo instrumentado dentro de Application Insights.Data that is not necessarily generated within an application instrumented within Application Insights.
  • Os exemplos incluem tabelas de pesquisa e de fatos, dados de referência, estatísticas pré-configuradas e assim por diante.Examples include lookup and fact tables, reference data, pre-aggregated statistics, and so on.
  • Destinado a dados que serão referenciados entre outros dados de Azure Monitor (Application Insights, outros tipos de dados de logs, central de segurança, Azure Monitor para contêineres/VMs e assim por diante).Intended for data that will be cross-referenced against other Azure Monitor data (Application Insights, other Logs data types, Security Center, Azure Monitor for Containers/VMs, and so on).
Data Explorer do AzureAzure Data Explorer O Azure Data Explorer (ADX) é a plataforma de dados que capacita Application Insights análise e Azure Monitor logs.Azure Data Explorer (ADX) is the data platform that powers Application Insights Analytics and Azure Monitor Logs. Agora disponível ("GA"), usar a plataforma de dados em sua forma bruta oferece flexibilidade total (mas exigindo a sobrecarga de gerenciamento) sobre o cluster (RBAC, taxa de retenção, esquema e assim por diante).Now Generally Available ("GA"), using the data platform in its raw form provides you complete flexibility (but requiring the overhead of management) over the cluster (RBAC, retention rate, schema, and so on). O ADX fornece muitas Opções de ingestão , incluindo arquivos CSV, TSV e JSON .ADX provides many ingestion options including CSV, TSV, and JSON files.
  • Dados que não serão correlacionados a outros dados em Application Insights ou logs.Data that will not be correlated to any other data under Application Insights or Logs.
  • Os dados que exigem recursos avançados de ingestão ou processamento não estão disponíveis atualmente nos logs de Azure Monitor.Data requiring advanced ingestion or processing capabilities not today available in Azure Monitor Logs.

Passos seguintesNext steps