ノードのデバッグ方法.Thundra先見性によるJSテスト


雲は私たちの時代のデフォルトの環境です.レンタルインフラストラクチャは、あなたのクラウドプロバイダに操作の大部分を動かすことによってあなたの税金とリスクを下げるのを助けます.クラウドを使用すると、常にデータベースの更新やOSのメンテナンスについて心配せずにお客様のニーズに焦点を当てることができます.
しかし、クラウドはすべてをより良くしませんまた、テストやデバッグなどのソフトウェア配信パイプラインの一部を複雑にします.お客様の生産環境をヒットする問題は、お客様のコスト、順番に、実際のお金をすることができます.それはテストが不可欠であり、テストをクラウドベースのソフトウェアは、雲のテストを意味します.
Thundraの先見性は、データセンターのサーバー上のテストの痛みをはるかに容易にすることができます.それはあなたが実際のインフラストラクチャのテストを実行しながら、クラウド内のすべての分散サービスをリンクする必要がある洞察を与える.
今日、我々はノードのリリースを発表して満足している.Thundra先見性のためのJSサポート.この記事は、AWSラムダのノードを使用してAWSインフラストラクチャに展開するServerlessアプリケーションに飛び込みます.ランタイム.

必要条件
この例では、AWSアカウントとTundraアカウントが必要になります.CDKパターンライブラリからServerlessなアプリケーションを使用しますので、ローカルノードも必要です.JS、Git、AWS CLIインストール.このセットアップを得る最も速い方法は、AWS Cloud 9インスタンスを提供することです.

サガステップ関数
ここで使用している例は、CDKパターンライブラリ、AWS CDKインフラストラクチャをコードフレームワークとして使用する際にベストプラクティスに従うサンプルアプリケーションのリポジトリです.
図1では、アプリケーションの実際のアーキテクチャを見ることができます.これは、APIゲートウェイ、ステップ機能の状態機械、ダイナモテーブル、およびいくつかのラムダ関数が付属しています.

図1 :アプリケーションのアーキテクチャ

サンプルリポジトリのクローン
我々の例のためのベースは、Githubの上のCDKパターンライブラリの「サガステップ機能」倉庫です.この例は次のコマンドで取得できます.
$ npx cdkp init the-saga-stepfunction

アプリケーションの配備
アプリケーションが任意の変更なしに展開する準備が整いました.次のコマンドを入力します.
$ npm run deploy
展開は1分かそこらかかる.終了したら、APIゲートウェイのエンドポイントにURLが表示されます.次の手順でこのURLが必要になります.

E 2 Eテストの作成
展開後、ブラウザで開くことができるAPIゲートウェイのエンドポイントが表示されます.アプリケーションは、getリクエストとパラメータなしでURLを呼び出すことを許可するように設定されます.
この動作をテストするには、test ディレクトリe2e.test.ts 次のコンテンツを使用します.
import * as https from "https";

const url = "<API_ENDPOINT_URL>";

describe("API Gateway", () => {
  it("can be called without parameters", (done) => {
    https.get(url, (response) => {
      expect(response.statusCode).toEqual(200);
      done();
    });
  });
});
テストの実行を高速化するには、テストディレクトリ内の他のすべてのファイルを削除することもできます.置換するAPI_ENDPOINT_URL あなたが前のステップで得たURLで.
AWS領域に例を配備しなかった場合us-east-1 , あなたのテストはおそらく失敗します500 HTTPステータスコード.しかし、何かをデバッグしたいので、これは良いことです!

Thundra予見の設定
Thundra予見サポートdifferent integrations . ここでJEST用の手動統合を使用します.まず、NPM経由でTundraクライアントをインストールする必要があります.
$ npm i dotenv @thundra/core@^2.13 jest-circus@^26.6 -D
バージョン27のjest パッケージをインストールして、同じバージョンでJestサーカスパッケージをインストールしました.これは、プロジェクトが将来更新される場合、あなたにとっては異なるかもしれません.
次に、jest.config.js ファイル
require("dotenv").config();
module.exports = {
  roots: ["<rootDir>/test"],
  testMatch: ["**/*.test.ts"],
  transform: {
    "^.+\\.tsx?$": "ts-jest",
  },
  testRunner: "jest-circus/runner",
  testEnvironment:
    "@thundra/core/dist/bootstrap/" +
    "foresight/jest/JestDefaultEnvironment.js",
};
また、追加dotenv ミックスに追加します.env Tundraクライアントが必要とする環境変数を設定するプロジェクトにファイルします.そのファイルの内容は次のようになります.
THUNDRA_APIKEY=<YOUR_API_KEY>
THUNDRA_AGENT_TEST_PROJECT_ID=lt;YOUR_PROJECT_ID>
APIキーとプロジェクトIDを収集するには、Tundrahome page をクリックします.プロジェクトは、“サガステップの機能のような名前を付けます.”その後、手動での統合を選択し、“続行”をクリックします
新しいプロジェクトを作成した後、the project list . 新しいプロジェクトでは、小さなギアボタンをクリックします.資格情報が必要になります.コピーします.env ファイル.
最後に、Gitリポジトリとしてプロジェクトを初期化する必要があります.例のアプリケーションがダウンロードされたが、あなたのために作成された倉庫がないので、手動でこれを行う必要があります.このようにして、どのコミットが後で先見性のエラーにつながったかを見ることができます.
$ git init
$ git add -A
$ git commit -m "Init"

E 2 Eテストの先見性
すべてが設定されたら、次のコマンドでテストを再実行できます.
$ npm run test
さて、先見のテスト実行の結果を見るべきです.図2の下に、すべてのテストのテスト実行の概要を示します.この場合、それはちょうど1です、そして、それは失敗しました.

図2 :テスト実行概要
失敗したテストをクリックすると、以下の図3に示すように詳細を得ることができます.

図3 :テストの詳細
たとえば、エラーメッセージ(サーバーは200の代わりに500 HTTPステータスコードを返します)とスタックトレースを受け取ります.この場合、どちらも非常に役に立ちません.スタックトレースはテストを含むファイルのみを示していますが、500ではバックエンド上の何かが間違っているので、スタックトレースには表示できません.
「トレースマップ」をクリックすると、バックエンドで何が起こっているかがわかります.

不完全なトレースマップ
まあ、そのトレースは役に立たない.それは、我々がバックエンドと呼ばれることを示すだけです.これは、Tundraは、テストランナーから情報を使用することができますので、先見から受信されます.あなたはより良いトレースマップを得るためにTundraラムダ拡張子を使用してラムダ関数を計測する必要があります!

ラムダ関数の計測
ラムダ関数を指定するには、Tundraラムダ層を追加しなければなりません.これはlib/the-saga-stepfunction-single-table-stack.ts 以下の変更点を持つファイル
まず、スタックのCreateLambdaメソッドを更新する必要があります.
createLambda(
    scope: cdk.Stack, 
    id: string, 
    handler: string, 
    table: dynamodb.Table) {
    if (!this.thundraLayer)
      this.thundraLayer = lambda.LayerVersion.fromLayerVersionArn(
        scope,
        "ThundraLayer",
        "arn:aws:lambda:eu-west-1:269863060030:" +     
        "layer:thundra-lambda-node-layer-minified:93"
      );

    let fn = new lambda.Function(scope, id, {
      runtime: lambda.Runtime.NODEJS_12_X,
      code: lambda.Code.fromAsset("lambda-fns"),
      handler: "thundra_handler.wrapper",
      layers: [this.thundraLayer],
      environment: {
        TABLE_NAME: table.tableName,
        thundra_apiKey: "<THUNDRA_API_KEY>",
        thundra_agent_lambda_handler: handler,
      },
    });
    // Give our Lambda permissions to read and write data from the passed in DynamoDB table
    table.grantReadWriteData(fn);

    return fn;
  }
The THUNDRA_API_KEY を使用するのと同じです.
また、APIゲートウェイが呼び出すラムダ関数を更新する必要があります.
const sagaLambda = new lambda.Function(
      this, 
      "sagaLambdaHandler", {
      runtime: lambda.Runtime.NODEJS_12_X,
      code: lambda.Code.fromAsset("lambda-fns"),
      handler: "thundra_handler.wrapper",
      layers: [this.thundraLayer],
      environment: {
        statemachine_arn: saga.stateMachineArn,
        thundra_apiKey: "<THUNDRA_API_KEY>",
        thundra_agent_lambda_handler: "sagaLambda.handler",
      },
    });
以下のコマンドを実行して、新しいバージョンを展開します.
$ npm run build
$ npm run deploy
Tundraがラムダ関数を知っているので、先の図5のように、先見のコンソールのテストの「トレースマップ」ボタンをクリックしてトレースを見ることができます.

図5 :計装トレース
今回は、APIゲートウェイをsagaLambdaHandler 機能エラーがあったので、テストは赤色にマークされます.
関数のアイコンをクリックすると、図6の説明が右側に表示されます.

図6 :エラーの詳細
ステートマシンは存在しません!なぜ?我々が配備したのでeu-west-1 そしてラムダ関数はus-east-1 . あなたはそれを修正することができますsagaLambdaHandler にあるコードlambda-fns/sagaLambda.ts . 上部には、ステップ機能クライアントを作成しますus-east-1 あなたが変更する必要がある領域.我々は、我々を変えますeu-west-1 .
const stepFunctions = new AWS.StepFunctions({
  region: "eu-west-1"
});
ファイルを保存し、再構築し、再配備し、テストを再実行します.
$ npm run build
$ npm run deploy
$ npm run test
最後に、エラーがなくなり、テストがパスします.先見のコンソールを見て、通過テストのトレースマップを確認できます.下記の図7は、状態機械があなたのラムダ関数のすべてを呼んだので、トレースマップが現在完全であることを示します.

図7 :完全なトレース

結論
一般的に、クラウドレス開発は、特に無制限の開発は、彼らと来るunique challenges . このようなシステムをテストするには、さまざまな部分にバグがあります.Thundraの先見性は、クラウドで実行しているサービスの膨大な数でこれらのエラーを見つけるのに役立ちます.さて、ノード.JS開発者は、その力を利用することができます!
Tundraの先見性はオープンソースプロジェクトのために永遠に無料で提供することによってオープンソースコミュニティをサポートしています.
Tundraの先見性はオープンソースプロジェクトのために永遠に無料で提供することによってオープンソースコミュニティをサポートしています.あなたはsign up , あなたの無料アカウントを取得し、今日の先見性を使用して起動します.