라이브러리 사용
라이브러리 다운로드
go get github.com/whatap/go-api
초기 설정
main 함수 시작시점에 trace.Init 함수를 사용하여 모니터링 모듈을 시작합니다.
defer trace.Shutdown() 으로 모니터링 종료를 보장합니다.
import "github.com/whatap/go-api/trace"
func main(){
trace.Init(nil)
//It must be executed before closing the app.
defer trace.Shutdown()
...
}
func Init(m map[string]string)
map[string]string 형식으로 지정된 설정을 애플리케이션 초기에 설정할 수 있습니다.
Agent의 접속정보는 UDP 127.0.0.1:6600 입니다. 내부에 UDP 6600포트가 사용중이면 다른 포트로 변경이 필요합니다.
m := make(map[string]string)
m["net_udp_port"] = "6601"
trace.Init(m)
실행 중에 설정 변경은 whatap.conf 파일을 직접 수정하거나, 프로젝트 화면에서 변경 가능합니다. (에이전트 설정)
func Shutdown()
애플리케이션 종료시 수집된 데이터를 마지막으로 모두 전달하고 UDP Connection 을 종료합니다.
트랜잭션 추적
웹 요청과 응답까지의 트랜잭션과 일반적인 작업 단위의 트랜잭션을 모두 추적합니다.
시작 및 종료 함수로 구성되어 있습니다.
하나의 트랜잭션으로 인식되어 히트맵에서 상세보기와 TPS, 응답시간, 평균 응답시간 등의 통계 지표를 확인 할 수 있습니다.
설정을 통해서 HTTP Parameter, HTTP Header 정보를 수집합니다.
- profile_http_parameter_enabled
-
Default : false
Type : boolean
grpc 정보 수집여부를 설정합니다. - profile_http_header_enabled
-
Default : false
Type : boolean
grpc 정보 수집여부를 설정합니다.
key, value는 최대 20개, 각각 256 byte 까지 수집합니다.
웹 트랜잭션 추적
http.HandleFunc("/index", func(w http.ResponseWriter, r *http.Request) {
ctx, _ := trace.StartWithRequest(r)
defer trace.End(ctx, nil)
}
일반 트랜잭션 추적
func main() {
ctx := context.Background()
ctx, _ := trace.Start(ctx, "Custom Transaction")
defer trace.End(ctx, nil)
...
}
API
func Start(ctx context.Context, name string) (context.Context, error)
func End(ctx context.Context, err error) error
func StartWithRequest(r *http.Request) (context.Context, error)
func Step(ctx context.Context, title, message string, elapsed, value int) error
func HandlerFunc(handler func(http.ResponseWriter, *http.Request)) http.HandlerFunc
func Func(handler func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request)
Sql 추적
Database 관련 정보를 수집하는 API 입니다.
DB Connection 정보, Sql 구문, error 및 Prepared 구문을 위한 Parameter를 API로 전달하면 실행시간 및 오류사항을 수집할 수 있습니다.
SQL 구문은 최대 32 KB 까지 수집됩니다. SQL Prepared 구문을 위한 Parameter 는 최대 20개, 각각 256 byte 까지 수집합니다.
DB Connection
import (
whatapsql "github.com/whatap/go-api/sql"
)
func main(){
trace.Init(nil)
//It must be executed before closing the app.
defer trace.Shutdown()
ctx, _ := trace.Start(context.Background(), "Trace Open DB")
defer trace.End(ctx, nil)
sqlCtx, _ := whatapsql.StartOpen(ctx, "id@tcp(x.x.x.x:3306)/test")
db, err := sql.Open("mysql", "id:pwd@tcp(x.x.x.x:3306)/test")
whatapsql.End(sqlCtx, err)
defer db.Close()
}
SQL
import (
whatapsql "github.com/whatap/go-api/sql"
)
func main(){
trace.Init(nil)
//It must be executed before closing the app.
defer trace.Shutdown()
ctx, _ := trace.Start(context.Background(), "Trace Query")
defer trace.End(ctx, nil)
query = "select id, subject from tbl_faq limit 10"
sqlCtx, _ = whatapsql.Start(ctx, "id:pwd@tcp(x.x.x.x:3306)/test", query)
rows, err := db.QueryContext(ctx, query)
whatapsql.End(sqlCtx, err)
}
import (
whatapsql "github.com/whatap/go-api/sql"
)
func main(){
trace.Init(nil)
//It must be executed before closing the app.
defer trace.Shutdown()
ctx, _ := trace.Start(context.Background(), "Trace Prepared Statement")
defer trace.End(ctx, nil)
// Prepared Statement 생성
query = "select id, subject from tbl_faq where id = ? limit ?"
stmt, err := db.Prepare(query)
if err != nil {
return
}
defer stmt.Close()
params := make([]interface{}, 0)
params = append(params, 8)
params = append(params, 1)
sqlCtx, _ := whatapsql.StartWithParamArray(ctx, "id:pwd(x.x.x.x:3306)/test", query, params)
rows, err := stmt.QueryContext(ctx, params...)
whatapsql.End(sqlCtx, err)
sqlCtx, _ = whatapsql.StartWithParam(ctx, "id:pwd(x.x.x.x:3306)/test", query, params...)
rows, err := stmt.QueryContext(ctx, params...)
whatapsql.End(sqlCtx, err)
}
API
func Start(ctx context.Context, dbhost, sql string) (*SqlCtx, error)
func StartOpen(ctx context.Context, dbhost string) (*SqlCtx, error)
func End(sqlCtx *SqlCtx, err error) error
func StartWithParam(ctx context.Context, dbhost, sql, param ...interface{}) (*SqlCtx, error)
func StartWithParamArray(ctx context.Context, dbhost, sql string, param []interface{}) (*SqlCtx, error)
func Trace(ctx context.Context, dbhost, sql, param string, elapsed int, err error) error
HTTP call 추적
func main(){
trace.Init(nil)
//It must be executed before closing the app.
defer trace.Shutdown()
ctx, _ := trace.Start(context.Background(), "Trace Http Call")
defer trace.End(ctx, nil)
httpcCtx, _ := httpc.Start(ctx, callUrl)
resp, err := http.Get(callUrl)
if err == nil {
httpc.End(httpcCtx, resp.StatusCode, "", nil)
} else {
httpc.End(httpcCtx, 0, "", err)
}
}
Method 추적
func main(){
trace.Init(nil)
//It must be executed before closing the app.
defer trace.Shutdown()
ctx, _ := trace.Start(context.Background(), "Trace Method")
defer trace.End(ctx, nil)
getUser(ctx)
}
func getUser(ctx context.Context) {
methodCtx, _ := method.Start(ctx, "getUser")
defer method.End(methodCtx, nil)
time.Sleep(time.Duration(1) * time.Second)
}