トランザクションの作成
次に、トランザクションを作成する必要があります。トランザクションは、より大規模なビジネストランザクションで監視されるセグメントです。トランザクションを作成するには、相関ヘッダーを検索する必要があります。トレーサがコンテキスト情報のダウンストリームを渡すために使用します。
トランザクションは次のいずれかを実行します。
- 新しいビジネストランザクションを開始する
- 既存のビジネストランザクションを継続する
新しいビジネストランザクションを開始する
現在の関数で発生したトランザクションには、着信相関ヘッダーがありません。ビジネストランザクションを作成するには、createTransaction() メソッドを使用し、空の相関ヘッダーを提供します。
既存のビジネストランザクションを継続する
既存のビジネストランザクションを続行するには、着信相関ヘッダーを検索する必要があります。相関ヘッダーは、自動または手動で検索できます。
トレーサが相関ヘッダーを見つけることができない場合、トレーサは新しいビジネストランザクションを作成します。
相関ヘッダーを自動的に検索して、ビジネストランザクションを続行する
createTransaction(inputStream, context) メソッドを使用し、相関ヘッダーを自動的に検索するトランザクションを作成します。このメソッドは、singularityheaderinputStream オブジェクト内の と呼ばれるキーのコードのオブジェクトスキーマを検索します。相関ヘッダーは 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
...
}