package org.skywalking.apm.collector.worker.span.persistence; import com.google.gson.Gson; import com.google.gson.JsonObject; import org.elasticsearch.action.get.GetResponse; import org.skywalking.apm.collector.actor.*; import org.skywalking.apm.collector.actor.selector.RollingSelector; import org.skywalking.apm.collector.actor.selector.WorkerSelector; import org.skywalking.apm.collector.worker.Const; import org.skywalking.apm.collector.worker.segment.SegmentIndex; import org.skywalking.apm.collector.worker.segment.entity.Segment; import org.skywalking.apm.collector.worker.segment.entity.SegmentDeserialize; import org.skywalking.apm.collector.worker.segment.entity.Span; import org.skywalking.apm.collector.worker.storage.GetResponseFromEs; import java.util.List; /** * @author pengys5 */ public class SpanSearchWithId extends AbstractLocalSyncWorker { private Gson gson = new Gson(); SpanSearchWithId(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { super(role, clusterContext, selfContext); } @Override protected void onWork(Object request, Object response) throws Exception { if (request instanceof RequestEntity) { RequestEntity search = (RequestEntity) request; GetResponse getResponse = GetResponseFromEs.INSTANCE.get(SegmentIndex.INDEX, SegmentIndex.TYPE_RECORD, search.segId); Segment segment = SegmentDeserialize.INSTANCE.deserializeSingle(getResponse.getSourceAsString()); List<Span> spanList = segment.getSpans(); getResponse.getSource(); JsonObject dataJson = new JsonObject(); for (Span span : spanList) { if (String.valueOf(span.getSpanId()).equals(search.spanId)) { span.setJsonStr(""); String spanJsonStr = gson.toJson(span); dataJson = gson.fromJson(spanJsonStr, JsonObject.class); } } JsonObject resJsonObj = (JsonObject) response; resJsonObj.add(Const.RESULT, dataJson); } } public static class RequestEntity { private String segId; private String spanId; public RequestEntity(String segId, String spanId) { this.segId = segId; this.spanId = spanId; } public String getSegId() { return segId; } public String getSpanId() { return spanId; } } public static class Factory extends AbstractLocalSyncWorkerProvider<SpanSearchWithId> { @Override public Role role() { return WorkerRole.INSTANCE; } @Override public SpanSearchWithId workerInstance(ClusterWorkerContext clusterContext) { return new SpanSearchWithId(role(), clusterContext, new LocalWorkerContext()); } } public enum WorkerRole implements Role { INSTANCE; @Override public String roleName() { return SpanSearchWithId.class.getSimpleName(); } @Override public WorkerSelector workerSelector() { return new RollingSelector(); } } }