From 0eb0907ddd1278a7e140a62934cfb266384a647a Mon Sep 17 00:00:00 2001 From: ascrutae Date: Sun, 12 Nov 2017 16:24:41 +0800 Subject: [PATCH] support span amount control mechanism --- .../agent/core/context/TracingContext.java | 36 ++++-- .../core/context/trace/AbstractNoopSpan.java | 27 +++++ .../core/context/trace/NoopExitSpan.java | 104 ++++++++++++++++++ .../agent/core/context/trace/NoopSpan.java | 2 +- 4 files changed, 158 insertions(+), 11 deletions(-) create mode 100644 apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractNoopSpan.java create mode 100644 apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/NoopExitSpan.java diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/TracingContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/TracingContext.java index 1a417a8f4..65679c6c1 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/TracingContext.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/TracingContext.java @@ -27,6 +27,7 @@ import org.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; import org.skywalking.apm.agent.core.context.trace.EntrySpan; import org.skywalking.apm.agent.core.context.trace.ExitSpan; import org.skywalking.apm.agent.core.context.trace.LocalSpan; +import org.skywalking.apm.agent.core.context.trace.NoopExitSpan; import org.skywalking.apm.agent.core.context.trace.NoopSpan; import org.skywalking.apm.agent.core.context.trace.TraceSegment; import org.skywalking.apm.agent.core.context.trace.TraceSegmentRef; @@ -95,17 +96,28 @@ public class TracingContext implements AbstractTracerContext { if (!span.isExit()) { throw new IllegalStateException("Inject can be done only in Exit Span"); } - ExitSpan exitSpan = (ExitSpan)span; + + String peer; + int peerId; + if (span instanceof NoopExitSpan) { + NoopExitSpan exitSpan = (NoopExitSpan)span; + peerId = exitSpan.getPeerId(); + peer = exitSpan.getPeer(); + } else { + ExitSpan exitSpan = (ExitSpan)span; + peerId = exitSpan.getPeerId(); + peer = exitSpan.getPeer(); + } carrier.setTraceSegmentId(this.segment.getTraceSegmentId()); carrier.setSpanId(span.getSpanId()); carrier.setParentApplicationInstanceId(segment.getApplicationInstanceId()); - if (DictionaryUtil.isNull(exitSpan.getPeerId())) { - carrier.setPeerHost(exitSpan.getPeer()); + if (DictionaryUtil.isNull(peerId)) { + carrier.setPeerHost(peer); } else { - carrier.setPeerId(exitSpan.getPeerId()); + carrier.setPeerId(peerId); } List refs = this.segment.getRefs(); int operationId; @@ -304,21 +316,21 @@ public class TracingContext implements AbstractTracerContext { */ @Override public AbstractSpan createExitSpan(final String operationName, final String remotePeer) { - if (isLimitMechanismWorking()) { - NoopSpan span = new NoopSpan(); - return push(span); - } AbstractSpan exitSpan; AbstractSpan parentSpan = peek(); if (parentSpan != null && parentSpan.isExit()) { exitSpan = parentSpan; } else { final int parentSpanId = parentSpan == null ? -1 : parentSpan.getSpanId(); - exitSpan = (AbstractTracingSpan)DictionaryManager.findApplicationCodeSection() + exitSpan = (AbstractSpan)DictionaryManager.findApplicationCodeSection() .find(remotePeer).doInCondition( new PossibleFound.FoundAndObtain() { @Override public Object doProcess(final int peerId) { + if (isLimitMechanismWorking()) { + return new NoopExitSpan(peerId); + } + return DictionaryManager.findOperationNameCodeSection() .findOnly(segment.getApplicationId(), operationName) .doInCondition( @@ -338,6 +350,10 @@ public class TracingContext implements AbstractTracerContext { new PossibleFound.NotFoundAndObtain() { @Override public Object doProcess() { + if (isLimitMechanismWorking()) { + return new NoopExitSpan(remotePeer); + } + return DictionaryManager.findOperationNameCodeSection() .findOnly(segment.getApplicationId(), operationName) .doInCondition( @@ -489,6 +505,6 @@ public class TracingContext implements AbstractTracerContext { } private boolean isLimitMechanismWorking() { - return spanIdGenerator > Config.Agent.SPAN_LIMIT_PER_SEGMENT; + return spanIdGenerator >= Config.Agent.SPAN_LIMIT_PER_SEGMENT; } } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractNoopSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractNoopSpan.java new file mode 100644 index 000000000..270a80402 --- /dev/null +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/AbstractNoopSpan.java @@ -0,0 +1,27 @@ +/* + * Copyright 2017, OpenSkywalking Organization All rights reserved. + * + * 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. + * + * Project repository: https://github.com/OpenSkywalking/skywalking + */ + +package org.skywalking.apm.agent.core.context.trace; + +/** + * The AbstractNoopSpan represents a span implementation without any actual operation. + * + * @author zhangxin + */ +public interface AbstractNoopSpan extends AbstractSpan { +} diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/NoopExitSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/NoopExitSpan.java new file mode 100644 index 000000000..7b2aa256e --- /dev/null +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/NoopExitSpan.java @@ -0,0 +1,104 @@ +/* + * Copyright 2017, OpenSkywalking Organization All rights reserved. + * + * 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. + * + * Project repository: https://github.com/OpenSkywalking/skywalking + */ + +package org.skywalking.apm.agent.core.context.trace; + +import java.util.Map; +import org.skywalking.apm.network.trace.component.Component; + +public class NoopExitSpan implements AbstractNoopSpan { + + private String peer; + private int peerId; + + public NoopExitSpan(int peerId) { + this.peerId = peerId; + } + + public NoopExitSpan(String peer) { + this.peer = peer; + } + + @Override public AbstractSpan setComponent(Component component) { + return this; + } + + @Override public AbstractSpan setComponent(String componentName) { + return this; + } + + @Override public AbstractSpan setLayer(SpanLayer layer) { + return this; + } + + @Override public AbstractSpan tag(String key, String value) { + return this; + } + + @Override public AbstractSpan log(Throwable t) { + return this; + } + + @Override public AbstractSpan errorOccurred() { + return null; + } + + @Override public boolean isEntry() { + return false; + } + + @Override public boolean isExit() { + return true; + } + + @Override public AbstractSpan log(long timestamp, Map event) { + return this; + } + + @Override public AbstractSpan setOperationName(String operationName) { + return this; + } + + @Override public AbstractSpan start() { + return this; + } + + @Override public int getSpanId() { + return 0; + } + + @Override public int getOperationId() { + return 0; + } + + @Override public String getOperationName() { + return ""; + } + + @Override public AbstractSpan setOperationId(int operationId) { + return this; + } + + public int getPeerId() { + return peerId; + } + + public String getPeer() { + return peer; + } +} diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/NoopSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/NoopSpan.java index da4e735f2..6e2072820 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/NoopSpan.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/skywalking/apm/agent/core/context/trace/NoopSpan.java @@ -29,7 +29,7 @@ import org.skywalking.apm.network.trace.component.Component; * * @author wusheng */ -public class NoopSpan implements AbstractSpan { +public class NoopSpan implements AbstractNoopSpan { public NoopSpan() { }