Diretrizes de depuração
APLICA-SE A: SDK v4
Os bots são aplicativos complexos, com muitas partes trabalhando juntas. Como qualquer outro aplicativo complexo, isso pode levar a alguns erros interessantes ou fazer com que seu bot se comporte de maneira diferente do esperado.
A depuração do bot, às vezes, pode ser uma tarefa difícil. Cada desenvolvedor tem sua própria maneira preferida de realizar essa tarefa. As diretrizes abaixo são sugestões que se aplicam à maioria dos bots.
Depois de verificar se o bot funciona, a próxima etapa é conectá-lo a um canal. Para fazer isso, você pode implantar seu bot em um servidor de preparo e criar seu próprio cliente de linha direta para o bot se conectar. Para obter mais informações, consulte Conectar um bot a uma Linha Direta.
Criar seu próprio cliente permite que você defina o funcionamento interno do canal e teste como seu bot responde a determinadas trocas de atividades. Depois de conectado ao cliente, execute os testes para definir o estado do bot e verificar os recursos. Se o bot utiliza um recurso, como a fala, o uso desses canais pode oferecer uma maneira de verificar essa funcionalidade.
Observação
Ao implantar um bot no Azure, o canal de Webchat é provisionado por padrão.
O uso do Bot Framework Emulator e do Web Chat via portal do Azure aqui pode fornecer mais informações sobre o desempenho do bot ao interagir com diferentes canais.
A depuração do bot funciona da mesma forma que outros aplicativos multi-thread, com a capacidade de definir pontos de interrupção ou usar recursos como a janela imediata.
Os bots seguem um paradigma de programação controlada por evento, que poderá ser difícil de ser racionalizado se você não estiver familiarizado com ele. A ideia de o bot ser sem estado, multi-thread e lidar com chamadas assíncronas/await pode resultar em bugs inesperados. Embora a depuração do bot funcione de modo semelhante a outros aplicativos multithread, abordaremos algumas sugestões, ferramentas e recursos para ajudar.
Noções básicas sobre as atividades do bot com o emulador
O bot lida com diferentes tipos de atividades, além da atividade normal de mensagem. A compreensão dessas atividades ajudará você a codificar o bot com eficiência e permite que você verifique se as atividades que o bot está enviando e recebendo são as esperadas. O uso do emulador mostrará quais são essas atividades, quando elas acontecem e quais informações elas contêm. Para obter mais informações, consulte Depurar com o emulador.
Salvar e recuperar as interações do usuário com transcrições
O armazenamento de transcrição de Blobs do Azure fornece um recurso especializado em que você pode armazenar e recuperar transcrições contendo as interações entre os usuários e seu bot.
Além disso, depois que as interações de entrada do usuário foram armazenadas, você pode usar o “gerenciador de armazenamento” do Azure para exibir manualmente os dados contidos em transcrições armazenadas em seu repositório de transcrição de blob. O exemplo a seguir abre o "gerenciador de armazenamento" nas configurações de "mynewtestblobstorage". Para abrir uma entrada de usuário salva, selecione: Contêiner de Blob > ChannelId > TranscriptId > ConversationId
Isso abre a entrada de conversação do usuário armazenada no formato JSON. A entrada do usuário é preservada junto com a chave "text:". Para obter mais informações sobre como criar e usar um arquivo de transcrição de bot, consulte Depurar seu bot usando arquivos de transcrição.
Como funciona o middleware
O middleware pode não ser intuitivo na primeira tentativa de usá-lo, particularmente, com relação à continuação, ou curto-circuito, de execução. O middleware pode ser executado na borda à esquerda ou à direita de um turno, com uma chamada ao delegado next()
que instrui quando a execução é passada para a lógica do bot.
Se você estiver usando várias partes do middleware e for assim que seu pipeline é orientado, o delegado poderá passar a execução para uma parte diferente do middleware. Detalhes sobre o pipeline de middleware do bot podem ajudar a esclarecer essa ideia.
Se o next()
delegado não for chamado, isso será chamado de roteamento de curto-circuito. Isso acontece quando o middleware atende à atividade atual e determina que não é necessário passar a execução.
Entender quando e por que os curtos-circuitos de middleware podem ajudar a indicar qual parte do middleware deve vir primeiro em seu pipeline. Além disso, entender o que esperar é importante para o middleware integrado fornecido pelo SDK ou por outros desenvolvedores. Algumas pessoas acreditam ser útil tentar criar seu próprio middleware primeiro para experimentar um pouco antes de se aprofundarem no middleware interno.
Para obter mais informações sobre como depurar um bot usando middleware de inspeção, consulte Depurar um bot com middleware de inspeção.
Reconhecendo o estado
O acompanhamento do estado é uma parte importante do bot, particularmente, para tarefas complexas. Em geral, a melhor prática é processar as atividades o mais rapidamente possível e permitir a conclusão do processamento para que o estado seja persistido. As atividades podem ser enviadas para o bot quase ao mesmo tempo, e isso pode introduzir bugs confusos devido à arquitetura assíncrona.
O mais importante é garantir a persistência do estado de uma maneira que corresponda às suas expectativas. Dependendo do local em que reside o estado persistente, os emuladores de armazenamento do Cosmos DB e do Armazenamento de Tabelas do Azure podem ajudá-lo a verificar o estado antes de usar o armazenamento de produção.
Importante
A classe de armazenamento do Cosmos DB foi preterida. Os contêineres criados originalmente com o CosmosDbStorage não tinham nenhuma chave de partição definida e receberam a chave de partição padrão de _/partitionKey.
Os contêineres criados com o armazenamento do Cosmos DB podem ser usados com o armazenamento particionado do Cosmos DB. Para obter mais informações, leia Particionamento no Azure Cosmos DB.
Observe também que, ao contrário do armazenamento herdado do Cosmos DB, o armazenamento particionado do Cosmos DB não cria automaticamente um banco de dados dentro da sua conta do Cosmos DB. Você precisa criar um novo banco de dados manualmente, mas ignore a criação manual de um contêiner, pois o CosmosDbPartitionedStorage criará o contêiner para você.
Como usar manipuladores de atividades
Os manipuladores de atividade podem introduzir outra camada de complexidade, principalmente porque cada atividade é executada em um thread independente (ou em web workers, dependendo da linguagem). Dependendo do que seus manipuladores estão fazendo, isso pode causar problemas em que o estado atual não é o esperado.
O estado interno é gravado no final de um turno; no entanto, todas as atividades geradas por esse turno são executadas independentemente do pipeline de turno. Geralmente, isso não nos afeta, mas se um manipulador de atividade muda de estado, precisamos gravar o estado para que ele contenha essa alteração. Nesse caso, o pipeline de turno pode aguardar a conclusão do processamento da atividade antes de ser concluído, para garantir que ele registre o estado correto desse turno.
O método enviar atividade e seus manipuladores apresentam um único problema. Simplesmente chamar enviar atividade de dentro do manipulador ao enviar atividades causa uma bifurcação infinita de threads. Há várias maneiras de resolver esse problema; por exemplo, acrescentando mensagens adicionais às informações de saída ou gravando em outro local, como o console ou um arquivo, para evitar a falha do bot.
Depurando um bot de produção
Quando o bot está em produção, você pode depurar o bot de qualquer canal usando os Túneis de Desenvolvimento. A conexão perfeita do bot a vários canais é um recurso importante disponível no Bot Framework. Para obter mais informações, consulte Depurar um bot de qualquer canal usando devtunnel e Depurar uma habilidade ou consumidor de habilidade.
Próximas etapas
Recursos adicionais
- Depurando no Visual Studio
- Depurando, rastreando e criando um perfil para o Bot Framework
- Usar o ConditionalAttribute para métodos que você não deseja incluir no código de produção
- Usar ferramentas como o Fiddler para ver o tráfego de rede
- Solucionar problemas gerais e outros artigos de solução de problemas nesta seção