Download PDF
Download page 手動トレーサ インストゥルメンテーション.
手動トレーサ インストゥルメンテーション
On this page:
トレーサのインスタンス化
トレーサをインスタンス化するには、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));
}
}
トランザクションの作成
次に、トランザクションを作成する必要があります。トランザクションは、より大規模なビジネストランザクションで監視されるセグメントです。トランザクションを作成するには、相関ヘッダーを検索する必要があります。サーバレストレーサがコンテキスト情報のダウンストリームを渡すために使用します。
トランザクションは次のいずれかを実行します。
- 新しいビジネストランザクションを開始する
- 既存のビジネストランザクションを継続する
新しいビジネストランザクションを開始する
現在の関数で発生したトランザクションには、着信相関ヘッダーがありません。ビジネストランザクションを作成するには、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));
}
}
}
相関ヘッダーを手動で検索してトランザクションを作成する
カスタムロジックを使用して相関ヘッダーを検索するトランザクションを作成するには、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
...
}
トランザクションの開始と停止
トランザクションの作成後、トランザクションの境界を設定する必要があります。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()) >= 0) {
output.write(Character.toUpperCase(letter));
}
//Stop the transaction monitoring. Place in a finally block to monitor all events.
} finally {
transaction.stop();
AppDynamics.cleanup();
}
}
外部終了コールの作成
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();
}
}
複数の外部終了コールの作成
1 つの AWS Lambda 関数が複数の終了コールを行う場合、各関数は一意の exitCall
オブジェクトによって識別される必要があります。複数の終了コールを行うには、個別の終了コールごとに新しい exitCall
オブジェクトを作成します。exitCall
オブジェクトは再利用できません。
これらのマニュアルで使用されている Amazon Web サービス、AWS ロゴ、AWS、およびその他の AWS マークは、米国およびその他の国における Amazon.com, Inc. またはその関連会社の商標です。