Мониторинг Inet-Radius через JMX
Материал из BiTel WiKi
(Различия между версиями)
(Новая страница: «= Описание = <p> Будем мониторить по JMX работу Radius-серверов в контексте BGInetAccess и BGInetAccounting: * Сч…») |
|||
Строка 4: | Строка 4: | ||
* Счётчики пакетов в минуту по типам | * Счётчики пакетов в минуту по типам | ||
* Количество сессий по статусу | * Количество сессий по статусу | ||
+ | * (ваши пожелания) | ||
</p> | </p> | ||
[[Файл:chart1.png]] | [[Файл:chart1.png]] | ||
Строка 9: | Строка 10: | ||
[[Файл:chart2.png]] | [[Файл:chart2.png]] | ||
- | = | + | = Howto = |
+ | # Пишем свои Java MXBean для выдачи нужных данных | ||
+ | # Кладём jar-файл в либы Access и Accounting | ||
+ | # Прописываем bean-ы в inet_access.xml и inet_accounting.xml | ||
+ | # Включаем jmx для Access и Accounting | ||
+ | # Тестируем через jconsole | ||
+ | # Template для Zabbix 2.0 | ||
+ | |||
+ | === MXBeans === | ||
+ | <p>MXBeans tutorial:[http://docs.oracle.com/javase/tutorial/jmx/mbeans/mxbeans.html]</p> | ||
+ | <p>Обратите внимание, что механизм получения статистики по активным сессиям различается для Access и Accounting, поэтому нужно 2 реализации:</p> | ||
+ | ==== Access ==== | ||
+ | ===== Интерфейс ===== | ||
+ | <source lang="java"> | ||
+ | package ru.dsi.bgbilling.modules.inet.mxbean; | ||
+ | |||
+ | import javax.management.MXBean; | ||
+ | |||
+ | /** | ||
+ | * * MXBean для получения статистики радиуса BGInetAccess | ||
+ | */ | ||
+ | @MXBean | ||
+ | public interface RadiusStatusAccessMXBean { | ||
+ | public int getAuthenticationAcceptCounter(); | ||
+ | public int getAuthenticationRejectCounter(); | ||
+ | public int getAuthenticationIgnoreCounter(); | ||
+ | public int getAntispamIgnoreCounter(); | ||
+ | |||
+ | public Long getActiveParentConnectionCount(); | ||
+ | |||
+ | public Long getSuspendedParentConnectionCount(); | ||
+ | |||
+ | public Long getClosedParentConnectionCount(); | ||
+ | |||
+ | public Long getFinishedParentConnectionCount(); | ||
+ | |||
+ | public Long getActiveServiceConnectionCount(); | ||
+ | |||
+ | public Long getSuspendedServiceConnectionCount(); | ||
+ | |||
+ | public Long getClosedServiceConnectionCount(); | ||
+ | |||
+ | public Long getFinishedServiceConnectionCount(); | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | ===== Реализация ===== | ||
+ | <source lang="java"> | ||
+ | package ru.dsi.bgbilling.modules.inet.mxbean; | ||
+ | |||
+ | import org.apache.log4j.Logger; | ||
+ | import ru.bitel.bgbilling.kernel.network.radius.RadiusListener; | ||
+ | import ru.bitel.bgbilling.modules.inet.access.Access; | ||
+ | import ru.bitel.bgbilling.modules.inet.access.InetConnectionRuntime; | ||
+ | |||
+ | import javax.management.*; | ||
+ | import java.beans.ConstructorProperties; | ||
+ | import java.lang.management.ManagementFactory; | ||
+ | import java.util.List; | ||
+ | import java.util.Map; | ||
+ | |||
+ | /** | ||
+ | * @see ru.dsi.bgbilling.modules.inet.mxbean.RadiusStatusAccessMXBean | ||
+ | */ | ||
+ | public class RadiusStatusAccess implements RadiusStatusAccessMXBean { | ||
+ | |||
+ | private Access access; | ||
+ | private static final Logger logger = Logger.getLogger(RadiusStatusAccess.class); | ||
+ | |||
+ | @ConstructorProperties({"access"}) | ||
+ | public RadiusStatusAccess(Access access){ | ||
+ | this.access = access; | ||
+ | |||
+ | //Регистрируем mxbean | ||
+ | try { | ||
+ | MBeanServer mbs = | ||
+ | ManagementFactory.getPlatformMBeanServer(); | ||
+ | ObjectName mxbeanName = new ObjectName("ru.dsi.bgbilling.modules.inet.mxbean:type=RadiusStatusAccess"); | ||
+ | mbs.registerMBean(this, mxbeanName); | ||
+ | } catch (InstanceAlreadyExistsException e) { | ||
+ | logger.error("error on registering MXBean RadiusStatusAccess", e); | ||
+ | } catch (MBeanRegistrationException e) { | ||
+ | logger.error("error on registering MXBean RadiusStatusAccess", e); | ||
+ | } catch (NotCompliantMBeanException e) { | ||
+ | logger.error("error on registering MXBean RadiusStatusAccess", e); | ||
+ | } catch (MalformedObjectNameException e) { | ||
+ | logger.error("error on registering MXBean RadiusStatusAccess", e); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Long getActiveParentConnectionCount(){ | ||
+ | long count = 0; | ||
+ | for (Map.Entry<Integer, List<InetConnectionRuntime>> entry : this.access.connectionManager.inetServEntrySet()) { | ||
+ | for (InetConnectionRuntime connectionRuntime : entry.getValue()) { | ||
+ | if(connectionRuntime.connection.getConnectionStatus()==1 && connectionRuntime.connection.getParentConnectionId()<=0L){ | ||
+ | count++; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | return count; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Long getSuspendedParentConnectionCount(){ | ||
+ | long count = 0; | ||
+ | for (Map.Entry<Integer, List<InetConnectionRuntime>> entry : this.access.connectionManager.inetServEntrySet()) { | ||
+ | for (InetConnectionRuntime connectionRuntime : entry.getValue()) { | ||
+ | if(connectionRuntime.connection.getConnectionStatus()==2 && connectionRuntime.connection.getParentConnectionId()<=0L){ | ||
+ | count++; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | return count; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Long getClosedParentConnectionCount(){ | ||
+ | long count = 0; | ||
+ | for (Map.Entry<Integer, List<InetConnectionRuntime>> entry : this.access.connectionManager.inetServEntrySet()) { | ||
+ | for (InetConnectionRuntime connectionRuntime : entry.getValue()) { | ||
+ | if(connectionRuntime.connection.getConnectionStatus()==3 && connectionRuntime.connection.getParentConnectionId()<=0L){ | ||
+ | count++; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | return count; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Long getFinishedParentConnectionCount(){ | ||
+ | long count = 0; | ||
+ | for (Map.Entry<Integer, List<InetConnectionRuntime>> entry : this.access.connectionManager.inetServEntrySet()) { | ||
+ | for (InetConnectionRuntime connectionRuntime : entry.getValue()) { | ||
+ | if(connectionRuntime.connection.getConnectionStatus()==4 && connectionRuntime.connection.getParentConnectionId()<=0L){ | ||
+ | count++; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | return count; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Long getActiveServiceConnectionCount(){ | ||
+ | long count = 0; | ||
+ | for (Map.Entry<Integer, List<InetConnectionRuntime>> entry : this.access.connectionManager.inetServEntrySet()) { | ||
+ | for (InetConnectionRuntime connectionRuntime : entry.getValue()) { | ||
+ | if(connectionRuntime.connection.getConnectionStatus()==1 && connectionRuntime.connection.getParentConnectionId()>0L){ | ||
+ | count++; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | return count; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Long getSuspendedServiceConnectionCount(){ | ||
+ | long count = 0; | ||
+ | for (Map.Entry<Integer, List<InetConnectionRuntime>> entry : this.access.connectionManager.inetServEntrySet()) { | ||
+ | for (InetConnectionRuntime connectionRuntime : entry.getValue()) { | ||
+ | if(connectionRuntime.connection.getConnectionStatus()==2 && connectionRuntime.connection.getParentConnectionId()>0L){ | ||
+ | count++; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | return count; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Long getClosedServiceConnectionCount(){ | ||
+ | long count = 0; | ||
+ | for (Map.Entry<Integer, List<InetConnectionRuntime>> entry : this.access.connectionManager.inetServEntrySet()) { | ||
+ | for (InetConnectionRuntime connectionRuntime : entry.getValue()) { | ||
+ | if(connectionRuntime.connection.getConnectionStatus()==3 && connectionRuntime.connection.getParentConnectionId()>0L){ | ||
+ | count++; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | return count; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Long getFinishedServiceConnectionCount(){ | ||
+ | long count = 0; | ||
+ | for (Map.Entry<Integer, List<InetConnectionRuntime>> entry : this.access.connectionManager.inetServEntrySet()) { | ||
+ | for (InetConnectionRuntime connectionRuntime : entry.getValue()) { | ||
+ | if(connectionRuntime.connection.getConnectionStatus()==4 && connectionRuntime.connection.getParentConnectionId()>0L){ | ||
+ | count++; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | return count; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public int getAuthenticationAcceptCounter(){ | ||
+ | try { | ||
+ | return RadiusListener.authenticationAcceptCounter.getCount(); | ||
+ | }catch (Exception e){ | ||
+ | return -1; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public int getAuthenticationRejectCounter(){ | ||
+ | try { | ||
+ | return RadiusListener.authenticationRejectCounter.getCount(); | ||
+ | }catch (Exception e){ | ||
+ | return -1; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public int getAuthenticationIgnoreCounter(){ | ||
+ | try { | ||
+ | return RadiusListener.authenticationIgnoreCount.getCount(); | ||
+ | }catch (Exception e){ | ||
+ | return -1; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public int getAntispamIgnoreCounter(){ | ||
+ | try { | ||
+ | return RadiusListener.antispamIgnoreCount.getCount(); | ||
+ | }catch (Exception e){ | ||
+ | return -1; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | ==== Accounting ==== | ||
+ | ===== Интерфейс ===== | ||
+ | <source lang="java"> | ||
+ | package ru.dsi.bgbilling.modules.inet.mxbean; | ||
+ | |||
+ | import javax.management.MXBean; | ||
+ | |||
+ | /** | ||
+ | * MXBean для получения статистики радиуса BGInetAccounting | ||
+ | */ | ||
+ | @MXBean | ||
+ | public interface RadiusStatusAccountingMXBean { | ||
+ | public int getAccountingStartCounter(); | ||
+ | public int getAccountingUpdateCounter(); | ||
+ | public int getAccountingStopCounter(); | ||
+ | public int getAccountingUpdateIgnoreCounter(); | ||
+ | public int getAntispamIgnoreCounter(); | ||
+ | |||
+ | public Long getActiveParentConnectionCount(); | ||
+ | |||
+ | public Long getSuspendedParentConnectionCount(); | ||
+ | |||
+ | public Long getClosedParentConnectionCount(); | ||
+ | |||
+ | public Long getFinishedParentConnectionCount(); | ||
+ | |||
+ | public Long getActiveServiceConnectionCount(); | ||
+ | |||
+ | public Long getSuspendedServiceConnectionCount(); | ||
+ | |||
+ | public Long getClosedServiceConnectionCount(); | ||
+ | |||
+ | public Long getFinishedServiceConnectionCount(); | ||
+ | } | ||
+ | </source> | ||
+ | ===== Реализация ===== | ||
+ | <source lang="java"> | ||
+ | package ru.dsi.bgbilling.modules.inet.mxbean; | ||
+ | |||
+ | import org.apache.log4j.Logger; | ||
+ | import ru.bitel.bgbilling.kernel.network.radius.RadiusListener; | ||
+ | import ru.bitel.bgbilling.modules.inet.accounting.Accounting; | ||
+ | import ru.bitel.bgbilling.modules.inet.accounting.InetConnectionCallRuntime; | ||
+ | |||
+ | import javax.management.*; | ||
+ | import java.beans.ConstructorProperties; | ||
+ | import java.lang.management.ManagementFactory; | ||
+ | import java.util.Map; | ||
+ | |||
+ | /** | ||
+ | * @see RadiusStatusAccountingMXBean | ||
+ | */ | ||
+ | public class RadiusStatusAccounting implements RadiusStatusAccountingMXBean { | ||
+ | |||
+ | private Accounting accounting; | ||
+ | private static final Logger logger = Logger.getLogger(RadiusStatusAccounting.class); | ||
+ | |||
+ | @ConstructorProperties({"accounting"}) | ||
+ | public RadiusStatusAccounting(Accounting accounting){ | ||
+ | this.accounting = accounting; | ||
+ | |||
+ | //Регистрируем mxbean | ||
+ | try { | ||
+ | MBeanServer mbs = | ||
+ | ManagementFactory.getPlatformMBeanServer(); | ||
+ | ObjectName mxbeanName = new ObjectName("ru.dsi.bgbilling.modules.inet.mxbean:type=RadiusStatusAccounting"); | ||
+ | mbs.registerMBean(this, mxbeanName); | ||
+ | } catch (InstanceAlreadyExistsException e) { | ||
+ | logger.error("error on registering MXBean RadiusStatusAccounting", e); | ||
+ | } catch (MBeanRegistrationException e) { | ||
+ | logger.error("error on registering MXBean RadiusStatusAccounting", e); | ||
+ | } catch (NotCompliantMBeanException e) { | ||
+ | logger.error("error on registering MXBean RadiusStatusAccounting", e); | ||
+ | } catch (MalformedObjectNameException e) { | ||
+ | logger.error("error on registering MXBean RadiusStatusAccounting", e); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Long getActiveParentConnectionCount(){ | ||
+ | long count = 0; | ||
+ | for (Map.Entry<Long, InetConnectionCallRuntime> entry : this.accounting.connectionMapCall.getSessionMap().entrySet()) { | ||
+ | if(entry.getValue().connection.getConnectionStatus()==1 && !entry.getValue().isServiceSession()){ | ||
+ | count++; | ||
+ | } | ||
+ | } | ||
+ | return count; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Long getSuspendedParentConnectionCount(){ | ||
+ | long count = 0; | ||
+ | for (Map.Entry<Long, InetConnectionCallRuntime> entry : this.accounting.connectionMapCall.getSessionMap().entrySet()) { | ||
+ | if(entry.getValue().connection.getConnectionStatus()==2 && !entry.getValue().isServiceSession()){ | ||
+ | count++; | ||
+ | } | ||
+ | } | ||
+ | return count; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Long getClosedParentConnectionCount(){ | ||
+ | long count = 0; | ||
+ | for (Map.Entry<Long, InetConnectionCallRuntime> entry : this.accounting.connectionMapCall.getSessionMap().entrySet()) { | ||
+ | if(entry.getValue().connection.getConnectionStatus()==3 && !entry.getValue().isServiceSession()){ | ||
+ | count++; | ||
+ | } | ||
+ | } | ||
+ | return count; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Long getFinishedParentConnectionCount(){ | ||
+ | long count = 0; | ||
+ | for (Map.Entry<Long, InetConnectionCallRuntime> entry : this.accounting.connectionMapCall.getSessionMap().entrySet()) { | ||
+ | if(entry.getValue().connection.getConnectionStatus()==4 && !entry.getValue().isServiceSession()){ | ||
+ | count++; | ||
+ | } | ||
+ | } | ||
+ | return count; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Long getActiveServiceConnectionCount(){ | ||
+ | long count = 0; | ||
+ | for (Map.Entry<Long, InetConnectionCallRuntime> entry : this.accounting.connectionMapCall.getSessionMap().entrySet()) { | ||
+ | if(entry.getValue().connection.getConnectionStatus()==1 && entry.getValue().isServiceSession()){ | ||
+ | count++; | ||
+ | } | ||
+ | } | ||
+ | return count; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Long getSuspendedServiceConnectionCount(){ | ||
+ | long count = 0; | ||
+ | for (Map.Entry<Long, InetConnectionCallRuntime> entry : this.accounting.connectionMapCall.getSessionMap().entrySet()) { | ||
+ | if(entry.getValue().connection.getConnectionStatus()==2 && entry.getValue().isServiceSession()){ | ||
+ | count++; | ||
+ | } | ||
+ | } | ||
+ | return count; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Long getClosedServiceConnectionCount(){ | ||
+ | long count = 0; | ||
+ | for (Map.Entry<Long, InetConnectionCallRuntime> entry : this.accounting.connectionMapCall.getSessionMap().entrySet()) { | ||
+ | if(entry.getValue().connection.getConnectionStatus()==3 && entry.getValue().isServiceSession()){ | ||
+ | count++; | ||
+ | } | ||
+ | } | ||
+ | return count; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public Long getFinishedServiceConnectionCount(){ | ||
+ | long count = 0; | ||
+ | for (Map.Entry<Long, InetConnectionCallRuntime> entry : this.accounting.connectionMapCall.getSessionMap().entrySet()) { | ||
+ | if(entry.getValue().connection.getConnectionStatus()==4 && entry.getValue().isServiceSession()){ | ||
+ | count++; | ||
+ | } | ||
+ | } | ||
+ | return count; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public int getAccountingStartCounter(){ | ||
+ | try { | ||
+ | return RadiusListener.accountingStartCounter.getCount(); | ||
+ | }catch (Exception e){ | ||
+ | return -1; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public int getAccountingStopCounter(){ | ||
+ | try { | ||
+ | return RadiusListener.accountingStopCounter.getCount(); | ||
+ | }catch (Exception e){ | ||
+ | return -1; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public int getAccountingUpdateCounter(){ | ||
+ | try { | ||
+ | return RadiusListener.accountingUpdateCounter.getCount(); | ||
+ | }catch (Exception e){ | ||
+ | return -1; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public int getAccountingUpdateIgnoreCounter(){ | ||
+ | try { | ||
+ | return RadiusListener.accountingUpdateIgnoreCount.getCount(); | ||
+ | }catch (Exception e){ | ||
+ | return -1; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public int getAntispamIgnoreCounter(){ | ||
+ | try { | ||
+ | return RadiusListener.antispamIgnoreCount.getCount(); | ||
+ | }catch (Exception e){ | ||
+ | return -1; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </source> |
Версия 06:48, 7 июня 2013
Содержание |
Описание
Будем мониторить по JMX работу Radius-серверов в контексте BGInetAccess и BGInetAccounting:
- Счётчики пакетов в минуту по типам
- Количество сессий по статусу
- (ваши пожелания)
Howto
- Пишем свои Java MXBean для выдачи нужных данных
- Кладём jar-файл в либы Access и Accounting
- Прописываем bean-ы в inet_access.xml и inet_accounting.xml
- Включаем jmx для Access и Accounting
- Тестируем через jconsole
- Template для Zabbix 2.0
MXBeans
MXBeans tutorial:[1]
Обратите внимание, что механизм получения статистики по активным сессиям различается для Access и Accounting, поэтому нужно 2 реализации:
Access
Интерфейс
package ru.dsi.bgbilling.modules.inet.mxbean; import javax.management.MXBean; /** * * MXBean для получения статистики радиуса BGInetAccess */ @MXBean public interface RadiusStatusAccessMXBean { public int getAuthenticationAcceptCounter(); public int getAuthenticationRejectCounter(); public int getAuthenticationIgnoreCounter(); public int getAntispamIgnoreCounter(); public Long getActiveParentConnectionCount(); public Long getSuspendedParentConnectionCount(); public Long getClosedParentConnectionCount(); public Long getFinishedParentConnectionCount(); public Long getActiveServiceConnectionCount(); public Long getSuspendedServiceConnectionCount(); public Long getClosedServiceConnectionCount(); public Long getFinishedServiceConnectionCount(); }
Реализация
package ru.dsi.bgbilling.modules.inet.mxbean; import org.apache.log4j.Logger; import ru.bitel.bgbilling.kernel.network.radius.RadiusListener; import ru.bitel.bgbilling.modules.inet.access.Access; import ru.bitel.bgbilling.modules.inet.access.InetConnectionRuntime; import javax.management.*; import java.beans.ConstructorProperties; import java.lang.management.ManagementFactory; import java.util.List; import java.util.Map; /** * @see ru.dsi.bgbilling.modules.inet.mxbean.RadiusStatusAccessMXBean */ public class RadiusStatusAccess implements RadiusStatusAccessMXBean { private Access access; private static final Logger logger = Logger.getLogger(RadiusStatusAccess.class); @ConstructorProperties({"access"}) public RadiusStatusAccess(Access access){ this.access = access; //Регистрируем mxbean try { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName mxbeanName = new ObjectName("ru.dsi.bgbilling.modules.inet.mxbean:type=RadiusStatusAccess"); mbs.registerMBean(this, mxbeanName); } catch (InstanceAlreadyExistsException e) { logger.error("error on registering MXBean RadiusStatusAccess", e); } catch (MBeanRegistrationException e) { logger.error("error on registering MXBean RadiusStatusAccess", e); } catch (NotCompliantMBeanException e) { logger.error("error on registering MXBean RadiusStatusAccess", e); } catch (MalformedObjectNameException e) { logger.error("error on registering MXBean RadiusStatusAccess", e); } } @Override public Long getActiveParentConnectionCount(){ long count = 0; for (Map.Entry<Integer, List<InetConnectionRuntime>> entry : this.access.connectionManager.inetServEntrySet()) { for (InetConnectionRuntime connectionRuntime : entry.getValue()) { if(connectionRuntime.connection.getConnectionStatus()==1 && connectionRuntime.connection.getParentConnectionId()<=0L){ count++; } } } return count; } @Override public Long getSuspendedParentConnectionCount(){ long count = 0; for (Map.Entry<Integer, List<InetConnectionRuntime>> entry : this.access.connectionManager.inetServEntrySet()) { for (InetConnectionRuntime connectionRuntime : entry.getValue()) { if(connectionRuntime.connection.getConnectionStatus()==2 && connectionRuntime.connection.getParentConnectionId()<=0L){ count++; } } } return count; } @Override public Long getClosedParentConnectionCount(){ long count = 0; for (Map.Entry<Integer, List<InetConnectionRuntime>> entry : this.access.connectionManager.inetServEntrySet()) { for (InetConnectionRuntime connectionRuntime : entry.getValue()) { if(connectionRuntime.connection.getConnectionStatus()==3 && connectionRuntime.connection.getParentConnectionId()<=0L){ count++; } } } return count; } @Override public Long getFinishedParentConnectionCount(){ long count = 0; for (Map.Entry<Integer, List<InetConnectionRuntime>> entry : this.access.connectionManager.inetServEntrySet()) { for (InetConnectionRuntime connectionRuntime : entry.getValue()) { if(connectionRuntime.connection.getConnectionStatus()==4 && connectionRuntime.connection.getParentConnectionId()<=0L){ count++; } } } return count; } @Override public Long getActiveServiceConnectionCount(){ long count = 0; for (Map.Entry<Integer, List<InetConnectionRuntime>> entry : this.access.connectionManager.inetServEntrySet()) { for (InetConnectionRuntime connectionRuntime : entry.getValue()) { if(connectionRuntime.connection.getConnectionStatus()==1 && connectionRuntime.connection.getParentConnectionId()>0L){ count++; } } } return count; } @Override public Long getSuspendedServiceConnectionCount(){ long count = 0; for (Map.Entry<Integer, List<InetConnectionRuntime>> entry : this.access.connectionManager.inetServEntrySet()) { for (InetConnectionRuntime connectionRuntime : entry.getValue()) { if(connectionRuntime.connection.getConnectionStatus()==2 && connectionRuntime.connection.getParentConnectionId()>0L){ count++; } } } return count; } @Override public Long getClosedServiceConnectionCount(){ long count = 0; for (Map.Entry<Integer, List<InetConnectionRuntime>> entry : this.access.connectionManager.inetServEntrySet()) { for (InetConnectionRuntime connectionRuntime : entry.getValue()) { if(connectionRuntime.connection.getConnectionStatus()==3 && connectionRuntime.connection.getParentConnectionId()>0L){ count++; } } } return count; } @Override public Long getFinishedServiceConnectionCount(){ long count = 0; for (Map.Entry<Integer, List<InetConnectionRuntime>> entry : this.access.connectionManager.inetServEntrySet()) { for (InetConnectionRuntime connectionRuntime : entry.getValue()) { if(connectionRuntime.connection.getConnectionStatus()==4 && connectionRuntime.connection.getParentConnectionId()>0L){ count++; } } } return count; } @Override public int getAuthenticationAcceptCounter(){ try { return RadiusListener.authenticationAcceptCounter.getCount(); }catch (Exception e){ return -1; } } @Override public int getAuthenticationRejectCounter(){ try { return RadiusListener.authenticationRejectCounter.getCount(); }catch (Exception e){ return -1; } } @Override public int getAuthenticationIgnoreCounter(){ try { return RadiusListener.authenticationIgnoreCount.getCount(); }catch (Exception e){ return -1; } } @Override public int getAntispamIgnoreCounter(){ try { return RadiusListener.antispamIgnoreCount.getCount(); }catch (Exception e){ return -1; } } }
Accounting
Интерфейс
package ru.dsi.bgbilling.modules.inet.mxbean; import javax.management.MXBean; /** * MXBean для получения статистики радиуса BGInetAccounting */ @MXBean public interface RadiusStatusAccountingMXBean { public int getAccountingStartCounter(); public int getAccountingUpdateCounter(); public int getAccountingStopCounter(); public int getAccountingUpdateIgnoreCounter(); public int getAntispamIgnoreCounter(); public Long getActiveParentConnectionCount(); public Long getSuspendedParentConnectionCount(); public Long getClosedParentConnectionCount(); public Long getFinishedParentConnectionCount(); public Long getActiveServiceConnectionCount(); public Long getSuspendedServiceConnectionCount(); public Long getClosedServiceConnectionCount(); public Long getFinishedServiceConnectionCount(); }
Реализация
package ru.dsi.bgbilling.modules.inet.mxbean; import org.apache.log4j.Logger; import ru.bitel.bgbilling.kernel.network.radius.RadiusListener; import ru.bitel.bgbilling.modules.inet.accounting.Accounting; import ru.bitel.bgbilling.modules.inet.accounting.InetConnectionCallRuntime; import javax.management.*; import java.beans.ConstructorProperties; import java.lang.management.ManagementFactory; import java.util.Map; /** * @see RadiusStatusAccountingMXBean */ public class RadiusStatusAccounting implements RadiusStatusAccountingMXBean { private Accounting accounting; private static final Logger logger = Logger.getLogger(RadiusStatusAccounting.class); @ConstructorProperties({"accounting"}) public RadiusStatusAccounting(Accounting accounting){ this.accounting = accounting; //Регистрируем mxbean try { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName mxbeanName = new ObjectName("ru.dsi.bgbilling.modules.inet.mxbean:type=RadiusStatusAccounting"); mbs.registerMBean(this, mxbeanName); } catch (InstanceAlreadyExistsException e) { logger.error("error on registering MXBean RadiusStatusAccounting", e); } catch (MBeanRegistrationException e) { logger.error("error on registering MXBean RadiusStatusAccounting", e); } catch (NotCompliantMBeanException e) { logger.error("error on registering MXBean RadiusStatusAccounting", e); } catch (MalformedObjectNameException e) { logger.error("error on registering MXBean RadiusStatusAccounting", e); } } @Override public Long getActiveParentConnectionCount(){ long count = 0; for (Map.Entry<Long, InetConnectionCallRuntime> entry : this.accounting.connectionMapCall.getSessionMap().entrySet()) { if(entry.getValue().connection.getConnectionStatus()==1 && !entry.getValue().isServiceSession()){ count++; } } return count; } @Override public Long getSuspendedParentConnectionCount(){ long count = 0; for (Map.Entry<Long, InetConnectionCallRuntime> entry : this.accounting.connectionMapCall.getSessionMap().entrySet()) { if(entry.getValue().connection.getConnectionStatus()==2 && !entry.getValue().isServiceSession()){ count++; } } return count; } @Override public Long getClosedParentConnectionCount(){ long count = 0; for (Map.Entry<Long, InetConnectionCallRuntime> entry : this.accounting.connectionMapCall.getSessionMap().entrySet()) { if(entry.getValue().connection.getConnectionStatus()==3 && !entry.getValue().isServiceSession()){ count++; } } return count; } @Override public Long getFinishedParentConnectionCount(){ long count = 0; for (Map.Entry<Long, InetConnectionCallRuntime> entry : this.accounting.connectionMapCall.getSessionMap().entrySet()) { if(entry.getValue().connection.getConnectionStatus()==4 && !entry.getValue().isServiceSession()){ count++; } } return count; } @Override public Long getActiveServiceConnectionCount(){ long count = 0; for (Map.Entry<Long, InetConnectionCallRuntime> entry : this.accounting.connectionMapCall.getSessionMap().entrySet()) { if(entry.getValue().connection.getConnectionStatus()==1 && entry.getValue().isServiceSession()){ count++; } } return count; } @Override public Long getSuspendedServiceConnectionCount(){ long count = 0; for (Map.Entry<Long, InetConnectionCallRuntime> entry : this.accounting.connectionMapCall.getSessionMap().entrySet()) { if(entry.getValue().connection.getConnectionStatus()==2 && entry.getValue().isServiceSession()){ count++; } } return count; } @Override public Long getClosedServiceConnectionCount(){ long count = 0; for (Map.Entry<Long, InetConnectionCallRuntime> entry : this.accounting.connectionMapCall.getSessionMap().entrySet()) { if(entry.getValue().connection.getConnectionStatus()==3 && entry.getValue().isServiceSession()){ count++; } } return count; } @Override public Long getFinishedServiceConnectionCount(){ long count = 0; for (Map.Entry<Long, InetConnectionCallRuntime> entry : this.accounting.connectionMapCall.getSessionMap().entrySet()) { if(entry.getValue().connection.getConnectionStatus()==4 && entry.getValue().isServiceSession()){ count++; } } return count; } @Override public int getAccountingStartCounter(){ try { return RadiusListener.accountingStartCounter.getCount(); }catch (Exception e){ return -1; } } @Override public int getAccountingStopCounter(){ try { return RadiusListener.accountingStopCounter.getCount(); }catch (Exception e){ return -1; } } @Override public int getAccountingUpdateCounter(){ try { return RadiusListener.accountingUpdateCounter.getCount(); }catch (Exception e){ return -1; } } @Override public int getAccountingUpdateIgnoreCounter(){ try { return RadiusListener.accountingUpdateIgnoreCount.getCount(); }catch (Exception e){ return -1; } } @Override public int getAntispamIgnoreCounter(){ try { return RadiusListener.antispamIgnoreCount.getCount(); }catch (Exception e){ return -1; } } }