/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.zipkin; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Locale; import com.github.kristofa.brave.ClientRequestAdapter; import com.github.kristofa.brave.IdConversion; import com.github.kristofa.brave.KeyValueAnnotation; import com.github.kristofa.brave.SpanId; import com.github.kristofa.brave.internal.Nullable; import org.apache.camel.Endpoint; import org.apache.camel.Exchange; import org.apache.camel.StreamCache; import org.apache.camel.util.MessageHelper; import org.apache.camel.util.URISupport; import static org.apache.camel.zipkin.ZipkinHelper.prepareBodyForLogging; public final class ZipkinClientRequestAdapter implements ClientRequestAdapter { private final ZipkinTracer eventNotifier; private final String serviceName; private final Exchange exchange; private final Endpoint endpoint; private final String spanName; private final String url; public ZipkinClientRequestAdapter(ZipkinTracer eventNotifier, String serviceName, Exchange exchange, Endpoint endpoint) { this.eventNotifier = eventNotifier; this.serviceName = serviceName; this.exchange = exchange; this.endpoint = endpoint; this.spanName = URISupport.sanitizeUri(endpoint.getEndpointKey()).toLowerCase(Locale.US); this.url = URISupport.sanitizeUri(endpoint.getEndpointUri()); } @Override public String getSpanName() { return spanName; } @Override public void addSpanIdToRequest(@Nullable SpanId spanId) { if (spanId == null) { exchange.getIn().setHeader(ZipkinConstants.SAMPLED, "0"); } else { exchange.getIn().setHeader(ZipkinConstants.SAMPLED, "1"); exchange.getIn().setHeader(ZipkinConstants.TRACE_ID, IdConversion.convertToString(spanId.traceId)); exchange.getIn().setHeader(ZipkinConstants.SPAN_ID, IdConversion.convertToString(spanId.spanId)); if (spanId.nullableParentId() != null) { exchange.getIn().setHeader(ZipkinConstants.PARENT_SPAN_ID, IdConversion.convertToString(spanId.nullableParentId())); } } } public String getClientServiceName() { return serviceName; } @Override public Collection<KeyValueAnnotation> requestAnnotations() { KeyValueAnnotation key1 = KeyValueAnnotation.create("camel.client.endpoint.url", url); KeyValueAnnotation key2 = KeyValueAnnotation.create("camel.client.exchange.id", exchange.getExchangeId()); KeyValueAnnotation key3 = KeyValueAnnotation.create("camel.client.exchange.pattern", exchange.getPattern().name()); KeyValueAnnotation key4 = null; if (eventNotifier.isIncludeMessageBody() || eventNotifier.isIncludeMessageBodyStreams()) { boolean streams = eventNotifier.isIncludeMessageBodyStreams(); StreamCache cache = prepareBodyForLogging(exchange, streams); String body = MessageHelper.extractBodyForLogging(exchange.hasOut() ? exchange.getOut() : exchange.getIn(), "", streams, streams); key4 = KeyValueAnnotation.create("camel.client.exchange.message.request.body", body); if (cache != null) { cache.reset(); } } List<KeyValueAnnotation> list = new ArrayList<>(); list.add(key1); list.add(key2); list.add(key3); if (key4 != null) { list.add(key4); } return list; } @Override public com.twitter.zipkin.gen.Endpoint serverAddress() { return null; } }