mirror of
https://github.com/php/doc-es.git
synced 2026-03-24 23:42:11 +01:00
209 lines
6.8 KiB
XML
209 lines
6.8 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- EN-Revision: 3e871fe7eab38f9b0398569c57a1dd0c21e69652 Maintainer: PhilDaiguille Status: ready -->
|
|
<!-- Reviewed: no -->
|
|
<section xml:id="mongodb.tutorial.apm" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
<title>Monitoreo del rendimiento de la aplicación (Application Performance Monitoring - APM)</title>
|
|
|
|
<para>
|
|
La extensión contiene una API de observaciones de eventos, que permite a las aplicaciones
|
|
monitorear las órdenes y las actividades internas relacionadas con la
|
|
<link xlink:href="&url.mongodb.sdam;">Especificación de descubrimiento y monitoreo del servidor</link>.
|
|
Este tutorial demostrará el monitoreo de las órdenes utilizando la interfaz
|
|
<classname>MongoDB\Driver\Monitoring\CommandSubscriber</classname>.
|
|
</para>
|
|
|
|
<para>
|
|
La interfaz
|
|
<classname>MongoDB\Driver\Monitoring\CommandSubscriber</classname>
|
|
define tres métodos: <literal>commandStarted</literal>,
|
|
<literal>commandSucceeded</literal>, y <literal>commandFailed</literal>.
|
|
Cada uno de estos tres métodos acepta un solo argumento <parameter>event</parameter>
|
|
de una clase específica para el evento respectivo. Por ejemplo, el argumento
|
|
<parameter>$event</parameter> de <literal>commandSucceeded</literal>
|
|
es un objeto <classname>MongoDB\Driver\Monitoring\CommandSucceededEvent</classname>.
|
|
</para>
|
|
|
|
<para>
|
|
En este tutorial, se implementará un observador que crea una lista de todos
|
|
los perfiles de solicitud y el tiempo promedio que han tomado.
|
|
</para>
|
|
|
|
<section>
|
|
<title>Estructura de las clases de observaciones</title>
|
|
|
|
<para>
|
|
Se comienza con el marco del observador:
|
|
</para>
|
|
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class QueryTimeCollector implements \MongoDB\Driver\Monitoring\CommandSubscriber
|
|
{
|
|
public function commandStarted( \MongoDB\Driver\Monitoring\CommandStartedEvent $event ): void
|
|
{
|
|
}
|
|
|
|
public function commandSucceeded( \MongoDB\Driver\Monitoring\CommandSucceededEvent $event ): void
|
|
{
|
|
}
|
|
|
|
public function commandFailed( \MongoDB\Driver\Monitoring\CommandFailedEvent $event ): void
|
|
{
|
|
}
|
|
}
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</section>
|
|
|
|
<section>
|
|
<title>Registro del observador</title>
|
|
|
|
<para>
|
|
Una vez que un objeto observador es instanciado, debe ser registrado con el
|
|
sistema de monitoreo de la extensión. Esto se hace llamando a
|
|
<methodname>MongoDB\Driver\Monitoring\addSubscriber</methodname> o
|
|
<methodname>MongoDB\Driver\Manager::addSubscriber</methodname> para registrar
|
|
el observador globalmente o con un Manager específico, respectivamente.
|
|
</para>
|
|
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
\MongoDB\Driver\Monitoring\addSubscriber( new QueryTimeCollector() );
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</section>
|
|
|
|
<section>
|
|
<title>Implementar la lógica</title>
|
|
|
|
<para>
|
|
Con el objeto registrado, la única cosa que queda es implementar la lógica
|
|
en la clase observadora. Para correlacionar los dos eventos que componen una
|
|
orden ejecutada con éxito (commandStarted y commandSucceeded), cada
|
|
objeto de evento expone un campo <literal>requestId</literal>.
|
|
</para>
|
|
<para>
|
|
Para registrar el tiempo promedio por forma de solicitud, se comenzará verificando
|
|
una orden <literal>find</literal> en el evento commandStarted. Luego, se añadirá un elemento a la propiedad <literal>pendingCommands</literal> indexado por su
|
|
<literal>requestId</literal> y con su valor representando la forma de solicitud.
|
|
</para>
|
|
<para>
|
|
Si se recibe un evento commandSucceeded correspondiente con el mismo
|
|
<literal>requestId</literal>, se añade la duración del evento (desde
|
|
<literal>durationMicros</literal>) al tiempo total e incrementa el
|
|
contador de operaciones.
|
|
</para>
|
|
<para>
|
|
Si se encuentra un evento commandFailed correspondiente, simplemente se elimina
|
|
la entrada de la propiedad <literal>pendingCommands</literal>.
|
|
</para>
|
|
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class QueryTimeCollector implements \MongoDB\Driver\Monitoring\CommandSubscriber
|
|
{
|
|
private $pendingCommands = [];
|
|
private $queryShapeStats = [];
|
|
|
|
/* Crear una forma de solicitud a partir del argumento de filtro. Por ahora, solo se consideran
|
|
* los campos de primer nivel */
|
|
private function createQueryShape( array $filter )
|
|
{
|
|
return json_encode( array_keys( $filter ) );
|
|
}
|
|
|
|
public function commandStarted( \MongoDB\Driver\Monitoring\CommandStartedEvent $event ): void
|
|
{
|
|
if ( 'find' === $event->getCommandName() )
|
|
{
|
|
$queryShape = $this->createQueryShape( (array) $event->getCommand()->filter );
|
|
$this->pendingCommands[$event->getRequestId()] = $queryShape;
|
|
}
|
|
}
|
|
|
|
public function commandSucceeded( \MongoDB\Driver\Monitoring\CommandSucceededEvent $event ): void
|
|
{
|
|
$requestId = $event->getRequestId();
|
|
if ( array_key_exists( $requestId, $this->pendingCommands ) )
|
|
{
|
|
$this->queryShapeStats[$this->pendingCommands[$requestId]]['count']++;
|
|
$this->queryShapeStats[$this->pendingCommands[$requestId]]['duration'] += $event->getDurationMicros();
|
|
unset( $this->pendingCommands[$requestId] );
|
|
}
|
|
}
|
|
|
|
public function commandFailed( \MongoDB\Driver\Monitoring\CommandFailedEvent $event ): void
|
|
{
|
|
if ( array_key_exists( $event->getRequestId(), $this->pendingCommands ) )
|
|
{
|
|
unset( $this->pendingCommands[$event->getRequestId()] );
|
|
}
|
|
}
|
|
|
|
public function __destruct()
|
|
{
|
|
foreach( $this->queryShapeStats as $shape => $stats )
|
|
{
|
|
echo "Shape: ", $shape, " (", $stats['count'], ")\n ",
|
|
$stats['duration'] / $stats['count'], "µs\n\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
$m = new \MongoDB\Driver\Manager( 'mongodb://localhost:27016' );
|
|
|
|
/* Añadir el observador */
|
|
\MongoDB\Driver\Monitoring\addSubscriber( new QueryTimeCollector() );
|
|
|
|
/* Realizar una serie de solicitudes */
|
|
$query = new \MongoDB\Driver\Query( [
|
|
'region_slug' => 'scotland-highlands', 'age' => [ '$gte' => 20 ]
|
|
] );
|
|
$cursor = $m->executeQuery( 'dramio.whisky', $query );
|
|
|
|
$query = new \MongoDB\Driver\Query( [
|
|
'region_slug' => 'scotland-lowlands', 'age' => [ '$gte' => 15 ]
|
|
] );
|
|
$cursor = $m->executeQuery( 'dramio.whisky', $query );
|
|
|
|
$query = new \MongoDB\Driver\Query( [ 'region_slug' => 'scotland-lowlands' ] );
|
|
$cursor = $m->executeQuery( 'dramio.whisky', $query );
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</section>
|
|
|
|
</section>
|
|
|
|
<!-- Keep this comment at the end of the file
|
|
Local variables:
|
|
mode: sgml
|
|
sgml-omittag:t
|
|
sgml-shorttag:t
|
|
sgml-minimize-attributes:nil
|
|
sgml-always-quote-attributes:t
|
|
sgml-indent-step:1
|
|
sgml-indent-data:t
|
|
indent-tabs-mode:nil
|
|
sgml-parent-document:nil
|
|
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
|
sgml-exposed-tags:nil
|
|
sgml-local-catalogs:nil
|
|
sgml-local-ecat-files:nil
|
|
End:
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
vim: et tw=78 syn=sgml
|
|
vi: ts=1 sw=1
|
|
-->
|