라이브러리 사용

라이브러리 다운로드

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)
}

trace.Func(), trace.HandlerFunc() 을 통해서 Request 를 추적합니다.

http.HandleFunc("/wrapHandleFunc", trace.Func(func(w http.ResponseWriter, r *http.Request) {
    ...
}))
http.Handle("/wrapHandleFunc1", trace.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    ...
}))

일반 트랜잭션 추적

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)
    }
}

API

func Start(ctx context.Context, url string) (*HttpcCtx, error)

func End(httpcCtx *HttpcCtx, status int, reason string, err error) error

func Trace(ctx context.Context, host string, port int, url string, elapsed int, status int, reason string, err error) error

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)

}

API

func Start(ctx context.Context, name string) (*MethodCtx, error)

func End(methodCtx *MethodCtx, err error) error

func Trace(ctx context.Context, name string, elapsed int, err error) error