卷起来,关于利用MongoDB的CommandListener命令行实现Mongo在Cat中埋点监控

清华开源GPGPU“承影Ventus”初体验:用RISC-V RVV指令集跑通第一个OpenCL程序 本文详细介绍了清华大学开源GPGPU“承影Ventus”的开发实践,展示了如何基于RISC-V RVV指令集运行首个OpenCL程序。从环境配置、内核开发到性能优化,全面解析了这一创新架构的开发流程,为开发者提供了在RISC-V生态中进行通用GPU计算的实用指南。 阅读详情

为了实现 使用 dianping CAT组件监控标准化埋点,经过长期实践已经完成了对大部分组件埋点的支持,并实现了整个链路的串通,而对MongoDB的支持一直是个难点,曾几何时做了多次尝试,也未能成功,因为从网上根本找不到方法。或许鉴于用CAT的不多,没有人贡献这类的思路,

近段时间一直在MongoDB上折腾,从客户端的角度记录MongoDB一直是个缺失。以至于出现问题时没办法快速看到相关采集的数据指标。

活不多说,这次终于最终搞定也是源自Opentracing对Mongo做Tracing监控的灵感

组件是基于Spring Boot,所以做起自动化配置来说还是比较方便的

基本原理也很简单,Mongo的客户端中MongoClientSettings中有一个commandListeners的命令监听器, 实际这里还包含了ClusterListener集群监听器,ConnectionPoolListener连接池监听器等等,众多监听器,那么我们监控Mongo的执行语句只需要命令监听器即可。

先创建一个 CatMongoAutoConfiguration 的配置类,这里我们生成一个 MongoClientSettings的Bean,在这个Bean中增加了一个 CatMongoCommandListener 命令监听器

@Configuration(proxyBeanMethods = false)
public class CatMongoAutoConfiguration {

	@Bean
	public MongoClientSettings catMongoClientSettings() {
		return MongoClientSettings.builder().addCommandListener(new CatMongoCommandListener()).build();
	}

}

那么在MongoAutoConfiguration自动配置的时候,ObjectProvider<MongoClientSettings> settings 就会被延迟加载进来。

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(MongoClient.class)
@EnableConfigurationProperties(MongoProperties.class)
@ConditionalOnMissingBean(type = "org.springframework.data.mongodb.MongoDatabaseFactory")
public class MongoAutoConfiguration {

	@Bean
	@ConditionalOnMissingBean(MongoClient.class)
	public MongoClient mongo(MongoProperties properties, Environment environment,
			ObjectProvider<MongoClientSettingsBuilderCustomizer> builderCustomizers,
			ObjectProvider<MongoClientSettings> settings) {
		return new MongoClientFactory(properties, environment,
				builderCustomizers.orderedStream().collect(Collectors.toList()))
						.createMongoClient(settings.getIfAvailable());
	}

}

因此我们创建的MongoClientImpl中就包含了 带有命令监听器的Client,

返回来我们再看 CatMongoCommandListener

public class CatMongoCommandListener implements CommandListener {

	/**
	 * Cache for (request id, Transaction) pairs
	 */
	private final Map<Integer, Transaction> cache = new ConcurrentHashMap<>();

	@Override
	public void commandStarted(CommandStartedEvent event) {
		String collectionName = event.getCommand().getString(event.getCommandName()).getValue();
		Transaction t = Cat.newTransaction("MongoDB", event.getDatabaseName() + "." +  collectionName + "." + event.getCommandName());
		try {
			t.addData("requestId", event.getRequestId());
			// t.addData("databaseName", event.getDatabaseName());
			t.addData("connectionDescription", event.getConnectionDescription());
			// t.addData("commandName", event.getCommandName());
			t.addData("command", event.getCommand().toJson());
			/*Event catEvent = Cat.newEvent(collectionName, event.getCommand().toJson());
			try {
				t.addChild(catEvent);
			} finally {
				catEvent.complete();
			}*/
		} finally {
			cache.put(event.getRequestId(), t);
		}
	}

	@Override
	public void commandSucceeded(CommandSucceededEvent event) {
		Transaction t = cache.remove(event.getRequestId());
		try {
			t.addData("response", event.getResponse());
			t.addData("elapsedTime", event.getElapsedTime(TimeUnit.MILLISECONDS));
		} finally {
			t.setStatus(Transaction.SUCCESS);
			t.complete();
		}
	}

	@Override
	public void commandFailed(CommandFailedEvent event) {
		Transaction t = cache.remove(event.getRequestId());
		try {
			t.addData("throwable", event.getThrowable());
			t.addData("elapsedTime", event.getElapsedTime(TimeUnit.MILLISECONDS));
		} finally {
			Cat.logError(event.getThrowable());
			t.setStatus(event.getThrowable());
			t.complete();
		}
	}

}

监听器中有三个方法 commandStarted、commandSucceeded、commandFailed 分别代表,开始,成功,失败,因为在异步的mongo驱动中监听的方法运行在不同的线程中,所以需要使用到一个Cache来缓存传递CAT的事物。那么剩下的就用CAT记录的格式及方法了,event中可以获取到Mongo在执行命令的时候相关数据库信息,连接信息,执行命令,返回结果,还有执行时间,这种监控方式可以说比较全面基于Mongo自身的底层能力实现的埋点方案。对于不论使用MongoRepository还是MongoTemplate都能够起到监听作用

最终来看效果

 

 

【OpenFOAM】-olaFlow-算例4- irreg45degTank 不规则波浪模拟 阅读详情

相关推荐

Unity中实现HLS视频加密与流式播放的完整方案

本文详细介绍了在Unity中实现HLS视频加密与流式播放的完整方案。针对Unity原生VideoPlayer无法直接支持实时解密的问题,提出了基于HLS协议与AES-128加密的成熟解决方案,并重点阐述了如何利用AVPro Video插件进行集成。文章涵盖了从密钥生成、使用FFmpeg进行视频加密切片,到在Unity中动态加载密钥并播放加密流的全流程,为保护付费课程、独家动画等视频内容提供了安全且高效的实践路径。

weixin_29290963的博客 393

flume数据采集_基于nginx+flume+kafka+mongodb实现埋点数据采集

名词解释埋点其实就是用于记录用户在页面的一些操作行为。例如,用户访问页面(PV,Page Views)、访问页面用户数量(UV,User Views)、页面停留、按钮点击、文件下载等,这些都属于用户的操作行为。开发背景我司之前在处理埋点数据采集时,模式很简单,当用户操作页面控件时,前端监听到操作事件,并根据上下文环境,将事件相关的数据通过接口调用发送至埋点数据采集服务(简称ets服务),...

weixin_39608748的博客 2078

UniApp实战:从文件下载到本地保存与预览的一站式解决方案

本文深入解析了UniApp开发中文件下载、保存与预览的完整流程,提供了基于uni.downloadFile、uni.saveFile和uni.openDocument API的一站式实战解决方案。文章详细拆解了核心API的使用方法、多平台(App、H5)的兼容性处理、常见坑点(如文件路径、权限、格式支持)以及进阶优化技巧(如进度提示、文件管理),旨在帮助开发者构建健壮、用户体验良好的跨平台文件处理功能。

d3e4f的博客 614

mongodb埋点监控的坑

背景 公司中间件团队使用了 com.mongodb.event.CommandListener 来对mongodb 打点监控。当我们使用 RocketMQ 调用 mongodb 保存数据的时候没有看到任何异常产生。在我们将 RocketMQ 改用中间件代理,产生了大量的DuplicateKeyException日志,一度怀疑是否中间件的 RocketMQ 代理有问题, 分析源码没有。 分析原因 消费消息的时候,异常如果自己不捕获打印的话,会被ConsumeMessageConcurrentlyServi

liufang1991的专栏 673

Windows下Anaconda换清华镜像源最全指南(含常见问题解决)

本文提供了一份详尽的Windows系统下Anaconda配置清华镜像源的完整指南。针对网络下载缓慢的痛点,文章详细对比了命令行添加与直接编辑配置文件两种主流方法,并重点解决了配置过程中常见的文件缺失、安装失败、环境求解缓慢等疑难问题,帮助用户一劳永逸地提升包管理效率。

brandy的博客 337

前端实现微信扫一扫的思路

本篇文章的关键点就是讲解了我在实现处理多张二维码的场景时的思路,利用canvas遮挡识别过的二维码这个思路是pbk-bin大佬最先想到的,在实现这个需求以后还是很感叹这个思路的巧妙。👏pbk-bin🎁~如果文章对你有帮助,不妨赠人玫瑰,手有余香,预计将会在下篇更新较为完整的微信扫一扫界面和功能。

fang_my的博客 2488

Android vold通讯篇(CommandListener)

前一篇文章:Androidvold核心篇,介绍了vold接收到NetlinkManager发来的内核消息进行对应的处理后(包含挂载卸载等),将处理后的结果发送到FrameWrok,具体是怎么发送的,以及怎么接收从Framework发来的消息,在本文解析。 一、CommandListener类的实现 我们回到Main.cpp的主函数main中,里面有定义一个变量如下: CommandListe

dengziliang001的专栏 2363

半导体行业周期分析:库存、需求与复苏路径深度解读

半导体行业作为现代科技产业的基石,其周期性波动受供需关系、库存水平和宏观经济等多重因素影响。从技术原理上看,行业景气度通常通过库存周转天数、晶圆厂产能利用率等核心指标进行监测,这些指标反映了产业链各环节的健康状况。在工程实践中,理解这些指标有助于企业进行库存管理和产能规划,从而提升运营效率。当前,半导体市场正经历结构性分化,其中**库存周转天数**和**晶圆厂产能利用率**成为判断市场拐点的关键。在应用场景上,汽车电子、人工智能等领域需求相对稳健,而消费电子则面临较大压力。本文聚焦于半导体行业的周期特征,探

weixin_29549793的博客 686

守护进程框架简单分析 (基于NetD)

守护进程框架简单分析 (基于NetD)Main.cpp CommandListener对象,用于接收Framework层通过socket传下来的指令。 NetlinkManager对象,创建与底层通信的Netlink Socket。 MDnsSDListener对象 CommandListener.cpp 继承自FrameworkListener–SocketListener 传进Ne

大象杂货 4416

电路板保险丝如何选型

在电路板保险丝选型过程中,需要考虑多个因素以确保其适合特定的电路需求。最后,经过以上程序选定的样品需要在实际的电路中进行测试,以验证所选择的保险丝是否合适。

weixin_57010826的博客 1310

小论文/大论文必备 | YOLO多模态目标检测、绘制曲线对比图 | 引入多种绘制曲线对比图,包括mAP0.5,mAP0.5:0.95,Loss损失变化的曲线对比

本文通过可视化方法分析YOLO多模态模型的训练过程,对比不同实验的检测精度和损失函数变化。主要内容包括:1)绘制mAP@0.5和mAP@0.5:0.95曲线评估检测精度;2)分析边界框回归损失(box_loss)、分类损失(cls_loss)和分布式损失(dfl_loss)的收敛趋势;3)提供完整的Python代码实现,支持多实验对比,可生成高清曲线图。该方法能直观展示模型训练效果,便于优化策略评估和参数调优。

Ai缝合怪、助力小伙伴高效发论文 260

mongodb的命令行操作命令详解(增删改查、高级查询)

本文为上文的续篇,主要讲解mongodb在cmd的直接操作命令,我的mongodb是安装在d:\mongodb下 1,mongodb启动服务 : 命令行方式启动: . 直接cmd下进入mongodb的bin目录,输入mongod.exe –dbpath d:\mongodb\db 启动成功 配置文件方式启动: .对于一些大神来说,普通的启动满足不了心里需求(玩笑),对于专业的D...

专注赚钱的程序员 3万+

Docker-Nvidia(NVIDIA Container Toolkit)

安装NVIDIA Container Toolkit工具,支持docker使用GPU。

周陽讀書 3820

Android vold进程二 VolumeManager和CommandListener简介

一、VolumeManager的启动   Vold使用VolumeManager的过程和NetlinkManager类似,也是三步:   system/vold/VolumeManager.cpp 1、vm= VolumeManager::Instance() //创建VolumeManager 2、vm->setBroadcaster((SocketListener *) cl) //

frank_zyp的博客 2103

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Android—— 4.2 Vold挂载管理_CommandListener (二)

在前一篇博客中介绍了个大体结构 Android—— 4.2 Vold挂载管理_主体构建 (一) ,按照代码的顺序结构来依次分析,这里来看看CommandListener这个类做了什么。 一:CommandListener构造 在/system/vold/main.cpp的main函数中构建实例:

jscese 5554

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

初学j2me事件三步走

1、implements CommandListener  实现事件接口2、Displayable类.setCommandListener(this);  添加设置监听器3、public void commandAction(Command cmd,Displayable displayable) 实现方法

CpuSheep的专栏 706

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android -- Vold机制简要分析

Android -- Vold机制简要分析 Vold是用于管理和控制Android外部存储介质的后台进程,这里说的管控,主要包括SDK的插拔、挂载/卸载和格式化等;它是Android平台外部存储系统的管控枢纽。

To be or not to be, it's a question 9647

Android存储系统之架构篇

http://gityuan.com/2016/07/23/android-io-arch/ 基于Android 6.0的源码,剖析存储架构的设计 一、概述 本文讲述Android存储系统的架构与设计,涉及到最为核心的便是MountService和Vold这两个模块以及之间的交互。上一篇文章Android存储系统之源码篇从源码角度介绍相关模块的创建与启动过程,

hery186的专栏 5398

[android]netd与NetworkManagementService初印象

[功能]Netd是什么,主要负责什么功能 为什么这次会接触Netd主要是因为在设置防火墙时候碰到了。关于Netd可以干什么可以从Netd的源码中CommandListener中得到答案。按照我的理解,(有疏漏或者错误的请指出), Netd处理事务采用的是命令设计模式。所以可以查看都负责处理哪些命令功能就一目了然,如下: [网络摘抄] Netd负责跟一些涉及物理端口的网络操

BingoAmI的博客 2968

Android Framework 存储子系统(01)vold守护进程

系列文章解读&说明: Android Framework 存储子系统 的分析主要分为以下部分: Android Framework 存储子系统(01)vold守护进程 Android Framework 存储子系统(02)MountService服务 本模块分享的内容:vold守护进程 本章关键点总结 & 说明: 导图是不断迭代的,这里主要关注➕ vold 守护进程...

wangdsh的博客 1402

android ndc,2.3.2 CommandListener构造函数和测试工具ndc

本节将介绍CL的构造函数以及Netd的测试工具ndc。**1.CL构造函数**在前文的2.2.3节中已经介绍了CL构造函数的前半部分,下面接着介绍CL构造函数的后半部分,代码如下所示。**CommandListener::CommandListener构造函数**~~~CommandListener::CommandListener() :FrameworkListener("netd", tru...

weixin_29311017的博客 637

这个 Go 语言的 MongoDB 客户端太强大了,分享下我在项目中是如何使用的。

我们都知道,MongoDB 是一个面向文档的 NoSQL 数据库,以其灵活的数据存储模型和高性能著称。它被广泛应用于各种场景,特别是对大规模数据存储和高并发读写需求的应用程序。它适用于 Web 应用、物联网、日志记录、实时分析等多种场景,并得到了众多开发者和企业的认可和使用。对于使用 Go 语言的开发者,go.mongodb.org/mongo-driver 提供了一个功能强大、灵活的 Mongo...

新亮笔记 1247

mongoDB监听器使用

MongoDB监听器使用指南 作为一名经验丰富的开发者,我很高兴能为你提供一份关于MongoDB监听器使用的指南。MongoDB监听器是一种强大的工具,可以帮助你监控和分析MongoDB数据库的活动。以下是实现MongoDB监听器的基本步骤。 步骤流程 以下是实现MongoDB监听器的基本步骤: 步骤 描述 ...

weixin_40696761的博客 234

Spring Data MongoDB 技术指南

Spring Data MongoDB作为Spring生态对MongoDB的集成方案,提供了便捷的文档数据库操作能力。核心特性包括:通过Repository接口体系实现POJO映射与集合交互;支持JavaConfig/XML配置方式;提供注解驱动的文档映射(@Document/@Id)和MongoTemplate操作模板。Spring Boot集成时自动配置数据库连接,支持通过application.properties自定义配置。领域模型设计中,文档结构通过@Document定义,支持复杂类型处理和持久化

静水深流 1270

通过切面拦截redis做底层埋点

最近在做一些通用的监控埋点,在做到 redis 时遇到了一些问题,搞了半天,有点麻烦,但总算是搞定了。

weixin_44533365的博客 354

[Carefree MongoDB] Spring Boot MongoDB 自动化配置

最近在制作一个 spring boot 小应用时使用了 MongoDB,鉴于官方库的简陋配置,决定自己造个轮子,源码发布在 GitHub Carefree MongoDB,jar 已在中央仓库发布,可以直接引用。 English | 中文 Spring Data MongoDB 为面向 MongoDB 的开发提供了一套基于 Spr...

weixin_34414196的博客 599
上一篇: 有关Spring Boot中使用MongoDB的连接池的解惑,无需重写实现
幕紫
博客等级 码龄16年 56粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值