Podręcznik
API Script Guide
- Skorowidz skryptów interfejsu API Instana
- Tworzenie przypadku testowego interfejsu REST API
- Zarządzanie modułami
- Lokalne testowanie i debugowanie skryptu interfejsu API
- Przykłady skryptów
Skorowidz skryptów interfejsu API Instana
Skrypt API Instana współdziała z API Instana do wykonywania operacji, które zwiększają możliwości monitorowania Instana. Skrypt API obsługuje środowisko Node.js 16.
Zmienne globalne
Skrypt Instana Synthetic API używa następujących predefiniowanych zmiennych globalnych, aby przyspieszyć tworzenie skryptów:
| Interfejsy API | Szczegóły |
|---|---|
$http |
Wyślij żądanie HTTP według modułu żądania (nieaktualne) |
$got |
Wyślij żądanie HTTP przy użyciu modułu got |
$secure |
Dostęp do danych uwierzytelniających użytkownika |
$attributes |
Zarządzaj niestandardowymi atrybutami |
$network |
Skonfiguruj serwer proxy przy użyciu tego sieciowego programu narzędziowego |
$synthetic |
Umożliwia dostęp do zmiennych środowiskowych |
$util |
Korzystanie z funkcji narzędziowych, takich jak interfejsy API zabezpieczeń |
$http
Jedno lub więcej żądań można wysłać w jednym skrypcie API. Skrypt Instana Synthetic API używa predefiniowanej zmiennej $http lub $got do wysłania żądania HTTP. Zmienna $http jest oparta na module request , który jest teraz nieaktualny. Ta zmienna jest tymczasowo zarezerwowana, a następnie usunięta w przyszłości.
Więcej informacji na temat korzystania z produktu $httpzawiera publikacja API Script Guide.
$zdobyta
Aby uniknąć problemów, które mogą wystąpić podczas usuwania produktu $http w przyszłości, należy użyć zmiennej $got w celu wysłania żądania HTTP z syntetycznego PoP 1.0.13. Ta zmienna używa modułu got .
Więcej informacji na temat wysyłania różnych typów żądań HTTP za pomocą produktu $gotzawiera sekcja Tworzenie przypadku testowego interfejsu REST API.
$secure
Skrypt API Instana obsługuje referencje użytkownika do bezpiecznego przechowywania danych niejawnych, takich jak hasło lub klucz uwierzytelniania.
Aby utworzyć informacje autoryzacyjne za pomocą interfejsu API, wykonaj następujące kroki:
- Upewnij się, że masz odpowiednie ustawienie uprawnień.
- Użyj opcji Synthetic OpenAPI , aby utworzyć informacje autoryzacyjne, przekazując wartości
credentialNameicredentialValue.
Następnie w skrypcie interfejsu API należy użyć komendy $secure.credentialName , aby odwołać się do utworzonych informacji autoryzacyjnych, na przykład $secure.password lub $secure.API_KEY.
$syntetyczny
Aby uzyskać dostęp do środowiska i zmiennych środowiska wykonawczego w skrypcie, można użyć programu $synthetic.var_name . Patrz następujące predefiniowane zmienne:
- $synthetic.LOCATION lub $synthetic.pop: służy do uzyskiwania dostępu do etykiety location , która jest pierwszą częścią zmiennej controller.location .
- $synthetic.TEST_ID lub $synthetic.id: służy do uzyskiwania dostępu do identyfikatora wykonanego testu syntetycznego.
- $synthetic.TEST_NAME lub $synthetic.testName: służy do uzyskiwania dostępu do etykiety test wykonywanego testu syntetycznego.
- $synthetic.TIME_ZONE lub $synthetic.timeZone: służy do uzyskiwania dostępu do strefy czasowej PoP , która uruchamia test syntetyczny.
- $synthetic.JOB_ID lub $synthetic.taskId: służy do uzyskiwania dostępu do identyfikatora zadania odtwarzania i jest to również identyfikator wyniku.
- $synthetic.testType: służy do uzyskiwania dostępu do typu testu.
- $synthetic.description: służy do uzyskiwania dostępu do opisu testu.
Można również zdefiniować niestandardowe zmienne środowiskowe w pliku values.yaml na wykresie Helm. Patrz następujący przykład:
controller:
customProperties: "tag1=value1;tag2=value2"
Następnie należy użyć zmiennych $synthetic.tag1 i $synthetic.tag2 w skrypcie, aby uzyskać dostęp do tych zmiennych niestandardowych.
Aby uzyskać dostęp do właściwości niestandardowych zdefiniowanych w sekcji customProperties definicji testu, można użyć funkcji $synthetic.labels.xxx w celu uzyskania dostępu do wartości właściwości w skrypcie. Patrz następujący przykład:
// to print test custom tags/labels
console.log('Test Label $synthetic.labels.Team: ' + $synthetic.labels.Team);
console.log('Test Label $synthetic.labels.Purpose: ' + $synthetic.labels.Purpose);
$atrybuty
Użyj opcji $attributes , aby dodać lub pobrać atrybuty niestandardowe w celu monitorowania danych. Programiści skryptów API mogą dodawać niestandardowe dane pary key/value jako atrybuty niestandardowe. Dane niestandardowe służą jako dodatek do atrybutów domyślnych. Te atrybuty niestandardowe są również przechowywane w wynikach monitora z innymi domyślnymi atrybutami wyników monitora. Aby uzyskać dostęp do atrybutów niestandardowych, należy użyć komendy $attributes w skrypcie interfejsu API Instana:
$attributes.set('tag1', 'value1') // sets tag tag1 to value value1
let v = $attributes.get('tag1') // sets variable v to the value of tag1
$sieć
Następujące interfejsy API są obsługiwane w monitorowaniu syntetycznym Instana w celu skonfigurowania serwera proxy:
$network.setProxy(string proxy): służy do ustawiania serwera proxy, który ma być używany dla wszystkich żądań (HTTP, HTTPS).$network.setProxyForHttp(string proxy): służy do ustawiania serwera proxy, który ma być używany tylko dla żądań HTTP.$network.setProxyForHttps(string proxy): służy do ustawiania serwera proxy, który ma być używany tylko dla żądań HTTPS.$network.clearProxy(): służy do usuwania konfiguracji serwera proxy.$network.getProxy(): służy do zwracania konfiguracji serwera proxy.
W poniższym przykładzie użyto serwera 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
Użyj tego interfejsu API zabezpieczeń, aby zredagować dane wrażliwe.
Wszystkie znane informacje poufne są zamaskowane znakiem *, zanim zostaną zapisane w plikach rejestrowania i wysłane do zaplecza.
Syntetyczny PoP nie gromadzi danych nagłówka i treści HTTP. Aby zredagować dane niejawne z adresów URL, należy użyć komendy $util.secrets.setURLSecretsRegExps w skrypcie. Patrz następujący przykład:
// to redact 'key', 'password' and 'secret' query parameters in URL
$util.secrets.setURLSecretsRegExps([/key/i, /password/i, /secret/i]);
Po wywołaniu tego interfejsu API adres URL https://example.com/accounts/status?key=mykey123&secret=mysecret jest gromadzony i wyświetlany w interfejsie użytkownika Instana jako https://example.com/accounts/status?key=*&secret=* .
Pisanie instrukcji testowania interfejsu REST API
Aby napisać przypadek testowy interfejsu REST API, wykonaj następujące kroki:
Wyślij żądanie HTTP. W poniższym przykładzie przedstawiono sposób wysyłania żądań HTTP GET i POST oraz sprawdzania poprawności ich kodu statusu i treści odpowiedzi:
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'); })();Domyślnie wartość "uzyskano" spowoduje ponowną próbę 2 razy w przypadku niepowodzenia. Aby wyłączyć tę opcję, należy ustawić właściwość options.retry na wartość
{limit: 0}.Aby sprawdzić poprawność wyników, należy zaimportować moduł
assertza pomocą komendyconst assert=require('assert');i wywołać metodęassertw celu sprawdzenia poprawności odpowiedzi punktu końcowego.Aby sprawdzić poprawność odpowiedzi statusCode, zapoznaj się z następującym przykładem:
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')Aby sprawdzić poprawność treści odpowiedzi, zapoznaj się z następującym przykładem:
let bodyObj = (typeof body == 'string') ? JSON.parse(body) : body; assert.ok(bodyObj.id != null, 'id should not be null');Więcej interfejsów API asercji zawiera sekcja Interfejs API asercji. Inny moduł do sprawdzania poprawności wyniku to chai.
Aby debugować skrypt, należy użyć komendy
console. Zawartość dziennika można wyświetlić w interfejsie użytkownika Instana.console.info() console.log() console.error() console.warn()
Wysyłanie żądań GET HTTP
Aby wysłać żądanie GET, należy użyć następującej składni:
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');
})();
Wysyłanie żądań HTTP POST
Aby wysłać żądanie JSON POST, należy użyć następującej składni:
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');
})();
Aby wysłać żądanie formularza POST, należy użyć następującej składni:
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');
})();
Wysyłanie żądań obsługi TLS/SSL
Aby wysłać żądanie HTTPS i zezwolić na niezabezpieczony certyfikat, należy użyć następującej składni:
// Allow the insecure certificate
await $got('https://example.com', {
https:{ rejectUnauthorized: false }
});
Aby wysłać żądanie protokołu TLS/SSL z certyfikatem, należy użyć następującej składni:
// Single key with passphrase
await $got('https://example.com', {
https: {
key: $secure.key,
certificate: $secure.certificate,
passphrase: $secure.passphrase
}
});
Uwaga: Utwórz referencje do przechowywania klucza, certyfikatu i frazy hasła.
Wysyłanie żądań uwierzytelniania podstawowego
Aby wysłać żądanie podstawowego uwierzytelniania, należy użyć następującej składni:
await $got.get('http://some.server.com/', {
https:{ rejectUnauthorized: false },
headers: {
Authorization: "Basic " + $secure.AUTH_CRED
}
});
Uwaga: Należy utworzyć zmienną referencji AUTH_CRED , aby zapisać nazwę użytkownika i hasło podstawowego uwierzytelniania HTTP. Format zmiennej referencji AUTH_CRED jest następujący: username:password , która jest zakodowana przy użyciu kodowania base64.
Wysyłanie żądań z użyciem znacznika niedźwiedzia
Aby wysłać żądanie uwierzytelnienia niedźwiedzia, należy użyć następującej składni:
await $got.get('http://some.server.com/', {
headers: {
'Authorization': "Bearer " + $secure.authToken
}
});
Uwaga: Utwórz informacje autoryzacyjne, aby zapisać tekst authToken .
Zarządzanie modułami
Importowanie modułu opcjonalnego
Aby zaimportować obsługiwany moduł, wykonaj standardową procedurę importowania pliku Node.js . Patrz następujący przykład:
const crypto = require('crypto-js');
Obsługiwane moduły podstawowe
Obsługiwane są następujące moduły podstawowe:
- Asercja
- haki asynchroniczne
- bufor
- Stałe
- kryptografia
- dgram
- dns
- domena
- zdarzenia
- FS
- http
- http2
- https
- moduł
- net
- os
- najkrótszych
- haki wydajności
- Punycode
- QueryString
- pełnych
- dekoder łańcucha
- Liczniki czasu
- TLS
- Zdarzenia śledzenia
- tty
- url
- UTIL
- zlib,
Obsługiwane moduły innych firm
Obsługiwane są następujące moduły innych firm:
- assert-plus 1.0.0
- atob 2.1.2
- @aws-sdk/client-s3 3.387.0
- @babel/core 7.23.2
- basic-ftp 4.6.6
- analizator składni treści 1.20.0
- btoa 1.2.1
- klon 0.1.19
- kolory 1.4.0
- consoleplusplus 1.4.4
- crypto-js 4.2.0
- debug (debugowanie) 2.6.9
- rozszerz 3.0.2
- faker 5.5.3
- 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
- moment 2.29.4
- net-snmp 3.8.2
- node-stream-zip 1.15.0
- prom-client 14.2.0
- bufory protokołu 4.2.0
- q 1.5.1
- żądanie 2.88.2
- powinno 13.2.3
- sip 0.0.6
- ssh2-sftp-client 7.2.3
- sshpk 1.17.0
- ssl-checker (kontroler SSL) 2.0.8
- swagger-analizator składni 8.0.4
- Kodowanie tekstu 0.7.0
- thrift 0.14.2
- twarda-informacja cookie 4.1.3
- podkreślenie 1.13.4
- rozpakowywanie 0.10.11
- url-parse 1.5.10
- urllib 2.41.0 ,
- uuid 3.4.0 ,
- analizator poprawności 13.7.0
- 7.5.8
- xml2js 0.5.0
Lokalne testowanie i debugowanie skryptu interfejsu API
synthetic-api-script jest modułem węzła służącym do programowania i debugowania skryptów API w środowisku lokalnym. Więcej informacji na ten temat zawiera plik readme.
Korzystanie z komendy script-cli
Aby przetestować i debugować skrypt API, należy użyć komendy script-cli , jak pokazano w poniższym przykładzie:
# 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
Tworzenie pojedynczego testu skryptu interfejsu API
Po utworzeniu skryptu syntetycznego wykonaj następujące kroki:
Użyj programu
synthetic-api-script, aby utworzyć skrypt interfejsu API i przekształcić go w łańcuch za pomocą komendyscript-cli:# Usage: script-cli -s <script-file-path> # Example: script-cli -s examples/got-get.jsW poniższym przykładzie przedstawiono wynik:
{ "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" }Skopiuj i wklej treść skryptu, aby zbudować następujący przykładowy kod JSON testu skryptu interfejsu API.
{ "label": "APIScript_Test", "active": true, "testFrequency": 1, "locations": ["DemoPoP1_saas_instana_test"], "configuration": { "syntheticType": "HTTPScript", "script": "converted script string" } }
Tworzenie testu spakowanego skryptu interfejsu API
Jeśli logika biznesowa jest złożona, nie należy zawierać wszystkich elementów w pojedynczym skrypcie, ponieważ programistom trudno jest zarządzać wieloma plikami skryptów w repozytorium Git .
Aby utworzyć test spakowanego skryptu interfejsu API, wykonaj następujące kroki:
Pakunki skryptów w skompresowanym pliku przy użyciu komendy script-cli :
# Usage: script-cli -z <bundle-script-folder> <entry-script> # Example: script-cli -z bundle-example1 bundle-example1/index.jsWypełnij pola
scriptFileibundlew konfiguracji testu danymi wyjściowymi komendyscript-cli:scriptFilejest punktem wejścia spakowanego skryptu.bundlejest skompresowanym plikiem zakodowanym w formacie base64.
Aby utworzyć test pakietu syntetycznego, wypełnij ładunek testu, jak pokazano w poniższym przykładzie:
{
"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"
}
}
}
Przykłady skryptów
Przykład 1: skrypt interfejsu API Instana do testowania interfejsów API httpbin
Za pomocą skryptu API Instana można testować interfejsy API httpbin w następujący sposób:
const assert = require('assert');
(async function () {
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");
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');
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');
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");
// 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 tags/labels
console.info('Test Label $synthetic.labels.Team: ' + $synthetic.labels.Team);
console.info('Test Label $synthetic.labels.Purpose: ' + $synthetic.labels.Purpose);
// to set custom tags dynamically
$attributes.set('custom_tag1', 'value1');
})();
Przykład 2: skrypt interfejsu API Instana do testowania certyfikatu serwisu WWW
Za pomocą skryptu interfejsu API Instana można przetestować certyfikat SSL dla produktu ibm.com w następujący sposób:
const sslChecker = require('ssl-checker');
const assert = require('assert');
const hostname = 'ibm.com';
const remainDays = 90;
const getSslDetails = async(hostname) => {
const result = await sslChecker(hostname);
console.log(`certificate is valid: ${result.valid}`);
console.log(`certificate expires on: ${result.validTo}`);
console.log(`certificate days remaining: ${result.daysRemaining}`);
assert.equal(result.valid, true, 'certificate of ibm should be valid');
// this script will fail if the certificate remaining days less than 90 days by default
// modify variable remainDays to any value as you need
assert.equal(result.daysRemaining >= remainDays, true, `certificate validated remain days is less than ${remainDays} days`);
};
getSslDetails(hostname);
Więcej przykładów skryptu interfejsu API zawiera sekcja Skrypt syntetycznego interfejsu API.