Instale a biblioteca de clientes de Ingestão do Azure Monitor e a biblioteca de identidade do Azure. A biblioteca de Identidade do Azure é necessária para a autenticação usada neste exemplo.
Crie as variáveis de ambiente a seguir com valores para o seu aplicativo do Microsoft Entra. Esses valores são usados pela DefaultAzureCredential na biblioteca de Identidade do Azure.
AZURE_TENANT_ID
AZURE_CLIENT_ID
AZURE_CLIENT_SECRET
Substitua as variáveis no código de exemplo a seguir por valores de DCR. Talvez você também queira substituir os dados de exemplo pelos seus.
using Azure;
using Azure.Core;
using Azure.Identity;
using Azure.Monitor.Ingestion;
// Initialize variables
var endpoint = new Uri("https://my-url.monitor.azure.com");
var ruleId = "dcr-00000000000000000000000000000000";
var streamName = "Custom-MyTableRawData";
// Create credential and client
var credential = new DefaultAzureCredential();
LogsIngestionClient client = new(endpoint, credential);
DateTimeOffset currentTime = DateTimeOffset.UtcNow;
// Use BinaryData to serialize instances of an anonymous type into JSON
BinaryData data = BinaryData.FromObjectAsJson(
new[] {
new
{
Time = currentTime,
Computer = "Computer1",
AdditionalContext = new
{
InstanceName = "user1",
TimeZone = "Pacific Time",
Level = 4,
CounterName = "AppMetric1",
CounterValue = 15.3
}
},
new
{
Time = currentTime,
Computer = "Computer2",
AdditionalContext = new
{
InstanceName = "user2",
TimeZone = "Central Time",
Level = 3,
CounterName = "AppMetric1",
CounterValue = 23.5
}
},
});
// Upload logs
try
{
var response = await client.UploadAsync(ruleId, streamName, RequestContent.Create(data)).ConfigureAwait(false);
if (response.IsError)
{
throw new Exception(response.ToString());
}
Console.WriteLine("Log upload completed using content upload");
}
catch (Exception ex)
{
Console.WriteLine("Upload failed with Exception: " + ex.Message);
}
// Logs can also be uploaded in a List
var entries = new List<object>();
for (int i = 0; i < 10; i++)
{
entries.Add(
new
{
Time = currentTime,
Computer = "Computer" + i.ToString(),
AdditionalContext = new
{
InstanceName = "user" + i.ToString(),
TimeZone = "Central Time",
Level = 3,
CounterName = "AppMetric1" + i.ToString(),
CounterValue = i
}
}
);
}
// Make the request
try
{
var response = await client.UploadAsync(ruleId, streamName, entries).ConfigureAwait(false);
if (response.IsError)
{
throw new Exception(response.ToString());
}
Console.WriteLine("Log upload completed using list of entries");
}
catch (Exception ex)
{
Console.WriteLine("Upload failed with Exception: " + ex.Message);
}
Execute o código e os dados devem chegar ao workspace do Log Analytics em alguns minutos.
Use go get para instalar os logs de ingestão do Azure Monitor e os módulos de cliente do Azure Identity para Go. O módulo de Identidade do Azure é necessária para a autenticação usada neste exemplo.
go get github.com/Azure/azure-sdk-for-go/sdk/monitor/ingestion/azlogs
go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
Crie as variáveis de ambiente a seguir com valores para o seu aplicativo do Microsoft Entra. Esses valores são usados pela DefaultAzureCredential no módulo de Identidade do Azure.
AZURE_TENANT_ID
AZURE_CLIENT_ID
AZURE_CLIENT_SECRET
Substitua as variáveis no código de exemplo a seguir por valores de DCR. Talvez você também queira substituir os dados de exemplo pelos seus.
package main
import (
"context"
"encoding/json"
"strconv"
"time"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/monitor/ingestion/azlogs"
)
// logs ingestion URI
const endpoint = "https://my-url.monitor.azure.com"
// data collection rule (DCR) immutable ID
const ruleID = "dcr-00000000000000000000000000000000"
// stream name in the DCR that represents the destination table
const streamName = "Custom-MyTableRawData"
type Computer struct {
Time time.Time
Computer string
AdditionalContext string
}
func main() {
// creating the client using DefaultAzureCredential
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
//TODO: handle error
}
client, err := azlogs.NewClient(endpoint, cred, nil)
if err != nil {
//TODO: handle error
}
// generating logs
// logs should match the schema defined by the provided stream
var data []Computer
for i := 0; i < 10; i++ {
data = append(data, Computer{
Time: time.Now().UTC(),
Computer: "Computer" + strconv.Itoa(i),
AdditionalContext: "context",
})
}
// marshal data into []byte
logs, err := json.Marshal(data)
if err != nil {
panic(err)
}
// upload logs
_, err = client.Upload(context.TODO(), ruleID, streamName, logs, nil)
if err != nil {
//TODO: handle error
}
}
Execute o código e os dados devem chegar ao workspace do Log Analytics em alguns minutos.
Inclua o pacote de ingestão de logs e o pacote azure-identity da biblioteca de Identidade do Azure. A biblioteca de Identidade do Azure é necessária para a autenticação usada neste exemplo.
Crie as variáveis de ambiente a seguir com valores para o seu aplicativo do Microsoft Entra. Esses valores são usados pela DefaultAzureCredential na biblioteca de Identidade do Azure.
AZURE_TENANT_ID
AZURE_CLIENT_ID
AZURE_CLIENT_SECRET
Substitua as variáveis no código de exemplo a seguir por valores de DCR. Talvez você também queira substituir os dados de exemplo pelos seus.
Use npm para instalar as bibliotecas de cliente ingestão do Azure Monitor e Azure Identity para Python. A biblioteca de Identidade do Azure é necessária para a autenticação usada neste exemplo.
Crie as variáveis de ambiente a seguir com valores para o seu aplicativo do Microsoft Entra. Esses valores são usados pela DefaultAzureCredential na biblioteca de Identidade do Azure.
AZURE_TENANT_ID
AZURE_CLIENT_ID
AZURE_CLIENT_SECRET
Substitua as variáveis no código de exemplo a seguir por valores de DCR. Talvez você também queira substituir os dados de exemplo pelos seus.
Execute o código e os dados devem chegar ao workspace do Log Analytics em alguns minutos.
O código do PowerShell a seguir envia dados para o ponto de extremidade usando conceitos básicos de HTTP REST.
Observação
Este exemplo requer o PowerShell v7.0 ou posterior.
Execute o comando do PowerShell abaixo que adiciona um assembly necessário para o script:
Add-Type -AssemblyName System.Web
Substitua os parâmetros na seção Etapa 0 por valores de seu aplicativo e DCR. Talvez você também queira substituir os dados de exemplo na seção Etapa 2 pelos seus dados.
### Step 0: Set variables required for the rest of the script.
# information needed to authenticate to AAD and obtain a bearer token
$tenantId = "00000000-0000-0000-00000000000000000" #Tenant ID the data collection endpoint resides in
$appId = " 000000000-0000-0000-00000000000000000" #Application ID created and granted permissions
$appSecret = "0000000000000000000000000000000000000000" #Secret created for the application
# information needed to send data to the DCR endpoint
$endpoint_uri = "https://my-url.monitor.azure.com" #Logs ingestion URI for the DCR
$dcrImmutableId = "dcr-00000000000000000000000000000000" #the immutableId property of the DCR object
$streamName = "Custom-MyTableRawData" #name of the stream in the DCR that represents the destination table
### Step 1: Obtain a bearer token used later to authenticate against the DCR.
$scope= [System.Web.HttpUtility]::UrlEncode("https://monitor.azure.com//.default")
$body = "client_id=$appId&scope=$scope&client_secret=$appSecret&grant_type=client_credentials";
$headers = @{"Content-Type"="application/x-www-form-urlencoded"};
$uri = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token"
$bearerToken = (Invoke-RestMethod -Uri $uri -Method "Post" -Body $body -Headers $headers).access_token
### Step 2: Create some sample data.
$currentTime = Get-Date ([datetime]::UtcNow) -Format O
$staticData = @"
[
{
"Time": "$currentTime",
"Computer": "Computer1",
"AdditionalContext": {
"InstanceName": "user1",
"TimeZone": "Pacific Time",
"Level": 4,
"CounterName": "AppMetric1",
"CounterValue": 15.3
}
},
{
"Time": "$currentTime",
"Computer": "Computer2",
"AdditionalContext": {
"InstanceName": "user2",
"TimeZone": "Central Time",
"Level": 3,
"CounterName": "AppMetric1",
"CounterValue": 23.5
}
}
]
"@;
### Step 3: Send the data to the Log Analytics workspace.
$body = $staticData;
$headers = @{"Authorization"="Bearer $bearerToken";"Content-Type"="application/json"};
$uri = "$endpoint_uri/dataCollectionRules/$dcrImmutableId/streams/$($streamName)?api-version=2023-01-01"
$uploadResponse = Invoke-RestMethod -Uri $uri -Method "Post" -Body $body -Headers $headers
Observação
Se você receber um erro Unable to find type [System.Web.HttpUtility]., execute a última linha na seção 1 do script para ter uma correção e execute-a diretamente. Executá-la removendo a marca de comentário como parte do script não resolverá o problema. O comando deve ser executado separadamente.
Execute o script e você verá uma resposta HTTP - 204. Os dados devem chegar ao workspace do Log Analytics em alguns minutos.
Use pip para instalar as bibliotecas de cliente ingestão do Azure Monitor e Azure Identity para Python. A biblioteca de Identidade do Azure é necessária para a autenticação usada neste exemplo.
Crie as variáveis de ambiente a seguir com valores para o seu aplicativo do Microsoft Entra. Esses valores são usados pela DefaultAzureCredential na biblioteca de Identidade do Azure.
AZURE_TENANT_ID
AZURE_CLIENT_ID
AZURE_CLIENT_SECRET
Substitua as variáveis no código de exemplo a seguir por valores de DCR. Talvez você também queira substituir os dados de exemplo na seção Etapa 2 pelos seus dados.
# information needed to send data to the DCR endpoint
endpoint_uri = "https://my-url.monitor.azure.com" # logs ingestion endpoint of the DCR
dcr_immutableid = "dcr-00000000000000000000000000000000" # immutableId property of the Data Collection Rule
stream_name = "Custom-MyTableRawData" #name of the stream in the DCR that represents the destination table
# Import required modules
import os
from azure.identity import DefaultAzureCredential
from azure.monitor.ingestion import LogsIngestionClient
from azure.core.exceptions import HttpResponseError
credential = DefaultAzureCredential()
client = LogsIngestionClient(endpoint=endpoint_uri, credential=credential, logging_enable=True)
body = [
{
"Time": "2023-03-12T15:04:48.423211Z",
"Computer": "Computer1",
"AdditionalContext": {
"InstanceName": "user1",
"TimeZone": "Pacific Time",
"Level": 4,
"CounterName": "AppMetric2",
"CounterValue": 35.3
}
},
{
"Time": "2023-03-12T15:04:48.794972Z",
"Computer": "Computer2",
"AdditionalContext": {
"InstanceName": "user2",
"TimeZone": "Central Time",
"Level": 3,
"CounterName": "AppMetric2",
"CounterValue": 43.5
}
}
]
try:
client.upload(rule_id=dcr_immutableid, stream_name=stream_name, logs=body)
except HttpResponseError as e:
print(f"Upload failed: {e}")
Execute o código e os dados devem chegar ao workspace do Log Analytics em alguns minutos.
Solução de problemas
Esta seção descreve as diferentes condições de erro que você poderá receber e como corrigi-las.
O script retorna o código de erro 403
Verifique se você tem as permissões corretas do aplicativo para a DCR. Talvez você também precise aguardar até 30 minutos até que as permissões se propaguem.
O script retorna o código de erro 413 ou o aviso TimeoutExpired com a mensagem ReadyBody_ClientConnectionAbort na resposta
A mensagem é grande demais. Atualmente, o tamanho máximo da mensagem é de 1 MB por chamada.
O script retorna o código de erro 429
Os limites de API foram excedidos. Atualmente, os limites são definidos como 500 MB de dados por minuto para dados compactados e descompactados e 300.000 solicitações por minuto. Repita após a duração listada no cabeçalho Retry-After na resposta.
O script retorna o código de erro 503
Verifique se você tem as permissões corretas do aplicativo para a DCR. Talvez você também precise aguardar até 30 minutos até que as permissões se propaguem.
Você não recebe um erro, mas os dados não aparecem no workspace
Os dados podem levar algum tempo para serem ingeridos, especialmente na primeira vez que os dados são enviados para uma tabela específica. Não deve levar mais de 15 minutos.
O IntelliSense no Log Analytics não reconhece a nova tabela
O cache que direciona o IntelliSense pode levar até 24 horas para ser atualizado.