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é

$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 :

  1. Assurez-vous que les droits d'accès sont correctement configurés.
  2. Utilisez OpenAPI ou la commande synctl pour créer un identifiant en transmettant credentialName et credentialValue.

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.

Remarque : seul le $secure.credentialName format est pris en charge. Ce $secure[credentialName] format n'est pas pris en charge.
Remarque : les références aux identifiants sécurisés ($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): Renvoie true si 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
 
Remarque : les attributs personnalisés définis par ` $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 :

  1. 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}.

  2. Pour valider les résultats, importez le module assert à l'aide de la commande const assert=require('assert'); et appelez la méthode assert pour 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.

  3. 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
   }
 });
 
Remarque : Créez des identifiants pour enregistrer la clé, le certificat et la phrase secrète.

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
   }
 });
 
Remarque : vous devez créer une variable d'identification 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
   }
 });
 
Remarque : Créez un identifiant pour enregistrer le texte de l' 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
Remarque : vous ne pouvez pas utiliser 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:

  1. Utilisez synthetic-api-script pour créer un script API, puis convertissez ce script en chaîne de caractères à l'aide de la script-cli commande :

    # Usage:
    script-cli -s <script-file-path>
    # Example:
    script-cli -s examples/got-get.js
     

    L'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"
    }
     
  2. 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 :

  1. 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.js
     
  2. Remplissez les champs scriptFile et bundle de la configuration de test avec la sortie de la script-cli commande :

    • scriptFile est le point d'entrée des scripts intégrés.
    • bundle est 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 ».