Existe um call center. Há Asterisk / FreePBX com filas configuradas. Existem agentes que devem atender chamadas. Mas existem tantos clientes em potencial e tão poucos agentes que o primeiro não consegue chegar ao segundo de forma alguma - fica na fila por um minuto e até desliga.Mas por algum motivo eles ligaram! Talvez eles querem trazer dinheiro para a empresa? Vamos tentar devolver os clientes e seu dinheiro usando o exemplo FreePBX.Nas configurações da fila, você pode especificar Destino de Failover - para onde enviar a chamada quando a fila estiver cheia, o tempo limite esgotado, etc. Mas muitas vezes acontece que o chamador se desconecta antes de ser redirecionado para o destino de failover - você nunca sabe que a conexão foi cortada. Não existe uma solução pronta para esses casos. Portanto, analisamos os detalhes e escrevemos os seus - enviando um alerta para Telegram / Slack / E-mail / outro lugar.E a primeira coisa que precisamos entender é como o FreePBX grava logs de filas. No caso mais simples, esse é o arquivo de texto / var / log / asterisk / queue_log.Portanto, uma chamada regular é gravada no log do assinante 8964467XXXXX, que ligou para 302221XXXX, que está na linha 603 da primeira posição, à qual a agente Girl respondeu 8 segundos depois. Eles conversaram 133 segundos e o assinante foi o primeiro a desligar - todos teriam gerentes tão educados!1584318765|1584318747.89449|603|NONE|DID|302221
1584318765|1584318747.89449|603|NONE|ENTERQUEUE||8964467|1
1584318774|1584318747.89449|603|Agent Girl|CONNECT|9|1584318765.89450|8
1584318907|1584318747.89449|603|Agent Girl|COMPLETECALLER|9|133|1
E aqui está uma história um pouco diferente quando um assinante 8996453XXXXX telefonou para 302257XXXXX, desligou 10 segundos na linha 210 na primeira posição e desconectou. Eu nem ouvi o menu de voz!1581728710|1581728690.59367|210|NONE|DID|302257
1581728710|1581728690.59367|210|NONE|ENTERQUEUE||8996453|1
1581728720|1581728690.59367|210|NONE|ABANDON|1|1|10
É sobre ele, escreveremos no messenger.Para fazer isso, precisamos capturar a ocorrência do evento ABANDON no arquivo de log. Fiquei intrigado por um longo tempo como isso pode ser feito, mas, por acaso, me deparei com uma ferramenta maravilhosa - o MONIT . No nosso caso, ele monitorará o log da fila e, assim que a linha “ABANDON” aparecer, chamará o script para processar este evento.Para fazer isso, depois de instalar o pacote:yum install monit
Configure - crie o arquivo /etc/monit.d/queue_log e escreva literalmente três linhas nele:check file queue_log with path /var/log/asterisk/queue_log
if content = "ABANDON" then
exec "/var/lib/asterisk/agi-bin/qlogevent.sh $EVENT"
Portanto, quando a palavra “ABANDON” aparecer no log da fila, que nos diz para desconectar prematuramente o assinante, o script /var/lib/asterisk/agi-bin/qlogevent.sh com o parâmetro $ EVENT será chamado, o que não é nada além de completamente a linha em que esta palavra apareceu.É simples.E agora não é o xadrez que começa - você precisa pensar nisso.A linha passada para o script não contém informações sobre o número do chamador:1581728720|1581728690.59367|210|NONE|ABANDON|1|1|10
Ele possui apenas Timestamp (1581728720), um ID de chamada exclusivo (1581728690.59367), um número de fila (210), o próprio evento e alguns outros parâmetros não essenciais. Essa. Teremos que procurar o número de assinante. E de que maneira? E é muito simples, porque temos um UID de uma chamada!Vamos voltar ao log desta chamada, especificamente, para a linha na qual o assinante cai na fila:1581728710|1581728690.59367|210|NONE|ENTERQUEUE||8996453|1
Quando o evento "ENTERQUEUE" ocorre, um dos parâmetros é o número de assinante que precisamos. Só podemos encontrar esta linha no arquivo queue_log. É exatamente isso que o script bash está fazendo, que o MONIT chamou cuidadosamente por nós:#!/bin/bash
timedate=$(echo $MONIT_DESCRIPTION | cut -d\| -f1 | cut -d\: -f2 | gawk '{print strftime("%d.%m.%Y %H:%M:%S",$0);}')
call_id=$(echo $MONIT_DESCRIPTION | cut -d\| -f2)
qnum=$(echo $MONIT_DESCRIPTION | cut -d\| -f3)
case $qnum in
210)
qname=" 1"
;;
220)
qname=" 2"
;;
esac
str=$(grep "|$call_id|$qnum|.*|ENTERQUEUE" /var/log/asterisk/queue_log)
caller_id=$(echo $str | cut -d\| -f7)
time_enter=$(echo $str | cut -d\| -f1)
time_abandon=$(echo $MONIT_DESCRIPTION | cut -d\| -f1 | cut -d\: -f2)
data=" $caller_id $timedate $qname, $(($time_abandon-$time_enter)) ."
/usr/bin/curl -X POST -H 'Content-type: application/json' --data '{"text":"'"$data"'"}' "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Na verdade, é tudo!É verdade que há um incidente - o MONIT, projetado para monitorar tudo e mais: ele precisa de monitoramento, porque periodicamente cai.