exit コールの定義

別のプロセスに対して要求を行う inventoryServer.verifyQuantities(orders) では、その要求を exit コールとしてモニタできます。これにより、ダウンストリームサーバへのコールによるビジネストランザクションのモニタリングを継続し、リモートサービスで費やされた時間を特定することができます。このためには、次のようにメソッドを変更します。

public void verifyQuantities(List<ItemOrders> orders) {
ExitCall exitCall = null;
try {
exitCall = AppdynamicsAgent.getTransaction().startExitCall("Quantity Check", "Inventory Server", ExitTypes.HTTP, false);
/*******************
* Method Body
*******************/
} finally {
if (exitCall != null) {
exitCall.end();
}
}
}

または、HTTP バックエンド検出ルールを使用する場合、startHttpExitCall メソッドを使用できます。

public void verifyQuantities(List<ItemOrders> orders) {
ExitCall exitCall = null;
try {
Map<String, String> identifyingProps = new HashMap<String, String>();
URL url = new URL("https://www.appdynamics.com/solutions/microservices/");
exitCall = AppdynamicsAgent.getTransaction().startExitCall(identifyingProps, url, false);
/*******************
* Method Body
*******************/
} finally {
if (exitCall != null) {
exitCall.end();
}
}
}

上記のコード変更では、コントローラのリモートサービスとしてマニフェストを定義する exit コールを定義します。インストゥルメント化されたダウンストリーム階層への要求にタグを付けて追跡するには、相関ヘッダーを追加します。

public void verifyQuantities(List<ItemOrders> orders) {
ExitCall exitCall = null;
try {
exitCall = AppdynamicsAgent.getTransaction().startExitCall("Quantity Check", "Inventory Server", ExitTypes.HTTP, false);
// Generate the appdynamics correlation header
String correlationHeader = exitCall.getCorrelationHeader();
// ... Method code including request creation
// Modify the request/payload to include the correlation header
inventoryRequest.addHeader(AppdynamicsAgent.TRANSACTION_CORRELATION_HEADER, correlationHeader);
} finally {
if (exitCall != null) {
exitCall.end();
}
}
}

次の例では、非同期 exit をインストゥルメント化する方法を示します。

public class StartEndAsyncExitCall {
private void makeAsyncExitTransaction() throws Exception {
System.out.println("Starting transaction");
try (Transaction transaction = AppdynamicsAgent.startTransaction("StartEndAsyncExitCall", null, EntryTypes.POJO, true)) {
Thread.sleep(1000);
new TransactionEndingThread(transaction).start();
System.out.println("Starting exitcall");
ExitCall exitCall = null;
exitCall = transaction.startExitCall("Custom", "Custom", ExitTypes.CUSTOM, true);
new ExitCallEndingThread(exitCall).start();
}
}
public class TransactionEndingThread extends Thread {
Transaction transaction = null;
TransactionEndingThread(Transaction transaction) {
this.transaction = transaction;
}
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
transaction.end();
System.out.println("Ending transaction");
}
}
public class ExitCallEndingThread extends Thread {
ExitCall exitCall = null;
ExitCallEndingThread(ExitCall exitCall) {
this.exitCall = exitCall;
}
public void run() {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
exitCall.end();
System.out.println("Ending exitcall");
}
}
}