API Guia de roteiro

Instana API referência de script

O script Instana API interage com o Instana API para realizar operações que aprimoram as capacidades de monitoramento do Instana. O script ` API ` é compatível com o ` Node.js ` 22, utilizando o sistema de módulos do ` CommonJS `. O ESM não é compatível.

Variáveis globais

O script " Instana " do Synthetic API utiliza as seguintes variáveis globais predefinidas para acelerar o desenvolvimento de scripts:

APIs Detalhes
$got Enviar uma solicitação de ` HTTP ` pelo módulo `got`
$http Enviar uma solicitação ` HTTP ` pelo módulo de solicitações (obsoleto)
$secure Acessar credenciais do usuário
$attributes Gerenciar atributos customizados
$network Configurar proxy usando este utilitário de rede
$synthetic Variáveis de ambiente de acesso
$util Use funções de utilitário, como APIs de segurança

$got

Para substituir $http no futuro, use a $got variável para enviar uma solicitação HTTP a partir do Synthetic PoP 1.0.13. Esta variável usa o módulo got .

Para obter mais informações sobre como enviar diferentes tipos de solicitações de ` HTTP ` com $goto, consulte o artigo “Escrevendo um caso de teste ` REST API ` ”.

$http (obsoleto)

O $http foi descontinuado. Em vez disso, use $got

É possível enviar uma ou mais solicitações em um único script ` API `. O script " Instana " do API utiliza a variável $http predefinida ou $got para enviar uma solicitação HTTP. A variável $http baseia-se no módulo @cypress/request . O $http foi descontinuado e reservado temporariamente para ser compatível com o script antigo e será removido posteriormente no futuro Use a nova variável $got

$seguro

O script Instana API suporta credenciais de usuário para armazenar segredos com segurança, como senhas ou chaves de autenticação.

Para criar uma credencial no API, siga estas etapas:

  1. Certifique-se de que as permissões estejam configuradas corretamente.
  2. Use o ` OpenAPI ` ou o comando `synctl` para criar uma credencial, passando credentialName e credentialValue.

Em seguida, no seu script ` API `, use $secure.credentialName para se referir à credencial criada, por exemplo, $secure.password ou $secure.API_KEY.

Observação: Apenas o $secure.credentialName formato é compatível. O $secure[credentialName] formato não é compatível.
Observação: as referências a credenciais seguras ($secure.credentialName) são resolvidas antes da execução do script. Você deve especificar o nome da credencial diretamente. Não crie a referência dinamicamente usando variáveis, concatenação de strings ou eval(), pois esses métodos não são suportados e não são avaliados.

$sintético

Você pode usar $synthetic.var_name para acessar ambiente e variáveis de tempo de execução no script. Veja as variáveis predefinidas a seguir:

  • $synthetic.LOCATION ou $synthetic.pop: Utilizado para acessar a etiqueta location , que é a primeira parte na variável controller.location .
  • $synthetic.TEST_ID ou $synthetic.id: Utilizado para acessar o identificador de teste Synthetic que é executado.
  • $synthetic.TEST_NAME ou $sintético.testName : Usado para acessar o teste rótulo do teste sintético que é executado.
  • $synthetic.TIME_ZONE ou $sintético.timeZone : Usado para acessar o fuso horário doPoP que executa o teste Sintético.
  • $synthetic.JOB_ID ou $sintético.taskId : Usado para acessar o identificador da tarefa de reprodução e também é o ID do resultado.
  • $sintético.testType : Usado para acessar o tipo de teste.
  • $synthetic.description: usado para acessar a descrição do teste.

Você também pode definir variáveis de ambiente personalizadas no values.yaml gráfico " helm ". Consulte o seguinte exemplo:

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

Em seguida, use $synthetic.tag1 e $synthetic.tag2 no script para acessar essas variáveis customizadas.

Para acessar as propriedades personalizadas que são definidas na seção customProperties da definição de teste, você pode usar $synthetic.labels.xxx para acessar o valor do imóvel no script. Consulte o seguinte exemplo:

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

$atributos

Use o $attributes para incluir ou obter atributos customizados para monitorar dados API Os desenvolvedores de scripts podem adicionar pares de dados key/value personalizados como atributos personalizados. Os dados customizados atuam como uma adição aos atributos padrão. Esses atributos customizados são incluídos nos resultados de teste juntamente com os atributos padrão

Instana O monitoramento sintético oferece suporte às seguintes APIs para a configuração de atributos personalizados:

  • $attributes.set(key, value): configura a chave ou o valor.
  • $attributes.get(key): Retorna o valor para a chave fornecida.
  • $attributes.getKeys(): Retorna uma matriz de todas as chaves.
  • $attributes.has(key): retorna true se a chave existir.
  • $attributes.unset(key): remove a chave especificada.
  • $attributes.unsetAll(): remove todos os dados customizados.

Para acessar os atributos personalizados, use $attributes no 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
 
Observação: Os atributos personalizados definidos por ` $attributesAPI ` no script e as propriedades personalizadas definidas na customProperties seção `section` da definição do teste podem ser acessados nos resultados do teste por meio synthetic.tags da métrica `metric`. Você pode usar synthetic.tags a métrica `metric` para filtrar os resultados do teste ou passar um valor personalizado para a carga útil personalizada do Smart Alert.

$network

As seguintes APIs são compatíveis com o monitoramento sintético do Instana para a configuração do servidor proxy:

  • $network.setProxy(string proxy): Utilizado para definir um servidor proxy a ser usado em todas as solicitações ( HTTP, HTTPS ).
  • $network.setProxyForHttp(string proxy): Utilizado para definir um servidor proxy a ser usado exclusivamente para solicitações HTTP.
  • $network.setProxyForHttps(string proxy): Utilizado para configurar um servidor proxy para ser usado para apenas solicitações de HTTPs.
  • $network.clearProxy(): Utilizado para remover a configuração do proxy.
  • $network.getProxy(): Utilizado para retornar a configuração do proxy.

O exemplo a seguir usa 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

Use este recurso de segurança API para ocultar dados confidenciais.

Todas as informações confidenciais conhecidas são mascaradas com o caractere * antes que as informações sejam gravadas em arquivos de log e enviadas para backends.

O Synthetic PoP não coleta dados do cabeçalho e do corpo da solicitação HTTP. Se você quiser ocultar informações confidenciais em URLs, use o comando ` $util.secrets.setURLSecretsRegExps ` no seu script. Consulte o seguinte exemplo:

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

Após a chamada desta função API, o URLhttps://example.com/accounts/status?key=mykey123&secret=mysecret é coletado e exibido como https://example.com/accounts/status?key=*&secret=* na interface do usuário Instana.

Escrevendo um caso de teste de " REST API "

Para escrever um caso de teste de " REST API ", siga estas etapas:

  1. Envie uma solicitação de HTTP. O exemplo a seguir mostra como enviar as solicitações GET HTTP e POST e validar o código de status e o corpo da resposta:

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

    Por padrão, Got tentará novamente 2 vezes na falha. Para desativar essa opção, configure options.retry como {limit: 0}..

  2. Para validar os resultados, importe o módulo assert usando o comando const assert=require('assert'); e chame o método assert para validar a resposta do terminal.

    Para validar a respostastatusCode, veja o exemplo a seguir:

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

    Para validar o conteúdo de resposta, consulte o exemplo a seguir:

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

    Para obter mais informações sobre as APIs do assert, consulte assert API. Outro módulo para validar o resultado é chai.

  3. Para depurar o script, utilize o comando console .. Você pode visualizar o conteúdo do log na interface do usuário do Instana.

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

Envio de solicitações GET para HTTP

Para enviar uma solicitação GET, use a seguinte sintaxe:

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

Envio de solicitações do tipo ` POST ` e ` HTTP `

Para enviar uma solicitação POST JSON, use a seguinte sintaxe:

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

Para enviar uma solicitação de formulário POST, use a seguinte sintaxe:

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

Envio de solicitações de suporte para TLS / SSL

Para enviar uma solicitação HTTPS e permitir certificados não seguros, use a seguinte sintaxe:

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

Para enviar uma solicitação do Protocolo de Transmissão de Dados ( TLS ) / Protocolo de Transmissão de Dados ( SSL ) com um certificado, use a seguinte sintaxe:

 // Single key with passphrase
 await $got('https://example.com', {
   https: {
     key: $secure.key,
     certificate: $secure.certificate,
     passphrase: $secure.passphrase
   }
 });
 
Observação: Crie credenciais para armazenar a chave, o certificado e a senha.

Envio de solicitações de autenticação básica

Para enviar uma solicitação de autenticação básica, use a sintaxe a seguir:

 await $got.get('http://some.server.com/', {
   https:{ rejectUnauthorized: false },
   headers: {
     Authorization: "Basic " + $secure.AUTH_CRED
   }
 });
 
Observação: É necessário criar uma variável de AUTH_CRED credenciais para armazenar o nome de usuário e a senha da autenticação básica do HTTP. O formato da variável de AUTH_CRED credencial username:password é codificado com base64.

Envio de solicitações com um token de portador

Para enviar uma solicitação de autenticação de portador, use a seguinte sintaxe:

 await $got.get('http://some.server.com/', {
   headers: {
     'Authorization': "Bearer " + $secure.authToken
   }
 });
 
Observação: Crie uma credencial para armazenar o texto " authToken ".

Gerenciamento de módulos

Importando um módulo opcional

Para importar um módulo suportado, siga o procedimento padrão sobre a importação de Node.js Consulte o seguinte exemplo:

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

Módulos principais compatíveis

Os módulos do núcleo suportados são os seguintes:

  • declarado
  • ganchos assíncronos
  • buffer
  • constantes
  • criptografia
  • dgram
  • dns
  • domínio
  • eventos
  • fs
  • http
  • http2
  • https
  • módulo
  • rede
  • so
  • caminho
  • ganchos de desempenho
  • punycode
  • queryString
  • fluxo
  • decodificador de string
  • cronômetros
  • TLS
  • eventos_de_rastreamento
  • tty
  • URL
  • Util
  • Zlib

Módulos de terceiros compatíveis

Os módulos de terceiros a seguir são suportados:

  • assert-mais 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
  • basic-ftp 4.6.6
  • body-parser 1.20.0
  • btoa 1.2.1
  • clonar 0.1.19
  • cores 1.4.0
  • consoleplusplus 1.4.4
  • crypto-js 4.2.0
  • depuração 2.6.9
  • estender 3.0.2
  • falsificador 5.5.3
  • obteve 11.8.6
  • acesse 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-cliente 14.2.0
  • protocolo-buffers 4.2.0
  • q 1.5.1
  • pedido (baseado em @cypress/request@3.0.1)
  • deve 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
  • codificação de texto 0.7.0
  • loja de artigos usados 0.14.2
  • Cookie fácil 4.1.3
  • sublinhado 1.13.4
  • descompactar 0.10.11
  • url-parse 1.5.10
  • URLlib2.43.0
  • uuid 3.4.0
  • validador 13.7.0
  • es7.5.10
  • xml2js 0.5.0
Observação: não é possível usar require('@cypress/request') diretamente para importar um módulo de solicitação. Use require('request') para importar um módulo de solicitação ou use a variável $http.

Testando e depurando um script do ` API ` localmente

synthetic-api-script é um módulo Node.js para desenvolver e depurar um script d API e no ambiente local. Para obter mais informações, consulte o arquivo leia-me

Usando o comando script-cli

Para testar e depurar um script d API, use o script-cli comando conforme mostrado no exemplo a seguir:

# 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
 

Criação de um único script de teste do API

Depois de criar um script sintético, conclua as etapas a seguir:

  1. Use synthetic-api-script para criar um script do tipo ` API ` e converta o script em uma string com o script-cli comando:

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

    O exemplo a seguir exibe o resultado:

    {
      "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. Copie e cole o conteúdo do script para criar o seguinte exemplo: API script test JSON.

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

Criação de um teste de script do ` API ` integrado

Se a lógica de negócios for complexa, não contenha tudo em um único script porque é difícil para os desenvolvedores gerenciarem vários arquivos de script em um repositório Git

Para criar um teste de script do tipo “ API ”, siga estas etapas:

  1. Scripts de pacote configurável em um arquivo compactado usando o comando script-cli :

    # Usage:
    script-cli -z <bundle-script-folder> <entry-script>
    # Example:
    script-cli -z bundle-example1 bundle-example1/index.js
     
  2. Preencha scriptFile e bundle na configuração de teste com o resultado do script-cli comando:

    • scriptFile é o ponto de entrada dos scripts em pacote.
    • bundle é o arquivo compactado codificado com base64..

Para criar um teste de pacote configurável sintético, preencha a carga útil do teste conforme mostrado no exemplo a seguir:

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

Exemplos de Script

Envie um e-mail para API com suas credenciais

Para criar credenciais, é possível usar o comando synctl .. A criação de uma credencial para o nome de usuário e uma credencial para a senha é mostrada no exemplo a seguir:

synctl create cred --key username --value user123

synctl create cred --key password --value pass123
 

A autenticação básica com as credenciais é mostrada no seguinte exemplo:

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 para testar as APIs do httpbin

Você pode usar o script Instana API para testar as APIs do httpbin de forma sincronizada, da seguinte maneira:

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

 

Para ver mais exemplos de scripts do ` API `, consulteo script ` API `.