마이크로서비스 모니터링 가능성 도구는 Google Cloud 및 기타 위치에 배포된 gRPC 워크로드에서 Cloud Monitoring, Cloud Logging, Cloud Trace의 원격 분석 데이터를 수집하고 나타내기 위해 애플리케이션을 계측하는 기능을 제공합니다. 마이크로서비스 모니터링 가능성은 마이크로서비스 API를 사용 설정하여 Monitoring, Logging, Trace에 액세스할 수 있는 권한이 부여된 모든 배포에서 작동합니다.
이 튜토리얼에서는 Compute Engine을 사용하여 Google Cloud 에서 간단한 gRPC 애플리케이션을 빌드하여 마이크로서비스 모니터링 가능성 기능을 사용하고 마이크로서비스 모니터링 가능성으로 애플리케이션을 계측하고 Monitoring 및 Logging에서 실시간으로 표시되는 마이크로서비스를 보는 방법을 알아봅니다.
Compute Engine VM 만들기 및 연결
다음 안내에 따라 Compute Engine VM 인스턴스를 만들고 연결합니다. VM에서 애플리케이션을 배포한 후 마이크로서비스 모니터링 가능성으로 애플리케이션을 계측합니다.
VM 인스턴스를 만듭니다.
gcloud compute instances create grpc-observability-vm \ --image-family=debian-11 \ --image-project=debian-cloud \ --service-account=SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
VM 인스턴스에 연결합니다.
gcloud compute ssh --project=$PROJECT_ID grpc-observability-vm
Compute Engine VM에 애플리케이션 배포
원하는 애플리케이션을 이전 단계에서 만든 Compute Engine VM에 배포한 후 이 단계를 건너뛰거나 예시를 사용하여 원하는 언어로 안내를 계속 진행할 수 있습니다.
C++
VM 인스턴스에 연결한 후 다음 명령어를 실행합니다.
sudo apt-get update -y sudo apt-get install -y git build-essential clang git clone -b v1.54.0 https://github.com/grpc/grpc.git --depth=1
Go
Go가 설치되었는지 확인합니다.
sudo apt-get install -y git sudo apt install wget wget https://go.dev/dl/go1.20.2.linux-amd64.tar.gz sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf \ go1.20.2.linux-amd64.tar.gz export PATH=$PATH:/usr/local/go/bin
gRPC-Go
예시를 클론합니다.git clone https://github.com/grpc/grpc-go.git cd grpc-go/ git checkout -b run-observability-example 875c97a94dca8093bf01ff2fef490fbdd576373d
Java
VM 인스턴스에 연결한 후 Java 8 이상이 설치되었는지 확인합니다.
sudo apt update sudo apt upgrade sudo apt install git sudo apt-get install -y openjdk-11-jdk-headless
grpc-java
저장소를 클론합니다.export EXAMPLES_VERSION=v1.54.1 git clone -b $EXAMPLES_VERSION --single-branch --depth=1 \ https://github.com/grpc/grpc-java.git
gRPC Google Cloud Observability 구성 파일 만들기
서버 및 클라이언트 모두에 마이크로서비스 모니터링 가능성을 사용 설정하려면 별도의 gRPC Google Cloud Observability 구성 파일이 필요합니다. 이후 단계에서 이 파일의 위치를 GRPC_GCP_OBSERVABILITY_CONFIG_FILE
로 내보냅니다. 구성 파일에서 다양한 매개변수를 설정하는 방법을 알아보려면 다음 안내를 따르세요.
예시 GRPC_GCP_OBSERVABILITY_CONFIG_FILE
{
"project_id": "your-project-here",
"cloud_logging": {
"client_rpc_events": [
{
"methods": ["google.pubsub.v1.Subscriber/Acknowledge", "google.pubsub.v1.Publisher/CreateTopic"],
"exclude": true,
},
{
"methods": ["google.pubsub.v1.Subscriber/*", "google.pubsub.v1.Publisher/*"],
"max_metadata_bytes": 4096,
"max_message_bytes": 4096,
}],
"server_rpc_events": [{
"methods": ["*"],
"max_metadata_bytes": 4096,
"max_message_bytes": 4096
}],
},
"cloud_monitoring": {},
"cloud_trace": {
"sampling_rate": 0.5,
}
"labels": {
"SOURCE_VERSION": "J2e1Cf",
"SERVICE_NAME": "payment-service-1Cf",
"DATA_CENTER": "us-west1-a"
}
}
다음 섹션에는 개별 구성요소의 구성에서 데이터 수집을 사용 설정하는 방법에 대한 안내가 포함되어 있습니다. 이 튜토리얼에서 gRPC 예시를 사용한 경우 이 구성을 있는 그대로 사용하거나(your-project-here
업데이트 후) 애플리케이션의 템플릿으로 사용할 수 있습니다. 예시는 환경 변수의 구성 정보를 보여줍니다.
측정항목 사용 설정
측정항목을 사용 설정하려면 구성에 cloud_monitoring
객체를 추가하고 값을 {}
로 설정합니다.
측정항목에 대한 자세한 내용은 측정항목 정의를 참조하세요.
추적 사용 설정
추적을 사용 설정하려면 다음을 수행합니다.
- 구성에
cloud_trace
객체를 추가합니다. cloud_trace.sampling_rate
를0.5
로 설정하여 RPC의 50%를 무작위로 추적합니다.
서비스 간 추적을 사용 설정하려면 업스트림에서 수신된(또는 그 자체로 시작된) trace 컨텍스트를 다운스트림으로 전파하는 것이 서비스에서 지원되어야 합니다.
Tracing에 대한 자세한 내용은 Trace 정의를 참조하세요.
로깅 사용 설정
로깅을 사용 설정하려면 다음을 수행합니다.
- 구성에
cloud_logging
객체를 추가합니다. client_rpc_events
및server_rpc_events
중 하나 또는 모두에 패턴을 추가하여 전송 수준 이벤트 로깅을 생성할 서비스 또는 메서드 집합과 헤더 및 메시지에 대해 로깅할 바이트 수를 지정합니다.
로깅에 대한 자세한 내용은 로그 레코드 정의를 참조하세요.
모니터링 가능성 플러그인에 대한 애플리케이션 계측
마이크로서비스 모니터링 가능성 플러그인을 사용할 수 있도록 애플리케이션을 계측하려면 원하는 언어에 대한 다음 안내를 따르세요.
C++
gRPC C++ v1.54부터 마이크로서비스 모니터링 가능성과 함께 C++를 사용할 수 있습니다. 저장소 예시는 GitHub에 있습니다.
모니터링 가능성 지원은 Bazel 빌드 시스템을 통해서만 제공됩니다. 대상
grpcpp_gcp_observability
를 종속 항목으로 추가합니다.마이크로서비스 모니터링 가능성을 선택하려면 추가 종속 항목이 필요하고(모니터링 가능성 모듈) 기존 gRPC 클라이언트, 서버 또는 둘 다에 대해 다음 코드를 변경해야 합니다.
#include <grpcpp/ext/gcp_observability.h> int main(int argc, char** argv) { auto observability = grpc::GcpObservability::Init(); assert(observability.ok()); … // Observability data flushed when object goes out of scope }
채널, 서버, 사용자 인증 정보 생성을 포함하여 gRPC 작업 전에 다음을 호출합니다.
grpc::GcpObservability::Init();
그러면 저장해야 하는
absl::StatusOr<GcpObservability>
가 반환됩니다. 상태에 따라 모니터링 가능성이 성공적으로 초기화되었는지 여부를 확인할 수 있습니다. 함께 제공되는GcpObservability
객체는 모니터링 가능성의 전체 기간을 제어하고, 범위를 벗어날 때 모니터링 가능성 데이터를 자동으로 닫고 플러시합니다.
Go
- 마이크로서비스 모니터링 가능성 플러그인은 gRPC Go 버전
v1.54.0
이상에 대해 지원됩니다. 저장소 예시는 GitHub에 있습니다.
Go 모듈의 경우 마이크로서비스 모니터링 가능성을 선택하려면 모니터링 가능성 모듈 및 다음 코드가 필요합니다.
import "google.golang.org/grpc/gcp/observability"
func main() {
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
if err := observability.Start(ctx); err != nil {
log.Warning("Unable to start gRPC observability:", err)
}
defer observability.End()
…
}
observability.Start
호출은 환경 변수에서 구성을 파싱하고, 그에 따라 내보내기 도구를 만들고, 호출 후 생성되는 클라이언트 연결 및 서버에 대해 수집 논리를 삽입합니다. 지연된 observability.End
호출은 리소스를 삭제하고 애플리케이션이 종료되기 전 버퍼링된 데이터가 비워지도록 합니다.
애플리케이션 코드가 업데이트된 후 다음 명령어를 실행하여 go.mod
파일을 업데이트합니다.
go mod tidy
Java
Java 애플리케이션에 마이크로서비스 모니터링 가능성을 사용하려면 grpc-gcp-observability
아티팩트를 포함하도록 빌드를 수정합니다. gRPC 버전 1.54.1 이상을 사용합니다.
Gradle 및 Maven 빌드 도구 섹션의 빌드 스니펫에서 grpcVersion
은 값 1.54.1로 설정됩니다.
저장소 예시는 GitHub에 있습니다.
- 마이크로서비스 모니터링 가능성에 대해 Java 애플리케이션을 성공적으로 계측하기 위해서는 다음 코드를
main()
에 추가합니다.
...
import io.grpc.gcp.observability.GcpObservability;
...
// Main application class
...
public static void main(String[] args) {
...
// call GcpObservability.grpcInit() to initialize & get observability
GcpObservability observability = GcpObservability.grpcInit();
...
// call close() on the observability instance to shutdown observability
observability.close();
...
}
모든 gRPC 채널 또는 서비스가 생성되기 전에 GcpObservability.grpcInit()
를 호출해야 합니다. GcpObservability.grpcInit()
함수는 마이크로서비스 모니터링 가능성 구성을 읽고 이를 사용해서 생성된 각 채널 및 서버에서 로깅, 측정항목, trace 기능에 필요한 전역 인터셉터 및 추적기를 설정합니다. GcpObservability.grpcInit()
는 스레드에 안전하며 정확히 한 번 호출되어야 합니다. 나중에 close()
를 호출하기 위해 저장해야 하는 GcpObservability
의 인스턴스를 반환합니다.
GcpObservability.close()
는 리소스를 할당 해제합니다. 이후에 생성되는 채널 또는 서버는 로깅을 수행하지 않습니다.
GcpObservability
는 try-with-resource
를 다음과 같이 사용할 경우 자동으로 종료되는 java.lang.AutoCloseable
을 구현합니다.
...
import io.grpc.gcp.observability.GcpObservability;
...
// Main application class
...
public static void main(String[] args) {
...
// call GcpObservability.grpcInit() to initialize & get observability
try (GcpObservability observability = GcpObservability.grpcInit()) {
...
} // observability.close() called implicitly
...
}
Gradle 빌드 도구 사용
Gradle 빌드 도구를 사용하는 경우 다음을 포함합니다.
def grpcVersion = '1.54.1'
...
dependencies {
...
implementation "io.grpc:grpc-gcp-observability:${grpcVersion}"
...
}
Maven 빌드 도구 사용(pom.xml)
Maven 빌드 도구를 사용하는 경우 다음을 포함합니다.
<properties>
...
<grpc.version>1.54.1</grpc.version>
...
</properties>
...
<dependencies>
...
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-gcp-observability</artifactId>
<version>${grpc.version}</version>
</dependency>
...
</dependencies>
애플리케이션 실행
튜토리얼에 gRPC 예시를 사용한 경우에만 이 섹션의 안내를 따르세요. 애플리케이션 바이너리를 타겟팅하도록 run
명령어를 수정할 수 있습니다.
서버 실행
C++
- VM에 SSH를 통해 연결되는 세션을 만듭니다.
환경 변수를 내보냅니다. 위에 정의된 단계를 사용하여
server_config.json
을 만듭니다.export GOOGLE_CLOUD_PROJECT=$PROJECT_ID export GRPC_GCP_OBSERVABILITY_CONFIG_FILE="$(pwd)/examples/cpp/gcp_observability/helloworld/server_config.json"
서버 애플리케이션
shell cd grpc tools/bazel run examples/cpp/gcp_observability/helloworld:greeter_server
를 실행합니다.
Go
- VM에 SSH를 통해 연결되는 세션을 만듭니다.
환경 변수를 내보냅니다. 위에 정의된 단계를 사용하여
server_config.json
을 만듭니다.export GRPC_GCP_OBSERVABILITY_CONFIG_FILE=./server/serverConfig.json
서버 애플리케이션
shell go run ./server/main.go
를 실행합니다.
Java
- 예시 디렉터리에서 리드미 파일을 열고 파일 안내를 따릅니다.
- 다른 터미널 창을 열라는 안내가 있으면 다음 명령어를 실행합니다.
shell gcloud compute ssh --project=$PROJECT_ID grpc-observability-vm
클라이언트 실행
C++
- VM에 SSH를 통해 연결되는 다른 세션을 만듭니다.
환경 변수를 내보냅니다. 위에 정의된 단계를 사용하여
client_config.json
파일을 만듭니다.export GOOGLE_CLOUD_PROJECT=$PROJECT_ID export GRPC_GCP_OBSERVABILITY_CONFIG_FILE="$(pwd)/examples/cpp/gcp_observability/helloworld/client_config.json"
클라이언트 애플리케이션을 실행합니다.
cd grpc tools/bazel run examples/cpp/gcp_observability/helloworld:greeter_client
Go
- VM에 SSH를 통해 연결되는 다른 세션을 만듭니다.
- 환경 변수를 내보냅니다. 위에 정의된 단계를 사용하여
client_config.json
파일을 만듭니다.shell export GRPC_GCP_OBSERVABILITY_CONFIG_FILE=./client/clientConfig.json
클라이언트 애플리케이션을 실행합니다.
cd grpc-go/examples/features/observability go run ./client/main.go
Java
- 예시 디렉터리에서 리드미 파일을 열고 파일 안내를 따릅니다.
- 다른 터미널 창을 열라는 안내가 있으면 다음 명령어를 실행합니다.
shell gcloud compute ssh --project=$PROJECT_ID grpc-observability-vm