MySQL監控:MySQL監控指標、MySQL監控界面實現、Python監控MySQL

本文概要:

        0、前言;
        1、監控MySQL的哪些指標;
        2、一目瞭然的MySQL監控的UI界面;
        3、Python代碼獲取MySQL監控狀態。

0、前言

        我們知道“SHOW STATUS”命令是獲取MySQL實例狀態的,“SHOW VARIABLES”命令是獲取MySQL實例設置變量的,也是監控數據的最重要來源。
        這兩個命令使用如下:
                “SHOW VARIABLES”命令獲取狀態:
                            mysql> SHOW GLOBAL STATUS;
                            mysql> SHOW [SESSION] STATUS;    
                            
                            查詢特定狀態值:
                                    SHOW GLOBAL STATUS LIKE 'xxx'";
                            
                            這裏數據的主要來源是“information_schema”數據庫,它是每個MySQL實例中的數據庫,存儲有關MySQL實例維護的所有其他數據庫的信息。
                                    
                “SHOW STATUS”命令設置參數:
                            mysql> SHOW GLOBAL VARIABLES;
                            mysql> SHOW [SESSION] VARIABLES;
                                        
                            查詢特定變量值:
                                    mysql> SHOW GLOBAL VARIABLES LIKE "XXX";
                                    
                            注意:
                                    其中有些參數支持運行時修改,會立即生效;有些參數不支持,且只能通過修改配置文件,並重啓服務器程序生效;
                                    有些參數作用域是全局的,且不可改變;有些可以爲每個用戶提供單獨的設置;
                                    
                                    所以需要對一些重要的參數進行監控。

        
        另外,MySQL有一個性能監控功能,MySQL Performance Schema是一種用於在較低級別監視MySQL實例執行的功能,這些監控數據保存在“performance_schema”數據庫。
                Performance Schema開關變量“performance_schema”:
                        mysql版本<= 5.6.5默認關閉; >=5.6.6默認開啓。
                        如果關閉就沒有“performance_schema”數據庫了,一般也可以減少幾百M內存佔用。
                
                下面列出了每個Performance Schema表,並提供了每個表的簡短描述:
                        accounts    每個客戶帳戶的連接統計
                        cond_instances    同步對象實例
                        events_stages_current    當前的舞臺活動
                        events_stages_history    每個線程最近的階段事件
                        events_stages_history_long    最近的舞臺活動
                        events_stages_summary_by_account_by_event_name    每個帳戶和事件名稱的舞臺活動
                        events_stages_summary_by_host_by_event_name    每個主機名和事件名稱的階段事件
                        events_stages_summary_by_thread_by_event_name    Stage等待每個線程和事件名稱
                        events_stages_summary_by_user_by_event_name    每個用戶名和事件名稱的舞臺事件
                        events_stages_summary_global_by_event_name    舞臺等待每個事件名稱
                        events_statements_current    當前的陳述事件
                        events_statements_history    每個線程最近的語句事件
                        events_statements_history_long    總體上最近的陳述事件
                        events_statements_summary_by_account_by_event_name    每個帳戶和事件名稱的語句事件
                        events_statements_summary_by_digest    每個架構和摘要值的語句事件
                        events_statements_summary_by_host_by_event_name    每個主機名和事件名稱的語句事件
                        events_statements_summary_by_thread_by_event_name    每個線程和事件名稱的語句事件
                        events_statements_summary_by_user_by_event_name    每個用戶名和事件名稱的語句事件
                        events_statements_summary_global_by_event_name    每個事件名稱的語句事件
                        events_waits_current    目前的等待事件
                        events_waits_history    每個線程最近的等待事件
                        events_waits_history_long    最近的等待事件
                        events_waits_summary_by_account_by_event_name    每個帳戶和事件名稱等待事件
                        events_waits_summary_by_host_by_event_name    每個主機名和事件名稱等待事件
                        events_waits_summary_by_instance    每個實例等待事件
                        events_waits_summary_by_thread_by_event_name    每個線程和事件名稱等待事件
                        events_waits_summary_by_user_by_event_name    每個用戶名和事件名稱等待事件
                        events_waits_summary_global_by_event_name    每個事件名稱等待事件
                        file_instances    文件實例
                        file_summary_by_event_name    每個事件名稱的文件事件
                        file_summary_by_instance    每個文件實例的文件事件
                        host_cache    來自內部主機緩存的信息
                        hosts    每個客戶端主機名的連接統計
                        mutex_instances    互斥同步對象實例
                        objects_summary_global_by_type    對象摘要
                        performance_timers    哪些活動計時器可用
                        rwlock_instances    鎖定同步對象實例
                        session_account_connect_attrs    當前會話的每個連接屬性
                        session_connect_attrs    所有會話的連接屬性
                        setup_actors    如何初始化新前臺線程的監視
                        setup_consumers    可以存儲事件信息的消費者
                        setup_instruments    可以收集事件的檢測對象的類
                        setup_objects    應監控哪些對象
                        setup_timers    當前事件計時器
                        socket_instances    活動連接實例
                        socket_summary_by_event_name    套接字等待和每個事件名稱的I / O.
                        socket_summary_by_instance    套接字等待每個實例的I / O.
                        table_io_waits_summary_by_index_usage    表I / O等待每個索引
                        table_io_waits_summary_by_table    表I / O每個表等待
                        table_lock_waits_summary_by_table    表鎖等待每個表
                        threads    有關服務器線程的信息
                        users    每個客戶端用戶名的連接統計        
        
        
        下面我們還是以“SHOW STATUS”命令獲取MySQL實例狀態,“SHOW VARIABLES”命令獲取MySQL實例設置變量來看有哪些重要的監控指標。

1、監控MySQL的哪些指標

        #系統重要指標            
                version
                        mysql版本
                        設置變量
                    
                runTime
                        mysql運行時間(秒)
                        
                        Uptime
                                服務器已啓動的秒數。

        #會話相關

                #、會話連接
                        maxConnections
                                max_connections
                                        variables
                                        最大連接數(max_connections)
                                        mysqld實際上允許 max_connections + 1個客戶端連接。保留額外的連接,以供具有SUPER特權的帳戶使用 。通過將特權授予管理員而不是普通用戶(該用戶不需要),具有PROCESS特權的管理員也 可以連接到服務器並用於SHOW PROCESSLIST診斷問題,即使連接了最大數量的非特權客戶端也是如此。
                                        如果服務器由於max_connections達到限制而拒絕連接 ,則它將增加 Connection_errors_max_connections 狀態變量。    
                        
                        threadsConnected                
                                Threads_connected
                                        當前打開的連接數
                        
                        threadsRunning
                                Threads_running
                                        當前活躍的連接數 : 當前正處於激活狀態的線程個數
                        
                        threadsCreated
                                創建處理連接的線程數
                                計算爲兩次監控間隔時間的增量。
                                
                                Threads_created :
                                        創建用於處理連接的線程數。
                                        如果 Threads_created較大,則可能要增加 thread_cache_size值。
                                        高速緩存未命中率可以計算爲 Threads_created/ Connections。
                                        
                        threadCacheSize
                                最大緩存線程數    
                                thread_cache_size
                                        variables
                                        服務器可以緩存多少線程以供重用。
                                        當客戶端斷開連接時,如果當前線程的少於thread_cache_size線程,則將客戶端的線程放入緩存中。
                                        通過儘可能地重用從緩存中獲取的線程來滿足線程請求,並且僅當緩存爲空時才創建新線程。如果您有很多新連接,則可以增加此變量以提高性能。
                                        通常,如果您具有良好的線程實現,則這不會顯着提高性能。但是,如果您的服務器每秒看到數百個連接,則通常應設置thread_cache_size足夠高,以便大多數新連接使用緩存的線程。
                                        通過檢查Connections和Threads_created狀態變量之間的差異 ,您可以瞭解線程緩存的效率。有關詳細信息,請參見第5.1.9節“服務器狀態變量”。

                                        默認值基於以下公式,上限爲100:
                                                8 + (max_connections / 100)
                                                
                        threadsCached
                                緩存線程數量
                                Threads_cached :
                                        線程緩存中的線程數。
                    
                        threadCacheHitRates
                                線程緩存命中率,範圍0~1。
                                可以計算爲: thread_cache_hit_rate = 1 - Threads_created_increment / Connections_increment
                                Threads_created_increment和Connections_increment表示兩次監控間隔時間的增量
                        
                        connections
                                嘗試連接MySQL次數(成功或失敗)。
                                計算爲兩次監控間隔時間的增量。
                                
                                Connections
                                        與MySQL服務器的連接嘗試次數(成功或失敗)。
                                            
                        abortedClients
                                由於客戶端在未正確關閉連接而中止的連接數
                                
                                Aborted_clients
                                        由於客戶端在未正確關閉連接的情況下死亡而中止的連接數。
                                
                        abortedConnects
                                連接到MySQL的失敗嘗試次數
                                
                                Aborted_connects
                                        連接到MySQL服務器的失敗嘗試次數。請參見第B.4.2.11節“通信錯誤和中止的連接”。
                                        有關其他與連接有關的信息,請檢查Connection_errors_xxx狀態變量和host_cache表格。
                        
                        connectionErrorsInternal
                                由於服務器內部錯誤(例如無法啓動新線程或內存不足情況)而被拒絕的連接數
                                
                                Connection_errors_internal
                                        由於服務器內部錯誤(例如無法啓動新線程或內存不足情況)而被拒絕的連接數。
                                
                        connectionErrorsMaxConnections
                                達到最大連接限制而拒絕的連接數
                                
                                Connection_errors_max_connections
                                        由於max_connections達到服務器限制,拒絕的連接數 。
                                                        
                                Connection_errors_xxx
                                        這些變量提供有關客戶端連接過程中發生的錯誤的信息。它們僅是全局的,代表跨所有主機的連接彙總的錯誤計數。
                                        這些變量跟蹤主機緩存未解決的錯誤(請參見第8.12.5.2節“ DNS查找優化和主機緩存”),例如與TCP連接不相關的錯誤,它們發生在連接過程的早期(甚至更早) IP地址是已知的),或者不是特定於任何特定IP地址的(例如,內存不足的情況)。

                                                Connection_errors_accept
                                                        accept()在偵聽端口上 進行呼叫期間發生的錯誤數 。
                                                Connection_errors_internal
                                                        由於服務器內部錯誤(例如無法啓動新線程或內存不足情況)而被拒絕的連接數。
                                                Connection_errors_max_connections
                                                        由於max_connections達到服務器限制,拒絕的連接數 。
                                                Connection_errors_peer_address
                                                        搜索連接客戶端IP地址時發生的錯誤數。
                                                Connection_errors_select
                                                        呼叫 偵聽端口select()或poll()在偵聽端口上發生的錯誤數 。(此操作失敗不一定表示客戶端連接被拒絕。)
                                                Connection_errors_tcpwrap
                                                        libwrap庫拒絕的連接數


                #、會話流量        
                        bytesReceivedPerSec
                                平均每秒從所有客戶端接收到的字節數,單位B
                                
                                Bytes_received
                                        從所有客戶端收到的字節數。

                        bytesSentPerSec
                                平均每秒發送給所有客戶端的字節數,單位B
                                
                                Bytes_sent
                                        發送給所有客戶端的字節數。

                #、會話操作統計
                        
                        commitCount    
                                提交的操作次數
                                Com_commit
                        
                        rollbackCount
                                回滾的操作次數
                                Com_rollback
                        
                        insertCount        
                                插入的操作次數
                                Com_insert    + Com_insert_select
                                
                                Com_insert_select統計:        
                                        INSERT SELECT FROM
                                                如果您的數據在其他表中已經存在,可以通過INSERT SELECT FROM將數據複製到另外一張表。
                        
                        updateCount                
                                更新的操作次數
                                Com_update + Com_update_multi
                                
                        deleteCount
                                刪除的操作次數
                                Com_delete + Com_delete_multi
                                
                        selectCount
                                查詢的操作次數,不包括從緩存中返回結果的查詢
                                Com_select
                        
                        selectTotalCount
                                查詢的操作次數,包括從緩存中返回結果的查詢
                                selectTotalCount = Com_select + Qcache_hits
                                
                                SELECT 查詢總數由以下公式給出:
                                          Com_select
                                        + Qcache_hits
                                        + queries with errors found by parser
                                        
                                該Com_select值由以下公式給出:
                                          Qcache_inserts
                                        + Qcache_not_cached
                                        + queries with errors found during the column-privileges check
                        tps
                                每秒處理事務數
                                tps = Com_commit/s + Com_rollback/s
                                
                        qps
                                每秒操作數
                                qps = selectTotalCount/s + Com_insert/s + Com_update/s + Com_delete/s
                        
                        
                        相關說明:
                                Com_xxx
                                        Com_xxx語句計數器變量指示每個xxx語句已執行的次數。
                                        每種類型的語句都有一個狀態變量。例如,Com_delete和Com_update分別計數DELETE和UPDATE語句。
                                        Com_delete_multi和Com_update_multi類似,但適用於使用多表語法的DELETE和UPDATE語句。

                                        如果從查詢緩存返回查詢結果,則服務器將遞增Qcache_hits狀態變量,而不是Com_select。請參見第8.10.3.4節“查詢緩存狀態和維護”。

                                        即使準備好的語句參數未知或執行期間發生錯誤,所有Com_stmt_xxx變量也會增加。
                                        換句話說,它們的值對應於發出的請求數,而不是成功完成的請求數。
                                        Com_stmt_xxx狀態變量如下:
                                                Com_stmt_prepare
                                                Com_stmt_execute
                                                Com_stmt_fetch
                                                Com_stmt_send_long_data
                                                Com_stmt_reset
                                                Com_stmt_close

                                        這些變量代表準備好的語句命令。它們的名稱指的是網絡層中使用的COM_xxx命令集。
                                        換句話說,只要執行諸如mysql_stmt_prepare(),mysql_stmt_execute()之類的預備語句API調用,它們的值就會增加。
                                        但是,對於PREPARE,EXECUTE或DEALLOCATE PREPARE,Com_stmt_prepare,Com_stmt_execute和Com_stmt_close也分別增加。
                                        此外,對於PREPARE,EXECUTE和DEALLOCATE PREPARE語句,較舊的語句計數器變量Com_prepare_sql,Com_execute_sql和Com_dealloc_sql的值增加。
                                        Com_stmt_fetch代表從遊標獲取時發出的網絡往返總數。

                                        Com_stmt_reprepare指示在元數據更改語句所引用的表或視圖之後,服務器自動重新準備語句的次數。
                                        reprepare操作會遞增Com_stmt_reprepare以及Com_stmt_prepare。

                                    
        #SQL性能統計相關
                slowQueryCount
                        慢查詢的次數
                        轉增量
                        
                        Slow_queries
                                耗時超過long_query_time秒的查詢數 。無論是否啓用慢查詢日誌,此計數器都會遞增。
                                有關該日誌的信息,請參見 第5.4.5節“慢查詢日誌”。
                
                tableLocksWaited
                        需要等待獲得表鎖的請求次數
                        轉增量
                        
                        Table_locks_waited
                                無法立即授予對錶鎖的請求並需要等待的次數。
                                如果這很高,並且您有性能問題,則應首先優化查詢,然後拆分一個或多個表或使用複製。                            
                
                tableLocksWaitedPercent
                        需要等待獲得表鎖的請求比例
                        
                        tableLocksWaitedPercent = Table_locks_waited / (Table_locks_waited + Table_locks_immediate)
                        
                        Table_locks_immediate
                                可以立即授予對錶鎖定的請求的次數。
                                
                selectScan
                        對第一個表進行完全掃描的聯接數量(全表掃描)
                        轉增量
                            
                        Select_scan
                                對第一個表進行完全掃描的聯接數量
                                
                selectFullJoin
                        由於不使用索引而執行表掃描的聯接數量
                        轉增量
                        
                        Select_full_join
                                由於不使用索引而執行表掃描的聯接數。
                                如果該值不爲0,則應仔細檢查表的索引。

                handlerReadRndPerSec
                        平均每秒基於固定位置讀取行的請求數
                        
                        Handler_read_rnd
                                基於固定位置讀取行的請求數。
                                如果您要執行很多需要對結果進行排序的查詢,則此值很高。
                                您可能有很多查詢需要MySQL掃描整個表,或者您的聯接未正確使用鍵。

                handlerReadRndNextPerSec
                        平均每秒讀取數據文件下一行的請求數
                        
                        Handler_read_rnd_next
                                讀取數據文件下一行的請求數。
                                如果要進行大量表掃描,則此值較高。
                                通常,這表明您的表未正確建立索引,或者未編寫查詢來利用您擁有的索引。
                        
                sortMergePasses
                        排序必須執行合併的次數
                        轉增量
                        
                        Sort_merge_passes
                                排序算法必須執行合併的次數。
                                如果該值很大,則應考慮增加sort_buffer_size系統變量的值。                                        
                
                sortScanPerSec
                        平均每秒通過掃描表完成的排序數量
                        
                        Sort_scan
                                通過掃描表完成的排序次數。
                
                sortRangePerSec
                        平均每秒使用範圍完成的排序數量
                        
                        Sort_range
                                使用ranges完成的排序數量。
                                
                                
        #查詢緩存
                先查詢判斷是否支持查詢緩存,沒有話就沒有這些指標
                        have_query_cache
                                YES如果mysqld支持查詢緩存,NO則不支持。
                                設置變量
                                        
                queryCacheSize
                        查詢緩存空間大小,單位是字節
                        設置變量
                        
                        query_cache_size
                                查詢緩存空間大小。
                
                qcacheFreeMemory
                        查詢緩存可用空間
                        
                        Qcache_free_memory
                                查詢緩存的可用內存量。
                
                qcacheFreePercent
                        查詢緩存空閒率        
                        qcacheFreePercent = qcacheFreeMemory / queryCacheSize
                
                qcacheHitRate
                        查詢緩存命中率
                        qcacheHitRate = Qcache_hits/(Qcache_hits + Com_select)
                        
                        Qcache_hits
                                查詢緩存命中數。
                                
                        SELECT 查詢總數由以下公式給出:
                                  Com_select
                                + Qcache_hits
                                + queries with errors found by parser
                                
                        該Com_select值由以下公式給出:
                                  Qcache_inserts
                                + Qcache_not_cached
                                + queries with errors found during the column-privileges check
                                        
                qcacheInsertsPercent
                        緩存查詢結果的查詢比例
                        qcacheInsertsPercent = Qcache_inserts / (Qcache_inserts + Qcache_not_cached)
                        
                        Qcache_inserts :
                                添加到查詢緩存中的查詢次數。
                                        
                        Qcache_not_cached
                                無法緩存查詢的數量(不可緩存或由於query_cache_type設置而無法緩存)。
                
                qcacheLowmemPrunes
                        由於查詢緩存空間不足而進行LRU內存回收的次數
                        次數過多,增加query_cache_size。
                        增量
                                            
                        Qcache_lowmem_prunes
                                查詢緩存空間不足而進行LRU內存回收的次數。
                                次數過多,增加query_cache_size。
                                                    
                                                                    
        #innodb相關

                #、innodb數據讀寫            
                        innodbDataReadBytesPerSec
                                平均每秒InnoDB讀取的數據量,單位爲B
                                
                                Innodb_data_read
                                        自服務器啓動以來讀取的數據量(以字節爲單位)。
                                        
                        innodbDataWrittenBytesPerSec
                                平均每秒InnoDB寫入的數據量,單位爲B
                                
                                Innodb_data_written
                                        到目前爲止已寫入的數據量(以字節爲單位)。
                        
                        innodbDataReadsPerSec
                                平均每秒InnoDB讀取系統文件的次數
                                
                                Innodb_data_reads
                                        讀取的數據總次數(讀取OS文件)
                                        
                        innodbDataWritesPerSec
                                平均每秒InnoDB寫入系統文件的次數
                                
                                Innodb_data_writes
                                        數據寫入總次數。
                        
                        innodbDataFsyncsPerSec
                                平均每秒InnoDB進行fsync操作的次數
                        
                                Innodb_data_fsyncs
                                        到目前爲止,fsync()操作的數量。 fsync()調用的頻率受innodb_flush_method配置選項的設置影響。

                        innodbDataPendingReads
                                InnoDB當前掛起的讀取數
                                
                                Innodb_data_pending_reads
                                        當前掛起的讀取數。

                        innodbDataPendingWrites
                                InnoDB當前掛起的寫入數
                                
                                Innodb_data_pending_writes
                                        當前掛起的寫入數。
                        
                        innodbDataPendingFsyncs
                                InnoDB當前待處理的fsync操作數
                                
                                Innodb_data_pending_fsyncs
                                        當前待處理的fsync()操作數。 fsync()調用的頻率受innodb_flush_method配置選項的設置影響。
                
                #、innodb行操作統計
                        innodbRowsInsertedPerSec
                                平均每秒插入InnoDB表的行數
                                
                                Innodb_rows_inserted
                                        插入InnoDB表的行數。
                                        
                        innodbRowsDeletedPerSec
                                平均每秒從InnoDB表刪除的行數
                                
                                Innodb_rows_deleted
                                        從InnoDB表中刪除的行數。
                                
                        innodbRowsUpdatedPerSec
                                平均每秒更新InnoDB表的行數
                                
                                Innodb_rows_updated
                                        InnoDB表中更新的行數。
                        
                        innodbRowsReadPerSec
                                平均每秒從InnoDB表讀取的行數
                                
                                Innodb_rows_read
                                        從InnoDB表讀取的行數。
                                
                        
                        innodbRowLockCurrentWaits
                                InnoDB表上的操作當前正在等待的行鎖數
                                
                                Innodb_row_lock_current_waits
                                        InnoDB表上的操作當前正在等待的行鎖數。
                        
                        innodbRowLockwaits
                                InnoDB表上的操作必須等待行鎖的次數
                                增量
                                
                                Innodb_row_lock_waits
                                        InnoDB表上的操作必須等待行鎖定的次數。
                        
                        innodbRowLockTime
                                獲取InnoDB表的行鎖所花費的總時間,以毫秒爲單位
                                增量
                                
                                Innodb_row_lock_time
                                        獲取InnoDB表的行鎖所花費的總時間(以毫秒爲單位)。

                        innodbRowLockTimeAvg
                                獲取InnoDB表的行鎖的平均時間,以毫秒爲單位
                                innodbRowLockTimeAvg增量 = innodbRowLockTime增量 / innodbRowLockwaits增量
                                
                                而不是獲取下面這個,下面這個是統計所有的,不能代表最近一段時間的狀態
                                Innodb_row_lock_time_avg
                                        獲取InnoDB表的行鎖的平均時間,以毫秒爲單位。
                        
                        
                #、innodb緩衝池狀態
                
                        innodbBufferPoolSize
                                InnoDB緩存池最大空間大小,以字節爲單位
                                
                                innodb_buffer_pool_size
                                        mysql配置變量參數。
                                        緩衝池(用於InnoDB緩存表和索引數據的內存區域) 的大小(以字節爲單位) 。
                                
                        innodbBufferPoolBytesData            
                                InnoDB緩存池可緩存數據的空間大小(包括髒頁和乾淨頁),以字節爲單位
                                
                                Innodb_buffer_pool_bytes_data
                                        InnoDB緩衝池中包含數據的字節總數。 該數字包括髒頁和乾淨頁。
                                        與Innodb_buffer_pool_pages_data相比,爲了更準確地計算內存使用量,當壓縮表導致緩衝池保存不同大小的頁面時。
                        
                        innodbBufferPoolBytesDirty
                                InnoDB緩衝池中的髒頁佔用空間,字節
                                
                                Innodb_buffer_pool_bytes_dirty
                                        InnoDB緩衝池中的髒頁中保存的當前字節總數。
                                        與Innodb_buffer_pool_pages_dirty相比,爲了更準確地計算內存使用量,當壓縮表導致緩衝池保存不同大小的頁面時。
                        
                        innodbBufferPoolBytesMisc
                                InnoDB緩衝池中由於分配給管理開銷(例如行鎖或自適應哈希索引)的空間大小,以字節爲單位
                                innodbBufferPoolBytesMisc = Innodb_buffer_pool_pages_misc * Innodb_page_size
                                
                                Innodb_buffer_pool_pages_misc
                                        InnoDB緩衝池中由於分配給管理開銷(例如行鎖或自適應哈希索引)而繁忙的頁面數。
                                        此值也可以計算爲Innodb_buffer_pool_pages_total-Innodb_buffer_pool_pages_free-Innodb_buffer_pool_pages_data。
                                        使用壓縮表時,Innodb_buffer_pool_pages_misc可能會報告超出範圍的值(錯誤#59550)。
                                
                                Innodb_page_size
                                        InnoDB頁面大小(默認爲16KB)。頁面中包含許多內存頁統計值;頁面大小使它們可以輕鬆轉換爲字節。
                        
                        innodbBufferPoolDirtyPercent
                                Innodb緩衝池髒頁空間佔最大空間的比例
                                innodbBufferPoolDirtyPercent = innodbBufferPoolBytesDirty / innodbBufferPoolSize
                                
                        innodbBufferPoolUsedPercent
                                Innodb緩衝池使用率
                                innodbBufferPoolUsedPercent = 1 - Innodb_buffer_pool_pages_free / Innodb_buffer_pool_pages_total
                                
                                Innodb_buffer_pool_pages_total = Innodb_buffer_pool_pages_free + Innodb_buffer_pool_pages_data +  Innodb_buffer_pool_pages_misc
                                
                                Innodb_buffer_pool_pages_total
                                        InnoDB緩衝池的總大小(以頁爲單位)。使用壓縮表時,報告的Innodb_buffer_pool_pages_data值可能大於Innodb_buffer_pool_pages_total(錯誤#59550)

                                Innodb_buffer_pool_pages_free
                                        InnoDB緩衝池中的可用頁數。

                                Innodb_buffer_pool_pages_data
                                        InnoDB緩衝池中包含數據的頁面數。 該數字包括髒頁和乾淨頁。
                                        使用壓縮表時,報告的Innodb_buffer_pool_pages_data值可能大於Innodb_buffer_pool_pages_total(錯誤#59550)。
                                
                                Innodb_buffer_pool_pages_misc
                                        InnoDB緩衝池中由於分配給管理開銷(例如行鎖或自適應哈希索引)而繁忙的頁面數。
                                        此值也可以計算爲Innodb_buffer_pool_pages_total-Innodb_buffer_pool_pages_free-Innodb_buffer_pool_pages_data。
                                        使用壓縮表時,Innodb_buffer_pool_pages_misc可能會報告超出範圍的值(錯誤#59550)。
                                
                                                                                                                                                                                                                                                        
                        innodbBufferPoolReadsPerSec
                                平均每秒Innodb從物理磁盤讀取頁的次數(物理讀次數)
                                
                                Innodb_buffer_pool_reads
                                        InnoDB無法從緩衝池滿足的邏輯讀取數,必須直接從磁盤讀取。
                        
                        innodbBufferPoolReadRequestsPerSec
                                平均每秒從Innodb緩衝池的讀次數(邏輯讀請求數)
                                
                                Innodb_buffer_pool_read_requests
                                        邏輯讀取請求的數量。

                        innodbBufferPoolReadHitRate        
                                Innodb緩衝池的讀取命中率
                                計算最近時間段的:
                                        innodb_buffer_read_hit_rate = 1 - innodbBufferPoolReadsPerSec/innodbBufferPoolReadRequestsPerSec
                                
                                而整體的:
                                        innodb_buffer_read_hit_rate = 1 - Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests
                                                        
                        innodbBufferPoolWriteRequestsPerSec
                                平均每秒對Innodb緩衝池的寫次數
                                            
                                Innodb_buffer_pool_write_requests
                                        對InnoDB緩衝池的寫入次數。
                                        
                        innodbBufferPoolPagesFlushedPerSec
                                平均每秒對Innodb緩存池中刷新頁請求數
                                
                                Innodb_buffer_pool_pages_flushed
                                        從InnoDB緩衝池刷新頁面的請求數。
                        
                        innodbBufferPoolWaitFree
                                Innodb等待可用的乾淨頁面的次數
                                
                                Innodb_buffer_pool_wait_free
                                        通常,對InnoDB緩衝池的寫操作在後臺進行。
                                        當InnoDB需要讀取或創建頁面並且沒有可用的乾淨頁面時,InnoDB首先刷新一些髒頁面並等待該操作完成。
                                        該計數器計算這些等待的次數。如果已經正確設置了innodb_buffer_pool_size,則此值應較小。


        #、key buffer/MyISAM索引緩存
                
                keyBufferSize
                        MyISAM key緩存區空間大小
                        
                        key_buffer_size
                                設置變量
                                MyISAM表的 索引塊被緩衝並由所有線程共享。 key_buffer_size是用於索引塊的緩衝區的大小。密鑰緩衝區也稱爲密鑰緩存。
                
                keyCacheUsedSize
                        MyISAM key緩存已使用空間大小
                        keyCacheUsedSize = key_buffer_size - (Key_blocks_unused * key_cache_block_size)
                
                keyCacheUsedPercent
                        MyISAM key緩存使用率
                        KeyCacheUsedPercent = 1 - ((Key_blocks_unused * key_cache_block_size) / key_buffer_size)
                        
                        key_cache_block_size
                                設置變量            
                                密鑰緩存中塊的大小(以字節爲單位)。默認值爲1024。
                        
                        Key_blocks_unused
                                MyISAM密鑰緩存中未使用的塊數。您可以使用此值來確定正在使用的密鑰緩存數量。    
                
                keyReadRequestsPerSec
                        平均每秒MyISAM key緩存讀請求次數
                        轉化爲增量
                        
                        Key_read_requests
                                從MyISAM密鑰高速緩存中讀取密鑰塊的請求數。
                
                keyReadsPerSec
                        平均每秒從硬盤讀取數據塊到MyISAM key緩存的次數(物理讀)
                        平均每秒從硬盤讀取數據塊到MyISAM key緩存的物理讀取次數
                        轉化爲增量
                        
                        Key_reads
                                從磁盤到MyISAM密鑰高速緩存中的密鑰塊的物理讀取數。
                                如果Key_reads很大,則您的key_buffer_size值可能太小。可以將緩存未命中率計算爲Key_reads / Key_read_requests。
                
                keyReadHitRate        
                        MyISAM key緩存讀取命中率
                        keyReadHitRate = 1 - Key_reads / Key_read_requests
                
                keyWriteRequestPerSec    
                        平均每秒將數據塊寫入到MyISAM key緩存的寫入請求次數
                        轉化爲增量
                        
                        Key_write_requests
                                將密鑰塊寫入MyISAM密鑰高速緩存的請求數。
                
                keyWritesPerSec    
                        平均每秒從MyISAM key緩存寫入到磁盤的寫入次數(物理寫)
                        平均每秒從MyISAM key緩存寫入到磁盤的物理寫入次數
                        轉化爲增量
                        
                        Key_writes
                                從MyISAM密鑰高速緩存到磁盤的密鑰塊的物理寫入次數。        
                
                keyWritesPercent
                        MyISAM key緩存物理寫佔比
                        keyWritesPercent = keyWrites / keyWriteRequest
                        
                        Key_reads/Key_read_requests比率通常應小於0.01。
                        Key_writes/Key_write_requests如果您主要使用更新和刪除操作,則該比率通常接近1;
                        但是如果您傾向於同時影響多個行的更新操作或使用DELAY_KEY_WRITEtable選項,則該比率可能會小得多 。


        #. 臨時表
                createdTmpTables
                        創建內部臨時表的數量(內存或磁盤中)
                        在執行語句時創建的內部臨時表的數量(在內存或磁盤中)
                        增量
                        
                createdTmpTablesPerSec
                        創建內部臨時表的數量(內存或磁盤中)/秒
                        平均每秒在執行語句時創建的內部臨時表的數量(在內存或磁盤中)
                        
                        Created_tmp_tables
                                服務器在執行語句時創建的內部臨時表的數量。(在內存或磁盤中)
                                您可以通過比較Created_tmp_disk_tables和 Created_tmp_tables 變量的值,將創建的內部磁盤臨時表的數量與創建的內部臨時表的總數進行比較 。
                                另請參見第8.4.4節“ MySQL中的內部臨時表使用”。
                                SHOW STATUS語句的 每次調用都使用內部臨時表並增加全局 Created_tmp_tables值。
                
                createdTmpDiskTables
                        創建磁盤臨時表的數量
                        在執行語句時創建磁盤臨時表的數量
                        增量
                        
                createdTmpDiskTablesPerSec
                        創建磁盤臨時表的數量/秒
                        平均每秒在執行語句時創建磁盤臨時表的數量
                        
                        Created_tmp_disk_tables
                                服務器在執行語句時創建的內部磁盤臨時表的數量。
                                如果內部臨時表最初是作爲內存表創建的,但是變得太大,MySQL會自動將其轉換爲磁盤表。
                                內存中臨時表的最大大小爲tmp_table_size和 max_heap_table_size值的最小值 。
                                如果Created_tmp_disk_tables 較大,則可能需要增加 tmp_table_size或 max_heap_table_size值,以減少內存中內部臨時表將轉換爲磁盤表的可能性。
                                您可以通過比較Created_tmp_disk_tables和 Created_tmp_tables 變量的值,將創建的內部磁盤臨時表的數量與創建的內部臨時表的總數進行比較 。
                                另請參見第8.4.4節“ MySQL中的內部臨時表使用”。
                
                createdTmpDiskTablesPercent
                        創建磁盤臨時表的比例
                        在執行語句時創建到磁盤的磁盤臨時表的比例。
                        createdTmpDiskTablesPercent = Created_tmp_disk_tables/Created_tmp_tables
                        
                        比值最好不要超過10%,如果Created_tmp_tables值比較大,可能是排序句子過多或者連接句子不夠優化

        #、打開表的緩存
                openTables
                        當前正在打開的表數量
                        
                        Open_tables
                                打開的表數。(當前)
                
                openedTables
                        打開表的次數
                        轉化爲增量
                        
                        Opened_tables
                                已打開的表數。(計數)
                                如果 Opened_tables太大或迅速增加,您的table_open_cache值可能太小。
                            

        #. 其他
                openFiles:
                        打開的文件數量
                        
                        Open_files
                                打開的文件數。 此計數包括服務器打開的常規文件。
                                它不包括其他類型的文件,例如套接字或管道。 此外,該計數不包括存儲引擎使用其自身內部功能打開的文件,而不是要求服務器級別打開的文件。

                Slave delay: 備庫延遲
                        可以在slave節點上執行show slave status\G命令,Seconds_Behind_Master項的值即爲slave當前的延時量,單位秒。
                        另外可以區分主/從庫角色

2、一目瞭然的MySQL監控的UI界面

3、Python程序獲取MySQL監控狀態       

# -*- coding: utf-8 -*-

import logging
import time
from xxx_utils import erlangutils
from .task import Task
from .task_config import TaskConfig
from erlang_utils.monitor_level import Level
from erlang_message.task_message import TaskMessage
import erlang_utils.mysql_template as mysql_template

logger = logging.getLogger("xxx-monitor")


class MysqlMonitorTask(Task):

    def __init__(self, globalConfig: dict, instanceConfig: dict):
        self.monitorPeriodTimeSec = globalConfig.get('monitorPeriodTimeSec')
        self.enable = globalConfig.get(
            'monitorEnable') & instanceConfig.get('enable')
        self.mysqlId = instanceConfig.get('mysqlid')
        self.mysqlHost = instanceConfig.get('host')
        self.mysqlPort = instanceConfig.get('port')
        self.mysqlUser = instanceConfig.get('user')
        self.mysqlPasswd = instanceConfig.get('passwd')
        self.lastMonitorTimeSec = None
        self.lastMysqlUptime = None
        super(MysqlMonitorTask, self).__init__()

    def get_mysqlid(self):
        return self.mysqlId

    def do_create_config(self):
        return TaskConfig('mysqlinfo', self.monitorPeriodTimeSec, enable=self.enable, level=Level.INFO, description='mysql monitoring(' + self.mysqlId + ')')

    def do_run(self):
        logger.debug(self.mysqlId + ' mysql monitoring task running...')
        conn = None
        cursor = None
        try:
            conn = mysql_template.get_connect(
                self.mysqlHost,  self.mysqlPort,  self.mysqlUser,  self.mysqlPasswd)
            cursor = conn.cursor()

            currentMonitorTimeSec = int(time.time())
            mysqlVariables = mysql_template.get_mysql_variables(cursor)
            mysqlStatus = mysql_template.get_mysql_status(cursor)
            # print(str(mysql_variables))
            # print(str(mysql_status))
            # 服務器已啓動的秒數
            mysqlUptime = mysql_template.get_item_int(mysqlStatus, 'Uptime')

            # 監控程序啓動首次運行,或監控的mysql重啓了
            # 需要重新設置上一次狀態
            if self.lastMysqlUptime is None or self.lastMysqlUptime > mysqlUptime:
                time.sleep(2)
                self.lastMonitorTimeSec = currentMonitorTimeSec
                self.lastMysqlUptime = mysqlUptime
                self.lastMysqlVariables = mysqlVariables
                self.lastMysqlStatus = mysqlStatus

                currentMonitorTimeSec = int(time.time())
                mysqlVariables = mysql_template.get_mysql_variables(cursor)
                mysqlStatus = mysql_template.get_mysql_status(cursor)
                mysqlUptime = mysql_template.get_item_int(
                    mysqlStatus, 'Uptime')

            self.currentMonitorTimeSec = currentMonitorTimeSec
            self.mysqlVariables = mysqlVariables
            self.mysqlStatus = mysqlStatus

            msg = TaskMessage()

            # 系統重要指標
            msg['mysqlid'] = self.mysqlId
            msg['host'] = self.mysqlHost
            msg['port'] = int(self.mysqlPort)
            self._get_mysql_item(msg, 'version', mysqlVariables, 'version')
            self._get_mysql_item_int(msg, 'runTime', mysqlStatus, 'Uptime')

            # 會話連接指標
            self._get_mysql_item_int(
                msg, 'maxConnections', mysqlVariables, 'max_connections')
            self._get_mysql_item_int(
                msg, 'threadCacheSize', mysqlVariables, 'thread_cache_size')

            self._get_mysql_status_item_increment(
                msg, 'connections', 'Connections')
            self._get_mysql_item_int(
                msg, 'threadsConnected', mysqlStatus, 'Threads_connected')
            self._get_mysql_item_int(
                msg, 'threadsRunning', mysqlStatus, 'Threads_running')
            self._get_mysql_item_int(
                msg, 'threadsCached', mysqlStatus, 'Threads_cached')
            self._get_mysql_status_item_increment(
                msg, 'threadsCreated', 'Threads_created')

            connectionsIncrement = self._return_mysql_status_item_increment(
                'Connections')
            threadsCreatedIncrement = self._return_mysql_status_item_increment(
                'Threads_created')
            if connectionsIncrement is not None and threadsCreatedIncrement is not None:
                if connectionsIncrement > 0 and threadsCreatedIncrement > 0:
                    msg['threadCacheHitRates'] = erlangutils.math_1MinusDivision(
                        threadsCreatedIncrement, connectionsIncrement)
                else:
                    msg['threadCacheHitRates'] = 1

            self._get_mysql_status_item_increment(
                msg, 'abortedClients', 'Aborted_clients')
            self._get_mysql_status_item_increment(
                msg, 'abortedConnects', 'Aborted_connects')
            self._get_mysql_status_item_increment(
                msg, 'connectionErrorsInternal', 'Connection_errors_internal')
            self._get_mysql_status_item_increment(
                msg, 'connectionErrorsMaxConnections', 'Connection_errors_max_connections')

            # 會話流量指標
            self._get_mysql_status_item_rates(
                msg, 'bytesReceivedPerSec', 'Bytes_received')
            self._get_mysql_status_item_rates(
                msg, 'bytesSentPerSec', 'Bytes_sent')

            # 會話操作統計指標
            self._get_mysql_status_item_increment(
                msg, 'commitCount', 'Com_commit')
            self._get_mysql_status_item_increment(
                msg, 'rollbackCount', 'Com_rollback')
            insertIncrement = self._return_mysql_status_item_increment(
                'Com_insert')
            insertSelectIncrement = self._return_mysql_status_item_increment(
                'Com_insert_select')
            msg['insertCount'] = insertIncrement + insertSelectIncrement
            updateIncrement = self._return_mysql_status_item_increment(
                'Com_update')
            updateMultiIncrement = self._return_mysql_status_item_increment(
                'Com_update_multi')
            msg['updateCount'] = updateIncrement + updateMultiIncrement
            deleteIncrement = self._return_mysql_status_item_increment(
                'Com_delete')
            deleteMultiSelectIncrement = self._return_mysql_status_item_increment(
                'Com_delete_multi')
            msg['deleteCount'] = deleteIncrement + deleteMultiSelectIncrement
            self._get_mysql_status_item_increment(
                msg, 'selectCount', 'Com_select')
            Qcache_hits = self._return_mysql_status_item_increment(
                'Qcache_hits')
            if Qcache_hits is not None:
                msg['selectTotalCount'] = msg['selectCount'] + Qcache_hits
            else:
                msg['selectTotalCount'] = msg['selectCount']
            msg['tps'] = erlangutils.math_division((msg['commitCount'] + msg['rollbackCount']),
                                                   (currentMonitorTimeSec - self.lastMonitorTimeSec))
            msg['qps'] = erlangutils.math_division((msg['selectTotalCount'] + msg['insertCount'] + msg['updateCount'] + msg['deleteCount']),
                                                   (currentMonitorTimeSec - self.lastMonitorTimeSec))

            # 查詢緩存
            # 先查詢判斷是否支持查詢緩存,沒有話就沒有這些指標
            haveQueryCache = mysql_template.get_item_boolean(
                mysqlVariables, 'have_query_cache')
            if haveQueryCache is not None and haveQueryCache is True:
                self._get_mysql_item_int(
                    msg, 'queryCacheSize', mysqlVariables, 'query_cache_size')
                self._get_mysql_item_int(
                    msg, 'qcacheFreeMemory', mysqlStatus, 'Qcache_free_memory')
                if msg['qcacheFreeMemory'] > 0 and msg['queryCacheSize'] > 0:
                    msg['qcacheFreePercent'] = erlangutils.math_division(
                        msg['qcacheFreeMemory'], msg['queryCacheSize'])
                else:
                    msg['qcacheFreePercent'] = 0
                Qcache_hits = self._return_mysql_status_item_increment(
                    'Qcache_hits')
                Com_select = self._return_mysql_status_item_increment(
                    'Com_select')
                if Qcache_hits > 0 or Com_select > 0:
                    msg['qcacheHitRate'] = erlangutils.math_division(
                        Qcache_hits, (Qcache_hits + Com_select))
                else:
                    msg['qcacheHitRate'] = 1
                Qcache_inserts = self._return_mysql_status_item_increment(
                    'Qcache_inserts')
                Qcache_not_cached = self._return_mysql_status_item_increment(
                    'Qcache_not_cached')
                if Qcache_inserts > 0 or Qcache_not_cached > 0:
                    msg['qcacheInsertsPercent'] = erlangutils.math_division(
                        Qcache_inserts, (Qcache_inserts + Qcache_not_cached))
                else:
                    msg['qcacheInsertsPercent'] = 1
                self._get_mysql_status_item_increment(
                    msg, 'qcacheLowmemPrunes', 'Qcache_lowmem_prunes')

            # SQL性能統計相關
            self._get_mysql_status_item_increment(
                msg, 'slowQueryCount', 'Slow_queries')
            self._get_mysql_status_item_increment(
                msg, 'selectScan', 'Select_scan')
            self._get_mysql_status_item_increment(
                msg, 'selectFullJoin', 'Select_full_join')
            self._get_mysql_status_item_rates(
                msg, 'handlerReadRndPerSec', 'Handler_read_rnd')
            self._get_mysql_status_item_rates(
                msg, 'handlerReadRndNextPerSec', 'Handler_read_rnd_next')
            self._get_mysql_status_item_increment(
                msg, 'sortMergePasses', 'Sort_merge_passes')
            self._get_mysql_status_item_rates(
                msg, 'sortScanPerSec', 'Sort_scan')
            self._get_mysql_status_item_rates(
                msg, 'sortRangePerSec', 'Sort_range')
            self._get_mysql_status_item_increment(
                msg, 'tableLocksWaited', 'Table_locks_waited')
            Table_locks_immediate = self._return_mysql_status_item_increment(
                'Table_locks_immediate')
            if msg['tableLocksWaited'] > 0:
                msg['tableLocksWaitedPercent'] = erlangutils.math_division(
                    msg['tableLocksWaited'], (msg['tableLocksWaited'] + Table_locks_immediate))
            else:
                msg['tableLocksWaitedPercent'] = 0

            # innodb數據讀寫
            self._get_mysql_status_item_rates(
                msg, 'innodbDataReadBytesPerSec', 'Innodb_data_read')
            self._get_mysql_status_item_rates(
                msg, 'innodbDataWrittenBytesPerSec', 'Innodb_data_written')
            self._get_mysql_status_item_rates(
                msg, 'innodbDataReadsPerSec', 'Innodb_data_reads')
            self._get_mysql_status_item_rates(
                msg, 'innodbDataWritesPerSec', 'Innodb_data_writes')
            self._get_mysql_status_item_rates(
                msg, 'innodbDataFsyncsPerSec', 'Innodb_data_fsyncs')
            self._get_mysql_item_int(
                msg, 'innodbDataPendingReads', mysqlStatus, 'Innodb_data_pending_reads')
            self._get_mysql_item_int(
                msg, 'innodbDataPendingWrites', mysqlStatus, 'Innodb_data_pending_writes')
            self._get_mysql_item_int(
                msg, 'innodbDataPendingFsyncs', mysqlStatus, 'Innodb_data_pending_fsyncs')

            # innodb行操作統計
            self._get_mysql_status_item_rates(
                msg, 'innodbRowsDeletedPerSec', 'Innodb_rows_deleted')
            self._get_mysql_status_item_rates(
                msg, 'innodbRowsInsertedPerSec', 'Innodb_rows_inserted')
            self._get_mysql_status_item_rates(
                msg, 'innodbRowsReadPerSec', 'Innodb_rows_read')
            self._get_mysql_status_item_rates(
                msg, 'innodbRowsUpdatedPerSec', 'Innodb_rows_updated')
            self._get_mysql_status_item_rates(
                msg, 'innodbDataFsyncsPerSec', 'Innodb_data_fsyncs')
            self._get_mysql_item_int(
                msg, 'innodbRowLockCurrentWaits', mysqlStatus, 'Innodb_row_lock_current_waits')
            self._get_mysql_status_item_increment(
                msg, 'innodbRowLockwaits', 'Innodb_row_lock_waits')
            self._get_mysql_status_item_increment(
                msg, 'innodbRowLockTime', 'Innodb_row_lock_time')
            if msg['innodbRowLockwaits'] > 0 and msg['innodbRowLockTime'] > 0:
                msg['innodbRowLockTimeAvg'] = erlangutils.math_division(msg['innodbRowLockTime'],
                                                                        msg['innodbRowLockwaits'])
            else:
                msg['innodbRowLockTimeAvg'] = 0

            # innodb緩衝池狀態
            self._get_mysql_item_int(
                msg, 'innodbBufferPoolSize', mysqlVariables, 'innodb_buffer_pool_size')
            self._get_mysql_item_int(
                msg, 'innodbBufferPoolBytesData', mysqlStatus, 'Innodb_buffer_pool_bytes_data')
            self._get_mysql_item_int(
                msg, 'innodbBufferPoolBytesDirty', mysqlStatus, 'Innodb_buffer_pool_bytes_dirty')
            innodbPageSize = mysql_template.get_item_int(
                mysqlStatus, 'Innodb_page_size')
            if msg['innodbBufferPoolBytesData'] is None:
                Innodb_buffer_pool_pages_data = mysql_template.get_item_int(
                    mysqlStatus, 'Innodb_buffer_pool_pages_data')
                msg['innodbBufferPoolBytesData'] = Innodb_buffer_pool_pages_data * \
                    innodbPageSize
            if msg['innodbBufferPoolBytesDirty'] is None:
                Innodb_buffer_pool_pages_dirty = mysql_template.get_item_int(
                    mysqlStatus, 'Innodb_buffer_pool_pages_dirty')
                msg['innodbBufferPoolBytesDirty'] = Innodb_buffer_pool_pages_dirty * innodbPageSize
            innodbBufferPoolPagesMisc = mysql_template.get_item_int(
                mysqlStatus, 'Innodb_buffer_pool_pages_misc')
            msg['innodbBufferPoolBytesMisc'] = innodbBufferPoolPagesMisc * \
                innodbPageSize
            innodbBufferPoolPagesTotal = mysql_template.get_item_int(
                mysqlStatus, 'Innodb_buffer_pool_pages_total')
            innodbBufferPoolPagesFree = mysql_template.get_item_int(
                mysqlStatus, 'Innodb_buffer_pool_pages_free')
            msg['innodbBufferPoolDirtyPercent'] = erlangutils.math_division(msg['innodbBufferPoolBytesDirty'],
                                                                            msg['innodbBufferPoolSize'])
            msg['innodbBufferPoolUsedPercent'] = erlangutils.math_1MinusDivision(
                innodbBufferPoolPagesFree, innodbBufferPoolPagesTotal)
            self._get_mysql_status_item_rates(
                msg, 'innodbBufferPoolReadsPerSec', 'Innodb_buffer_pool_reads')
            self._get_mysql_status_item_rates(
                msg, 'innodbBufferPoolReadRequestsPerSec', 'Innodb_buffer_pool_read_requests')
            if msg['innodbBufferPoolReadRequestsPerSec'] is not None and msg['innodbBufferPoolReadRequestsPerSec'] > 0:
                msg['innodbBufferPoolReadHitRate'] = erlangutils.math_1MinusDivision(
                    msg['innodbBufferPoolReadsPerSec'], msg['innodbBufferPoolReadRequestsPerSec'])
            else:
                msg['innodbBufferPoolReadHitRate'] = 1
            self._get_mysql_status_item_rates(
                msg, 'innodbBufferPoolWriteRequestsPerSec', 'Innodb_buffer_pool_write_requests')
            self._get_mysql_status_item_rates(
                msg, 'innodbBufferPoolPagesFlushedPerSec', 'Innodb_buffer_pool_pages_flushed')
            self._get_mysql_status_item_increment(
                msg, 'innodbBufferPoolWaitFree', 'Innodb_buffer_pool_wait_free')

            # key buffer/MyISAM索引緩存
            self._get_mysql_item_int(
                msg, 'keyBufferSize', mysqlVariables, 'key_buffer_size')
            KeyBlocksUnused = mysql_template.get_item_int(
                mysqlStatus, 'Key_blocks_unused')
            keyCacheBlockSize = mysql_template.get_item_int(
                mysqlVariables, 'key_cache_block_size')
            msg['keyCacheUsedSize'] = msg['keyBufferSize'] - \
                (KeyBlocksUnused * keyCacheBlockSize)
            msg['keyCacheUsedPercent'] = erlangutils.math_1MinusDivision(
                (KeyBlocksUnused * keyCacheBlockSize), msg['keyBufferSize'])
            self._get_mysql_status_item_rates(
                msg, 'keyReadRequestsPerSec', 'Key_read_requests')
            self._get_mysql_status_item_rates(
                msg, 'keyReadsPerSec', 'Key_reads')
            if msg['keyReadsPerSec'] > 0 and msg['keyReadRequestsPerSec'] > 0:
                msg['keyReadHitRate'] = erlangutils.math_1MinusDivision(
                    msg['keyReadsPerSec'], msg['keyReadRequestsPerSec'])
            else:
                msg['keyReadHitRate'] = 1
            self._get_mysql_status_item_rates(
                msg, 'keyWriteRequestPerSec', 'Key_write_requests')
            self._get_mysql_status_item_rates(
                msg, 'keyWritesPerSec', 'Key_writes')
            if msg['keyWritesPerSec'] > 0 and msg['keyWriteRequestPerSec'] > 0:
                msg['keyWritesPercent'] = erlangutils.math_division(
                    msg['keyWritesPerSec'], msg['keyWriteRequestPerSec'])
            else:
                msg['keyWritesPercent'] = 0

            # 臨時表
            self._get_mysql_status_item_increment(
                msg, 'createdTmpTables', 'Created_tmp_tables')
            self._get_mysql_status_item_rates(
                msg, 'createdTmpTablesPerSec', 'Created_tmp_tables')
            self._get_mysql_status_item_increment(
                msg, 'createdTmpDiskTables', 'Created_tmp_disk_tables')
            self._get_mysql_status_item_rates(
                msg, 'createdTmpDiskTablesPerSec', 'Created_tmp_disk_tables')
            if msg['createdTmpDiskTables'] > 0 and msg['createdTmpTables'] > 0:
                msg['createdTmpDiskTablesPercent'] = erlangutils.math_division(
                    msg['createdTmpDiskTables'], msg['createdTmpTables'])
            else:
                msg['createdTmpDiskTablesPercent'] = 0

            # 打開表的緩存
            self._get_mysql_item_int(
                msg, 'openTables', mysqlStatus, 'Open_tables')
            self._get_mysql_status_item_increment(
                msg, 'openedTables', 'Opened_tables')

            # 其他
            self._get_mysql_item_int(
                msg, 'openFiles', mysqlStatus, 'Open_files')

            self.lastMonitorTimeSec = currentMonitorTimeSec
            self.lastMysqlUptime = mysqlUptime
            self.lastMysqlVariables = mysqlVariables
            self.lastMysqlStatus = mysqlStatus
            return msg
        except Exception:
            logger.exception(self.mysqlId + ' mysql monitoring task error!')
        finally:
            if cursor is not None:
                cursor.close()
            if conn is not None:
                conn.close()

    def _get_mysql_item(self, msg, keyName, mysqlInfo, itemName):
        value = mysql_template.get_item(mysqlInfo, itemName)
        if value is not None:
            msg[keyName] = value

    def _get_mysql_item_int(self, msg, keyName, mysqlInfo, itemName):
        value = mysql_template.get_item_int(mysqlInfo, itemName)
        if value is not None:
            msg[keyName] = value

    def _get_mysql_item_boolean(self, msg, keyName, mysqlInfo, itemName):
        value = mysql_template.get_item_boolean(mysqlInfo, itemName)
        if value is not None:
            msg[keyName] = value

    def _return_mysql_status_item_increment(self, itemName):
        lastValue = mysql_template.get_item_int(self.lastMysqlStatus, itemName)
        value = mysql_template.get_item_int(self.mysqlStatus, itemName)
        if lastValue is not None and value is not None:
            return value - lastValue

    def _get_mysql_status_item_increment(self, msg, keyName, itemName):
        lastValue = mysql_template.get_item_int(self.lastMysqlStatus, itemName)
        value = mysql_template.get_item_int(self.mysqlStatus, itemName)
        if lastValue is not None and value is not None:
            msg[keyName] = value - lastValue

    def _get_mysql_status_item_rates(self, msg, keyName, itemName):
        lastValue = mysql_template.get_item_int(self.lastMysqlStatus, itemName)
        value = mysql_template.get_item_int(self.mysqlStatus, itemName)
        if lastValue is not None and value is not None:
            msg[keyName] = round((value - lastValue) / (
                self.currentMonitorTimeSec - self.lastMonitorTimeSec), 2)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章