golang使用elasticsearch APM简单实现数据库查询GORM时间线

elasticsearch APM功能全解 一 elastic stack在6.3版本开始推出了APM功能,但当时只支持nodejs,python和ruby,尚不支持java和go,而公司里面大部分系统还是java,因此只是关注,还没有去解读。但在6.4.0版本,终于推出了java和go的beta版本,而在6.5.0版本,终于变为GA版本。这使得在生产环境上部署APM服务变为可能,下面让我们一起来看看elastic stack的这个APM服务... 阅读详情

前提

在用golang使用elasticsearch APM之前需要部署好elastic、kibana和apm-server,这些与其他方式使用apm一致,网上有许多教程,不再赘述

第一步初始化gin,并连接apm全局中间件

我们首先初始化gin,代码如下

package main

import (
	"github.com/gin-gonic/gin"
	"go.elastic.co/apm/module/apmgin"
	"net/http"
)

func HttpInit() error {
	Engine := gin.New()
	//加上apm
	Engine.Use(apmgin.Middleware(Engine))

	Server := &http.Server{
		Addr:           ":8111",
		Handler:        Engine,
	}

	Engine.GET("/apmGormTest", apmGormTest)
	// 线程执行
	go func() {
		err := Server.ListenAndServe()
		if nil != err {
			panic(err)
		}
	}()
	return nil
}

//处理http请求
func apmGormTest(c *gin.Context) {
	mes := GetMysqlData(c)
	c.JSON(http.StatusOK, mes)
}

其中连接apm中间件的主要实现代码为:
apmgin需要我们导入包"go.elastic.co/apm/module/apmgin"

Engine.Use(apmgin.Middleware(Engine))

代码中func apmGormTest是我们处理http接口的方法,其中GetMysqlData()是从数据库取数据的方法,这个我们等下实现。

第二步初始化数据库配置

注意初始化数据库我们使用"go.elastic.co/apm/module/apmgorm"包
的apmgorm.Open方法,代码如下:

package main

import (
	"github.com/gin-gonic/gin"
	"github.com/jinzhu/gorm"
	"go.elastic.co/apm/module/apmgin"
	"net/http"
	"go.elastic.co/apm/module/apmgorm"
	_ "go.elastic.co/apm/module/apmgorm/dialects/mysql"
)

var Db  *gorm.DB

func DatabaseInit() (err error) {
	//注意使用apmgorm,且dialects也要导入"go.elastic.co/apm/module/apmgorm/dialects/mysql"
	Db, err = apmgorm.Open("mysql", "root:123456@tcp(192.168.177.1:3306)/world?charset=utf8&parseTime=True&loc=Local")
	if err != nil {
		return err
	}
	return nil
}

接着我们需要导入驱动包,注意这里的驱动包也需要导入apm封装好的包:

_ "go.elastic.co/apm/module/apmgorm/dialects/mysql"

第三步实现数据库读取数据,并将数据库读取数据操作加入http请求上下文

简单实现上面的GetMysqlData()读取数据库方法
其中需要传入http请求的上下文*gin.Context

// 数据库获取数据
func GetMysqlData(c *gin.Context) string {
	var value []string
	//为数据库请求绑定时间线
	db := apmgorm.WithContext(c.Request.Context(), Db)
	db.Table("country").Select("Name").Where("Code = ?", "CHN").Pluck("Name", &value)
	if value != nil {
		return value[0]
	}
	return ""
}

并将数据库请求操作绑定http请求的上下文

db := apmgorm.WithContext(c.Request.Context(), Db)

实现main方法

实现main方法后整体实现代码如下:

package main

import (
	"github.com/gin-gonic/gin"
	"github.com/jinzhu/gorm"
	"go.elastic.co/apm/module/apmgin"
	"net/http"
	"go.elastic.co/apm/module/apmgorm"
	_ "go.elastic.co/apm/module/apmgorm/dialects/mysql"
)

var Db    *gorm.DB

func HttpInit() error {
	Engine := gin.New()
	//加上apm
	Engine.Use(apmgin.Middleware(Engine))

	Server := &http.Server{
		Addr:           ":8111",
		Handler:        Engine,
	}

	Engine.GET("/apmGormTest", apmGormTest)
	// 线程执行
	go func() {
		err := Server.ListenAndServe()
		if nil != err {
			panic(err)
		}
	}()
	return nil
}

//处理http请求
func apmGormTest(c *gin.Context) {
	mes := GetMysqlData(c)
	c.JSON(http.StatusOK, mes)
}

func DatabaseInit() (err error) {
	//注意使用apmgorm,且dialects也要导入"go.elastic.co/apm/module/apmgorm/dialects/mysql"
	Db, err = apmgorm.Open("mysql", "root:123456@tcp(192.168.177.1:3306)/world?charset=utf8&parseTime=True&loc=Local")
	if err != nil {
		return err
	}
	return nil
}

// 数据库获取数据
func GetMysqlData(c *gin.Context) string {
	var value []string
	//为数据库请求绑定时间线
	db := apmgorm.WithContext(c.Request.Context(), Db)
	db.Table("country").Select("Name").Where("Code = ?", "CHN").Pluck("Name", &value)
	if value != nil {
		return value[0]
	}
	return ""
}

func main()  {
	//初始化http配置
	err := HttpInit()
	//初始化数据库配置
	err = DatabaseInit()
	if err != nil{
		panic(err)
	}
	//让程序阻塞
	c := make(chan int)
	<-c
}

打包测试

打包我们的程序,在运行的时候,填上apm-server的地址就可以连接apm-server了,如下:

./apm-test -ELASTIC_APM_SERVICE_NAME=apmtest -ELASTIC_APM_SERVER_URL=127.0.0.1:8200

apm-test是我们打包好的程序包,ELASTIC_APM_SERVER_URL参数值为apm-server地址

结果

调用我们定义好的接口/apmGormTest,我们可以在kibana中看到生成的时间线,其中就有数据库服务操作:
在这里插入图片描述

注意点

1、数据库驱动也需要使用apm封装好的包"go.elastic.co/apm/module/apmgorm/dialects/mysql"
2、数据库查询操作需要绑定http请求的上下文db := apmgorm.WithContext(c.Request.Context(), Db)

实现labelme批量json_to_dataset方法 labelme可以帮助我们快速的实现Mask-RCNN中数据集json文件的生成,然而还需要我们进一步的将json转成dataset,可以直接在cmd中执行labelme_json_to_dataset.exe C:\Users\Administrator\Desktop\total\1.json(路径),但是这个过程需要我们一个json文件的生成,过程很慢。 一、打开abelm... 阅读详情

相关推荐

从隐式求解器到显式求解器:COMSOL接触仿真中的求解策略对比与选择

本文深度解析了COMSOL中隐式与显式求解器在接触仿真中的应用与选择策略。针对非线性接触问题的核心挑战,详细对比了两种求解器的数学框架、优化技术及适用场景,并提供了参数调优和调试技巧,帮助工程师高效解决接触仿真中的收敛问题。

weixin_28347369的博客 682

go gorm-时间条件判断

gorm查询时间比较问题

weixin_45166511的博客 6113

从三极管到MOS管:单片机I/O口驱动电路设计实战解析

本文深入解析了从三极管到MOS管的单片机I/O口驱动电路设计实战经验。通过对比三极管与MOS管的本质区别,结合实际案例详细讲解了驱动电路的设计要点、优化技巧及常见问题解决方案,帮助工程师高效完成各类负载驱动设计。

weixin_29161785的博客 321

go中api请求,mysql数据库分页模糊查询

go

xiaoyuyayada的博客 463

【VSCode Python无法格式化代码】

提示:需要Install Formatter…安装插件autopep8,点击install。出现Format Document。

AIFRZ的博客 1万+

MATLAB R2022b 安装教程

1. 下载安装先放资源链接,百度网盘太贵了不想续了,换了夸克网盘。1. 下载安装。

qq_51654158的博客 2万+

elastic APM 简单使用

首先,不要以为这个APM功能是一个不务正业、心血来潮的新功能。其实今天elastic的APM来源于之前的opbeat。而Opbeat是由一个丹麦初创团队于2013年成立的老公司了,专门运维软件的开发,而其主打产品即是APM运维软件。被elastic收购之后,opbeat已经于2018年5月份,正式关闭网站和社区,转到了elastic APM上: APM的四大组件 APM agents APM Server Elasticsearch Kibana APM UI APM支持的java版本 APM

才子佳人的博客 3725

从代码到实践:手把手教你用EmbodiedOcc++实现高效3D占用预测(含ScanNet配置)

本文提供了EmbodiedOcc++框架在ScanNet数据集上实现高效3D占用预测的完整实践指南。从环境搭建、数据预处理入手,详细解析了其核心创新点——几何引导优化(GRM)与语义感知不确定性采样(SUS)的代码实现与配置,并分享了训练、评估及调参的实战技巧,帮助开发者快速掌握这一先进的3D感知技术。

terraform7cloud的博客 588

Observability:如何使用 Elastic APM 来监控多语言微服务应用程序

微服务架构引入的挑战之一是了解应用程序的性能以及花费时间最多的能力。 Elastic Stack和Elastic APM可以为基于微服务的现代解决方案以及整体应用程序提供可观测性。 应用程序性能监视(APM)结合了不同的技术,以提供相关的每个服务组件正在做什么,何时何地,何时以及持续多长时间的深入,透明和整体的视图。 APM展示了服务如何交互,在整个系统中进行事务跟踪,并让您看到了瓶颈。 这些丰...

Elastic 中国社区官方博客 4298

线性回归做糖尿病分析(diabetes数据集),并分析单个特征值与病情的关系

1.diabetes数据集 共442个样本,每个样本有十个特征,分别是 [‘age’, ‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’],对应年龄、性别、体质指数、平均血压、S1~S6一年后疾病级数指标。 Targets为一年后患疾病的定量指标,值在25到346之间。 ...

t18438605018的博客 1万+

Doris副本修复实战:从状态机到手动修复的完整指南

在分布式数据库系统中,多副本机制是实现高可用与数据一致性的核心技术。其原理是通过在不同节点存储数据的多个拷贝,确保部分节点故障时服务仍可继续。这项技术的核心价值在于保障数据可靠性,并支撑在线分析处理(OLAP)等对数据一致性要求高的应用场景。当副本出现损坏、丢失或版本不一致时,系统通常依赖自动修复机制,但在元数据损坏、多副本同时故障等复杂场景下,自动修复可能失效,需要深入理解副本状态机并借助手动工具介入。本文将聚焦Doris数据库,解析Tablet副本状态流转(如BAD、VERSION_ERROR),并详细

weixin_32288959的博客 462

根据时间区间查询

mapper文件: <if test="startDate != null and startDate != ''"> <![CDATA[ AND inputDate >= #{startDate}]]> </if> <if test="endDate != null and endDate != ''"> <![CDATA[ AND...

qq_40312909的博客 592

内核工作FAST‘25 Artifact Evaluation流程记录

在我们的paper中,复现需要用到傲腾持久化内存,因此,需要AE Reviewer访问到内网服务器中。我们的思路是购买云服务器,将其作为跳板机,内网服务器通过SSH反向代理与公网服务器建立隧道,AE Reviewer通过隧道访问内网服务器。我们在AE过程中使用。然后,把一切复现需要的代码环境,在chroot里面配置完成。

不定期更新系统使用、编程小技巧,哔哩哔哩账号:https://space.bilibili.com/399455629,欢迎关注 1215

go语言使用model Gorm MySQL查询数据 定时十分钟查询一次 查询十分钟前新建的数据

在`go`函数中,我们监听`ticker`的通道以及一个用于停止定时任务的`done`通道。注意:在实际部署环境中,通常不会使用Go的`main`函数来运行定时任务,而是会使用像`cron`这样的系统任务调度器,或者使用专门的任务调度库如`robfig/cron`,或者将定时任务部署到Kubernetes的CronJob中。当`ticker`触发时,我们计算十分钟前的时间点,并使用`Where`和`Find`方法来查询所有在这个时间点之后创建的数据。// 查询十分钟前新建的数据。// 其他字段...

琳琳的博客 893

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

来!带你们初次体验一下ElasticAPM

前言 本文从最根本的可观察性出发,引出实现这种思想的APM(Application Performance Management)框架,通过对APM的核心组件和数据模型的理解,可以加深对ElasticAPM的理解。最后通过实战演练ElasticAPM,来实现应用的性能追踪。 可观察性 “可观察性”不是供应商能够在系统之外单独交付的功能,而是您在构建系统时植根于其中的一个属性,就像易用性、高可用性和稳定性一样。设计和构建“可观察”系统的目标在于,确保当它在生产中运行时,负责操作它的人员能够检测到不良行

weixin_51954021的博客 2125

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Elastic APM Go代理指南

Elastic APM Go代理指南 项目介绍 Elastic APM Go代理是专为Go语言应用程序设计的官方性能监控工具包。它允许您追踪应用中操作的执行过程,将性能指标和错误数据发送至Elastic APM服务器。此代理支持APM Server 6.5及以上版本,并集成了对Gorilla、Gin等流行框架及net/http库和database/sql驱动的内置支持。项目遵循Apache 2.0...

gitblog_00070的博客 801

运维,关于监控的那些事,你有必要了解一下

作者 | 乔克 来源 | 运维开发故事 监控是整个运维以及产品整个生命周期最重要的一环,它旨在事前能够及时预警发现故障,事中能够结合监控数据定位问题,事后能够提供数据用于分析问题。 一、监控的目的 监控贯穿应用的整个生命周期。即从程序设计、开发、部署、下线。其主要的服务对象有: 技术 业务 技术通过监控系统可以了解技术的环境状态,可以帮助检测、诊断、解决技术环境中的故障和问题。然而监控系统的最终目标是业务,是为了更好的支持业务运行,确保业务的持续开展。 所以监控的目的可以简单归纳

jj1130050965的博客 4653

Gorm中time.time的默认时区

通过DSN可以修改时区,如果不传loc该参数,那么默认值是UTC。最终期望值和实际输出值一致,完美!!!

奔跑吧笨笨的博客 2698

事务是什么

事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。 ...

qq_39326137的博客 2526

Golang进程级APM监控应用方案

APM监控

zhw21w的博客 430

Elastic APM 项目常见问题解决方案

Elastic APM 项目常见问题解决方案 1. 项目基础介绍和主要编程语言 Elastic APM(Application Performance Monitoring)是一个开源项目,旨在提供应用程序性能监控的功能。该项目是Elastic Stack的一部分,它可以帮助开发者监控、追踪和分析应用程序的性能问题。Elastic APM 支持多种编程语言和框架,包括 Java、Python、Ru...

gitblog_00822的博客 982

Elastic APM试用

背景 Elastic APM源自于收购的Opbeat,改头换面推出的服务 基本组件 Elasticsearch APM Agent APM Server Kibana APM UI 基本架构 如下架构与常见APM产品的架构类似, 应用侧部署agent,负责应用性能和错误数据,当前支持node、python、ruby、js,java和golang beta版本中; 使用都是侵入的方式,需要在应用代码...

wenhao的专栏 1万+

探索APM Server:高效应用性能监控的利器

APM Server 是 Elastic 生态系统中的一个关键组件,专门用于接收来自 Elastic APM 代理的数据,并将其转换为 Elasticsearch 文档。通过 APM Server,开发者可以轻松实现对应用程序性能的全面监控,从而快速定位和解决性能瓶颈。 ## 项目技术分析 ### 技术栈 - **Go 语言**:APM Server 使用 Go 语言开发,充分利用了 Go ...

gitblog_00375的博客 934

Go操作Elasticsearch总结

Go操作Elasticsearch总结 安装 参见:CentOS 7 RPM安装 Elasticsearch 7.14.1和常用插件 官方入门例子 《Elasticsearch:权威指南》“适应新环境” 通过一个例子,介绍了ES的核心概念。 我们受雇于 Megacorp 公司,作为 HR 部门新的 “热爱无人机” (“We love our drones!”)激励项目的一部分,我们的任务是为此创建一个员工目录。该目录应当能培养员工认同感及支持实时、高效、动态协作,因此有一些业务需求: 支持包含多值标签

xmcy001122的专栏 1825

gorm忽略一个字段_Elasticsearch最佳字段查询调优:使用 tie_breaker关键字查询

前文讲了Elasticsearch最佳字段搜索的一个实例,知道了bool搜索与dis_max的区别,本文将要讲一下如何对最佳字段查询进行优化。还是之前的例子:文档1和文档2当用户搜索 “quick pets” 时会发生什么呢? 在前面的例子中,两个文档都包含词 quick ,但是只有文档 2 包含词 pets ,两个文档中都不具有包含 的 相同字段 。如下,一个简单的 dis_max 查询会采用...

weixin_39790686的博客 641

gorm中created_at 时间,go time时间,mysql数据库时间的一些问题总结

gorm中created_at 时间,go time时间,mysql数据库时间的一些问题总结 问题1 gorm中created_at 时间 在生成的时候发现数据库的时间慢了8个小时,后来发现是需要在连接数据库的时候加上参数&loc=local func init(){ driverName := viper.GetString("datasource.driverName") host := viper.GetString("datasource.host") port := viper.Ge

从头再来的博客 6774

Go 高性能实用指南(五)

在本章中,我们讨论了比较代码质量的不同方法:利用 Go Prometheus 导出器APM 工具SLIs 和 SLOs利用日志记录利用所有这些技术可以帮助您确定应用程序的性能不如预期的地方。了解这些情况可以帮助您快速迭代并产生最好的软件。在本书的过程中,您已经了解了应用程序性能及其与 Go 的关系。我希望这本书能帮助您在编写应用程序时考虑 Web 性能。始终将性能放在首要位置。每个人都喜欢高性能的应用程序,希望这本书能帮助您作为开发人员尽自己的一份力。github.com。

龙哥盟 862
上一篇: golang客户端操作阿里开源的框架Canal
想吃窝窝头
博客等级 码龄7年 2粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值