blob: 3665dd87186d1d041e71d16783a4cca26f7d5f0a [file] [log] [blame]
/*
* 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.servicecomb.tracing.zipkin;
import static org.apache.servicecomb.foundation.common.base.ServiceCombConstants.CONFIG_TRACING_COLLECTOR_ADDRESS;
import static org.apache.servicecomb.foundation.common.base.ServiceCombConstants.CONFIG_TRACING_COLLECTOR_API_V1;
import static org.apache.servicecomb.foundation.common.base.ServiceCombConstants.CONFIG_TRACING_COLLECTOR_API_V2;
import static org.apache.servicecomb.foundation.common.base.ServiceCombConstants.CONFIG_TRACING_COLLECTOR_API_VERSION;
import static org.apache.servicecomb.foundation.common.base.ServiceCombConstants.CONFIG_TRACING_COLLECTOR_PATH;
import static org.apache.servicecomb.foundation.common.base.ServiceCombConstants.DEFAULT_TRACING_COLLECTOR_ADDRESS;
import java.text.MessageFormat;
import org.apache.servicecomb.config.BootStrapProperties;
import org.apache.servicecomb.config.DynamicProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import brave.Tracing;
import brave.context.slf4j.MDCScopeDecorator;
import brave.http.HttpTracing;
import brave.propagation.CurrentTraceContext;
import brave.propagation.ThreadLocalCurrentTraceContext;
import zipkin2.Span;
import zipkin2.codec.SpanBytesEncoder;
import zipkin2.reporter.AsyncReporter;
import zipkin2.reporter.Reporter;
import zipkin2.reporter.Sender;
import zipkin2.reporter.brave.AsyncZipkinSpanHandler;
import zipkin2.reporter.okhttp3.OkHttpSender;
@Configuration
class TracingConfiguration {
private String apiVersion = CONFIG_TRACING_COLLECTOR_API_V2;
@Bean
Sender sender(DynamicProperties dynamicProperties) {
apiVersion = dynamicProperties.getStringProperty(CONFIG_TRACING_COLLECTOR_API_VERSION,
CONFIG_TRACING_COLLECTOR_API_V2).toLowerCase();
// use default value if the user set value is invalid
if (apiVersion.compareTo(CONFIG_TRACING_COLLECTOR_API_V1) != 0) {
apiVersion = CONFIG_TRACING_COLLECTOR_API_V2;
}
String path = MessageFormat.format(CONFIG_TRACING_COLLECTOR_PATH, apiVersion);
return OkHttpSender.create(
dynamicProperties.getStringProperty(
CONFIG_TRACING_COLLECTOR_ADDRESS,
DEFAULT_TRACING_COLLECTOR_ADDRESS)
.trim()
.replaceAll("/+$", "")
.concat(path));
}
@Bean
Reporter<Span> zipkinReporter(Sender sender) {
if (apiVersion.compareTo(CONFIG_TRACING_COLLECTOR_API_V1) == 0) {
return AsyncReporter.builder(sender).build(SpanBytesEncoder.JSON_V1);
}
return AsyncReporter.builder(sender).build();
}
@Bean
Tracing tracing(Sender sender, DynamicProperties dynamicProperties,
CurrentTraceContext currentTraceContext) {
return Tracing.newBuilder()
.localServiceName(BootStrapProperties.readServiceName())
.currentTraceContext(currentTraceContext) // puts trace IDs into logs
.addSpanHandler(AsyncZipkinSpanHandler.create(sender))
.build();
}
@Bean
CurrentTraceContext currentTraceContext() {
return ThreadLocalCurrentTraceContext.newBuilder().addScopeDecorator(MDCScopeDecorator.newBuilder().build())
.build();
}
@Bean
HttpTracing httpTracing(Tracing tracing) {
return HttpTracing.create(tracing);
}
}