HTTP データ コレクター API を使用した Azure Monitor へのログ データの送信 (パブリック プレビュー)Send log data to Azure Monitor with the HTTP Data Collector API (public preview)

この記事では、HTTP データ コレクター API を使用して REST API クライアントから Azure Monitor にログ データを送信する方法を示します。This article shows you how to use the HTTP Data Collector API to send log data to Azure Monitor from a REST API client. ここでは、スクリプトまたはアプリケーションによって収集されたデータの形式を設定して要求に含め、その要求を 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. PowerShell、C#、および Python の例を示します。Examples are provided for PowerShell, C#, and Python.

注意

この記事は最近、Log Analytics ではなく Azure Monitor ログという用語を使うように更新されました。This article was recently updated to use the term Azure Monitor logs instead of Log Analytics. ログ データは引き続き Log Analytics ワークスペースに格納され、同じ Log Analytics サービスによって収集されて分析されます。Log data is still stored in a Log Analytics workspace and is still collected and analyzed by the same Log Analytics service. Azure Monitor のログの役割をより適切に反映させるために、用語を更新しています。We are updating the terminology to better reflect the role of logs in Azure Monitor. 詳しくは、Azure Monitor の用語の変更に関するページをご覧ください。See Azure Monitor terminology changes for details.

注意

Azure Monitor HTTP データ コレクター API は、パブリック プレビュー段階にあります。The Azure Monitor HTTP Data Collector API is in public preview.

概念Concepts

HTTP データ コレクター API を使用すると、REST API を呼び出すことのできる任意のクライアントから Azure Monitor 内の Log Analytics ワークスペースにログ データを送信できます。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. これは、Azure または別のクラウドから管理データを収集する Azure Automation での Runbook や、Azure Monitor を使用してログ データを統合して分析する他の管理システムが考えられます。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.

Log Analytics ワークスペース内のすべてのデータは、特定のレコード型のレコードとして保存されます。All data in the Log Analytics workspace is stored as a record with a particular record type. HTTP データ コレクター API に送信するデータを、JSON 形式の複数のレコードとして設定します。You format your data to send to the HTTP Data Collector API as multiple records in JSON. データを送信すると、要求ペイロード内の各レコードに対応する個別のレコードがリポジトリ内に作成されます。When you submit the data, an individual record is created in the repository for each record in the request payload.

HTTP データ コレクターの概要

要求を作成するCreate a request

HTTP データ コレクター API を使用するには、JavaScript Object Notation (JSON) で送信するデータを含む POST 要求を作成します。To use the HTTP Data Collector API, you create a POST request that includes the data to send in JavaScript Object Notation (JSON). 次の 3 つの表に、各要求で必要な属性の一覧を示します。The next three tables list the attributes that are required for each request. この記事の後半で、各属性についてより詳しく説明します。We describe each attribute in more detail later in the article.

要求 URIRequest URI

AttributeAttribute プロパティProperty
MethodMethod POSTPOST
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
Content typeContent type application/jsonapplication/json

要求 URI のパラメーターRequest URI parameters

パラメーターParameter 説明Description
CustomerIDCustomerID Log Analytics ワークスペースの一意識別子です。The unique identifier for the Log Analytics workspace.
リソースResource API のリソース名は "/api/logs" です。The API resource name: /api/logs.
API VersionAPI Version この要求で使用する API のバージョン。The version of the API to use with this request. 現時点では "2016-04-01" です。Currently, it's 2016-04-01.

要求ヘッダーRequest headers

ヘッダーHeader 説明Description
AuthorizationAuthorization 承認の署名。The authorization signature. HMAC-SHA256 ヘッダーの作成方法については、この記事の後半で説明します。Later in the article, you can read about how to create an HMAC-SHA256 header.
Log-TypeLog-Type 送信中のデータのレコード型を指定します。Specify the record type of the data that is being submitted. 文字、数字、アンダースコア () のみを含めることができ、100 文字を超えることはできません。Can only contain letters, numbers, and underscore (), and may not exceed 100 characters.
x-ms-datex-ms-date RFC 1123 形式による、要求が処理された日付。The date that the request was processed, in RFC 1123 format.
x-ms-AzureResourceIdx-ms-AzureResourceId データを関連付ける必要がある Azure リソースのリソース ID。Resource ID of the Azure resource the data should be associated with. これにより、_ResourceId プロパティに値が設定され、リソース コンテキスト クエリにデータを含めることができます。This populates the _ResourceId property and allows the data to be included in resource-context queries. このフィールドが指定されない場合、リソース コンテキスト クエリにデータは含まれません。If this field isn't specified, the data will not be included in resource-context queries.
time-generated-fieldtime-generated-field データ項目のタイムスタンプを含む、データ内のフィールドの名前。The name of a field in the data that contains the timestamp of the data item. フィールドを指定すると、フィールドのコンテンツは TimeGenerated の値に使用されます。If you specify a field then its contents are used for TimeGenerated. このフィールドを指定しない場合、TimeGenerated の既定値は、メッセージが取り込まれた時刻になります。If this field isn’t specified, the default for TimeGenerated is the time that the message is ingested. メッセージ フィールドのコンテンツは、ISO 8601 形式 (YYYY-MM-DDThh:mm:ssZ) である必要があります。The contents of the message field should follow the ISO 8601 format YYYY-MM-DDThh:mm:ssZ.

AuthorizationAuthorization

Azure Monitor HTTP データ コレクター API への要求には、Authorization ヘッダーを含める必要があります。Any request to the Azure Monitor HTTP Data Collector API must include an authorization header. 要求を認証するには、その要求を行っているワークスペースの主キーまたはセカンダリ キーのどちらかを使用して、要求に署名する必要があります。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. 次に、その署名を要求の一部として渡します。Then, pass that signature as part of the request.

承認ヘッダーの形式を次に示します。Here's the format for the authorization header:

Authorization: SharedKey <WorkspaceID>:<Signature>

WorkspaceID は、Log Analytics ワークスペースの一意識別子です。WorkspaceID is the unique identifier for the Log Analytics workspace. Signature は、要求で構築されてから、SHA256 アルゴリズムを使用して計算されるハッシュベース メッセージ認証コード (HMAC) です。Signature is a Hash-based Message Authentication Code (HMAC) that is constructed from the request and then computed by using the SHA256 algorithm. このコードを Base64 エンコーディングを使用してエンコードします。Then, you encode it by using Base64 encoding.

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

署名文字列の例を次に示します。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

署名文字列がある場合、UTF-8 でエンコードされた文字列で HMAC-SHA256 アルゴリズムを使用してエンコードしてから、その結果を 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 this format:

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

次のセクションのサンプルには、承認ヘッダーを作成するのに役立つサンプル コードが含まれています。The samples in the next sections have sample code to help you create an authorization header.

要求本文Request body

メッセージの本文は JSON 形式である必要があります。The body of the message must be in JSON. ここには、プロパティ名と値がペアになったレコードを、次の形式で 1 つ以上含める必要があります。It must include one or more records with the property name and value pairs in the following format. プロパティ名には、文字、数字、アンダースコア () のみを使用できます。The property name can only contain letters, numbers, and underscore ().

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

次の形式を使用して複数のレコードを 1 つの要求にまとめることができます。You can batch multiple records together in a single request by using the following format. すべてのレコードは同じレコード型である必要があります。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"
    }
]

レコードの型とプロパティRecord type and properties

Azure Monitor HTTP データ コレクター API 経由でデータを送信する場合、カスタム レコード型を定義します。You define a custom record type when you submit data through the Azure Monitor HTTP Data Collector API. 現時点では、他のデータ型およびソリューションによって作成された既存のレコード型にデータを書き込むことはできません。Currently, you can't write data to existing record types that were created by other data types and solutions. Azure Monitor では受信データを読み取り、入力した値のデータ型に一致するプロパティを作成します。Azure Monitor reads the incoming data and then creates properties that match the data types of the values that you enter.

データ コレクター API への各要求には、レコード型の名前が付いた Log-Type ヘッダーを含める必要があります。Each request to the Data Collector API must include a Log-Type header with the name for the record type. サフィックス _CL は、カスタム ログと他のログの種類を区別するために、入力した名前の最後に自動的に追加されます。The suffix _CL is automatically appended to the name you enter to distinguish it from other log types as a custom log. たとえば、名前を「MyNewRecordType」と入力した場合、Azure Monitor では MyNewRecordType_CL という型のレコードが作成されます。For example, if you enter the name MyNewRecordType, Azure Monitor creates a record with the type MyNewRecordType_CL. これにより、ユーザーが作成した型名と現在または将来の Microsoft ソリューションで提供される型名が競合することはありません。This helps ensure that there are no conflicts between user-created type names and those shipped in current or future Microsoft solutions.

プロパティのデータ型を識別するために、Azure Monitor では、プロパティ名にサフィックスを追加します。To identify a property's data type, Azure Monitor adds a suffix to the property name. プロパティに null 値が含まれる場合、そのプロパティはレコードには含まれません。If a property contains a null value, the property is not included in that record. 次の表に、プロパティのデータ型と対応するサフィックスの一覧を示します。This table lists the property data type and corresponding suffix:

プロパティのデータ型Property data type サフィックスSuffix
stringString _s_s
BooleanBoolean _b_b
DoubleDouble _d_d
Date/timeDate/time _t_t
GUID (文字列として格納)GUID (stored as a string) _g_g

Azure Monitor において各プロパティに対して使用されるデータ型は、新しいレコードのレコード型が既に存在するかどうかによって異なります。The data type that Azure Monitor uses for each property depends on whether the record type for the new record already exists.

  • レコード型が存在しない場合、Azure Monitor では、新しいレコードの各プロパティのデータ型を判定するために JSON 型の推定を利用して、新しく作成します。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.
  • レコード型が存在する場合、Azure Monitor では、既存のプロパティに基づいて新しいレコードの作成を試行します。If the record type does exist, Azure Monitor attempts to create a new record based on existing properties. 新しいレコードにおいてプロパティのデータ型が既存の型と一致せず、既存の型に変換することもできない場合や、存在しないプロパティがレコードに含まれる場合、Azure Monitor によって関連性のあるサフィックスを持つ新しいプロパティが作成されます。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.

たとえば、次のような送信エントリには、number_dboolean_bstring_s の 3 つのプロパティを持つレコードが作成されます。For example, this submission entry would create a record with three properties, number_d, boolean_b, and string_s:

サンプル レコード 1

次に、すべての値が文字列で記述された下記のようなエントリを送信する場合、プロパティは変更されません。If you then submitted this next entry, with all values formatted as strings, the properties would not change. これらの値は、既存のデータ型に変換されます。These values can be converted to existing data types:

サンプル レコード 2

しかし、下記のような送信を行った場合、Azure Monitor では、boolean_d および string_d という新しいプロパティを作成します。But, if you then made this next submission, Azure Monitor would create the new properties boolean_d and string_d. これらの値は、既存のデータ型に変換できません。These values can't be converted:

サンプル レコード 3

次に、レコード型が作成される前に、下記のようなエントリを送信した場合、Azure Monitor では number_sboolean_s、および string_s という 3 つのプロパティを含むレコードが作成されます。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. このエントリでは、初期の値はそれぞれ文字列の形式で指定されています。In this entry, each of the initial values is formatted as a string:

サンプル レコード 4

予約済みプロパティReserved properties

次のプロパティは予約済みであり、カスタム レコードの種類で使用することはできません。The following properties are reserved and should not be used in a custom record type. これらのプロパティ名のいずれかがペイロードに含まれている場合、エラーが表示されます。You will receive an error if your payload includes any of these property names.

  • tenanttenant

データ制限Data limits

Azure Monitor データ収集の API に送信するデータに関しては、いくつかの制約があります。There are some constraints around the data posted to the Azure Monitor Data collection API.

  • Azure Monitor データ コレクター API に対する送信ごとの上限は 30 MB です。Maximum of 30 MB per post to Azure Monitor Data Collector API. これは 1 回の送信のサイズ制限です。This is a size limit for a single post. 1 回の送信のデータ サイズが 30 MB を超える場合は、データを小さなサイズのチャンクに分割し、それらを同時に送信する必要があります。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.
  • フィールド値の上限は 32 KB です。Maximum of 32 KB limit for field values. フィールド値が 32 KB を超えた場合、データは切り捨てられます。If the field value is greater than 32 KB, the data will be truncated.
  • 特定の種類のフィールドの推奨される最大数は 50 個です。Recommended maximum number of fields for a given type is 50. これは、使いやすさと検索エクスペリエンスの観点からの実質的な制限です。This is a practical limit from a usability and search experience perspective.
  • Log Analytics ワークスペース内のテーブルでは、最大で 500 列のみがサポートされます (この記事では、フィールドとして参照されます)。A table in a Log Analytics workspace only supports up to 500 columns (referred to as a field in this article).
  • 列名の最大文字数は 500 です。The maximum number of characters for the column name is 500.

リターン コードReturn codes

HTTP 状態コード 200 は、要求が処理するために受信されたことを意味します。The HTTP status code 200 means that the request has been received for processing. これは、操作が正常に完了したことを示します。This indicates that the operation completed successfully.

次の表に、サービスから返される可能性のあるすべての状態コードの一覧を示します。This table lists the complete set of status codes that the service might return:

コードCode StatusStatus エラー コードError code 説明Description
200200 OKOK 要求は正常に受け入れられました。The request was successfully accepted.
400400 正しくない要求Bad request InactiveCustomerInactiveCustomer このワークスペースは閉じられています。The workspace has been closed.
400400 正しくない要求Bad request InvalidApiVersionInvalidApiVersion 指定した API のバージョンがサービスに認識されませんでした。The API version that you specified was not recognized by the service.
400400 正しくない要求Bad request InvalidCustomerIdInvalidCustomerId 指定したワークスペース ID が無効です。The workspace ID specified is invalid.
400400 正しくない要求Bad request InvalidDataFormatInvalidDataFormat 無効な JSON が送信されました。Invalid JSON was submitted. 応答本文に、このエラーを解決する方法に関する詳細が含まれていることがあります。The response body might contain more information about how to resolve the error.
400400 正しくない要求Bad request InvalidLogTypeInvalidLogType 指定したログの種類に、特殊文字または数字が含まれていました。The log type specified contained special characters or numerics.
400400 正しくない要求Bad request MissingApiVersionMissingApiVersion API のバージョンが指定されていませんでした。The API version wasn’t specified.
400400 正しくない要求Bad request MissingContentTypeMissingContentType コンテンツの種類が指定されていませんでした。The content type wasn’t specified.
400400 正しくない要求Bad request MissingLogTypeMissingLogType 必須の値であるログの種類が指定されていませんでした。The required value log type wasn’t specified.
400400 正しくない要求Bad request UnsupportedContentTypeUnsupportedContentType コンテンツの種類が application/json に設定されていませんでした。The content type was not set to application/json.
403403 ForbiddenForbidden InvalidAuthorizationInvalidAuthorization サービスで要求を認証できませんでした。The service failed to authenticate the request. ワークスペース ID と接続キーが有効であるかどうかを確認してください。Verify that the workspace ID and connection key are valid.
404404 見つかりませんNot Found 指定された URL が正しくないか、要求が大きすぎます。Either the URL provided is incorrect, or the request is too large.
429429 要求が多すぎますToo Many Requests サービスはアカウントの大量のデータを処理しています。The service is experiencing a high volume of data from your account. 後で要求を再試行してください。Please retry the request later.
500500 内部サーバー エラーInternal Server Error UnspecifiedErrorUnspecifiedError サービスで内部エラーが発生しました。The service encountered an internal error. 要求を再試行してください。Please retry the request.
503503 サービス利用不可Service Unavailable ServiceUnavailableServiceUnavailable サービスは現在、要求を受信できません。The service currently is unavailable to receive requests. 要求を再試行してください。Please retry your request.

データのクエリを実行するQuery data

Azure Monitor HTTP データ コレクター API によって送信されたデータを照会するには、Type (指定した LogType の値の末尾に _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. たとえば、MyCustomLog を使用した場合、MyCustomLog_CL があるすべてのレコードが返されます。For example, if you used MyCustomLog, then you'd return all records with MyCustomLog_CL.

サンプルの要求Sample requests

以降のセクションでは、さまざまなプログラミング言語を使用して Azure Monitor HTTP データ コレクター API にデータを送信する方法のサンプルを示します。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.

サンプルごとに、次の手順を実行して承認ヘッダーの変数を設定します。For each sample, do these steps to set the variables for the authorization header:

  1. Azure Portal で、Log Analytics ワークスペースを検索します。In the Azure portal, locate your Log Analytics workspace.
  2. [詳細設定] を選択し、 [接続されたソース] を選択します。Select Advanced Settings and then Connected Sources.
  3. [ワークスペース ID] の右側にあるコピー アイコンを選択し、Customer ID 変数の値としてその 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. [主キー] の右側にあるコピー アイコンを選択し、Shared Key 変数の値としてその ID を貼り付けます。To the right of Primary Key, select the copy icon, and then paste the ID as the value of the Shared Key variable.

別の方法として、ログの種類および JSON データの変数を変更することもできます。Alternatively, you can change the variables for the log type and JSON data.

PowerShell のサンプルPowerShell 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  

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);
            }
        }
    }
}

Python 2 のサンプルPython 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)

代替手段と考慮事項Alternatives and considerations

Data Collector API は、自由形式のデータを Azure ログに収集する際のほとんどのニーズに対応しますが、この 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. 主な考慮事項を含め、すべてのオプションを以下に示します。All your options are as follows, major considerations included:

代替手段Alternative 説明Description 最も適しているデータBest suited for
カスタム イベント: Application Insights でのネイティブ SDK ベースのインジェストCustom events: Native SDK-based ingestion in Application Insights 通常はアプリケーション内で SDK を使用してインストルメント化される Application Insights では、カスタム イベントを使用してカスタム データを送信できます。Application Insights, typically instrumented through an SDK within your application, offers the ability for you to send custom data through Custom Events.
  • アプリケーション内で生成されるが、SDK によって既定のデータの種類 (要求、依存関係、例外など) のいずれかとして取得されないデータ。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).
  • Application Insights で他のアプリケーション データに最も頻繁に関連付けられるデータ。Data that is most often correlated to other application data in Application Insights
Azure Monitor ログの Data Collector APIData Collector API in Azure Monitor Logs Azure Monitor ログの Data Collector API は、データを取り込むための完全に拡張可能な方法です。The Data Collector API in Azure Monitor Logs is a completely open-ended way to ingest data. JSON オブジェクト形式のデータはすべてここで送信できます。Any data formatted in a JSON object can be sent here. 送信されたデータが処理され、ログ内の他のデータや他の 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.

データは、ファイルとして Azure BLOB に簡単にアップロードできます。これらのファイルは Azure BLOB で処理され、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. このようなパイプラインの実装例については、こちらの記事をご覧ください。Please see this article for a sample implementation of such a pipeline.
  • Application Insights 内でインストルメント化されたアプリケーション内で必ずしも生成されるわけではないデータ。Data that is not necessarily generated within an application instrumented within Application Insights.
  • 例として、ルックアップ テーブル、ファクト テーブル、参照データ、事前に集計された統計などがあります。Examples include lookup and fact tables, reference data, pre-aggregated statistics, and so on.
  • 他の Azure Monitor データ (Application Insights、ログの他の種類のデータ、Security Center、コンテナー/VM 用 Azure Monitor など) と相互参照されるデータ。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).
Azure Data ExplorerAzure Data Explorer Azure Data Explorer (ADX) は、Application Insights Analytics と Azure Monitor ログを強化するデータ プラットフォームです。Azure Data Explorer (ADX) is the data platform that powers Application Insights Analytics and Azure Monitor Logs. 一般提供 ("GA") が開始されたこのデータ プラットフォームを raw 形式で使用すると、クラスターに対する完全な柔軟性 (RBAC、リテンション率、スキーマなど) が得られます (ただし、管理オーバーヘッドが必要になります)。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). ADX には、CSV、TSV、JSON の各ファイルを含め、多数のインジェスト オプションが用意されています。ADX provides many ingestion options including CSV, TSV, and JSON files.
  • Application Insights またはログで他のどのデータにも関連付けられないデータ。Data that will not be correlated to any other data under Application Insights or Logs.
  • Azure Monitor ログで現在提供されていない高度なインジェスト機能や処理機能を必要とするデータ。Data requiring advanced ingestion or processing capabilities not today available in Azure Monitor Logs.

次の手順Next steps