在 Microsoft,我們透過採用和支援儲存在 Azure 監視器工作區 (AMW) 中的 OpenTelemetry 計量來採用開放標準,而 Prometheus 查詢語言 (PromQl) 是我們跨所有 AMW 計量的基本計量查詢語言。
在閱讀本文之前,建議使用者先了解 虛擬機器上主機作業系統與客體作業系統效能計數器之間的差異。
本文說明使用者必須加入才能收集的客體作業系統效能計數器,可以透過具有 DCR 的 Azure 監視器代理程式、具有 DCR 的 VM Insights,或使用者使用 OTelCollector 收集,做為 OTel 檢測程式庫的一部分。 建議使用者將所有計量儲存在計量最佳化的 Azure 監視器工作區中,其中的查詢成本比 Log Analytics 工作區更便宜且更快。
本文為使用者提供以下資訊:
OpenTelemetry 客體 OS 效能計數器目前處於公開預覽狀態。
效能計數器
Windows 和 Linux 都為用戶提供與 CPU 使用率、內存消耗、磁盤 I/O、網絡等相關的操作系統級指標,以幫助診斷性能問題。 您現在可以在 Windows 上使用 效能監視器 (perfmon) 或在 Linux 上使用 perf 命令 ,輕鬆地在本機電腦上查看範例。
可用的 OS 效能計數器總數是動態的,Windows 預設會提供 ~1846 個 OS 效能計數器 ,並根據本機電腦可用的硬體、軟體和追蹤點事件提供更多可用的計數器。
OpenTelemetry 指標的子集稱為 系統指標。 系統計量基本上是效能計數器的另一個名稱;它們是開放原始碼標準,用於一致地命名和格式化效能計數器,而且不會新增任何全新的作業系統效能計數器。
OpenTelemetry 的優點
跨作業系統可觀察性 系統計量的 OpenTelemetry 語意慣例可將 Windows 和 Linux 效能計數器融合成一致的命名慣例和計量資料模型,以簡化跨 OS 終端使用者體驗。 這可讓使用者使用一組用於 Windows 或 Linux OS 映像的查詢,更輕鬆管理其整個機群的虛擬機器/節點。 相同的程式碼配置(如 ARM/Bicep 範本、Terraform 等)使用相同的 PromQl 查詢,可用於任何採用 OpenTelemetry 系統指標的主機資源。
更多效能計數器 OpenTelemetry 收集器主機計量接收器收集的效能計數器比 Azure 監視器目前透過 DCR 收集的效能計數器還要多得多,並以 Log Analytics 工作區作為目的地。 例如,用戶現在可以監控每個進程的 CPU 利用率、磁盤 I/O、內存使用情況等。
較少的效能計數器 在許多案例中,現有的效能計數器已簡化為單一 OTel 系統計量,並具有度量維度 (資源屬性), 可簡化使用者體驗。
例如,不同狀態的 CPU 時間可以在 Windows 中顯示為下列三個效能計數器:
- \處理器資訊(_Total )% 處理器時間
- \Processor Information(_Total)% Privileged Time
- \Processor Information(_Total)% User Time 或做為 Linux 中的下列七個效能計數器:
- CPU/使用者使用率
- Cpu/usage_system
- Cpu/usage_idle
- Cpu/usage_active
- Cpu/usage_nice
- Cpu/usage_iowait
- CPU/usage_irq
在 OpenTelemetry 中,所有這些計數器都會變成單一效能計數器:system.cpu.time,而在每個狀態 (例如使用者、系統、閒置) 所花費的時間現在只要篩選維度 State 即可找到。
Azure 監視器工作區的優點
儲存在 Azure 監視器工作區中的計量比儲存在 Log Analytics 工作區中時更便宜且查詢速度更快,因為支援這些不同資料存放區的資料模型不同。
除了這些一般優點之外,使用者不會再遇到 Perf 和 Insights 資料表之間的結構描述不相符。 傳送至 AMW 的 VM Insights (v2) 會使用我們提供給使用者的 OpenTelemetry 系統指標子集,從而提供跨使用者同類群組的無縫相容性。 具有應用程式小組且混合使用 VM Insights 和非 VM Insights Guest OS 效能計數器監視的大型企業,可以針對相同 OTel 計量使用相同的 PromQl 查詢、儀表板和警示。
效能計數器名稱
下列效能計數器是由適用於 Windows 和 Linux 虛擬機器的 Azure 監視器代理程式收集。 預設取樣頻率為 60 秒,但在建立或更新資料收集規則時,可以變更此頻率。
| OTel 效能計數器 | 類型 | 單位 | Aggregation | 單調 | 尺寸 | Description |
|---|---|---|---|---|---|---|
| 系統.CPU.利用率 | 量測計 | 1 | N/A | FALSE |
cpu:從0開始的邏輯CPU數(值:Any Str) state:按類型劃分的 CPU 使用率明細(值:idle、interrupt、nice、softirq、steal、system、user、wait) |
自上次測量後,將每個邏輯 CPU 的 system.cpu.time 差異除以所經過的時間(範圍為 0 至 1)。 |
| system.cpu.time | 總和 | s | 累積 | TRUE |
cpu:從0開始的邏輯CPU數(值:Any Str) state:按類型劃分的 CPU 使用率明細(值:idle、interrupt、nice、softirq、steal、system、user、wait) |
每個邏輯 CPU 在每個模式上花費的總秒數。 |
| system.cpu.physical.count | 總和 | {中央處理器} | 累積 | FALSE | (無) | 可用的實體 CPU 數目。 |
| 系統. CPU. 邏輯處理器. 數量 | 總和 | {中央處理器} | 累積 | FALSE | cpu:從0開始的邏輯CPU數(值:Any Str) | 可用的邏輯 CPU 數目。 |
| system.cpu.load_average.5m | 量測計 | {thread} | N/A | FALSE | (無) | 超過 5 分鐘的平均 CPU 負載。 |
| system.cpu.load_average.1m | 量測計 | {thread} | N/A | FALSE | (無) | 超過 1 分鐘的平均 CPU 負載。 |
| system.cpu.load_average.15m | 量測計 | {thread} | N/A | FALSE | (無) | 超過 15 分鐘的平均 CPU 負載。 |
| system.cpu.frequency | 量測計 | 赫茲 | N/A | FALSE | (無) | CPU 核心的目前頻率,以 Hz 為單位。 |
| process.uptime | 量測計 | s | N/A | FALSE | (無) | 程序執行的時間。 |
| process.threads | 總和 | {線程} | 累積 | FALSE | (無) | 進程執行緒數量。 |
| process.signals_pending | 總和 | {信號} | 累積 | FALSE | (無) | 處理程序的擱置訊號數目 (僅限 Linux)。 |
| process.paging.faults | 總和 | {錯誤} | 累積 | TRUE | type:故障類型(值:主要、次要) | 進程所犯的頁面錯誤數目 (僅限 Linux)。 |
| process.open_file_descriptors | 總和 | {count} | 累積 | FALSE | (無) | 處理程序正在使用的檔案描述子數目。 |
| 處理程序.記憶體.虛擬 | 總和 | 依據 | 累積 | FALSE | (無) | 虛擬記憶體大小。 |
| 進程記憶體使用率 | 量測計 | 1 | N/A | FALSE | (無) | 進程所使用的實體記憶體總計百分比。 |
| 進程.記憶體.用量 | 總和 | 依據 | 累積 | FALSE | (無) | 使用中的實體記憶體數量。 |
| system.disk.weighted_io_time | 總和 | s | 累積 | FALSE | device:磁碟名稱(值:Any Str) | 啟動耗費的時間磁碟乘以佇列長度。 |
| system.disk.pending_operations | 總和 | {操作} | 累積 | FALSE | device:磁碟名稱(值:Any Str) | 待處理 I/O 作業的佇列大小。 |
| 系統.磁碟作業 | 總和 | {操作} | 累積 | TRUE |
device:磁碟名稱(值:Any Str) direction:流動方向(值:讀取、寫入) |
磁碟作業次數。 |
| 系統.磁碟.操作時間 | 總和 | s | 累積 | TRUE |
device:磁碟名稱(值:Any Str) direction:流動方向(值:讀取、寫入) |
磁碟讀寫作業時間。 |
| 系統.磁碟.已合併 | 總和 | {操作} | 累積 | TRUE |
device:磁碟名稱(值:Any Str) direction:流動方向(值:讀取、寫入) |
磁碟讀取/寫入合併為單一實體作業。 |
| system.disk.io_time | 總和 | s | 累積 | TRUE | device:磁碟名稱(值:Any Str) | 啟用磁碟所花費的時間。 |
| system.disk.io | 總和 | 依據 | 累積 | TRUE |
device:磁碟名稱(值:Any Str) direction:流動方向(值:讀取、寫入) |
傳輸的磁碟位元組。 |
| process.handles | 總和 | {count} | 累積 | FALSE | (無) | 開啟控制代碼數目 (僅限 Windows)。 |
| process.disk.operations | 總和 | {操作} | 累積 | TRUE | direction:流動方向(值:讀取、寫入) | 進程所執行的磁碟作業。 |
| process.disk.io | 總和 | 依據 | 累積 | TRUE | direction:流動方向(值:讀取、寫入) | 傳輸的磁碟位元組。 |
| 處理程序 CPU 使用率 | 量測計 | 1 | N/A | FALSE | state:CPU 使用率明細(值:system、user、wait) | 自上次抓取後,程序使用的總 CPU 時間百分比 (0-1)。 |
| process.cpu.時間 | 總和 | s | 累積 | TRUE | state:CPU 使用率明細(值:system、user、wait) | 按狀態細分的 CPU 總秒數。 |
| process.context_switches | 總和 | {count} | 累積 | TRUE | type:上下文開關的類型(值:任何 Str) | 處理程序已切換內容的次數(僅限 Linux)。 |
| 系統記憶體使用率 | 量測計 | 1 | N/A | FALSE | state:記憶體使用明細(值:緩衝、快取、非作用中、可用、slab_reclaimable、slab_unreclaimable、已使用) | 使用中的記憶體位元組百分比。 |
| 系統.記憶體.使用 | 總和 | 依據 | 累積 | FALSE | state:記憶體使用明細(值:緩衝、快取、非作用中、可用、slab_reclaimable、slab_unreclaimable、已使用) | 使用中的記憶體位元組數。 |
| system.memory.page_size | 量測計 | 依據 | N/A | FALSE | (無) | 系統設定的頁面大小。 |
| 系統內存限制 | 總和 | 依據 | 累積 | FALSE | (無) | 可用的記憶體位元組總數。 |
| system.linux.memory.dirty | 總和 | 依據 | 累積 | FALSE | (無) | 髒記憶體量 (/proc/meminfo)。 |
| system.linux.memory.available(系統.linux.記憶體.可用) | 總和 | 依據 | 累積 | FALSE | (無) | 可用記憶體的估計值 (僅限 Linux)。 |
| 系統.網路.封包 | 總和 | 封包 | 累積 | TRUE |
裝置:網路介面名稱(值:任何 Str) direction:流動方向(值:接收、發送) |
傳輸的封包數。 |
| system.network.io | 總和 | 依據 | 累積 | TRUE | (無) | 傳輸和接收的位元組數。 |
| 系統.網路錯誤 | 總和 | {錯誤} | 累積 | FALSE |
裝置:網路介面名稱(值:任何 Str) direction:流動方向(值:接收、發送) |
遇到的錯誤數目。 |
| system.network.dropped | 總和 | 封包 | 累積 | TRUE |
裝置:網路介面名稱(值:任何 Str) direction:流動方向(值:接收、發送) |
捨棄的封包數目。 |
| system.network.conntrack.max | 總和 | {條目} | 累積 | FALSE | (無) | conntrack 表中的條目限制。 |
| system.network.conntrack.count | 總和 | {條目} | 累積 | FALSE | (無) | conntrack 表中的條目計數。 |
| 系統.網路連線 | 總和 | {連接} | 累積 | FALSE |
protocol:網路協定(值:tcp) state:連線狀態(值:Any Str) |
連線數。 |
| 系統正常運行時間 | 量測計 | s | N/A | FALSE | (無) | 系統運行的時間。 |
| system.processes.created | 總和 | {進程} | 累積 | TRUE | (無) | 已建立的處理程序總數。 |
| system.processes.count | 總和 | {進程} | 累積 | FALSE | 狀態:程序狀態 (值:blocked、daemon、detached、idle、locked、orphan、paging、running、sleeping、stopped、system、unknown、zombies) | 每個狀態中的進程總數。 |
| 系統分頁利用率 | 量測計 | 1 | N/A | FALSE |
device:頁面檔案名稱(值:Any Str) state:分頁使用類型(值:快取、免費、已使用) |
交換 (Unix) 或分頁檔 (Windows) 使用率。 |
| system.paging.usage | 總和 | 依據 | 累積 | FALSE |
device:頁面檔案名稱(值:Any Str) state:分頁使用類型(值:快取、免費、已使用) |
交換 (Unix) 或分頁檔 (Windows) 使用量。 |
| system.paging.operations | 總和 | {操作} | 累積 | TRUE |
direction:頁面流程(值:page_in、page_out) type:故障類型(值:major、minor) |
分頁作業。 |
| 系統分頁錯誤 | 總和 | {錯誤} | (無) | TRUE | type:故障類型(值:major、minor) | 頁面錯誤數。 |
| system.filesystem.utilization (系統檔案系統使用率) | 量測計 | 1 | N/A | FALSE |
device:檔案系統識別碼 mode:掛載模式(值:ro、rw) mountpoint:路徑 type:檔案系統類型(值:ext4、tmpfs等) |
檔案系統儲存空間使用率。 |
| system.filesystem.usage(系統檔案系統使用情況) | 總和 | 依據 | 累積 | FALSE |
device:檔案系統識別碼 mode:掛載模式 mountpoint:路徑 type:檔案系統類型 state:使用類型(值:free、reserved、used) |
使用的檔案系統位元組。 |
| system.filesystem.inodes.usage | 總和 | {inode} | 累積 | FALSE |
device:檔案系統識別碼 mode:掛載模式 mountpoint:路徑 type:檔案系統類型 state:使用類型(值:free、reserved、used) |
使用的檔案系統 Inode。 |
資源屬性
OpenTelemetry 資源語義約定仍在開發中。 我們正在積極與 OSS 社群合作,以針對各種案例改進和標準化此命名慣例 - 請分享您的意見反應,以協助我們持續改善您的體驗。
一般而言,透過 Azure 監視器代理程式 + 資料收集規則收集並傳送至 Azure 監視器工作區的 OpenTelemetry 計量會自動新增下列雲端資源屬性做為維度,以支援資源範圍的查詢:
- Microsoft.resourceid
- Microsoft.subscriptionid
- Microsoft.資源群組名稱
- Microsoft.Resource 類型
- Microsoft.amwresourceid
OpenTelemetry 每個進程 指標 都有自己的特殊資源 屬性集。 下表顯示 Azure 監視器代理程式自動升級為維度的資源屬性。
| 名稱 | Description | 價值觀 | 已啟用 |
|---|---|---|---|
| 處理程序.命令 | 用於啟動進程的命令(即命令名稱)。 在基於 Linux 的系統上,可以將proc/[pid]/cmdline中的字串設定為第零個。 在 Windows 上,可以設定為從 GetCommandLineW提取的第一個參數。 |
Any Str | true |
| process.executable.name | 進程的可執行檔名稱。 在基於 Linux 的系統上,可以設定為 Name in proc/[pid]/status。 在 Windows 上,可以設定為 GetProcessImageFileNameW 的基底名稱。 |
Any Str | true |
| process.owner | 擁有程式之使用者的帳戶名稱。 | Any Str | true |
| process.pid | 進程識別碼 (PID)。 | 任何整數 | true |
| process.cgroup | cgroup 與進程相關聯(僅限 Linux)。 | Any Str | 假的 |
| process.command_line | 完整命令用來啟動處理程序,作為代表完整命令的單一字串。 在 Windows 上,可以將其設定為 GetCommandLineW 的結果。 如果您必須為了監控而組裝它,請不要設置此設置;使用 process.command_args 代替。 |
Any Str | 假的 |
| process.executable.path | 程序可執行檔的完整路徑。 在 Linux 型系統上,可以設定為目標 proc/[pid]/exe。 在 Windows 上,可以將其設定為 GetProcessImageFileNameW 的結果。 |
Any Str | 假的 |
| process.parent_pid | 父進程識別碼 (PPID)。 | 任何整數 | 假的 |
process.command_line 屬性可以包含數千個字元的極長字串,因此不適合作為一般度量維度。 我們可能會根據提交給產品小組的客戶使用者案例,找到不同的方式來顯示此屬性。
後續步驟
使用各種服務的自訂指標: