【android bluetooth 框架分析 02】【Module詳解 13】【CounterMetrics 模塊介紹】

1. CounterMetrics 介紹

CounterMetrics 模塊代碼很少, 我簡單介紹一下。

// system/gd/metrics/counter_metrics.cc
#define LOG_TAG "BluetoothCounterMetrics"#include "metrics/counter_metrics.h"#include "common/bind.h"
#include "os/log.h"
#include "os/metrics.h"namespace bluetooth {
namespace metrics {const int COUNTER_METRICS_PERDIOD_MINUTES = 360; // Drain counters every 6 hoursconst ModuleFactory CounterMetrics::Factory = ModuleFactory([]() { return new CounterMetrics(); });void CounterMetrics::ListDependencies(ModuleList* list) const {
}void CounterMetrics::Start() {alarm_ = std::make_unique<os::RepeatingAlarm>(GetHandler());alarm_->Schedule(common::Bind(&CounterMetrics::DrainBufferedCounters,bluetooth::common::Unretained(this)),std::chrono::minutes(COUNTER_METRICS_PERDIOD_MINUTES));LOG_INFO("Counter metrics initialized");initialized_ = true;
}void CounterMetrics::Stop() {DrainBufferedCounters();initialized_ = false;alarm_->Cancel();alarm_.reset();LOG_INFO("Counter metrics canceled");
}bool CounterMetrics::CacheCount(int32_t key, int64_t count) {if (!IsInitialized()) {LOG_WARN("Counter metrics isn't initialized");return false;}if (count <= 0) {LOG_WARN("count is not larger than 0. count: %s, key: %d", std::to_string(count).c_str(), key);return false;}int64_t total = 0;std::lock_guard<std::mutex> lock(mutex_);if (counters_.find(key) != counters_.end()) {total = counters_[key];}if (LLONG_MAX - total < count) {LOG_WARN("Counter metric overflows. count %s current total: %s key: %d",std::to_string(count).c_str(), std::to_string(total).c_str(), key);counters_[key] = LLONG_MAX;return false;}counters_[key] = total + count;return true;
}bool CounterMetrics::Count(int32_t key, int64_t count) {if (!IsInitialized()) {LOG_WARN("Counter metrics isn't initialized");return false;}if (count <= 0) {LOG_WARN("count is not larger than 0. count: %s, key: %d", std::to_string(count).c_str(), key);return false;}os::LogMetricBluetoothCodePathCounterMetrics(key, count);return true;
}void CounterMetrics::DrainBufferedCounters() {if (!IsInitialized()) {LOG_WARN("Counter metrics isn't initialized");return ;}std::lock_guard<std::mutex> lock(mutex_);LOG_INFO("Draining buffered counters");for (auto const& pair : counters_) {Count(pair.first, pair.second);}counters_.clear();
}}  // namespace metrics
}  // namespace bluetooth

如果你 看過我之前其他模塊的介紹。應該很容易看明白, CounterMetrics 模塊對應函數的觸發流程。 我這里簡單的介紹一下。CounterMetrics模塊的作用。

2. CounterMetrics 的功能作用是什么?

該模塊主要用于 收集并定期上報藍牙棧內部的計數型指標(Counter Metrics),其核心職責包括:

功能點解析:

  1. 緩存統計項

    • 使用 CacheCount(int32_t key, int64_t count) 將特定的計數項臨時緩存在內存中(如某類事件的觸發次數)。
  2. 定時上報

    • 通過 os::RepeatingAlarm 每 6 小時調用 DrainBufferedCounters(),將緩存中的計數上報給系統的 metrics 框架(如 statsd)。
  3. 線程安全

    • 內部通過 std::mutex 鎖保護 counters_ map,保證并發場景下的正確性。
  4. 溢出保護

    • 如果某個計數項的總值超出 LLONG_MAX,將其鉗制為 LLONG_MAX 并發出警告。

3. 設計該模塊的目的是什么?

背后的設計理念:

設計需求說明
低頻統計上傳某些藍牙事件(如連接失敗次數、重連次數、A2DP 播放錯誤等)不適合立即上報或日志輸出。
延遲處理,降低性能影響延遲上報避免頻繁調用 I/O 操作(如寫文件、上報 statsd)。
可擴展性強只需新增對應的 key,即可添加新的統計項,無需修改上層邏輯。
幫助調優與問題排查比如分析 Bluetooth 啟動失敗次數、配對錯誤數,輔助 Google 收集大數據做產品改進。

4. 如果去掉這個模塊會怎樣?

  1. 無法延遲上報

    • 每次計數都需要即時上報,性能開銷顯著增加。
  2. 缺失統計數據

    • 某些只有內部記錄但未及時上報的數據將無法收集,影響用戶反饋分析與 QA 問題定位。
  3. 不利于數據分析平臺接入

    • Google 的 statsd、OEM 的大數據平臺等依賴此模塊的統一接口上傳藍牙計數指標。

5. 實際應用場景舉例(車機)

場景CounterMetrics 的作用
A2DP 播放中斷記錄播放異常次數,輔助分析車機藍牙不穩定問題
HFP 通話失敗統計通話連接失敗次數,用于判斷兼容性問題
藍牙重啟頻率如果藍牙頻繁崩潰,CounterMetrics 可以記錄頻率幫助開發定位根因
配對異常統計不同品牌手機配對失敗的頻率,為白名單機制提供數據

6. 總結

項目內容
模塊名稱CounterMetrics
主要功能緩存并定期上報藍牙內部計數數據
設計意義降低性能開銷、支持延遲上報、提高調試能力
可否去除不能,否則將嚴重影響日志分析、問題定位及大數據支持能力

PS:
車機/手機 中 如果要對藍牙服務 埋點, 診斷等。 其實可以結合這個模塊來添加。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80736.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80736.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80736.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QMK鍵盤固件配置詳解

QMK鍵盤固件配置詳解 前言 大家好&#xff01;今天給大家帶來QMK鍵盤固件配置的詳細指南。如果你正在DIY機械鍵盤或者想要給自己的鍵盤刷固件&#xff0c;這篇文章絕對不容錯過。QMK是目前最流行的開源鍵盤固件框架之一&#xff0c;它允許我們對鍵盤進行高度自定義。接下來&a…

基于STM32、HAL庫的DPS368XTSA1氣壓傳感器 驅動程序設計

一、簡介: DPS368XTSA1 是 InvenSense(TDK 集團旗下公司)生產的一款高精度數字氣壓傳感器,專為需要精確測量氣壓和溫度的應用場景設計。它具有超低功耗、高精度、快速響應等特點,非常適合物聯網、可穿戴設備和無人機等應用。 二、硬件接口: DPS368XTSA1 引腳STM32L4XX 引…

因子分析——數學原理及R語言代碼

正交因子分析 目的數學原理參數估計方法主成分法主因子法極大似然法 因子旋轉模型檢驗因子得分加權最小二乘法回歸法 代碼實現注意事項例子 Reference 目的 FactorAnalysis的目的是從多個高度相關的觀測變量中提取出少數幾個LatentFactor&#xff0c;這些因子代表了變量背后的…

ACL訪問控制列表:access-list 10 permit 192.168.10.1

ACL訪問控制列表 標準ACL語法 1. 創建ACL access-list <編號> <動作> <源IP> <通配符掩碼> // 編號范圍 1-99 // 動作&#xff1a;permit 允許 、 deny 拒絕2. 示例 //允許192.168.1.0/24g整個網絡,0.0.0.255 反掩碼 access-list 10 permit 192.1…

解決社區錄音應用橫屏狀態下,錄音后無法播放的bug

最近看到社區有小伙伴反映&#xff0c;社區錄音應用橫屏時&#xff0c;錄音后無法播放的問題。現分享解決辦法。 社區錄音應用的來源&#xff1a;https://gitee.com/openharmony/applications_app_samples/tree/OpenHarmony-5.0.2-Release/code/SystemFeature/Media/Recorder …

每周靶點分享:Angptl3、IgE、ADAM9及文獻分享:抗體的多樣性和特異性以及結構的新見解

本期精選了《脂質代謝的關鍵調控者Angptl3》《T細胞活化抑制因子VISTA靶點》《文獻分享&#xff1a;雙特異性抗體重輕鏈配對設計》三篇文章。以下為各研究內容的概述&#xff1a; 1. 脂質代謝的關鍵調控者Angptl3 血管生成素相關蛋白3&#xff08;Angptl3&#xff09;是血管生…

保持Word中插入圖片的清晰度

大家有沒有遇到這個問題&#xff0c;原本繪制的高清晰度圖片&#xff0c;插入word后就變模糊了。先說原因&#xff0c;word默認啟動了自動壓縮圖片功能&#xff0c;分享一下如何關閉這項功能&#xff0c;保持Word中插入圖片的清晰度。 ①在Word文檔中&#xff0c;點擊左上角的…

Datawhale AI春訓營 day

待補充 2025星火杯應用賽入門應用 創空間 魔搭社區 {"default": {"system": "你是星火大模型&#xff0c;一個由科大訊飛研發的人工智能助手。請用簡潔、專業、友好的方式回答問題。","description": "默認系統提示詞"}…

項目全棧實戰-基于智能體、工作流、API模塊化Docker集成的創業分析平臺

目錄 思維導圖 前置知識 Docker是什么&#xff1f; Docker的核心概念&#xff1a; Docker在本項目中的作用 1. 環境隔離與一致性 2. 簡化部署流程 3. 資源管理與擴展性 4. 服務整合與通信 5. 版本控制和回滾 6. 開發與生產環境一致性 總結 前端 1.小程序 2.web …

正則表達式實用指南:原理、場景、優化與引擎對比

正則表達式實用指南&#xff1a;原理、場景、優化與引擎對比 正則表達式&#xff08;Regular Expression&#xff0c;簡稱 regex 或 regexp&#xff09;是程序員處理文本數據時不可或缺的“瑞士軍刀”。無論是表單校驗、日志分析、數據清洗&#xff0c;還是敏感信息脫敏&#…

OSCP - Hack The Box - Sau

主要知識點 CVE-2023-27163漏洞利用systemd提權 具體步驟 執行nmap掃描&#xff0c;可以先看一下55555端口 Nmap scan report for 10.10.11.224 Host is up (0.58s latency). Not shown: 65531 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp o…

5.1.1 WPF中Command使用介紹

WPF 的命令系統是一種強大的輸入處理機制,它比傳統的事件處理更加靈活和可重用,特別適合 MVVM (Model, View, ViewModel)模式開發。 一、命令系統核心概念 1.命令系統基本元素: 命令(Command): 即ICommand類,使用最多的是RoutedCommand,也可以自己繼承ICommand使用自定…

Dagster Pipes系列-2:增強外部腳本與Dagster的交互能力

在現代數據工程中&#xff0c;自動化和監控是確保數據管道高效運行的關鍵因素。Dagster作為一款強大的數據編排工具&#xff0c;提供了多種方式來實現這些目標。本文將深入探討如何使用Dagster Pipes修改外部代碼&#xff0c;以實現日志記錄、結構化元數據報告以及資產檢查等功…

C++類和對象進階 —— 與數據結構的結合

&#x1f381;個人主頁&#xff1a;工藤新一 &#x1f50d;系列專欄&#xff1a;C面向對象&#xff08;類和對象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;終會照亮我前方的路 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 文章目錄 […

Java中進階并發編程

第一章、并發編程的挑戰 并發和并行&#xff1a;指多線程或多進程 線程的本質&#xff1a;操作系統能夠進行運算調度的最小單位&#xff0c;是進程&#xff08;Process&#xff09;中的實際工作單元 進程的本質&#xff1a;操作系統進行資源分配和調度的基本單位&#xff0c…

《 指針變量類型與內存訪問:揭秘背后的奧秘》

&#x1f680;個人主頁&#xff1a;BabyZZの秘密日記 &#x1f4d6;收入專欄&#xff1a;C語言 &#x1f30d;文章目入 一、指針變量類型的基本概念二、指針類型與內存訪問字節數的關系&#xff08;一&#xff09;整型指針&#xff08;二&#xff09;字符型指針&#xff08;三&…

mapbox進階,使用mapbox-plugins插件加載餅狀圖

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.1 ??mapboxgl.Map style屬性二、??使用mapbox-plugins插件加載餅狀圖1. ?…

GraphicLayer與BusineDataLayer層級控制

補充說明&#xff1a; 當參與層級控制的元素是點型元素時&#xff0c;是無法參與ZIndex層級控制的&#xff0c;此時可以換個解決方案 1.給不同的高度值實現&#xff0c;元素間的層級控制覆蓋 import * as mars3d from "mars3d"export let map // mars3d.Map三維地…

uniapp 百家云直播插件打包失敗

打包錯誤日志 Android自有證書 打包失敗 錯誤日志: https://app.liuyingyong.cn/build/errorLog/cf41a610-effe-11ef-88db-05262d4c3e5d原因&#xff1a;需要導入插件依賴 依賴地址&#xff1a;https://ext.dcloud.net.cn/plugin?id16289 百家云直播插件地址 直播插…

【C++】”如虎添翼“:模板初階

泛型編程&#xff1a; C中一種使用模板來實現代碼重用和類型安全的編程范式。它允許程序員編寫與數據類型無關的代碼&#xff0c;從而可以用相同的代碼邏輯處理不同的數據類型。模板是泛型編程的基礎 模板分為兩類&#xff1a; 函數模板&#xff1a;代表了一個函數家族&#x…