/*
* Copyright 2017 NAVER Corp.
*
* 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.navercorp.pinpoint.profiler.context.recorder;
import com.navercorp.pinpoint.common.util.StringUtils;
import com.navercorp.pinpoint.profiler.context.Annotation;
import com.navercorp.pinpoint.profiler.context.DefaultTrace;
import com.navercorp.pinpoint.profiler.context.Span;
import com.navercorp.pinpoint.profiler.context.SpanEvent;
import com.navercorp.pinpoint.profiler.metadata.SqlMetaDataService;
import com.navercorp.pinpoint.profiler.metadata.StringMetaDataService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.navercorp.pinpoint.bootstrap.context.SpanEventRecorder;
import com.navercorp.pinpoint.common.trace.AnnotationKey;
import com.navercorp.pinpoint.common.trace.ServiceType;
import com.navercorp.pinpoint.bootstrap.context.ParsingResult;
import com.navercorp.pinpoint.thrift.dto.TIntStringStringValue;
/**
*
* @author jaehong.kim
*
*/
public class WrappedSpanEventRecorder extends AbstractRecorder implements SpanEventRecorder {
private final Logger logger = LoggerFactory.getLogger(DefaultTrace.class.getName());
private final boolean isDebug = logger.isDebugEnabled();
private SpanEvent spanEvent;
public WrappedSpanEventRecorder(final StringMetaDataService stringMetaDataService, final SqlMetaDataService sqlMetaCacheService) {
super(stringMetaDataService, sqlMetaCacheService);
}
public void setWrapped(final SpanEvent spanEvent) {
this.spanEvent = spanEvent;
}
@Override
public ParsingResult recordSqlInfo(String sql) {
if (sql == null) {
return null;
}
ParsingResult parsingResult = sqlMetaDataService.parseSql(sql);
recordSqlParsingResult(parsingResult);
return parsingResult;
}
@Override
public void recordSqlParsingResult(ParsingResult parsingResult) {
recordSqlParsingResult(parsingResult, null);
}
@Override
public void recordSqlParsingResult(ParsingResult parsingResult, String bindValue) {
if (parsingResult == null) {
return;
}
final boolean isNewCache = sqlMetaDataService.cacheSql(parsingResult);
if (isDebug) {
if (isNewCache) {
logger.debug("update sql cache. parsingResult:{}", parsingResult);
} else {
logger.debug("cache hit. parsingResult:{}", parsingResult);
}
}
final TIntStringStringValue tSqlValue = new TIntStringStringValue(parsingResult.getId());
final String output = parsingResult.getOutput();
if (StringUtils.isNotEmpty(output)) {
tSqlValue.setStringValue1(output);
}
if (StringUtils.isNotEmpty(bindValue)) {
tSqlValue.setStringValue2(bindValue);
}
recordSqlParam(tSqlValue);
}
private void recordSqlParam(TIntStringStringValue tIntStringStringValue) {
spanEvent.addAnnotation(new Annotation(AnnotationKey.SQL_ID.getCode(), tIntStringStringValue));
}
@Override
public void recordDestinationId(String destinationId) {
spanEvent.setDestinationId(destinationId);
}
@Override
public void recordNextSpanId(long nextSpanId) {
if (nextSpanId == -1) {
return;
}
spanEvent.setNextSpanId(nextSpanId);
}
@Override
public void recordAsyncId(int asyncId) {
spanEvent.setAsyncId(asyncId);
}
@Override
public void recordNextAsyncId(int nextAsyncId) {
spanEvent.setNextAsyncId(nextAsyncId);
}
@Override
public void recordAsyncSequence(short asyncSequence) {
spanEvent.setAsyncSequence(asyncSequence);
}
@Override
void setExceptionInfo(int exceptionClassId, String exceptionMessage) {
this.setExceptionInfo(true, exceptionClassId, exceptionMessage);
}
@Override
void setExceptionInfo(boolean markError, int exceptionClassId, String exceptionMessage) {
this.spanEvent.setExceptionInfo(markError, exceptionClassId, exceptionMessage);
}
@Override
public void recordApiId(final int apiId) {
setApiId0(apiId);
}
void setApiId0(final int apiId) {
spanEvent.setApiId(apiId);
}
void addAnnotation(Annotation annotation) {
spanEvent.addAnnotation(annotation);
}
@Override
public void recordServiceType(ServiceType serviceType) {
spanEvent.setServiceType(serviceType.getCode());
}
@Override
public void recordRpcName(String rpc) {
spanEvent.setRpc(rpc);
}
@Override
public void recordEndPoint(String endPoint) {
spanEvent.setEndPoint(endPoint);
}
@Override
public void recordTime(boolean time) {
spanEvent.setTimeRecording(time);
if (time) {
if(!spanEvent.isSetStartElapsed()) {
spanEvent.markStartTime();
}
} else {
spanEvent.setEndElapsed(0);
spanEvent.setEndElapsedIsSet(false);
spanEvent.setStartElapsed(0);
spanEvent.setStartElapsedIsSet(false);
}
}
@Override
public Object detachFrameObject() {
return spanEvent.detachFrameObject();
}
@Override
public Object getFrameObject() {
return spanEvent.getFrameObject();
}
@Override
public Object attachFrameObject(Object frameObject) {
return spanEvent.attachFrameObject(frameObject);
}
}