Request-Metrics-Erweiterung
Für bestimmte Anwendungen können im Request-Metrics-Fluss zusätzliche Instrumentierungspunkte erforderlich sein. Schauen Sie sich die folgende Ablaufdarstellung an, mit der die Antwortzeit für ein eindeutiges Back-End-System untersucht werden soll:
HTTP-Anforderung/Trade/Szenario ------------------------------> 172 ms
Servlet/Trade/Szenario --------------------------------> 130 ms
Servlet/Aufruf an ein eindeutiges Back-End-System -------------------------->38 ms
Für den Trace des Verlaufs aller Anforderungen im System verwendet Request Metrics einen "Token" oder "Korrelator". Wenn Sie eine Ablaufdarstellung wie die obige mit dieser Instrumentierung erstellen möchten, müssen Sie in den Verlauf der Anforderung eingreifen und die entsprechende ARM-API (Application Response Measurement) aufrufen, damit ein ARM-Agent die Daten erfassen und der ARM-Lieferant die Ablaufdarstellung erstellen kann.
- Erstellen Sie ein neues Objekt ArmTransaction, das in verschiedenen Instrumentierungsaufrufen (z. B. start oder stop) ausgeführt wird. Der Correlation-Service-ARM-Wrapper (PmiRmArmTx) kapselt dieses Objekt ein, bevor es in den Request-Metrics-Fluss eingefügt wird.
- Füllen Sie das Objekt ArmTransaction mit einem geeigneten ArmCorrelator-Objekt. In diesem Objekt sind die eigentlichen ARM-Correlator-Bytes gekapselt.
- Führen Sie für das Objekt ArmTransaction die Methode start aus, um den Beginn der instrumentierten Methode zu markieren.
- Erstellen Sie mit der Methode static für die Klasse PmiRmArmTxFactory eine Instanz des Objekts PmiRmArmTx, und füllen Sie es mit dem obigen Objekt ArmTransaction.
- Übergeben Sie das vorangehende Objekt PmiRmArmTx an den Correlation Service, indem Sie es mit exponierten Methoden der Klasse PmiRmArmStack in den Correlation-Service-Stack stellen.
- Führen Sie die erforderlichen Schritte für die zu instrumentierende Methode aus. Der Correlation Service sorgt für den erforderlichen Fluss des Objekts ArmTransaction, was letztlich zu den Ergebnissen in der Aufrufdarstellung mit den Transaktionszeiten führt.
- Greifen Sie am Ende der instrumentierten Methode auf das Objekt PmiRmArmTx des Correlation Service zu. Verwenden Sie dazu exponierte Methoden der Klasse PmiRmArmStack. Greifen Sie dann auf das Objekt ArmTransaction zu, und führen Sie stop aus, um das Ende der Transaktion anzugeben.
Verwenden Sie diese Informationen, wenn Sie die ARM-API zusammen mit dem Korrelationsservice im Rahmen einer Servletinstrumentierung verwenden.
Die Binärdateien für arm40 müssen gemäß den Anweisungen installiert werden, die vom Provider der Implementierung bereitgestellt werden. Anschließend muss der Server gestartet werden. Daraufhin werden Tracedatensätze zur Instanziierung der entsprechenden ARM-Implementierung in der Datei SystemOut.log generiert. Das folgende Beispiel zeigt einen typischen Workflow bei der Verwendung der ARM-API mit dem Korrelationsservice im Rahmen einer Servletinstrumentierung:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PmiRmArmTx artrax =
// Die Factory erkennt die derzeit aktive ARM-Implementierung (wird vom Benutzer
// in der Administrationskonsole angegeben) und instanziiert ein entsprechendes
// ARM-Wrapper-Objekt
PmiRmArmTxFactory.createPmiRmArmTx();
ArmTransaction at = newArmTx();
if (null == at)
out.println("Got a null ArmTransaction");
ArmCorrelator arc = newArmCorr();
at.start(arc);
try {
artrax.setArmTransaction(at);
PmiRmArmStack.pushTransaction(artrax);
} catch (Exception e) {
System.out.println("Caught 1 exception" + e);
}
PmiRmArmTx atxwrp = PmiRmArmStack.peekTransaction();
if (atxwrp == null)
out.println("Armtransaction is null");
//getArmType
try {
out.println("ARMTYPE is"+ PmiRmArmTx.getARMType());
} catch (Exception e) {
out.println(e);
}
//getting correlator bytes
try {
if (null == atxwrp.getCorrelatorBytes())
out.println("Got a null Correlator");
} catch (Exception e) {
out.println(e);
}
//blocked/unblocked
long blkid = 0;
try {
out.println(blkid = atxwrp.blocked());
} catch (Exception e) {
out.println(e);
}
try {
out.println(atxwrp.unblocked(blkid));
} catch (Exception e) {
out.println(e);
}
try {
atxwrp = PmiRmArmStack.popTransaction();
ArmTransaction art = (ArmTransaction) atxwrp.getArmTransaction();
art.stop(ArmConstants.STATUS_GOOD);
} catch (Exception e) {
out.println(e);
}
}
private ArmTransaction newArmTx() {
ArmTransactionFactory txFactory = null;
try {
String sWasName = "WebSphere";
String appName = "t23xpimage/t23xpimage/server1";
String sCellName = appName.substring(0, appName.indexOf("/"));
String sNodeInstance =
appName.substring(appName.indexOf("/") + 1, appName.length());
sNodeInstance = sNodeInstance.replace('/', '.');
txFactory = (ArmTransactionFactory) newObjectInstance("org.opengroup.arm40.sdk.ArmTransactionFactoryImpl");
ArmApplication app = null; // 149297
ArmApplicationDefinition appDef = null; //LIDB3207
appDef = txFactory.newArmApplicationDefinition(sWasName, null, null);
app = txFactory.newArmApplication(appDef, sCellName, sNodeInstance, null);
String[] idnames = { "request_type" };
String[] idvalues = { "URI" };
String[] ctxnames = { "URI" };
ArmIdentityPropertiesTransaction props =
txFactory.newArmIdentityPropertiesTransaction(
idnames,
idvalues,
ctxnames,
null);
ArmTransactionDefinition atd =
txFactory.newArmTransactionDefinition(
appDef,
"URI",
props,
(ArmID) null);
ArmTransaction at = txFactory.newArmTransaction(app, atd);
return at;
} catch (Exception e) {
System.out.println(e);
return null;
}
}
private ArmCorrelator newArmCorr() {
ArmTransactionFactory txFactory = null;
try {
String sWasName = "WebSphere";
String appName = "t23xpimage/t23xpimage/server1";
txFactory =
(ArmTransactionFactory) newObjectInstance("org.opengroup.arm40.sdk.ArmTransactionFactoryImpl");
ArmCorrelator arc =txFactory.newArmCorrelator(
PmiRmArmStack.peekTransaction().getCorrelatorBytes());
return arc;
} catch (Exception e) {
System.out.println(e);
return null;
}
}
Es gibt verschiedene mögliche Szenarien für die Verwendung von PmiRmArmStack. Das folgende Beispiel zeigt ein Szenario, in dem der Code auf eine vorhandene PmiRmArmTx im Stack zugreift, den Korrelator extrahiert und die Methoden blocked und unblocked aufruft. Dies ist ein typisches Szenario, wenn ein Korrelator mit einem nicht unterstützten Protokoll gesendet wird. In diesem Szenario ist die Arm-Transaktion bereits im Stack vorhanden.
1 PmiRmArmTx artrax =
2 PmiRmArmStack.peekTransaction();
3 if( artrax != null )
4 {
5 try
6 {
7 byte[] cbytes = artrax.getCorrelatorBytes();
8 stuffBytesIntoOutboundMessage( msg, cbytes);
9 long blockedId = 0;
10 try
11 {
12 blockedId = artrax.blocked();
13 }
14 catch( NoSuchMethodException nsme )
15 {
16 // must not be running ARM4 or eWLM
17 }
18 sendMsg( msg );
19 try
20 {
21 artrax.blocked( blockedId );
22 }
23 catch( NoSuchMethodException nsme )
24 {
25 // must not be running ARM4 or eWLM
26 }
27
28 }
29 catch( Exception e )
30 {
31 report a problem;
32 }
33 }