/*
* Copyright 2015, The Sporting Exchange Limited
*
* Licensed 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 com.betfair.cougar.modules.zipkin.impl;
import com.betfair.cougar.api.RequestUUID;
import com.betfair.cougar.core.api.ev.OperationKey;
import com.betfair.cougar.core.impl.tracing.AbstractTracer;
import com.betfair.cougar.modules.zipkin.api.ZipkinData;
import com.betfair.cougar.modules.zipkin.api.ZipkinRequestUUID;
import javax.annotation.Nonnull;
import java.util.Objects;
/**
* Zipkin tracer implementation.
*
* @see com.betfair.cougar.core.impl.tracing.AbstractTracer
*/
public class ZipkinTracer extends AbstractTracer {
private ZipkinEmitter zipkinEmitter;
@Override
public void start(RequestUUID uuid, OperationKey operationKey) {
ZipkinData zipkinData = buildZipkinDataIfEnabled(uuid, operationKey);
if (zipkinData != null) {
zipkinEmitter.emitServerReceive(zipkinData);
}
}
@Override
public void trace(RequestUUID uuid, String msg) {
ZipkinData zipkinData = getZipkinDataIfReady(uuid);
if (zipkinData != null) {
emitAnnotation(zipkinData, msg);
}
}
@Override
public void trace(RequestUUID uuid, String msg, Object arg1) {
ZipkinData zipkinData = getZipkinDataIfReady(uuid);
if (zipkinData != null) {
emitAnnotation(zipkinData, msg, arg1);
}
}
@Override
public void trace(RequestUUID uuid, String msg, Object arg1, Object arg2) {
ZipkinData zipkinData = getZipkinDataIfReady(uuid);
if (zipkinData != null) {
emitAnnotation(zipkinData, msg, arg1, arg2);
}
}
@Override
public void trace(RequestUUID uuid, String msg, Object arg1, Object arg2, Object arg3) {
ZipkinData zipkinData = getZipkinDataIfReady(uuid);
if (zipkinData != null) {
emitAnnotation(zipkinData, msg, arg1, arg2, arg3);
}
}
@Override
public void trace(RequestUUID uuid, String msg, Object... args) {
ZipkinData zipkinData = getZipkinDataIfReady(uuid);
if (zipkinData != null) {
emitAnnotation(zipkinData, msg, args);
}
}
@Override
public void end(RequestUUID uuid) {
ZipkinData zipkinData = getZipkinDataIfReady(uuid);
if (zipkinData != null) {
zipkinEmitter.emitServerSend(zipkinData);
}
}
@Override
public void startCall(RequestUUID uuid, RequestUUID subUuid, OperationKey operationKey) {
ZipkinData zipkinData = buildZipkinDataIfEnabled(subUuid, operationKey);
if (zipkinData != null) {
zipkinEmitter.emitClientSend(zipkinData);
}
}
@Override
public void endCall(RequestUUID uuid, RequestUUID subUuid, OperationKey operationKey) {
ZipkinData zipkinData = getZipkinDataIfReady(subUuid);
if (zipkinData != null) {
zipkinEmitter.emitClientReceive(zipkinData);
}
}
private static ZipkinData getZipkinDataIfReady(@Nonnull RequestUUID uuid) {
if (uuid instanceof ZipkinRequestUUID) {
ZipkinRequestUUID zipkinRequestUUID = (ZipkinRequestUUID) uuid;
if (zipkinRequestUUID.isZipkinTracingReady()) {
return zipkinRequestUUID.getZipkinData();
} else {
// Zipkin is disabled or wasn't initialized properly yet (the latter should never happen)
return null;
}
} else {
return null;
}
}
private static ZipkinData buildZipkinDataIfEnabled(@Nonnull RequestUUID uuid, @Nonnull OperationKey operationKey) {
Objects.requireNonNull(operationKey);
if (uuid instanceof ZipkinRequestUUID) {
ZipkinRequestUUID zipkinSubRequestUUID = (ZipkinRequestUUID) uuid;
if (zipkinSubRequestUUID.isZipkinTracingEnabled()) {
zipkinSubRequestUUID.buildZipkinData(operationKey.toString());
return zipkinSubRequestUUID.getZipkinData();
} else {
return null;
}
} else {
return null;
}
}
private void emitAnnotation(@Nonnull ZipkinData zipkinData, String msg, Object... args) {
String s = String.format(msg, args);
zipkinEmitter.emitAnnotation(zipkinData, s);
}
public void setZipkinEmitter(@Nonnull ZipkinEmitter zipkinEmitter) {
Objects.requireNonNull(zipkinEmitter);
this.zipkinEmitter = zipkinEmitter;
}
}