Elastic APM Agents 的任务主要有两件事:
要做到以上的两件事,代表我们需要程序运作时,收集这两种的资讯,以下分别针对这两种情境来说明一般的做法。
要分析某段程序运作效能时,最简单与古老的做法,就是在程序开始时,先记录当下的时间,在程序结束之後,记录结束的时间,也因为这种需求太普遍,各种语言当中的 Framework 或 Library 也都有支援这种计算 time elapsed
的工具,不过当记录这些 Performance Metrics 时,常会有以下的问题:
time elapsed
的地方,才收集得到数据』,但是要埋的地方可能有非常多,一开始不会都埋好,实务上常常会变成『发生问题时,才改 code 来埋 log、重新出 build、deploy、想办法让问题再次发生时,取得 log 』,这样会变成是背动的状况,甚至遇到不容易 reproduce (重制) 的例外状况时,也会很不容易收集到能协助判断及解决问题的资讯。使用例如 try
catch
等 Error handling 的方法,并且在错误发生时写 Logs,而这样的做法常会遇到:
Elastic APM Agent 在协助收集 Performance Metrics 时,提供几种的方式:
也可以称为 Build-in Instrumentation (内建检测),不论是哪种程序语言,在开发的时候常会使用各种 Framework,并且在 Framework 透过已经建立好的一些机制,例如:HTTP 请求的处理、Database 的存取,Logging 的机制、Scheduling (排程) 的功能…等。
APM Agents 在各种语言的支援上,都有尽量整合最热门的一些 Framework,让使用者简单的设定後就能直接使用,自动依照 Framework 的功能,收集相关的资讯,并且以结构化的方式,将收集到的数据的格式定义在 Elastic Common Schema 之中。
在没有使用支援的 Framework 的时候,APM Agents 也有提供 Instrument (检测) 资料收集的工具,让使用者能很简单的将自己程序中要观察的某个处理行为,能包装成为 Transaction
或 Span
,并且透过已经定义好的架构与提供的 Utility,能轻易的收集 Performance 相关的 Metrics 并且加上要额外记录的资讯,并且由 APM 帮我们将这收集到的事件,与其他前後的事件连结在一起。
APM Agents 在运作时,会在背景定期的收集系统的 Metrics,能够配合我们所收集的 Transaction
或 Span
的资讯,来协助掌握某个要观察的时间点,系统整体的状况。
目前有支援的语言,後端相关的如下:
前端相关的有两个
以下使用 Golang 为例:
Elastic APM
套件go get -u go.elastic.co/apm
import (
"go.elastic.co/apm/module/apmgin"
)
func main() {
engine := gin.New()
engine.Use(apmgin.Middleware(engine))
...
}
ELASTIC_APM_SERVER_URL
:APM Server 的位置ELASTIC_APM_SERVICE_NAME
:目前的服务名称,这个会是之後在 APM UI 中用来识别服务的重要设定。ELASTIC_APM_ENVIRONMENT
:目前的 Environment,这也是在 Kibana APM UI 中筛选的主要功能之一。ELASTIC_APM_GLOBAL_LABELS
:有一些自订的 Labes 是属於全域型的,也就是在这个服务里全都要加上的,可以定在这里。建立自己定义的 Transaction
:
tx := apm.DefaultTracer.StartTransaction("GET /api/v1", "request")
defer tx.End()
...
tx.Result = "HTTP 2xx"
tx.Context.SetLabel("region", "us-east-1")
在 Transaction
当中加上 Span
:
span, ctx := apm.StartSpan(ctx, "SELECT FROM foo", "db.mysql.query")
defer span.End()
由於每一种语言实作的方式都会有些不同,每一种 Framework 的行为有不同时,支援的方式也会有所差异,以上只是最简短介绍 APM Agents 的使用方式,让大家有个感觉,详细的使用方式,请参考 官方文件 - APM Agents [1] 每个语言的版本。
APM Agents 在运作时,一定会占用到原本服务需使用的系统资源,这些处理会使用到:
另外再从两个部份来分析:
另外 APM Server 如果无法正常接受 APM Agents 所传送的资料时,APM Agents 最终会选择放弃传送,设计上也是以不影响原本服务执行为主。
特别注意:先前专案的团队实际在使用 PHP 版本的 APM Agents 时,在压测时有明确的因为加上 APM Agents 後,原本服务的 QPS 下降将近一半,猜测和 PHP 的实作版本没有实作 async call 可能有关,若有使用 PHP 版本的话会需要特别留意。
既然使用 APM Agents 收集 Instruments 数据时,一定会占用到系统的资源,也就是多少都会影响到原本服务的效能,这时候 Sample Rate (取样率) 就是一个很重要的设定,不过这个值没有一定的标准,但是在量级非常大的系统之中,1 ~ 3% 的取样率一般已经足够有一定的代表性,也就是若是有问题发生时,一般都会能取得到样本,当然这个设定值还是会依照使用的情境与硬体的规格需进行压测及调整。
capture_header
、 capture_body
,这个在 Sample Rate 较高、量级较大的环境之中,应该考虑关掉 capture_body
,这个会於效能会有明显的影响。span
,这种情况应该设定好 transaction_max_span
来避免这种意外发生。api_request_time
、或是每批的大小 api_request_size
。查看最新 Elasticsearch 或是 Elastic Stack 教育训练资讯: https://training.onedoggo.com
欢迎追踪我的 FB 粉丝页: 乔叔 - Elastic Stack 技术交流
不论是技术分享的文章、公开线上分享、或是实体课程资讯,都会在粉丝页通知大家哦!
>>: 【Day 23】深度学习实作 --- "Hello world"
=== 书接上回 [Day 24] Edge Impulse + BLE Sense实现手势动作辨识...
大家好~ 我是五岁~ 今天要来画可爱的殭屍女孩~ 风格类似是中国殭屍,她外观上有两个巨大的手手可以跟...
先说,我是用mac双系统的win10,本来想在mac os做,但是下载下来的说明书里有个自己的驱动程...
这题写凌晨2、3点,本来要用c的,最後用JAVA,然後睡觉前送出去Time Limit Exceed...
怎麽处理资料库沟通 相信这点是每个程序开发工程师关注的点,在dotnetcore中可以选择Entit...