зачем эти танцы с бубном. я вон написал как быстро посчитать.
meral ( 2011-10-27 09:01:32 +0400 )редактироватьДобрый день,
стоит задача: мониторить шлюзы на количество одновременно занятых линий. SNMP в шлюзах нет.
Совсем не обязательно что бы это было в режиме реального времени. Поэтому берусь анализировать сдр. Все cdr хранятся в базе, мне необходимо получить количество совершенных звонков в заданном промежутке времени. Вся сложность в том, что я не могу понять логику составления запроса. Предположим, есть поля в таблице: Кто, куда, канал, началозвонка, конецзвонка, продолжительность.
Допустим, я хочу узнать количество звонков соверешных в период с 1970-01-01 00:00:00 по 1970-01-01 00:00:10
Как мне сравнить промежутка начала и конца звонка с промежутками заданными в запросе? Заранее Спасибо за помощь.
самый простой алгоритм такой
1) берете все даты начала звонка(запросом) в виде calldate,1 as c с вашей даты -2 часа
2) берете все концы звонка(считаете) date_add(calldate, interval duration second),-1 as c
3) ну а теперь просто суммируете по колонке с ;)
так вы получаете колчичество звонков сейчас.
ну а количестов звоноков за период считается просто суммированием. если надо макс занятых каналов, то надо 1,2 упорядочить по первой колонке и считать максимум в вашем интервале по всем этим моментам.
еси необходимо ловить перегрузку по емкости, то лучше поставить "заглушку". если необходимо анализировать нагрузку, то, думаю лучше будет суммировать продолжительности разговоров в интервалы времени.
О том, что Вы спросили на языке sql звучит так:
...where start_call between (dateA,dateB) and end_call between (dateA,dateB).
Но count() Вам здесь не в помощь, т.к. количество звонков за установленный интервал не является показательным для Вашей задачи (кол-во одновременно занятых каналов). Т.е., Вы этим запросом посчитаете сколько было звонков в интервале между dateA и dateB. Думаю, что дальнейшему объяснению это логическое направление не подлежит...
Предлагаю другой путь...
Допустим у Вас N каналов. Максимальной нагрузке (занятости всех каналов) за установленный интервал (А,В) времени будет выражение (B-A)*N. Минимальная продолжительность разговора 1сек. Интервал времени 30мин
Максимальная нагрузка за этот период составляет N*30*60
. Просуммировав продолжительности звонков, начало и конец которых находится между началом и концом установленного интервала, добавив сумму продолжительности звонков, начало которых находится между интервалом, но конец больше, чем конец... тьфу, какие пошлости получаются... Второй суммой должны быть звонки, выпадающие концом... ага, из ширин... Ну, клин блинтон, надеюсь вы поняли... чтобы не выпалииии... не, не могу больше....
Не потеряйте звонки с неоконченными разговорами по отношению к интервалу.
Полученную сумму соизмерьте с максимальным значением. Вы получили среднее значение нагрузки за весь период.
Разделив интервал пополам и выполнив суммирование в каждой части, Вы получили первое приближение к действительному значению нагрузки. И так далее...
Адекватно суммируя продолжительности звонков, при этом, изменяя дискретность итераций в интервале, Вы получаете более или менее близкую к реальной кривую нагрузки. Где-то вот так...
зачем эти танцы с бубном. я вон написал как быстро посчитать.
meral ( 2011-10-27 09:01:32 +0400 )редактироватьвообще, если идти именно этим путем, то вам нужно выбрать все звонки начало которых ранее начала промежутка, а конец позднее начала промежутка и добавить к ним звонки у которых начало разговора позднее начала промежутка, но не позднее окончания промежутка запроса.
а правильней было бы snmp прикрутить к астеру и мониторить картину в mrtg к примеру, ну или раз в минуту или можно чаще выполнять команду asterisk -rx "core show channels" и анализировать ее вывод.
да ну, это вы фиговую идею предложили. по сдр однозначно и просто вычисляется колчиество звонков. а вот core show channels может вешать ядро *, елси часто вызывать
meral ( 2011-10-26 07:02:41 +0400 )редактироватьЗадан: 2011-10-25 20:36:38 +0400
Просмотрен: 2,329 раз
Обновлен: Oct 26 '11
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.