日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于监控服务器指标、CPU、内存、警报的一些解决方案

發(fā)布時(shí)間:2024/3/13 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于监控服务器指标、CPU、内存、警报的一些解决方案 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 關(guān)于監(jiān)控服務(wù)器指標(biāo)、CPU、內(nèi)存、警報(bào)的一些解決方案
    • `Prometheus` + `Grafana` 配置 `IRIS` / `Caché` 監(jiān)控服務(wù)器
      • `Prometheus`
        • 簡介
        • 特點(diǎn)
        • 架構(gòu)圖
      • `Grafana`
        • 簡介
        • 特點(diǎn)
      • 配置流程
    • 自定義`Prometheus`接口定義
    • 配置 `Exporter` 監(jiān)控服務(wù)器系統(tǒng)資源
      • 簡介
      • 配置流程
    • 使用 `Alertmanager`報(bào)警
      • 簡介
      • 配置流程
    • 基于`M`實(shí)現(xiàn)監(jiān)控服務(wù)器,并用郵件報(bào)警
      • 解析`Prometheus`數(shù)據(jù)接口信息
      • 使用嵌入式`Python`方式獲取系統(tǒng)`CPU`、內(nèi)存等
        • `python`模塊之`psutil`詳解
          • `CPU`相關(guān)
          • `Memory`內(nèi)存相關(guān)
          • `Disk`相關(guān)
          • `Network`相關(guān)
          • `Process`相關(guān)
        • 通過嵌入式`Python`調(diào)用`psutil`庫
      • 使用郵件發(fā)送報(bào)警信息
        • 使用`M`發(fā)送郵件發(fā)送消息
        • 通過配置文件`csv`文件,來獲取維護(hù)指標(biāo),進(jìn)行郵件報(bào)警。
    • 總結(jié)
    • 思考

關(guān)于監(jiān)控服務(wù)器指標(biāo)、CPU、內(nèi)存、警報(bào)的一些解決方案

本文章主要介紹以下幾個(gè)章節(jié)內(nèi)容:

  • Prometheus + Grafana 配置 IRIS / Caché 監(jiān)控服務(wù)器
  • 自定義Prometheus接口定義 - 配置 Caché 監(jiān)控服務(wù)
  • 配置 Exporter 監(jiān)控服務(wù)器系統(tǒng)資源
  • 使用 Alertmanager報(bào)警
  • 基于M實(shí)現(xiàn)監(jiān)控服務(wù)器,并用郵件報(bào)警
    • 解析Prometheus數(shù)據(jù)接口信息
    • 使用嵌入式Python方式獲取系統(tǒng)CPU、內(nèi)存等
    • 使用郵件發(fā)送報(bào)警信息

Prometheus + Grafana 配置 IRIS / Caché 監(jiān)控服務(wù)器

首先我們介紹一下如何用IRIS結(jié)合Prometheus + Grafana的使用,在介紹如何配置之前我們先了簡單了解一下工具。

Prometheus

簡介

Prometheus是一個(gè)最初在SoundCloud上構(gòu)建的開源系統(tǒng)監(jiān)視和警報(bào)工具包 。 自2012年成立以來,許多公司和組織都采用了Prometheus,該項(xiàng)目擁有一個(gè)非常活躍的開發(fā)人員和用戶社區(qū)。它現(xiàn)在是一個(gè)獨(dú)立的開源項(xiàng)目,可以獨(dú)立于任何公司進(jìn)行維護(hù)。為了強(qiáng)調(diào)這一點(diǎn),并澄清項(xiàng)目的治理結(jié)構(gòu),Prometheus 于2016年加入 云計(jì)算本地計(jì)算基金會(huì),作為繼Kubernetes之后的第二個(gè)托管項(xiàng)目。

特點(diǎn)

  • 具有由度量名稱和鍵/值對標(biāo)識的時(shí)間序列數(shù)據(jù)的多維數(shù)據(jù)模型。
  • 一個(gè)靈活的查詢語言 來利用這一維度。
  • 不依賴分布式存儲(chǔ),單個(gè)服務(wù)器節(jié)點(diǎn)是自治的。
  • 時(shí)間序列收集通過 HTTP 上的拉模型發(fā)生。
  • 通過中間網(wǎng)關(guān)支持推送時(shí)間序列。
  • 通過服務(wù)發(fā)現(xiàn)或靜態(tài)配置發(fā)現(xiàn)目標(biāo)。
  • 多種圖形和儀表板支持模式。

架構(gòu)圖

Grafana

簡介

Grafana是一個(gè)跨平臺(tái)的開源的度量分析和可視化工具,可以通過將采集的數(shù)據(jù)查詢?nèi)缓罂梢暬恼故?#xff0c;并及時(shí)通知。

特點(diǎn)

  • 展示方式:快速靈活的客戶端圖表,面板插件有許多不同方式的可視化指標(biāo)和日志,官方庫中具有豐富的儀表盤插件,比如熱圖、折線圖、圖表等多種展示方式。
  • 支持多種數(shù)據(jù)源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等。
  • 通知提醒:以可視方式定義最重要指標(biāo)的警報(bào)規(guī)則,Grafana將不斷計(jì)算并發(fā)送通知,在數(shù)據(jù)達(dá)到閾值時(shí)通過Slack、PagerDuty等獲得通知。
  • 混合展示:在同一圖表中混合使用不同的數(shù)據(jù)源,可以基于每個(gè)查詢指定數(shù)據(jù)源,甚至自定義數(shù)據(jù)源。
  • 注釋:使用來自不同數(shù)據(jù)源的豐富事件注釋圖表,將鼠標(biāo)懸停在事件上會(huì)顯示完整的事件元數(shù)據(jù)和標(biāo)記。
  • 過濾器:Ad-hoc過濾器允許動(dòng)態(tài)創(chuàng)建新的鍵/值過濾器,這些過濾器會(huì)自動(dòng)應(yīng)用于使用該數(shù)據(jù)源的所有查詢。

配置流程

  • 下載Prometheus,選擇操作系統(tǒng),下載對應(yīng)安裝包,以windows為例。
    • 下載地址:https://prometheus.io/download/

  • 下載完成后,直接解壓在所需目錄即可。解壓后進(jìn)入目錄直接運(yùn)行premetheus.exe,prometheus默認(rèn)端口為9090。
  • 在瀏覽器輸入地址、即可查看監(jiān)控頁面。
    • 地址 - http://localhost:9090/

  • 配置監(jiān)控服務(wù)器信息,編輯 prometheus-2.27.1.windows-amd64/prometheus.yml文件。在scrape_configs:輸入以下代碼:
    • 這里以我的私有服務(wù)器地址為例:https://8.142.29.250:2443/api/monitor/metrics。
  • 輸入以下代碼:

    - job_name: "250-IRIS"metrics_path: /api/monitor/metricsscheme: httpstls_config:insecure_skip_verify: truestatic_configs:- targets: ['8.142.29.250:2443']

    其中:

    • job_name - 服務(wù)器名稱。
    • metrics_path - 監(jiān)控服務(wù)器地址路徑。
    • scheme - 網(wǎng)絡(luò)協(xié)議。
    • tls_config - insecure_skip_verify - 過濾完成驗(yàn)證。
    • static_configs - targets - IP端口號。
  • prometheus.yml文件修改完成后,重新啟動(dòng)prometheus.exe程序,進(jìn)入到Status->Targets下,即可看到添加的監(jiān)控服務(wù)器信息;
  • 監(jiān)控具體指標(biāo),點(diǎn)擊Graph->勾選UseLocalime->輸入監(jiān)控指標(biāo)iris_cpu_usage->點(diǎn)擊Excute->選擇監(jiān)控時(shí)長范圍30min。
    • iris_cpu_usage - 代表CPU使用率。

    說明:這里監(jiān)控指標(biāo)為服務(wù)器接口里的具體指標(biāo),輸入接口地址具體查看。

  • 由于Prometheus展示的信息相對簡單,圖表類型也比較少,下面介紹如何使用Grafana展示數(shù)據(jù)。輸入Grafana地址,下載對應(yīng)版本。
    • 下載地址:https://grafana.com/grafana/download?

  • 下載后直接運(yùn)行安裝,安裝完成后進(jìn)入grafana/bin目錄下,雙擊運(yùn)行g(shù)arafana-server.exe。
    • garafana默認(rèn)端口為3030
    • 訪問地址:http://localhost:3000/
    • 默認(rèn)用戶名密碼admin/admin
  • 在grafana里添加數(shù)據(jù)源Data Source。
  • 選擇Prometheus。
  • 填寫數(shù)據(jù)源信息,并保存。
    • Name - Prometheus
    • Url - http://localhost:9090

    • 點(diǎn)擊Save&test顯示測試成功。

  • 創(chuàng)建模版,點(diǎn)擊Dashboards->點(diǎn)擊Browse->輸入模版名稱->New->NewDashboard。
  • 點(diǎn)擊Add a new panel。
  • 選擇數(shù)據(jù)源Data source,指標(biāo)iris_cpu_usage -> Run query。
    • Title - 修改儀表盤名稱。

  • 輸入儀表盤名稱,點(diǎn)擊保存即可。
  • 最終效果,依次類推建立多個(gè)監(jiān)控指標(biāo)。
    • iris_csp_sessions - 會(huì)話使用數(shù)
    • iris_cpu_usage - cpu使用率
    • iris_system_alerts - 系統(tǒng)警報(bào)數(shù)
    • iris_process_count - 進(jìn)程數(shù)量
    • iris_glo_ref_per_sec - Global每秒引用數(shù)量

    自定義Prometheus接口定義

    那么我們是否可以自定義Prometheus接口呢?

    答案肯定是可以的,整好 Caché 沒有自帶的監(jiān)控服務(wù),所以我們給Caché 自定義個(gè)一個(gè)監(jiān)控服務(wù)接口。

  • 首先我們需要?jiǎng)?chuàng)建一個(gè)Rest接口類M.Metrics。
  • Class M.Metrics Extends %CSP.REST { }
  • 在Portal中配置Rest接口,系統(tǒng)->安全管理->Web應(yīng)用程序->編輯Web引用程序。
    • 名稱 - /api/metrics
    • 命名空間 - 選擇Rest接口類所在命名空間
    • 分派類 - M.Metrics

  • 編寫Rest接口邏輯,下面展示主要業(yè)務(wù)邏輯代碼。
    • 基礎(chǔ)儀表盤接口
    ClassMethod GetDashboardMetrics(ByRef array As %DynamicArray) As %Status {s dashboard = ##class(SYS.Stats.Dashboard).Sample()s properties = ##class(%Dictionary.ClassDefinition).%OpenId(dashboard.%ClassName(1)).Propertiesfor i = 1 : 1 : properties.Count() {s property = properties.GetAt(i)s propertyName = property.Names propertyValue = $property(dashboard, propertyName)if ((propertyValue '= "") && ('$match(propertyValue, ".*[-A-Za-z ]+.*"))) {s metricsName = ..CamelCase2Underscore(propertyName)s metricsValue = propertyValues obj = {}s obj.key = metricsNames obj.val = metricsValued array.%Push(obj)}}q $$$OK }
    • 系統(tǒng)使用情況
    d ##class(SYS.Metrics).GetMainMetrics(""0.pValues, .pStatus, .pMsg)
    • 系統(tǒng)監(jiān)視器統(tǒng)計(jì)
    d ##class(SYS.Metrics).GetGlobalStatistics(""0.pValues, .pStatus, .pMsg)
    • ECP 數(shù)據(jù)統(tǒng)計(jì)
    d ##class(SYS.Metrics).GetECPStatistics(""0.pValues, .pStatus, .pMsg)
    • 磁盤和緩沖區(qū)數(shù)據(jù)統(tǒng)計(jì)
    d ##class(SYS.Metrics).GetStatistics(""0.pValues,.pStatus,.pMsg)
    • 許可數(shù)據(jù)統(tǒng)計(jì)
    ClassMethod GetLicenseStatistics(ByRef array As %DynamicArray) {s licenseUsed = ##class(%SYSTEM.License).LUConsumed()s obj = {}s obj.key = ..#PREFIX _ "_license_used"s obj.val = licenseUsedd array.%Push(obj)s licenseAvailable=##class(%SYSTEM.License).LUAvailable()s obj = {}s obj.key = ..#PREFIX _ "_license_avail"s obj.val = licenseAvailabled array.%Push(obj)s licenseTotal=##class(%SYSTEM.License).GetUserLimit()s obj = {}s obj.key = ..#PREFIX _ "_license_total"s obj.val = licenseTotald array.%Push(obj)s obj = {}s obj.key =..#PREFIX _ "_license_load"s obj.val = $fn((licenseUsed / (licenseAvailable + licenseUsed))"N""4")d array.%Push(obj) }
    • 開放性事務(wù)數(shù)據(jù)統(tǒng)計(jì)
    ClassMethod GetOpenTransactionStatistics(ByRef array As %DynamicArray) {if ($zv [ "Cache") {s index = "^CacheTemp.SysMetrics"} else {s index = "^IRIS.Temp.SysMetrics"}if (@index@("Transactions")) = "OK" {s val = 1} else {s val = 0}s obj = {}s obj.key = ..#PREFIX _ "_open_transaction"s obj.val = vald array.%Push(obj) }
    • 數(shù)據(jù)庫情況
    ClassMethod GetDatabaseStatistics(ByRef array As %DynamicArray) {s statement = ##class(%SQL.Statement).%New()s sc = statement.%PrepareClassQuery("%SYS.DatabaseQuery""FreeSpace")s rs = statement.%Execute()while (rs.%Next()) {s databaseName = rs.%Get("DatabaseName")s freeRate = rs.%GetData(7)s availableNum = rs.%Get("AvailableNum")s diskFreeSpaceNum = rs.%Get("DiskFreeSpaceNum")s obj = {}s obj.key =..#PREFIX _ "_database_free"s obj.val = (100 - freeRate) / 100s tag = {}s tag.id = databaseNames obj.tag = tagd array.%Push(obj)} }
    • 把所有數(shù)據(jù)組裝到一起。
    ClassMethod GetMetrics() {s array = []#; 基礎(chǔ)儀表盤d ..GetDashboardMetrics(.array)#; 系統(tǒng)使用情況d ##class(SYS.Metrics).GetMainMetrics(""0.pValues, .pStatus, .pMsg)d ..ParseJson(.pValues, .array)#; 系統(tǒng)監(jiān)視器統(tǒng)計(jì)d ##class(SYS.Metrics).GetGlobalStatistics(""0.pValues, .pStatus, .pMsg)d ..ParseJson(.pValues, .array)#; ECP 數(shù)據(jù)統(tǒng)計(jì)d ##class(SYS.Metrics).GetECPStatistics(""0.pValues, .pStatus, .pMsg)d ..ParseJson(.pValues, .array)#; 磁盤和緩沖區(qū)數(shù)據(jù)統(tǒng)計(jì)d ##class(SYS.Metrics).GetStatistics(""0.pValues,.pStatus,.pMsg)d ..ParseJson(.pValues, .array)#; 許可數(shù)據(jù)統(tǒng)計(jì)d ..GetLicenseStatistics(.array)#; 開放性事務(wù)數(shù)據(jù)統(tǒng)計(jì)d ..GetOpenTransactionStatistics(.array)#; 數(shù)據(jù)庫情況d ..GetDatabaseStatistics(.array)q array }
    • 將數(shù)據(jù)解析成Prometheus數(shù)據(jù)格式。

    prometheus將所有數(shù)據(jù)保存為timeseries data,用metric name和label區(qū)分,label是在metric name上的更細(xì)維度的劃分,其中的每一個(gè)實(shí)例是由一個(gè)float64和timestamp組成,只不過timestamp是隱式加上去的,#HELP代表指標(biāo)的注釋信息,#TYPE用于定義樣本的類型注釋信息。如下示例:

    # HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles. # TYPE go_gc_duration_seconds summary go_gc_duration_seconds{quantile="0"} 0
    • metrics name - 為go_gc_duration_seconds
    • label - 為quantile="0"
    • float64 - 為0
    ClassMethod Metrics2Prometheus() As %Status {s %response.ContentType = "text/plain;version=0.0.4;charset=utf-8"s array = ..GetMetrics()s iter = array.%GetIterator()while iter.%GetNext(.key, .json) { s str = json.keyif (json.%IsDefined("tag")) {s tag = json.tags tagIter = tag.%GetIterator()s str = str _ "{" while tagIter.%GetNext(.tagKey, .tagVal) { s str = str _ tagKey _ "=" _ """" _ tagVal _ """" _ ","}s str = $e(str, 1* - 1) _ "}" }w str _" "_ json.val _ $c(10)}q $$$OK }
    • 配置路由
    XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ] { <Routes><Route Url="/prometheus" Method="GET" Call="Metrics2Prometheus" /><Route Url="/json" Method="GET" Call="Metrics2Json" /> </Routes> }
  • 在界面輸入自定義配置的Prometheus接口地址。
    • prometheus格式地址接口:http://localhost:57772/api/metrics/prometheus

    • Json格式地址接口:http://localhost:57772/api/metrics/json

  • 在prometheus.yml配置文件中添加自定義的接口。代碼如下:
  • - job_name: "localhost-Cache"metrics_path: /api/metrics/prometheusstatic_configs:- targets: ['localhost:57772']
  • 重新啟動(dòng)prometheus,查看配置界面。這樣我們就可以給Caché配置一個(gè)自定義的接口拉。
  • 配置 Exporter 監(jiān)控服務(wù)器系統(tǒng)資源

    • 通過服務(wù)器配置Exporter監(jiān)控服務(wù)器的系統(tǒng)信息,例如內(nèi)存使用情況,CPU使用情況。

    簡介

    為Prometheus提供監(jiān)控?cái)?shù)據(jù)源的應(yīng)用都可以被成為Exporter,比如Node Exporter則用來提供節(jié)點(diǎn)相關(guān)的資源使用狀況,而Prometheus從這些不同的Exporter中獲取監(jiān)控?cái)?shù)據(jù),然后可以在諸如Grafana這樣的可視化工具中進(jìn)行結(jié)果的顯示。

    廣義上講所有可以向Prometheus提供監(jiān)控樣本數(shù)據(jù)的程序都可以被稱為一個(gè)Exporter。而Exporter的一個(gè)實(shí)例稱為target,如下所示,Prometheus通過輪詢的方式定期從這些target中獲取樣本數(shù)據(jù)。

    配置流程

  • 下載windows_exporter-0.21.0-amd64.msi文件后,直接雙擊運(yùn)行;
    • 下載地址:https://github.com/prometheus-community/windows_exporter/releases

  • windows_exporter默認(rèn)端口號為9182,運(yùn)行后瀏覽器訪問地址, 出現(xiàn)以下信息,說明安裝成功。
    • 地址:http://localhost:9182/metrics

  • 將Exporter接口添加到Prometheus中。
  • - job_name: "localhost-Exporter"metrics_path: /metricsstatic_configs:- targets: ['localhost:9182']

    使用 Alertmanager報(bào)警

    簡介

    Alertmanager是一個(gè)獨(dú)立的告警模塊,接收Prometheus等客戶端發(fā)來的警報(bào),之后通過分組、刪除重復(fù)等處理,并將它們通過路由發(fā)送給正確的接收器。

    Prometheus 的報(bào)警分為兩部分:

    • Prometheus 服務(wù)器中的警報(bào)規(guī)則向警報(bào)管理器(Alertmanager)發(fā)送警報(bào)。
    • 警報(bào)管理器負(fù)責(zé)管理這些警報(bào),包括告警信息進(jìn)行去重,降噪,分組等,并通過豐富的告警通知渠道,如電子郵件、微信、釘釘、Slack等常用溝通工具發(fā)出通知。

    配置流程

  • 下載Prometheus,選擇操作系統(tǒng),下載對應(yīng)安裝包,下載完畢后并擠壓,以windows為例。
    • 下載地址:https://github.com/prometheus/alertmanager/releases

  • 雙擊alertmanager.exe,啟動(dòng)alertmanager服務(wù),瀏覽器訪問端口地址可以看到默認(rèn)提供的 UI 頁面。
    • 端口 - 9093
    • 地址 - http://localhost:9093/#/alerts

  • AlertManager 默認(rèn)配置文件為 alertmanager.yml,打開配置文件,配置使用 Email 方式通知報(bào)警信息,這里以 QQ 郵箱為例,配置信息如下:
    • global - 全局配置,包括報(bào)警解決后的超時(shí)時(shí)間、SMTP 相關(guān)配置、各種渠道通知的 API 地址等等。
    • route - 用來設(shè)置報(bào)警的分發(fā)策略,它是一個(gè)樹狀結(jié)構(gòu),按照深度優(yōu)先從左向右的順序進(jìn)行匹配。
    • receivers - 配置告警消息接受者信息,例如常用的 email、wechat、slack、webhook 等消息通知方式。
    • inhibit_rules - 抑制規(guī)則配置,當(dāng)存在與另一組匹配的警報(bào)時(shí),抑制規(guī)則將禁用與一組匹配的警報(bào)(目標(biāo))。
    global:resolve_timeout: 5msmtp_from: 'xxxx@qq.com'smtp_smarthost: 'smtp.qq.com:465'smtp_auth_username: 'xxxx@qq.com'smtp_auth_password: 'xxxxxxxxxxxxxx'smtp_require_tls: falsesmtp_hello: 'qq.com'route:group_by: ['alertname']group_wait: 5sgroup_interval: 5srepeat_interval: 5mreceiver: 'email' receivers: - name: 'email'email_configs:- to: 'xxxxx@mediway.cn'send_resolved: trueinhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance']
  • 接下來,需要在 Prometheus 配置 AlertManager 服務(wù)地址以及告警規(guī)則,新建報(bào)警規(guī)則文件 alert_rules.yml,,放在prometheus.yml同級路徑下,配置如下:
    • name - 規(guī)則名稱,可自己定義。
    • alert - 報(bào)警名稱,當(dāng)觸發(fā)報(bào)警時(shí),會(huì)作為郵件標(biāo)題顯示。
    • expr - 報(bào)警規(guī)則,為 PromQL 表達(dá)式驗(yàn)證特定節(jié)點(diǎn),如上述配置中up{job="250-IRIS"}為驗(yàn)證job="250-IRIS"是否還活著,如果等于0則啟動(dòng)報(bào)警。
    • for - 表示報(bào)警狀態(tài)為 Pending 后等待 15s 變成 Firing 狀態(tài),一旦變成 Firing 狀態(tài)則將報(bào)警發(fā)送到 AlertManager。
    • summary - 報(bào)警信息描述。
    groups:- name: "服務(wù)器報(bào)警"rules:- alert: yx服務(wù)器報(bào)警expr: up{job="250-IRIS"} == 0for: 15slabels:status: warningannotations:summary: "服務(wù)器{{ $labels.instance }} 掛了"description: "姚鑫服務(wù)器掛了.請立即查看!"- alert: 本地Cache報(bào)警expr: up{job="localhost-Cache"} == 0for: 15slabels:status: warningannotations:summary: "服務(wù)器{{ $labels.instance }} 掛了"description: "本地Cache服務(wù)器掛了.請立即查看!"- alert: 本地IRIS報(bào)警expr: up{job="localhost-IRIS"} == 0for: 15slabels:status: warningannotations:summary: "服務(wù)器{{ $labels.instance }} 掛了"description: "本地IRIS服務(wù)器掛了.請立即查看!"- name: test-rulesrules:- alert: "內(nèi)存報(bào)警"expr: 100 - ((node_memory_MemAvailable_bytes * 100) / node_memory_MemTotal_bytes) > 3for: 15slabels:status: warningannotations:summary: "服務(wù)器:{{$labels.instance}}內(nèi)存使用率超過3%了"description: "內(nèi)存使用率: {{ $value }}"value: "{{ $value }}"
  • 配置好報(bào)警規(guī)則文件后,需要修改 prometheus.yml 配置文件,添加 rules 規(guī)則文件:
  • alerting:alertmanagers:- static_configs:- targets:- 'localhost:9093'# - alertmanager:9093# Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files:- "alert_rules.yml"# - "second_rules.yml"
  • 配置完畢后打,瀏覽器訪問prometheus主頁,進(jìn)入Alerts和Rules界面,可查看報(bào)警規(guī)則信息:
    • 地址:http://localhost:9090/alerts?search=

  • 測試報(bào)警功能,將本地Caché關(guān)閉,停庫。
  • 觀察頁面本地Cache警報(bào)狀態(tài)。
  • Prometheus Alert 告警狀態(tài)有三種:Inactive、Pending、Firing。

    • Inactive - 非活動(dòng)狀態(tài),表示正在監(jiān)控,但是還未有任何警報(bào)觸發(fā)。
    • Pending - 表示這個(gè)警報(bào)將被觸發(fā)。由于警報(bào)可以被分組、壓抑/抑制或靜默/靜音,所以等待驗(yàn)證,一旦所有的驗(yàn)證都通過,則將轉(zhuǎn)到 Firing 狀態(tài)。
    • Firing - 將警報(bào)發(fā)送到AlertManager,將按照配置將警報(bào)的發(fā)送給所有接收者。一旦警報(bào)解除,則將狀態(tài)轉(zhuǎn)到 Inactive,如此循環(huán)。

    首先發(fā)現(xiàn)警報(bào)變?yōu)镻ending狀態(tài)。

    過了15秒后變?yōu)镕iring狀態(tài)

  • 觸發(fā)報(bào)警,根據(jù)定義的報(bào)警規(guī)則,如果有觸發(fā)告警的條件,自動(dòng)向配置的接收郵箱中發(fā)送郵件,如下:
  • 基于M實(shí)現(xiàn)監(jiān)控服務(wù)器,并用郵件報(bào)警

    解析Prometheus數(shù)據(jù)接口信息

    • 獲取接口信息
    ClassMethod GetMetrics(url) As %Status {#; 初始化request對象#dim request as %Net.HttpRequest= ##class(%Net.HttpRequest).%New()#; 根據(jù)地址解析是否是https調(diào)用SSL配置d ##class(%Net.URLParser).Parse(url, .components)s scheme = components("scheme")if (scheme = "https") {s request.Https = 1if ($zv [ "IRIS") {s request.SSLConfiguration = "ISC.FeatureTracker.SSL.Config"} else {s request.SSLConfiguration = "WebTerminalSSL"} s request.SSLCheckServerIdentity = 0 }#; 請求地址并返回流數(shù)據(jù)s sc = request.Get(url)$$$ThrowOnError(sc)s response = request.HttpResponses stream = response.Dataq stream }
    • 將接口信息轉(zhuǎn)為Json格式
    ClassMethod Metrics2Json(stream) As %Status {s array = []while (stream.AtEnd = 0) {#; 讀取每行信息s metrics = stream.ReadLine()#; 過濾注釋描述信息continue:(metrics [ "# HELP")continue:(metrics [ "# TYPE")#; 指標(biāo)字符串s str = $p(metrics, " "1)#; 指標(biāo)值s value = $p(metrics, " "2)#; 指標(biāo)字名稱s metricsName = $p(str, "{"1)#; 指標(biāo)字label信息s label = $e($p(str, "{"2)1* - 1)s obj = {}s obj.key = metricsNames obj.val = value#; 如果label不為空將label信息轉(zhuǎn)為JSONif (label '= "") {s tag = {}s len = $l(label, ",")for i = 1 : 1 : len{s item = $p(label, """," ,i)s key = $p(item, "="1) s val = $e($p(item, "="2)2*-1)d tag.%Set(key, val)}s obj.tag = tag}d array.%Push(obj)}q array }
    • 調(diào)用方法。
    /// w ##class(M.ParseMetrics).Main("https://localhost:2443/api/monitor/metrics").%ToJSON() /// w ##class(M.ParseMetrics).Main("http://localhost:9182/metrics").%ToJSON() /// w ##class(M.ParseMetrics).Main("http://localhost:57772/api/metrics/prometheus").%ToJSON() ClassMethod Main(url) As %Status {#; 獲取指標(biāo)接口信息s stream = ..GetMetrics(url)#; 將接口信息轉(zhuǎn)為JSON格式s json = ..Metrics2Json(stream)q json }
    • 調(diào)用自定義Caché接口
    IMP>w ##class(M.ParseMetrics).Main("http://localhost:57772/api/metrics/prometheus").%ToJSON() [{"key":"yx_application_errors""val":"0"}{"key":"yx_csp_sessions""val":"1"}{"key":"yx_cache_efficiency""val":"235.85"}{"key":"yx_disk_reads""val":"3316"}{"key":"yx_disk_writes""val":"1881"}{"key":"yx_ecp_app_srv_rate""val":"0"}{"key":"yx_ecp_data_srv_rate""val":"0"}{"key":"yx_glo_refs""val":"1225714"}{"key":"yx_glo_refs_per_sec""val":"439.00"}{"key":"yx_glo_sets""val":"108449"}{"key":"yx_journal_entries""val":"17178"}... {"key":"yx_database_free""val":".8988""tag":{"id":"DHC-EPRMETADATA"}}{"key":"yx_database_free""val":".45""tag":{"id":"DHC-EPRQUALITYDATA"}}{"key":"yx_database_free""val":".71""tag":{"id":"DHC-EPRRBACINST"}}{"key":"yx_database_free""val":".74""tag":{"id":"DHC-EPRRBACMETA"}}{"key":"yx_database_free""val":".78""tag":{"id":"DHC-HEIS"}}{"key":"yx_database_free""val":".48""tag":{"id":"DHC-HL7"}}{"key":"yx_database_free""val":".9936""tag":{"id":"DHC-HR"}}{"key":"yx_database_free""val":".0345""tag":{"id":"DHC-LISDATA"}}{"key":"yx_database_free""val":".9328""tag":{"id":"DHC-LISSRC"}}{"key":"yx_database_free""val":".9884""tag":{"id":"DHC-LOGS"}}{"key":"yx_database_free""val":".9098""tag":{"id":"DHC-MEDSRC"}}{"key":"yx_database_free""val":".8996""tag":{"id":"DHC-MRQDATA"}}{"key":"yx_database_free""val":".9871""tag":{"id":"DHC-MRQSRC"}}{"key":"yx_database_free""val":".1""tag":{"id":"DHC-MSG"}}{"key":"yx_database_free""val":".0481""tag":{"id":"DHC-ORDDATA"}}{"key":"yx_database_free""val":".0417""tag":{"id":"DHC-ORDINDEX"}}{"key":"yx_database_free""val":".8782""tag":{"id":"PACS"}}{"key":"yx_database_free""val":".6""tag":{"id":"DHC-PISDATA"}}{"key":"yx_database_free""val":".831""tag":{"id":"DHC-PISSRC"}}{"key":"yx_database_free""val":".9548""tag":{"id":"DHC-RIS"}}{"key":"yx_database_free""val":".9615""tag":{"id":"DHC-SYS"}}{"key":"yx_database_free""val":".9218""tag":{"id":"DHC-TEMP"}}{"key":"yx_database_free""val":".8096""tag":{"id":"DHC-DWR"}}{"key":"yx_database_free""val":".039""tag":{"id":"DHC-WORKLOAD"}}{"key":"yx_database_free""val":".1797""tag":{"id":"IMP"}}]
    • 調(diào)用自定義IRIS接口
    IMP>w ##class(M.ParseMetrics).Main("https://localhost:2443/api/monitor/metrics").%ToJSON() [{"key":"iris_cpu_pct""val":"0""tag":{"id":"CSPSRV"}}{"key":"iris_cpu_pct""val":"0""tag":{"id":"ECPWorker"}}{"key":"iris_cpu_pct""val":"0""tag":{"id":"GARCOL"}}{"key":"iris_cpu_pct""val":"0""tag":{"id":"JRNDMN"}}... {"key":"iris_wqm_max_work_queue_depth""val":"0""tag":{"id":"SYS"}}{"key":"iris_wqm_waiting_worker_jobs""val":"1""tag":{"id":"SYS"}}]
    • 調(diào)用自定義Exporter接口
    IMP>w ##class(M.ParseMetrics).Main("http://localhost:9182/metrics").%ToJSON() [{"key":"go_gc_duration_seconds","val":"0","tag":{"quantile":"0"}},{"key":"go_gc_duration_seconds","val":"0","tag":{"quantile":"0.25"}},{"key":"go_gc_duration_seconds","val":"0","tag":{"quantile":"0.5"}},{"key":"go_gc_duration_seconds","val":"0","tag":{"quantile":"0.75"}},{"key":"go_gc_duration_seconds","val":"0.0023476","tag":{"quantile":"1"}},{"key":"go_gc_duration_seconds_sum","val":"0.0038789"},{"key":"go_gc_duration_seconds_count","val":"87"},{"key":"go_goroutines","val":"14"},{"key":"go_info","val":"1","tag": ... {"key":"go_threads","val":"19"},{"key":"process_cpu_seconds_total","val":"2.015625"},{"key":"process_max_fds","val":"1.6777216e+07"},{"key":"process_open_fds","val":"414"},{"key":"process_resident_memory_bytes","val":"3.5504128e+07"},{"key":"process_start_time_seconds","val":"1.67670656e+09"},{"key":"process_virtual_memory_bytes","val":"4.0259584e+07"},]

    使用嵌入式Python方式獲取系統(tǒng)CPU、內(nèi)存等

    python模塊之psutil詳解

    在講嵌入式Python之前我們先了解一下psutil庫

    psutil是一個(gè)開源切跨平臺(tái)的庫,其提供了便利的函數(shù)用來獲取才做系統(tǒng)的信息,比如CPU,內(nèi)存,磁盤,網(wǎng)絡(luò)等。此外,psutil還可以用來進(jìn)行進(jìn)程管理,包括判斷進(jìn)程是否存在、獲取進(jìn)程列表、獲取進(jìn)程詳細(xì)信息等。而且psutil還提供了許多命令行工具提供的功能,包括:ps,top,lsof,netstat,ifconfig, who,df,kill,free,nice,ionice,iostat,iotop,uptime,pidof,tty,taskset,pmap。

    psutil是一個(gè)跨平臺(tái)的庫,在官方網(wǎng)站上查到其支持如下操作系統(tǒng)。

    • Linux
    • Windows
    • OSX
    • FreeBSD
    • OpenBSD
    • NetBSD
    • Sun Solaris
    • AIX
    CPU相關(guān)
    函數(shù)描述
    psutil.cpu_count()cpu_count(,[logical]):默認(rèn)返回邏輯CPU的個(gè)數(shù),當(dāng)設(shè)置logical的參數(shù)為False時(shí),返回物理CPU的個(gè)數(shù)。
    psutil.cpu_percent()cpu_percent(,[percpu],[interval]):返回CPU的利用率,percpu為True時(shí)顯示所有物理核心的利用率,interval不為0時(shí),則阻塞時(shí)顯示interval執(zhí)行的時(shí)間內(nèi)的平均利用率。
    psutil.cpu_times()cpu_times(,[percpu]):以命名元組(namedtuple)的形式返回cpu的時(shí)間花費(fèi),percpu=True表示獲取每個(gè)CPU的時(shí)間花費(fèi)。
    psutil.cpu_times_percent()cpu_times_percent(,[percpu]):功能和cpu_times大致相同,看字面意思就能知道,該函數(shù)返回的是耗時(shí)比例。
    psutil.cpu_stats()cpu_stats()以命名元組的形式返回CPU的統(tǒng)計(jì)信息,包括上下文切換,中斷,軟中斷和系統(tǒng)調(diào)用次數(shù)。
    psutil.cpu_freq()cpu_freq([percpu]):返回cpu頻率。
    Memory內(nèi)存相關(guān)
    函數(shù)描述
    virtual_memory()以命名元組的形式返回內(nèi)存使用情況,包括總內(nèi)存,可用內(nèi)存,內(nèi)存利用率,buffer和cache等。單位為字節(jié)。
    swap_memory()以命名元組的形式返回swap/memory使用情況,包含swap中頁的換入和換出。
    Disk相關(guān)
    函數(shù)描述
    psutil.disk_io_counters()disk_io_counters([perdisk]):以命名元組的形式返回磁盤io統(tǒng)計(jì)信息,包括讀、寫的次數(shù),讀、寫的字節(jié)數(shù)等。 當(dāng)perdisk的值為True,則分別列出單個(gè)磁盤的統(tǒng)計(jì)信息(字典:key為磁盤名稱,value為統(tǒng)計(jì)的namedtuple)。
    psutil.disk_partitions()disk_partitions([all=False]):以命名元組的形式返回所有已掛載的磁盤,包含磁盤名稱,掛載點(diǎn),文件系統(tǒng)類型等信息。 當(dāng)all等于True時(shí),返回包含/proc等特殊文件系統(tǒng)的掛載信息。
    psutil.disk_usage()disk_usage(path):以命名元組的形式返回path所在磁盤的使用情況,包括磁盤的容量、已經(jīng)使用的磁盤容量、磁盤的空間利用率等。
    Network相關(guān)
    函數(shù)詳情
    psutil.net_io_counter([pernic])以命名元組的形式返回當(dāng)前系統(tǒng)中每塊網(wǎng)卡的網(wǎng)絡(luò)io統(tǒng)計(jì)信息,包括收發(fā)字節(jié)數(shù),收發(fā)包的數(shù)量、出錯(cuò)的情況和刪包情況。當(dāng)pernic為True時(shí),則列出所有網(wǎng)卡的統(tǒng)計(jì)信息。
    psutil.net_connections([kind])以列表的形式返回每個(gè)網(wǎng)絡(luò)連接的詳細(xì)信息(namedtuple)。命名元組包含fd, family, type, laddr, raddr, status, pid等信息。kind表示過濾的連接類型,支持的值如下:(默認(rèn)為inet)。
    psutil.net_if_addrs()以字典的形式返回網(wǎng)卡的配置信息,包括IP地址和mac地址、子網(wǎng)掩碼和廣播地址。
    psutil.net_if_stats()返回網(wǎng)卡的詳細(xì)信息,包括是否啟動(dòng)、通信類型、傳輸速度與mtu。
    psutil.users()以命名元組的方式返回當(dāng)前登陸用戶的信息,包括用戶名,登陸時(shí)間,終端,與主機(jī)信息。
    psutil.boot_time()以時(shí)間戳的形式返回系統(tǒng)的啟動(dòng)時(shí)間。
    Process相關(guān)
    函數(shù)詳情
    psutil.pids()以列表的形式返回當(dāng)前正在運(yùn)行的進(jìn)程。
    psutil.pid_exists(1)判斷給點(diǎn)定的pid是否存在。
    psutil.process_iter()迭代當(dāng)前正在運(yùn)行的進(jìn)程,返回的是每個(gè)進(jìn)程的Process對象。
    psutil.Process()對進(jìn)程進(jìn)行封裝,可以使用該類的方法獲取進(jìn)行的詳細(xì)信息,或者給進(jìn)程發(fā)送信號。

    通過嵌入式Python調(diào)用psutil庫

    這里僅簡單介紹個(gè)主要方法、其他獲取系統(tǒng)資源方法由讀者自行實(shí)現(xiàn)。

    • 在安裝路徑C:\InterSystems\IRISHealth\bin,輸入cmd,進(jìn)入命令行控制臺(tái)輸入命令。安裝 psutil庫。
    irispip install --target C:\InterSystems\IRISHealth\mgr\python psutil

    • 獲取服務(wù)器CPU使用率
    ClassMethod GetSystemCpu() As %String [ Language = python ] {from psutil.__init__ import cpu_percent,virtual_memoryreturn cpu_percent(interval=2) } USER> w ##class(M.SystemMetrics).GetSystemCpu() 14.59999999999999964

    根據(jù)上圖可以觀察到獲取的內(nèi)容使用 1 - 是 IRIS監(jiān)控接口、2 - 是M方法實(shí)現(xiàn)、 3 - 是任務(wù)管理器,三者監(jiān)控的CPU使用率基本使用是一致的。(因?yàn)镃PU使用率是瞬態(tài)的,所以可以認(rèn)為是準(zhǔn)確的)

    • 獲取服務(wù)系內(nèi)存使用狀態(tài)
    ClassMethod GetSystemMemory() As %String [ Language = python ] {from psutil.__init__ import cpu_percent,virtual_memoryreturn virtual_memory()[2] } USER>w ##class(M.SystemMetrics).GetSystemMemory() 60

    根據(jù)上圖可以觀察到獲取的內(nèi)容使用 1 - 是 360監(jiān)控、2 - 是任務(wù)管理器、 3 - 是M方法實(shí)現(xiàn),三者監(jiān)控的內(nèi)存使用是一致的。

    使用郵件發(fā)送報(bào)警信息

    這里考慮使用郵件來發(fā)送警報(bào)信息是因?yàn)?#xff1a;

    • 郵件相對其他方式來說比較方便,只管發(fā)送,不用管是否接收。
    • IRIS自帶發(fā)送郵件接口,操作性大。
    • 相比其他方式,例如微信,公眾號等,還需要做接口交互。使用郵件相對簡單。

    那么下一個(gè)考慮的問題是通過什么方式來觸發(fā)監(jiān)控發(fā)郵件呢,筆者考慮以下兩點(diǎn)可以觸發(fā):

    • 通過掛任務(wù)的方式定時(shí)輪詢。
    • 通過SessionEvent事件來觸發(fā)。

    這里僅提供代碼示例,具體使用哪種方式由讀者自行決定。

    使用M發(fā)送郵件發(fā)送消息

    • 這里以QQ郵箱例,配置信息與Alertmanager郵箱配置相同
    ClassMethod SetMailConfig() As %Net.SMTP {#; 配置smtp服務(wù)s server = ##class(%Net.SMTP).%New()s server.smtpserver = "smtp.qq.com"s server.port = 465if ($zv [ "IRIS") {s server.SSLConfiguration = "ISC.FeatureTracker.SSL.Config"} else {s server.SSLConfiguration = "WebTerminalSSL"} #; 配置郵箱s auth = ##class(%Net.Authenticator).%New()s auth.UserName = "454115408@qq.com"s auth.Password = "xxxxxxxxxxxxxxxx"s server.authenticator = auths server.AuthFrom = auth.UserNameq server }
    • 發(fā)送郵件具體方法
    ClassMethod SendMailMessage(title, content) As %List {#; 獲取配置s server = ..SetMailConfig()#; 初始化郵件對象s msg = ##class(%Net.MailMessage).%New()#; 添加from - 發(fā)送人,to - 接收人,Cc - 抄送人s from = server.authenticator.UserNames msg.From = fromd msg.To.Insert("yaoxin@mediway.cn")d msg.Cc.Insert("965274651@qq.com")#; 填寫郵件具體內(nèi)容s msg.Subject = titles msg.IsBinary = 0s msg.IsHTML = 0d msg.TextData.Write(content)#; 執(zhí)行發(fā)送s sc = server.Send(msg)$$$ThrowOnError(sc)q server.FailedSend }
    • 測試郵件方法,發(fā)送成功目標(biāo)郵箱會(huì)接收到郵件。
    IMP>w ##class(M.Mail).SendMailMessage("yx發(fā)的郵件消息頭","這是yx發(fā)的消息內(nèi)容content") 10@%Collection.ListOfDT

    通過配置文件csv文件,來獲取維護(hù)指標(biāo),進(jìn)行郵件報(bào)警。

    • 使用csv文件通過手動(dòng)的方式來維護(hù)需要監(jiān)控的指標(biāo)
      • key - 指標(biāo)名稱,這里要與IRIS接口信息的具體指標(biāo)保持一致。
      • val - 報(bào)警的閾值。
      • oper - 操作符。指具體報(bào)警時(shí)操作符。是大于val時(shí)報(bào)警,還是小于val時(shí)報(bào)警,或其他。
      • desc - 指標(biāo)描述信息。

    • 讀取csv文件將數(shù)據(jù)轉(zhuǎn)為Json。
    ClassMethod Csv2Json(filename) {q:('##class(%File).Exists(filename)) $$$NOs stream = ##class(%Stream.FileCharacter).%New()s stream.Filename = filenames array = []s keyStr = ""while 'stream.AtEnd {s str = stream.ReadLine()if ($i(count) = 1) {s keyStr = str}s obj = {} s len = $l(str, ",")for i = 1 : 1 : len {s val = $p(str, ",", i)s key = $p(keyStr, ",", i)d obj.%Set(key, val)}d array.%Push(obj)}q array } IMP>w ##class(M.Mail).LoadFile("E:\temp\metrics.csv").%ToJSON() [{"key":"iris_cpu_usage ","val":"10","oper":">"},{"key":"iris_license_available","val":"290","oper":">"},{"key":"iris_trans_open_count","val":"0","oper":">"},{"key":"memory","val":"40","oper":">"}]
    • 對比維護(hù)指標(biāo)與接口指標(biāo),超過閾值發(fā)送郵件進(jìn)行警報(bào)。

    注:這里雙循環(huán),時(shí)間復(fù)雜O2,數(shù)據(jù)量大,效率可能會(huì)比較低,需要注意下。

    ClassMethod Main(url As %String, filename As %String) As %Status {#; 獲取接口指標(biāo)Jsons irismetrics = ##class(M.ParseMetrics).Main(url)#; 獲取Csv維護(hù)指標(biāo)Jsons config = ##class(M.Mail).Csv2Json(filename)#; 雙向?qū)Ρ?#xff0c;維護(hù)指標(biāo)超過閾值發(fā)送郵件警報(bào)for i = 1 : 1 : irismetrics.%Size() - 1{s metrics = irismetrics.%Get(i)for j = 1 : 1 : config.%Size() - 1{s obj = config.%Get(j)if (obj.key = metrics.key) {if @(metrics.val _ obj.oper _ obj.val) {s content = obj.desc _ "警報(bào),超過閾值:" _ obj.vald ..SendMailMessage("來自系統(tǒng)的警報(bào)",content)ret $$$NO} }}}#; 監(jiān)控內(nèi)存使用率,接口中沒有監(jiān)視內(nèi)存選項(xiàng)所以調(diào)用嵌入式接口s memory = ..GetSystemMemory()if (memory > 30) {d ..SendMailMessage("來自系統(tǒng)的警報(bào)","內(nèi)存使用率已經(jīng)大于" _ 30 _ "")}ret $$$YES } USER>w ##class(M.Mail).Main("https://localhost:2443/api/monitor/metrics", "E:\temp\metrics.csv") 0

    注:這里基本思路已經(jīng)實(shí)現(xiàn),可以通過掛任務(wù)或其他方式來定時(shí)輪詢。

    總結(jié)

    以上是個(gè)人關(guān)于監(jiān)控服務(wù)器指標(biāo)、CPU、內(nèi)存、警報(bào)的一些理解,由于個(gè)人能力有限,歡迎大家提出意見,共同交流。

    思考

    IRIS還提供了alert警報(bào)接口,該接口提供alert.log警報(bào)日志內(nèi)容,基于以上方案,思考如何通過M程序進(jìn)行監(jiān)控

    • 接口地址:https://localhost:2443/api/monitor/alerts
    • 該接口有警報(bào)時(shí)會(huì)提示報(bào)警信息,調(diào)用一次后清空。

    • 如果有警報(bào),警報(bào)信息如下:
    {"time":"02/19/23-15:49:22:650","severity":2,"message":"Previous system shutdown was abnormal, system forced down or crashed."}

    • /api/monitor/metrics指標(biāo)含義列表:
    指標(biāo)描述
    iris_cpu_pct {id="ProcessType"}IRIS 進(jìn)程類型的 CPU 使用百分比。 ProcessType 可以是以下任何一項(xiàng):ECPWorker、ECPCliR、ECPCliW、ECPSrvR、ECPSrvW、LICENSESRV、WDAUX、WRTDMN、JRNDMN、GARCOL、CSPDMN、CSPSRV、ODBCSRC、MirrorMaster、MirrorPri、MirrorBack、MirrorPre、MirrorSvrR、MirrorJrnR、MirrorSK、MirrorComm
    iris_cpu_usage操作系統(tǒng)上所有程序的 CPU 使用率百分比
    iris_csp_activity {id="IPaddress:port"}Web 網(wǎng)關(guān)服務(wù)器自啟動(dòng)以來處理的 Web 請求數(shù)
    iris_csp_actual_connections {id="IPAddress:port"}Web 網(wǎng)關(guān)服務(wù)器與該服務(wù)器的當(dāng)前連接數(shù)
    iris_csp_gateway_latency {id="IPaddress:port"}獲取 iris_csp_ 指標(biāo)時(shí)從 Web 網(wǎng)關(guān)服務(wù)器獲得響應(yīng)的時(shí)間,以毫秒為單位
    iris_csp_in_use_connections {id="IPaddress:port"}正在處理 Web 請求的 Web 網(wǎng)關(guān)服務(wù)器與此服務(wù)器的當(dāng)前連接數(shù)
    iris_csp_private_connections {id="IPaddress:port"}為狀態(tài)感知應(yīng)用程序保留的 Web 網(wǎng)關(guān)服務(wù)器與此服務(wù)器的當(dāng)前連接數(shù)(保留模式 1)
    iris_csp_sessions此服務(wù)器上當(dāng)前活動(dòng)的 Web 會(huì)話 ID 數(shù)
    iris_cache_efficiency全局引用與物理讀寫的比率,以百分比表示
    iris_db_expansion_size_mb {id="database"}擴(kuò)展數(shù)據(jù)庫的數(shù)量,以兆字節(jié)為單位
    iris_db_free_space {id="database"}數(shù)據(jù)庫中可用的可用空間,以兆字節(jié)為單位(此指標(biāo)每天僅更新一次,可能不會(huì)反映最近的更改。)
    iris_db_latency {id="database"}完成從數(shù)據(jù)庫隨機(jī)讀取的時(shí)間量,以毫秒為單位
    iris_db_max_size_mb {id="database"}`數(shù)據(jù)庫可以增長到的最大大小,以兆字節(jié)為單位
    iris_db_size_mb {id="database",dir="path"}數(shù)據(jù)庫大小,以兆字節(jié)為單位
    iris_directory_space {id="database",dir="path"}數(shù)據(jù)庫目錄存儲(chǔ)卷上的可用空間,以兆字節(jié)為單位
    iris_disk_percent_full {id="database",dir="path"}數(shù)據(jù)庫目錄存儲(chǔ)卷上的空間百分比
    iris_ecp_conn此 ECP 應(yīng)用程序服務(wù)器上的活動(dòng)客戶端連接總數(shù)
    iris_ecp_conn_max來自此 ECP 應(yīng)用程序服務(wù)器的最大活動(dòng)客戶端連接數(shù)
    iris_ecp_connections此 ECP 應(yīng)用程序服務(wù)器與其配置的 ECP 數(shù)據(jù)服務(wù)器同步時(shí)同步的服務(wù)器數(shù)
    iris_ecp_latencyECP 應(yīng)用服務(wù)器和 ECP 數(shù)據(jù)服務(wù)器之間的延遲,以毫秒為單位
    iris_ecps_conn每秒與此 ECP 數(shù)據(jù)服務(wù)器的活動(dòng)客戶端連接總數(shù)
    iris_ecps_conn_max與此 ECP 數(shù)據(jù)服務(wù)器的最大活動(dòng)客戶端連接數(shù)
    iris_glo_a_seize_per_sec每秒全局資源上的 Aseizes 數(shù)
    iris_glo_n_seize_per_sec每秒全局資源上的 Nseizes 數(shù)
    iris_glo_ref_per_sec每秒對位于本地?cái)?shù)據(jù)庫上的全局變量的引用數(shù)
    iris_glo_ref_rem_per_sec每秒對位于遠(yuǎn)程數(shù)據(jù)庫上的全局變量的引用數(shù)
    iris_glo_seize_per_sec每秒占用全局資源的次數(shù)
    iris_glo_update_per_sec每秒對本地?cái)?shù)據(jù)庫上的全局變量進(jìn)行更新(SET 和 KILL 命令)的次數(shù)
    iris_glo_update_rem_per_sec每秒對位于遠(yuǎn)程數(shù)據(jù)庫上的全局變量的更新(SET 和 KILL 命令)數(shù)
    iris_jrn_block_per_sec每秒寫入磁盤的日志塊
    iris_jrn_free_space {id="JournalType",dir="path"}每個(gè)日志目錄的存儲(chǔ)卷上可用的可用空間,以兆字節(jié)為單位。 JournalType 可以是 WIJ、primary 或 secondary
    iris_jrn_size {id="JournalType"}每個(gè)日志文件的當(dāng)前大小,以兆字節(jié)為單位。 JournalType 可以是 WIJ、primary 或 secondary
    iris_license_available當(dāng)前未使用的許可證數(shù)量
    iris_license_consumed當(dāng)前使用的許可證數(shù)量
    iris_license_percent_used當(dāng)前使用的許可證的百分比
    iris_log_reads_per_sec每秒邏輯讀取
    iris_obj_a_seize_per_sec每秒對象資源上的 Aseizes 數(shù)
    iris_obj_del_per_sec每秒刪除的對象數(shù)
    iris_obj_hit_per_sec進(jìn)程內(nèi)存中每秒的對象引用數(shù)
    iris_obj_load_per_sec每秒從磁盤加載的對象數(shù),不在共享內(nèi)存中
    iris_obj_miss_per_sec每秒在內(nèi)存中找不到的對象引用數(shù)
    iris_obj_new_per_sec每秒初始化的對象數(shù)
    iris_obj_seize_per_sec每秒占用對象資源的次數(shù)
    iris_page_space_percent_used已用最大分配頁面文件空間的百分比
    iris_phys_mem_percent_used當(dāng)前使用的物理內(nèi)存 (RAM) 的百分比
    iris_phys_reads_per_sec每秒從磁盤讀取的物理數(shù)據(jù)庫塊
    iris_phys_writes_per_sec每秒寫入磁盤的物理數(shù)據(jù)庫塊
    iris_process_count活躍的 IRIS 進(jìn)程總數(shù)
    iris_rtn_a_seize_per_sec每秒例程資源上的 Aseizes 數(shù)
    iris_rtn_call_local_per_sec每秒對位于遠(yuǎn)程數(shù)據(jù)庫上的全局變量的本地例程調(diào)用數(shù)
    iris_rtn_call_miss_per_sec每秒在內(nèi)存中找不到的例程調(diào)用數(shù)
    iris_rtn_call_remote_per_sec每秒遠(yuǎn)程例程調(diào)用次數(shù)
    iris_rtn_load_per_sec每秒從本地加載或保存到磁盤的例程數(shù)
    iris_rtn_load_rem_per_sec每秒從磁盤遠(yuǎn)程加載或保存到磁盤的例程數(shù)
    iris_rtn_seize_per_sec每秒占用例程資源的次數(shù)
    iris_sam_get_db_sensors_seconds收集 iris_db* 傳感器所花費(fèi)的時(shí)間,以秒為單位
    iris_sam_get_jrn_sensors_seconds收集 iris_jrn* 傳感器所花費(fèi)的時(shí)間,以秒為單位
    iris_sam_get_sql_sensors_seconds收集 iris_sql* 傳感器所花費(fèi)的時(shí)間,以秒為單位
    iris_sam_get_wqm_sensors_seconds收集 iris_wqm* 傳感器所花費(fèi)的時(shí)間,以秒為單位
    iris_smh_available {id="purpose"}按目的可用的共享內(nèi)存,以千字節(jié)為單位
    iris_smh_percent_full {id="purpose"}按目的使用的已分配共享內(nèi)存的百分比
    iris_smh_total為當(dāng)前實(shí)例分配的共享內(nèi)存,以千字節(jié)為單位
    iris_smh_total_percent_full當(dāng)前實(shí)例使用的已分配共享內(nèi)存的百分比
    iris_smh_used {id="purpose"}按目的使用的共享內(nèi)存,以千字節(jié)為單位
    iris_sql_active_queries {id="namespace"}當(dāng)前執(zhí)行的 SQL語句數(shù)
    iris_sql_active_queries_95_percentile {id="namespace"}對于當(dāng)前的活動(dòng) SQL 語句集,自語句開始執(zhí)行以來經(jīng)過的第 95 個(gè)百分位數(shù)的時(shí)間
    iris_sql_active_queries_99_percentile {id="namespace"}對于當(dāng)前活動(dòng)的 SQL 語句集,自語句開始執(zhí)行以來經(jīng)過的第 99 個(gè)百分位數(shù)的時(shí)間
    iris_sql_queries_avg_runtime {id="namespace"}平均 SQL 語句運(yùn)行時(shí)間,以秒為單位
    iris_sql_queries_avg_runtime_std_dev {id="namespace"}平均 SQL 語句運(yùn)行時(shí)間的標(biāo)準(zhǔn)偏差
    iris_sql_queries_per_second {id="namespace"}每秒平均 SQL 語句數(shù)
    iris_system_alerts自系統(tǒng)啟動(dòng)以來發(fā)布到消息日志的警報(bào)數(shù)
    iris_system_alerts_log當(dāng)前位于警報(bào)日志中的警報(bào)數(shù)
    iris_system_alerts_new/api/monitor/alerts 端點(diǎn)上是否有新警報(bào),作為布爾值
    iris_system_state表示系統(tǒng)監(jiān)視器健康狀態(tài)的數(shù)字
    iris_trans_open_count當(dāng)前實(shí)例上打開的事務(wù)數(shù)
    iris_trans_open_secs當(dāng)前實(shí)例上打開事務(wù)的平均持續(xù)時(shí)間,以秒為單位
    iris_trans_open_secs_max當(dāng)前實(shí)例上當(dāng)前打開的最長事務(wù)的
    iris_wd_buffer_redirty寫入守護(hù)進(jìn)程在最近一個(gè)周期中寫入并且也在前一個(gè)周期中寫入的數(shù)據(jù)庫緩沖區(qū)數(shù)
    iris_wd_buffer_write寫入守護(hù)進(jìn)程在其最近周期寫入的數(shù)據(jù)庫緩沖區(qū)數(shù)
    iris_wd_cycle_time完成最近的寫入守護(hù)進(jìn)程周期所花費(fèi)的時(shí)間量,以毫秒為單位
    iris_wd_proc_in_global在最近的寫入守護(hù)進(jìn)程周期開始時(shí)主動(dòng)持有全局緩沖區(qū)的進(jìn)程數(shù)
    iris_wd_size_write寫入守護(hù)程序在其最近周期寫入的數(shù)據(jù)庫緩沖區(qū)的大小,以千字節(jié)為單位
    iris_wd_sleep寫入守護(hù)進(jìn)程在其最近的周期開始之前處于非活動(dòng)狀態(tài)的時(shí)間量,以毫秒為單位
    iris_wd_temp_queue寫入守護(hù)進(jìn)程在其最近周期開始時(shí)使用的內(nèi)存緩沖區(qū)數(shù)
    iris_wd_temp_write寫入守護(hù)進(jìn)程在其最近周期中寫入的內(nèi)存緩沖區(qū)數(shù)
    iris_wdwij_time寫入守護(hù)進(jìn)程在其最近的周期內(nèi)寫入 WIJ 文件所花費(fèi)的時(shí)間,以毫秒為單位
    iris_wd_write_time寫守護(hù)進(jìn)程在其最近的周期內(nèi)將緩沖區(qū)寫入數(shù)據(jù)庫所花費(fèi)的時(shí)間,以毫秒為單位
    iris_wij_writes_per_secWIJ 每秒物理塊寫入
    iris_wqm_active_worker_jobs {id="category"}未被阻塞的運(yùn)行邏輯的平均工作者作業(yè)數(shù)
    iris_wqm_commands_per_sec {id="category"}平均每秒在此工作隊(duì)列管理類別中執(zhí)行的命令數(shù)
    iris_wqm_globals_per_sec {id="category"}平均每秒在此工作隊(duì)列管理類別中運(yùn)行的全局引用數(shù)
    iris_wqm_max_active_worker_jobs {id="category"}自上次記錄日志條目以來的最大活動(dòng)工作人員數(shù)
    iris_wqm_max_work_queue_depth {id="category"}自上次記錄以來此工作隊(duì)列管理類別隊(duì)列中的最大條目數(shù)
    iris_wqm_waiting_worker_jobs {id="category"}等待一個(gè)組連接并為其工作的空閑工人作業(yè)的平均數(shù)量

    總結(jié)

    以上是生活随笔為你收集整理的关于监控服务器指标、CPU、内存、警报的一些解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。