Skywalking 링크 프로세스 간 정보 전송 프로토콜 (A)

머리말

온 "Skywalking 크로스 링크 정보 전송 프로토콜의 과정을"의 nginx 프로브 초점을 맞추고을 skywalking 개발하는 과정에서 "링크 데이터 수집 프로토콜을 Skywalking." Nginx에 프로브가 완료된 skywalking 및 생산 환경에서 라인의 버전을 달성, 관심있는 친구들은 교환 할 수 있습니다. 기반 Skywalking v5.0.0-GA 분석은 뒤에 일부 버전 있지만, 그러나이 프로토콜의 핵심은 많이 변경되지 않았습니다. 이 계약은 다음 링크를 참조 공식 영어 제목 및 문서 :

이해의 편의를 위해,이 문서는 것 Skywalking-Cross-Process-Propagation-Headers-Protocol-v1으로 해석 跨进程链路信息传递协议, Trace-Data-Protocol해석 Skywalking链路数据采集协议. 두 협정이라는 공식은 중국어 번역, 자체 검사가 있습니다. "크로스 링크 메시징 프로토콜 과정 '자체가 이해하기 어려운 아니지만, 고려해야 할 여러 요인의 실현,이 시리즈는 프로브의 심층 분석 자바 소스 코드를 결합합니다. 이 문서에서는 설명에 초점을 맞추고 链路ID생성 과정을.

프로세스 간 정보 전송 프로토콜 역할 링크

분산 시스템에서, 사용자 데이터에 대한 요청 데이터 서비스 노드의 서비스 요청을 처리 할 백엔드 시스템의 복수를 시작한다. 링크 추적 시스템의 중요한 역할 중 하나는 데이터 처리 노드, 논리적 관계, 오랜 매니저, 토폴로지 및 기타 정보를 객관적으로 실제 반응 아웃 개별 서비스를 주문 할 수있을 것입니다. 프로세스 시스템은 일반적으로, 서비스 노드로서 동작 跨进程결과를 설명. 완전한 분산 시스템은 다양한 서비스 노드는 종종 다른 구성 요소, 다른 언어, 서로 다른 기술 스택 구성 요소가 있습니다. 등등 자바, 노드 서비스의 nginx 구성 요소와 같은 서비스를 제공합니다. 서로 다른 노드 생성, 전송, 식별, 해상도, 코딩 및 기타 문제의 링크 데이터를 해결하려면 계약 링크 데이터를 처리 할 수있는 다른 언어 사양의 집합을 가질 것이다. 그래서 跨进程链路信息传递协议나는 태어났다.

Skywalking 자바 에이전트 소스 구조 소개

자바 에이전트의 소스 구조를 Skywalking 추적 세그먼트 ID 생성 로직 섹션을 소개합니다에 대해 이야기하기 전에. 에 v5.0.0-GA를 Skywalking, 패키지의 자바 에이전트 Skywalking 링크 정보는 추상화 소스 위치 apm-sniffer/apm-agent-core모듈. 모듈의 처리 로직은 본원에 다음과 같이 수행 링크 데이터 분석.

  • 링크 데이터 추상화 모델 기능은 잠시 일반적으로 호환 Opentracing 사양을 패키지 계약 데이터 링크 데이터 추상화를 캡슐화된다. 주요 클래스는 다음이있다

    • org.apache.skywalking.apm.agent.core.context.trace.TraceSegment
    • org.apache.skywalking.apm.agent.core.context.trace.TraceSegmentRef
    • org.apache.skywalking.apm.agent.core.context.trace.EntrySpan
    • org.apache.skywalking.apm.agent.core.context.trace.ExitSpan
    • org.apache.skywalking.apm.agent.core.context.ids.DistributedTraceIds
  • 크로스 링크 데이터 추상화와 캡슐화 과정은 클래스가 집중 org.apache.skywalking.apm.agent.core.context.ContextCarrier. 즉, 프로토콜 사양 캡슐화 본원 설명한다.

  • 링크 데이터 수집 패키지 키 추상화 모델 클래스이다 org.apache.skywalking.apm.agent.core.context.TracingContext. ThreadLocal을 저장 TracingContext는 주로 제어 스팬, 데이터 링크의 모든 데이터의 제어 방법을 포함한다. ContextCarrier 처리 데이터를 제공하는 단계 동안 :

    • ContextCarrier, 즉 org.apache.skywalking.apm.agent.core.context.TracingContext # 주입 TraceSegment 변환
    • ContextCarrier TraceSegment 데이터로부터 데이터를 추출, 즉 org.apache.skywalking.apm.agent.core.context.TracingContext # 추출물
  • 링크 데이터 수집 모듈은 초점을 맞추고 org.apache.skywalking.apm.agent.core.context.ContextManager클래스입니다. ContextManager 클래스는 에이전트 플러그인을 skywalking의 모든 종류의 허브입니다. MQ 등, 보행, 톰캣, 스프링, 제 플러그인 skywalking Skywalking 플러그로서 다른 성분은 생성 TracingContext, TraceSegment, EntrySpan, ExitSpan 제어한다 ContextCarrier ContextManager 호출하여 다른 데이터. ContextManager 에이전트의 데이터 링크의 라이프 사이클을 제어라고 할 수있다.

  • 포커스 링크 데이터 업로드 모듈 org.apache.skywalking.apm.agent.core.remote패키지 TraceSegmentServiceClient클래스. 노드 ContextManager 컬렉션 내의 링크 데이터 세그먼트 (TraceSegment) 후, 데이터 통지 TraceSegmentServiceClient 수집 서버에보고한다. 관련 어떤 TracingContextListenerskywalking 패키지를 内存MQ조립, 우리는 나중에 상세히 분석합니다.

복잡한 처리 로직 뒤에를 포함 위의 각 섹션에 대한 자세한 설명을 할 기사 (11)로 구분됩니다.

Skywalking 링크 ID 생성 과정과 자바 구현

공식 문서 - 크로스 프로세스-Propagation- Skywalking 헤더 프로토콜-V1은 자세한 설명, 추가 분석을 위해 본 논문 자바 구현했다.

1. 추적 세그먼트 아이디 프로토콜 사양

추적 세그먼트 ID는 분산 추적의 부분에 대한 고유 한 ID입니다. 각 ID는 하나의 스레드 만 사용됩니다. ID는 세 부분 (롱), 예를 들어 "1.2343.234234234을 포함

  1. 첫번째는 콜렉터 할당 어플리케이션 인스턴스 ID를 나타낸다. (대부분 그냥 정수 값 protobuf에 도움이 될 것입니다)
  2. 두 번째는 스레드 ID를 나타낸다. (자바 가능성이 가장 높은 단지 정수 값은 protobuf에 도움이 될 것입니다)
  3. 세 번째는 두 부분으로 3.1를 갖는다. 0 (포함) 9999 (포함) 사이의 전류 스레드 밀리 3.2.A 서열 측정 소인,

다른 언어를 사용하는 경우, 당신은 자신의 ID를 생성하지만 독특하고 세 갈망에 의해 결합되어 있는지 확인 할 수 있습니다.

세부

  • 추적 세그먼트는 콜 체인 추상 분산되어 분산 시스템에서 각각의 서비스 노드로 이해 될 수있다.
  • 프로토콜 추적 세그먼트 ID는 세 부분으로 구성해야합니다, 각 부분은 롱 타입의 값입니다. 세 부분은 점 데이터 형태로 추적 세그먼트 ID 문자열에 의해 연결되어있다.
  • 추적 세그먼트 ID 문자열은 긴을 보장하기 위해 세 개의 필요가 ID로 구성, 생성, 그리고 전 세계적으로 유일한이 될 수 있습니다. 우리는 세 가지 부분은 개발자가 자체적으로 지정 될 수있다 논리적 의미를 규정하지 않았다.
  • 자바 화제 생성 세 부분 원래 규칙 ID가 기재되어있다. 즉 : 제 어플리케이션 인스턴스 ID를 나타내는 두 번째 부분은 스레드 번호와 타임 스탬프 증분 시퀀스의 제 3 부분이다.

2. 추적 세그먼트 ID 생성 과정

우선 skywalking 자바 에이전트가 제공하는 org.apache.skywalking.apm.agent.core.context.ids.ID프로토콜 명세서에 개시된 클래스에 대한 데이터 구조 및 toString를? 정당성 직렬화 방법 변환 isValid 검사 재기록하는 방법을 제공하며, hashCode 메소드, 같다. 변환 링크 취득 데이터 수집기 서버에보고함으로써 grpc protobuf로 데이터 시퀀스에 대한 방법을 제공한다. 이에 따라 org.apache.skywalking.apm.agent.core.context.trace.TraceSegment#transform, org.apache.skywalking.apm.agent.core.context.trace.TraceSegmentRef#transform등등.

추적 세그먼트 아이디 생성 인스턴스화 발생 TracingContext방법. TracingContext.new()도는 다음과 같은 순서로 참조 :

의 image.png
빨간 상자 생성하려면 Trace Segment Id 호출하여 처리 org.apache.skywalking.apm.agent.core.context.ids.GlobalIdGenerator#generate 프로토콜 사양 ID 문자열 생성 방법 대회.

3. 글로벌 (분산) 추적 아이디 与 추적 세그먼트 ID

3.1 차이

전 세계적으로 고유 ID를 skywalking의 두 가지 유형, 즉 글로벌 (분산) 추적 아이디 및 추적 세그먼트 ID가 있습니다. 글로벌 (분산) 추적 ID가 분배 시스템에서 링크의 고유 한 ID입니다. 추적 세그먼트 ID 링크 서비스 노드가없이 생성되는 링크 세그먼트 ID 분배 시스템을 말한다. 둘 다 관계입니다.

3.2 생성 처리

도는 TracingContext 인스턴스화되면 글로벌 (분산) 추적 이드 및 추적 세그먼트 이드 다음 소스 코드를 생성 할 때, 상기 시퀀스는, TraceSegment을 인스턴스화 TraceSegment의 예에서 보여

    public TraceSegment() {
        this.traceSegmentId = GlobalIdGenerator.generate();
        this.spans = new LinkedList<AbstractTracingSpan>();
        this.relatedGlobalTraces = new DistributedTraceIds();
        this.relatedGlobalTraces.append(new NewDistributedTraceId());
    }
复制代码
  • 추적 세그먼트 ID를 생성하는 코드의 첫 줄 this.traceSegmentId = GlobalIdGenerator.generate();GlobalIdGenerator.generate 번 () 메소드를 호출 추적 세그먼트 아이디가 생성된다. 코드의 첫 번째 네 줄에서 new NewDistributedTraceId()글로벌을 만들 추적 이드 (분산). 소스 코드와 같은 호출 나타내는 다음 GlobalIdGenerator.generate()방법.
public class NewDistributedTraceId extends DistributedTraceId {
    public NewDistributedTraceId() {
        super(GlobalIdGenerator.generate());
    }
}
复制代码
  • 더 복잡한 자바 에이전트의 세대 글로벌 (분산) 논리 링크 추적 아이디 글로벌 ID는 이것에 대한 ID를 캡슐화 DistributedTraceIdsAPPEND 방법 클래스 추가하여 클래스 NewDistributedTraceId(분산) 글로벌 추적 ID 데이터를 나타내는 개체를. NewDistributedTraceId는 DistributedTraceId의 서브 클래스이며, DistributedTraceId 클래스는 패키지 ID의 클래스, 일부 유틸리티 메소드를 제공합니다. DistributedTraceIds대부분의 경우는 하나 개의 링크 ID를 포함에 관련 링크 ID의 컬렉션을 나타냅니다.

3.3 GlobalIdGenerator 소개

ID가 같은 방식으로 생성하는 두 통화있다, 즉 org.apache.skywalking.apm.agent.core.context.ids.GlobalIdGenerator#generate. GlobalIdGenerator 논리 패키지 생산 문자열 클래스 글로벌 ID. 에서 살펴 보자 GlobalIdGenerator#generate소스 코드.

    public static ID generate() {
        if (RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID == DictionaryUtil.nullValue()) {
            throw new IllegalStateException();
        }
        IDContext context = THREAD_ID_SEQUENCE.get();

        return new ID(
            RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID,
            Thread.currentThread().getId(),
            context.nextSeq()
        );
    }
复制代码

즉, 상술 한 원본 결국 프로토콜 사양 ID 데이터 구조에있어서, 패키지를 반환되는 첫 번째 파라미터는 애플리케이션의 현재 인스턴스 ID는, 상기 제 파라미터는 현재 스레드 번호이다. 세번째 매개 변수는 IDContext.nextSeq () 메소드에 의해 얻어진다. IDContext는에 ThreadContext에서 얻을 수있다, 그래서 IDContext 스레드가 유일하다. IDContext 소스가 더 잘 이해되고, IDContext.nextSeq ()는 현재 타임 스탬프에서 문자열 및 스레드의 조합의 수를 증가를 돌려줍니다.

4. 요약

요약, 새로운 링크의 시작은, TraceSegment 예, 첫 번째 호출 생성 할 때 GlobalIdGenerator.generate()A와 Trace Segment Id두 번째 통화 GlobalIdGenerator.generate()로를 Global(Distributed) Trace Id.

5. 통지

org.apache.skywalking.apm.agent.core.context.trace.TraceSegment자바 에이전트를 Skywalking하는 핵심 클래스는 나중에 별도로 설명하는 논리 링크입니다.

저자 : ECHINFO는 수석 - 프랭크을 보여

추천

출처juejin.im/post/5e7201e1e51d45271b748d6e