/*
* 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.modules.zipkin.api.ZipkinData;
import com.betfair.cougar.modules.zipkin.api.ZipkinDataBuilder;
import com.betfair.cougar.modules.zipkin.api.ZipkinRequestUUID;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Objects;
/**
* Base implementation of ZipkinRequestUUID.
*
* @see com.betfair.cougar.modules.zipkin.api.ZipkinRequestUUID
*/
public class ZipkinRequestUUIDImpl implements ZipkinRequestUUID {
private RequestUUID cougarUuid;
private ZipkinData zipkinData;
private ZipkinDataBuilder zipkinDataBuilder;
public ZipkinRequestUUIDImpl(@Nonnull RequestUUID cougarUuid) {
this(cougarUuid, null);
}
/**
* Constuct a Cougar/Zipkin Request object.
*
* @param cougarUuid Traditional Cougar RequestUUID.
* @param zipkinDataBuilder Zipkin data builder object to be populated later with the span name.
* Passing null here means Zipkin tracing is not enabled for this request.
*/
public ZipkinRequestUUIDImpl(@Nonnull RequestUUID cougarUuid, @Nullable ZipkinDataBuilder zipkinDataBuilder) {
Objects.requireNonNull(cougarUuid);
this.cougarUuid = cougarUuid;
this.zipkinDataBuilder = zipkinDataBuilder;
}
@Override
public String getRootUUIDComponent() {
return cougarUuid.getRootUUIDComponent();
}
@Override
public String getParentUUIDComponent() {
return cougarUuid.getParentUUIDComponent();
}
@Override
public String getLocalUUIDComponent() {
return cougarUuid.getLocalUUIDComponent();
}
@Override
@Nonnull
public RequestUUID getNewSubUUID() {
RequestUUID cougarSubUuid = cougarUuid.getNewSubUUID();
if (isZipkinTracingEnabled()) {
// Creating a child zipkin data builder object.
// The child span name will still need to be set after, as it happened with the original zipkinDataBuilder.
ZipkinDataBuilder newZipkinDataBuilder = new ZipkinDataImpl.Builder()
.traceId(zipkinData.getTraceId())
.spanId(ZipkinManager.getRandomLong())
.parentSpanId(zipkinData.getSpanId())
.port(zipkinData.getPort());
return new ZipkinRequestUUIDImpl(cougarSubUuid, newZipkinDataBuilder);
} else {
// If this request is not being traced by Zipkin, the next request can't be traced either.
return new ZipkinRequestUUIDImpl(cougarSubUuid);
}
}
@Override
@Nonnull
public ZipkinData getZipkinData() {
if (zipkinData == null) {
if (isZipkinTracingEnabled()) {
throw new IllegalStateException("Zipkin Data is still incomplete");
} else {
throw new IllegalStateException("Zipkin tracing is not enabled for this request");
}
} else {
return zipkinData;
}
}
@Override
public boolean isZipkinTracingEnabled() {
return zipkinDataBuilder != null;
}
@Override
public boolean isZipkinTracingReady() {
return zipkinData != null;
}
@Override
public ZipkinData buildZipkinData(@Nonnull String spanName) {
Objects.requireNonNull(spanName);
if (zipkinData == null) {
zipkinData = zipkinDataBuilder.spanName(spanName).build();
return zipkinData;
} else {
throw new IllegalStateException("Span name was already set for this request.");
}
}
/**
* Returns standard conforming Cougar UUID, letting you use your own generator without affecting Zipkin specific
* fields.
*
* @return String representing the Cougar request uuid
*/
@Override
public String getUUID() {
return cougarUuid.getUUID();
}
@Override
public String toCougarLogString() {
return cougarUuid.toCougarLogString();
}
@Override
public String toString() {
return "ZipkinRequestUUIDImpl{" +
"cougarUuid=" + getUUID() +
", zipkinData=" + zipkinData +
'}';
}
}