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:
- Certifique-se de que as permissões estejam configuradas corretamente.
- Use o ` OpenAPI ` ou o comando `synctl` para criar uma credencial, passando
credentialNameecredentialValue.
Em seguida, no seu script ` API `, use $secure.credentialName para se referir à credencial criada, por exemplo, $secure.password ou $secure.API_KEY.
$secure.credentialName formato é compatível. O $secure[credentialName] formato não é compatível.$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): retornatruese 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
$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:
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}..Para validar os resultados, importe o módulo
assertusando o comandoconst assert=require('assert');e chame o métodoassertpara 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.
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
}
});
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
}
});
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
}
});
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
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:
Use
synthetic-api-scriptpara criar um script do tipo ` API ` e converta o script em uma string com oscript-clicomando:# Usage: script-cli -s <script-file-path> # Example: script-cli -s examples/got-get.jsO 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" }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:
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.jsPreencha
scriptFileebundlena configuração de teste com o resultado doscript-clicomando: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 `.