mirror of
https://github.com/php/doc-pt_br.git
synced 2026-03-24 07:02:09 +01:00
210 lines
6.7 KiB
XML
210 lines
6.7 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- EN-Revision: 3e871fe7eab38f9b0398569c57a1dd0c21e69652 Maintainer: leonardolara Status: ready --><!-- CREDITS: leonardolara -->
|
|
|
|
<section xml:id="mongodb.tutorial.apm" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
<title>Monitoramento de Desempenho de Aplicação (APM)</title>
|
|
|
|
<para>
|
|
A extensão contém uma API de assinante de evento, que permite que as aplicações
|
|
monitorem comandos e atividades internas pertencentes à
|
|
<link xlink:href="&url.mongodb.sdam;">Especificação de Descoberta e Monitoramento de Servidor</link>.
|
|
Este tutorial demonstrará o monitoramento de comandos usando A
|
|
interface <classname>MongoDB\Driver\Monitoring\CommandSubscriber</classname>.
|
|
</para>
|
|
|
|
<para>
|
|
A interface <classname>MongoDB\Driver\Monitoring\CommandSubscriber</classname>
|
|
define três métodos: <literal>commandStarted</literal>,
|
|
<literal>commandSucceeded</literal> e <literal>commandFailed</literal>.
|
|
Cada um desses três métodos aceita um único argumento <parameter>event</parameter>
|
|
de uma classe específica para o respectivo evento. Por exemplo, o
|
|
argumento <parameter>$event</parameter> de <literal>commandSucceeded</literal>
|
|
é um objeto
|
|
<classname>MongoDB\Driver\Monitoring\CommandSucceededEvent</classname>.
|
|
</para>
|
|
|
|
<para>
|
|
Neste tutorial implementaremos um assinante que cria uma lista de todos
|
|
os perfis de consulta e o tempo médio gasto para fazê-lo.
|
|
</para>
|
|
|
|
<section>
|
|
<title>Preparando a Classe do Assinante</title>
|
|
|
|
<para>
|
|
Começamos com a estrutura para nosso assinante:
|
|
</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>Registrando o Assinante</title>
|
|
|
|
<para>
|
|
Depois que um objeto assinante é instanciado, ele precisa ser registrado no
|
|
sistema de monitoramento das extensões. Isso é feito chamando
|
|
<methodname>MongoDB\Driver\Monitoring\addSubscriber</methodname> ou
|
|
<methodname>MongoDB\Driver\Manager::addSubscriber</methodname> para registrar
|
|
o assinante globalmente ou com um gerenciador específico, respectivamente.
|
|
</para>
|
|
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
\MongoDB\Driver\Monitoring\addSubscriber( new QueryTimeCollector() );
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</section>
|
|
|
|
<section>
|
|
<title>Implementando a Lógica</title>
|
|
|
|
<para>
|
|
Com o objeto registrado, só falta implementar a lógica
|
|
na classe do assinante. Para correlacionar os dois eventos que compõem um
|
|
comando executado com sucesso (commandStarted e commandSucceeded), cada
|
|
objeto de evento expõe um campo <literal>requestId</literal>.
|
|
</para>
|
|
<para>
|
|
Para registrar o tempo médio por formato de consulta, começaremos verificando um
|
|
comando <literal>find</literal> no evento commandStarted. Adicionaremos então
|
|
um item à propriedade <literal>pendingCommands</literal> indexado por seu
|
|
<literal>requestId</literal> e com seu valor representando o formato da consulta.
|
|
</para>
|
|
<para>
|
|
Se recebermos um evento commandSucceeded correspondente com o mesmo
|
|
<literal>requestId</literal>, adicionamos a duração do evento (de
|
|
<literal>durationMicros</literal>) ao tempo total e incrementamos a
|
|
contagem da operação.
|
|
</para>
|
|
<para>
|
|
Se um evento commandFailed correspondente for encontrado, apenas removemos a
|
|
entrada da propriedade <literal>pendingCommands</literal>.
|
|
</para>
|
|
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class QueryTimeCollector implements \MongoDB\Driver\Monitoring\CommandSubscriber
|
|
{
|
|
private $pendingCommands = [];
|
|
private $queryShapeStats = [];
|
|
|
|
/* Cria um formato de consulta a partir do argumento do filtro. No momento, ele leva
|
|
* em consideração apenas os campos de nível superior */
|
|
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 "Formato: ", $shape, " (", $stats['count'], ")\n ",
|
|
$stats['duration'] / $stats['count'], "µs\n\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
$m = new \MongoDB\Driver\Manager( 'mongodb://localhost:27016' );
|
|
|
|
/* Adiciona o assinante */
|
|
\MongoDB\Driver\Monitoring\addSubscriber( new QueryTimeCollector() );
|
|
|
|
/* Realiza um número de consultas */
|
|
$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
|
|
-->
|