1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-24 23:42:11 +01:00
Files
2025-05-01 16:22:55 +02:00

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
-->