Extension de mesure des demandes
Certaines applications peuvent avoir besoin de points d'instrumentation supplémentaires dans le flux des mesures de demandes. Par exemple, vous pouvez chercher à comprendre le temps de réponse à un système dorsal unique tel qu'il est illustré par le graphique d'appel suivant.
HTTP request /trade/scenario ------------------------------> 172 ms
Servlet/trade/scenario --------------------------------> 130 ms
Servlet/call to unique back-end system -------------------------->38 ms
Request metrics utilise un "jeton" or "corrélateur" lors du traçage du flux de chaque demande à travers le système. Pour créer le graphique d'appel ci-dessus avec cette instrumentation, connectez-vous au flux de la demande et exécutez l'API ARM (Application Response Measurement) appropriée pour permettre à l'agent ARM de collecter les données et au fournisseur ARM de créer le graphique d'appel.
- Créez un objet ArmTransaction qui exécute différents appels d'instrumentation tels qu'un démarrage ou un arrêt. L'encapsuleur Arm de service de corrélation (PmiRmArmTx) encapsule cet objet avant qu'il ne soit inséré dans le flux des mesures de demandes.
- Remplissez l'objet ArmTransaction avec un objet ArmCorrelator appropriée. Cet objet encapsule les octets effectifs du corrélateur ARM.
- Exécutez la méthode start sur l'objet ArmTransaction, en marquant le début de la méthode instrumentée.
- Instanciez un objet PmiRmArmTx en utilisant la méthode statique sur la classe PmiRmArmTxFactory, puis peuplez l'objet PmiRmArmTx avec l'objet ArmTransaction ci-dessus.
- Transmettez l'objet PmiRmArmTx ci-dessus au service de corrélation en l'envoyant dans la pile du service de corrélation en utilisant sur l'objet PmiRmArmStack les méthodes présentées.
- Effectuez les tâches de la méthode en cours d'instrumentation. Le service de corrélation s'occupe de réaliser le flux de l'objet ArmTransaction nécessaire, ce qui génère les résultats présentés dans la vue du graphique d'appel des temps de transaction.
- A la fin de l'exécution de la méthode instrumentée, accédez à l'objet PmiRmArmTx à partir du service de corrélation en utilisant les méthodes présentées sur la classe PmiRmArmStack, accédez à l'objet ArmTransaction et réalisez un arrêt pour indiquez le fin de la transaction.
Consultez ces informations lors de l'utilisation de l'API ARM avec le service de corrélation dans le cadre d'une instrumentation de servlet.
Les fichiers binaires arm40 doivent être installés conformément aux instructions d'installation fournies par le fournisseur de l'implémentation. Une fois l'installation terminée, redémarrez le serveur. Les enregistrements de trace sont alors générés dans le fichier SystemOut.log, indiquant l'instanciation de l'implémentation ARM appropriée. L'exemple suivant illustre l'un des flux de travaux classiques lors de l'utilisation de l'API ARM conjointement au service de corrélation dans le cadre d'une instrumentation de servlet.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PmiRmArmTx artrax =
// The factory detects the currently active ARM implementation (specified by user through
// admin console) and instantiates an appropriate ARM wrapper object
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;
}
}
Il existe plusieurs procédures d'utilisation de l'objet PmiRmArmStack. Dans le scénario présenté dans cet exemple, du code accède à un objet PmiRmArmTx figurant dans la pile, extrait le corrélateur et appellent les méthodes blocked et unblocked. Il s'agit d'une scénario classique dans lequel un corrélateur est envoyé avec un protocole non pris en charge. Dans ce scénario, la transaction Arm figure déjà dans la pile.
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 }