Мониторинг OracleDB с помощью Proto Observability
На этой странице:
Сбор метрик OracleDB
Метрики OracleDB собирает проверка агента oracle. Поддерживаются OracleDB
11g, 12c, 18c, 19c, 21c — как мультитенантные (CDB), так и non-CDB.
Версия агента
Настройка мониторинга OracleDB различается для агентов 7.80.2 и 7.40.2: у них разные права пользователя, способ подключения к базе и набор метрик. Там, где настройка отличается, инструкция разделена на вкладки — выбирайте вкладку своей версии агента.
Узнать версию агента:
protoobp-agent version
| Версия агента | Где применяется | Что нужно для подключения к OracleDB |
|---|---|---|
| 7.80.2 | Linux, Docker | ничего: драйвер встроен в агент, Oracle Client и Java не нужны |
| 7.40.2 | Linux, Docker, Windows | Oracle Instant Client или JDBC-драйвер + Java 8+ (только Linux) |
Windows
Для Windows выпущен только агент 7.40.2 — используйте вкладки 7.40.2.Переход с 7.40.2 на 7.80.2
После обновления агента:
- выдайте пользователю мониторинга права со вкладки 7.80.2 раздела
Конфигурация OracleDB. С правами от 7.40.2
агент пишет в лог
missing privileges detected, falling back to deprecated Oracle integrationи собирает сокращённый набор метрик; - удалите из
conf.yamlпараметрыjdbc_driver_pathиjdbc_truststore_*— агент 7.80.2 JDBC не использует. Устаревшийuse_instant_clientвinit_configпока работает какoracle_client: true, но его стоит заменить наoracle_clientв instance.
Конфигурация OracleDB
Создайте пользователя для мониторинга и выдайте ему права от имени SYSDBA.
Имя пользователя c##protoobp
Префикс c## требует Oracle для пользователя в мультитенантной базе (CDB).
Такой пользователь создаётся в корневом контейнере CDB$ROOT и виден во всех
подключаемых базах (PDB), поэтому агент одним подключением собирает метрики
всех PDB. Без префикса Oracle не даст создать такого пользователя (ошибка
ORA-65096: invalid common user or role name). Префикс задаётся параметром
базы COMMON_USER_PREFIX, по умолчанию — C##.
Если база без мультитенантности (non-CDB) или это Oracle 11g, используйте
обычное имя, например protoobp. Уже существующего пользователя можно
оставить, выдав ему права для своей версии агента.
Пользователь
Мультитенантная база (CDB) — общий пользователь в корневом контейнере; агент подключается к
CDB$ROOTи собирает метрики всех PDB:CREATE USER c##protoobp IDENTIFIED BY "<PASSWORD>" CONTAINER = ALL; ALTER USER c##protoobp SET CONTAINER_DATA=ALL CONTAINER=CURRENT;Non-CDB и Oracle 11g:
CREATE USER protoobp IDENTIFIED BY "<PASSWORD>";
Права
Пример — для мультитенантной базы; для non-CDB и Oracle 11g замените c##protoobp на
protoobp.
GRANT CREATE SESSION TO c##protoobp;
GRANT SELECT ON V_$SESSION TO c##protoobp;
GRANT SELECT ON V_$DATABASE TO c##protoobp;
GRANT SELECT ON V_$CONTAINERS TO c##protoobp;
GRANT SELECT ON V_$SQLSTATS TO c##protoobp;
GRANT SELECT ON V_$INSTANCE TO c##protoobp;
GRANT SELECT ON DBA_FEATURE_USAGE_STATISTICS TO c##protoobp;
GRANT SELECT ON V_$SQL_PLAN_STATISTICS_ALL TO c##protoobp;
GRANT SELECT ON V_$PROCESS TO c##protoobp;
GRANT SELECT ON V_$CON_SYSMETRIC TO c##protoobp;
GRANT SELECT ON CDB_TABLESPACE_USAGE_METRICS TO c##protoobp;
GRANT SELECT ON CDB_TABLESPACES TO c##protoobp;
GRANT SELECT ON V_$SQLCOMMAND TO c##protoobp;
GRANT SELECT ON V_$DATAFILE TO c##protoobp;
GRANT SELECT ON V_$SYSMETRIC TO c##protoobp;
GRANT SELECT ON V_$SGAINFO TO c##protoobp;
GRANT SELECT ON V_$PDBS TO c##protoobp;
GRANT SELECT ON CDB_SERVICES TO c##protoobp;
GRANT SELECT ON V_$OSSTAT TO c##protoobp;
GRANT SELECT ON V_$PARAMETER TO c##protoobp;
GRANT SELECT ON V_$SQL TO c##protoobp;
GRANT SELECT ON V_$PGASTAT TO c##protoobp;
GRANT SELECT ON V_$ASM_DISKGROUP TO c##protoobp;
GRANT SELECT ON V_$RSRCMGRMETRIC TO c##protoobp;
GRANT SELECT ON V_$DATAGUARD_CONFIG TO c##protoobp;
GRANT SELECT ON V_$DATAGUARD_STATS TO c##protoobp;
GRANT SELECT ON V_$TRANSACTION TO c##protoobp;
GRANT SELECT ON V_$LOCKED_OBJECT TO c##protoobp;
GRANT SELECT ON DBA_OBJECTS TO c##protoobp;
GRANT SELECT ON CDB_DATA_FILES TO c##protoobp;
GRANT SELECT ON DBA_DATA_FILES TO c##protoobp;
Для Oracle 11g пропустите представления, которых в этой версии нет:
V_$CON_SYSMETRIC, CDB_TABLESPACE_USAGE_METRICS, CDB_TABLESPACES,
V_$PDBS, CDB_SERVICES, V_$TRANSACTION, V_$LOCKED_OBJECT.
Для пользовательских запросов к конкретной PDB дополнительно выполните в этой PDB:
ALTER SESSION SET CONTAINER = <PDB_NAME>;
GRANT SET CONTAINER TO c##protoobp;
При включённом dbm: true (см. Собираемые метрики)
дополнительно нужны:
GRANT SELECT ON V_$LOCK TO c##protoobp;
GRANT SELECT ON GV_$LOCK TO c##protoobp;
GRANT EXECUTE ON SYS.DBMS_LOB TO c##protoobp;
Amazon RDS и Autonomous Database. В Amazon RDS прямой GRANT на
системные представления недоступен — выдавайте права процедурой
exec rdsadmin.rdsadmin_util.grant_sys_object('V_$SESSION','PROTOOBP','SELECT',p_grant_option => false);
для каждого представления из списка. В Oracle Autonomous Database указывайте
имена представлений без подчёркивания: V$SESSION вместо V_$SESSION.
Non-CDB:
-- Для Oracle 11g эту строку не выполняйте. ALTER SESSION SET "_ORACLE_SCRIPT"=true; CREATE USER protoobp IDENTIFIED BY "<PASSWORD>"; GRANT CONNECT TO protoobp; GRANT SELECT ON GV_$PROCESS TO protoobp; GRANT SELECT ON GV_$SYSMETRIC TO protoobp; GRANT SELECT ON SYS.DBA_DATA_FILES TO protoobp; GRANT SELECT ON SYS.DBA_TABLESPACES TO protoobp; GRANT SELECT ON SYS.DBA_TABLESPACE_USAGE_METRICS TO protoobp;Мультитенантная база (CDB), Oracle 12c и 19c — в корневом контейнере:
ALTER SESSION SET CONTAINER = CDB$ROOT; CREATE USER c##protoobp IDENTIFIED BY "<PASSWORD>" CONTAINER=ALL; GRANT CREATE SESSION TO c##protoobp CONTAINER=ALL; GRANT SELECT ANY DICTIONARY TO c##protoobp CONTAINER=ALL; GRANT SELECT ON GV_$PROCESS TO c##protoobp CONTAINER=ALL; GRANT SELECT ON GV_$SYSMETRIC TO c##protoobp CONTAINER=ALL;
Клиент для подключения
Агент 7.80.2 поддерживает два способа подключения:
| Способ | Когда используется | Что нужно на хосте с агентом |
|---|---|---|
| Встроенный драйвер | по умолчанию | ничего: ни Oracle Client, ни Java |
Oracle Client (libclntsh.so) | oracle_client: true либо задан tns_alias | Oracle Instant Client Basic или Oracle Home |
Встроенного драйвера достаточно для подключения по server + service_name,
в том числе по TCPS. Oracle Client нужен, только если используются
tnsnames.ora/LDAP (tns_alias) или возможности SQL*Net, которые встроенный
драйвер не поддерживает.
Для Oracle Client:
Установите пакет Instant Client Basic, например в
/u01/app/oracle/product/instantclient_19.Передайте путь к библиотекам агенту — параметром
oracle_client_lib_dirвconf.yamlлибо переменной окружения:echo "LD_LIBRARY_PATH=/u01/app/oracle/product/instantclient_19" \ >> /etc/protoobp-agent/environmentЕсли используется полный Oracle Home, дополнительно задайте
ORACLE_HOME.
Клиентских библиотек Oracle в составе агента 7.40.2 нет. Агент выбирает способ подключения автоматически:
- если на хосте найден Oracle Instant Client — подключается через него;
- иначе — через JDBC-драйвер. Этот способ работает только на Linux и требует Java 8 или новее.
Установите один из двух клиентов. Если не установлен ни один, либо Instant
Client установлен, но агент не находит его библиотеки, проверка переходит на
JDBC и завершается ошибкой No JVM shared library file (libjvm.so) found.
Oracle Instant Client — Linux
Скачайте с сайта Oracle пакеты Instant Client Basic и Instant Client SDK и распакуйте оба в один общий каталог, например
/opt/oracle:mkdir -p /opt/oracle && cd /opt/oracle unzip instantclient-basic-linux.x64-<VERSION>.zip unzip instantclient-sdk-linux.x64-<VERSION>.zipСделайте библиотеки доступными для компоновщика:
echo /opt/oracle/instantclient_<VERSION> > /etc/ld.so.conf.d/oracle-instantclient.conf ldconfig
Oracle Instant Client — Windows
- Установите Microsoft Visual C++ Redistributable нужной для Instant Client версии.
- Распакуйте Instant Client Basic и Instant Client SDK в один общий
каталог, например
C:\oracle\instantclient_19. - Добавьте этот каталог в системную переменную
PATH(служба агента не видит пользовательские переменные) и перезапустите службу агента.
На Windows JDBC не поддерживается — Instant Client обязателен.
JDBC-драйвер — только Linux
Установите Java 8 или новее (например, пакет
openjdk-11-jre-headless).Скачайте с сайта Oracle JDBC-драйвер (
ojdbc8.jarили новее) и положите в каталог, доступный пользователю агентаpobp-agent, например/opt/oracle/jdbc/ojdbc8.jar.Укажите путь к файлу в параметре
jdbc_driver_pathконфигурации проверки (см. Конфигурация ProtoOBP агента).Если Java установлена не в стандартный каталог
/usr/lib/jvm, передайте агентуJAVA_HOME. В 7.40.2 служба агента не читает/etc/protoobp-agent/environment, поэтому используйте drop-in:mkdir -p /etc/systemd/system/protoobp-agent.service.d cat > /etc/systemd/system/protoobp-agent.service.d/oracle.conf <<'EOF' [Service] Environment=JAVA_HOME=/usr/lib/jvm/<JAVA_DIR> EOF systemctl daemon-reload
Конфигурация ProtoOBP агента
Если агент запускается в виде службы на хосте
Создайте файл конфигурации проверки:
- Linux —
/etc/protoobp-agent/conf.d/oracle.d/conf.yaml - Windows (только 7.40.2) —
C:\ProgramData\Protoobp\conf.d\oracle.d\conf.yaml
init_config:
instances:
- server: <ORACLE_HOST>:1521
# Имя сервиса CDB (для non-CDB — имя сервиса базы):
# SELECT value FROM v$parameter WHERE name='service_names'
service_name: <SERVICE_NAME>
username: c##protoobp # для non-CDB — protoobp
password: "<PASSWORD>"
tags:
- env:<ENV>
Подключение по TCPS:
instances:
- server: <ORACLE_HOST>:2484
service_name: <SERVICE_NAME>
username: c##protoobp
password: "<PASSWORD>"
protocol: TCPS
wallet: <WALLET_DIR>
Подключение через tnsnames.ora (требует Oracle Client):
instances:
- tns_alias: <TNS_ALIAS>
tns_admin: <TNS_ADMIN_DIR>
username: c##protoobp
password: "<PASSWORD>"
Перезапустите агента: systemctl restart protoobp-agent.
RAC. Настройте отдельный instance проверки на каждый узел кластера: агент
читает представления V$ конкретного экземпляра, а не общие GV$.
Подключайтесь к узлам напрямую — через прокси, балансировщики и пулы
соединений проверка не работает.
init_config:
instances:
- server: <ORACLE_HOST>:1521
# SELECT value FROM v$parameter WHERE name='service_names'
service_name: <SERVICE_NAME>
username: protoobp # для CDB — c##protoobp
password: "<PASSWORD>"
# Только при подключении через JDBC:
# jdbc_driver_path: /opt/oracle/jdbc/ojdbc8.jar
tags:
- env:<ENV>
Подключение по TCPS — укажите protocol: TCPS и порт TCPS-слушателя:
instances:
- server: <ORACLE_HOST>:2484
service_name: <SERVICE_NAME>
username: protoobp
password: "<PASSWORD>"
protocol: TCPS
Через Instant Client настройки SSL (wallet) берутся из
sqlnet.oraклиента. Проверьте подключение с хоста агента:sqlplus <USER>/<PASSWORD>@"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCPS)(HOST=<HOST>)(PORT=<PORT>)))(CONNECT_DATA=(SERVICE_NAME=<SERVICE_NAME>)))"Через JDBC обязательно укажите хранилище доверенных сертификатов:
jdbc_driver_path: /opt/oracle/jdbc/ojdbc8.jar jdbc_truststore_path: /opt/oracle/truststore/cwallet.sso jdbc_truststore_type: SSO # JKS, SSO или PKCS12 # jdbc_truststore_password: <TRUSTSTORE_PASSWORD> # для SSO не нужен
Перезапустите агента:
- Linux —
systemctl restart protoobp-agent - Windows —
"C:\Program Files\Protoobp\Protoobp Agent\bin\agent.exe" restart-service
Выполните проверку работы агента
и убедитесь, что в разделе oracle нет ошибок.
Обратите внимание
Для отображения нового хоста СУБД следует обновить страницу браузера целиком (кнопкаОбновить в правом верхнем углу веб-консоли обновляет только значения
метрик на дашборде, но не список серверов).Пользовательские запросы
Собственные метрики задаются в custom_queries. Имя метрики — metric_prefix
плюс name столбца; столбцы с type: tag становятся лейблами. Пример
одинаков для обеих версий агента:
instances:
- server: <ORACLE_HOST>:1521
service_name: <SERVICE_NAME>
username: c##protoobp
password: "<PASSWORD>"
custom_queries:
- metric_prefix: oracle.app
query: SELECT status, COUNT(*) FROM app.orders GROUP BY status
columns:
- name: status
type: tag
- name: orders
type: gauge
Отличия версий:
- 7.80.2 — параметр
pdb: <PDB_NAME>в запросе выполняет его в указанной PDB (по умолчанию —CDB$ROOT). - 7.40.2 — параметр
only_custom_queries: trueв instance отключает стандартные метрики; тогда пользователю достаточно прав на таблицы из пользовательских запросов.
Если агент запускается в виде Docker контейнера
Используется обычный образ агента, без суффикса -jmx.
Добавьте autodiscovery-лейблы к Docker контейнеру с OracleDB.
в
docker-compose.yamllabels: com.protoobp.ad.check_names: '["oracle"]' com.protoobp.ad.init_configs: "[{}]" com.protoobp.ad.instances: '[{"server": "%%host%%:1521", "service_name": "<SERVICE_NAME>", "username": "c##protoobp", "password": "<PASSWORD>"}]'или в
DockerfileLABEL "com.protoobp.ad.check_names"='["oracle"]' LABEL "com.protoobp.ad.init_configs"='[{}]' LABEL "com.protoobp.ad.instances"='[{"server": "%%host%%:1521", "service_name": "<SERVICE_NAME>", "username": "c##protoobp", "password": "<PASSWORD>"}]'
Примените изменения лейблов для контейнера с OracleDB (перезапуском контейнера), а также перезапустите контейнер с агентом ProtoOBP.
В контейнере используется подключение через JDBC: Java есть только в образе
агента с суффиксом -jmx.
Смонтируйте JDBC-драйвер в контейнер агента, например
/opt/oracle/jdbc/ojdbc8.jar:/opt/oracle/jdbc/ojdbc8.jar:ro.Добавьте autodiscovery-лейблы к Docker контейнеру с OracleDB.
в
docker-compose.yamllabels: com.protoobp.ad.check_names: '["oracle"]' com.protoobp.ad.init_configs: "[{}]" com.protoobp.ad.instances: '[{"server": "%%host%%:1521", "service_name": "<SERVICE_NAME>", "username": "protoobp", "password": "<PASSWORD>", "jdbc_driver_path": "/opt/oracle/jdbc/ojdbc8.jar"}]'или в
DockerfileLABEL "com.protoobp.ad.check_names"='["oracle"]' LABEL "com.protoobp.ad.init_configs"='[{}]' LABEL "com.protoobp.ad.instances"='[{"server": "%%host%%:1521", "service_name": "<SERVICE_NAME>", "username": "protoobp", "password": "<PASSWORD>", "jdbc_driver_path": "/opt/oracle/jdbc/ojdbc8.jar"}]'
Примените изменения лейблов для контейнера с OracleDB (перезапуском контейнера), а также перезапустите контейнер с агентом ProtoOBP.
Выполните проверку работы агента
и убедитесь, что в разделе oracle нет ошибок.
Контейнер агента
Контейнер агента должен находиться в той же docker network, что и OracleDB, и иметь смонтированный/var/run/docker.sock:/var/run/docker.sock:ro для
autodiscovery.Проверка
Убедитесь, что проверка запустилась и собирает метрики:
protoobp-agent status | grep -A 12 "oracle ("
Для агента в контейнере:
docker exec protoobp-agent agent status | grep -A 12 "oracle ("
Ожидается instance со статусом [OK] и ненулевыми Metric Samples. Полный
список собранных серий:
protoobp-agent check oracle
Типовые ошибки:
В логе агента при запуске проверки указан способ подключения: driver: oracle
— встроенный драйвер, driver: godror — Oracle Client.
| Сообщение | Причина и решение |
|---|---|
missing privileges detected, falling back to deprecated Oracle integration | Выданы права от 7.40.2 либо не хватает прав на V_$INSTANCE и другие представления — выдайте права со вкладки 7.80.2 раздела Конфигурация OracleDB. |
ORA-01017: invalid username/password | Неверные учётные данные; для CDB имя пользователя должно начинаться с c##. |
ORA-12514 / ORA-12505 (listener does not currently know of service) | Неверный service_name — уточните запросом SELECT value FROM v$parameter WHERE name='service_names'. |
DPI-1047: Cannot locate a 64-bit Oracle Client library | Включён oracle_client (или задан tns_alias), но библиотеки Oracle Client не найдены — см. Клиент для подключения. |
Ошибки про libjvm.so, JDBC, jaydebeapi | Это ошибки агента 7.40.2. Проверьте версию агента (protoobp-agent version) и удалите из conf.yaml параметр jdbc_driver_path. |
| Сообщение | Причина и решение |
|---|---|
No JVM shared library file (libjvm.so) found | Агент не нашёл Instant Client и перешёл на JDBC, но Java не установлена или не найдена. Установите Instant Client либо Java и задайте JAVA_HOME — см. Клиент для подключения. |
Class oracle.jdbc.OracleDriver not found | Не указан или недоступен JDBC-драйвер — проверьте jdbc_driver_path и права пользователя pobp-agent на файл. |
Oracle client is unavailable and the integration is unable to import JDBC libraries | Windows: не найден Instant Client или не установлен Visual C++ Redistributable. |
TCPS connections to Oracle via JDBC requires both jdbc_truststore_type and jdbc_truststore_path | Для TCPS через JDBC не заданы параметры хранилища сертификатов. |
ORA-01017: invalid username/password | Неверные учётные данные; для CDB имя пользователя должно начинаться с c##. |
ORA-00942: table or view does not exist | Не выданы права со вкладки 7.40.2 раздела Конфигурация OracleDB. |
Собираемые метрики
Все метрики имеют тип gauge.
Системные метрики (sysmetric) — общие для обеих версий:
| Метрика | Описание |
|---|---|
oracle_active_sessions | Среднее число активных сессий |
oracle_session_count | Число сессий |
oracle_session_limit_usage | Использование лимита сессий, % |
oracle_logons | Входы в секунду |
oracle_buffer_cachehit_ratio | Попадания в буферный кэш, % |
oracle_library_cachehit_ratio | Попадания в library cache, % |
oracle_shared_pool_free | Свободно в shared pool, % |
oracle_database_wait_time_ratio | Доля времени ожидания, % |
oracle_service_response_time | Время ответа SQL-сервиса |
oracle_physical_reads | Физические чтения в секунду |
oracle_physical_writes | Физические записи в секунду |
oracle_disk_sorts | Сортировки на диске в секунду |
oracle_memory_sorts_ratio | Доля сортировок в памяти, % |
oracle_rows_per_sort | Строк на сортировку |
oracle_sorts_per_user_call | Сортировок на пользовательский вызов |
oracle_long_table_scans | Длинные полные сканирования таблиц в секунду |
oracle_enqueue_timeouts | Таймауты блокировок (enqueue) в секунду |
oracle_user_rollbacks | Откаты транзакций в секунду |
oracle_temp_space_used | Занято во временном табличном пространстве, байты |
oracle_gc_cr_block_received | RAC: получено CR-блоков в секунду |
oracle_cache_blocks_corrupt | RAC: повреждённые блоки глобального кэша |
oracle_cache_blocks_lost | RAC: потерянные блоки глобального кэша |
Табличные пространства (лейбл tablespace) — общие для обеих версий:
| Метрика | Описание |
|---|---|
oracle_tablespace_used | Занято, байты |
oracle_tablespace_size | Размер, байты |
oracle_tablespace_in_use | Заполненность, % |
oracle_tablespace_offline | 1, если пространство недоступно |
Метрики, которые есть только в одной из версий:
На метриках CDB-экземпляра есть лейбл pdb с именем контейнера, на всех
метриках — oracle_version.
| Метрика | Описание |
|---|---|
oracle_tablespace_maxsize | Максимальный размер табличного пространства, байты |
oracle_pga_over_allocation_count | Превышения выделения PGA за интервал |
oracle_process_pga_used_memory | Используемая PGA процесса, байты |
oracle_process_pga_allocated_memory | Выделенная PGA процесса, байты |
oracle_process_pga_freeable_memory | Освобождаемая PGA процесса, байты |
oracle_process_pga_max_memory | Максимум PGA процесса, байты |
oracle_session_inactive_seconds | Время бездействия неактивной сессии, секунды |
oracle_user_sessions | Число пользовательских сессий |
oracle_num_cpus | Число CPU сервера БД |
oracle_physical_memory_gb | Физическая память сервера БД, ГБ |
Группы метрик включаются и отключаются параметрами instance sysmetrics,
tablespaces, process_memory, например:
process_memory:
enabled: false
Расширенный режим (dbm: true) добавляет метрики ASM
(oracle_asm_diskgroup_*), Data Guard (oracle_data_guard_*), Resource
Manager (oracle_resource_manager_*), разделяемой памяти
(oracle_shared_memory_size) и расширенный набор системных метрик. Режим
требует дополнительных прав (см. Конфигурация OracleDB)
и создаёт на базе больше запросов.
| Метрика | Описание |
|---|---|
oracle_cursor_cachehit_ratio | Попадания в кэш курсоров, % |
oracle_process_pga_used_memory | Используемая PGA (лейбл program), байты |
oracle_process_pga_allocated_memory | Выделенная PGA (лейбл program), байты |
oracle_process_pga_freeable_memory | Освобождаемая PGA (лейбл program), байты |
oracle_process_pga_maximum_memory | Максимум PGA (лейбл program), байты |
Сервисные проверки
Общие для обеих версий:
| Имя | Описание |
|---|---|
oracle.can_connect | CRITICAL, если агент не может подключиться к OracleDB; иначе OK |
oracle.can_query | CRITICAL, если при сборе метрик возникли ошибки запросов; иначе OK |