Push Metrics RESTAPIを使用したメトリックの取り込み

最終更新日: 16 年 2023 月 XNUMX 日

LogicMonitor Push Metrics REST API を使用すると、単一または複数のリソースおよび DataSource に関連付けられた複数のインスタンスのメトリクスをプログラムで取り込むことができます。

プッシュ メトリクス REST API には、LMv1 API トークンまたはベアラー トークンのいずれかを使用した認証が必要です。 詳細については、「」を参照してください。 APIトークン & ベアラートークン.

詳細依頼フォーム

メトリクス取り込みエンドポイントは、DataSource およびリソースに関連付けられた XNUMX つ以上のインスタンスのメトリクスをプッシュするために使用されます。 リクエストごとにサポートされるリソースとデータソースは XNUMX つだけです。 メトリクスがリソースに初めてプッシュされる場合、このリクエストにより、 新しいデータソース オプションで新しいリソース(パラメーターによって異なります)。

方法ポスト
ベースURLhttps://{ACCOUNTNAME}.logicmonitor.com/rest
パスメートル法/摂取
ヘッダ認可: LMv1 トークンまたはベアラー トークン
(オプション)https://companyxyz.logicmonitor.com/rest/metric/ingest?create = truecreate = trueの場合、提供されたリソースIDに一致するものがない場合、新しいリソースが作成されます。 デフォルト値は「false」です。
コンテンツタイプアプリケーション/ json
{
    「resourceName」:「 ”、//作成フラグが指定されていない場合はオプション             
    「resourceDescription」:「 」、
    “ resourceIds”:{//必須
        「key1」:「value1」、
        “ key2”:“ value2”、…//複数の値が受け入れられます
    },                                                                     
    「resourceProperties」:{
        「key1」:「value1」、
        “key2” : “value2” //複数の値を受け入れます
     },
    「dataSourceId」:「 」// dataSourceIdまたはdataSourceのいずれかが必須
    "情報源": " 」// dataSourceIdまたはdataSourceのいずれかが必須
    「dataSourceDisplayName」:「 」
    「dataSourceGroup」:「 」
    「インスタンス」:[
        {
            「instanceName」:「 "、 //必須
            「instanceDisplayName」:「 」
            「instanceProperties」:{
                「key1」:「value1」、
                「キー2」:「値2」
        },
            「dataPoints」:
            [
                {
                    「dataPointName」:「 "、 //必須
                    「dataPointDescription」:「 」、
                    「dataPointType」:「 」、
                    「dataPointDataType」:「 」、
“値”: { //必須
「エポックタイムスタンプ」:「メトリック値」
}
}
]
}
]
}

リクエストでは、次の必須フィールドとオプションフィールドを使用してください。

フィールド名説明 必須?検証
リソース名リソースの一意の名前。 新しいリソースを作成するときにのみ考慮されます。 文字列createパラメーターがTRUE(create = true)に設定されている場合にのみ必要です。 FALSEがデフォルトです。–255文字の制限
–一意である必要があります
–スペース、タブなどで開始または終了しないでください
–改行を含めないでください
– AZ、az、および0〜9の文字、およびコロン、ハイフン、アンダースコア、ピリオド
–空白は許可されません
リソースの説明リソースの説明。 新しいリソースを作成するときにのみ考慮されます。文字列オプション。 デフォルトは「」です。–65535文字の制限
リソース ID既存のリソース プロパティの配列は、リソースを識別するために使用されます。 使用できるプロパティの種類の詳細については、「 プッシュメトリックを取り込むリソースの管理 使用できるプロパティの種類については、こちらをご覧ください。 一致するリソースがなく、createパラメーターがTRUEに設定されている場合、これらの指定されたリソースIDが設定された新しいリソースが作成されます。 system.displaynameおよび/またはsystem.hostnameプロパティがリソースIDとして含まれている場合、それらは結果のリソースでそれぞれホスト名および表示名として使用されます。
注:  提供されるリソース ID は、既存のリソースと完全または部分的に一致する (論理積、OR) 必要はありません。
JSONオブジェクト必須– プロパティ名と割り当てられた値の形式でキーと値のペアとして入力を受け取ります (たとえば、「system.displayname」:「mcentos」)
–キーと値は文字列です
– 、;を除くすべての文字/ * []? '” `##と改行が許可されます
-開始時または終了時を除いて許可されるスペース
–キーと値に円記号を含めることはできません(\)ヌルのキーと値は使用できません
–キーには255文字の制限があります。 値には24000文字の制限があります
- 大文字小文字を区別しません
リソースのプロパティリソースの新しいプロパティ。 既存のリソースプロパティの更新は考慮されません。 プロパティ名に応じて、これらのプロパティをシステム、自動、また​​はカスタムプロパティに変換します。JSONオブジェクトオプション。 デフォルトは「」です。–入力をプロパティ名と割り当てられた値の形式でキーと値のペアとして受け取ります(例:「バージョン」:「5.0」)
– システム プロパティは許可されません (たとえば、system.xxx)
– 自動プロパティは許可されません (たとえば、auto.xxx)
– 予約済みプロパティは許可されません (例: predef.xxx)
–キーと値は文字列です。、;を除くすべての文字/ * []? '” `##と改行が許可されます
–開始時または終了時を除いて許可されるスペース
–キーと値に円記号(\)を含めることはできません
–ヌルキーと値は許可されていません
–キーには255文字の制限があります。 値には24000文字の制限がありますケースに依存しません
データソースIDデータソースの一意のID。 既存のデータソースを照合するためにのみ使用されます。 指定されたIDに一致する既存のデータソースがない場合、エラーが発生します。
このフィールドをdataSourceフィールドと組み合わせて使用​​する場合、提供されるIDと名前の両方が単一のデータソースと一致する必要があります。一致しない場合はエラーが発生します。
整数dataSourceIdまたはdataSourceのいずれかが必須です。–9桁の制限
–正の整数のみが許可されます
情報源データソースの一意の名前。 既存のデータソースと照合するために使用されます。 ここで指定した名前に一致する既存のデータソースがない場合は、この名前で新しいデータソースが作成されます。
このフィールドをdataSourceIdフィールドと組み合わせて使用​​する場合、指定されたIDと名前の両方が単一のデータソースと一致する必要があります。一致しない場合はエラーが返されます。
文字列dataSourceIdまたはdataSourceのいずれかが必須です。–64文字の制限
–一意である必要があります
– 、;を除くすべての文字/ * []? '” `##と改行が許可されます
–開始時または終了時を除いて許可されるスペース
–ハイフンは最後にのみ許可されます。 ハイフンは、少なくともXNUMXつの他の文字と一緒に使用する必要があります
データソース表示名データソースの表示名。 新しいデータソースを作成するときにのみ考慮されます。文字列任意。
デフォルトはdataSourceです。
–64文字の制限
– 、;を除くすべての文字/ * []? '” `##と改行が許可されます
–開始時または終了時を除いてスペースを使用できます
–キーと値に円記号(\)を含めることはできません
–ハイフンは最後にのみ許可されます。 ハイフンは、少なくともXNUMXつの他の文字と一緒に使用する必要があります
データソースグループデータソースグループ名。 DataSourceがまだグループに属していない場合にのみ考慮されます。 DataSourceグループ内でDataSourceを編成するために使用されます。 一致する既存のデータソースグループがない場合、この名前で新しいグループが作成され、データソースは新しいグループの下に編成されます。文字列任意。
デフォルトは「PushModules」です。
–128文字の制限
– AZ、az、0-9、コロン、ハイフン、アンダースコア、および空白の文字のみをサポートします
–値をnull、空、または末尾にスペースを入れないでください
インスタンスDataSourceインスタンスの配列。JSONオブジェクト必須
インスタンス名インスタンス名。 一致する既存のインスタンスがない場合、この名前で新しいインスタンスが作成されます。文字列必須–255文字の制限
– 、;を除くすべての文字/ * []? '” `##と改行が許可されます
–開始時または終了時を除いて許可されるスペース
–円記号(\)を含めることはできません。
– AZ、az、0-9、コロン、ハイフン、アンダースコア、およびピリオドの文字のみをサポートします
–空白は許可されません
インスタンス表示名インスタンスの表示名。 新しいインスタンスを作成するときにのみ考慮されます。文字列オプション。 デフォルトは{instanceName}です。–255文字の制限
– 、;を除くすべての文字/ * []? '” `##と改行が許可されます
–開始時または終了時を除いて許可されるスペース
–円記号(\)を含めることはできません。*
インスタンスのプロパティたとえば、新しいプロパティ。 既存のインスタンスプロパティの更新は考慮されません。 プロパティ名に応じて、これらのプロパティをシステム、自動、また​​はカスタムプロパティに変換します。JSONオブジェクト任意。
デフォルトは「」です。
–プロパティ名と割り当てられた値の形式でキーと値のペアとして入力を受け取ります
– システム プロパティは許可されません (たとえば、system.xxx)
– 自動プロパティは許可されません (たとえば、auto.xxx)
– 予約済みプロパティは許可されません (例: predef.xxx)
–キーと値は文字列です。、;を除くすべての文字/ * []? '” `##と改行が許可されます
–開始時または終了時を除いて許可されるスペース
–キーと値に円記号(\)を含めることはできません
–キーには255文字の制限があります。 値には24000文字の制限があります
- 大文字小文字を区別しません
–キーと値は、null、空、または末尾にスペースを入れないでください。
データポイント名データポイント名。 指定したデータソースに一致する既存のデータポイントがない場合、この名前で新しいデータポイントが作成されます。文字列必須–128文字の制限
AZ、az、および0〜9の文字のみが許可されます
– COS、SINなどの予約済みキーワードを含めることはできません。
データポイント説明データポイントの説明。 新しいデータポイントを作成するときにのみ考慮されます。文字列任意。
デフォルトは{dataPointName}です。
1024文字制限
データポイントタイプ文字列形式の数値としてのメトリックタイプ。 新しいデータポイントを作成するときにのみ考慮されます。文字列任意。
デフォルトは「ゲージ」です。
–「counter」、「derive」、または「guage」の値のみが受け入れられます
- 大文字小文字を区別しません
dataPointAggregationType集計間隔は XNUMX 分です。
集計は、XNUMX分以内に発生するデータの集計タイプ(合計/平均/なし/最小/最大)に基づいて計算されます。
詳細については、を参照してください。
プッシュメトリクスRESTAPIについて.
文字列任意。
デフォルトは「なし」です。
–「min」、「max」、「none」、「avg」、「sum」、または「percentile」の値のみが受け入れられます
- 大文字小文字を区別しません
パーセント値dataPointAggregationTypeに「percentile」が指定されている場合、このフィールドは、使用するパーセント値を指定するために必要です。整数dataPointAggregationTypeがパーセンタイルの場合に必要–0〜100の整数のパーセンテージ。
例:99 | 95 | 90 | 70 | 50(デフォルトなし)
データポイント値の配列 JSONオブジェクト必須–入力をエポック時間とデータポイント値の形式でキーと値のペアとして受け取ります。 例:「1584902069」:「10」
-キーで受け入れられるのは long 型の値のみです
–値または科学表記法で受け入れられる数字例:4.93e-2、1.89502e202

複数のリソースの取り込みのサポート

  残り/v2/メトリック/取り込み API を使用すると、単一の API 呼び出しで一度に複数のリソースを取り込むことができます。 の 作ります マッチ タイプ API パラメーターは、取り込まれた複数のリソースすべてに適用されます。 

複数のリソースペイロードの取り込み

[
    {
        single resource payload
    },
    {
        single resource payload
    }
]

複数のリソースの応答

{
    "success": false,
    "message": "Some events were not accepted. See the 'errors' property for additional information.",
    "errors" : [
        {
            "code": <custom code>,
            "message": "The request has been accepted for processing, but the processing has not been completed.",
            "resourceIds": {
                "system.displayname": "test088"
            },
        },
        {
            "message": "Resource Name is mandatory.",
            "resourceIds": {
                "system.displayname": "test096"
        },
    }
}

プッシュ メトリクス REST API を使用したメトリクスの取り込みの例

次のPython3の例では、CPU使用率を監視しています。

#!/usr/bin/env python3
import time, os, sys
import hmac, hashlib, base64
import requests
import json
import psutil

#--------------------------------------
# Constants - Do not change
#--------------------------------------
resource_path = '/metric/ingest'
headers =  {
	   'Content-Type': 'application/json'
	  }

#---------------------------------------
# Change Values below as per your setup
#---------------------------------------
def get_params():
	# Account info
	# Your account name
	Company = "ABC"
	# User account Access Id for which it must have permissions to manage resources and manage LogicModules 
	AccessId = "6wDEvh73taGMPP43SSmF"
	AccessKey = 'Q)cfY2w8u[G97jkz5^P8{HT)g-uq[6+E8LL%Mb{^'

	url = "https://"+Company+".logicmonitor.com/rest"+ resource_path
	return url, AccessId, AccessKey


#--------------------------------------------
# Function to send metric data to LM Platform
#--------------------------------------------
def send_metrics(timestamp, body):
		url, AccessId, AccessKey  = get_params()
		req_var =  "POST" + str(timestamp) + body +resource_path;
		signature = base64.b64encode(bytes(hmac.new(
                            bytes(AccessKey, 'latin-1'),
                            bytes(req_var, 'latin-1'),
                            digestmod=hashlib.sha256
                        ).hexdigest(), 'latin-1')).decode('latin-1')
		auth = "LMv1 "+AccessId+ ":"+ signature+":"+str(timestamp)
		headers['Authorization'] =  auth
		try:
			response = requests.post(url, verify=True, headers=headers, data=body,  params={"create":'true'})
			if response.status_code != 202:
				print('Failed to send metric. Error:', response.status_code, response.text)
			else:
				print("SUCCESS :",response.text)
		except Exception as e:
			print("Unable to connect. Error: ", e)

#--------------------------------------------
# Prepare REST payload
#--------------------------------------------
def prepare_request_body(metric, timestamp, data_value):
	return json.dumps({
	    "resourceName": metric["device_name"],
	    "resourceIds": {
			"system.displayname": metric["device_name"],
			"system.ips": metric["device_ip"]
	    },
	    "dataSource": metric["data_source"],
	    "dataSourceDisplayName": metric["data_source"],
	    "instances": [
			{
				"instanceName": metric["instance"],
				"instanceDisplayName": metric["instance"],
				"instanceProperties": {
					"version": "1",
				},
				"dataPoints": [
					{
						"dataPointName": metric["data_point"],
						"dataPointType": "GAUGE",
						"dataPointAggregationType": "sum",
						"values": {
							str(timestamp//1000): data_value
						}
					},
		    	]
			},
	    ]
	}).replace("'", '"')


#------------------
#====  MAIN =======
#------------------
if __name__ == "__main__":
	my_metric = {}
	my_metric["device_name"] = os.uname()[1]
	my_metric["device_ip"] = "192.168.1.1"
	my_metric["data_source"] = "CPU"
	my_metric["instance"] = "cpu-1"
	my_metric["data_point"] = "cpu_utilization"
	while True:
		timestamp = int(time.time()*1000)
		data_value = psutil.cpu_percent()

		body = prepare_request_body(my_metric, timestamp, data_value)
		send_metrics(timestamp, body)
		time.sleep(10)

記事上で