>  기사  >  백엔드 개발  >  OpenTelemetry를 사용하여 다양한 서비스 범위 통합

OpenTelemetry를 사용하여 다양한 서비스 범위 통합

WBOY
WBOY앞으로
2024-02-13 23:00:11439검색

使用 OpenTelemetry 统一不同服务的范围

오늘 PHP 편집자인 Xiaoxin은 개발자가 다양한 서비스에서 통합 범위 관리를 달성하는 데 도움이 될 수 있는 강력한 도구인 OpenTelemetry를 소개합니다. 최신 분산 시스템에서 애플리케이션은 각각 고유한 로그, 지표 및 추적 정보를 포함하는 여러 마이크로서비스로 구성되는 경우가 많습니다. OpenTelemetry는 이 정보를 통합하고 관리하는 간단하고 강력한 방법을 제공하므로 개발자는 전체 시스템의 성능과 동작을 더 잘 이해하고 디버그할 수 있습니다. 로컬 개발 환경이든 프로덕션 환경이든 OpenTelemetry는 개발자가 애플리케이션을 더 잘 이해하고 최적화하는 데 도움이 됩니다.

질문 내용

저는 방금 opentelemetry를 사용하기 시작했고 이에 대한 두 개의 (마이크로) 서비스인 standardgeomap을 만들었습니다.

최종 사용자가 standard서비스에 요청을 보내고, 서비스는 정보를 얻기 위해 geomap에 요청을 보내고, 최종 사용자에게 결과를 반환합니다. 나는 모든 통신에 grpc를 사용합니다.

저는 다음과 같이 기능을 계측했습니다:

표준의 경우:

으아아아

Geo 지도의 경우:

으아아아

두 서비스 모두 해당 범위를 jaeger 백엔드로 보내고 거의 동일한 주요 기능을 공유하도록 구성되었습니다(설명에 미묘한 차이점이 언급되어 있음).

으아아아

최종 사용자의 standard 서비스 요청에 의해 생성된 추적을 보면 예상대로 geomap서비스를 호출하고 있음을 알 수 있습니다.

그러나 하위 범위에 추가된 속성이나 이벤트는 표시되지 않습니다(geomapgetcountry 함수를 계측할 때 속성 1개와 이벤트 2개를 추가했습니다).

그러나 이러한 속성은 표준 서비스의 하위 범위와 전혀 관련이 없는 범위 ID를 가진 또 다른 별도의 추적(jaeger의 "geomap" 서비스에서 사용 가능)에서 사용할 수 있음을 확인했습니다.

이제 내가 기대하는 것은 standard 범위 내의 하위 범위에서 geomap과 관련된 모든 속성/이벤트를 추적하고 볼 수 있는 것입니다. 여기서 예상되는 결과를 어떻게 얻나요?

해결 방법

범위 컨텍스트("서비스 계측 및 용어 "에 설명된 추적 ID 및 범위 ID 포함)는 동일한 추적의 일부가 되도록 상위 범위에서 하위 범위로 전파되어야 합니다.

opentelemetry를 사용하면 일반적으로 grpc를 포함한 다양한 라이브러리에 제공되는 플러그인을 사용하여 코드를 계측하여 자동으로 수행됩니다.
그러나 귀하의 경우 전파가 제대로 작동하지 않는 것 같습니다.

귀하의 코드에는 getstandard 函数中启动一个新范围,然后在发出 getcountry 请求时使用该上下文 (newctx)。这是正确的,因为新上下文应该包含父跨度的跨度上下文 (getstandard)가 있습니다.
하지만 문제는 createclient 기능과 관련이 있을 수 있습니다.

으아아아

otelgrpc.unaryclientinterceptorotelgrpc.unaryclientinterceptor 在这里,这应该确保上下文正确传播,但不清楚何时调用此函数。如果在调用 getstandard 函数之前调用它,则用于创建客户端的上下文将包含来自 getstandard를 올바르게 사용하고 있습니다. 여기서는 컨텍스트가 올바르게 전파되는지 확인해야 하지만 이 함수가 호출될 때 명확하지 않습니다.

함수를 호출하기 전에 호출되면 클라이언트를 생성하는 데 사용된 컨텍스트는

의 범위 컨텍스트를 포함하지 getstandard

합니다.

newctx 直接传递给 getcountry 函数来完成此操作,如 getstandard테스트를 위해

함수를 호출한 후 클라이언트가 생성되고 요청 전반에 걸쳐 동일한 컨텍스트가 사용되는지 확인하세요.

getcountry 请求的上下文将包括来自 getstandard수정된 버전의

함수에 표시된 대로 newctx

함수에 직접 전달하여 이 작업을 수행할 수 있습니다. createclientgetcountry 으아아아

클라이언트를 생성하고

요청을 하는 데 사용되는 컨텍스트에는 이제

의 범위 컨텍스트가 포함되며 jaeger에서 동일한 추적의 일부로 표시되어야 합니다.
  • (언제나 마찬가지로, 간결성을 위해 여기에 표시되지 않은

    와 같은 함수에서 반환된 오류를 확인하세요). a> 또한:

    또한 전파자를 확인하세요. 두 서비스 모두에서 동일한

    컨텍스트 전파자main를 사용하는지 확인하세요. 가급적이면 opentelemetry의 기본값인

    w3c Tracecontextpropagator
  • 를 사용하세요.
  • 다음과 같이 명시적으로 전파자를 설정할 수 있습니다.

    으아아아

    두 서비스 getcountry 기능의 시작 부분에 위 줄을 추가하세요.

    🎜 🎜🎜메타데이터를 전달해야 합니다. grpc 인터셉터는 요청의 메타데이터에서 추적 컨텍스트를 자동으로 삽입/추출해야 하지만 제대로 작동하는지 다시 확인하세요. 🎜 🎜 🎜 함수에서 범위를 시작한 후 추적 ID와 범위 ID를 기록할 수 있습니다. 🎜
    ctx, span := otel.tracer(name).start(ctx, "getcountry")
    sc := trace.spancontextfromcontext(ctx)
    log.printf("trace id: %s, span id: %s", sc.traceid(), sc.spanid())
    defer span.end()
    

    并在 getstandard 函数中执行相同的操作:

    newCtx, span1 := otel.Tracer(name).Start(ctx, "GetStandard")
    sc := trace.SpanContextFromContext(newCtx)
    log.Printf("Trace ID: %s, Span ID: %s", sc.TraceID(), sc.SpanID())
    defer span1.End()
    

    如果上下文正确传播,两个服务中的跟踪 id 应该匹配。

위 내용은 OpenTelemetry를 사용하여 다양한 서비스 범위 통합의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제