L'étude Forrester Total Economic Impact™ révèle qu'Edwin AI a généré un retour sur investissement de 313 % pour l'organisation composite.

Lire la suite

Vous pouvez utiliser l'API REST LogicMonitor Push Metrics pour ingérer par programmation des métriques pour plusieurs instances associées à une ou plusieurs ressources et sources de données.

L'API REST Push Metrics requiert une authentification via le jeton d'API LMv1 ou le jeton Bearer. Pour plus d'informations, consultez la documentation. Jetons API et Jeton porteur.

Demander des informations

Le point de terminaison d'ingestion de métriques permet d'envoyer les métriques d'une ou plusieurs instances associées à une source de données et à une ressource. Une seule ressource et une seule source de données sont prises en charge par requête. Si c'est la première fois que des métriques sont envoyées à une ressource, cette requête générera une erreur. nouvelle source de données et éventuellement une nouvelle ressource (en fonction des paramètres).

MéthodePubliez
URL de basehttps://{ACCOUNTNAME}.logicmonitor.com/rest
Cheminmétrique/ingestion
En-têteAutorisation : jeton LMv1 ou jeton Bearer
Paramètre(Facultatif)https://companyxyz.logicmonitor.com/rest/metric/ingest?créer=vraiSi la valeur de create est true, une nouvelle ressource sera créée si aucune ressource ne correspond aux identifiants fournis. La valeur par défaut est false.
Content-Typeapplication / json
{
"resourceName": "<Resource name>", //Optional when create flag is not specified
"resourceDescription": "<Resource description>",
"resourceIds" : { //Mandatory
"key1" : "value1",
"key2" : "value2",... //Multi-values accepted
},
"resourceProperties": {
"key1" : "value1",
"key2" : "value2" //Multi-values accepted
},
"dataSourceId": "<DataSource ID>", //Either dataSourceId or dataSource mandatory
"dataSource": "<DataSource Name>", //Either dataSourceId or dataSource mandatory
"dataSourceDisplayName": "<Display Name for the DataSource>",
"dataSourceGroup": "<DataSource Group name>",
"instances":[
{
"instanceName": "<Instance Name>", //Mandatory
"instanceDisplayName": "<Instance display Name>",
"instanceProperties": {
"key1" : "value1",
"key2" : "value2"
},
"dataPoints":
[
{
"dataPointName": "<Datapoint Name>", //Mandatory
"dataPointDescription": "<Datapoint Description>",
"dataPointType": "<Datapoint Metric Type>",
"dataPointDataType": "<Datapoint Data Type>",
"values": { //Mandatory
"Epoch Timepstamp" : "Metric Value"
}
}
]
}
]
}

À noter: Supprimez les commentaires du code avant utilisation. Le format JSON ne prend pas en charge les commentaires ; leur présence rend l’exemple invalide et inutilisable par copier-coller.

Veuillez utiliser les champs obligatoires et facultatifs suivants dans votre demande.

Nom de domaineDescriptionTypeChamps obligatoires?Validation
nom de la ressourceNom unique de la ressource. Pris en compte uniquement lors de la création d'une nouvelle ressource. ChaîneRequis uniquement si le paramètre create est défini sur TRUE (create=true). La valeur par défaut est FALSE.– Limite de 255 caractères
– Doit être unique
– Ne doit pas commencer ni se terminer par des espaces, des tabulations, etc.
– Ne doit pas contenir de sauts de ligne
Les caractères AZ, az et les chiffres de 0 à 9 sont autorisés, ainsi que les deux-points, les tirets, les traits de soulignement et les points.
– Aucun espace blanc autorisé
description de la ressourceDescription de la ressource. Prise en compte uniquement lors de la création d'une nouvelle ressource.ChaîneFacultatif. Par défaut : « ».– Limite de 65535 caractères
identifiants de ressourcesUn ensemble de propriétés de ressources existantes est utilisé pour identifier la ressource. Pour plus d'informations sur les types de propriétés utilisables, consultez Gestion des ressources qui ingèrent des métriques push Pour plus d'informations sur les types de propriétés utilisables, consultez la documentation. Si aucune ressource ne correspond et que le paramètre de création est défini sur VRAI, une nouvelle ressource est créée avec les identifiants spécifiés. Si les propriétés `system.displayname` et/ou `system.hostname` sont incluses comme identifiants de ressource, elles seront utilisées respectivement comme nom d'hôte et nom d'affichage dans la ressource résultante.
À noter:  Les identifiants de ressources fournis n'ont pas besoin de correspondre totalement ou partiellement (ET logique, OU) aux ressources existantes.
Objet JSONRequis– Prend en entrée des paires clé-valeur sous la forme d'un nom de propriété et d'une valeur assignée (par exemple, « system.displayname » : « mcentos »)
– Les clés et les valeurs sont des chaînes de caractères
Tous les caractères sont autorisés, à l'exception de , ; / * [ ] ? ' ” ` ## et du saut de ligne.
-Espaces autorisés sauf au début ou à la fin
Les clés et les valeurs ne doivent pas contenir de barres obliques inverses (\). Les clés et valeurs nulles ne sont pas autorisées.
– Les clés sont limitées à 255 caractères ; les valeurs sont limitées à 24 000 caractères.
– Insensible à la casse
Propriétés de la ressourceNouvelles propriétés pour la ressource. Les mises à jour des propriétés existantes ne sont pas prises en compte. Selon leur nom, ces propriétés seront converties en propriétés système, automatiques ou personnalisées.Objet JSONFacultatif. Par défaut : « ».– Prend en entrée des paires clé-valeur sous la forme d'un nom de propriété et d'une valeur attribuée (Exemple : « version » : « 5.0 »)
– Les propriétés système ne sont pas autorisées (par exemple, system.xxx).
– Les propriétés automatiques ne sont pas autorisées (par exemple, auto.xxx).
– Les propriétés réservées ne sont pas autorisées (par exemple, predef.xxx).
Les clés et les valeurs sont des chaînes de caractères. Tous les caractères sont autorisés, à l'exception de , ; / * [ ] ? ' ” ` ## et du saut de ligne.
– Espaces autorisés sauf au début ou à la fin
– Les clés et les valeurs ne doivent pas contenir de barres obliques inverses (\).
Les clés et valeurs nulles ne sont pas autorisées.
Les clés sont limitées à 255 caractères ; les valeurs, à 24 000 caractères. La casse n'est pas prise en compte.
dataSourceIdIdentifiant unique de la source de données. Utilisé uniquement pour faire correspondre une source de données existante. Si aucune source de données existante ne correspond à l'identifiant fourni, une erreur se produit.
Si ce champ est utilisé en combinaison avec le champ dataSource, l'ID et le nom fournis doivent correspondre à une seule et même source de données, sous peine de générer une erreur.
EntierL'un des champs dataSourceId ou dataSource est obligatoire.– limite à 9 chiffres
Seuls les nombres entiers positifs sont autorisés.
source de donnéesNom unique de la source de données. Permet de faire correspondre une source de données existante. Si aucune source de données existante ne correspond au nom indiqué ici, une nouvelle source de données est créée avec ce nom.
Si ce champ est utilisé en combinaison avec le champ dataSourceId, l'ID et le nom fournis doivent correspondre à une seule et même source de données, sinon une erreur sera renvoyée.
ChaîneL'un des champs dataSourceId ou dataSource est obligatoire.– Limite de 64 caractères
– Doit être unique
Tous les caractères sont autorisés, à l'exception de , ; / * [ ] ? ' ” ` ## et du saut de ligne.
– Espaces autorisés sauf au début ou à la fin
– Le trait d’union n’est autorisé qu’à la fin ; il doit être associé à au moins un autre caractère.
Nom d'affichage de la source de donnéesNom d'affichage de la source de données. Pris en compte uniquement lors de la création d'une nouvelle source de données.ChaîneOptionnel.
Par défaut, la source de données.
– Limite de 64 caractères
Tous les caractères sont autorisés, à l'exception de , ; / * [ ] ? ' ” ` ## et du saut de ligne.
Les espaces sont autorisés sauf au début et à la fin.
– Les clés et les valeurs ne doivent pas contenir de barres obliques inverses (\).
– Le trait d’union n’est autorisé qu’à la fin ; il doit être associé à au moins un autre caractère.
dataSourceGroupNom du groupe de sources de données. Ce nom est pris en compte uniquement si la source de données n'appartient à aucun groupe. Il permet d'organiser la source de données au sein d'un groupe. Si aucun groupe existant ne correspond, un nouveau groupe est créé avec ce nom et la source de données y est intégrée.ChaîneOptionnel.
Par défaut, « PushModules ».
– Limite de 128 caractères
– Prend uniquement en charge les caractères AZ, az, 0-9, deux-points, tiret, trait de soulignement et espaces.
– Les valeurs ne doivent pas être nulles, vides ou comporter d'espaces de fin.
casUn tableau d'instances DataSource.Objet JSONRequis
nom_instanceNom de l'instance. Si aucune instance existante ne correspond, une nouvelle instance est créée sous ce nom.ChaîneRequis– Limite de 255 caractères
Tous les caractères sont autorisés, à l'exception de , ; / * [ ] ? ' ” ` ## et du saut de ligne.
– Espaces autorisés sauf au début ou à la fin
– Ne doit pas contenir de barres obliques inverses (\).
– Prend uniquement en charge les caractères suivants : AZ, az, 0 à 9, deux-points, tiret, trait de soulignement et point.
– Aucun espace blanc autorisé
instanceDisplayNameNom d'affichage de l'instance. Pris en compte uniquement lors de la création d'une nouvelle instance.ChaîneFacultatif. Par défaut : {instanceName}.– Limite de 255 caractères
Tous les caractères sont autorisés, à l'exception de , ; / * [ ] ? ' ” ` ## et du saut de ligne.
– Espaces autorisés sauf au début ou à la fin
– Ne doit pas contenir de barres obliques inverses (\).*
propriété_instancePar exemple, les nouvelles propriétés. Les mises à jour des propriétés d'instance existantes ne sont pas prises en compte. Selon le nom de la propriété, nous la convertirons en propriété système, automatique ou personnalisée.Objet JSONOptionnel.
Par défaut, la valeur est « ».
– Prend en entrée des paires clé-valeur, sous la forme d'un nom de propriété et d'une valeur assignée.
– Les propriétés système ne sont pas autorisées (par exemple, system.xxx).
– Les propriétés automatiques ne sont pas autorisées (par exemple, auto.xxx).
– Les propriétés réservées ne sont pas autorisées (par exemple, predef.xxx).
Les clés et les valeurs sont des chaînes de caractères. Tous les caractères sont autorisés, à l'exception de , ; / * [ ] ? ' ” ` ## et du saut de ligne.
– Espaces autorisés sauf au début ou à la fin
– Les clés et les valeurs ne doivent pas contenir de barres obliques inverses (\).
– Les clés sont limitées à 255 caractères ; les valeurs sont limitées à 24 000 caractères.
– Insensible à la casse
Les clés et les valeurs ne doivent pas être nulles, vides ou comporter d'espaces de fin.
nom du point de donnéesNom du point de données. Si aucun point de données existant ne correspond à la source de données spécifiée, un nouveau point de données est créé sous ce nom.ChaîneRequis– Limite de 128 caractères
Seuls les caractères AZ, az et 0-9 sont autorisés.
– Ne doit pas contenir de mots clés réservés tels que COS, SIN, etc.
description du point de donnéesDescription du point de données. Prise en compte uniquement lors de la création d'un nouveau point de données.ChaîneOptionnel.
Par défaut, {dataPointName}.
1024-limite de caractères
type de point de donnéesType de mesure sous forme de nombre (chaîne de caractères). Pris en compte uniquement lors de la création d'un nouveau point de données.ChaîneOptionnel.
Par défaut, « jauge ».
Seules les valeurs « counter », « deriv » ou « gauge » sont acceptées.
– Insensible à la casse
type d'agrégation des points de donnéesL'intervalle d'agrégation est d'une minute.
L'agrégation est calculée en fonction du type d'agrégation (somme/moyenne/aucune/min/max) des données survenant dans une minute.
Pour plus d'informations, voir
À propos de l'API REST Push Metrics.
ChaîneOptionnel.
Par défaut, « aucun ».
Seules les valeurs « min », « max », « none », « avg », « sum » ou « percentile » sont acceptées.
– Insensible à la casse
valeur du percentileSi « percentile » est spécifié pour dataPointAggregationType, ce champ est obligatoire pour spécifier la valeur de pourcentage à utiliser.EntierRequis lorsque dataPointAggregationType est un percentile– Tout pourcentage entier compris entre 0 et 100.
Exemple : 99|95|90|70|50 (pas de valeur par défaut)
valeursUn tableau de valeurs de points de données Objet JSONRequis– Prend en entrée des paires clé-valeur au format temps Unix et valeur du point de données. Exemple : « 1584902069 » : « 10 »
Seules les valeurs de type long sont acceptées dans les clés.
– Les chiffres sont acceptés sous forme numérique ou scientifique. Exemple : 4.93e-2, 1.89502e202

Prise en charge de l'ingestion de ressources multiples

Le rest/v2/metric/ingest L'API permet l'ingestion de plusieurs ressources simultanément en un seul appel d'API. créer des  et type de correspondance Les paramètres de l'API s'appliquent à toutes les ressources ingérées. 

Ingestion de charges utiles à ressources multiples

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

Réponse à ressources multiples

{
    "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"
        },
    }
}

Exemple d'ingestion de métriques à l'aide de l'API REST Push Metrics

L'exemple Python 3 suivant surveille l'utilisation du processeur.

#!/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 = "<enter your access ID>"
	AccessKey = '<enter your access key>'

	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)