热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ElasticAPM-GoAgent介绍(中文翻译)

ElasticAPM是一款应用程序性能检测工具(ApplicationPerformanceManagement),可以借助Elasticsearch进行存储性能数据,利用Kibana进行UI可视化。其中收集各个应用的性能数据是利用Agent进行收集,Agent根据不同语言提供了不同的实现,针对Go的应用程序也同样提供了GoAgent,结合下图APM

是什么

Elastic APM是一款应用程序性能检测工具(Application Performance Management),可以借助Elasticsearch进行存储性能数据,利用Kibana进行UI可视化。

其中收集各个应用的性能数据是利用Agent进行收集,Agent根据不同语言提供了不同的实现,针对 Go 的应用程序也同样提供了GoAgent,结合下图APM的架构图更容易理解。

Elastic APM-Go Agent介绍(中文翻译)

概念介绍

Agent对所支持的 WEB框架 提供了中间件支持,进入的HTTP请求都会进入Agent的中间件进行收集,记录。

  • 对于HTTP进入请求 可以使用 apmhttp 包进行记录。
  • 对与数据库操作请求 可以使用 apmsql 包进行记录。

Agent的上下文传参是通过context包来进行传输

初始化

安装agent

go get -u go.elastic.co/apm

依赖

GO 1.8+, Linux, Windows, MacOS

集成进你的程序

有两种方案

官方集成包

Web框架

  • httprouter
  • Echo
  • Gin
  • Beego
  • gorilla/mux
  • go-restful
  • chi
  • negroni

数据库框架

  • database/sql
  • GORM
  • go-pg/pg
  • Cassandra(gocql)
  • Redis(gomodule/redigo)
  • Redis(go-redis/redis)
  • Elasticsearch
  • MongoDB

RPC框架

  • gRPC

服务框架

  • GO Kit

日志框架

  • Logrus
  • Zap
  • Zerolog

自定义集成

在集成之前得明白三个概念

  • Transaction 表示一次顶级会话(HTTP请求或RPC调用)
  • Span 在会话中的一次调用(数据库访问,或者对其他服务进行RPC调用))
  • Error 错误

开启一个会话

tx := apm.DefaultTracer.StartTransaction("GET /api/v1", "request")
defer tx.End()
...
tx.Result = "HTTP 2xx"
tx.Context.SetLabel("region", "us-east-1")

只需要在会话入口处执行StartTransaction 给予调用地址,以及类型 则会返回一个Transaction 我们还可以对结果进行赋值,并且打上自定义的标签。

并且你可以把这个会话集成到现有的context中

ctx = apm.ContextWithTransaction(ctx, tx)

执行一次调用

我们可以通过Transaction

span := tx.StartSpan("SELECT FROM foo", "db.mysql.query", nil)
defer span.End()

也可以从包含Transaction的Context中初始化

span, ctx := apm.StartSpan(ctx, "SELECT FROM foo", "db.mysql.query")
defer span.End()

错误记录

对于Panic错误可以用此方法进行拦截记录:

defer func() {
  if v:= recover(); v != nil {
    e := apm.DefaultTracer.Recovered()
    e.SetTransaction(tx)
    e.Send()
  }
}()

对于非Panic错误可以利用如下方式记录:

  • Tracer.NewError
  • Tracer.NewErrorLog
  • apm.CaptureError

API介绍

Tracer API

为了更加方便的进行调用,Go agent引入了Tracer的概念,Tracer包含了一些公共初始化配置,官方提供了一个默认的实现

import (
    "go.elastic.co/apm"
)

func main() {
    tracer := apm.DefaultTracer
    ...
}

Transactions

func (*Tracer) StartTransaction(name, type string) *Transaction

开启一个会话 返回一个Transaction实例, 此方法应该在HTTP或gRPC入口处调用

transaction := apm.DefaultTracer.StartTransaction("GET /", "request")

在会话完成时候要对会话的状态进行记录

transaction.Result = "Success"
transaction.Context.SetLabel("region", "us-east-1")

func (*Tracer) StartTransactionOptions(name, type string, opts TransactionOptions) *Transaction

可以根据自定义配置开启一个自定义的会话

func (*Transaction) End()

结束一个会话

func (*Transaction) TraceContext() TraceContext

获取会话上下文

func (*Transaction) EnsureParent() SpanID

这个不懂?

func ContextWithTransaction(context.Context, *Transaction) context.Context

把当前会话附加到上下文中

func TransactionFromContext(context.Context) *Transaction

从上下文中获取会话,如果上下文中不存在则返回nil

func DetachedContext(context.Context) context.Context

把上下文拷贝一份出来防止上下文被关闭

func TraceFormatter(context.Context) fmt.Formatter

根据上下文产生一个格式化Formatter格式,来对上下文的会话等信息进行格式化。

这个格式化有如下格式:

  • %v: 包含了TraceID Transaction ID, SpanID(如果是在Span中) 空格分割
  • %t: trace ID only
  • %x: transaction ID only
  • %s: span ID only

SPANS

func (*Transaction) StartSpan(name, spanType string, parent *Span) *Span

开启一个调用

其中注意spanType 它的格式是:类型.子类型.动作

如果是db.mysql 则会在elastic search 上记录成 db类型下的 mysql 子类型

如果是db.mysql.query 则会在elastic search上记录成db类型下的mysql子类型的query动作

func (*Transaction) StartSpanOptions(name, spanType string, opts SpanOptions) *Span

以自定义的配置开启一个SPAN

opts := apm.SpanOptions{
    Start: time.Now(),
    Parent: parentSpan.TraceContext(),
}
span := tx.StartSpanOptions("SELECT FROM foo", "db.mysql.query", opts)

func StartSpan(ctx context.Context, name, spanType string) (*Span, context.Context)

从上下文中获取一个SPAN 前提是上下文中包含了一个SPAN

func (*Span) End()

结束一个调用

func (*Span) Dropped() bool

丢弃一个调用 ,不上传到服务器

func (*Span) TraceContext() TraceContext

返回一个包含SPAN的Trace上下文

func ContextWithSpan(context.Context, *Span) context.Context

把Span加入到上下文中

func SpanFromContext(context.Context) *Span

从上下文中获取Span

Context

你可以通过设置上下来对收集的信息增加自定义的标签

func (*Context) SetLabel(key string, value interface{})

设置上下文标签 以及内容,会对key进行索引

func (*Context) SetCustom(key string, value interface{})

设置自定义的上下文内容,不会对key进行索引

func (*Context) SetUsername(username string)

设置用户名,方便调试

func (*Context) SetUserID(id string)

设置用户ID,方便调试

func (*Context) SetUserEmail(email string)

设置用户邮箱,方便调试

Errors

Go Agent提供了两种记录错误的方式:通过打印错误日志或者直接汇报一个异常(panic)

func (*Tracer) NewError(error) *Error

通过错误实例化一个Error类型 相关参数将会被设置

其中error 可以实例化以下接口来提供更多的详细信息

// Errors implementing ErrorsStacktracer will have their stacktrace
// set based on the result of the StackTrace method.
type ErrorsStacktracer interface {
    StackTrace() github.com/pkg/errors.StackTrace
}

// Errors implementing Stacktracer will have their stacktrace
// set based on the result of the StackTrace method.
type Stacktracer interface {
    StackTrace() []go.elastic.co/apm/stacktrace.Frame
}

// Errors implementing Typer will have a "type" field set to the
// result of the Type method.
type Typer interface {
    Type() string
}

// Errors implementing StringCoder will have a "code" field set to the
// result of the Code method.
type StringCoder interface {
    Code() string
}

// Errors implementing NumberCoder will have a "code" field set to the
// result of the Code method.
type NumberCoder interface {
    Code() float64
}

NewError 返回的Error将会带有唯一的错误ID 可以方便你进行调试

func (*Tracer) NewErrorLog(ErrorLogRecord) *Error

通过一个ErrorLogRecord来实例化一个自定义的Error

ErrorLogRecord结构如下:

type ErrorLogRecord struct {
    // Message holds the message for the log record,
    // e.g. "failed to connect to %s".
    //
    // If this is empty, "[EMPTY]" will be used.
    Message string

    // MessageFormat holds the non-interpolated format
    // of the log record, e.g. "failed to connect to %s".
    //
    // This is optional.
    MessageFormat string

    // Level holds the severity level of the log record.
    //
    // This is optional.
    Level string

    // LoggerName holds the name of the logger used.
    //
    // This is optional.
    LoggerName string

    // Error is an error associated with the log record.
    //
    // This is optional.
    Error error
}

func (*Error) SetTransaction(*Transaction)

把此错误关联到会话当中

func (*Error) SetSpan(*Span)

把此错误关联到调用当中

func (*Error) Send()

把当前错误信息发送到服务器上

func (*Tracer) Recovered(interface{}) *Error

从recoverd value中实例化出Error

tx := apm.DefaultTracer.StartTransaction(...)
defer tx.End()
defer func() {
    if v := recover(); v != nil {
        e := apm.DefaultTracer.Recovered(v)
        e.SetTransaction(tx)
        e.Send()
    }
}()

func CaptureError(context.Context, error) *Error

从上下文中获取会话信息以及调用信息与错误进行关联实例化出一个Error

if err != nil {
        e := apm.CaptureError(ctx, err)
        e.Send()
}

Trace Context

Trace Context包含了会话ID或者调用ID,这个ID可以标志着这个Context属于哪一个调用或者会话,Trace context可以通过字符串化进行HTTP传输来进行链路追踪

Error Context

错误可以与上下文进行关联

并且提供了SetTransaction和SetSpan将错误与具体调用或会话进行关联。

Go性能指标记录

Go Agent除了对会话进行记录,还会对Go的一些性能指标进行记录

通过设置环境来决定 采集时间 ,以及 是否开启


以上所述就是小编给大家介绍的《Elastic APM-Go Agent介绍(中文翻译)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 我们 的支持!


推荐阅读
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Elasticsearch1Elasticsearch入门1.1Elasticsearch术语1.1.16.0以前的Elasticsearch术语1.1.26.0以后的Elasti ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
  • MongoDB用户验证auth的权限设置及角色说明
    本文介绍了MongoDB用户验证auth的权限设置,包括readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase、cluster相关的权限以及root权限等角色的说明和使用方法。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 2018深入java目标计划及学习内容
    本文介绍了作者在2018年的深入java目标计划,包括学习计划和工作中要用到的内容。作者计划学习的内容包括kafka、zookeeper、hbase、hdoop、spark、elasticsearch、solr、spring cloud、mysql、mybatis等。其中,作者对jvm的学习有一定了解,并计划通读《jvm》一书。此外,作者还提到了《HotSpot实战》和《高性能MySQL》等书籍。 ... [详细]
  • Python项目实战10.2:MySQL读写分离性能优化
    本文介绍了在Python项目实战中进行MySQL读写分离的性能优化,包括主从同步的配置和Django实现,以及在两台centos 7系统上安装和配置MySQL的步骤。同时还介绍了创建从数据库的用户和权限的方法。摘要长度为176字。 ... [详细]
author-avatar
手机用户2602901497
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有