未验证 提交 4238992b 编写于 作者: wu-sheng's avatar wu-sheng 提交者: GitHub

Polish the context and optimize the tag analyze (#5767)

* Polish the context and optimize the tag analyze

* Fix bug of new context codes.
上级 19752ad0
...@@ -12,6 +12,7 @@ Release Notes. ...@@ -12,6 +12,7 @@ Release Notes.
* Make HttpClient 3.x, 4.x, and HttpAsyncClient 3.x plugins to support collecting HTTP parameters. * Make HttpClient 3.x, 4.x, and HttpAsyncClient 3.x plugins to support collecting HTTP parameters.
* Make the Feign plugin to support Java 14 * Make the Feign plugin to support Java 14
* Make the okhttp3 plugin to support Java 14 * Make the okhttp3 plugin to support Java 14
* Polish tracing context related codes.
#### OAP-Backend #### OAP-Backend
* Add the `@SuperDataset` annotation for BrowserErrorLog. * Add the `@SuperDataset` annotation for BrowserErrorLog.
...@@ -20,6 +21,7 @@ Release Notes. ...@@ -20,6 +21,7 @@ Release Notes.
* Support keeping collecting the slowly segments in the sampling mechanism. * Support keeping collecting the slowly segments in the sampling mechanism.
* Support choose files to active the meter analyzer. * Support choose files to active the meter analyzer.
* Improve Kubernetes service registry for ALS analysis. * Improve Kubernetes service registry for ALS analysis.
* Improve the queryable tags generation. Remove the duplicated tags to reduce the storage payload.
#### UI #### UI
......
...@@ -24,7 +24,6 @@ import lombok.Getter; ...@@ -24,7 +24,6 @@ import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.apache.skywalking.apm.agent.core.base64.Base64; import org.apache.skywalking.apm.agent.core.base64.Base64;
import org.apache.skywalking.apm.agent.core.conf.Constants; import org.apache.skywalking.apm.agent.core.conf.Constants;
import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
import org.apache.skywalking.apm.util.StringUtil; import org.apache.skywalking.apm.util.StringUtil;
/** /**
...@@ -90,18 +89,21 @@ public class ContextCarrier implements Serializable { ...@@ -90,18 +89,21 @@ public class ContextCarrier implements Serializable {
} }
/** /**
* Extract the extension context to the given span * Extract the extension context to tracing context
*/ */
void extractExtensionTo(AbstractSpan span) { void extractExtensionTo(TracingContext tracingContext) {
this.extensionContext.handle(span); tracingContext.getExtensionContext().extract(this);
// The extension context could have field not to propagate further, so, must use the this.* to process.
this.extensionContext.handle(tracingContext.activeSpan());
} }
/** /**
* Extract the correlation context to the given span * Extract the correlation context to tracing context
*/ */
void extractCorrelationTo(AbstractSpan span) { void extractCorrelationTo(TracingContext tracingContext) {
this.correlationContext.handle(span); tracingContext.getCorrelationContext().extract(this);
// The correlation context could have field not to propagate further, so, must use the this.* to process.
this.correlationContext.handle(tracingContext.activeSpan());
} }
/** /**
......
...@@ -164,6 +164,15 @@ public class CorrelationContext { ...@@ -164,6 +164,15 @@ public class CorrelationContext {
} }
} }
/**
* Process the active span
*
* 1. Inject the tags with auto-tag flag into the span
*/
void handle(AbstractSpan span) {
AUTO_TAG_KEYS.forEach(key -> this.get(key).ifPresent(val -> span.tag(new StringTag(key), val)));
}
/** /**
* Clone the context data, work for capture to cross-thread. * Clone the context data, work for capture to cross-thread.
*/ */
...@@ -173,14 +182,15 @@ public class CorrelationContext { ...@@ -173,14 +182,15 @@ public class CorrelationContext {
return context; return context;
} }
/**
* Continue the correlation context in another thread.
*
* @param snapshot holds the context.
*/
void continued(ContextSnapshot snapshot) { void continued(ContextSnapshot snapshot) {
this.data.putAll(snapshot.getCorrelationContext().data); this.data.putAll(snapshot.getCorrelationContext().data);
} }
void handle(AbstractSpan span) {
AUTO_TAG_KEYS.forEach(key -> this.get(key).ifPresent(val -> span.tag(new StringTag(key), val)));
}
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) if (this == o)
......
...@@ -109,7 +109,11 @@ public class ExtensionContext { ...@@ -109,7 +109,11 @@ public class ExtensionContext {
} }
/** /**
* Handle the tracing span. * Process the active span
*
* 1. Set the `skipAnalysis` flag.
* 2. Tag the {@link Tags#TRANSMISSION_LATENCY} if the context includes `sendingTimestamp`,
* which is set by the client side.
*/ */
void handle(AbstractSpan span) { void handle(AbstractSpan span) {
if (this.skipAnalysis) { if (this.skipAnalysis) {
...@@ -131,6 +135,10 @@ public class ExtensionContext { ...@@ -131,6 +135,10 @@ public class ExtensionContext {
return context; return context;
} }
/**
* Continue the context in another thread.
* @param snapshot holds the context
*/
void continued(ContextSnapshot snapshot) { void continued(ContextSnapshot snapshot) {
this.skipAnalysis = snapshot.getExtensionContext().skipAnalysis; this.skipAnalysis = snapshot.getExtensionContext().skipAnalysis;
this.sendingTimestamp = snapshot.getExtensionContext().sendingTimestamp; this.sendingTimestamp = snapshot.getExtensionContext().sendingTimestamp;
......
...@@ -22,6 +22,8 @@ import java.util.LinkedList; ...@@ -22,6 +22,8 @@ import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import lombok.AccessLevel;
import lombok.Getter;
import org.apache.skywalking.apm.agent.core.boot.ServiceManager; import org.apache.skywalking.apm.agent.core.boot.ServiceManager;
import org.apache.skywalking.apm.agent.core.conf.Config; import org.apache.skywalking.apm.agent.core.conf.Config;
import org.apache.skywalking.apm.agent.core.context.ids.DistributedTraceId; import org.apache.skywalking.apm.agent.core.context.ids.DistributedTraceId;
...@@ -103,8 +105,9 @@ public class TracingContext implements AbstractTracerContext { ...@@ -103,8 +105,9 @@ public class TracingContext implements AbstractTracerContext {
* profile status * profile status
*/ */
private final ProfileStatusReference profileStatus; private final ProfileStatusReference profileStatus;
@Getter(AccessLevel.PACKAGE)
private final CorrelationContext correlationContext; private final CorrelationContext correlationContext;
@Getter(AccessLevel.PACKAGE)
private final ExtensionContext extensionContext; private final ExtensionContext extensionContext;
/** /**
...@@ -187,10 +190,8 @@ public class TracingContext implements AbstractTracerContext { ...@@ -187,10 +190,8 @@ public class TracingContext implements AbstractTracerContext {
span.ref(ref); span.ref(ref);
} }
carrier.extractExtensionTo(span); carrier.extractExtensionTo(this);
carrier.extractCorrelationTo(span); carrier.extractCorrelationTo(this);
this.correlationContext.extract(carrier);
this.extensionContext.extract(carrier);
} }
/** /**
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
package org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener; package org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet;
import java.util.List; import java.util.List;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -159,11 +160,17 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal ...@@ -159,11 +160,17 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal
} }
private void appendSearchableTags(SpanObject span) { private void appendSearchableTags(SpanObject span) {
HashSet<SpanTag> segmentTags = new HashSet<>();
span.getTagsList().forEach(tag -> { span.getTagsList().forEach(tag -> {
if (searchableTagKeys.contains(tag.getKey())) { if (searchableTagKeys.contains(tag.getKey())) {
segment.getTags().add(new SpanTag(tag.getKey(), tag.getValue())); final SpanTag spanTag = new SpanTag(tag.getKey(), tag.getValue());
if (!segmentTags.contains(spanTag)) {
segmentTags.add(spanTag);
}
} }
}); });
segment.getTags().addAll(segmentTags);
} }
@Override @Override
......
...@@ -21,23 +21,19 @@ package org.apache.skywalking.oap.server.core.analysis.manual.segment; ...@@ -21,23 +21,19 @@ package org.apache.skywalking.oap.server.core.analysis.manual.segment;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter; import lombok.Setter;
import org.apache.skywalking.oap.server.library.util.CollectionUtils; import org.apache.skywalking.oap.server.library.util.CollectionUtils;
@Getter @Getter
@Setter @Setter
@EqualsAndHashCode
@RequiredArgsConstructor
public class SpanTag { public class SpanTag {
private String key; private final String key;
private String value; private final String value;
public SpanTag() {
}
public SpanTag(String key, String value) {
this.key = key;
this.value = value;
}
@Override @Override
public String toString() { public String toString() {
......
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.skywalking.oap.server.core.analysis.manual.segment;
import org.junit.Assert;
import org.junit.Test;
public class SpanTagTest {
@Test
public void testEqual() {
final SpanTag spanTag = new SpanTag("tag1", "value1");
final SpanTag spanTag1 = new SpanTag("tag1", "value2");
final SpanTag spanTag2 = new SpanTag("tag2", "value3");
final SpanTag spanTag3 = new SpanTag("tag1", "value1");
Assert.assertEquals(spanTag, spanTag3);
Assert.assertNotEquals(spanTag, spanTag1);
Assert.assertNotEquals(spanTag, spanTag2);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册