Skywalking ligação cruzada processo de protocolo de transferência de informações (a)

prefácio

No processo de desenvolvimento skywalking focos sonda nginx no "cross-link Skywalking o processo de protocolo de transferência de informação" e "Skywalking ligação protocolo de aquisição de dados." Alcançar skywalking sonda nginx foi concluída e uma versão da linha no ambiente de produção, amigos interessados ​​podem trocar. análise Skywalking v5.0.0-GA base, embora algumas versões atrás, mas o núcleo dos dois protocolos não mudou muito. O título Inglês oficial e documento dois acordos referem-se aos seguintes links:

Para facilitar a compreensão, este artigo irá Skywalking-Cross-Process-Propagation-Headers-Protocol-v1ser interpretada como 跨进程链路信息传递协议, Trace-Data-Protocolinterpretada como Skywalking链路数据采集协议. O funcionário pediu que os dois contratos têm tradução chinesa, auto-inspeção. "Cross-link de processo de protocolo de mensagens" em si não é difícil de entender, mas na realização de muitos fatores a considerar, esta série irá combinar código-fonte Java análise aprofundada da sonda. Este artigo concentra-se em explicar 链路IDo processo de geração.

Ligação de processo cruzado papel protocolo de transferência de informações

No sistema de distribuição, o utilizador inicia um pedido de dados, uma pluralidade de sistema de back-end irá processar a solicitação de serviço do nó de serviço de dados. Um dos o importante papel do sistema de rastreamento de link é para ser capaz de ordenar os serviços individuais no processamento de dados nodos, relações lógicas, de longa data gerente, topologia e outras informações objetivamente real reação fora. Um sistema de processo geralmente actua como um nó de serviços, 跨进程que descreve o resultante. A sistemas distribuídos completas, vários nós de serviço, muitas vezes têm componentes diferentes, línguas diferentes, diferentes componentes de pilha tecnologia. Serviços como java, serviço de nó, componentes nginx e assim por diante. Para resolver os dados de links de diferentes nós geram, transferem identificação, resolução, codificação e outras questões, o acordo teria um conjunto de especificações para diferentes línguas pode processar os dados da ligação. Então 跨进程链路信息传递协议eu nasci.

estrutura fonte Skywalking Java Agent Introdução

Antes de falar sobre segmento de rastreamento de geração de id introduz seção lógica Skywalking estrutura fonte de Java Agent. Skywalking v5.0.0-GA em, Java Agent Skywalking informações de link do pacote está localizado fonte abstração apm-sniffer/apm-agent-coremódulo. de Ligação de Dados analisados como se segue a lógica de processamento do módulo fazer aqui.

  • Fazer a ligação função modelo de abstração de dados é encapsulado acordo pacote de link de dados abstração de dados, enquanto a especificação Opentracing geralmente compatíveis. classe de chave tem a seguinte

    • 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
  • Cross-link abstração de dados e processo de encapsulamento focada classe é org.apache.skywalking.apm.agent.core.context.ContextCarrier. Isto é, encapsulamento de uma especificação de protocolo é aqui explicado.

  • Data Link pacote de aquisição abstração chave de classe modelo é org.apache.skywalking.apm.agent.core.context.TracingContext. TracingContext armazenado em um ThreadLocal, que contém todo o enlace de dados, e o método dos dados de controle, principalmente para o controle Span. ContextCarrier, proporcionando dados de processamento, compreendendo:

    • Converter TraceSegment para ContextCarrier, nomeadamente org.apache.skywalking.apm.agent.core.context.TracingContext # injete
    • Extração de dados a partir de dados ContextCarrier TraceSegment, ou seja org.apache.skywalking.apm.agent.core.context.TracingContext # extrato
  • módulo de aquisição de dados da ligação é focado org.apache.skywalking.apm.agent.core.context.ContextManagerclasse. ContextManager classe é o centro de todos os tipos de skywalking agente plug-ins. Skywalking componentes diferentes de encaixe, tais como mq, dubbo, tomcat, mola, etc. skywalking agente plug-ins são para criar e controlar TracingContext, TraceSegment, EntrySpan, ExitSpan, ContextCarrier e outros dados chamando ContextManager. Pode-se dizer ContextManager controlar o ciclo de vida do link de dados no agente.

  • enlace de dados de upload módulo foco org.apache.skywalking.apm.agent.core.remotepacote TraceSegmentServiceClientclasses. Depois que o segmento de dados link (TraceSegment) dentro da coleção nó ContextManager, os dados serão relatados à notificação TraceSegmentServiceClient Collector Server. Que envolve TracingContextListenero pacote skywalking 内存MQmontagem, vamos analisar em detalhe mais tarde.

Cada seção acima envolvem complexa por trás de processamento de lógica será dividido em artigos 11 para fazer uma explicação detalhada.

Skywalking processo de geração de ID link e uma implementação Java

Documentos oficiais Skywalking-Cross-Process-Propagation- cabeçalhos-Protocol-v1 fez uma explicação detalhada, este trabalho de implementação Java para análise posterior.

1. Segmento de rastreio especificação do protocolo Id

O ID de segmento de traço é o ID único para a parte do rastreio distribuído. Cada ID é usado apenas em um único segmento. O id inclui três partes (longo), por exemplo, "1.2343.234234234

  1. A primeira representa uma ID de exemplo de aplicação, o qual designado por colector. (Provavelmente apenas um valor inteiro, seria útil em protobuf)
  2. O segundo representa identificador do tópico. (Em Java provavelmente apenas um valor inteiro, seria útil em protobuf)
  3. O terceiro também tem duas partes 3.1. Um carimbo do tempo, medido em milissegundos SEQ 3.2.A, em fio de corrente, entre 0 (inclusive) e 9999 (incluídos)

Se você estiver usando outro idioma, você pode gerar o seu próprio ID, mas certifique-se que é único e combinado por três anseia.

detalhes para

  • segmento de rastreio é distribuído cadeia chamada resumo, pode ser entendida como cada nó de serviço de um sistema distribuído.
  • Protocolo requer que ID de segmento de rastreio consiste em três partes, cada parte é uma valores comprida do tipo. Três partes estão ligadas por um formulário de dados string id segmento de traço ponto.
  • Traço string id segmento gerou, apenas três necessidade de garantir uma longa constituído pelo ID, e pode ser globalmente únicos. Não fizemos convenções de sentido lógico três porções podem ser especificados pelo próprio desenvolvedor.
  • java agente gerado três partes regra original ID é descrito. Ou seja: o primeiro representa o ID exemplo de aplicação, a segunda parte é o número de linha, e uma terceira parte da sequência de incremento timestamp.

processo de ID de geração 2. Segmento de rastreio

Primeiro skywalking agente java fornece uma org.apache.skywalking.apm.agent.core.context.ids.IDestrutura de dados para a classe descrita na especificação do protocolo, e proporciona um método para o controlo do método de legitimidade e serialização isValid transformar,? Reescrever toString, é igual a, método hashCode. Por grpc relatado ao servidor coletor de dados de aquisição ligação transformar fornece um método para a sequência de dados em protobuf. Tais como org.apache.skywalking.apm.agent.core.context.trace.TraceSegment#transform, org.apache.skywalking.apm.agent.core.context.trace.TraceSegmentRef#transforme assim por diante.

Segmento traço criação Id ocorreu na instanciação TracingContextprocesso. TracingContext.new()A figura referem-se a seguinte sequência:

image.png
Para gerar o caixa vermelha Trace Segment Id processo, chamando org.apache.skywalking.apm.agent.core.context.ids.GlobalIdGenerator#generate Conheça o método de geração de seqüência ID especificação do protocolo.

3. Globais (Distributed) ID do segmento de rastreamento Id 与 Traço

3.1 diferença

Existem dois tipos de skywalking ID exclusivo global, ou seja global (Distributed) Traço Id e Segmento Traço Id. Global (Distribuído) Traço Id é a identificação única de um link no sistema de distribuição. Segmento traço Id link se refere ao sistema de distribuição ID segmento de ligação através da qual nó do serviço importa gerado. Ambos são para-muitos.

3.2 Processo de geração

A figura mostra a sequência acima, quando instanciar TracingContext, instancia TraceSegment, e no exemplo de TraceSegment, ao gerar o global (Distributed) Rastreio Id e rastreio da ID do segmento, o código fonte seguinte:

    public TraceSegment() {
        this.traceSegmentId = GlobalIdGenerator.generate();
        this.spans = new LinkedList<AbstractTracingSpan>();
        this.relatedGlobalTraces = new DistributedTraceIds();
        this.relatedGlobalTraces.append(new NewDistributedTraceId());
    }
复制代码
  • Gerando traço ID de segmento em que uma primeira linha de código this.traceSegmentId = GlobalIdGenerator.generate();, que é gerado de rastreio Segmento Id, chamado método uma vez GlobalIdGenerator.generate (). Nos primeiros quatro linhas de código new NewDistributedTraceId()para criar o global (Distributed) Traço Id. O código-fonte da seguinte forma, mostrando o mesmo chamado GlobalIdGenerator.generate()método.
public class NewDistributedTraceId extends DistributedTraceId {
    public NewDistributedTraceId() {
        super(GlobalIdGenerator.generate());
    }
}
复制代码
  • Geração global (Distributed) Lógico Fazer a ligação Traço Id ID global de mais complexo, agente java encapsula id para esta DistributedTraceIdsclasse, adicionando método append classe NewDistributedTraceIdobjeto representando um global (Distributed) dados de rastreamento Id. NewDistributedTraceId é uma subclasse de DistributedTraceId, e classe DistributedTraceId é a classe da identificação do pacote, fornece alguns métodos de utilidade. DistributedTraceIdsRepresenta uma coleção de ID de link relacionado, na maioria dos casos conter apenas uma ID de link.

Cerca de 3,3 GlobalIdGenerator

Id são duas chamadas para gerar a mesma forma, ou seja org.apache.skywalking.apm.agent.core.context.ids.GlobalIdGenerator#generate. GlobalIdGenerator pacote lógica classe string produção ID global. Vamos olhar GlobalIdGenerator#generateo código fonte.

    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()
        );
    }
复制代码

Isto é, a fonte acima descrito é pacote retornou eventualmente de acordo com a estrutura de dados ID especificação de protocolo, o primeiro parâmetro é o ID do exemplo actual da aplicação, o segundo parâmetro é o número do segmento actual. O terceiro parâmetro é obtida por método IDContext.nextSeq (). O IDContext é obtido a partir ThreadContext dentro, assim fio IDContext é único. fonte IDContext é melhor compreendida, IDContext.nextSeq () Retorna uma string do timestamp atual e aumentando o número de combinações de rosca.

4. Resumo

Quando resumo, o início do novo link, gerar exemplo TraceSegment, a primeira chamada GlobalIdGenerator.generate()como uma Trace Segment Idsegunda chamada GlobalIdGenerator.generate()como Global(Distributed) Trace Id.

5. aviso

org.apache.skywalking.apm.agent.core.context.trace.TraceSegmentSkywalking agente java é uma ligação lógica classes do núcleo irá explicar mais tarde separadamente.

Autor: ECHINFO mostrar -Frank sênior

Acho que você gosta

Origin juejin.im/post/5e7201e1e51d45271b748d6e
Recomendado
Clasificación