我們已經把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上查看監控資訊,可以說是一款很好的效能監控工具。