<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/mongodb.tutorial.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'mongodb.tutorial.apm.php',
    1 => 'Surveillance de la performance de l\'application (Application Performance Monitoring - APM)',
    2 => 'Surveillance de la performance de l\'application (Application Performance Monitoring - APM)',
  ),
  'up' => 
  array (
    0 => 'mongodb.tutorial.php',
    1 => 'Tutoriels',
  ),
  'prev' => 
  array (
    0 => 'mongodb.tutorial.library.php',
    1 => 'Utiliser la biblioth&egrave;que PHP pour MongoDB (PHPLIB)',
  ),
  'next' => 
  array (
    0 => 'mongodb.architecture.php',
    1 => 'Architecture et fonctionnalit&eacute;s sp&eacute;ciales',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'reference/mongodb/tutorial/apm.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="mongodb.tutorial.apm" class="section">
 <h2 class="title">Surveillance de la performance de l&#039;application (Application Performance Monitoring - APM)</h2>

 <p class="para">
  L&#039;extension contient une API d&#039;observations événements, qui permet aux applications de
  surveiller les commandes et les activités internes liées à la
  <a href="https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.md" class="link external">&raquo;&nbsp;Spécification de découverte et de surveillance du serveur</a>.
  Ce tutoriel démontrera la surveillance des commandes en utilisant l&#039;interface
  <span class="classname"><a href="class.mongodb-driver-monitoring-commandsubscriber.php" class="classname">MongoDB\Driver\Monitoring\CommandSubscriber</a></span>.
 </p>

 <p class="para">
  L&#039;interface
  <span class="classname"><a href="class.mongodb-driver-monitoring-commandsubscriber.php" class="classname">MongoDB\Driver\Monitoring\CommandSubscriber</a></span>
  définit trois méthodes: <code class="literal">commandStarted</code>,
  <code class="literal">commandSucceeded</code>, et <code class="literal">commandFailed</code>.
  Chacune de ces trois méthodes accepte un seul argument <code class="parameter">event</code>
  d&#039;une classe spécifique pour l&#039;événement respectif. Par exemple, l&#039;argument
  <code class="parameter">$event</code> de <code class="literal">commandSucceeded</code>
  est un objet <span class="classname"><a href="class.mongodb-driver-monitoring-commandsucceededevent.php" class="classname">MongoDB\Driver\Monitoring\CommandSucceededEvent</a></span>.
 </p>

 <p class="para">
  Dans ce tutoriel, nous allons implémenter un observateur qui crée une liste de tous
  les profils de requête et le temps moyen qu&#039;ils ont pris.
 </p>

 <div class="section">
  <h2 class="title">Structure des classes d&#039;observations</h2>

  <p class="para">
   Nous commençons par le cadre de notre observateur:
  </p>

  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">QueryTimeCollector </span><span style="color: #007700">implements </span><span style="color: #0000BB">\MongoDB\Driver\Monitoring\CommandSubscriber<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">commandStarted</span><span style="color: #007700">( </span><span style="color: #0000BB">\MongoDB\Driver\Monitoring\CommandStartedEvent $event </span><span style="color: #007700">): </span><span style="color: #0000BB">void<br />    </span><span style="color: #007700">{<br />    }<br /><br />    public function </span><span style="color: #0000BB">commandSucceeded</span><span style="color: #007700">( </span><span style="color: #0000BB">\MongoDB\Driver\Monitoring\CommandSucceededEvent $event </span><span style="color: #007700">): </span><span style="color: #0000BB">void<br />    </span><span style="color: #007700">{<br />    }<br /><br />    public function </span><span style="color: #0000BB">commandFailed</span><span style="color: #007700">( </span><span style="color: #0000BB">\MongoDB\Driver\Monitoring\CommandFailedEvent $event </span><span style="color: #007700">): </span><span style="color: #0000BB">void<br />    </span><span style="color: #007700">{<br />    }<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

 </div>

 <div class="section">
  <h2 class="title">Enregistrement de l&#039;observateur</h2>

  <p class="para">
   Une fois qu&#039;un objet observateur est instancié, il doit être enregistré avec le
   système de surveillance de l&#039;extension. Cela se fait en appelant
   <span class="methodname"><a href="function.mongodb.driver.monitoring.addsubscriber.php" class="methodname">MongoDB\Driver\Monitoring\addSubscriber()</a></span> ou
   <span class="methodname"><a href="mongodb-driver-manager.addsubscriber.php" class="methodname">MongoDB\Driver\Manager::addSubscriber()</a></span> pour enregistrer
   l&#039;observateur globalement ou avec un Manager spécifique, respectivement.
  </p>

  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />\MongoDB\Driver\Monitoring\addSubscriber</span><span style="color: #007700">( new </span><span style="color: #0000BB">QueryTimeCollector</span><span style="color: #007700">() );<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

 </div>

 <div class="section">
  <h2 class="title">Implémenter la logique</h2>

  <p class="para">
   Avec l&#039;objet enregistré, la seule chose qui reste est d&#039;implémenter la logique
   dans la classe observatrice. Pour corréler les deux événements qui composent une
   commande exécutée avec succès (commandStarted et commandSucceeded), chaque
   objet d&#039;événement expose un champ <code class="literal">requestId</code>.
  </p>
  <p class="para">
   Pour enregistrer le temps moyen par forme de requête, nous allons commencer par vérifier
   une commande <code class="literal">find</code> dans l&#039;événement commandStarted. Nous allons ensuite
   ajouter un élément à la propriété <code class="literal">pendingCommands</code> indexé par son
   <code class="literal">requestId</code> et avec sa valeur représentant la forme de requête.
  </p>
  <p class="para">
   Si nous recevons un événement commandSucceeded correspondant avec le même
   <code class="literal">requestId</code>, nous ajoutons la durée de l&#039;événement (depuis
   <code class="literal">durationMicros</code>) au temps total et incrémentons le
   compteur d&#039;opérations.
  </p>
  <p class="para">
   Si un événement commandFailed correspondant est rencontré, nous supprimons
   simplement l&#039;entrée de la propriété <code class="literal">pendingCommands</code>.
  </p>

  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">QueryTimeCollector </span><span style="color: #007700">implements </span><span style="color: #0000BB">\MongoDB\Driver\Monitoring\CommandSubscriber<br /></span><span style="color: #007700">{<br />    private </span><span style="color: #0000BB">$pendingCommands </span><span style="color: #007700">= [];<br />    private </span><span style="color: #0000BB">$queryShapeStats </span><span style="color: #007700">= [];<br /><br />    </span><span style="color: #FF8000">/* Créer une forme de requête à partir de l'argument de filtre. Pour l'instant, il ne prend en compte que<br />     * les champs de premier niveau */<br />    </span><span style="color: #007700">private function </span><span style="color: #0000BB">createQueryShape</span><span style="color: #007700">( array </span><span style="color: #0000BB">$filter </span><span style="color: #007700">)<br />    {<br />        return </span><span style="color: #0000BB">json_encode</span><span style="color: #007700">( </span><span style="color: #0000BB">array_keys</span><span style="color: #007700">( </span><span style="color: #0000BB">$filter </span><span style="color: #007700">) );<br />    }<br /><br />    public function </span><span style="color: #0000BB">commandStarted</span><span style="color: #007700">( </span><span style="color: #0000BB">\MongoDB\Driver\Monitoring\CommandStartedEvent $event </span><span style="color: #007700">): </span><span style="color: #0000BB">void<br />    </span><span style="color: #007700">{<br />        if ( </span><span style="color: #DD0000">'find' </span><span style="color: #007700">=== </span><span style="color: #0000BB">$event</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getCommandName</span><span style="color: #007700">() )<br />        {<br />            </span><span style="color: #0000BB">$queryShape </span><span style="color: #007700">= </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">createQueryShape</span><span style="color: #007700">( (array) </span><span style="color: #0000BB">$event</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getCommand</span><span style="color: #007700">()-&gt;</span><span style="color: #0000BB">filter </span><span style="color: #007700">);<br />            </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">pendingCommands</span><span style="color: #007700">[</span><span style="color: #0000BB">$event</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getRequestId</span><span style="color: #007700">()] = </span><span style="color: #0000BB">$queryShape</span><span style="color: #007700">;<br />        }<br />    }<br /><br />    public function </span><span style="color: #0000BB">commandSucceeded</span><span style="color: #007700">( </span><span style="color: #0000BB">\MongoDB\Driver\Monitoring\CommandSucceededEvent $event </span><span style="color: #007700">): </span><span style="color: #0000BB">void<br />    </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">$requestId </span><span style="color: #007700">= </span><span style="color: #0000BB">$event</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getRequestId</span><span style="color: #007700">();<br />        if ( </span><span style="color: #0000BB">array_key_exists</span><span style="color: #007700">( </span><span style="color: #0000BB">$requestId</span><span style="color: #007700">, </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">pendingCommands </span><span style="color: #007700">) )<br />        {<br />            </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">queryShapeStats</span><span style="color: #007700">[</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">pendingCommands</span><span style="color: #007700">[</span><span style="color: #0000BB">$requestId</span><span style="color: #007700">]][</span><span style="color: #DD0000">'count'</span><span style="color: #007700">]++;<br />            </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">queryShapeStats</span><span style="color: #007700">[</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">pendingCommands</span><span style="color: #007700">[</span><span style="color: #0000BB">$requestId</span><span style="color: #007700">]][</span><span style="color: #DD0000">'duration'</span><span style="color: #007700">] += </span><span style="color: #0000BB">$event</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getDurationMicros</span><span style="color: #007700">();<br />            unset( </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">pendingCommands</span><span style="color: #007700">[</span><span style="color: #0000BB">$requestId</span><span style="color: #007700">] );<br />        }<br />    }<br /><br />    public function </span><span style="color: #0000BB">commandFailed</span><span style="color: #007700">( </span><span style="color: #0000BB">\MongoDB\Driver\Monitoring\CommandFailedEvent $event </span><span style="color: #007700">): </span><span style="color: #0000BB">void<br />    </span><span style="color: #007700">{<br />        if ( </span><span style="color: #0000BB">array_key_exists</span><span style="color: #007700">( </span><span style="color: #0000BB">$event</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getRequestId</span><span style="color: #007700">(), </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">pendingCommands </span><span style="color: #007700">) )<br />        {<br />            unset( </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">pendingCommands</span><span style="color: #007700">[</span><span style="color: #0000BB">$event</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getRequestId</span><span style="color: #007700">()] );<br />        }<br />    }<br /><br />    public function </span><span style="color: #0000BB">__destruct</span><span style="color: #007700">()<br />    {<br />        foreach( </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">queryShapeStats </span><span style="color: #007700">as </span><span style="color: #0000BB">$shape </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$stats </span><span style="color: #007700">)<br />        {<br />            echo </span><span style="color: #DD0000">"Shape: "</span><span style="color: #007700">, </span><span style="color: #0000BB">$shape</span><span style="color: #007700">, </span><span style="color: #DD0000">" ("</span><span style="color: #007700">, </span><span style="color: #0000BB">$stats</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">], </span><span style="color: #DD0000">")\n  "</span><span style="color: #007700">,<br />                </span><span style="color: #0000BB">$stats</span><span style="color: #007700">[</span><span style="color: #DD0000">'duration'</span><span style="color: #007700">] / </span><span style="color: #0000BB">$stats</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">], </span><span style="color: #DD0000">"µs\n\n"</span><span style="color: #007700">;<br />        }<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$m </span><span style="color: #007700">= new </span><span style="color: #0000BB">\MongoDB\Driver\Manager</span><span style="color: #007700">( </span><span style="color: #DD0000">'mongodb://localhost:27016' </span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">/* Ajouter l'observateur */<br /></span><span style="color: #0000BB">\MongoDB\Driver\Monitoring\addSubscriber</span><span style="color: #007700">( new </span><span style="color: #0000BB">QueryTimeCollector</span><span style="color: #007700">() );<br /><br /></span><span style="color: #FF8000">/* Faire une série de requêtes */<br /></span><span style="color: #0000BB">$query </span><span style="color: #007700">= new </span><span style="color: #0000BB">\MongoDB\Driver\Query</span><span style="color: #007700">( [<br />    </span><span style="color: #DD0000">'region_slug' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'scotland-highlands'</span><span style="color: #007700">, </span><span style="color: #DD0000">'age' </span><span style="color: #007700">=&gt; [ </span><span style="color: #DD0000">'$gte' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">20 </span><span style="color: #007700">]<br />] );<br /></span><span style="color: #0000BB">$cursor </span><span style="color: #007700">= </span><span style="color: #0000BB">$m</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">executeQuery</span><span style="color: #007700">( </span><span style="color: #DD0000">'dramio.whisky'</span><span style="color: #007700">, </span><span style="color: #0000BB">$query </span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$query </span><span style="color: #007700">= new </span><span style="color: #0000BB">\MongoDB\Driver\Query</span><span style="color: #007700">( [<br />    </span><span style="color: #DD0000">'region_slug' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'scotland-lowlands'</span><span style="color: #007700">, </span><span style="color: #DD0000">'age' </span><span style="color: #007700">=&gt; [ </span><span style="color: #DD0000">'$gte' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">15 </span><span style="color: #007700">]<br />] );<br /></span><span style="color: #0000BB">$cursor </span><span style="color: #007700">= </span><span style="color: #0000BB">$m</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">executeQuery</span><span style="color: #007700">( </span><span style="color: #DD0000">'dramio.whisky'</span><span style="color: #007700">, </span><span style="color: #0000BB">$query </span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$query </span><span style="color: #007700">= new </span><span style="color: #0000BB">\MongoDB\Driver\Query</span><span style="color: #007700">( [ </span><span style="color: #DD0000">'region_slug' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'scotland-lowlands' </span><span style="color: #007700">] );<br /></span><span style="color: #0000BB">$cursor </span><span style="color: #007700">= </span><span style="color: #0000BB">$m</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">executeQuery</span><span style="color: #007700">( </span><span style="color: #DD0000">'dramio.whisky'</span><span style="color: #007700">, </span><span style="color: #0000BB">$query </span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

 </div>

</div><?php manual_footer($setup); ?>