22.3. 분산 추적 설정


사용자 정의 리소스에 추적 유형을 지정하여 Kafka 구성 요소에서 분산 추적을 활성화합니다. 메시지 엔드 투 엔드 추적을 위한 Kafka 클라이언트의 장치 추적기.

분산 추적을 설정하려면 다음 절차를 순서대로 수행합니다.

22.3.1. 사전 요구 사항

분산 추적을 설정하기 전에 Jaeger 백엔드 구성 요소가 OpenShift 클러스터에 배포되었는지 확인합니다. OpenShift 클러스터에 Jaeger를 배포하기 위해 Jaeger Operator를 사용하는 것이 좋습니다.

배포 지침은 Jaeger 설명서 를 참조하십시오.

참고

Streams for Apache Kafka 이외의 애플리케이션 및 시스템에 대한 추적을 설정하는 것은 이 콘텐츠의 범위를 벗어납니다.

22.3.2. MirrorMaker, Kafka Connect 및 Kafka Bridge 리소스에서 추적 활성화

분산 추적은 MirrorMaker, MirrorMaker 2, Kafka Connect 및 Apache Kafka Bridge용 Streams에서 지원됩니다. 추적기 서비스를 지정하고 활성화하도록 구성 요소의 사용자 지정 리소스를 구성합니다.

리소스에서 추적을 활성화하면 다음 이벤트가 트리거됩니다.

  • 인터셉터 클래스는 구성 요소의 통합 소비자 및 생산자에서 업데이트됩니다.
  • MirrorMaker, MirrorMaker 2 및 Kafka Connect의 경우 추적 에이전트는 리소스에 정의된 추적 구성을 기반으로 추적기를 초기화합니다.
  • Kafka 브리지의 경우 리소스에 정의된 추적 구성을 기반으로 하는 추적기가 Kafka Bridge 자체에 의해 초기화됩니다.

OpenTelemetry를 사용하는 추적을 활성화할 수 있습니다.

MirrorMaker 및 MirrorMaker 2의 추적

MirrorMaker 및 MirrorMaker 2의 경우 소스 클러스터에서 대상 클러스터로 메시지가 추적됩니다. 추적 데이터는 MirrorMaker 또는 MirrorMaker 2 구성 요소를 입력하고 남겨진 메시지를 기록합니다.

Kafka Connect의 추적

Kafka Connect의 경우 Kafka Connect에서 생성하고 사용하는 메시지만 추적됩니다. Kafka Connect와 외부 시스템 간에 전송된 메시지를 추적하려면 해당 시스템의 커넥터에서 추적을 구성해야 합니다.

Kafka 브리지의 추적

Kafka 브리지의 경우 Kafka 브리지에서 생성하고 사용하는 메시지가 추적됩니다. Kafka 브리지를 통해 메시지를 보내고 수신하기 위해 클라이언트 애플리케이션에서 들어오는 HTTP 요청도 추적됩니다. 엔드 투 엔드 추적을 사용하려면 HTTP 클라이언트에서 추적을 구성해야 합니다.

프로세스

KafkaMirrorMaker,KafkaMirrorMaker2,KafkaConnectKafkaBridge 리소스에 대해 다음 단계를 수행합니다.

  1. spec.template 속성에서 tracer 서비스를 구성합니다.

    • 추적 환경 변수를 템플릿 구성 속성으로 사용합니다.
    • OpenTelemetry의 경우 spec.tracing.type 속성을 opentelemetry 로 설정합니다.

    OpenTelemetry를 사용한 Kafka Connect의 추적 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaConnect
    metadata:
      name: my-connect-cluster
    spec:
      #...
      template:
        connectContainer:
          env:
            - name: OTEL_SERVICE_NAME
              value: my-otel-service
            - name: OTEL_EXPORTER_OTLP_ENDPOINT
              value: "http://otlp-host:4317"
      tracing:
        type: opentelemetry
      #...
    Copy to Clipboard Toggle word wrap

    OpenTelemetry를 사용한 MirrorMaker의 추적 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaMirrorMaker
    metadata:
      name: my-mirror-maker
    spec:
      #...
      template:
        mirrorMakerContainer:
          env:
            - name: OTEL_SERVICE_NAME
              value: my-otel-service
            - name: OTEL_EXPORTER_OTLP_ENDPOINT
              value: "http://otlp-host:4317"
      tracing:
        type: opentelemetry
    #...
    Copy to Clipboard Toggle word wrap

    OpenTelemetry를 사용한 MirrorMaker 2의 추적 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaMirrorMaker2
    metadata:
      name: my-mm2-cluster
    spec:
      #...
      template:
        connectContainer:
          env:
            - name: OTEL_SERVICE_NAME
              value: my-otel-service
            - name: OTEL_EXPORTER_OTLP_ENDPOINT
              value: "http://otlp-host:4317"
      tracing:
        type: opentelemetry
    #...
    Copy to Clipboard Toggle word wrap

    OpenTelemetry를 사용한 Kafka 브리지의 추적 구성 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaBridge
    metadata:
      name: my-bridge
    spec:
      #...
      template:
        bridgeContainer:
          env:
            - name: OTEL_SERVICE_NAME
              value: my-otel-service
            - name: OTEL_EXPORTER_OTLP_ENDPOINT
              value: "http://otlp-host:4317"
      tracing:
        type: opentelemetry
    #...
    Copy to Clipboard Toggle word wrap

  2. 리소스를 생성하거나 업데이트합니다.

    oc apply -f <resource_configuration_file>
    Copy to Clipboard Toggle word wrap

22.3.3. Kafka 클라이언트의 추적 초기화

OpenTelemetry에 대한 추적기를 초기화한 다음 분산 추적을 위해 클라이언트 애플리케이션을 측정합니다. Kafka 생산자 및 소비자 클라이언트 및 Kafka Streams API 애플리케이션을 계측할 수 있습니다.

추적 환경 변수 세트를 사용하여 추적기를 구성하고 초기화합니다.

프로세스

각 클라이언트 애플리케이션에서 추적기에 대한 종속성을 추가합니다.

  1. 클라이언트 애플리케이션의 pom.xml 파일에 Maven 종속성을 추가합니다.

    OpenTelemetry 종속 항목

    <dependency>
        <groupId>io.opentelemetry.semconv</groupId>
        <artifactId>opentelemetry-semconv</artifactId>
        <version>1.21.0-alpha</version>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-exporter-otlp</artifactId>
        <version>1.34.1</version>
        <exclusions>
            <exclusion>
                <groupId>io.opentelemetry</groupId>
                <artifactId>opentelemetry-exporter-sender-okhttp</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-exporter-sender-grpc-managed-channel</artifactId>
        <version>1.34.1</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-sdk-extension-autoconfigure</artifactId>
        <version>1.34.1</version>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry.instrumentation</groupId>
        <artifactId>opentelemetry-kafka-clients-2.6</artifactId>
        <version>1.32.0-alpha</version>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-sdk</artifactId>
        <version>1.34.1</version>
    </dependency>
    <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-exporter-sender-jdk</artifactId>
        <version>1.34.1-alpha</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-netty-shaded</artifactId>
        <version>1.61.0</version>
    </dependency>
    Copy to Clipboard Toggle word wrap

  2. 추적 환경 변수를 사용하여 추적 프로그램의 구성을 정의합니다.
  3. 환경 변수로 초기화되는 추적기를 생성합니다.

    OpenTelemetry용 추적기 생성

    OpenTelemetry ot = GlobalOpenTelemetry.get();
    Copy to Clipboard Toggle word wrap

  4. 추적기를 글로벌 추적기로 등록합니다.

    GlobalTracer.register(tracer);
    Copy to Clipboard Toggle word wrap
  5. 클라이언트를 계측합니다.

22.3.4. 추적을 위한 생산자 및 소비자 처리

Kafka 생산자 및 소비자에서 추적을 활성화하는 애플리케이션 코드입니다. 데코레이터 패턴 또는 인터셉터를 사용하여 추적을 위해 Java 생산자 및 소비자 애플리케이션 코드를 계측합니다. 그런 다음 메시지가 생성되거나 주제에서 검색될 때 추적을 기록할 수 있습니다.

OpenTelemetry 계측 프로젝트는 생산자 및 소비자의 계측을 지원하는 클래스를 제공합니다.

데코레이터 계측
데코레이터 계측을 위해 추적을 위해 수정된 생산자 또는 소비자 인스턴스를 생성합니다.
인터셉터 계측
인터셉터 계측의 경우 소비자 또는 생산자 구성에 추적 기능을 추가합니다.

사전 요구 사항

프로세스

각 생산자 및 소비자 애플리케이션의 애플리케이션 코드에서 다음 단계를 수행합니다. 데코레이터 패턴 또는 인터셉터를 사용하여 클라이언트 애플리케이션 코드를 측정합니다.

  • 데코레이터 패턴을 사용하려면 수정된 생산자 또는 소비자 인스턴스를 생성하여 메시지를 보내거나 받습니다.

    원래 KafkaProducer 또는 KafkaConsumer 클래스를 전달합니다.

    OpenTelemetry에 대한 데코레이터 계측 예

    // Producer instance
    Producer < String, String > op = new KafkaProducer < > (
        configs,
        new StringSerializer(),
        new StringSerializer()
        );
        Producer < String, String > producer = tracing.wrap(op);
    KafkaTracing tracing = KafkaTracing.create(GlobalOpenTelemetry.get());
    producer.send(...);
    
    //consumer instance
    Consumer<String, String> oc = new KafkaConsumer<>(
        configs,
        new StringDeserializer(),
        new StringDeserializer()
        );
        Consumer<String, String> consumer = tracing.wrap(oc);
    consumer.subscribe(Collections.singleton("mytopic"));
    ConsumerRecords<Integer, String> records = consumer.poll(1000);
    ConsumerRecord<Integer, String> record = ...
    SpanContext spanContext = TracingKafkaUtils.extractSpanContext(record.headers(), tracer);
    Copy to Clipboard Toggle word wrap

  • 인터셉터를 사용하려면 생산자 또는 소비자 구성에서 interceptor 클래스를 설정합니다.

    일반적인 방식으로 KafkaProducerKafkaConsumer 클래스를 사용합니다. TracingProducerInterceptorTracingConsumerInterceptor 클래스는 추적 기능을 처리합니다.

    인터셉터를 사용한 생산자 구성 예

    senderProps.put(ProducerConfig.INTERCEPTOR_CLASSES_CONFIG,
        TracingProducerInterceptor.class.getName());
    
    KafkaProducer<Integer, String> producer = new KafkaProducer<>(senderProps);
    producer.send(...);
    Copy to Clipboard Toggle word wrap

    인터셉터를 사용한 소비자 구성 예

    consumerProps.put(ConsumerConfig.INTERCEPTOR_CLASSES_CONFIG,
        TracingConsumerInterceptor.class.getName());
    
    KafkaConsumer<Integer, String> consumer = new KafkaConsumer<>(consumerProps);
    consumer.subscribe(Collections.singletonList("messages"));
    ConsumerRecords<Integer, String> records = consumer.poll(1000);
    ConsumerRecord<Integer, String> record = ...
    SpanContext spanContext = TracingKafkaUtils.extractSpanContext(record.headers(), tracer);
    Copy to Clipboard Toggle word wrap

22.3.5. 추적을 위한 Kafka Streams 애플리케이션 조정

Kafka Streams API 애플리케이션에서 추적을 활성화하는 애플리케이션 코드입니다. 데코레이터 패턴 또는 인터셉터를 사용하여 추적을 위해 Kafka Streams API 애플리케이션을 계측합니다. 그런 다음 메시지가 생성되거나 주제에서 검색될 때 추적을 기록할 수 있습니다.

데코레이터 계측
데코레이터 계측을 위해 추적을 위해 수정된 Kafka Streams 인스턴스를 생성합니다. OpenTelemetry의 경우 Kafka Streams에 추적 계측을 제공하기 위해 사용자 정의 TracingKafkaClientSupplier 클래스를 생성해야 합니다.
인터셉터 계측
인터셉터 계측의 경우 Kafka Streams 생산자 및 소비자 구성에 추적 기능을 추가합니다.

사전 요구 사항

  • 클라이언트에 대한 추적을 초기화했습니다.

    추적 JAR을 프로젝트에 종속 항목으로 추가하여 Kafka Streams 애플리케이션에서 계측을 활성화합니다.

  • OpenTelemetry를 사용하여 Kafka Streams를 조정하려면 사용자 정의 TracingKafkaClientSupplier 를 작성해야 합니다.
  • 사용자 정의 TracingKafkaClientSupplier 는 Kafka의 DefaultKafkaClientSupplier 를 확장하여 생산자 및 소비자 생성 방법을 재정의하여 Telemetry 관련 코드로 인스턴스를 래핑할 수 있습니다.

    사용자 정의 TracingKafkaClientSupplier의 예

    private class TracingKafkaClientSupplier extends DefaultKafkaClientSupplier {
        @Override
        public Producer<byte[], byte[]> getProducer(Map<String, Object> config) {
            KafkaTelemetry telemetry = KafkaTelemetry.create(GlobalOpenTelemetry.get());
            return telemetry.wrap(super.getProducer(config));
        }
    
        @Override
        public Consumer<byte[], byte[]> getConsumer(Map<String, Object> config) {
            KafkaTelemetry telemetry = KafkaTelemetry.create(GlobalOpenTelemetry.get());
            return telemetry.wrap(super.getConsumer(config));
        }
    
        @Override
        public Consumer<byte[], byte[]> getRestoreConsumer(Map<String, Object> config) {
            return this.getConsumer(config);
        }
    
        @Override
        public Consumer<byte[], byte[]> getGlobalConsumer(Map<String, Object> config) {
            return this.getConsumer(config);
        }
    }
    Copy to Clipboard Toggle word wrap

프로세스

각 Kafka Streams API 애플리케이션에 대해 다음 단계를 수행합니다.

  • 데코레이터 패턴을 사용하려면 TracingKafkaClientSupplier 공급자 인터페이스 인스턴스를 생성한 다음 공급자 인터페이스를 KafkaStreams 에 제공합니다.

    데코레이터 계측 예

    KafkaClientSupplier supplier = new TracingKafkaClientSupplier(tracer);
    KafkaStreams streams = new KafkaStreams(builder.build(), new StreamsConfig(config), supplier);
    streams.start();
    Copy to Clipboard Toggle word wrap

  • 인터셉터를 사용하려면 Kafka Streams 생산자 및 소비자 구성에서 interceptor 클래스를 설정합니다.

    TracingProducerInterceptorTracingConsumerInterceptor 클래스는 추적 기능을 처리합니다.

    인터셉터를 사용한 생산자 및 소비자 구성의 예

    props.put(StreamsConfig.PRODUCER_PREFIX + ProducerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingProducerInterceptor.class.getName());
    props.put(StreamsConfig.CONSUMER_PREFIX + ConsumerConfig.INTERCEPTOR_CLASSES_CONFIG, TracingConsumerInterceptor.class.getName());
    Copy to Clipboard Toggle word wrap

22.3.6. 다른 OpenTelemetry 추적 시스템 도입

기본 OTLP 시스템 대신 OpenTelemetry에서 지원하는 다른 추적 시스템을 지정할 수 있습니다. Apache Kafka용 Streams와 함께 제공된 Kafka 이미지에 필요한 아티팩트를 추가하여 이 작업을 수행합니다. 필요한 구현별 환경 변수도 설정해야 합니다. 그런 다음 OTEL_TRACES_EXPORTER 환경 변수를 사용하여 새 추적 구현을 활성화합니다.

다음 절차에서는 Zipkin 추적을 구현하는 방법을 설명합니다.

프로세스

  1. Apache Kafka 이미지의 Streams의 /opt/kafka/libs/ 디렉터리에 추적 아티팩트를 추가합니다.

    Red Hat Ecosystem Catalog 에서 Kafka 컨테이너 이미지를 새 사용자 정의 이미지를 생성하기 위한 기본 이미지로 사용할 수 있습니다.

    Zipkin의 OpenTelemetry 아티팩트

    io.opentelemetry:opentelemetry-exporter-zipkin
    Copy to Clipboard Toggle word wrap

  2. 새 추적 구현에 대해 추적 내보내기 및 끝점을 설정합니다.

    Zikpin 추적기 구성의 예

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaMirrorMaker2
    metadata:
      name: my-mm2-cluster
    spec:
      #...
      template:
        connectContainer:
          env:
            - name: OTEL_SERVICE_NAME
              value: my-zipkin-service
            - name: OTEL_EXPORTER_ZIPKIN_ENDPOINT
              value: http://zipkin-exporter-host-name:9411/api/v2/spans 
    1
    
            - name: OTEL_TRACES_EXPORTER
              value: zipkin 
    2
    
      tracing:
        type: opentelemetry
    #...
    Copy to Clipboard Toggle word wrap

    1
    연결할 Zipkin 엔드포인트를 지정합니다.
    2
    Zipkin 내보내기입니다.

22.3.7. OpenTelemetry에 대한 사용자 정의 범위 이름 지정

추적 범위는 작업 이름, 시작 시간 및 기간이 있는 Jaeger의 논리적 작업 단위입니다. 범위에는 이름이 내장되어 있지만 Kafka 클라이언트 계측에 사용자 정의 범위 이름을 지정할 수 있습니다.

사용자 지정 범위 이름을 지정하는 것은 선택 사항이며 생산자 및 소비자 클라이언트 계측 또는 Kafka 스트림 조정에서 데코레이터 패턴을 사용하는 경우에만 적용됩니다.

사용자 지정 범위 이름은 OpenTelemetry로 직접 지정할 수 없습니다. 대신 클라이언트 애플리케이션에 코드를 추가하여 추가 태그 및 속성을 추출하여 범위 이름을 검색합니다.

특성을 추출하는 코드 예

//Defines attribute extraction for a producer
private static class ProducerAttribExtractor implements AttributesExtractor < ProducerRecord < ? , ? > , Void > {
    @Override
    public void onStart(AttributesBuilder attributes, ProducerRecord < ? , ? > producerRecord) {
        set(attributes, AttributeKey.stringKey("prod_start"), "prod1");
    }
    @Override
    public void onEnd(AttributesBuilder attributes, ProducerRecord < ? , ? > producerRecord, @Nullable Void unused, @Nullable Throwable error) {
        set(attributes, AttributeKey.stringKey("prod_end"), "prod2");
    }
}
//Defines attribute extraction for a consumer
private static class ConsumerAttribExtractor implements AttributesExtractor < ConsumerRecord < ? , ? > , Void > {
    @Override
    public void onStart(AttributesBuilder attributes, ConsumerRecord < ? , ? > producerRecord) {
        set(attributes, AttributeKey.stringKey("con_start"), "con1");
    }
    @Override
    public void onEnd(AttributesBuilder attributes, ConsumerRecord < ? , ? > producerRecord, @Nullable Void unused, @Nullable Throwable error) {
        set(attributes, AttributeKey.stringKey("con_end"), "con2");
    }
}
//Extracts the attributes
public static void main(String[] args) throws Exception {
        Map < String, Object > configs = new HashMap < > (Collections.singletonMap(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"));
        System.setProperty("otel.traces.exporter", "jaeger");
        System.setProperty("otel.service.name", "myapp1");
        KafkaTracing tracing = KafkaTracing.newBuilder(GlobalOpenTelemetry.get())
            .addProducerAttributesExtractors(new ProducerAttribExtractor())
            .addConsumerAttributesExtractors(new ConsumerAttribExtractor())
            .build();
Copy to Clipboard Toggle word wrap

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat