次の方法で共有


Logs ingestion API を使用して Azure Monitor にデータを送信するサンプル コード

この記事では、Logs ingestion API を使用したサンプル コードについて説明します。 各サンプルでは、コードを実行する前に、次のコンポーネントを作成する必要があります。 これらの各サンプルをサポートするように構成されたこれらのコンポーネントを作成する完全なチュートリアルについては、「チュートリアル: Logs ingestion API (Resource Manager テンプレート) を使って Azure Monitor にデータを送信する」を参照してください。

  • Log Analytics ワークスペースのカスタム テーブル
  • データをターゲット テーブルに転送するためのデータ収集ルール (DCR)
  • DCR にアクセスできる Microsoft Entra アプリケーション
  • プライベート リンクを使用している場合は、データ収集エンドポイント (DCE) を使用します。 それ以外の場合は、DCR ログ エンドポイントを使用します。

サンプル コード

次のスクリプトでは、.NET 用 Azure Monitor Ingestion クライアント ライブラリを使用しています。

  1. Azure Monitor Ingestion クライアント ライブラリと Azure Identity ライブラリをインストールします。 このサンプルで使用される認証には、Azure Identity ライブラリが必要です。

    dotnet add package Azure.Identity
    dotnet add package Azure.Monitor.Ingestion
    
  2. Microsoft Entra アプリケーションの値を使用して、次の環境変数を作成します。 これらの値は、Azure Identity ライブラリの DefaultAzureCredential で使用されます。

    • AZURE_TENANT_ID
    • AZURE_CLIENT_ID
    • AZURE_CLIENT_SECRET
  3. 次のサンプル コードの変数を、DCR の値に置き換えます。 サンプル データも独自のものに置き換えることをお勧めします。

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 LogsIngestionClient(endpoint, credential);

DateTime currentTime = DateTime.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
{
   // ===== START: Use this block of code to upload compressed data
   byte[] dataBytes = data.ToArray();
   
   string contentEncoding = "gzip"; // Specify gzip if the content is already compressed

   using (MemoryStream memoryStream = new MemoryStream())
   {
	using (GZipStream gzipStream = new GZipStream(memoryStream, CompressionMode.Compress))
	{
	   gzipStream.Write(dataBytes, 0, dataBytes.Length);
	}
	byte[] gzipBytes = memoryStream.ToArray();

	var response = await client.UploadAsync(ruleId, streamName, RequestContent.Create(gzipBytes), contentEncoding).ConfigureAwait(false);
	if (response.IsError)
	{
	   throw new Exception(response.ToString());
	}
   }
   // ===== End: code block to upload compressed data
 
   //** ===== START: Use this block of code to upload uncompressed data.
   var response = await client.UploadAsync(ruleId, streamName, RequestContent.Create(data)).ConfigureAwait(false);
   if (response.IsError)
   {
	throw new Exception(response.ToString());
   }
   //** ===== End: code block to upload uncompressed data.

}
catch (Exception ex)
{
	Console.WriteLine("Upload failed with Exception: " + ex.Message);
}
  1. コードを実行します。データは数分以内に Log Analytics ワークスペースに到着するはずです。

トラブルシューティング

このセクションでは、発生する可能性があるさまざまなエラー状態とその修正方法について説明します。

エラー 説明
エラー コード 403 DCR に対する適切なアクセス許可がアプリケーションにあることを確認します。 また、アクセス許可が反映されるまでに最大 30 分待つ必要がある場合もあります。
エラー コード 413、または TimeoutExpired の警告と応答の ReadyBody_ClientConnectionAbort メッセージ メッセージが大きすぎます。 最大メッセージ サイズは、1 回の呼び出しで現在 1 MB です。
エラー コード 429 API の制限を超えました。 現在、設定されている制限は、圧縮データと非圧縮データの両方について 500 MB/分と 300,000 要求/分です。 応答の Retry-After ヘッダーに示されている期間の後に再試行します。
データなし 特にデータが特定のテーブルに初めて送信される場合は、データが取り込まれるまでに時間がかかることがあります。 15 分を超えることはありません。
Log Analytics の IntelliSense では、新しいテーブルが認識されません。 IntelliSense を動作させるキャッシュは、更新に最大 24 時間かかる場合があります。

次のステップ