API Guida alla sceneggiatura

Instana API Riferimento allo script

Lo script Instana API interagisce con Instana API per eseguire operazioni volte a potenziare le funzionalità di monitoraggio di Instana. Lo script API è compatibile con la versione 22 di Node.js grazie al sistema di moduli CommonJS. ESM non è supportato.

Variabili globali

Lo script « Instana » di API utilizza le seguenti variabili globali predefinite per accelerare lo sviluppo degli script:

API Dettagli
$got Invia una richiest HTTP e tramite il modulo got
$http Invia una richiest HTTP e tramite il modulo delle richieste (obsoleto)
$secure Accedi credenziali utente
$attributes Gestisci attributi personalizzati
$network Configura il proxy utilizzando questo programma di utilità di rete
$synthetic Accedi alle variabili di ambiente
$util Utilizza funzioni di utilità, come le API di sicurezza

$http (obsoleto)

$http è deprecato. Utilizzare invece $got .

È possibile inviare una o più richieste in un unico script API. Lo script « Instana » di API utilizza la variabile $http predefinita o $got per inviare una richiesta HTTP. La variabile $http è basata sul modulo /request . $http è obsoleto e temporaneamente riservato per essere compatibile con il vecchio script e verrà successivamente rimosso. Utilizzare la nuova variabile $got.

$secure

Lo script Instana API supporta l'uso delle credenziali dell'utente per archiviare in modo sicuro i dati riservati, come password o chiavi di autenticazione.

Per creare una credenziale con l' API, procedere come segue:

  1. Assicurati di disporre delle autorizzazioni corrette.
  2. Utilizza OpenAPI o il comando synctl per creare una credenziale passando credentialName e credentialValue.

Quindi, nello script ` API `, usa $secure.credentialName per fare riferimento alle credenziali create, ad esempio $secure.password o $secure.API_KEY.

Nota: è supportato solo il $secure.credentialName formato. Il $secure[credentialName] formato non è supportato.
Nota: i riferimenti alle credenziali protette ($secure.credentialName) vengono risolti prima dell'esecuzione dello script. È necessario specificare direttamente il nome delle credenziali. Non creare il riferimento in modo dinamico utilizzando variabili, concatenazione di stringhe o eval(), poiché questi metodi non sono supportati e non vengono valutati.

$sintetico

È possibile utilizzare $synthetic.var_name per accedere alle variabili di runtime e di ambiente nello script. Vedere le seguenti variabili predefinite:

  • $synthetic.LOCATION o $synthetic.pop: utilizzato per accedere all'etichetta location , che è la prima parte nella variabile controller.location .
  • $synthetic.TEST_ID o $synthetic.id: utilizzato per accedere all'identificativo del test sintetico eseguito.
  • $synthetic.TEST_NAME O $nometest.sintetico : Utilizzato per accedere a test etichetta del test sintetico che viene eseguito.
  • $synthetic.TIME_ZONE O $sintetico.timeZone : Utilizzato per accedere al fuso orario delPoP che esegue il test sintetico.
  • $synthetic.JOB_ID O $sintetico.taskId : utilizzato per accedere all'identificatore dell'attività di riproduzione ed è anche l'ID del risultato.
  • $sintetico.testType : Utilizzato per accedere al tipo di test.
  • $synthetic.description: utilizzato per accedere alla descrizione del test.

È inoltre possibile definire variabili d'ambiente personalizzate nel grafico " helmvalues.yaml ". Vedi il seguente esempio:

controller:
  customProperties: "tag1=value1;tag2=value2"
 

Quindi, utilizzare $synthetic.tag1 e $synthetic.tag2 nello script per accedere a queste variabili personalizzate.

Per accedere alle proprietà personalizzate definite nella sezione customProperties della definizione di test, è possibile utilizzare $synthetic.labels.xxx per accedere al valore della proprietà nello script. Vedi il seguente esempio:

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

$attributi

Utilizzare $attributes per aggiungere o ottenere attributi personalizzati per monitorare i dati. API Gli sviluppatori di script possono aggiungere coppie di dati key/value personalizzate come attributi personalizzati. I dati personalizzati funge da aggiunta agli attributi predefiniti. Questi attributi personalizzati sono inclusi nei risultati del test insieme agli attributi predefiniti.

Instana Il monitoraggio sintetico supporta le seguenti API per la configurazione degli attributi personalizzati:

  • $attributes.set(key, value): imposta la chiave o il valore.
  • $attributes.get(key): restituisce il valore per la chiave fornita.
  • $attributes.getKeys(): restituisce un array di tutte le chiavi.
  • $attributes.has(key): restituisce true se la chiave esiste.
  • $attributes.unset(key): rimuove la chiave specificata.
  • $attributes.unsetAll(): rimuove tutti i dati personalizzati.

Per accedere agli attributi personalizzati, utilizzare $attributes nello 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
 
Nota: è possibile accedere agli attributi personalizzati impostati tramite ` $attributesAPI ` nello script e alle proprietà personalizzate definite nella customProperties sezione della definizione del test tramite synthetic.tags la metrica `metric`; è possibile utilizzare synthetic.tags la metrica `metric` per filtrare i risultati del test o passare un valore personalizzato al payload personalizzato di Smart Alert.

$network

Le seguenti API sono supportate nel monitoraggio sintetico di Instana per la configurazione del server proxy:

  • $network.setProxy(string proxy): Serve a impostare un server proxy da utilizzare per tutte le richieste ( HTTP, HTTPS ).
  • $network.setProxyForHttp(string proxy): Serve a configurare un server proxy da utilizzare esclusivamente per le richieste HTTP.
  • $network.setProxyForHttps(string proxy): utilizzato per impostare un server proxy da utilizzare solo per le richieste HTTPs.
  • $network.clearProxy(): utilizzato per rimuovere la configurazione del proxy.
  • $network.getProxy(): utilizzato per restituire la configurazione del proxy.

Il seguente esempio utilizza il 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

Utilizza questo strumento di protezione API per oscurare i dati sensibili.

Tutte le informazioni sensibili note vengono mascherate con il carattere * prima che le informazioni vengano scritte nei file di registrazione e inviate ai backend.

PoP, versione sintetica, non raccoglie i dati dell'intestazione e del corpo dell' HTTP. Se desideri oscurare le informazioni riservate dagli URL, utilizza il comando ` $util.secrets.setURLSecretsRegExps ` nel tuo script. Vedi il seguente esempio:

// to redact 'key', 'password' and 'secret' query parameters in URL
$util.secrets.setURLSecretsRegExps([/key/i, /password/i, /secret/i]);
 

Dopo che è stata richiamata questa funzione API, il dato URLhttps://example.com/accounts/status?key=mykey123&secret=mysecret viene raccolto e visualizzato come https://example.com/accounts/status?key=*&secret=* nell'interfaccia utente Instana.

Scrivere un caso di test per l' REST API

Per scrivere un caso di test di tipo " REST API ", seguire questi passaggi:

  1. Invia una richiesta di HTTP. L'esempio seguente mostra come inviare le richieste GET HTTP e POST e verificare il codice di stato e il corpo della risposta:

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

    Per impostazione predefinita, Got riproverà 2 volte in caso di errore. Per disabilitare questa opzione, impostare options.retry su {limit: 0}.

  2. Per convalidarli, importare il modulo assert utilizzando il comando const assert=require('assert'); e richiamare il metodo assert per convalidare la risposta dell'endpoint.

    Per convalidare la rispostastatusCode, vedere il seguente esempio:

    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')
     

    Per convalidare il contenuto della risposta, consultare il seguente esempio:

    let bodyObj = (typeof body == 'string') ? JSON.parse(body) : body;
    assert.ok(bodyObj.id != null, 'id should not be null');
     

    Per ulteriori informazioni sulle API di assert, consultare assert API. Un altro modulo per convalidare il risultato è chai.

  3. Per eseguire il debug dello script, utilizzare il comando console . È possibile visualizzare il contenuto del registro nell'interfaccia utente di Instana.

    console.info()
    console.log()
    console.error()
    console.warn()
     

Invio di richieste GET all'indirizzo HTTP

Per inviare una richiesta GET, utilizzare la seguente sintassi:

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

Invio di richieste POST e HTTP

Per inviare una richiesta POST JSON, utilizzare la seguente sintassi:

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

Per inviare una richiesta tramite il modulo POST, utilizzare la seguente sintassi:

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

Invio di richieste di assistenza all'indirizzo TLS / SSL

Per inviare una richiesta HTTPS e consentire l'uso di certificati non sicuri, utilizzare la seguente sintassi:

 // Allow the insecure certificate
 await $got('https://example.com', {
   https:{ rejectUnauthorized: false }
 });
 

Per inviare una richiesta tramite il protocollo TLS / SSL con un certificato, utilizzare la seguente sintassi:

 // Single key with passphrase
 await $got('https://example.com', {
   https: {
     key: $secure.key,
     certificate: $secure.certificate,
     passphrase: $secure.passphrase
   }
 });
 
Nota: creare delle credenziali per archiviare la chiave, il certificato e la passphrase.

Invio di richieste di autenticazione di base

Per inviare una richiesta di autenticazione di base, utilizzare la sintassi seguente:

 await $got.get('http://some.server.com/', {
   https:{ rejectUnauthorized: false },
   headers: {
     Authorization: "Basic " + $secure.AUTH_CRED
   }
 });
 
Nota: è necessario creare una variabile di AUTH_CRED credenziali per memorizzare il nome utente e la password dell'autenticazione di base di HTTP. Il formato della variabile di AUTH_CRED credenziale è username:password quello codificato con base64.

Invio di richieste con un token bearer

Per inviare una richiesta di autenticazione del portatore, utilizzare la seguente sintassi:

 await $got.get('http://some.server.com/', {
   headers: {
     'Authorization': "Bearer " + $secure.authToken
   }
 });
 
Nota: creare credenziali per memorizzare il testo " authToken " nel campo "Bearer".

Gestione dei moduli

Importazione del modulo opzionale

Per importare un modulo supportato, attieniti alla procedura standard sull'importazione di Node.js . Vedi il seguente esempio:

const crypto = require('crypto-js');
 

Moduli principali supportati

I moduli principali supportati sono i seguenti:

  • asserire
  • ganci asincroni
  • buffer
  • Costanti
  • crittografia
  • dgram
  • Dns
  • Dominio
  • eventi
  • fs
  • http
  • http2
  • https
  • modulo
  • netto
  • os
  • percorso
  • per_hook
  • Punycode
  • Stringa query
  • flusso
  • decodificatore stringa
  • Timer
  • TLS
  • eventi di traccia
  • Tty
  • URL
  • UTIL
  • ZLib

Moduli di terze parti supportati

Sono supportati i seguenti moduli di terze parti:

  • assert - più 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
  • ftp di base 4.6.6
  • body - parser 1.20.0
  • btoa 1.2.1
  • clona 0.1.19
  • colori 1.4.0
  • consoleplusplus 1.4.4
  • crypto-js 4.2.0
  • debug 2.6.9
  • estendere 3.0.2
  • faker 5.5.3
  • ottenuto 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
  • momento 2.29.4
  • mongodb 6.5.0
  • mssql 11.0.1
  • net - snmp 3.8.2
  • node - stream - zip 1.15.0
  • oracledb 6.9.0
  • Prom - client 14.2.0
  • buffer di protocollo 4.2.0
  • q 1.5.1
  • richiesta (basata su @cypress/request@3.0.1)
  • deve 13.2.3
  • sip 0.0.6
  • ssh2-sftp-client 7.2.3
  • sshpk 1.17.0
  • controllo ssl 2.0.8
  • swagger - parser 8.0.4
  • telnet-client 2.2.1
  • codifica testo 0.7.0
  • parsimonia 0.14.2
  • cookie - difficile 4.1.3
  • sottolineatura 1.13.4
  • decomprimere 0.10.11
  • url - analisi 1.5.10
  • urllib2.43.0
  • uuid 3.4.0
  • convalida 13.7.0
  • w7.5.10
  • xml2js 0.5.0
Nota: non è possibile utilizzare require('@cypress/request') direttamente per importare un modulo di richiesta. Utilizza require('request') per importare un modulo di richiesta oppure usa la variabile $http.

Test e debug di uno script di " API " in locale

synthetic-api-script è un modulo Node.js che consente di sviluppare e eseguire il debug di uno script API in ambiente locale. Per ulteriori informazioni, consultare il file readme.

Utilizzo del comando script-cli

Per testare ed eseguire il debug di uno script di API, utilizzare il script-cli comando come illustrato nell'esempio seguente:

# 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
 

Creazione di un unico script di test per API

Dopo aver creato uno script sintetico, completare i passi riportati di seguito:

  1. Utilizza synthetic-api-script per creare uno script API, quindi converti lo script in una stringa con il script-cli comando:

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

    Il seguente esempio visualizza il risultato:

    {
      "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. Copia e incolla il contenuto dello script per creare il seguente esempio: API script test JSON.

    {
      "label": "APIScript_Test",
      "active": true,
      "testFrequency": 1,
      "locations": ["DemoPoP1_saas_instana_test"],
      "configuration": {
        "syntheticType": "HTTPScript",
        "script": "converted script string"
      }
    }
     

Creazione di un test per lo script « API » in un pacchetto

Se la logica di business è complessa, non contiene tutto in un singolo script perché è difficile per gli sviluppatori gestire più file di script in un repository Git .

Per creare un test dello script « API » in un pacchetto, procedere come segue:

  1. Script di bundle in un file compresso utilizzando il comando script - cli :

    # Usage:
    script-cli -z <bundle-script-folder> <entry-script>
    # Example:
    script-cli -z bundle-example1 bundle-example1/index.js
     
  2. Inserisci scriptFile e bundle nella configurazione di prova utilizzando l'output del script-cli comando:

    • scriptFile è il punto di ingresso degli script integrati.
    • bundle è il file compresso codificato con base64.

Per creare un test combinato sintetico, compilare il payload di test come mostrato nel seguente esempio:

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

Esempi di script

Invia API con le credenziali

Per creare credenziali, è possibile utilizzare il comando synctl . La creazione di una credenziale per il nome utente e una credenziale per la password è mostrata nell'esempio seguente:

synctl create cred --key username --value user123

synctl create cred --key password --value pass123
 

L'autenticazione di base con le credenziali viene mostrata nel seguente esempio:

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 per testare le API di httpbin

È possibile utilizzare lo script Instana API per testare le API di httpbin in modo sincronizzato come segue:

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

 

Per ulteriori esempi di script " API ", consultare lo script "Synthetic API ".