openTelemetry에서 GCP trace를 사용하는 방법
11112 단어 5gcpopentelemetry
openTelemetry란?
openTelemetry는 복잡해지는 시스템의 동작을 분석하는 오픈 소스입니다. 실행된 처리의 시간 계측을 행하는 것으로, 병목이나 장해에 연결되는 원인을 찾을 수 있습니다. openCensus라는 분산 추적의 오픈 소스가 있으며 openTelemetry는 후속됩니다.
openTelemetry
Trace 구조
Trace를 시작할 때 먼저 TraceID라는 식별을 위한 ID를 만듭니다. 이 ID에 따라 Trace의 대상을 고유하게 하거나 Span이라는 계측 구간과의 연결을 실시합니다. Span은 부모와 자식 관계를 가지고 계측의 세분화를 할 수 있습니다. 아래 그림은 맨 위의 부모 Span을 3 분할하여 중앙의 아이 Span2를 보다 상세하게 추적하는 구조로 되어 있습니다.
Go를 사용하여 구현
기기 : MacBook PRO
Go : go1.15.2
클라우드 : GCP
설치
Trace를 시작할 때 먼저 TraceID라는 식별을 위한 ID를 만듭니다. 이 ID에 따라 Trace의 대상을 고유하게 하거나 Span이라는 계측 구간과의 연결을 실시합니다. Span은 부모와 자식 관계를 가지고 계측의 세분화를 할 수 있습니다. 아래 그림은 맨 위의 부모 Span을 3 분할하여 중앙의 아이 Span2를 보다 상세하게 추적하는 구조로 되어 있습니다.
Go를 사용하여 구현
기기 : MacBook PRO
Go : go1.15.2
클라우드 : GCP
설치
htps : /// g g. 오 rg / c / in s tai l
$ export PATH=/usr/local/go/bin:$PATH
초기화
go mod를 사용하여 모듈을 관리하기 위해 초기화를 수행합니다.
다음 명령을 실행하면 go.mod라는 파일이 생성됩니다.
$ go mod init example.com/trace
그리고는 코드내에 읽어들이는 모듈의 설정을 해 빌드를 하는 것으로, 자동으로 go.mod에 읽어들이는 모듈의 설정을 추기해 줍니다.
구성
최종 구성은 다음과 같습니다.
.
├── Dockerfile
├── go.mod
├── go.sum
└── main.go
소스 코드
main.go
HTTP 요청을 받는 API를 만드는 중입니다.
추적을 위한 패키지를 로드하고 프로젝트 설정과 같은 초기 설정을 수행합니다.
이 코드에서는
1. example.com/trace라는 Tracer 만들기
2. sample이라는 span 시작
3. 각 step에서의 처리 시간을 계측
하고 있습니다.
package main
import (
"context"
"fmt"
"log"
"net/http"
"os"
"time"
texporter "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace"
"go.opentelemetry.io/otel/api/global"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
)
func handler(w http.ResponseWriter, r *http.Request) {
exporter, err := texporter.NewExporter(texporter.WithProjectID("{project id}"))
if err != nil {
log.Fatalf("texporter.NewExporter: %v", err)
}
tp, err := sdktrace.NewProvider(sdktrace.WithSyncer(exporter))
if err != nil {
log.Fatal(err)
}
global.SetTraceProvider(tp)
tracer := global.TraceProvider().Tracer("example.com/trace")
ctx, span := tracer.Start(context.Background(), "sample")
defer span.End()
_, step1 := tracer.Start(ctx, "step1")
time.Sleep(time.Second * 1)
step1.End()
_, step2 := tracer.Start(ctx, "step2")
time.Sleep(time.Second * 2)
step2.End()
fmt.Fprintf(w, "Done\n")
}
func main() {
http.HandleFunc("/", handler)
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
}
Dockerfile
멀티 스테이지 빌드를 사용하여 상단에서 실행 파일을 만듭니다. 작성한 실행 파일만 alpine 이미지에 복사하여 배포할 이미지를 만듭니다.
FROM golang:1.15 as builder
WORKDIR /app
COPY go.* ./
RUN go mod download
COPY . ./
RUN CGO_ENABLED=0 GOOS=linux go build -v -o server
FROM alpine:3
RUN apk add --no-cache ca-certificates
COPY --from=builder /app/server /server
CMD ["/server"]
건설
Cloud Run에 배포합니다.
gcloud builds submit에서 이미지를 빌드하고 Container Registry에 저장합니다. 그런 다음 gcloud run deploy를 사용하여 저장된 이미지에서 배포합니다.
$ gcloud builds submit --tag gcr.io/$1/{イメージ名}
$ gcloud run deploy {サービス名} --image gcr.io/$1/{イメージ名} --platform managed --memory 256M --region {region} --allow-unauthenticated
결과
배포된 API를 실행하고 GCP의 Trace를 보면 다음과 같이 표시됩니다.
sample의 span 안에 step1과 step2의 실행 시간이 시각화되어 표시됩니다.
트레이서를 작성해, 계측하고 싶은 부분을 둘러싸는 것으로 간단하게 시간의 계측을 할 수 있었습니다. 또, 문맥 인수에 트레이서를 실행하는 것으로 중첩으로 계측할 수가 있으므로, API 중에서도 어느 부분에 처리의 시간이 걸리고 있는지 조사할 수가 있습니다. 트레이스의 결과를 모으는 것으로 항상 속도가 느린지 그때만 처리가 늦어졌는지 나중에 검증할 수 있다고 하는 장점은 크다고 생각합니다.
Reference
이 문제에 관하여(openTelemetry에서 GCP trace를 사용하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/yutaka-note/items/0cbeefd6d17e39b1f902
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(openTelemetry에서 GCP trace를 사용하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yutaka-note/items/0cbeefd6d17e39b1f902텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)