오늘 PHP 편집자인 Xiaoxin은 개발자가 다양한 서비스에서 통합 범위 관리를 달성하는 데 도움이 될 수 있는 강력한 도구인 OpenTelemetry를 소개합니다. 최신 분산 시스템에서 애플리케이션은 각각 고유한 로그, 지표 및 추적 정보를 포함하는 여러 마이크로서비스로 구성되는 경우가 많습니다. OpenTelemetry는 이 정보를 통합하고 관리하는 간단하고 강력한 방법을 제공하므로 개발자는 전체 시스템의 성능과 동작을 더 잘 이해하고 디버그할 수 있습니다. 로컬 개발 환경이든 프로덕션 환경이든 OpenTelemetry는 개발자가 애플리케이션을 더 잘 이해하고 최적화하는 데 도움이 됩니다.
저는 방금 opentelemetry를 사용하기 시작했고 이에 대한 두 개의 (마이크로) 서비스인 standard 및 geomap을 만들었습니다.
최종 사용자가 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.unaryclientinterceptor
otelgrpc.unaryclientinterceptor
在这里,这应该确保上下文正确传播,但不清楚何时调用此函数。如果在调用 getstandard
函数之前调用它,则用于创建客户端的上下文将不包含来自 getstandard
를 올바르게 사용하고 있습니다. 여기서는 컨텍스트가 올바르게 전파되는지 확인해야 하지만 이 함수가 호출될 때 명확하지 않습니다.
의 범위 컨텍스트를 포함하지 getstandard
newctx
直接传递给 getcountry
函数来完成此操作,如 getstandard
테스트를 위해
getcountry
请求的上下文将包括来自 getstandard
수정된 버전의
newctx
를 함수에 직접 전달하여 이 작업을 수행할 수 있습니다. createclient
和 getcountry
으아아아
요청을 하는 데 사용되는 컨텍스트에는 이제
의 범위 컨텍스트가 포함되며 jaeger에서 동일한 추적의 일부로 표시되어야 합니다.및 와 같은 함수에서 반환된 오류를 확인하세요). a> 또한:
또한 전파자를 확인하세요. 두 서비스 모두에서 동일한컨텍스트 전파자main
를 사용하는지 확인하세요. 가급적이면 opentelemetry의 기본값인
다음과 같이 명시적으로 전파자를 설정할 수 있습니다.
으아아아두 서비스 getcountry
기능의 시작 부분에 위 줄을 추가하세요.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!