Створення користувальницьких OID для моніторингу систем на Caché з допомогою SNMP

Доброго дня (вечора, ночі, ранку — потрібне підкреслити) всім хаброжителям!
Цей пост присвячений моніторингу инстанса Caché за допомогою SNMP. Напевно, багато користувачів Caché цим в тій або іншій мірі вже користуються. Моніторинг через SNMP підтримується в стандартній інсталяції Caché вже давно, проте далеко не всі параметри доступні з «коробки». Наприклад, хотілося б бачити моніторинг кількості CSP-сесій, більш докладні відомості з використання ліцензії, приватні KPI експлуатованої системи тощо
У цій статті ви дізнаєтеся, як додати свої параметри для моніторингу Caché з допомогою SNMP.

Що вже маємо
Caché можливо моніторити за допомогою SNMP. Список того, що вже підтримується, можна побачити у файлах каталогу <Install_dir>/SNMP. Зазвичай там лежать 2 файлу:ISC-CACHE.mib ISC-ENSEMBLE.mib. Нас цікавить файл для Caché ISC-CACHE.mib. Наприклад цікавить, що ми можемо отримати відносно ліцензій та сесій. У таблиці наведені відповідні OID'и з урахуванням того, що ієрархія береться від кореня для Intersystems 1.3.6.1.4.1.16563
OID Заголовок Опис Тип даних
.1.1.1.1.10 cacheSysLicenseUsed The current number of licenses used on this Caché instance INTEGER
.1.1.1.1.11 cacheSysLicenseHigh The high-water mark for licenses used on this Caché instance INTEGER
.1.2.16 cacheLicenseExceed A request for a license has exceeded the licenses available or allowed Trap message
.1.1.1.1.6 cacheSysCurUser Current number of users on this Caché instance INTEGER
У постачанні відсутні багато важливих показники, наприклад, кількість CSP-сесій, не повна інформація про ліцензії і, зрозуміло, відсутній моніторинг показників, специфічних для додатків.
Приклад того, що ми хотіли б знати:
  • Скільки у нас користувачів CSP;
  • Обмеження нашої ліцензії за користувачам;
  • Коли ліцензійний ключ закінчиться.
Додамо також пару параметрів для оцінки продуктивності. Самі по собі параметри є в постачанні, але ми хочемо знати їх приріст за хвилину, наприклад:
  • Приріст «глобальних» посилань за хвилину;
  • Кількість виконаних команд за хвилину;
  • Число викликів рутин за хвилину.


додати «свої» параметри
Спиратися можна на документ «Monitoring Caché using SNMP».
Наш тестовий інстанси (TEST) має версію Caché 2013.1.3. Операційна система — Linux CentOS release 6.5 (Final). Інсталяція Cache на Linux ОС описана на хабре. Корисною буде і рідна документація від InterSystems.
Ось короткий план робіт:
  1. Створюємо клас для збору метрик;
  2. Реєструємо і активуємо новий клас Caché з допомогою ^%SYSMONMGR;
  3. Створюємо власний MIB за допомогою методів класу MonitorTools.SNMP. Для початку PEN (Private Enterprise Number) беремо фіктивний 99990, згодом потрібно зареєструватися в IANA. Ця процедура безкоштовна, займає тиждень-другий і супроводжується недовгою листуванням виду «а навіщо вам свій PEN знадобився»;
  4. Запускаємо сервіс моніторингу з підключеним субагентом Caché;
  5. Перевіряємо за допомогою snmpwalk, що наші тільки що створені користувальницькі OID'и нам доступні;
  6. Додаємо наші OID'и в сторонню систему моніторингу. Наприклад, візьмемо Zabbix. Документацію по Zabbix можна знайти на тут. З інсталяції та налаштування Zabbix конкретно на CentOS можна подивитися тут. Переконуємося, що моніторинг працює;
  7. Додаємо запуск системного монітора в нашій області TEST при старті системи.
А тепер виконуємо план по пунктах.
1. Створюємо клас для збору метрик
Клас збору метрик успадковується від %Monitor.Adaptor. У студії переходимо в область %SYS. Експортуємо пакет Monitor. Пакет містить закритий клас Sample, який Студії не видно, але при експорті в xml доступний.
Припустимо, що наша робоча область — це область TEST. Переходимо до неї. Імпортуємо сюди клас Monitor.Sample. Створюємо клас, в якому описуємо реалізацію зняття 6-ти показників, зазначених вище в розділі «Що вже маємо».
Class metrics.snmp.MetricsClass metrics.snmp.Metrics Extends %Monitor.Adaptor
{
/// Give the application a name. This allows you to group different
/// classes together under the same application level in the SNMP MIB.
/// The default is the same as the Package name.
Parameter APPLICATION = "Monitoring".;
/// CSP sessions count
Property Sessions As %Monitor.Integer;
/// License user limit
Property KeyLicenseUnits As %Monitor.Integer;
/// License key expiration date
Property KeyExpirationDate As %Monitor.String;
/// Global references speed
Property GloRefSpeed As %Monitor.Integer;
/// Number of commands executed
Property ExecutedSpeed As %Monitor.Integer;
/// Number of routine loads/save
Property RoutineLoadSpeed As %Monitor.Integer;
/// The method is REQUIRED. It is where the Application Monitor
/// calls to collect data samples, which then get picked up на the
/// ^SNMP server process when requested.
Method GetSample() As %Status
{
      set ..Sessions = ..getSessions()
      set ..KeyLicenseUnits = ..getKeyLicenseUnits()
      set ..KeyExpirationDate = ..getKeyExpirationDate()
       
    set perfList = ..getPerformance()
      set ..GloRefSpeed = $listget(perfList,1)
      set ..ExecutedSpeed = $listget(perfList,2)
      set ..RoutineLoadSpeed = $listget(perfList,3)
      quit $$$OK
}
/// Get CSP sessions count
Method getSessions() As %Integer
{
    //q $system.License.CSPUsers()  // This method will only work if we dont' use WebAddon
    // This will work even if  we use WebAddon
    set csp = ""
    try {
        set cn = $NAMESPACE
        znspace "%SYS"
        set db = ##class(SYS.Stats.Dashboard).Sample()
        set csp = db.CSPSessions
        znspace cn
    } catch e {
        set csp = "0"
    }
    quit csp
}
/// Get license user's power
Method getKeyLicenseUnits() As %Integer
{
    quit $system.License.KeyLicenseUnits()
}
/// Get license expiration date in human-readable format
Method getKeyExpirationDate() As %String
{
    quit $zdate($system.License.KeyExpirationDate(),3)
}
/// Get performance metrics (gloref, rourines etc.)
Method getPerformance(param As %String) As %Integer
{
    set cn = $NAMESPACE
    znspace "%SYS"
    set m = ##class(SYS.Monitor.SystemSensors).%New()
    do m.GetSensors()
    znspace cn
    quit $listbuild(m.SensorReading("GlobalRefsPerMin".), 
                    m.SensorReading("RoutineCommandsPerMin".), 
                    m.SensorReading("RoutineLoadsPerMin".))
}
}


Перевіряємо, що потрібні нам дані викликом методу GetSample() вивантажуються:
Перевірка роботи GetSample()TEST>s x=##class(metrics.snmp.Metrics).%New()

TEST>d x.GetSample()

TEST>zw x
x=<OBJECT REFERENCE>[2@metrics.snmp.Metrics]
+----------------- general information — | oref value: 2
| class name: metrics.snmp.Metrics
| reference count: 2
+----------------- attribute values — | ExecutedSpeed = 1155679
| GloRefSpeed = 171316
| KeyExpirationDate = «2014-10-11»
| KeyLicenseUnits = 100
| RoutineLoadSpeed = 186
| Sessions = 1

2. Реєструємо і активуємо новий клас Caché з допомогою ^%SYSMONMGR
Відкриваємо термінал і переходимо в область TEST:
Підключаємо системний монітор[root@server ~]# csession test-U test
Сайт: server, Примірник: TEST

TEST>d ^%SYSMONMGR
1. Вибираємо пункт 5, Manage Application Monitor.
2. Вибираємо пункт 2, Manage Monitor Classes.
3. Вибираємо пункт 3, Register System Monitor Classes. Спостерігаємо за компіляцією:

Експорт в XML почався в 08/18/2014 16:00:51
Експортований клас: Monitor.Sample
Експорт завершено успішно.

Завантаження почалася в 08/18/2014 16:00:51
Завантаження файлу /opt/intersystems/ensemble/mgr/Temp/45DDB3FppRHCuw.stream як xml
Імпорт класу: Monitor.Sample
Компіляція класу: Monitor.Sample
Компіляція програми:: Monitor.Sample.G1.MAC
Компіляція таблиці: Monitor.Sample
Компіляція програми: Monitor.Sample.1
Завантаження успішно завершена.

4. Вибираємо пункт 1, Activate/Deactivate Monitor Class
Class??
Num MetricsClassName Activated
1) %Monitor.System.AuditCount N

15) metrics.snmp.Metrics N

Class? 15 metrics.snmp.Metrics
Activate class? Yes => Yes

5. Вибираємо пункт 6, Exit
6. Ще раз вибираємо пункт 6, Exit
7. Вибираємо пункт 1, Start/Stop System Monitor
8. Вибираємо пункт 2, Stop System Monitor
Stopping System Monitor… System Monitor not running!

9. Вибираємо пункт 1, Start System Monitor
Starting System Monitor… System Monitor started
10. Вибираємо пункт 3, Exit
11. Вибираємо пункт 4, View System Monitor State
Component State
System Monitor OK
%SYS.Monitor.AppMonSensor

3. Створюємо власний MIB
Користувальницький MIB створюється з допомогою методів класу MonitorTools.SNMP. Для прикладу PEN (Private Enterprise Number) візьмемо фіктивний, 99990, згодом PEN потрібно зареєструвати в IANA. Подивитися вже зареєстровані номери можна тут. Наприклад, PEN InterSystems має номер 16563.
16563
InterSystems
Robert Davis
rdavis&intersystems.com

Для створення MIB-файлу ми будемо використовувати клас MonitorTools.SNMP, зокрема, метод CreateMIB(). Цей метод приймає на вхід 10 аргументів:
Ім'я і тип аргументу Опис Що підставляємо
AppName As %String назва програми Значення параметра APPLICATION класу metrics.snmp.Metrics — Monitoring
Namespace As %String Наша область TEST
EntID As %Integer PEN компанії 99990 (Fiction)
AppID As %Integer OID додатки всередині компанії 42
Company As %String назва компанії (прописними) fiction
Prefix As %String префікс всіх створених нами SNMP-об'єктів fiction
CompanyShort As %String короткий префікс компанії (прописними) fict
MIBname As %String ім'я MIB-файлу ISC-TEST
Contact As %String контактна інформація (зокрема, адреса) Залишаємо значення за замовчуванням: Earth, Russia, Somewhere in the forests, Subject: ISC-TEST.mib
List As %Boolean Аналог verbose. Показувати прогрес завдання по створенню MIB-файлу 1
Власне, створення MIB-файлу:
CreateMIB()%SYS>d ##class(MonitorTools.SNMP).CreateMIB(«Monitoring»,«TEST»,99990,42,«fiction»,«fict»,«fiction»,«ISC-TEST»,,1)
Create SNMP structure for Application — Monitoring
Group — Metrics
ExecutedSpeed = Integer
GloRefSpeed = Integer
KeyExpirationDate = String
KeyLicenseUnits = Integer
RoutineLoadSpeed = Integer
Sessions = Integer

Create MIB file for Monitoring
Generate table Metrics
Add object ExecutedSpeed, Type = Integer
Add object GloRefSpeed, Type = Integer
Add object KeyExpirationDate, Type = String
Add object KeyLicenseUnits, Type = Integer
Add object RoutineLoadSpeed, Type = Integer
Add object Sessions, Type = Integer
MIB done.

В каталозі <Install_dir>/mgr/TEST з'явився новий MIB ISC-TEST.mib.

4. Запускаємо сервіс моніторингу з підключеним субагентом Caché
Відкриваємо панель управління System Administration -> Security -> Services -> %Service_Monitor (натиснути) -> Service Enabled (зазначити).


Також зазначаємо, що хочемо стартувати SNMP-субагента при старті Caché (натискаємо Configure Monitor Settings):

В Linux CentOS для SNMP моніторингу ми використовуємо пакет net-snmp. Ставимо його, конфігуруємо на використання субагентів і на те, що спілкування майстер-агента та субагентів буде здійснюватися через стандартний для цього порт 705.

[root@server ~]# grep-i agentx /etc/services
agentx 705/tcp # AgentX
agentx 705/udp # AgentX


Маленьку статтю щодо конфігураційного файлу snmpd.conf на додаток до ману можна подивитися на cyberciti. Ось наша кінцева налаштування:
Наш snmpd.conf[root@server~]# yum install net-snmp
[root@server ~]# grep '^[^#]' /etc/snmp/snmpd.conf
master agentx
agentXSocket TCP:localhost:705
com2sec local localhost public
group MyRWGroup v1 local
group MyRWGroup v2c local
group MyRWGroup usm local
view all included .1 80
view system included .iso.org.dod
access MyROGroup "" any noauth exact all none none
access MyRWGroup "" any noauth exact all all none
syslocation server (edit /etc/snmp/snmpd.conf)
syscontact Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
dontLogTCPWrappersConnects yes

Рестартуем в Linux демонів snmpd і snmptrapd. Стартуємо ^SNMP сервіс для початку роботи SNMP-субагента від Caché:
%SYS>d start^SNMP

5. Перевіряємо, що наші, тільки що створені, користувальницькі OID'и доступні.
Це можна зробити за допомогою snmpwalk — покажемо OID, відображає кількість CSP-сесій:

[root@server mgr]# snmpwalk-On-2c v-c public localhost 1.3.6.1.4.1.99990
.1.3.6.1.4.1.99990.42.1.1.1.1.4.84.69.83.84 = INTEGER: 448035
.1.3.6.1.4.1.99990.42.1.1.1.2.4.84.69.83.84 = INTEGER: 64190
.1.3.6.1.4.1.99990.42.1.1.1.3.4.84.69.83.84 = STRING: «2014-10-11»
.1.3.6.1.4.1.99990.42.1.1.1.4.4.84.69.83.84 = INTEGER: 200
.1.3.6.1.4.1.99990.42.1.1.1.5.4.84.69.83.84 = INTEGER: 93
.1.3.6.1.4.1.99990.42.1.1.1.6.4.84.69.83.84 = INTEGER: 1


У файлі ISC-TEST.mib вказана послідовність наших OID:

FictMetricsR ::=
SEQUENCE {
fictExecutedSpeed Integer32,
fictGloRefSpeed Integer32,
fictKeyExpirationDate DisplayString,
fictKeyLicenseUnits Integer32,
fictRoutineLoadSpeed Integer32,
fictSessions Integer32
}

Відповідно, наприклад, число сесій — це останній OID 1.3.6.1.4.1.99990.42.1.1.1.6. Можна порівняти з кількістю сесій, показуються SMP-дашбордом:


6. Додаємо наші OID'и в сторонню систему моніторингу.
Наприклад, візьмемо Zabbix. Документацію по Zabbix можна знайти на тут. З інсталяції та налаштування Zabbix конкретно на CentOS можна подивитися тут. Zabbix був обраний як система, що дозволяє не тільки малювати графіки, але і моніторити Plain Text (в нашому випадку, це строк дії ліцензії і потужність ліцензії за користувачам). Після додавання наших 6-ти метрик Items нашого локального хоста і створення 4-х графіків та 2-х PlainText параметрів (як елементів screen) бачимо таку картину (наведено приклад невеликий «живий» системи):

Вгорі — інформація про те, коли ліцензія закінчується, і скільки ми маємо ліцензійних слотів. Графіки говорять самі за себе.

7. Додаємо запуск системного монітора в нашій області TEST при старті системи
Є непоганий документ про використання користувальницьких рутин, що спрацьовують при старті і зупинці Caché. Називаються вони відповідно %ZSTART і %ZSTOP.
Що нас це цікавить, так це щоб при старті піднімати настроюваної області TEST системний монітор (^%SYSMONMGR). За замовчуванням цей монітор стартує тільки в області %SYS. Відповідно, будемо розглядати тільки програму ^%ZSTART. Ісходник %ZSTART.mac (створюємо і зберігаємо її у сфері %SYS).
Наш автостарт%ZSTART; User startup routine.
SYSTEM;
    ; Cache starting
    do $zu(9,"".,"Starting System Monitor in TEST namespace на ^%ZSTART...Begin".)
    znspace "TEST"
    set sc = ##class(%SYS.Monitor).Start()
    do $system.OBJ.DisplayError(sc)
    if (sc = 1) {
    do $zutil(9,"".,"Starting System Monitor in TEST namespace на ^%ZSTART...OK".)
    } else {
    do $zutil(9,"".,"Starting System Monitor in TEST namespace на ^%ZSTART...ERROR".)
    }
    ; Starting SNMP
    znspace "%SYS"
    do start^SNMP
    quit
LOGIN;
    ; a user logs в Cache (user account or telnet)
    quit
JOB;
    ; JOB'd process begins
    quit
CALLIN;
    ; a process enters via CALLIN interface
    quit


Рестартуем (по можливості) Caché, щоб переконатися, що збір SNMP-статистики після рестарту Caché триває.
На цьому все. Можливо, у когось будуть зауваження щодо вибору параметрів моніторингу або коду, але ставилося завдання показати можливість такого моніторингу в принципі, а додати потрібний параметр або отрефакторить код завжди можна надалі.
Спасибі за увагу!

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.