Computer >> 컴퓨터 >  >> 프로그래밍 >> Redis

go-redis, Upstash, OpenTelemetry를 활용한 분산 추적 완벽 가이드

이 튜토리얼에서는 go-redis 클라이언트를 사용해 Upstash Redis 데이터베이스에 연결하는 방법과, 분산 추적(distributed tracing)을 통해 애플리케이션의 성능을 모니터링하는 방법을 알아봅니다.

go-redis란 무엇인가?

go-redis는 Golang에서 가장 널리 사용되는 Redis 클라이언트입니다. 별도의 설정 없이 Redis Server, Sentinel, Cluster를 기본적으로 지원합니다.

Upstash Redis 데이터베이스에 연결하려면 다음 코드를 사용하세요:

package main

import (
	"context"
	"fmt"

	"github.com/go-redis/redis/v8"
)

func main() {
	ctx := context.Background()

	opt, _ := redis.ParseURL("<Upstash에서 발급받은 연결 문자열>")
	client := redis.NewClient(opt)

	if err := client.Set(ctx, "foo", "bar", 0); err != nil {
		panic(err)
	}
	fmt.Println(client.Get(ctx, "foo").Result())
}

임의의 명령어를 실행해야 할 때는 다음과 같은 대체 API를 사용할 수도 있습니다:

val, err := rdb.Do(ctx, "get", "key").Result()
if err != nil {
	if err == redis.Nil {
		fmt.Println("키가 존재하지 않습니다")
		return
	}
	panic(err)
}

go-redis는 데이터 캐싱이나 API 요청에 대한 레이트 리밋(rate-limit) 처리 등 다양한 용도로 활용할 수 있습니다. 클라이언트에 대해 더 자세히 알고 싶다면 Redis Golang 공식 문서를 참고하세요.

분산 추적이란?

분산 추적(Distributed Tracing)은 요청이 분산 시스템, 특히 마이크로서비스 아키텍처로 구축된 시스템을 통과하는 과정을 관찰할 수 있게 해주는 기술입니다.

추적 기능을 사용하면 요청이 분산 시스템을 이동하는 전체 흐름을 따라갈 수 있습니다. 이를 통해 무엇이 달라졌는지, 무엇이 고장 났는지, 어떤 로그와 에러가 관련 있는지 전체적인 맥락을 파악할 수 있습니다.

go-redis, Upstash, OpenTelemetry를 활용한 분산 추적 완벽 가이드

OpenTelemetry란?

OpenTelemetry는 트레이스(trace), 로그(log), 메트릭(metric)을 수집하고 내보낼 수 있는 벤더 중립적인 표준입니다.

Otel(OpenTelemetry)을 사용하면 개발자가 특정 벤더에 종속되지 않는 방식으로 텔레메트리 데이터를 수집하고 내보낼 수 있습니다. OpenTelemetry를 활용하면 애플리케이션을 한 번만 계측(instrumentation)한 후, 계측 코드를 변경하지 않고도 벤더를 추가하거나 교체할 수 있습니다. 예를 들어, OpenTelemetry를 지원하는 인기 있는 DataDog 대안 목록을 확인해 보세요.

OpenTelemetry는 대부분의 프로그래밍 언어에서 사용할 수 있으며, 서로 다른 언어와 환경 간의 상호 운용성을 제공합니다.

go-redis와 추적 통합하기

go-redis에는 redisotel이라는 OpenTelemetry 계측 도구가 포함되어 있으며, 별도의 모듈로 배포됩니다:

go get github.com/go-redis/redis/extra/redisotel/v8

Redis 클라이언트를 계측하려면 redisotel이 제공하는 훅(hook)을 추가해야 합니다:

import (
    "github.com/go-redis/redis/v8"
    "github.com/go-redis/redis/extra/redisotel/v8"
)

rdb := redis.NewClient(&redis.Options{...})

rdb.AddHook(redisotel.NewTracingHook())

추적이 정상적으로 작동하려면 활성화된 trace 컨텍스트를 go-redis 명령어에 전달해야 합니다. 예시는 다음과 같습니다:

ctx := req.Context()
val, err := rdb.Get(ctx, "key").Result()

redisotel에 대해 더 자세히 알고 싶다면 Monitoring Go Redis Performance and Errors 문서를 참고하세요.

Uptrace

Uptrace는 직관적인 쿼리 빌더, 풍부한 대시보드, 자동 알림, 그리고 대부분의 언어와 프레임워크를 위한 통합 기능을 갖춘 오픈소스 DataDog 경쟁사입니다.

DEB/RPM 패키지 또는 사전 컴파일된 바이너리를 다운로드하여 Uptrace를 설치할 수 있습니다.

예상대로 redisotel은 처리된 Redis 명령어에 대한 span을 생성하고, 발생하는 모든 에러를 기록합니다. 수집된 정보가 Uptrace에서 어떻게 표시되는지 아래 이미지에서 확인할 수 있습니다:

go-redis, Upstash, OpenTelemetry를 활용한 분산 추적 완벽 가이드

실행 가능한 예제 코드는 GitHub에서 확인할 수 있습니다.

다음 단계

다음으로는 더 많은 OpenTelemetry 계측 도구를 설치하여 애플리케이션의 다른 영역도 모니터링할 수 있습니다. 예를 들어 Gin 웹 프레임워크나 Go gRPC 등이 있습니다.

또한 OpenTelemetry Tracing API와 Metrics API에 대해 학습하여 자신만의 계측 도구를 만들어 볼 수도 있습니다.