Day19 Elastic APM (三)

我们已经把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页面後,可以发现之前建立的服务apm-it13
https://ithelp.ithome.com.tw/upload/images/20210925/20129762x7q1zI7gJ1.png
点选apm-it13进入到页面,可以查看监控的资讯。
https://ithelp.ithome.com.tw/upload/images/20210925/20129762H2WQ929muw.png
点选/apm/db进入Transaction,查看详细的连线资讯。
https://ithelp.ithome.com.tw/upload/images/20210925/20129762K8WSqqxt6J.jpg
点选Span可以看到APM Agent连完整的sql语法都有收集。
https://ithelp.ithome.com.tw/upload/images/20210925/20129762wAWzslWVoa.png
应用程序中使用cpu、memory的资讯也都有收集。
https://ithelp.ithome.com.tw/upload/images/20210925/20129762CtCYiv7NAN.png

总结

Elastic APM 可以用来做分散式服务的追踪,并提供从请求的建立到结束时间统计,而且结合ELK来使用,让我们可以直接在kibana上查看监控资讯,可以说是一款很好的效能监控工具。


<<:  Global Table Replication

>>:  Day 27 - 成本估计与 Amazon DynamoDB

Day28 Networking & http

上一篇讲完如何处理已经得到的资讯数据,今天来看看我们是如何与Web 服务器进行通信的 首先添加依赖:...

Day07项目列表(html)

项目列表 html常用到的列表清单分为这两种 无序的列表 (Unordered Lists) 有序的...

【把玩Azure DevOps】Day3 Organization与Projects

首先,在网址列输入dev.azure.com这个网址,如果已经是有登入Microsoft Accou...

[Python]Natural Language Toolkit

http://www.nltk.org/ NLTK 是一个主流用於自然语言处理的 Python 库 ...

Angular 深入浅出三十天:表单与测试 Day30 - 表单原理

经过前面二十九天的的练习与学习,相信大家应该在表单的实作上都熟悉了不少,只要不是太复杂、太特别的表...