Depurar um bot com middleware de inspeção

APLICA-SE A: SDK v4

Este artigo descreve como depurar um bot usando middleware de inspeção. Esse recurso permite que o Bot Framework Emulator depure o tráfego dentro e fora do bot e veja o estado atual do bot. Você pode usar uma mensagem de rastreamento para enviar dados ao Emulator e inspecionar o estado do bot em qualquer momento da conversa.

Usamos um EchoBot criado localmente usando o Bot Framework v4 Criar um bot para mostrar como depurar e inspecionar o estado da mensagem do bot. Você também pode Depurar um bot usando o IDE ou Depurar com o Bot Framework Emulator, mas, para depurar o estado, você precisa adicionar o middleware de inspeção ao bot. Os exemplos de bot de inspeção estão disponíveis para C#, JavaScript, Java e Python.

Pré-requisitos

Atualizar sua Emulator para a versão mais recente

Antes de usar o middleware de inspeção de bot para depurar o bot, atualize o Emulator para a versão 4.5 ou posterior. Verifique a versão mais recente para obter atualizações.

Para verificar a versão do Emulator, selecione Ajuda e, em seguida, Sobre no menu. Você verá a versão atual do seu Emulator.

current version

Atualizar o código do bot

Configure o estado de inspeção e adicione o middleware de inspeção ao adaptador no arquivo Startup.cs. O estado de inspeção é fornecido por injeção de dependência. Consulte a atualização de código abaixo ou consulte o exemplo de middleware de inspeção no GitHub.

Startup.cs

// The Inspection Middleware needs some scratch state to keep track of the (logical) listening connections.
services.AddSingleton<InspectionState>();

// Create the Bot Adapter with error handling enabled.
services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithInspection>();

AdapterWithInspection.cs

public class AdapterWithInspection : CloudAdapter
{
    public AdapterWithInspection(BotFrameworkAuthentication auth, IConfiguration configuration, InspectionState inspectionState, UserState userState, ConversationState conversationState, ILogger<IBotFrameworkHttpAdapter> logger)
        : base(auth, logger)
    {
        // Inspection needs credentials because it will be sending the Activities and User and Conversation State to the emulator
        var credentials = new MicrosoftAppCredentials(configuration["MicrosoftAppId"], configuration["MicrosoftAppPassword"]);

        Use(new InspectionMiddleware(inspectionState, userState, conversationState, credentials));

        OnTurnError = async (turnContext, exception) =>
        {
            // Log any leaked exception from the application.
            logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}");

            // Send a message to the user
            await turnContext.SendActivityAsync("The bot encountered an error or bug.");
            await turnContext.SendActivityAsync("To continue to run this bot, please fix the bot source code.");

            // Send a trace activity, which will be displayed in the Bot Framework Emulator
            await turnContext.TraceActivityAsync("OnTurnError Trace", exception.Message, "https://www.botframework.com/schemas/error", "TurnError");
        };
    }
}

Atualize a classe do bot no arquivo EchoBot.cs.

EchoBot.cs

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    var conversationStateProp = _conversationState.CreateProperty<CustomState>("customState");
    var convProp = await conversationStateProp.GetAsync(turnContext, () => new CustomState { Value = 0 }, cancellationToken);

    var userStateProp = _userState.CreateProperty<CustomState>("customState");
    var userProp = await userStateProp.GetAsync(turnContext, () => new CustomState { Value = 0 }, cancellationToken);

    await turnContext.SendActivityAsync(MessageFactory.Text($"Echo: {turnContext.Activity.Text} conversation state: {convProp.Value} user state: {userProp.Value}"), cancellationToken);

    convProp.Value++;
    userProp.Value++;
}

Testar o bot localmente

Depois de atualizar o código, você pode executar o bot localmente e testar o recurso de depuração usando dois Emuladores: um para enviar e receber mensagens e outro para inspecionar o estado das mensagens no modo de depuração. Para testar o bot localmente, execute as seguintes etapas:

  1. Acesse o diretório do bot em um terminal e execute o seguinte comando para executar o bot localmente:

    dotnet run
    
  2. Abra sua Emulator. Selecione Abrir Bot. Preencha a URL do Bot com http://localhost:3978/api/messages os valores MicrosoftAppId e MicrosoftAppPassword . Se você tiver um bot JavaScript, poderá encontrar esses valores no arquivo .env desse bot. Se você tiver um bot C#, poderá encontrar esses valores no arquivo appsettings.json. Para um bot Java, você pode encontrar esses valores no arquivo application.properties . Selecione Conectar.

  3. Agora abra outra janela Emulator. Esta segunda janela Emulator funcionará como um depurador. Siga as instruções descritas na etapa anterior. Verifique Abrir no modo de depuração e selecione Conexão.

  4. Neste ponto, você verá um comando com um identificador exclusivo (/INSPECT attach <identifier>) no Emulator de depuração. Copie o comando inteiro com o identificador do Emulador de depuração e cole-o na caixa de chat do primeiro Emulador.

    Observação

    Um identificador exclusivo é gerado sempre que o Emulator é iniciado no modo de depuração depois que você adiciona o middleware de inspeção no código do bot.

  5. Agora você pode enviar mensagens na caixa de chat do seu primeiro Emulator e inspecionar as mensagens no Emulator de depuração. Para inspecionar o estado das mensagens, selecione Estado do Bot na Emulator de depuração e desdobre valores na janela JSON direita. Você verá o estado do bot na Emulator de depuração:

    bot state

Inspecionar o estado de um bot configurado no Azure

Se você quiser inspecionar o estado do bot configurado no Azure e conectado a canais (como Teams), será necessário instalar e executar o ngrok.

Executar o ngrok

Neste ponto, você atualizou sua Emulator para a versão mais recente e adicionou o middleware de inspeção no código do bot. A próxima etapa é executar o ngrok e configurar o bot local. Antes de executar o ngrok, você precisa executar o bot localmente.

Para executar o bot localmente, faça o seguinte:

  1. Vá para a pasta do bot em um terminal e defina seu registro npm para usar os builds mais recentes

  2. Execute o bot localmente. Você verá seu bot expor um número de porta como 3978.

  3. Abra outro prompt de comando e vá para a pasta de projeto do bot. Execute o comando a seguir:

    ngrok http 3978
    
  4. O ngrok agora está conectado ao bot executado localmente. Copie o endereço IP público seguro (HTTPS).

    ngrok success

Atualizar o recurso do bot

Agora que o bot local está conectado ao ngrok, você pode configurar o recurso de bot no Azure para usar a URL do ngrok.

  1. Vá para o recurso de bot no Azure. No menu à esquerda, em Configurações, selecione Configuração.

    1. Defina o ponto de extremidade de Mensagens como o endereço IP do ngrok copiado. Se necessário, adicione /api/messages após o endereço IP. Por exemplo, https://e58549b6.ngrok.io/api/messages.

    2. Selecione Habilitar Ponto de Extremidade de Streaming.

      Set endpoint

    3. Selecione Aplicar para salvar as alterações.

      Dica

      Se Aplicar não estiver habilitado, você poderá desmarcar Habilitar Ponto de Extremidade de Streaming e selecionar Aplicar e, em seguida, verificar Habilitar Ponto de Extremidade de Streaming e selecionar Aplicar novamente. Você precisa verificar se Habilitar Ponto de Extremidade de Streaming está marcado e a configuração do ponto de extremidade foi salva.

  2. Vá para o grupo de recursos do bot.

    1. Selecione Implantação e selecione o recurso de bot que foi implantado com êxito. Selecione Modelo no menu à esquerda para obter o MicrosoftAppId e o MicrosoftAppPassword para o aplicativo Web associado ao bot.

      Get inputs

    2. Atualize o arquivo de configuração do bot (appsettings.json para C#ou .env para JavaScript) com o MicrosoftAppId e o MicrosoftAppPassword.

  3. Inicie seu Emulator, selecione Abrir Bot e insira http://localhost:3978/api/messages na URL do Bot. Preencha a ID de Aplicativo da Microsoft e a senha do Aplicativo Microsoft com o mesmo MicrosoftAppId e MicrosoftAppPassword que você adicionou ao arquivo de configuração do bot. Depois, selecione Conectar.

  4. Seu bot em execução agora está conectado ao recurso de bot no Azure. Para testar o bot no Azure no Webchat, acesse os recursos do bot, selecione Testar em Webchat e envie mensagens para o bot.

Habilitar o modo de depuração

  1. Em seu Emulator, selecione Depurar e, em seguida, Inicie a Depuração.

  2. Insira o endereço IP ngrok (não se esqueça de adicionar /api/mensagens) para a URL do Bot (por exemplo, https://e58549b6.ngrok.io/api/messages).

    1. Para a ID do Aplicativo da Microsoft, insira a ID do aplicativo do bot.
    2. Para senha do Aplicativo Microsoft, insira o segredo do aplicativo do bot.
    3. Verifique se a opção Abrir no modo de depuração também está marcada.
    4. Selecione Conectar.
  3. Com o modo de depuração habilitado, o Emulator gera uma UUID. Uma UUID é uma ID exclusiva gerada sempre que você inicia o modo de depuração em seu Emulator.

  4. Copie e cole a UUID no Teste na caixa de chat Webchat para a caixa de chat do canal. Você verá a mensagem "Anexado à sessão, todo o tráfego está sendo replicado para inspeção" na caixa de chat.

Você pode iniciar a depuração do bot enviando mensagens na caixa de chat do canal configurado. O Emulator local atualizará automaticamente as mensagens com todos os detalhes para depuração. Para inspecionar o estado das mensagens do bot, selecione Estado do Bot e desdobre os valores na janela JSON certa.

debug-inspection-middleware

Recursos adicionais