当前位置: 首页 > news >正文

【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:
车机/手机 中 如果要对蓝牙服务 埋点, 诊断等。 其实可以结合这个模块来添加。

相关文章:

【android bluetooth 框架分析 02】【Module详解 13】【CounterMetrics 模块介绍】

1. CounterMetrics 介绍 CounterMetrics 模块代码很少&#xff0c; 我简单介绍一下。 // system/gd/metrics/counter_metrics.cc #define LOG_TAG "BluetoothCounterMetrics"#include "metrics/counter_metrics.h"#include "common/bind.h" #i…...

Matlab自学笔记五十四:符号数学工具箱和符号运算、符号求解、绘图

1.什么是符号数学工具箱&#xff1f; 符号数学工具箱是Matlab针对符号对象的运算功能&#xff0c;它引入了一种特殊的数据类型 - 符号对象&#xff1b; 该数据类型包括符号数字&#xff0c;符号变量&#xff0c;符号表达式和符号函数&#xff0c;还包含符号矩阵&#xff0c;以…...

Matlab 模糊控制平行侧边自动泊车

1、内容简介 Matlab 233-模糊控制平行侧边自动泊车 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

新书速览|纯血鸿蒙HarmonyOS NEXT原生开发之旅

《纯血鸿蒙HarmonyOS NEXT原生开发之旅》 本书内容 《纯血鸿蒙HarmonyOS NEXT原生开发之旅》全面系统地介绍了基于HarmonyOS NEXT系统进行原生应用开发的实用技巧。全书共12章&#xff0c;内容涵盖从基础工具使用到高级功能实现的各个方面。第1章详细介绍了开发环境的搭建、Ar…...

tinyint(3)数据类型讲解

TINYINT(3) 是数据库中用于定义字段数据类型的一种写法&#xff0c;常见于 MySQL 等数据库系统。下面来详细了解其含义和作用&#xff1a; 数据类型本质 TINYINT 属于整数类型&#xff0c;在不同的数据库系统中&#xff0c;它所占用的存储空间和表示范围通常是固定的。以 MyS…...

manjaro系统详解

1. Manjaro 概述 Manjaro 是一款基于 Arch Linux 的滚动更新发行版&#xff0c;以 用户友好、易用性 和 硬件兼容性 为核心设计理念。它继承了 Arch 的灵活性和软件丰富性&#xff0c;同时通过图形化工具和稳定的更新策略降低了使用门槛&#xff0c;适合从新手到高级用户的广泛…...

# 实时英文 OCR 文字识别:从摄像头到 PyQt5 界面的实现

实时英文 OCR 文字识别&#xff1a;从摄像头到 PyQt5 界面的实现 引言 在数字化时代&#xff0c;文字识别技术&#xff08;OCR&#xff09;在众多领域中发挥着重要作用。无论是文档扫描、车牌识别还是实时视频流中的文字提取&#xff0c;OCR 技术都能提供高效且准确的解决方案…...

9.3.云原生架构模式

目录 一、云原生架构核心概念 云原生定义与核心原则 • 四大核心要素&#xff1a;容器化、微服务、DevOps、持续交付 • 核心原则&#xff1a;弹性、可观测性、自动化、不可变基础设施 云原生技术矩阵 • 容器与编排&#xff1a;Docker、Kubernetes、CRI-O • 服务治理&#…...

现代化水库运行管理矩阵平台如何建设?

政策背景 2023年8月24日&#xff0c;水利部发布的水利部关于加快构建现代化水库运行管理矩阵的指导意见中指出&#xff0c;在全面推进水库工程标准化管理的基础上&#xff0c;强化数字赋能&#xff0c;加快构建以推进全覆盖、全要素、全天候、全周期“四全”管理&#xff0c;完…...

木马查杀引擎—关键流程图

记录下近日研究的木马查杀引擎&#xff0c;将关键的实现流程图画下来 PHP AST通道实现 木马查杀调用逻辑 模型训练流程...

基于libevent的异步事件驱动型线程池实现

----------------------| IFoxThread | ← 抽象线程接口|----------------------|| dispatch() || start() || stop() || ... |----------^-----------|--------------------|----------------------| …...

ArcGIS+InVEST+RUSLE:水土流失模拟与流域管理的高效解决方案;水土保持专题地图制作

在全球生态与环境面临严峻挑战的当下&#xff0c;水土流失问题已然成为制约可持续发展的重要因素之一。水土流失不仅影响土地资源的可持续利用&#xff0c;还对生态环境、农业生产以及区域经济发展带来深远影响。因此&#xff0c;科学、精准地模拟与评估水土流失状况&#xff0…...

#S4U2SELF#S4U2Proxy#CVE-2021-42278/42287

#S4U2SELF Win08创建普通用户 s4u2 xwj456 可以看到普通用户是没用委托属性的 Win08手动赋予委托服务属性 setspn -A wsw/wsw.com s4u2 Win10身份验证 s4u2 xwj456 AS请求 两个勾 两个勾和include-pac记得按上&#xff08;蓝色&#xff09; &#xff0c;发包之前把wiresh…...

利用基于LLM的概念提取和FakeCTI数据集提升网络威胁情报对抗虚假信息活动的能力

摘要 虚假新闻和虚假信息宣传活动的迅速蔓延对公众信任、政治稳定和网络安全构成了重大威胁。传统的网络威胁情报&#xff08;CTI&#xff09;方法依赖于域名和社交媒体账号等低级指标&#xff0c;很容易被频繁修改其在线基础设施的对手规避。为了解决这些局限性&#xff0c;我…...

uniapp|实现手机通讯录、首字母快捷导航功能、多端兼容(H5、微信小程序、APP)

基于uniapp实现带首字母快捷导航的通讯录功能,通过拼音转换库实现汉字姓名首字母提取与分类,结合uniapp的scroll-view组件与pageScrollTo API完成滚动定位交互,并引入uni-indexed-list插件优化索引栏性能。 目录 核心功能实现动态索引栏生成​联系人列表渲染​滚动定位联动性…...

使用PhpStudy搭建Web测试服务器

一、安装PhpStudy 从以下目录下载PhpStudy安装文件 Windows版phpstudy下载 - 小皮面板(phpstudy) (xp.cn) 安装成功之后打开如下界面 点击启动Apache 查看网站地址 在浏览器中输入localhost:88,出现如下页面就ok了 二、与Unity交互 1.配置下载文件路径&#xff0c;点击…...

Qt/C++面试【速通笔记九】—视图框架机制

在Qt中&#xff0c;QGraphicsView和QGraphicsScene是用于构建二维图形界面的核心组件。它们的设计使得开发者能够高效地管理和渲染图形项&#xff0c;支持丰富的用户交互&#xff0c;例如缩放、旋转、平移等。 1. QGraphicsScene和QGraphicsView的基本概念 QGraphicsScene QG…...

react-diff-viewer 如何实现语法高亮

前言 react-diff-viewer 是一个很好的 diff 展示库&#xff0c;但是也有一些坑点和不完善的地方&#xff0c;本文旨在描述如何在这个库中实现自定义语法高亮。 Syntax highlighting is a bit tricky when combined with diff. Here, React Diff Viewer provides a simple rend…...

Python实例题:Django搭建简易博客

目录 Python实例题 题目 1. 创建 Django 项目和应用 2. 配置项目 3. 设计模型 blog_app templates blog_app post_list.html admin.py models.py urls.py views.py blog_project urls.py 代码解释 models.py&#xff1a; admin.py&#xff1a; urls.py&…...

Kotlin 异步初始化值

在一个类初始化的时候或者方法执行的时候&#xff0c;总有一些值是需要的但是不是立即需要的&#xff0c;并且在需要的时候需要阻塞流程来等待值的计算&#xff0c;这时候异步的形式创建这个值是毋庸置疑最好的选择。 为了更好的创建值需要使用 Kotlin 的协程来创建&#xff0…...

扩展:React 项目执行 yarn eject 后的 config 目录结构详解

扩展&#xff1a;React 项目执行 yarn eject 后的 config 目录结构详解 什么是 yarn eject&#xff1f;React 项目执行 yarn eject 后的 config 目录结构详解&#x1f4c1; config 目录结构各文件作用详解env.jsgetHttpsConfig.jsmodules.jspaths.jswebpack.config.jswebpackDe…...

(自用)Java学习-5.8(总结,springboot)

一、MySQL 数据库 表关系 一对一、一对多、多对多关系设计外键约束与级联操作 DML 操作 INSERT INTO table VALUES(...) DELETE FROM table WHERE... UPDATE table SET colval WHERE...DQL 查询 基础查询&#xff1a;SELECT * FROM table WHERE...聚合函数&#xff1a;COUNT()…...

cursor 如何在项目内自动创建规则

在对话框内 / Generate。cursor rules 就会自动根据项目进行创建规则 文档来自&#xff1a;https://www.kdocs.cn/l/cp5GpLHAWc0p...

C++ 迭代器

1.用途&#xff1a; 像我们之前学习的容器map,vector等&#xff0c;如果需要遍历该怎么做呢&#xff1f;这些容器大部分对下标式遍历&#xff0c;无法像数组灵活使用&#xff0c;也包括增删改查&#xff0c;因为它们的特性&#xff0c;所以需要一种其他的方法。 那么迭代器就…...

基于微信小程序的城市特色旅游推荐应用的设计与实现

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...

最大m子段和

问题描述解题思路伪代码代码实现复杂度分析 问题描述 给定一个有n(n>0)个整数的序列&#xff0c;要求其m个互不相交的子段&#xff0c;使得这m个子段和最大。 输入&#xff1a;整数序列{nums}&#xff0c;m。 输出&#xff1a;最大m子段和。 对于m1的情况&#xff0c;即求最…...

4.MySQL全量、增量备份与恢复

1.数据备份的重要性 在企业中数据的价值至关重要&#xff0c;数据保障了企业业务的正常运行。因此&#xff0c;数据的安全性及数据的可靠性是运维的重中之重&#xff0c;任何数据的丢失都可能对企业产生严重的后果。通常情况下造成数据丢失的原因有如下几种&#xff1a; a.程…...

每日算法刷题Day4 5.12:leetcode数组4道题,用时1h

7. 704.二分查找 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 思想 二分模版题 代码 c: class Solution { public:int search(vector<int>& nums, int target) {int nnums.size();int left0,rightn-1;int res-1;while(left<right){int midleft((…...

Day 15

目录 1.chika和蜜柑1.1 解析1.2 代码 2.对称之美2.1 解析2.2 代码 3.添加字符3.1 解析3.2 代码 1.chika和蜜柑 chika和蜜柑 TopK、堆、排序 1.1 解析 1.2 代码 #include <iostream> #include <vector> #include <algorithm> using namespace std; struct …...

脑机接口重点产品发展路径分析:以四川省脑机接口及人机交互产业攻坚突破行动计划(2025-2030年)为例

引言 随着人工智能和生物技术的飞速发展,脑机接口技术作为连接人类大脑与智能设备的桥梁,正在成为全球科技竞争的新焦点。2025年5月12日,四川省经济和信息化厅等8部门联合印发了《四川省脑机接口及人机交互产业攻坚突破行动计划(2025-2030年)》,为四川省在这一前沿领域的…...

leetcode 18. 四数之和

题目描述 和leetcode 15. 三数之和用同样的方法。有两个注意点。 一是剪枝的逻辑 这是和15. 三数之和 - 力扣&#xff08;LeetCode&#xff09;问题不同的地方。 无法通过这种情况&#xff1a; 二是整数溢出 最终答案 class Solution { public:vector<vector<int>…...

CentOS部署Collabora Online

1.安装Docker CentOS7安装Docker(超详细)-CSDN博客 2.拉取镜像 docker pull collabora/code:latest 3. 启动容器&#xff08;直接暴露HTTP端口&#xff09; docker run -d --name collabora -p 9980:9980 -e "usernameadmin" -e "password123456" -e …...

《Spring Boot 4.0新特性深度解析》

Spring Boot 4.0的发布标志着Java生态向云原生与开发效能革命的全面迈进。作为企业级应用开发的事实标准框架&#xff0c;此次升级在运行时性能、云原生支持、开发者体验及生态兼容性四大维度实现突破性创新。本文深度解析其核心技术特性&#xff0c;涵盖GraalVM原生镜像支持、…...

FFmpeg 与 C++ 构建音视频处理全链路实战(一)—— 环境配置与视频解封装

在数字媒体的浩瀚宇宙中&#xff0c;FFmpeg 就像一艘功能强大的星际战舰&#xff0c;承载着处理音视频数据的重任。而 C 作为一门高效、灵活的编程语言&#xff0c;犹如一位技艺精湛的星际工程师&#xff0c;能够精准操控 FFmpeg 战舰&#xff0c;完成各类复杂的音视频处理任务…...

什么是 NoSQL 数据库?它与关系型数据库 (RDBMS) 的主要区别是什么?

我们来详细分析一下 NoSQL 数据库与关系型数据库 (RDBMS) 的主要区别。 什么是 NoSQL 数据库&#xff1f; NoSQL (通常指 “Not Only SQL” 而不仅仅是 “No SQL”) 是一类数据库管理系统的总称。它们的设计目标是解决传统关系型数据库 (RDBMS) 在某些场景下的局限性&#xf…...

AI需求分析话术 | DeepSeek R1

运行环境&#xff1a;jupyter notebook (python 3.12.7) Dash 场景&#xff1a; 收集了小程序的问题点和优化建议&#xff0c;一键AI分析&#xff0c;快速排优先级 指令话术&#xff1a; 对收集的小程序问题点和建议&#xff0c;做需求分析并总结形成报告&#xff0c;报告结构…...

【Redis】键值对数据库实现

目录 1、背景2、五种基本数据类型对应底层实现3、redis数据结构 1、背景 redis是一个&#xff08;key-value&#xff09;键值对数据库&#xff0c;其中value可以是五大基本数据类型&#xff1a;string、list、hash、set、zset&#xff0c;这五大基本数据类型对应着不同的底层结…...

MySQL 8.0 OCP 英文题库解析(三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题16~25 试题16:…...

互联网大厂Java求职面试:优惠券服务架构设计与AI增强实践-1

互联网大厂Java求职面试&#xff1a;优惠券服务架构设计与AI增强实践-1 在一间简洁明亮的会议室里&#xff0c;郑薪苦正面对着一位技术总监级别的面试官&#xff0c;这位面试官拥有超过十年的大型互联网企业经验&#xff0c;以技术全面性与落地能力著称。 第一轮面试&#xf…...

object的常用方法

在面向对象编程中&#xff0c;Object 类是所有类的根类&#xff0c;它提供了一些基本的方法&#xff0c;这些方法可以被所有对象继承和使用。以下是一些在 Java 中 Object 类的常用方法&#xff0c;以及它们的作用和使用示例&#xff1a; 1. equals(Object obj) 作用&#xff…...

解决vue create 创建项目,不能使用上下键选择模板的问题

使用 git bash 创建vue项目时候&#xff0c;无法使用上下键盘按键选择创建模板 处理&#xff1a; 1.当前界面&#xff0c;按CTR C终止创建命令&#xff1b; 2.使用 alias vuewinpty vue.cmd&#xff0c;更新命令环境&#xff1b; 3.再次使用 vue create demo创建项目&#xf…...

AI Agent开发第64课-DIFY和企业现有系统结合实现高可配置的智能零售AI Agent(上)

开篇 我们之前花了将近10个篇章讲Dify的一些基础应用,包括在讲Dify之前我们讲到了几十个AI Agent的开发例子,我不知道大家发觉了没有,在AI Agent开发过程中我们经常会伴随着这样的一些问题: 需要经常改猫娘;需要经常改调用LLM的参数,甚至在一个流程中有3个节点,每个节点…...

3.Redis-set集合类型

1.用集合做差集、并集&#xff08;共同关注&#xff09;、交集...

软考 系统架构设计师系列知识点之杂项集萃(57)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;56&#xff09; 第93题 美国著名的卡内基梅隆大学软件工程学研究所针对软件工程的工程管理能力与水平进行了充分研究&#xff0c;提出了5级管理能力的模式&#xff0c;包括临时凑合阶段、简单模仿…...

Cabot:开源免费的 PagerDuty 替代品,让系统监控更简单高效

在当今复杂的IT环境中,及时发现并解决系统问题至关重要。而Cabot作为一款开源免费的监控工具,为开发和运维团队提供了强大而简单的解决方案。本文将详细介绍Cabot的核心功能、优势以及快速部署方法,帮助你更好地保障系统稳定性。 Cabot简介 Cabot是一个功能类似PagerDuty的开…...

AI中的MCP是什么?MCP的作用及未来方向预测 (使用go-zero 快速搭建MCP服务器)

AI是当下最热的风。在当今AI技术飞速发展的时代&#xff0c;AI的应用已经渗透到我们日常生活的方方面面。然而&#xff0c;随着AI系统的复杂性不断增加&#xff0c;如何让AI具备更强的自主性和灵活性成为了业界关注的焦点。这就引出了Model Context Protocol&#xff08;MCP&am…...

字节开源FlowGram与n8n 技术选型

字节跳动开源的 FlowGram 和 n8n 是两款功能强大但定位不同的工作流编排工具&#xff0c;以下是两者的技术选型对比分析&#xff0c;结合其核心特性、适用场景和优劣势&#xff1a; 一、核心特性对比 维度FlowGram&#xff08;字节开源&#xff09;n8n定位面向AI场景的可视化工…...

面试专栏-03-Git的常用命令

二、Git常用命令学习 git本质上&#xff0c;就是一个 git类型的文件夹 1、基础配置信息 git -v&#xff1a;查看 git 版本信息 git config --global user.name "dz.cn"&#xff1a;配置用户名&#xff0c;注意&#xff0c;这里配置的用户名在进行版本提交时&#xf…...

使用 Syncthing 在两台电脑之间同步文件:简单教程

&#x1f9e9; 什么是 Syncthing&#xff1f; Syncthing 是一个开源、跨平台、点对点的文件同步工具&#xff0c;类似于 Dropbox&#xff0c;但不依赖第三方服务器。它直接在你的设备之间同步文件&#xff0c;更加安全、可控&#xff0c;非常适合个人或团队内部使用。 支持操…...

spdlog日志格式化 标志全指南

一、spdlog格式化核心机制 SPDLOG通过set_pattern()函数实现灵活的日志格式定制&#xff0c;该函数解析用户提供的格式字符串&#xff0c;生成包含时间、源代码、进程等信息的结构化日志。其底层由pattern_formatter类处理&#xff0c;通过识别%标志符的组合动态生成格式化器对…...