#!/bin/bash # -*- sh -*- : << =cut =head1 NAME oracle_sysstat_* - Munin plugin to monitor Oracle Statistics execute - To monitor Oracle Sysstat Execute Count parse - To monitor Oracle Sysstat Parse Count tablefetch - To monitor Oracle Sysstat Table Fetch Rows tablescan - To monitor Oracle Sysstat Table Scans transaction - To monitor Oracle Sysstat Transactions sort - To monitor Oracle Sysstat Sorts cursor - To monitor Oracle Sysstat Open Cursor enqueue - To monitor Oracle Sysstat Enqueues redolog - To monitor Oracle Sysstat Redo Log physicaliops - To monitor Oracle Sysstat Physical I/O Requests physicalrw - To monitor Oracle Sysstat Physical Read/Write Bytes netrw - To monitor Oracle Sysstat Network Send/Receive Bytes sgainfo - To monitor Oracle Memory SGA pgastat - To monitor Oracle Memory PGA cachehit - To monitor Oracle Cache Hit Ratio sessionuser - To monitor Oracle Session Users sessionwait - To monitor Oracle Session Wait eventwait - To monitor Oracle Wait Events eventwaitapplication - To monitor Oracle Wait Events Application eventwaitconcurrency - To monitor Oracle Wait Events Concurrency eventwaituserio - To monitor Oracle Wait Events User I/O eventwaitsystemio - To monitor Oracle Wait Events System I/O eventwaitcluster - To monitor Oracle Wait Events Cluster tablespace - To monitor Oracle Table Space Usage asmusage - To monitor Oracle ASM Disk Group Usage =head1 CONFIGURATION To get a list of symlinks that can be created, run: ./oracle_sysstat_ suggest Make symlinks: munin-node-configure --families=contrib --suggest --shell ... The following shows example settings for this plugin: [oracle_sysstat_*] user oracle env.oracle_auth / as SYSDBA env.ORACLE_HOME /path/to/oracle/product/version env.ORACLE_SID SOMESID [oracle_sysstat_asmusage] user grid env.oracle_auth / as SYSASM env.ORACLE_HOME /path/to/grid/home/version env.ORACLE_SID SOMESID =head1 NOTES Uses the command "sqlplus". Tested with Oracle Database 12c R1. =head1 AUTHOR K.Cima https://github.com/shakemid =head1 LICENSE GPLv2 =cut # Magic markers #%# family=contrib #%# capabilities=autoconf suggest # Include plugin.sh . $MUNIN_LIBDIR/plugins/plugin.sh # Like perl 'use strict;' #set -o nounset # Environments : ${ORACLE_HOME:=$( echo /opt/oracle/product/* )} : ${ORACLE_SID:=orcl} : ${oracle_auth:=/ as SYSDBA} PATH=$PATH:$ORACLE_HOME/bin export PATH ORACLE_HOME ORACLE_SID # Module name module=$( basename $0 | sed -e 's/^.*_//' ) # Graph settings declare -A global_attrs # required declare -A data_attrs # required (format: field type draw 'label') declare -A getfield_func # optional declare -A getvalue_func # required key=execute global_attrs[$key]=" graph_title Oracle Sysstat Execute Count graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel count per second graph_info Oracle Sysstat Execute Count " data_attrs[$key]=" execute_count DERIVE LINE 'execute count' user_calls DERIVE LINE 'user calls' recursive_calls DERIVE LINE 'recursive calls' " getvalue_func[$key]=getvalue_sysstat key=parse global_attrs[$key]=" graph_title Oracle Sysstat Parse Count graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel count per second graph_info Oracle Sysstat Parse Count " data_attrs[$key]=" parse_count_total DERIVE LINE 'parse count (total)' parse_count_hard DERIVE LINE 'parse count (hard)' parse_count_failures DERIVE LINE 'parse count (failures)' parse_count_describe DERIVE LINE 'parse count (describe)' " getvalue_func[$key]=getvalue_sysstat key=tablefetch global_attrs[$key]=" graph_title Oracle Sysstat Table Fetch Rows graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel count per second graph_info Oracle Sysstat Table Scans " data_attrs[$key]=" table_fetch_by_rowid DERIVE LINE 'table fetch by rowid' table_scan_rows_gotten DERIVE LINE 'table scan rows gotten' " getvalue_func[$key]=getvalue_sysstat key=tablescan global_attrs[$key]=" graph_title Oracle Sysstat Table Scans graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel count per second graph_info Oracle Sysstat Table Scans " data_attrs[$key]=" table_scans_short_tables DERIVE LINE 'table scans (short tables)' table_scans_long_tables DERIVE LINE 'table scans (long tables)' " getvalue_func[$key]=getvalue_sysstat key=transaction global_attrs[$key]=" graph_title Oracle Sysstat Transactions graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel count per second graph_info Oracle Sysstat Transactions " data_attrs[$key]=" user_commits DERIVE LINE 'user commits' user_rollbacks DERIVE LINE 'user rollbacks' " getvalue_func[$key]=getvalue_sysstat key=sort global_attrs[$key]=" graph_title Oracle Sysstat Sorts graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel count per second graph_info Oracle Sysstat - Sorts " data_attrs[$key]=" sorts_memory DERIVE LINE 'sorts (memory)' sorts_disk DERIVE LINE 'sorts (disk)' " getvalue_func[$key]=getvalue_sysstat key=cursor global_attrs[$key]=" graph_title Oracle Sysstat Open Cursors graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel count graph_info Oracle Sysstat Open Cursors " data_attrs[$key]=" open_cursor GAUGE LINE 'opened cursors current' " getvalue_func[$key]=getvalue_sysstat key=enqueue global_attrs[$key]=" graph_title Oracle Sysstat Enqueues graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel count per second graph_info Oracle Sysstat Enqueues " data_attrs[$key]=" enqueue_requests DERIVE LINE 'enqueue requests' enqueue_releases DERIVE LINE 'enqueue releases' enqueue_conversions DERIVE LINE 'enqueue conversions' enqueue_waits DERIVE LINE 'enqueue waits' enqueue_timeouts DERIVE LINE 'enqueue timeouts' enqueue_deadlocks DERIVE LINE 'enqueue deadlocks' " getvalue_func[$key]=getvalue_sysstat key=redolog global_attrs[$key]=" graph_title Oracle Sysstat Redo Log graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel count per second graph_info Oracle Sysstat Redo Log " data_attrs[$key]=" redo_entries DERIVE LINE 'redo entries' redo_buffer_allocation_retries DERIVE LINE 'redo buffer allocation retries' redo_log_space_requests DERIVE LINE 'redo log space requests' " getvalue_func[$key]=getvalue_sysstat key=physicaliops global_attrs[$key]=" graph_title Oracle Sysstat Physical I/O Requests graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel iops graph_info Oracle Sysstat Physical I/O Requests " data_attrs[$key]=" physical_read_total DERIVE LINE2 'physical read total IO requests' physical_read DERIVE LINE 'physical read IO requests' physical_read_total_multi DERIVE LINE 'physical read total multi block requests' physical_write_total DERIVE LINE2 'physical write total IO requests' physical_write DERIVE LINE 'physical write IO requests' physical_write_total_multi DERIVE LINE 'physical write total multi block requests' " getvalue_func[$key]=getvalue_sysstat key=physicalrw global_attrs[$key]=" graph_title Oracle Sysstat Physical Read/Write Bytes graph_category db graph_args --base 1024 --lower-limit 0 --rigid graph_vlabel bytes per second graph_info Oracle Sysstat Physical Read/Write Bytes " data_attrs[$key]=" physical_read_total DERIVE LINE2 'physical read total bytes' physical_read DERIVE LINE 'physical read bytes' physical_write_total DERIVE LINE2 'physical write total bytes' physical_write DERIVE LINE 'physical write bytes' " getvalue_func[$key]=getvalue_sysstat key=netrw global_attrs[$key]=" graph_title Oracle Sysstat Network Send/Receive Bytes graph_category db graph_args --base 1024 --lower-limit 0 --rigid graph_vlabel bytes per second graph_info Oracle Sysstat Network Send/Receive Bytes " data_attrs[$key]=" bytes_sent_via_sql_net_to_client DERIVE LINE 'bytes sent via SQL*Net to client' bytes_received_via_sql_net_from_client DERIVE LINE 'bytes received via SQL*Net from client' bytes_sent_via_sql_net_to_dblink DERIVE LINE 'bytes sent via SQL*Net to dblink' bytes_received_via_sql_net_from_dblink DERIVE LINE 'bytes received via SQL*Net from dblink' " getvalue_func[$key]=getvalue_sysstat key=sgainfo global_attrs[$key]=" graph_title Oracle Memory SGA graph_category db graph_args --base 1024 --lower-limit 0 --rigid graph_vlabel bytes graph_info Oracle Memory SGA " data_attrs[$key]=" maximum_sga_size GAUGE LINE 'Maximum SGA Size' fixed_sga_size GAUGE AREASTACK 'Fixed SGA Size' redo_buffers GAUGE AREASTACK 'Redo Buffers' shared_pool_size GAUGE AREASTACK 'Shared Pool Size' large_pool_size GAUGE AREASTACK 'Large Pool Size' java_pool_size GAUGE AREASTACK 'Java Pool Size' streams_pool_size GAUGE AREASTACK 'Streams Pool Size' shared_io_pool_size GAUGE AREASTACK 'Shared IO Pool Size' buffer_cache_size GAUGE AREASTACK 'Buffer Cache Size' in_memory_area_size GAUGE AREASTACK 'In-Memory Area Size' " getvalue_func[$key]=getvalue_sgainfo key=pgastat global_attrs[$key]=" graph_title Oracle Memory PGA graph_category db graph_args --base 1024 --lower-limit 0 --rigid graph_vlabel bytes graph_info Oracle Memory PGA " data_attrs[$key]=" pga_target GAUGE LINE 'aggregate PGA auto target' pga_allocated GAUGE LINE 'total PGA allocated' pga_inuse GAUGE AREA 'total PGA inuse' " getvalue_func[$key]=getvalue_pgastat key=cachehit global_attrs[$key]=" graph_title Oracle Cache Hit Ratio graph_category db graph_args --base 1000 --lower-limit 0 --upper-limit 100 --rigid graph_vlabel % graph_info Oracle Cache Hit Ratio graph_scale no " data_attrs[$key]=" buf_hitratio GAUGE LINE 'Buffer Cache Hit Ratio' lib_hitratio GAUGE LINE 'Library Cache Hit Ratio' dict_hitratio GAUGE LINE 'Dictionary Cache Hit Ratio' " getvalue_func[$key]=getvalue_cachehit key=sessionuser global_attrs[$key]=" graph_title Oracle Session Users graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel count graph_info Oracle Session Users " data_attrs[$key]="" getfield_func[$key]=getfield_sessionuser getvalue_func[$key]=getvalue_sessionuser key=sessionwait global_attrs[$key]=" graph_title Oracle Session Wait graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel count graph_info Oracle Session Wait " data_attrs[$key]="" getfield_func[$key]=getfield_sessionwait getvalue_func[$key]=getvalue_sessionwait key=eventwait global_attrs[$key]=" graph_title Oracle Wait Events graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel microseconds graph_info Oracle Wait Events " data_attrs[$key]="" getfield_func[$key]=getfield_eventwait getvalue_func[$key]=getvalue_eventwait key=eventwaitapplication global_attrs[$key]=" graph_title Oracle Wait Events Application graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel microseconds graph_info Oracle Wait Events Application " data_attrs[$key]="" getfield_func[$key]='getfield_eventwait2 Application' getvalue_func[$key]='getvalue_eventwait2 Application' key=eventwaitconcurrency global_attrs[$key]=" graph_title Oracle Wait Events Concurrency graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel microseconds graph_info Oracle Wait Events Concurrency " data_attrs[$key]=" " getfield_func[$key]='getfield_eventwait2 Concurrency' getvalue_func[$key]='getvalue_eventwait2 Concurrency' key=eventwaituserio global_attrs[$key]=" graph_title Oracle Wait Events User I/O graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel microseconds graph_info Oracle Wait Events User I/O " data_attrs[$key]="" getfield_func[$key]='getfield_eventwait2 "User I/O"' getvalue_func[$key]='getvalue_eventwait2 "User I/O"' key=eventwaitsystemio global_attrs[$key]=" graph_title Oracle Wait Events System I/O graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel microseconds graph_info Oracle Wait Events System I/O " data_attrs[$key]=" " getfield_func[$key]='getfield_eventwait2 "System I/O"' getvalue_func[$key]='getvalue_eventwait2 "System I/O"' key=eventwaitcluster global_attrs[$key]=" graph_title Oracle Wait Events Cluster graph_category db graph_args --base 1000 --lower-limit 0 --rigid graph_vlabel microseconds graph_info Oracle Wait Events Cluster " data_attrs[$key]=" " getfield_func[$key]='getfield_eventwait2 Cluster' getvalue_func[$key]='getvalue_eventwait2 Cluster' key=tablespace global_attrs[$key]=" graph_title Oracle Table Space Usage graph_category db graph_args --base 1000 --lower-limit 0 --upper-limit 100 --rigid graph_vlabel % graph_info Oracle Table Space Usage warning ${warning:=92} critical ${critical:=98} " data_attrs[$key]="" getfield_func[$key]=getfield_tablespace getvalue_func[$key]=getvalue_tablespace key=asmusage global_attrs[$key]=" graph_title Oracle ASM Disk Group Usage graph_category db graph_args --base 1000 --lower-limit 0 --upper-limit 100 --rigid graph_vlabel % graph_info Oracle ASM Disk Group Usage warning ${warning:=92} critical ${critical:=98} " data_attrs[$key]="" getfield_func[$key]=getfield_asmusage getvalue_func[$key]=getvalue_asmusage # End of Graph Settings # sqlplus options : "${sqlplus:=sqlplus -S -L}" sqlplus_variables=" set pagesize 0 set feed off set head off set linesize 256 set numwidth 20 " # functions autoconf() { if [ -x "$( which ${sqlplus} )" ]; then echo yes else echo "no (failed to find executable 'sqlplus')" fi } suggest() { echo ${!global_attrs[@]} | tr ' ' '\n' | sort } config() { # print global attributes sed -e 's/^ *//' -e '/^$/d' <<< "${global_attrs[$module]}" # print data source attributes local line t fields field type draw label while IFS= read -r line do eval 't=(' "$line" ')' field="${t[0]}" [ -z "$field" ] && continue fields+=( $field ) type="${t[1]}" draw="${t[2]}" label="${t[3]}" echo ${field}.type ${type} echo ${field}.draw ${draw} echo ${field}.label ${label} done <<< "${data_attrs[$module]}" echo graph_order ${fields[@]} } getfield() { if [ -n "${getfield_func[$module]:-}" ]; then eval "${getfield_func[$module]}" fi } getvalue() { eval "${getvalue_func[$module]}" } getvalue_sysstat() { local line t field label while IFS= read -r line do eval 't=(' "$line" ')' field="${t[0]}" [ -z "$field" ] && continue label="${t[3]}" ${sqlplus} "${oracle_auth}" <