Monitoramento de desempenho de lançamentos de recursos

1. Visão Geral

Neste codelab, você aprenderá a monitorar o desempenho do seu app durante o lançamento de um recurso. Nosso aplicativo de exemplo terá funcionalidade básica e está configurado para exibir uma imagem de plano de fundo diferente com base em um sinalizador Firebase Remote Config. Analisaremos os rastreamentos de instrumentação para monitorar o desempenho do aplicativo, implementando uma alteração de configuração no aplicativo, monitorando o efeito e vendo como podemos melhorar o desempenho.

O que você aprenderá

  • Como adicionar o monitoramento de desempenho do Firebase ao seu aplicativo móvel para obter métricas prontas para uso (como hora de início do aplicativo e quadros lentos ou congelados)
  • Como adicionar rastreamentos personalizados para entender os caminhos de código críticos das jornadas do usuário
  • Como usar o painel de monitoramento de desempenho para entender suas métricas e rastrear mudanças importantes, como o lançamento de um recurso
  • Como configurar alertas de desempenho para monitorar suas principais métricas
  • Como implementar uma alteração do Firebase Remote Config

Pré-requisitos

  • Android Studio 4.0 ou superior
  • Um emulador Android com nível de API 16 ou superior.
  • Java versão 8 ou superior
  • Uma compreensão básica do Firebase Remote Config

2. Configure o projeto de amostra

Baixe o código

Execute o seguinte comando para clonar o código de amostra deste codelab. Isso criará uma pasta chamada codelab-perf-rc-android em sua máquina:

$ git clone https://github.com/FirebaseExtended/codelab-feature-rollout-performance.git

Se você não possui o Git em sua máquina, também pode baixar o código diretamente do GitHub.

Importe o projeto na firebase-perf-rc-android-start para o Android Studio. Você provavelmente verá algumas exceções de tempo de execução ou talvez um aviso sobre um arquivo google-services.json ausente. Corrigiremos isso na próxima seção.

Neste codelab, você usará o plug-in Firebase Assistant para registrar seu app Android com um projeto Firebase e adicionar os arquivos de configuração, plug-ins e dependências necessários do Firebase ao seu projeto Android, tudo de dentro do Android Studio !

Conecte seu aplicativo ao Firebase

  1. Acesse Android Studio / Help > Check for updates para garantir que você esteja usando as versões mais recentes do Android Studio e do Firebase Assistant.
  2. Selecione Ferramentas > Firebase para abrir o painel Assistente .

c0e42ef063d21eab.png

  1. Escolha Monitoramento de desempenho para adicionar ao seu aplicativo e clique em Introdução ao Monitoramento de desempenho .
  2. Clique em Conectar ao Firebase para conectar seu projeto Android ao Firebase (isso abrirá o console do Firebase em seu navegador) .
  3. No console do Firebase, clique em Adicionar projeto e insira um nome de projeto do Firebase (se você já tiver um projeto do Firebase, poderá selecionar esse projeto existente) . Clique em Continuar e aceite os termos para criar o projeto Firebase e um novo aplicativo Firebase.

Em seguida, você verá uma caixa de diálogo para conectar seu novo aplicativo Firebase ao seu projeto do Android Studio.

51a549ebde2fe57a.png

  1. Clique em Conectar .
  2. Abra o Android Studio. No painel Assistente , você verá a confirmação de que seu aplicativo está conectado ao Firebase.

40c24c4a56a45990.png

Adicionar monitoramento de desempenho ao seu aplicativo

No painel Assistant do Android Studio, clique em Add Performance Monitoring to your app .

Você deve ver uma caixa de diálogo para aceitar alterações, após a qual o Android Studio deve sincronizar seu aplicativo para garantir que todas as dependências necessárias foram adicionadas.

3046f3e1f5fea06f.png

Por fim, você deve ver a mensagem de sucesso no painel Assistant no Android Studio informando que todas as dependências estão configuradas corretamente.

62e79fd18780e320.png

Como etapa adicional, habilite o log de depuração seguindo as instruções na etapa "(Opcional) Habilitar log de depuração". As mesmas instruções também estão disponíveis na documentação pública .

3. Execute o aplicativo

Agora você deve ver o arquivo google-services.json no diretório do módulo (nível do aplicativo) do seu aplicativo, e seu aplicativo deve compilar. No Android Studio, clique em Executar > Executar 'aplicativo' para compilar e executar o aplicativo em seu emulador Android.

Quando o aplicativo estiver em execução, você deverá ver primeiro uma tela inicial como esta:

ffbd413a6983b205.png

Então, após alguns segundos, a página principal com a imagem padrão será exibida:

d946cab0df319e50.png

O que está acontecendo sob o capô?

A tela inicial é implementada em SplashScreenActivity e faz o seguinte:

  1. Em onCreate() , inicializamos as configurações do Firebase Remote Config e buscamos os valores de configuração que você definirá no painel do Remote Config posteriormente neste codelab.
  2. Em executeTasksBasedOnRC() , lemos o valor de configuração do sinalizador seasonal_image_url . Se um URL for fornecido pelo valor de configuração, baixamos a imagem de forma síncrona.
  3. Após a conclusão do download, o aplicativo navega para MainActivity e chama finish() para finalizar SplashScreenActivity .

Em MainActivity , se seasonal_image_url for definido por meio do Remote Config, o recurso será ativado e a imagem baixada será exibida como plano de fundo da página principal. Caso contrário, a imagem padrão (mostrada acima) será exibida.

4. Configure o Remote Config

Agora que seu aplicativo está em execução, você pode configurar o novo sinalizador de recurso.

  1. No painel esquerdo do Firebase console , localize a seção Engage e clique em Remote Config .
  2. Clique no botão Criar configuração para abrir o formulário de configuração e adicionar seasonal_image_url como chave de parâmetro.
  3. Clique em Adicionar descrição e insira esta descrição: Shows a seasonal image (replaces default) in the main page when the restaurant list is empty.
  4. Clique em Adicionar novo -> Valor condicional -> Criar nova condição .
  5. Para o nome da condição, insira Seasonal image rollout .
  6. Para a seção Applies if... , selecione User in random percentile <= 0% . (Você deseja deixar o recurso desativado até que esteja pronto para implementá-lo em uma etapa posterior.)
  7. Clique em Criar condição . Você usará essa condição posteriormente para distribuir o novo recurso para seus usuários.

7a07526eb9e81623.png

  1. Abra o formulário Criar seu primeiro parâmetro e localize o campo Valor para implementação de imagem sazonal . Digite a URL onde a imagem sazonal será baixada: https://images.unsplash.com/photo-1552691021-7043334e0b51
  2. Deixe o valor padrão como uma string vazia. Isso significa que a imagem padrão na base de código será exibida em vez de uma imagem baixada de um URL.
  3. Clique em Salvar .

99e6cd2ebcdced.png

Você pode ver que a nova configuração é criada como um rascunho.

  1. Clique em Publicar alterações e confirme as alterações na parte superior para atualizar seu aplicativo.

39cd3e96d370c7ce.png

5. Adicionar monitoramento para o tempo de carregamento de dados

Seu aplicativo pré-carrega alguns dados antes de mostrar MainActivity e exibe uma tela inicial para ocultar esse processo. Você não quer que seus usuários esperem muito tempo nessa tela, então normalmente é bom monitorar quanto tempo a tela inicial é exibida.

O monitoramento de desempenho do Firebase oferece uma maneira de fazer exatamente isso. Você pode instrumentar rastreamentos de código personalizados para monitorar o desempenho de um código específico em seu aplicativo, como o tempo de carregamento de dados e o tempo de processamento de seu novo recurso.

Para rastrear por quanto tempo a tela inicial é exibida, você adicionará um rastreamento de código personalizado a SplashScreenActivity , que é a Activity que implementa a tela inicial.

  1. Inicialize, crie e inicie um rastreamento de código personalizado chamado splash_screen_trace :

SplashScreenActivity.java

// ...
import com.google.firebase.perf.FirebasePerformance;
import com.google.firebase.perf.metrics.Trace;
// ...

public class SplashScreenActivity extends AppCompatActivity {

    private static final String TAG = "SplashScreenActivity";
    private static final String SEASONAL_IMAGE_URL_RC_FLAG = "seasonal_image_url";

    // TODO: Initialize splash_screen_trace
    private final Trace splashScreenTrace = FirebasePerformance.startTrace("splash_screen_trace");
    
    // ...
}
  1. Termine o rastreamento no método onDestroy() de SplashScreenActivity :

SplashScreenActivity.java

@Override
protected void onDestroy() {
    super.onDestroy();

    // TODO: Stop the splash_screen_trace here
    splashScreenTrace.stop();
}

Como seu novo recurso baixa e processa uma imagem, você adicionará um segundo rastreamento de código personalizado que rastreará o tempo adicional que seu recurso adicionou a SplashScreenActivity .

  1. Inicialize, crie e inicie um rastreamento de código personalizado chamado splash_seasonal_image_processing :

SplashScreenActivity.java

private void executeTasksBasedOnRC(FirebaseRemoteConfig rcConfig) {
    String seasonalImageUrl = rcConfig.getString(SEASONAL_IMAGE_URL_RC_FLAG);
    Log.d(TAG, SEASONAL_IMAGE_URL_RC_FLAG + ": " + seasonalImageUrl);

    if (!seasonalImageUrl.isEmpty()) {
        // TODO: Start the splash_seasonal_image_processing here
        final Trace seasonalImageProcessingTrace = FirebasePerformance
            .startTrace("splash_seasonal_image_processing");

        // ...
    }
}
  1. Termine o rastreamento nos métodos onLoadFailed() e onResourceReady() do RequestListener :

SplashScreenActivity.java

Glide.with(SplashScreenActivity.this.getApplicationContext())
    .asBitmap()
    .load(seasonalImageUrl)
    .signature(new ObjectKey(Utils.getCacheUUID()))
    .listener(new RequestListener<Bitmap>() {
        @Override
        public boolean onLoadFailed(
            @Nullable GlideException e,
            Object model, Target<Bitmap> target,
            boolean isFirstResource) {

            // TODO: Stop the splash_seasonal_image_processing here
            seasonalImageProcessingTrace.stop();

            launchMainActivity();
            return true;
        }

        @Override
        public boolean onResourceReady(Bitmap resource, Object model,
            Target<Bitmap> target, DataSource dataSource,
            boolean isFirstResource) {

            // TODO: Stop the splash_seasonal_image_processing here
            seasonalImageProcessingTrace.stop();

            launchMainActivity();
            return true;
        }
     })
     .preload();

Agora que você adicionou rastreamentos de código personalizados para rastrear a duração da tela inicial ( splash_screen_trace) e o tempo de processamento do novo recurso ( splash_seasonal_image_processing ), execute o aplicativo no Android Studio novamente. Você deve ver uma mensagem de log que contém Logging trace metric: splash_screen_trace , seguida pela duração do rastreamento. Você não verá uma mensagem de log para splash_seasonal_image_processing porque ainda não habilitou o novo recurso.

6. Adicione um atributo personalizado ao rastreamento

Para rastreamentos de código personalizados, o Monitoramento de desempenho registra automaticamente os atributos padrão (metadados comuns, como versão do aplicativo, país, dispositivo etc.) para que você possa filtrar os dados do rastreamento no Firebase console . Você também pode adicionar e monitorar atributos personalizados .

Em seu aplicativo, você acabou de adicionar dois rastreamentos de código personalizados para monitorar a duração da tela inicial e o tempo de processamento do novo recurso. Um fator que pode afetar essas durações é se a imagem exibida é a imagem padrão ou se a imagem precisa ser baixada de um URL. E quem sabe - você pode eventualmente ter diferentes URLs dos quais você baixa uma imagem.

Portanto, vamos adicionar um atributo personalizado que representa o URL da imagem sazonal a esses rastreamentos de código personalizados. Dessa forma, você pode filtrar os dados de duração por esses valores posteriormente.

  1. Adicione o atributo personalizado ( seasonal_image_url_attribute ) para splash_screen_trace no início do método executeTasksBasedOnRC :

SplashScreenActivity.java

private void executeTasksBasedOnRC(FirebaseRemoteConfig rcConfig) {
    String seasonalImageUrl = rcConfig.getString(SEASONAL_IMAGE_URL_RC_FLAG);
    Log.d(TAG, SEASONAL_IMAGE_URL_RC_FLAG + ": " + seasonalImageUrl);

    // TODO: Add a custom attribute "seasonal_image_url_attribute" to splash_screen_trace
    if (seasonalImageUrl.isEmpty()) {
        splashScreenTrace.putAttribute("seasonal_image_url_attribute", "unset");
    } else {
        splashScreenTrace.putAttribute("seasonal_image_url_attribute", seasonalImageUrl);
    }

    // ...
}
  1. Adicione o mesmo atributo personalizado para splash_seasonal_image_processing logo após a chamada startTrace("splash_seasonal_image_processing") :

SplashScreenActivity.java

if (!seasonalImageUrl.isEmpty()) {
    // TODO: Start the splash_seasonal_image_processing here
    final Trace seasonalImageProcessingTrace = FirebasePerformance
        .startTrace("splash_seasonal_image_processing");

    // TODO: Add a custom attribute "seasonal_image_url_attribute" to splash_seasonal_image_processing
    seasonalImageProcessingTrace
        .putAttribute("seasonal_image_url_attribute", seasonalImageUrl);

    // ...
}

Agora que você adicionou um atributo personalizado ( seasonal_image_url_attribute ) para ambos os seus traces personalizados ( splash_screen_trace e splash_seasonal_image_processing ), execute o aplicativo no Android Studio novamente. Você deve ver uma mensagem de registro que contém Setting attribute 'seasonal_image_url_attribute' to 'unset' on trace 'splash_screen_trace'. Você ainda não habilitou o parâmetro do Configuração remota sazonalImageUrl e é por isso que o valor do atributo não está unset .

O SDK de monitoramento de desempenho coletará os dados de rastreamento e os enviará ao Firebase. Você pode visualizar os dados no painel Performance do Firebase console, que explicaremos em detalhes na próxima etapa do codelab.

7. Configure seu painel de monitoramento de desempenho

Configure seu painel para monitorar seu recurso

No console do Firebase , selecione o projeto que tem seu aplicativo Friendly Eats.

No painel esquerdo, localize a seção Release & Monitor e clique em Performance .

Você deve ver seu painel de desempenho com seus primeiros pontos de dados em seu quadro de métricas! O SDK de monitoramento de desempenho coleta dados de desempenho de seu aplicativo e os exibe minutos após a coleta.

f57e5450b70034c9.png

Este painel de métricas é onde você pode acompanhar as principais métricas do seu aplicativo. A exibição padrão inclui a duração do rastreamento do horário de início do aplicativo, mas você pode adicionar as métricas que mais lhe interessam. Como você está rastreando o novo recurso que adicionou, pode adaptar seu painel para exibir a duração do rastreamento de código customizado splash_screen_trace .

  1. Clique em uma das caixas vazias Selecione uma métrica .
  2. Na janela de diálogo, selecione o tipo de rastreamento Custom traces e o nome do rastreamento splash_screen_trace .

1fb81f4dba3220e0.png

  1. Clique em Selecionar métrica e você deverá ver a duração de splash_screen_trace adicionada ao seu painel!

Você pode usar essas mesmas etapas para adicionar outras métricas importantes para que possa ver rapidamente como o desempenho delas muda com o tempo e até mesmo com versões diferentes.

1d465c021e58da3b.png

O quadro de métricas é uma ferramenta poderosa para rastrear o desempenho das principais métricas experimentadas por seus usuários. Para este codelab, você tem um pequeno conjunto de dados em um intervalo de tempo limitado, portanto, usará outras exibições de painel que o ajudarão a entender o desempenho do lançamento do recurso.

8. Implemente seu recurso

Agora que você configurou seu monitoramento, está pronto para implantar a alteração do Firebase Remote Config ( seasonal_image_url) que você configurou anteriormente.

Para implementar uma alteração, você voltará à página Configuração remota no console do Firebase para aumentar o percentil do usuário de sua condição de segmentação. Normalmente, você lançaria novos recursos para uma pequena parte dos usuários e os aumentaria apenas quando tivesse certeza de que não havia problemas com eles. Neste codelab, porém, vocês são os únicos usuários do aplicativo, portanto, podem alterar o percentil para 100%.

  1. Clique na guia Condições na parte superior da página.
  2. Clique na condição Seasonal image rollout que você adicionou anteriormente.
  3. Altere o percentil para 100%.
  4. Clique em Salvar condição .
  5. Clique em Publicar alterações e confirme as alterações.

70f993502b27e7a0.png

De volta ao Android Studio, reinicie o aplicativo em seu emulador para ver o novo recurso. Após a tela inicial, você deve ver a nova tela principal do estado vazio!

b0cc91b6e48fb842.png

9. Verifique as alterações de desempenho

Agora vamos verificar o desempenho do carregamento da tela inicial usando o painel Desempenho no console do Firebase. Nesta etapa do codelab, você usará diferentes partes do painel para visualizar os dados de desempenho.

  1. Na guia principal do Painel , role para baixo até a tabela de rastreamentos e clique na guia Traços personalizados . Nesta tabela, você verá os rastreamentos de código personalizados adicionados anteriormente, além de alguns rastreamentos prontos para uso .
  2. Agora que você habilitou o novo recurso, procure o rastreamento de código personalizado splash_seasonal_image_processing , que mediu o tempo necessário para baixar e processar a imagem. A partir do valor de duração do rastreamento, você pode ver que esse download e processamento levam um tempo significativo.

439adc3ec71805b7.png

  1. Como você tem dados para splash_seasonal_image_processing , pode adicionar a duração desse rastreamento ao quadro de métricas na parte superior da guia Painel .

Semelhante a antes, clique em uma das caixas vazias Selecione uma métrica . Na janela de diálogo, selecione o tipo de rastreio Custom traces e o nome do rastreio splash_seasonal_image_processing . Por fim, clique em Selecionar métrica para adicionar essa métrica ao quadro de métricas.

7fb64d2340410576.png

  1. Para confirmar ainda mais as diferenças, você pode examinar mais de perto os dados de splash_screen_trace . Clique no cartão splash_screen_trace no painel de métricas e clique em Exibir detalhes da métrica .

b1c275c30679062a.png

  1. Na página de detalhes, você verá uma lista de atributos no canto inferior esquerdo, incluindo o atributo personalizado que você criou anteriormente. Clique no atributo seasonal_image_url_attribute personalizado para visualizar a duração da tela inicial para cada URL de imagem sazonal à direita:

8fa1a69019bb045e.png

  1. Os valores de duração da tela inicial provavelmente serão um pouco diferentes daqueles na captura de tela acima, mas você deve ter uma duração maior quando a imagem for baixada de um URL em vez de usar a imagem padrão (representada por "unset").

Neste codelab, o motivo dessa duração mais longa pode ser simples, mas em um aplicativo real, pode não ser tão óbvio. Os dados de duração coletados virão de diferentes dispositivos, executando o aplicativo em várias condições de conexão de rede, e essas condições podem ser piores do que sua expectativa. Vejamos como você investigaria esse problema se fosse uma situação do mundo real.

  1. Clique em Desempenho na parte superior da página para voltar à guia principal do Painel : 640b696b79d90103.png
  2. Na tabela de rastreamentos na parte inferior da página, clique na guia Solicitações de rede . Nesta tabela, você verá todas as solicitações de rede de seu aplicativo agregadas em padrões de URL , incluindo o padrão de URL images.unsplash.com/** . Se você comparar o valor desse tempo de resposta com o tempo total que leva para o download e o processamento da imagem (ou seja, a duração do rastreamento splash_seasonal_image_processing ), poderá ver que grande parte do tempo é gasto no download da imagem.

6f92ce0f23494507.png

Descobertas de desempenho

Usando o Monitoramento de desempenho do Firebase, você notou o seguinte impacto nos usuários finais com o novo recurso ativado:

  1. O tempo gasto em SplashScreenActivity aumentou.
  2. A duração de splash_seasonal_image_processing foi muito grande.
  3. O atraso ocorreu devido ao tempo de resposta para o download da imagem e ao tempo de processamento correspondente necessário para a imagem.

Na próxima etapa, você atenuará o impacto no desempenho revertendo o recurso e identificando como pode melhorar a implementação do recurso.

10. Reverta o recurso

Aumentar o tempo de espera dos usuários durante a tela inicial não é desejável. Um dos principais benefícios do Remote Config é a capacidade de pausar e reverter seu lançamento sem ter que liberar outra versão para seus usuários. Isso permite que você reaja rapidamente a problemas (como os problemas de desempenho que você descobriu na última etapa) e minimize o número de usuários insatisfeitos.

Como uma mitigação rápida, você redefinirá o percentil de lançamento de volta para 0 para que todos os seus usuários vejam a imagem padrão novamente:

  1. Volte para a página Remote Config no Firebase console.
  2. Clique em Condições no topo da página.
  3. Clique na condição Seasonal image rollout que você adicionou anteriormente.
  4. Altere o percentil para 0%.
  5. Clique em Salvar condição .
  6. Clique em Publicar alterações e confirme as alterações.

18c4f1cbac955a04.png

Reinicie o aplicativo no Android Studio e você verá a tela principal do estado vazio original:

d946cab0df319e50.png

11. Corrija os problemas de desempenho

Você descobriu anteriormente no codelab que o download de uma imagem para sua tela inicial estava causando lentidão em seu aplicativo. Olhando mais de perto a imagem baixada, você vê que está usando a resolução original da imagem, que era superior a 2MB! Uma solução rápida para o problema de desempenho é reduzir a qualidade para uma resolução mais apropriada para que o download da imagem demore menos.

Distribua o valor Remote Config novamente

  1. Volte para a página Remote Config no Firebase console.
  2. Clique no ícone Editar para o seasonal_image_url .
  3. Atualize o Value for Seasonal image rollout para https://images.unsplash.com/photo-1552691021-7043334e0b51?w=640 e clique em Save .

828dd1951a2ec4a4.png

  1. Clique na guia Condições na parte superior da página.
  2. Clique em Implementação de imagem sazonal e, em seguida, defina o percentil de volta para 100%.
  3. Clique em Salvar condição .

1974fa3bb789f36c.png

  1. Clique no botão Publicar alterações .

12. Teste a correção e configure alertas

Execute o aplicativo localmente

Com o novo valor de configuração definido para usar um URL de imagem de download diferente, execute o aplicativo novamente. Desta vez, você deve notar que o tempo gasto na tela inicial é menor do que antes.

b0cc91b6e48fb842.png

Veja o desempenho das mudanças

Retorne ao painel de desempenho no console do Firebase para ver a aparência das métricas.

  1. Desta vez, você usará a tabela traces para navegar até a página de detalhes. Na tabela de rastreamentos, na guia Rastreamentos personalizados , clique no rastreamento personalizado splash_seasonal_image_processing para ver novamente uma exibição mais detalhada de sua métrica de duração.

2d7aaca03112c062.png

  1. Clique no atributo seasonal_image_url_attribute personalizado para ver a divisão dos atributos personalizados novamente. Se você passar o mouse sobre os URLs, verá um valor que corresponde ao novo URL da imagem de tamanho reduzido: https://images.unsplash.com/photo-1552691021-7043334e0b51?w=640 (com o ?w=640 no final). O valor de duração associado a esta imagem é consideravelmente menor do que o valor da imagem anterior e mais aceitável para seus usuários!

10e30c037a4237a2.png

  1. Agora que você melhorou o desempenho da tela inicial, pode configurar alertas para notificá-lo quando um rastreamento exceder um limite definido. Abra o painel Desempenho e clique no ícone do menu flutuante (três pontos) para splash_screen_trace e clique em Configurações de alerta .

4bd0a2a1faa14479.png

  1. Clique no botão de alternância para ativar o alerta de duração . Defina o valor do limite para ficar um pouco acima do valor que você estava vendo para que, se seu splash_screen_trace exceder o limite, você receba um e-mail.
  1. Clique em Salvar para criar seu alerta. Role para baixo até a tabela de rastreamentos e clique na guia Rastreamentos personalizados para ver se seu alerta está ativado!

2bb93639e2218d1.png

13. Parabéns!

Parabéns! Você ativou o Firebase Performance Monitoring SDK e coletou rastros para medir o desempenho de um novo recurso. Você monitorou as principais métricas de desempenho para o lançamento de um novo recurso e reagiu rapidamente quando um problema de desempenho foi descoberto. Tudo isso foi possível com a capacidade de fazer alterações de configuração com o Remote Config e monitorar problemas de desempenho em tempo real.

O que cobrimos

  • Adicionar o SDK de monitoramento de desempenho do Firebase ao seu aplicativo
  • Adicionando um rastreamento de código personalizado ao seu código para medir um recurso específico
  • Configurando um parâmetro de configuração remota e um valor condicional para controlar/lançar um novo recurso
  • Noções básicas sobre como usar o painel de monitoramento de desempenho para identificar problemas durante uma implementação
  • Configurar alertas de desempenho para notificá-lo quando o desempenho do seu aplicativo ultrapassar um limite definido por você

Saber mais