Crie logs mais inteligentes para sua aplicação PHP com Azure Application Insights

Recentemente tivemos a oportunidade de conduzir um projeto de modernização do site institucional de um grande cliente. Ele escolheu o WordPress como a plataforma para esse site, mas não se tratava apenas de um WordPress padrão. Era algo mais complexo: o site deveria se integrar a diversas APIs REST e a serviços legados, de modo a apresentar os dados dessas integrações aos usuários finais.

Dada essa complexidade, uma das principais necessidades desse projeto era ter um sistema de logs robusto, que fosse capaz não apenas de registrar atividades, mas também de oferecer insights valiosos sobre o desempenho e possíveis problemas da aplicação.

O Azure Application Insights, parte do pacote Microsoft Azure, foi nossa escolha natural.

Por que Azure Application Insights?

1. Monitoramento em Tempo Real

Com o Application Insights, não apenas registramos eventos, mas também visualizamos o desempenho da aplicação em tempo real. É possível identificar rapidamente picos de uso, tempos de resposta das APIs e quaisquer outros problemas de performance.

2. Análise Profunda de Exceções

Os logs padrão podem dizer quando algo deu errado, mas o Application Insights vai além. Ele detalha o motivo das exceções, permitindo uma correção mais ágil e precisa.

3. Telemetria Personalizável

Cada projeto tem suas particularidades. Por isso, o SDK do Application Insights, disponível no GitHub, permite customizações. No nosso caso, adaptamos o SDK para se integrar perfeitamente ao ambiente PHP do WordPress do cliente.

4. Integração com Azure DevOps

Além de coletar dados valiosos, o Application Insights se integra ao Azure DevOps, facilitando a gestão de bugs, tarefas e histórias de usuário baseadas nas informações coletadas.

5. Consultas Avançadas com Kusto Query Language (KQL)

Os dados coletados são valiosos, mas saber interpretá-los é fundamental. Com KQL, criamos consultas poderosas que transformam os dados de telemetria em relatórios, dashboards e alertas significativos.

6. Escalabilidade e Confiabilidade

Por ser parte do ecossistema Azure, o Application Insights é altamente escalável, garantindo que, mesmo em picos de tráfego, os logs e telemetrias sejam capturados sem perdas.

Como implementamos o Azure Application Insights no WordPress

A parte mais importante - e também a mais fácil - é criar o recurso do Application Insights no Azure. Como em qualquer outro projeto da CloudMotion, usamos o Terraform com Azure Pipelines para isso. Para tanto, basta um workspace do Log Analytics e o Application Insights em si:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Log Analytics Workspace
resource "azurerm_log_analytics_workspace" "la" {
  name                = local.log_analytics_workspace_name
  location            = data.azurerm_resource_group.rg.location
  resource_group_name = data.azurerm_resource_group.rg.name
  sku                 = var.log_analytics_sku
  daily_quota_gb      = var.log_analytics_daily_quota_gb
  retention_in_days   = var.log_analytics_retention_in_days
  tags                = local.tags
}

# Application Insights
resource "azurerm_application_insights" "ai" {
  name                = local.app_insights_name
  location            = data.azurerm_resource_group.rg.location
  resource_group_name = data.azurerm_resource_group.rg.name
  workspace_id        = azurerm_log_analytics_workspace.la.id
  application_type    = "web"
  tags                = local.tags
}

DICA: Quando for usar o Log Analytics, é sempre importante definir uma cota diária (em gigabytes) de logs a manter. Isso evita que o custo do serviço saia do controle. Ao atingir a cota determinada, o Log Analytics para de coletar novos logs até o dia seguinte. E como o custo é por GB, você consegue ter uma previsão mais precisa de quanto vai gastar.

Depois, vem o SDK do Application Insights. Numa aplicação PHP tradicional (sem o WordPress), você usaria o Composer para obter o SDK do Application Insights para PHP.

Já no caso do WordPress, você tem duas opções:

  1. Pode usar o Composer, tal como faria numa aplicação PHP tradicional. Tem vários artigos na internet com dicas sobre como usar o Composer com o WordPress; ou
  2. Pode usar o plugin do Application Insights para WordPress, que já inclui o SDK do Application Insights para PHP.

No nosso caso, como queríamos também tirar proveito da coleta de dados específica para WordPress oferecida pelo plugin, optamos pela segunda opção - ela acabou sendo mais simples e rápida. Basta instalar o plugin e configurá-lo com o Instrumentation Key do Application Insights. O Instrumentation Key é um identificador único que permite que o Application Insights identifique a aplicação que está enviando os dados de telemetria.

Enviando logs para o Application Insights

Como comentei, além dos logs do WordPress queríamos também enviar logs específicos da aplicação. Para isso, usamos o SDK do Application Insights em pontos-chave da nossa aplicação. O primeiro passo é importar o SDK. Importante lembrar que esse processo vai variar em função da opção que você escolheu no passo anterior. Se estiver usando o Composer, provavelmente vai usar a importação padrão do Composer:

1
require_once 'vendor/autoload.php';

Já no caso de usar o plugin, não precisa fazer nada - o plugin já faz a importação do SDK.

Daí, basta criar uma instância do SDK e configurá-la com o Instrumentation Key do Application Insights:

1
2
3
4
5
6
7
// Inicializa o SDK do Application Insights
$telemetryClient = new \ApplicationInsights\Telemetry_Client();
$ctx = $telemetryClient->getContext();

// Pega a instrumentation key do plugin
$opts = get_option("applicationinsights_options");
$ctx->setInstrumentationKey($opts["instrumentation_key"]);

Repare que, no exemplo acima, estamos obtendo a Instrumentation Key diretamente do valor configurado no plugin - assim, podemos manter a configuração num lugar só. Se você estiver usando o Composer, provavelmente vai armazenar e obter a Instrumentation Key de outra forma.

Agora é só colocar as chamadas ao SDK nos pontos-chave da sua aplicação. Por exemplo, você pode colocar uma chamada no catch de um bloco try/catch para poder registrar um erro:

1
2
3
4
5
6
7
8
9
10
11
try {
    // Código que pode gerar um erro
}
catch (\Exception $e) {
    // Registra o erro no Application Insights
    $telemetryClient->trackException($e, [
        "dados_adicionais_1" => "valor"
        "dados_adicionais_n" => "valor"
    ]);
    $telemetryClient->flush();
}

O método trackException recebe como parâmetro um objeto Exception e um array associativo com dados adicionais que você queira registrar. Já o método flush envia os dados para o Application Insights.

DICA: Se você for fazer o envio de vários dados em sequência para o Application Insights, deixe para chamar o método flush no final. Isso evita que o SDK faça várias chamadas HTTP para o Application Insights, o que poderia deixar suaa aplicação mais lenta.

Outra coisa bacana é poder enviar todos os seus logs para o Application Insights. Sabe aquele echo que você coloca no meio do código para ver o que está acontecendo? Você pode substituí-lo por uma chamada ao SDK do Application Insights. Eu até criei uma classe para facilitar isso:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Logger {

    private $telemetryClient = initClient(); // Inicializa o client do Application Insights

    public static function logInfo($message) {
        $telemetryClient->trackMessage($message, ApplicationInsights\Channel\Contracts\Message_Severity_Level::INFORMATION);
        self::log($message, E_USER_NOTICE);
    }

    public static function logWarning($message) {
        $telemetryClient->trackMessage($message, ApplicationInsights\Channel\Contracts\Message_Severity_Level::WARNING);
        self::log($message, E_USER_WARNING);
    }

    public static function logError($message, $exception = null) {
        $telemetryClient->trackMessage($message, ApplicationInsights\Channel\Contracts\Message_Severity_Level::ERROR);
        self::log($message, E_USER_ERROR);
    }
}

Com essa classe, fica fácil substituir os echos por chamadas ao SDK do Application Insights:

1
2
3
4
5
6
7
8
9
// Antes
echo "Mensagem informativa";
echo "Mensagem de alerta";
echo "Mensagem de erro";

// Depois
Logger::logInfo("Mensagem informativa");
Logger::logWarning("Mensagem de alerta");
Logger::logError("Mensagem de erro");

Para consultar esses logs todos, você pode acessar a tela de Logs do Application Insights. Lá, usando a linguagem de consulta Kusto, você pode filtrar os logs por tipo de mensagem, por exemplo.

Exemplo de uma pesquisa de logs usando o Application Insights. Note que é possível até mesmo fazer um "pivot" para análise avançada dos seus logs. Tenta fazer isso com os seus logs em arquivos TXT!
Exemplo de uma pesquisa de logs usando o Application Insights. Note que é possível até mesmo fazer um "pivot" para análise avançada dos seus logs. Tenta fazer isso com os seus logs em arquivos TXT! (clique para ampliar)

Você pode, também, pegar o resultado da sua pesquisa e transformar num gráfico:

Exemplo de um gráfico gerado a partir de uma pesquisa de logs usando o Application Insights.
Exemplo de um gráfico gerado a partir de uma pesquisa de logs usando o Application Insights. (clique para ampliar)

E esse gráfico pode até mesmo ser adicionado ao seu dashboard!

Gráficos do Application Insights podem ser adicionados aos dashboards nativos do Azure ou a dashboards do Grafana
Gráficos do Application Insights podem ser adicionados aos dashboards nativos do Azure ou a dashboards do Grafana (clique para ampliar)

Além disso, tem muito mais coisas úteis que você pode monitorar usando o Application Insights, como:

  • Desempenho das páginas: você pode monitorar o tempo de resposta de cada requisição, o tempo de resposta de cada página, o tempo de resposta de cada requisição a um serviço externo, etc. usando os métodos trackRequest do SDK do Application Insights.
  • Interação com recursos externos: você pode monitorar o tempo de resposta de cada requisição a um serviço externo (seja uma API, um banco de dados, ou qualquer outro tipo de integração com serviço externo à aplicação) usando os métodos trackDependency do SDK do Application Insights.

Uma coisa bacana do uso do trackDependency é que ele atualiza o gráfico do Mapa da Aplicação do Application Insights. Cada vez que você registra uma chamada a uma dependência, ele “descobre” esse novo componente da sua aplicação e o exibe no mapa:

Mapa da aplicação gerado automaticamente pelo Application Insights, mostrando recursos externos do tipo "HTTP" (APIs REST e/ou XML)
Mapa da aplicação gerado automaticamente pelo Application Insights, mostrando recursos externos do tipo "HTTP" (APIs REST e/ou XML) (clique para ampliar)

Conclusão

Em resumo, ao implementar o Azure Application Insights na modernização deste site WordPress, oferecemos ao cliente uma visão holística do desempenho de sua aplicação. Os insights obtidos não somente auxiliam em correções e melhorias, mas também na tomada de decisões estratégicas.

Projetos que demandam integrações complexas e alta performance necessitam de ferramentas à altura de seus desafios. E, neste cenário, o Azure Application Insights demonstrou ser uma opção excepcional. Se você está pensando em otimizar sua aplicação PHP, ou qualquer outro projeto de tecnologia, entre em contato conosco na CloudMotion. Estamos aqui para ajudar sua empresa a voar ainda mais alto no mundo digital!

Um abraço,
Igor



09/08/2023 | Por Igor Abade V. Leite | Em Técnico | Tempo de leitura: 6 mins.

Postagens relacionadas