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
- Baixar e instalar o Bot Framework Emulator
- Conhecimento do middleware de bot
- Conhecimento do estado de gerenciamento de bot
- Baixar e instalar o ngrok (se você quiser depurar um bot configurado no Azure para usar canais adicionais)
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.
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:
Acesse o diretório do bot em um terminal e execute o seguinte comando para executar o bot localmente:
dotnet runAbra sua Emulator. Selecione Abrir Bot. Preencha a URL do Bot com
http://localhost:3978/api/messagesos 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.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.
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.
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:
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:
Vá para a pasta do bot em um terminal e defina seu registro npm para usar os builds mais recentes
Execute o bot localmente. Você verá seu bot expor um número de porta como
3978.Abra outro prompt de comando e vá para a pasta de projeto do bot. Execute o comando a seguir:
ngrok http 3978O ngrok agora está conectado ao bot executado localmente. Copie o endereço IP público seguro (HTTPS).
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.
Vá para o recurso de bot no Azure. No menu à esquerda, em Configurações, selecione Configuração.
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.Selecione Habilitar Ponto de Extremidade de Streaming.
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.
Vá para o grupo de recursos do bot.
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.
Atualize o arquivo de configuração do bot (appsettings.json para C#ou .env para JavaScript) com o MicrosoftAppId e o MicrosoftAppPassword.
Inicie seu Emulator, selecione Abrir Bot e insira
http://localhost:3978/api/messagesna 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.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
Em seu Emulator, selecione Depurar e, em seguida, Inicie a Depuração.
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).- Para a ID do Aplicativo da Microsoft, insira a ID do aplicativo do bot.
- Para senha do Aplicativo Microsoft, insira o segredo do aplicativo do bot.
- Verifique se a opção Abrir no modo de depuração também está marcada.
- Selecione Conectar.
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.
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.
Recursos adicionais
- Experimente o exemplo de bot de middleware de inspeção em C#, JavaScript ou Python .
- Leia solucionar problemas gerais e outros artigos de solução de problemas nesta seção.
- Leia o artigo de instruções Depurar com o Emulador.