설정 가이드
whatap-go-inst의 설정 파일과 환경 변수를 사용하여 계측 동작을 제어하는 방법을 안내합니다. Preset으로 간편하게 설정하거나, 개별 패키지를 선택하여 세밀하게 제어할 수 있습니다.
기본 사용 방법은 기본 사용법를 먼저 참고하세요.
설정 파일
파일 위치
설정 파일은 다음 순서로 검색됩니다.
| 우선순위 | 위치 | 설명 |
|---|---|---|
| 1 | --config 플래그 | whatap-go-inst --config=/path/to/config.yaml |
| 2 | WHATAP_INST_CONFIG 환경변수 | WHATAP_INST_CONFIG=/path/to/config.yaml |
| 3 | .whatap/config.yaml | 프로젝트 루트의 .whatap 디렉토리 (권장) |
| 4 | .whatap/whatap.yaml | 대체 파일명 |
프로젝트 루트에 .whatap/config.yaml 파일을 생성하여 사용하는 것을 권장합니다.
기본 구조
# .whatap/config.yaml
instrumentation:
preset: "full" # Preset 선택 (full/minimal/web/database/external/log/custom)
error_tracking: false # 에러 추적 활성화 여부
enabled_packages: [] # 추가로 활성화할 패키지
disabled_packages: [] # 비활성화할 패키지
exclude: # 계측 제외 패턴 (선택사항)
- "**/*_test.go"
설정 항목
Preset 옵션
Preset을 사용하여 계측할 패키지 그룹을 간편하게 선 택할 수 있습니다.
| Preset | 포함 항목 | 설명 |
|---|---|---|
full (기본값) | 웹 + 데이터베이스 + 외부 서비스 + 로그 | 모든 패키지 활성화 |
minimal | trace.Init/Shutdown | 최소 설정 (프레임워크 미들웨어 제외) |
web | Gin, Echo, Fiber, Chi, Gorilla Mux, net/http, FastHTTP | 웹 프레임워크만 |
database | database/sql, sqlx, GORM v1/v2 | 데이터베이스만 |
external | Redis, MongoDB, Kafka, gRPC, Kubernetes | 외부 서비스만 |
log | log, logrus, zap | 로그 라이브러리만 |
custom | enabled_packages로 직접 지정 | 사용자 정의 |
Preset 조합
Preset과 패키지 옵션을 조합하면 더 세밀하게 제어할 수 있습니다.
최종 활성화 패키지 = Preset 패키지 + enabled_packages - disabled_packages
조합 예시:
preset: full+disabled_packages: ["grpc"]→ gRPC 제외한 전체preset: web+enabled_packages: ["sql"]→ 웹 프레임워크 + SQLpreset: custom+enabled_packages: ["gin", "sql"]→ Gin과 SQL만
환경 변수
설정 파일 대신 환경 변수로도 설정할 수 있습니다.
| 환경 변수 | 설명 | 값 | 기본값 |
|---|---|---|---|
GO_API_AST_DEBUG | 디버그 출력 활성화 | 1 (활성화), 0 (비활성화) | 0 |
GO_API_AST_OUTPUT_DIR | 계측된 소스 출력 디렉토리 | 디렉토리 경로 | - |
WHATAP_INST_CONFIG | 설정 파일 경로 | 파일 경로 | .whatap/config.yaml |
설정 우선순위
설정값은 다음 순서로 적용됩니다.
CLI 옵션 > 환경 변수 > 설정 파일 > 기본값
| 출처 | 예시 | 우선순위 |
|---|---|---|
| CLI 옵션 | --error-tracking | 1 (최고) |
| 환경 변수 | GO_API_AST_DEBUG=1 | 2 |
| 설정 파일 | error_tracking: true | 3 |
| 기본값 | false | 4 (최하) |
파일 제외 패턴
계측에서 제외할 파일 패턴을 지정합니다.
기본 제외 패턴
설정 파일에 exclude 패턴을 지정하지 않으면 다음 패턴이 자동으로 적용됩니다:
| 패턴 | 설명 |
|---|---|
**/*.pb.go | protobuf 생성 파일 |
**/*.pb.gw.go | grpc-gateway 생성 파일 |
**/*_grpc.pb.go | grpc 생성 파일 |
**/*.connect.go | connect-go 생성 파일 |
**/*_generated.go | 자동 생성 파일 |
**/*_gen.go | 코드 생성기 출력 |
**/*_test.go | 테스트 파일 |
vendor/** | vendor 디렉토리 |
.git/** | git 디렉토리 |
node_modules/** | node_modules 디렉토리 |
whatap-instrumented/** | 계측된 출력 디렉토리 |
제외 이유
- 생성된 코드 (protobuf, grpc 등): 컴파일 오류 발생 가능
- 테스트 파일: 프로덕션 모니터링에 불필요
- 의존성 디렉토리: 서드파티 코드
사용자 정의 제외 패턴
exclude 패턴을 지정하면 기본값을 대체합니다.
# .whatap/config.yaml
exclude:
- "**/*_test.go"
- "vendor/**"
- "internal/legacy/**" # 레거시 코드 제외
- "migrations/**" # 마이그레이션 파일 제외
Glob 패턴 문법
| 패턴 | 설명 | 매칭 예시 |
|---|---|---|
* | 파일명의 모든 문자 | *.go → main.go |
** | 재귀적으로 모든 디렉토리 | **/test/** → a/b/test/c/d.go |
? | 단일 문자 | test?.go → test1.go |
[abc] | 문자 클래스 | test[12].go → test1.go |
복사 제외 디렉토리 (copy_exclude)
wrap 모드 (whatap-go-inst go build)에서 임시 디렉토리로 소스 파일을 복사할 때 제외할 디렉토리를 지정합니다.
기본 제외 디렉토리
다음 디렉토리는 자동으로 제외됩니다:
| 디렉토리 | 설명 |
|---|---|
.git | Git 저장소 |
.svn | SVN 저장소 |
.hg | Mercurial 저장소 |
node_modules | Node.js 의존성 |
vendor | Go vendor 디렉토리 |
.idea | JetBrains IDE 설정 |
.vscode | VS Code 설정 |
whatap-instrumented | 계측된 소스 출력 |
build, dist 디렉토리는 Go 프로젝트에서 go:embed 대상으로 자주 사용되므로 기본 제외되지 않습니다.
사용자 정의 제외 디렉토리
# .whatap/config.yaml
copy_exclude:
- "tmp" # 임시 디렉토리
- "cache" # 캐시 디렉토리
- "data" # 대용량 데이터 디렉토리
- "testdata" # 테스트 데이터
사용자 정의 copy_exclude 항목은 기본 목록에 추가됩니다 (대체하지 않음).
exclude vs copy_exclude 차이
| 옵션 | 용도 | 적용 시점 |
|---|---|---|
exclude | 계측에서 제외할 파일 패턴 | AST 분석 시 |
copy_exclude | 복사에서 제외할 디렉토리 | wrap 모드 파일 복사 시 |
exclude:_test.go,**/*.pb.go등 glob 패턴으로 특정 파일 제외copy_exclude:tmp,cache등 디렉토리명으로 전체 디렉토리 제외
로그 수집
로그 수집을 활성화하려면 다음과 같이 설정합니다.
# .whatap/config.yaml
instrumentation:
preset: "full" # 로그 패키지 포함
# whatap.conf
logsink_enabled=true
- whatap-go-inst로 계측하면 자동으로 TraceLogWriter가 삽입됩니다
- 로그에 트랜잭션 ID(@txid), 멀티 트랜잭션 ID(@mtid) 등이 자동으로 포함됩니다
- TraceLogWriter 방식을 권장합니다 (트랜잭션 연계 가능)
설정 예시
전체 활성화
# .whatap/config.yaml
instrumentation:
preset: "full"
모든 지원 패키지가 활성화됩니다.
웹과 데이터베이스만
# .whatap/config.yaml
instrumentation:
preset: "custom"
enabled_packages:
- "gin"
- "echo"
- "sql"
- "gorm"
Gin, Echo, database/sql, GORM만 계측됩니다.
특정 패키지 제외
# .whatap/config.yaml
instrumentation:
preset: "full"
disabled_packages:
- "k8s"
- "grpc"
Kubernetes와 gRPC를 제외한 모든 패키지가 계측됩니다.
에러 추적 활성화
# .whatap/config.yaml
instrumentation:
preset: "full"
error_tracking: true
if err != nil 패턴에 trace.Error(ctx, err) 코드가 자동으로 삽입됩니다.
// 변경 전
if err != nil {
return err
}
// 변경 후
if err != nil {
trace.Error(ctx, err) // 자동 추가
return err
}
환경별 설정 파일
# 개발 환경
WHATAP_INST_CONFIG=.whatap/dev-config.yaml whatap-go-inst go build ./...
# 프로덕션 환경
WHATAP_INST_CONFIG=.whatap/prod-config.yaml whatap-go-inst go build ./...
# .whatap/dev-config.yaml
instrumentation:
preset: "full"
debug: true
error_tracking: true
# .whatap/prod-config.yaml
instrumentation:
preset: "full"
error_tracking: true
debug: false
디버그 모드
# .whatap/config.yaml
instrumentation:
debug: true
preset: "full"
빌드 시 상세한 디버그 정보가 출력됩니다.
[whatap-go-inst] Config file: .whatap/config.yaml
[whatap-go-inst] Preset: full
[whatap-go-inst] Processing: main.go
[whatap-go-inst] Added: trace.Init
...
계측 코드 출력
# .whatap/config.yaml
instrumentation:
output_dir: "./instrumented"
preset: "full"
계측된 소스코드가 ./instrumented 디렉토리에 저장됩니다.
사용 사례:
- 계측 결과 검토
- CI/CD에서 계측 코드 분석
트러블슈팅
계측이 적용되지 않는 경우
다음을 확인해보세요:
# 빌드 캐시 삭제 후 재빌드
go clean -cache
whatap-go-inst go build ./...
# 디버그 모드로 상세 로그 확인
GO_API_AST_DEBUG=1 whatap-go-inst go build ./...
컴파일 오류 발생 시
protobuf 등 자동 생성 파일이 계측되어 오류가 발생할 수 있습니다. exclude 패턴을 확인하세요:
# .whatap/config.yaml
exclude:
- "**/*.pb.go"
- "**/*_generated.go"
wrap 모드 빌드가 느린 경우
copy_exclude에 대용량 디렉토리를 추가하세요:
# .whatap/config.yaml
copy_exclude:
- "data"
- "testdata"
- "tmp"
지원 패키지 전체 목록
웹 프레임워크
| 패키지명 | 라이브러리 | 삽입 코드 |
|---|---|---|
gin | github.com/gin-gonic/gin | whatapgin.Middleware() |
echo | github.com/labstack/echo/v4 | whatapecho.Middleware() |
fiber | github.com/gofiber/fiber/v2 | whatapfiber.Middleware() |
chi | github.com/go-chi/chi/v5 | whatapchi.Middleware |
gorilla | github.com/gorilla/mux | whatapmux.Middleware |
nethttp | net/http | whataphttp.Func(), whataphttp.Handler() |
fasthttp | github.com/valyala/fasthttp | whatapfasthttp.Middleware() |
데이터베이스
| 패키지명 | 라이브러리 | 삽입 코드 |
|---|---|---|
sql | database/sql | whatapsql.Open() |
sqlx | github.com/jmoiron/sqlx | whatapsqlx.Open() |
gorm | gorm.io/gorm | whatapgorm.Open() |
jinzhugorm | github.com/jinzhu/gorm | whatapgorm.Open() |
외부 서비스
| 패키지명 | 라이브러리 | 삽입 코드 |
|---|---|---|
redigo | github.com/gomodule/redigo | whatapredigo.Dial() |
goredis | github.com/redis/go-redis/v9 | whatapgoredis.NewClient() |
mongo | go.mongodb.org/mongo-driver | whatapmongo.Connect() |
sarama | github.com/IBM/sarama | Kafka Interceptor |
grpc | google.golang.org/grpc | Server/Client Interceptor |
k8s | k8s.io/client-go | config.Wrap() |
로그 라이브러리
| 패키지명 | 라이브러리 | 삽입 코드 |
|---|---|---|
log | log | log.SetOutput(logsink.GetTraceLogWriter()) |
logrus | github.com/sirupsen/logrus | logrus.SetOutput(logsink.GetTraceLogWriter()) |
zap | go.uber.org/zap | logsink.HookStderr() |