API 脚本ガイド

Instana API スクリプトのリファレンス

Instana ( API )スクリプトは、 Instana ( API )と連携して、 Instana の監視機能を強化する操作を実行します。 API スクリプトは、 CommonJS モジュールシステムを搭載した Node.js 22に対応しています。 ESMはサポートされていません。

グローバル変数

Instana のSynthetic API スクリプトでは、スクリプト開発を効率化するために、以下の事前定義されたグローバル変数が使用されています:

API 詳細
$got gotモジュールを使用して HTTP リクエストを送信する
$http requestモジュールによる HTTP リクエストの送信(非推奨)
$secure ユーザー資格情報へのアクセス
$attributes カスタマイズされた属性の管理
$network このネットワーク・ユーティリティーを使用したプロキシーのセットアップ
$synthetic 環境変数のアクセス
$util セキュリティー API などのユーティリティー機能の使用

$got

将来的に $http 置き換えるには、変数 $got を使用して、Syntheticから HTTP リクエストを送信してください。 PoP 1.0.13 この変数は、 got モジュールを使用します。

HTTP へのさまざまなリクエストの送信方法の詳細については、「 $gotREST API のテストケースの作成」 を参照してください。

$http(非推奨)

$http が非推奨になりました。 代わりに $got を使用してください。

1つの API スクリプト内で、1つ以上のリクエストを送信することができます。 Instana の「Synthetic」 API スクリプトは、事前定義された変数 $http `or` を使用して、 HTTP$got リクエストを送信します。 $http 変数は、 @cypress/request モジュールに基づいています。 $http は、古いスクリプトとの互換性を保つために非推奨になり、一時的に予約されています。後で削除される予定です。 新しい変数 $gotを使用します。

$secure

Instana の API スクリプトは、パスワードや認証キーなどの機密情報を安全に保存するために、ユーザー認証情報の使用をサポートしています。

API を使用して認証情報を作成するには、以下の手順を実行してください:

  1. 適切な権限設定になっていることを確認してください。
  2. OpenAPI または synctl コマンドを使用して、と credentialName を指定して認証情報 credentialValueを作成します。

次に、 API スクリプト内で、作成した認証情報を参照 $secure.credentialName するには を使用します。例えば、 $secure.password$secure.API_KEYなどです。

注: サポートされているのは $secure.credentialName 形式のみです。 この $secure[credentialName] 形式はサポートされていません。
注: セキュアな認証情報の参照($secure.credentialName)は、スクリプトの実行前に解決されます。 資格情報の名前を直接指定する必要があります。 eval()変数や文字列連結、または を使用して動的に参照を構築しないでください。これらの方法はサポートされておらず、評価されません。

$synthetic

$synthetic.var_name を使用して、スクリプト内の環境変数およびランタイム変数にアクセスできます。 以下の事前定義変数を参照してください。

  • $synthetic.LOCATION または $synthetic.pop: location ラベル ( controller.location 変数の最初の部分) にアクセスするために使用されます。
  • $synthetic.TEST_ID または $synthetic.id: 実行されるシンセティック・テストの ID にアクセスするために使用されます。
  • $synthetic.TEST_NAMEまたは$合成.テスト名: アクセスするために使用テスト実行される合成テストのラベル。
  • $synthetic.TIME_ZONEまたは$合成タイムゾーン: タイムゾーンにアクセスするために使用されますPoP合成テストを実行します。
  • $synthetic.JOB_IDまたは$合成タスクID : 再生タスクの識別子にアクセスするために使用され、結果 ID でもあります。
  • $合成.テストタイプ: テストタイプにアクセスするために使用されます。
  • $synthetic.description: テストの説明にアクセスするために使用されます。

また、 helm チャートの[設定 values.yaml ]で、カスタム環境変数を定義することもできます。 以下の例を参照してください。

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

次に、スクリプトで $synthetic.tag1 および $synthetic.tag2 を使用して、これらのカスタム変数にアクセスします。

テスト定義の customProperties セクションで定義されたカスタム・プロパティーにアクセスするには、 $synthetic.labels.xxx を使用してスクリプト内のプロパティー値にアクセスします。 以下の例を参照してください。

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

$attributes

$attributes を使用して、データをモニターするためのカスタム属性を追加または取得します。 API スクリプト開発者は、カスタム属性としてカスタムペア key/value データを追加できます。 カスタム・データは、デフォルト属性への追加として機能します。 これらのカスタム属性は、デフォルト属性とともにテスト結果に組み込まれます。

Instana Synthetic Monitoringでは、カスタム属性を設定するために以下のAPIをサポートしています:

  • $attributes.set(key, value): キーまたは値を設定します。
  • $attributes.get(key): 指定されたキーの値を返します。
  • $attributes.getKeys(): すべてのキーの配列を返します。
  • $attributes.has(key): キーが存在する場合は true を返します。
  • $attributes.unset(key): 指定された鍵を削除します。
  • $attributes.unsetAll(): すべてのカスタム・データを削除します。

カスタム属性にアクセスするには、 InstanaAPI$attributes スクリプト内で以下を使用してください:

$attributes.set('tag1', 'value1') // sets tag tag1 to value value1
let v = $attributes.get('tag1')   // sets variable v to the value of tag1
 
注: スクリプト内の ` $attributesAPI ` で設定されたカスタム属性や、テスト定義の `` customProperties セクションで定義されたカスタムプロパティは、テスト結果内で ` synthetic.tags metric` を使用して参照できます。また、`metric synthetic.tags ` を使用してテスト結果をフィルタリングしたり、Smart Alert のカスタムペイロードにカスタム値を渡したりすることも可能です。

$network

Instana のSyntheticモニタリングでは、プロキシサーバーの設定に関して以下のAPIがサポートされています:

  • $network.setProxy(string proxy): すべてのリクエスト( HTTP、 HTTPS )で使用するプロキシサーバーを設定するために使用します。
  • $network.setProxyForHttp(string proxy): HTTP リクエストにのみ使用するプロキシサーバーを設定するために使用します。
  • $network.setProxyForHttps(string proxy): HTTPs 要求にのみ使用するプロキシー・サーバーを設定するために使用します。
  • $network.clearProxy(): プロキシー構成を削除するために使用します。
  • $network.getProxy(): プロキシー構成を返すために使用されます。

以下の例では、プロキシーを使用しています。

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

機密情報を伏せるには、このセキュリティ API をご利用ください。

既知の機密情報はすべて、情報がロギング・ファイルに書き込まれてバックエンドに送信される前に、* 文字でマスクされます。

Synthetic PoP は、 HTTP のヘッダーおよび本文データを収集しません。 URLから機密情報を伏せたい場合は、スクリプト内で ` $util.secrets.setURLSecretsRegExps ` コマンドを使用してください。 以下の例を参照してください。

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

この API が呼び出された後、 URLhttps://example.com/accounts/status?key=mykey123&secret=mysecret が収集され、 Instanahttps://example.com/accounts/status?key=*&secret=* のUIに表示されます。

REST API のテストケースの作成

REST API のテストケースを作成するには、以下の手順に従ってください:

  1. HTTP リクエストを送信します。 次の例は、 HTTP へのGETリクエストおよび POST へのリクエストを送信し、そのステータスコードとレスポンス本文を検証する方法を示しています:

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

    デフォルトでは、失敗すると 2 回再試行されます。 このオプションを無効にするには、 options.retry を {limit: 0}に設定します。

  2. 結果を検証するには、 const assert=require('assert'); コマンドを使用して assert モジュールをインポートし、 assert メソッドを呼び出してエンドポイント応答を検証します。

    応答を検証するにはstatusCode,次の例を参照してください。

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

    応答コンテンツを検証するには、以下の例を参照してください。

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

    その他の assert API については、 assert API を参照してください。 結果を検証するもう 1 つのモジュールは chaiです。

  3. スクリプトをデバッグするには、 console コマンドを使用します。 ログの内容は、 Instana のUIで確認できます。

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

HTTP への GET リクエストの送信

GET 要求を送信するには、以下の構文を使用します。

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

POST へのリクエストを送信中 HTTP

POST JSON リクエストを送信するには、次の構文を使用します:

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

POST のフォームリクエストを送信するには、次の構文を使用します:

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

TLS / SSL へのサポートリクエストの送信

HTTPS リクエストを送信し、セキュリティ保護されていない証明書を許可するには、次の構文を使用します:

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

証明書を添付して TLS / SSL プロトコルのリクエストを送信するには、次の構文を使用します:

 // Single key with passphrase
 await $got('https://example.com', {
   https: {
     key: $secure.key,
     certificate: $secure.certificate,
     passphrase: $secure.passphrase
   }
 });
 
注: 鍵、証明書、およびパスフレーズを保存するための認証情報を作成してください。

基本認証リクエストの送信

基本認証要求を送信するには、以下の構文を使用します。

 await $got.get('http://some.server.com/', {
   https:{ rejectUnauthorized: false },
   headers: {
     Authorization: "Basic " + $secure.AUTH_CRED
   }
 });
 
注: HTTPAUTH_CRED の基本認証用のユーザー名とパスワードを保存するために、認証情報変数を作成する必要があります。 credential AUTH_CRED 変数の形式は、でエンコードされた base64ものです username:password

ベアラー・トークンを使用したリクエストの送信

ベアラ認証リクエストを送信するには、以下の構文を使用する:

 await $got.get('http://some.server.com/', {
   headers: {
     'Authorization': "Bearer " + $secure.authToken
   }
 });
 
注:authToken というテキストを保存するための認証情報を作成してください。

モジュールの管理

オプションモジュールのインポート

サポートされるモジュールをインポートするには、 Node.js のインポートに関する標準的な手順に従ってください。 以下の例を参照してください。

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

対応コアモジュール

サポートされるコア・モジュールは以下のとおりです。

  • アサート
  • 非同期フック
  • バッファー
  • 定数
  • 暗号
  • Dgram
  • DNS
  • ドメイン
  • イベント
  • fs
  • http
  • http2
  • HTTPS
  • モジュール
  • os
  • パス
  • パフォーマンス・フック
  • 穿孔コード
  • queryString
  • ストリーム
  • ストリング・デコーダー
  • タイマー
  • tls
  • トレース・イベント
  • tty
  • URL
  • Util
  • zlib

対応しているサードパーティ製モジュール

以下のサード・パーティー・モジュールがサポートされています。

  • assert-plus 1.0.0
  • VOB 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/コア 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
  • 複製 0.1.19
  • 色 1.4.0
  • consoleplusplus 1.4.4
  • 暗号 js 4.2.0
  • デバッグ 2.6.9
  • 3.0.2 の拡張
  • Faker 5.5.3
  • 11.8.6 を取得しました
  • Ji 17.6.0
  • js-yaml 3.14.1
  • JSPRIM 1.4.2
  • kafkajs 2.2.4
  • ldapauth-fork 5.0.5
  • 宿泊施設 4.17.21
  • モーメント 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-クライアント 14.2.0
  • protocol-buffers 4.2.0
  • 1.5.1
  • 要求 ( @cypress/request@3.0.1に基づく)
  • 13.2.3
  • SIP 0.0.6
  • ssh2-sftp-client 7.2.3
  • sshpk 1.17.0
  • ssl-チェッカー 2.0.8
  • swagger-パーサー 8.0.4
  • telnet-client 2.2.1
  • テキスト・エンコード 0.7.0
  • スリフト 0.14.2
  • タフクッキー 4.1.3
  • 下線 1.13.4
  • unzipper 0.10.11
  • url-parse 1.5.10
  • urllib2.43.0
  • uuid 3.4.0
  • バリデーター 13.7.0
  • わあ7.5.10
  • xml2js 0.5.0
注: リクエストモジュールをインポートするために、これを require('@cypress/request') 直接使用することはできません。 リクエストモジュールをインポートするには require('request') を使用するか、変数 を使用してください $http

API スクリプトのローカル環境でのテストとデバッグ

synthetic-api-script ローカル環境で API スクリプトを開発・デバッグするためのNode.jsモジュールです。 詳しくは、 README ファイルを参照してください。

script-cli コマンドの使用

API スクリプトをテストおよびデバッグするには、次の例に示すように コマンド script-cli を使用します:

# 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
 

API スクリプトの単体テストを作成する

シンセティック・スクリプトを作成した後、以下のステップを実行します。

  1. を使用して synthetic-api-scriptAPI スクリプトを作成し、次の script-cli コマンドでそのスクリプトを文字列に変換します:

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

    以下の例では、結果を表示します。

    {
      "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. スクリプトの内容をコピーして貼り付け、以下のサンプル API スクリプトのテスト JSON を作成してください。

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

API スクリプトのバンドルテストの作成

ビジネス・ロジックが複雑である場合は、開発者が Git リポジトリーで複数のスクリプト・ファイルを管理するのは難しいため、単一のスクリプトにすべてを含めることはできません。

API スクリプトのバンドルテストを作成するには、以下の手順を実行してください:

  1. script-cli コマンドを使用して、圧縮ファイルにスクリプトをバンドルします。

    # Usage:
    script-cli -z <bundle-script-folder> <entry-script>
    # Example:
    script-cli -z bundle-example1 bundle-example1/index.js
     
  2. テスト構成の および bundle に、 コマンド script-cliscriptFile の出力を入力してください:

    • scriptFile は、バンドルされたスクリプトのエントリー・ポイントです。
    • bundle は、 base64でエンコードされた圧縮ファイルです。

シンセティック・バンドル・テストを作成するには、以下の例に示すようにテスト・ペイロードを入力します。

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

スクリプトの例

API に認証情報を送信する

資格情報を作成するには、 synctl コマンドを使用します。 ユーザー名の資格情報とパスワードの資格情報を作成する例を次に示します。

synctl create cred --key username --value user123

synctl create cred --key password --value pass123
 

資格情報を使用した基本認証を以下の例に示します。

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 httpbin API をテストするためのスクリプト

Instana の API スクリプトを使用すると、次のようにhttpbin APIを同期的にテストできます:

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

 

API のスクリプト例については、 「Syntheticの API スクリプト」 を参照してください。