Определение времени работы внутренних линий — различия между версиями
(Новая страница: «Задача: Мониторинг состояния внутренних линий и определение времены работы внутренних ли...») |
м (→Результаты) |
||
(не показана одна промежуточная версия этого же участника) | |||
Строка 1: | Строка 1: | ||
− | + | [[Практики|Наверх]] | |
− | Задача | + | '''Задача:''' Мониторинг состояния внутренних линий и определение времены работы внутренних линий. |
− | В | + | Задача становится актуальной, когда операторы системы не используют клиентских приложений, а установлены как "'''пользователь по умолчанию'''" для своего телефона. В базу данных '''Oktell''' информация о разрегистрации линии не заносится и проверка работы линий доступна только с помощью клиентского приложения (модуль "'''Мониторинг'''"), что является не очень удобным. |
− | + | Следовательно, необходимо создать сценарий, который будет проверять состояние линий и вести статистику о времени работы каждой линии, а следовательно и пользователя системы. В случае выключенной линии, сценарий оповестит об этом администратора системы. Сценарий выглядит следующим образом: | |
− | |||
− | + | [[Файл:РаботаВнутреннихЛиний-001.png | center]] | |
− | * [oktell_settings].[dbo].[A_ServerExtLines] — столбец SystemNumStr показывает номера внешних SIP линий | + | |
+ | Структурно сценарий состоит из | ||
+ | * Цикла по внутренним SIP-линиям. Блок взят из статьи [[Построковая обработка sql выборки в сценарии]] (Вариант 1) | ||
+ | * Определения статуса конкретной SIP-линии. Блок взят из статьи [[Мониторинг состояния внешних линий]] | ||
+ | * Обновление статистики по работе линии | ||
+ | |||
+ | |||
+ | === Описание компонентов === | ||
+ | |||
+ | '''1.''' Компонент "'''Начальные параметры'''". Заданы параметры - начальное значение для поиска внутренних линий и текущая дата. | ||
+ | |||
+ | '''2.''' Компонент "'''Находим линию'''". Определяет следующую по порядку внутреннюю '''SIP''' линию по столбцу '''systemnumstr'''. В качестве выходных параметров запрос выдает '''res''' - результат запроса (1- найдена линия, 0 -не найдена), '''systemnumstr''' - номер внутренней линии. | ||
+ | |||
+ | declare @min int | ||
+ | select @min = min(systemnumstr) | ||
+ | from [oktell_settings].[dbo].[A_ServerSipLines] | ||
+ | where systemnumstr>@systemnumstr_before | ||
+ | |||
+ | if (@min is not null) | ||
+ | select @systemnumstr=@min | ||
+ | |||
+ | set @res=@@rowcount | ||
+ | |||
+ | Запрос использует таблицу: | ||
+ | |||
+ | * '''[oktell_settings].[dbo].[A_ServerSipLines]''' — столбец '''SystemNumStr''' показывает номера внутренних '''SIP''' линий, определенных в системе. | ||
+ | |||
+ | Однако вы также можете использовать таблицы: | ||
+ | |||
+ | * '''[oktell_settings].[dbo].[A_ServerUSBLines]''' — столбец '''SystemNumStr''' показывает номера внутренних '''Voip''' линий (гарнитура или usb телефон). | ||
+ | |||
+ | * '''[oktell_settings].[dbo].[A_ServerExtLines]''' — столбец '''SystemNumStr''' показывает номера внешних '''SIP''' линий | ||
+ | |||
+ | Также в запросе вы можете объединить эти таблицы и получать информацию по всем линиям. | ||
+ | |||
+ | '''3.''' Компонент "'''Проверка на завершение'''". Определяет конец цикла (был осуществлен перебор всех линий). Сравнение переменной res с нулем. | ||
+ | |||
+ | '''4.''' Компонент "'''id_before = id_after'''". Переприсваивает переменную для поиска следующей sip-линии на следующем цикле. | ||
+ | |||
+ | '''5.''' Компонент "'''Статус линии'''". Определяет состояние линии по ее номеру и записывает в переменную '''status'''. | ||
+ | |||
+ | '''6.''' Компонент "'''Идентификатор пользователя'''". Определяет пользователя, контролирующего линию ("'''Пользователь по умолчанию'''" или логически связанный пользователь), и записывает его в переменную user. | ||
+ | |||
+ | |||
+ | [[Файл:РаботаВнутреннихЛиний-003.png | center ]] | ||
+ | |||
+ | |||
+ | '''7.''' Компонент "'''Определяем пользователя по умолчанию'''". Используется SQL-запрос, определяющий по идентификатору пользователя его имя. | ||
+ | |||
+ | select @name=name from a_users where ID =@id | ||
+ | |||
+ | '''8.''' Компонент "'''Определяем статус линии'''". В компоненте определяется состояние линии по ее статусу - включена или выключена. В сценарии, линия считается выключенной если ее статус = 1 ( не подключена) или 1024 (не определена). Более подробно по статусам вы можете прочитать [[Общие_компоненты_сценариев#.D0.A1.D1.82.D0.B0.D1.82.D1.83.D1.81_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D0.B0 | Общие компоненты сценариев]] | ||
+ | |||
+ | '''9.''' Компонент "'''Линия включена'''". В компоненте происходит запись информации в таблицу работы линий. Если записи о линии нет, она будет создана. Если запись есть, то она будет обновлена. | ||
+ | |||
+ | Описание таблицы '''Lines''' | ||
+ | |||
+ | * '''Line''' [nvarchar] - номер линии | ||
+ | * '''User''' [nvarchar] - связанный пользователь | ||
+ | * '''Status''' [nvarchar] - '''текущий''' статус линии | ||
+ | * '''Online''' [datetime] - время во включенном состоянии | ||
+ | * '''Offline''' [datetime] - время в выключенном состоянии | ||
+ | * '''date''' [datetime] - текущая дата | ||
+ | * '''datetime''' [datetime] - время последнего обновления информации | ||
+ | |||
+ | <FONT color="red">ВНИМАНИЕ: В запросе делается предположение, что если линия на момент проверки работает, значит она работала все предыдущее время со времени последней проверки. </FONT> | ||
+ | |||
+ | update Lines | ||
+ | set status=@status, | ||
+ | datetime= getdate(), | ||
+ | online = online+ getdate()- [datetime] | ||
+ | where date= @date and line=@line | ||
+ | |||
+ | if (@@rowcount=0) | ||
+ | insert into Lines (Line, status, date, online, offline, [datetime], [user]) values | ||
+ | (@line, | ||
+ | @status, | ||
+ | @date, | ||
+ | dateadd(mi, 0, '1990-01-01'), | ||
+ | dateadd(mi, 0, '1990-01-01'), | ||
+ | getdate(), | ||
+ | @user) | ||
+ | |||
+ | '''10.''' Компонент "'''Линия выключена'''". Запрос аналогичен выше описанному SQL запросу, за исключением того, что время суммируется к столбцу offline. | ||
+ | |||
+ | '''11.''' Компонент "'''Оповещение'''". Происходит уведомление администратора системы о том, что внутренняя линия выключена. | ||
+ | |||
+ | |||
+ | <FONT color="red">ВНИМАНИЕ: </FONT>В работе используется таблица '''Lines''' в [Oktell].[dbo].[Lines]. Запрос для создания таблицы (выполняется в SSMS) | ||
+ | |||
+ | USE [oktell] | ||
+ | GO | ||
+ | SET ANSI_NULLS ON | ||
+ | GO | ||
+ | SET QUOTED_IDENTIFIER ON | ||
+ | GO | ||
+ | CREATE TABLE [dbo].[Lines]( | ||
+ | [Id] [int] IDENTITY(1,1) NOT NULL, | ||
+ | [Line] [nvarchar](2000) NULL, | ||
+ | [User] [nvarchar](2000) NULL, | ||
+ | [Status] [nvarchar](2000) NULL, | ||
+ | [Online] [datetime] NULL, | ||
+ | [Offline] [datetime] NULL, | ||
+ | [date] [datetime] NULL, | ||
+ | [datetime] [datetime] NULL, | ||
+ | PRIMARY KEY CLUSTERED | ||
+ | ( | ||
+ | [Id] ASC | ||
+ | )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] | ||
+ | ) ON [PRIMARY] | ||
+ | GO | ||
+ | |||
+ | |||
+ | === Результаты === | ||
+ | |||
+ | Ниже показан пример работы. Видно, что линия '''17001''' работает 1 час 23 минуты, а линия '''17002''' работала всего 3 минуты, и находится в нерабочем состоянии 1 час 20 минут (время просуммировано). Также показан пример уведомления системному администратору о том, что линия '''17002''' выключена. | ||
+ | |||
+ | [[Файл:РаботаВнутреннихЛиний-002.png | center ]] | ||
+ | |||
+ | Данный сценарий необходимо назначить на служебную задачу. Переходим «'''Администрирование'''» - «'''Общие настройки'''» - вкладка «'''Служебные задачи'''» - «'''Добавить'''» - выбираем для запуска данный сценарий и указываем необходимый период запуска - «'''Сохранить'''» - активируем служебную задачу. Рекомендуется использоваться период запуска - '''раз в 10 минут'''. | ||
+ | |||
+ | |||
+ | [[Файл:РаботаВнутреннихЛиний-005.png | center | 600px]] | ||
+ | |||
+ | |||
+ | '''Файл сценария:''' [[Media:%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B8%D1%85_%D0%BB%D0%B8%D0%BD%D0%B8%D0%B9.zip|Определение времени работы внутренних линий]] | ||
+ | |||
+ | <FONT color="red">ВНИМАНИЕ: Во всех компонентах типа "'''уведомление'''" в сценарии необходимо установить '''адресата''', которому будет приходить оповещение. </FONT> | ||
+ | |||
+ | <u>'''Дополнение:'''</u> Чтобы не перегружать сервер баз данных '''Oktell''' постоянными SQL-запросами, рекомендуется использовать глобальную переменную со списком всех внутренних линий и далее определять состояние, пользуясь полученным результатом. Подобный метод описан [[Перехват звонков из очереди]] |
Текущая версия на 11:18, 31 марта 2023
Задача: Мониторинг состояния внутренних линий и определение времены работы внутренних линий.
Задача становится актуальной, когда операторы системы не используют клиентских приложений, а установлены как "пользователь по умолчанию" для своего телефона. В базу данных Oktell информация о разрегистрации линии не заносится и проверка работы линий доступна только с помощью клиентского приложения (модуль "Мониторинг"), что является не очень удобным.
Следовательно, необходимо создать сценарий, который будет проверять состояние линий и вести статистику о времени работы каждой линии, а следовательно и пользователя системы. В случае выключенной линии, сценарий оповестит об этом администратора системы. Сценарий выглядит следующим образом:
Структурно сценарий состоит из
- Цикла по внутренним SIP-линиям. Блок взят из статьи Построковая обработка sql выборки в сценарии (Вариант 1)
- Определения статуса конкретной SIP-линии. Блок взят из статьи Мониторинг состояния внешних линий
- Обновление статистики по работе линии
Описание компонентов
1. Компонент "Начальные параметры". Заданы параметры - начальное значение для поиска внутренних линий и текущая дата.
2. Компонент "Находим линию". Определяет следующую по порядку внутреннюю SIP линию по столбцу systemnumstr. В качестве выходных параметров запрос выдает res - результат запроса (1- найдена линия, 0 -не найдена), systemnumstr - номер внутренней линии.
declare @min int select @min = min(systemnumstr) from [oktell_settings].[dbo].[A_ServerSipLines] where systemnumstr>@systemnumstr_before if (@min is not null) select @systemnumstr=@min set @res=@@rowcount
Запрос использует таблицу:
- [oktell_settings].[dbo].[A_ServerSipLines] — столбец SystemNumStr показывает номера внутренних SIP линий, определенных в системе.
Однако вы также можете использовать таблицы:
- [oktell_settings].[dbo].[A_ServerUSBLines] — столбец SystemNumStr показывает номера внутренних Voip линий (гарнитура или usb телефон).
- [oktell_settings].[dbo].[A_ServerExtLines] — столбец SystemNumStr показывает номера внешних SIP линий
Также в запросе вы можете объединить эти таблицы и получать информацию по всем линиям.
3. Компонент "Проверка на завершение". Определяет конец цикла (был осуществлен перебор всех линий). Сравнение переменной res с нулем.
4. Компонент "id_before = id_after". Переприсваивает переменную для поиска следующей sip-линии на следующем цикле.
5. Компонент "Статус линии". Определяет состояние линии по ее номеру и записывает в переменную status.
6. Компонент "Идентификатор пользователя". Определяет пользователя, контролирующего линию ("Пользователь по умолчанию" или логически связанный пользователь), и записывает его в переменную user.
7. Компонент "Определяем пользователя по умолчанию". Используется SQL-запрос, определяющий по идентификатору пользователя его имя.
select @name=name from a_users where ID =@id
8. Компонент "Определяем статус линии". В компоненте определяется состояние линии по ее статусу - включена или выключена. В сценарии, линия считается выключенной если ее статус = 1 ( не подключена) или 1024 (не определена). Более подробно по статусам вы можете прочитать Общие компоненты сценариев
9. Компонент "Линия включена". В компоненте происходит запись информации в таблицу работы линий. Если записи о линии нет, она будет создана. Если запись есть, то она будет обновлена.
Описание таблицы Lines
- Line [nvarchar] - номер линии
- User [nvarchar] - связанный пользователь
- Status [nvarchar] - текущий статус линии
- Online [datetime] - время во включенном состоянии
- Offline [datetime] - время в выключенном состоянии
- date [datetime] - текущая дата
- datetime [datetime] - время последнего обновления информации
ВНИМАНИЕ: В запросе делается предположение, что если линия на момент проверки работает, значит она работала все предыдущее время со времени последней проверки.
update Lines set status=@status, datetime= getdate(), online = online+ getdate()- [datetime] where date= @date and line=@line if (@@rowcount=0) insert into Lines (Line, status, date, online, offline, [datetime], [user]) values (@line, @status, @date, dateadd(mi, 0, '1990-01-01'), dateadd(mi, 0, '1990-01-01'), getdate(), @user)
10. Компонент "Линия выключена". Запрос аналогичен выше описанному SQL запросу, за исключением того, что время суммируется к столбцу offline.
11. Компонент "Оповещение". Происходит уведомление администратора системы о том, что внутренняя линия выключена.
ВНИМАНИЕ: В работе используется таблица Lines в [Oktell].[dbo].[Lines]. Запрос для создания таблицы (выполняется в SSMS)
USE [oktell] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Lines]( [Id] [int] IDENTITY(1,1) NOT NULL, [Line] [nvarchar](2000) NULL, [User] [nvarchar](2000) NULL, [Status] [nvarchar](2000) NULL, [Online] [datetime] NULL, [Offline] [datetime] NULL, [date] [datetime] NULL, [datetime] [datetime] NULL, PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
Результаты
Ниже показан пример работы. Видно, что линия 17001 работает 1 час 23 минуты, а линия 17002 работала всего 3 минуты, и находится в нерабочем состоянии 1 час 20 минут (время просуммировано). Также показан пример уведомления системному администратору о том, что линия 17002 выключена.
Данный сценарий необходимо назначить на служебную задачу. Переходим «Администрирование» - «Общие настройки» - вкладка «Служебные задачи» - «Добавить» - выбираем для запуска данный сценарий и указываем необходимый период запуска - «Сохранить» - активируем служебную задачу. Рекомендуется использоваться период запуска - раз в 10 минут.
Файл сценария: Определение времени работы внутренних линий
ВНИМАНИЕ: Во всех компонентах типа "уведомление" в сценарии необходимо установить адресата, которому будет приходить оповещение.
Дополнение: Чтобы не перегружать сервер баз данных Oktell постоянными SQL-запросами, рекомендуется использовать глобальную переменную со списком всех внутренних линий и далее определять состояние, пользуясь полученным результатом. Подобный метод описан Перехват звонков из очереди