我们已经把Elastic APM可前的需要都部署好了,接下来为了使用APM,对官方提供的APM Agent的函式库,修改一下完成的APM测试范例,所以我们来测试一下Elastic APM的资讯收集功能。
主要测试功能为: apmgin、apmgorm、apmredigo。
可测试api为: /apm/db、/apm/redis、/apm/error
package main
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
"github.com/gomodule/redigo/redis"
"go.elastic.co/apm/module/apmgin"
"go.elastic.co/apm/module/apmgorm"
"go.elastic.co/apm/module/apmredigo"
_ "go.elastic.co/apm/module/apmsql/mysql"
)
func main() {
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", "root", "password", "127.0.0.1", "3306", "mytest")
apmDb, err := apmgorm.Open("mysql", dsn)
if err != nil {
panic(err)
}
redisConn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
panic(err)
}
defer redisConn.Close()
engine := gin.New()
engine.Use(apmgin.Middleware(engine))
server := &http.Server{
Addr: ":8080",
Handler: engine,
}
engine.GET("/apm/db", func(c *gin.Context) {
var name string
db := apmgorm.WithContext(c.Request.Context(), apmDb)
row := db.Table("tb_users").Where("id = ?", 1).Select("name").Row()
err := row.Scan(&name)
if err != nil {
panic(err)
}
c.JSON(200, name)
})
engine.GET("/apm/redis", func(c *gin.Context) {
conn := apmredigo.Wrap(redisConn).WithContext(c.Request.Context())
defer conn.Close()
conn.Do("SET", "foo", 1)
c.JSON(200, "ok")
})
engine.GET("/apm/error", func(c *gin.Context) {
panic("apm test error")
})
go func() {
if err := server.ListenAndServe(); err != nil {
panic(err)
}
}()
c := make(chan int)
<-c
}
进入APM页面後,可以发现之前建立的服务apm-it13
:
点选apm-it13
进入到页面,可以查看监控的资讯。
点选/apm/db
进入Transaction,查看详细的连线资讯。
点选Span
可以看到APM Agent连完整的sql语法都有收集。
应用程序中使用cpu、memory的资讯也都有收集。
Elastic APM 可以用来做分散式服务的追踪,并提供从请求的建立到结束时间统计,而且结合ELK来使用,让我们可以直接在kibana上查看监控资讯,可以说是一款很好的效能监控工具。
>>: Day 27 - 成本估计与 Amazon DynamoDB
上一篇讲完如何处理已经得到的资讯数据,今天来看看我们是如何与Web 服务器进行通信的 首先添加依赖:...
项目列表 html常用到的列表清单分为这两种 无序的列表 (Unordered Lists) 有序的...
首先,在网址列输入dev.azure.com这个网址,如果已经是有登入Microsoft Accou...
http://www.nltk.org/ NLTK 是一个主流用於自然语言处理的 Python 库 ...
经过前面二十九天的的练习与学习,相信大家应该在表单的实作上都熟悉了不少,只要不是太复杂、太特别的表...