Asterisco e envio perdidos em Telegram / Slack / E-mail

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
#MONIT_DESCRITION - ,      .
# timestamp    - ( №1).
timedate=$(echo $MONIT_DESCRIPTION | cut -d\| -f1 | cut -d\: -f2 | gawk '{print strftime("%d.%m.%Y %H:%M:%S",$0);}')
# UID ( №2)
call_id=$(echo $MONIT_DESCRIPTION | cut -d\| -f2)
#   ( №3)
qnum=$(echo $MONIT_DESCRIPTION | cut -d\| -f3)

#      
case $qnum in
    210)
        qname=" 1"
        ;;
    220)
        qname=" 2"
        ;;
esac

#      UID,     ENTERQUEUE
str=$(grep "|$call_id|$qnum|.*|ENTERQUEUE" /var/log/asterisk/queue_log)
#      ( №7)
caller_id=$(echo $str | cut -d\| -f7)
#     ( №1)
time_enter=$(echo $str | cut -d\| -f1)
#     ( №1   ABANDON)
time_abandon=$(echo $MONIT_DESCRIPTION | cut -d\| -f1 | cut -d\: -f2)
# 
data=" $caller_id $timedate   $qname,       $(($time_abandon-$time_enter)) ."
#    /.     Slack.
/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.

All Articles