API Guide de scénario
Instana API référence du script
Le script Instana API interagit avec le service Instana API afin d'effectuer des opérations qui améliorent les capacités de surveillance de Instana. Le script « API » prend en charge la version 22 d' Node.js, grâce au système de modules « CommonJS ». L'ESM n'est pas pris en charge.
Variables globales
Le script « Instana » d' API utilise les variables globales prédéfinies suivantes pour accélérer le développement de scripts :
| API | Informations |
|---|---|
$got |
Envoyer une requête « HTTP » via le module got |
$http |
Envoyer une requête « HTTP » via le module de requêtes (obsolète) |
$secure |
Droits d'accès de l'utilisateur |
$attributes |
Gérer les attributs personnalisés |
$network |
Configurer un proxy à l'aide de cet utilitaire réseau |
$synthetic |
Variables d'environnement d'accès |
$util |
Utiliser des fonctions d'utilitaire, telles que des API de sécurité |
$got
Pour remplacer $http à l'avenir, utilisez la $got variable pour envoyer une requête d' HTTP depuis Synthetic PoP 1.0.13. Cette variable utilise le module got .
Pour plus d'informations sur la manière d'envoyer différents types de requêtes d' HTTP$got, consultez la section « Rédaction d'un scénario de test d' REST API ».
$http (obsolète)
$http est obsolète. Utilisez $got à la place.
Un ou plusieurs requêtes peuvent être envoyées dans un seul script d' API. Le script « Instana » (Synthétique) d' API utilise la variable $http prédéfinie ou $got pour envoyer une requête HTTP. La variable $http est basée sur le module @cypress/request . $http est obsolète et temporairement réservé pour être compatible avec l'ancien script et sera supprimé ultérieurement. Utilisez la nouvelle variable $got.
$secure
Le script Instana API prend en charge les identifiants utilisateur pour stocker les secrets en toute sécurité, tels que les mots de passe ou les clés d'authentification.
Pour créer un identifiant auprès de l' API, procédez comme suit :
- Assurez-vous que les droits d'accès sont correctement configurés.
- Utilisez OpenAPI ou la commande synctl pour créer un identifiant en transmettant
credentialNameetcredentialValue.
Ensuite, dans votre script ` API `, utilisez $secure.credentialName pour faire référence aux informations d'identification créées, par exemple $secure.password ou $secure.API_KEY.
$secure.credentialName format est pris en charge. Ce $secure[credentialName] format n'est pas pris en charge.$secure.credentialName) sont résolues avant l'exécution du script. Vous devez indiquer directement le nom des informations d'identification. Ne créez pas la référence de manière dynamique à l'aide de variables, de concaténation de chaînes ou eval()de, car ces méthodes ne sont pas prises en charge et ne sont pas évaluées.$synthétique
Vous pouvez utiliser $synthetic.var_name pour accéder aux variables d'environnement et d'exécution dans le script. Voir les variables prédéfinies suivantes:
- $synthetic.LOCATION ou $synthetic.pop: permet d'accéder au libellé location , qui est la première partie de la variable controller.location .
- $synthetic.TEST_ID ou $synthetic.id: utilisé pour accéder à l'identificateur du test synthétique exécuté.
- $synthetic.TEST_NAME ou $synthetic.testName : Utilisé pour accéder au test étiquette du test synthétique exécuté.
- $synthetic.TIME_ZONE ou $synthétique.timeZone : Permet d'accéder au fuseau horaire duPoP qui exécute le test synthétique.
- $synthetic.JOB_ID ou $synthetic.taskId : Utilisé pour accéder à l'identifiant de la tâche de lecture, et c'est aussi l'ID du résultat.
- $synthétique.testType : Permet d'accéder au type de test.
- $synthetic.description: Permet d'accéder à la description du test.
Vous pouvez également définir des variables d'environnement personnalisées dans values.yaml le tableau « helm ». Voir l'exemple suivant :
controller:
customProperties: "tag1=value1;tag2=value2"
Utilisez ensuite $synthetic.tag1 et $synthetic.tag2 dans le script pour accéder à ces variables personnalisées.
Pour accéder aux propriétés personnalisées définies dans la section customProperties de la définition de test, vous pouvez utiliser $synthetic.labels.xxx pour accéder à la valeur de propriété dans le script. Voir l'exemple suivant :
// to print test custom property defined in customProperties of test definition
console.info('Test custom property -> Team: ' + $synthetic.labels.Team);
console.info('Test custom property -> Purpose: ' + $synthetic.labels.Purpose);
$attributs
Utilisez $attributes pour ajouter ou obtenir des attributs personnalisés pour surveiller les données. API Les développeurs de scripts peuvent ajouter des données de paires key/value personnalisées sous forme d'attributs personnalisés. Les données personnalisées servent d'ajout aux attributs par défaut. Ces attributs personnalisés sont inclus dans les résultats de test avec les attributs par défaut.
Instana La surveillance synthétique prend en charge les API suivantes pour la configuration d'attributs personnalisés :
$attributes.set(key, value): définit la clé ou la valeur.$attributes.get(key): Renvoie la valeur de la clé fournie.$attributes.getKeys(): renvoie un tableau de toutes les clés.$attributes.has(key): Renvoietruesi la clé existe.$attributes.unset(key): supprime la clé spécifiée.$attributes.unsetAll(): supprime toutes les données personnalisées.
Pour accéder aux attributs personnalisés, utilisez $attributes dans le script Instana API :
$attributes.set('tag1', 'value1') // sets tag tag1 to value value1
let v = $attributes.get('tag1') // sets variable v to the value of tag1
$attributesAPI ` dans le script et les propriétés personnalisées définies dans customProperties la section de la définition du test sont accessibles dans les résultats du test via synthetic.tags la métrique; vous pouvez utiliser synthetic.tags cette métrique pour filtrer les résultats du test ou transmettre une valeur personnalisée à la charge utile personnalisée de Smart Alert.$network
Les API suivantes sont prises en charge dans la surveillance synthétique d' Instana pour la configuration d'un serveur proxy :
$network.setProxy(string proxy): Permet de définir un serveur proxy à utiliser pour toutes les requêtes ( HTTP, HTTPS ).$network.setProxyForHttp(string proxy): Permet de configurer un serveur proxy qui ne sera utilisé que pour les requêtes HTTP.$network.setProxyForHttps(string proxy): permet de définir un serveur proxy à utiliser uniquement pour les demandes HTTPs.$network.clearProxy(): utilisé pour supprimer la configuration de proxy.$network.getProxy(): permet de renvoyer la configuration du proxy.
L'exemple suivant utilise un proxy:
const assert = require('assert');
// Proxy with ip:port
// $network.setProxy('http://proxyhost:port');
// $network.setProxyForHttp('http://proxyhost:port');
// $network.setProxyForHttps('http://proxyhost:port');
// Proxy with authentication, create proxyUser and proxyPass credentials first
$network.setProxy('http://' + $secure.proxyUser + ':' + $secure.proxyPass + '@proxyhost:port');
// retrieve proxy
// let proxy = $network.getProxy();
$util.secrets
Utilisez cet « API » de sécurité pour masquer les données sensibles.
Toutes les informations sensibles connues sont masquées par le caractère * avant que les informations ne soient écrites dans les fichiers de journalisation et envoyées aux systèmes de back-end.
PoP, la version synthétique, ne collecte pas les données de l'en-tête et du corps de l' HTTP. Si vous souhaitez masquer les informations confidentielles dans les URL, utilisez la commande $util.secrets.setURLSecretsRegExps dans votre script. Voir l'exemple suivant :
// to redact 'key', 'password' and 'secret' query parameters in URL
$util.secrets.setURLSecretsRegExps([/key/i, /password/i, /secret/i]);
Une fois cette fonction API appelée, les données URLhttps://example.com/accounts/status?key=mykey123&secret=mysecret sont collectées et affichées sous la forme https://example.com/accounts/status?key=*&secret=* dans l'interface utilisateur Instana.
Rédaction d'un scénario de test « REST API »
Pour rédiger un scénario de test « REST API », procédez comme suit :
Envoyer une demande d' HTTP. L'exemple suivant montre comment envoyer les requêtes GET HTTP et POST, puis vérifier leur code d'état et le corps de la réponse :
const assert = require('assert'); (async function () { // GET example const {statusCode} = await $got.get('https://httpbin.org/get'); assert.equal(statusCode, 200, 'Expected a 200 Status Code, current is ' + statusCode); // POST example var postOptions = { url: 'https://httpbin.org/post', json: { 'name': 'TestName', 'type': 'Synthetic Script' }, https:{ rejectUnauthorized: false }, headers:{'accept': 'application/json'} }; let postResponse = await $got.post(postOptions); assert.ok(postResponse.statusCode == 200, 'POST status is ' + postResponse.statusCode + ', it should be 200'); const jsonBody = JSON.parse(postResponse.body); assert.equal(jsonBody.json.name, 'TestName', 'Expected TestName'); assert.equal(jsonBody.json.type, 'Synthetic Script', 'Expected Synthetic Script'); })();Par défaut, Got réessaiera 2 fois en cas d'échec. Pour désactiver cette option, définissez options.retry sur
{limit: 0}.Pour valider les résultats, importez le module
assertà l'aide de la commandeconst assert=require('assert');et appelez la méthodeassertpour valider la réponse du noeud final.Pour valider la réponsestatusCode, voir l'exemple suivant :
const assert=require('assert'); assert.ok(response && response.statusCode == 200, 'Expected a 200 status code, statusCode is ' + response.statusCode); assert.equal(response.statusCode, 200, 'Expected a 200 status code')Pour valider le contenu de la réponse, voir l'exemple suivant:
let bodyObj = (typeof body == 'string') ? JSON.parse(body) : body; assert.ok(bodyObj.id != null, 'id should not be null');Pour plus d'informations sur les API assert, consultez la page API. Un autre module permettant de valider le résultat est chai.
Pour déboguer le script, utilisez la commande
console. Vous pouvez consulter le contenu du journal dans l'interface utilisateur d' Instana.console.info() console.log() console.error() console.warn()
Envoi de requêtes GET HTTP
Pour envoyer une demande GET, utilisez la syntaxe suivante:
const assert = require('assert');
(async function () {
var options = {
url: 'https://reqres.in/api/messages',
https:{ rejectUnauthorized: false }
};
// Send GET request
let response = await $got.get(options);
// Validate the response status code, it should be 200 here
assert.ok(response && response.statusCode == 200, 'Expect 200');
})();
Envoi de requêtes « POST » et « HTTP »
Pour envoyer une requête POST JSON, utilisez la syntaxe suivante :
const assert = require('assert');
(async function () {
// Send JSON Data example
let URL = 'https://reqres.in/api/users';
// Define JSON data
let data = {
'job': 'leader',
'name': 'morpheus'
};
// Make POST request
let response = await $got.post(URL, {
header: {
'content-type': 'application/json'
},
json: data
});
// Validate the response code, if assertion fails, log "failed to create message, error is " plus
// results as error message on Synthetic dashboard
assert.ok(response && response.statusCode == 201, 'expect 201');
})();
Pour envoyer une requête via le formulaire POST, utilisez la syntaxe suivante :
const assert = require('assert');
(async function () {
const response = await $got.post('https://httpbin.org/anything', {
form: {
text: 'hello world'
}
});
assert.ok(response && response.statusCode == 200, 'expect 200');
})();
Envoi de demandes d'assistance à l'adresse TLS / SSL
Pour envoyer une requête « HTTPS » et autoriser un certificat non sécurisé, utilisez la syntaxe suivante :
// Allow the insecure certificate
await $got('https://example.com', {
https:{ rejectUnauthorized: false }
});
Pour envoyer une requête au protocole TLS / SSL avec un certificat, utilisez la syntaxe suivante :
// Single key with passphrase
await $got('https://example.com', {
https: {
key: $secure.key,
certificate: $secure.certificate,
passphrase: $secure.passphrase
}
});
Envoi de requêtes d'authentification de base
Pour envoyer une demande d'authentification de base, utilisez la syntaxe suivante:
await $got.get('http://some.server.com/', {
https:{ rejectUnauthorized: false },
headers: {
Authorization: "Basic " + $secure.AUTH_CRED
}
});
AUTH_CRED pour enregistrer le nom d'utilisateur et le mot de passe de l'authentification de base de HTTP. Le format de la variable AUTH_CRED d'identification est username:password celui qui est encodé avec base64.Envoi de requêtes avec un jeton « bearer »
Pour envoyer une demande d'authentification du support, utilisez la syntaxe suivante :
await $got.get('http://some.server.com/', {
headers: {
'Authorization': "Bearer " + $secure.authToken
}
});
Gestion des modules
Importation d'un module facultatif
Pour importer un module pris en charge, suivez la procédure standard relative à l'importation Node.js . Voir l'exemple suivant :
const crypto = require('crypto-js');
Modules de base pris en charge
Les modules principaux pris en charge sont les suivants:
- produire une assertion
- points d'ancrage async
- zone tampon
- constantes
- chiffrement
- dgram
- serveur de noms de domaine
- domaine
- événements
- fs
- http
- http2
- https
- module (module)
- réseau
- système d'exploitation
- chemin d'accès
- points d'ancrage perf_hooks
- Punycode
- queryString
- flux
- décodeur de chaîne
- Temporisateurs
- tls
- événements_trace
- unité tty
- url
- Util
- zlib
Modules tiers pris en charge
Les modules tiers suivants sont pris en charge:
- Assertion-plus 1.0.0
- atob 2.1.2
- @aws-sdk/client-cloudwatch 3.624.0
- @aws-sdk/client-s3 3.626.0
- @aws-sdk/client-secrets-manager 3.624.0
- @aws-sdk/client-sts 3.624.0
- @babel/core 7.23.2
- @ibm-cloud/secrets-manager 2.0.10
- akamai-edgegrid 3.4.5
- 4.6.6 de base sur FTP
- 1.20.0 de Body-Parser
- btoa 1.2.1
- cloner 0.1.19
- couleurs 1.4.0
- consoleplusplus 1.4.4
- crypto-js 4.2.0
- débogage 2.6.9
- extension 3.0.2
- faker 5.5.3
- obtenu 11.8.6
- joi 17.6.0
- js-yaml 3.14.1
- jsprim 1.4.2
- kafkajs 2.2.4
- ldapauth-fork 5.0.5
- lodash 4.17.21
- instant 2.29.4
- 6.5.0 MongoDB
- 11.0.1 de MSSQL
- 3.8.2 de net-snmp
- node-stream-zip 1.15.0
- oracledb 6.9.0
- 14.2.0 client-serveur
- protocol-buffers 4.2.0
- q 1.5.1
- requête (basée sur @cypress/request@3.0.1)
- doit être 13.2.3
- sip 0.0.6
- ssh2-sftp-client 7.2.3
- sshpk 1.17.0
- ssl-checker 2.0.8
- swagger-parser 8.0.4
- telnet-client 2.2.1
- codage de texte 0.7.0
- 0.14.2 de seconde main
- Cookie-difficile 4.1.3
- soulignement 1.13.4
- décompresser 0.10.11
- url-parse 1.5.10
- urllib2.43.0
- uuid 3.4.0
- valideur 13.7.0
- ws7.5.10
- xml2js 0.5.0
require('@cypress/request') directement pour importer un module de requête. Utilisez require('request') pour importer un module de requête ou utilisez la variable $http.Tester et déboguer le script « API » en local
synthetic-api-script est un module Node.js permettant de développer et de déboguer des scripts d' API s dans un environnement local. Pour plus d'informations, voir le fichier Readme.
Utilisation de la commande script-cli
Pour tester et déboguer un script d' API, utilisez la script-cli commande indiquée dans l'exemple suivant :
# Usage:
# test a single script
script-cli <script_name>
# test bundled scripts
script-cli -d <dir> <script-entry-file>
# Example:
script-cli examples/example1.js
script-cli -d examples/bundle-example1 index.js
Création d'un script de test pour « API »
Après avoir créé un script synthétique, procédez comme suit:
Utilisez
synthetic-api-scriptpour créer un script API, puis convertissez ce script en chaîne de caractères à l'aide de lascript-clicommande :# Usage: script-cli -s <script-file-path> # Example: script-cli -s examples/got-get.jsL'exemple suivant affiche le résultat:
{ "syntheticType":"HTTPScript", "script":"var assert = require('assert');\n\n(async function() {\n var options = {\n url: 'https://httpbin.org/get',\n https:{\n rejectUnauthorized: false\n }\n };\n\n let response = await $got.get(options);\n assert.equal(response.statusCode, 200, 'Expected a 200 OK response');\n console.log('Request URL %s, statusCode: %d', response.url, response.statusCode);\n})();\n" }Copiez-collez le contenu du script pour créer l'exemple suivant : API script test JSON.
{ "label": "APIScript_Test", "active": true, "testFrequency": 1, "locations": ["DemoPoP1_saas_instana_test"], "configuration": { "syntheticType": "HTTPScript", "script": "converted script string" } }
Création d'un test de script groupé pour API
Si la logique métier est complexe, ne contez pas tout dans un seul script car il est difficile pour les développeurs de gérer plusieurs fichiers script dans un référentiel Git .
Pour créer un test de script groupé d' API, procédez comme suit :
Regroupez les scripts dans un fichier compressé à l'aide de la commande script-cli :
# Usage: script-cli -z <bundle-script-folder> <entry-script> # Example: script-cli -z bundle-example1 bundle-example1/index.jsRemplissez les champs
scriptFileetbundlede la configuration de test avec la sortie de lascript-clicommande :scriptFileest le point d'entrée des scripts intégrés.bundleest le fichier compressé codé avec base64.
Pour créer un test intégré synthétique, remplissez le contenu du test comme illustré dans l'exemple suivant:
{
"label": "APIScriptBundle_Test",
"active": true,
"testFrequency": 5,
"locations": ["DemoPoP1_saas_instana_test"],
"configuration": {
"syntheticType": "HTTPScript",
"scripts": {
"scriptFile": "index.js",
"bundle": "zipped scripts encoded with base64"
}
}
}
Exemples de script
Envoyer une requête « API » avec les informations d'identification
Pour créer des données d'identification, vous pouvez utiliser la commande synctl . La création d'un identifiant pour le nom d'utilisateur et d'un identifiant pour le mot de passe est illustrée dans l'exemple suivant :
synctl create cred --key username --value user123
synctl create cred --key password --value pass123
L'authentification de base avec les données d'identification est illustrée dans l'exemple suivant:
const assert = require('assert');
(async function(){
const auth = Buffer.from($secure.username + ":" + $secure.password).toString('base64');
let gotResponse = await $got.get('https://<your-basic-auth-url>', {
// If rejectUnauthorized is true, it will throw on invalid certificates, such as expired or self-signed ones.
https:{ rejectUnauthorized: false },
// set additional headers
headers: {
Authorization: `Basic ${auth}`
},
timeout: {
request: 10000 //ms
}
}
);
console.log('Response statusCode:', gotResponse.statusCode);
// verify status code
assert.ok(gotResponse.statusCode == 200, "GET statusCode is " + gotResponse.statusCode + ", it should be 200");
})();
Instana API script permettant de tester les API httpbin
Vous pouvez utiliser le script Instana API pour tester les API httpbin de manière synchronisée, comme suit :
const assert = require('assert');
async function getExample(){
var getOptions = {
url: 'https://httpbin.org/get',
https:{ rejectUnauthorized: false },
headers: {
'Additional-Header': 'Additional-Header-Data'
}
};
let getResponse = await $got.get(getOptions);
console.info("Sample API - GET, response code: " + getResponse.statusCode);
assert.ok(getResponse.statusCode == 200, "GET status is " + getResponse.statusCode + ", it should be 200");
var bodyObj1 = JSON.parse(getResponse.body);
assert.ok(bodyObj1.url == "https://httpbin.org/get", "httpbin.org REST API GET URL verify failed");
}
async function postExample(){
var postOptions = {
url: 'https://httpbin.org/post',
json: {
"name1": "this is the first data",
"name2": "second data"
},
https:{ rejectUnauthorized: false },
headers:{"accept": "application/json"}
};
let postResponse = await $got.post(postOptions);
console.info("Sample API - POST, response code: " + postResponse.statusCode);
assert.ok(postResponse.statusCode == 200, 'POST status is ' + postResponse.statusCode + ', it should be 200');
const jsonBody2 = JSON.parse(postResponse.body);
assert.equal(jsonBody2.json.name1, 'this is the first data', 'Expected this is the first data');
assert.equal(jsonBody2.json.name2, 'second data', 'Expected second data');
}
async function putExample(){
var putOptions = {
url: 'https://httpbin.org/put',
json: {
"name1": 'this is the first data',
"name2": 'second data'
},
https:{ rejectUnauthorized: false },
headers:{"accept": "application/json"}
};
let putResponse = await $got.put(putOptions);
console.info("Sample API - PUT, response code: " + putResponse.statusCode);
assert.ok(putResponse.statusCode == 200, 'PUT status is ' + putResponse.statusCode + ', it should be 200');
const jsonBody3 = JSON.parse(putResponse.body);
assert.ok(jsonBody3.url == "https://httpbin.org/put", "httpbin.org REST API PUT URL verify failed");
assert.equal(jsonBody3.json.name2, 'second data', 'Expected second data');
}
async function deleteExample(){
var deleteOptions = {
url: 'https://httpbin.org/delete',
https:{ rejectUnauthorized: false },
headers:{"accept": "application/json"}
};
let deleteResponse = await $got.delete(deleteOptions);
console.info("Sample API - DELETE, response code: " + deleteResponse.statusCode);
assert.ok(deleteResponse.statusCode == 200, 'DELETE status is ' + deleteResponse.statusCode + ', it should be 200');
const jsonBody4 = JSON.parse(deleteResponse.body);
assert.ok(jsonBody4.url == "https://httpbin.org/delete", "httpbin.org REST API DELETE URL verify failed");
}
function showEnvironment(){
// to print environment variables
console.info('List PoP environment variables using $synthetic API');
console.info('Test ID:', $synthetic.TEST_ID);
console.info('Test Name:', $synthetic.TEST_NAME);
console.info('Location:', $synthetic.LOCATION);
console.info('TimeZone:', $synthetic.TIME_ZONE);
console.info('Job ID:', $synthetic.JOB_ID);
// to print test custom property defined in customProperties of test definition
console.info('Test custom property -> Team: ' + $synthetic.labels.Team);
console.info('Test custom property -> Purpose: ' + $synthetic.labels.Purpose);
// to set custom tags dynamically
// Users can use tag key to to pass the customized value to Smart Alert custom payload
$attributes.set('tag_key1', 'value1');
}
async function main(){
await getExample();
await postExample()
await putExample();
await deleteExample();
await showEnvironment();
}
main();
Pour plus d'exemples de scripts d' API, consultez le script « Synthetic API ».