On this page:

手動トレーサ インストゥルメンテーションは、次の手順で構成されます。

  1. トレーサのインスタンス化
  2. トランザクションの作成
  3. トランザクションの開始と停止
  4. 外部終了コールの作成

トレーサのインスタンス化

トレーサをインスタンス化するには、AppDynamics.getTracer(context)メソッドを呼び出します。関数のエントリポイントメソッドの先頭にメソッドを配置します。

コードスニペットは、トレーサをインスタンス化する方法を示しています。

@Override
    public void handleRequest(InputStream input, OutputStream output, Context context) throws IOException {
 
		//Instantiate the tracer.
  		Tracer tracer = AppDynamics.getTracer(context);
 
		//Your AWS Lambda function code begins here.
		int letter = 0;
        while((letter = input.read()) >= 0) {
            output.write(Character.toUpperCase(letter));
		}
    }
JAVA

トランザクションの作成

次に、トランザクションを作成する必要があります。トランザクションは、より大規模なビジネストランザクションで監視されるセグメントです。トランザクションを作成するには、相関ヘッダーを検索する必要があります。サーバレストレーサがコンテキスト情報のダウンストリームを渡すために使用します。  

トランザクションは次のいずれかを実行します。

  • 新しいビジネストランザクションを開始する
  • 既存のビジネストランザクションを継続する

新しいビジネストランザクションを開始する

現在の関数で発生したトランザクションには、着信相関ヘッダーがありません。ビジネストランザクションを作成するには、createTransaction() メソッドを使用し、空の相関ヘッダーを提供します。 

既存のビジネストランザクションを継続する

既存のビジネストランザクションを続行するには、着信相関ヘッダーを検索する必要があります。相関ヘッダーは、自動または手動で検索できます。 

トレーサが相関ヘッダーを見つけることができない場合、トレーサは新しいビジネストランザクションを作成します。

相関ヘッダーを自動的に検索して、ビジネストランザクションを続行する

createTransaction(inputStream, context) メソッドを使用し、相関ヘッダーを自動的に検索するトランザクションを作成します。このメソッドは、singularityheader オブジェクト内の inputStream  と呼ばれるキーのコードのオブジェクトスキーマを検索します。相関ヘッダーは singularityheader キーを検索し、ビジネストランザクションを続行します。

トレーサは inputStream オブジェクトを読み取ります。このオブジェクトは一度だけ読み取れるように設定されています。アプリケーションが inputStream オブジェクトを読み取る必要がある場合は、コンバータメソッドを使用して、トレーサとアプリケーションの両方がストリームを読み取ることができるようにする必要があります。 

コードスニペットでは、トランザクションを作成して自動的に 相関ヘッダーを特定する方法例を示しています

public class <LambdaChops> implements RequestStreamHandler {
    @Override
    public void handleRequest(InputStream input, OutputStream output, Context context) throws IOException {
  	Tracer tracer = AppDynamics.getTracer(context);
	
	//Use a converter method if you need to read your inputStream more than once. The tracer reads your inputStream once.
  	inputStream = InputStreamConverter.convertToMarkSupportedInputStream(input);
 
	//Create a transaction. 
	Transaction transaction = tracer.createTransaction(input, context);

	//Your AWS Lambda function code begins here. 
        int letter = 0;
        while((letter = input.read()) >= 0) {
            output.write(Character.toUpperCase(letter));
        }
    }
}
JAVA
相関ヘッダーを手動で検索してトランザクションを作成する

カスタムロジックを使用して相関ヘッダーを検索するトランザクションを作成するには、correlationHeader 文字列を手動で解析する必要があります。次に、createTransaction() メソッドを呼び出して、correlationHeader オブジェクトを指定します。このプロセスにより、関数の入力ペイロードの解析を完全に制御できます。 

コードスニペットでは、相関ヘッダー文字列を取得してトランザクションを作成する方法例を示しています。

public class <LambdaChops> implements RequestHandler {
    @Override
	public O handleRequest(InputStream input, OutputStream output, Context context) {
	Tracer tracer = AppDynamics.getTracer(context);
     
	//Manually parse the correlation string.
     String inputAsString = IOUtils.toString(inputStream, Charset.forName("UTF-8"));
     JsonParser parser = new JsonParser();
     JsonObject inputObject = parser.parse(inputAsString).getAsJsonObject();
 
	String correlationHeader = "";
	if (inputObject.has(Tracer.APPDYNAMICS_TRANSACTION_CORRELATION_HEADER_KEY)) {
    	correlationHeader = inputObject.get(Tracer.APPDYNAMICS_TRANSACTION_CORRELATION_HEADER_KEY).getAsString();
	} else {
    	// Try reading from HTTP headers
    	if (inputObject.has("headers")) {
        	JsonObject httpHeaders = inputObject.getAsJsonObject("headers");
        	if (httpHeaders.has(Tracer.APPDYNAMICS_TRANSACTION_CORRELATION_HEADER_KEY)) {
            	correlationHeader = httpHeaders.get(Tracer.APPDYNAMICS_TRANSACTION_CORRELATION_HEADER_KEY).getAsString();
        }	
    }
}
 
	// Create transaction object using the correlation header. If the correlationHeader string is empty, the transaction you create uses the default transaction name.
	Transaction transaction = tracer.createTransaction(correlationHeader);
 
	//Your AWS Lambda function code starts here
	...
 
}
JAVA

トランザクションの開始と停止

トランザクションの作成後、トランザクションの境界を設定する必要があります。transaction.start() および transaction.stop() メソッドを使用し、トレーサでモニタするコードの任意のセクション付近に境界を配置します。

ベストプラクティスとして、関数がクラッシュした場合でも、try ブロック内で関数全体を実行し、finally ブロック内でトランザクションを停止することで、すべてのイベントを報告できます。  

次のコード例は、関数全体をモニタするトランザクションを開始および停止する方法を示しています。

@Override
 public void handleRequest(InputStream input, OutputStream output, Context context) throws IOException {
  Tracer tracer = AppDynamics.getTracer(context);
  Transaction transaction = tracer.createTransaction(input, context);
 
	//Start the transaction monitoring.
  	transaction.start();
  	try { 
   		int letter = 0;
        while((letter = input.read()) &gt;= 0) {
            output.write(Character.toUpperCase(letter));
		}
 
	//Stop the transaction monitoring. Place in a finally block to monitor all events. 
	} finally {
   		transaction.stop();
		AppDynamics.cleanup();
  	}  
 }
JAVA

外部終了コールの作成

createExitCall メソッドは exitCall オブジェクトを取得するために使用されます。終了コールオブジェクトは、外部終了コールで費やした時間を記録し、ダウンストリーム アクティビティの相関を許可します。 

終了コールタイプおよび識別プロパティ

コントローラでは、すべての終了コールに個別のタイプがあり、一連の識別プロパティによって決定されます。 

exitCall タイプおよび識別プロパティを次に示します。

exitCallタイプ
識別プロパティ
HTTP

HOST

PORT

URL

QUERY STRING

JDBC

URL

HOST

PORT

データベース

VERSION

VENDOR

WEB SERVICE

SERVICE

URL

OPERATION

SOAP ACTION

VENDOR

カスタムユーザ定義のプロパティセット


外部終了コールの作成

トランザクション オブジェクトで createExitCall() を呼び出します。 

次のコード例は、外部終了コールを実行する方法を示しています。

public void makeExitCall(URL url){
 
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
 
String outgoingHeader = null;
String callType = null;
Map<String, String> identifyingProperties = new HashMap<>();
    
//Below properties are appropriate for an inter-AWS Lambda call
identifyingProperties.put("DESTINATION", functionName);
identifyingProperties.put("DESTINATION_TYPE", "LAMBDA");
callType="CUSTOM";
    
//Below properties are appropriate for an external HTTP call
identifyingProperties.put("HOST", url.getHost());     
identifyingProperties.put("PORT", String.valueOf(url.getPort()));
callType="HTTP";
 
//Define the createExitCall method to obtain an exitCall object.     
ExitCall exitCall = transaction.createExitCall(callType, identifyingProperties);
outgoingHeader =  exitCall.getCorrelationHeader();
exitCall.start();
    
try {
// Tracer.APPDYNAMICS_TRANSACTION_CORRELATION_HEADER_KEY is the name of the header that should be set
   
    if (outgoingHeader != null) {
        conn.setRequestProperty(Tracer.APPDYNAMICS_TRANSACTION_CORRELATION_HEADER_KEY, outgoingHeader); // set the correlation header on an HttpURLConnection
    }
  
// Make the exit call here
  
} finally {
        exitCall.stop();
    }
}
JAVA

複数の外部終了コールの作成

1 つの AWS Lambda 関数が複数の終了コールを行う場合、各関数は一意の exitCall オブジェクトによって識別される必要があります。複数の終了コールを行うには、個別の終了コールごとに新しい exitCall オブジェクトを作成します。exitCall オブジェクトは再利用できません。 


これらのマニュアルで使用されている Amazon Web サービス、AWS ロゴ、AWS、およびその他の AWS マークは、米国およびその他の国における Amazon.com, Inc. またはその関連会社の商標です。