diff --git a/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/main/java/com/huaweicloud/sermant/tag/transmission/declarers/rpc/servicecomb/ServiceCombRpcProviderDeclarer.java b/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/main/java/com/huaweicloud/sermant/tag/transmission/declarers/rpc/servicecomb/ServiceCombRpcProviderDeclarer.java deleted file mode 100644 index 45a712a19b..0000000000 --- a/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/main/java/com/huaweicloud/sermant/tag/transmission/declarers/rpc/servicecomb/ServiceCombRpcProviderDeclarer.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2023-2023 Huawei Technologies Co., Ltd. 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. - */ - -package com.huaweicloud.sermant.tag.transmission.declarers.rpc.servicecomb; - -import com.huaweicloud.sermant.core.plugin.agent.declarer.AbstractPluginDeclarer; -import com.huaweicloud.sermant.core.plugin.agent.declarer.InterceptDeclarer; -import com.huaweicloud.sermant.core.plugin.agent.matcher.ClassMatcher; -import com.huaweicloud.sermant.core.plugin.agent.matcher.MethodMatcher; -import com.huaweicloud.sermant.tag.transmission.interceptors.rpc.servicecomb.ServiceCombRpcProviderInterceptor; - -/** - * servicecombRPC provider端declarer,支持servicecomb2.x版本 - * - * @author daizhenyu - * @since 2023-08-26 - **/ -public class ServiceCombRpcProviderDeclarer extends AbstractPluginDeclarer { - private static final String ENHANCE_CLASS = "org.apache.servicecomb.core.handler.impl.ProducerOperationHandler"; - - private static final String METHOD_NAME = "handle"; - - @Override - public ClassMatcher getClassMatcher() { - return ClassMatcher.nameEquals(ENHANCE_CLASS); - } - - @Override - public InterceptDeclarer[] getInterceptDeclarers(ClassLoader classLoader) { - return new InterceptDeclarer[]{InterceptDeclarer.build(MethodMatcher.nameEquals(METHOD_NAME), - new ServiceCombRpcProviderInterceptor())}; - } -} diff --git a/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/main/java/com/huaweicloud/sermant/tag/transmission/interceptors/http/server/HttpServletInterceptor.java b/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/main/java/com/huaweicloud/sermant/tag/transmission/interceptors/http/server/HttpServletInterceptor.java index 43bb1f6da8..cf6ec13ceb 100644 --- a/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/main/java/com/huaweicloud/sermant/tag/transmission/interceptors/http/server/HttpServletInterceptor.java +++ b/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/main/java/com/huaweicloud/sermant/tag/transmission/interceptors/http/server/HttpServletInterceptor.java @@ -17,9 +17,12 @@ package com.huaweicloud.sermant.tag.transmission.interceptors.http.server; import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext; +import com.huaweicloud.sermant.core.plugin.service.PluginServiceManager; +import com.huaweicloud.sermant.core.utils.StringUtils; import com.huaweicloud.sermant.core.utils.tag.TrafficUtils; import com.huaweicloud.sermant.tag.transmission.config.strategy.TagKeyMatcher; import com.huaweicloud.sermant.tag.transmission.interceptors.AbstractServerInterceptor; +import com.huaweicloud.sermant.tag.transmission.service.ServiceCombHeaderParseService; import java.util.Collections; import java.util.Enumeration; @@ -41,6 +44,11 @@ public class HttpServletInterceptor extends AbstractServerInterceptor LOCK_MARK = new ThreadLocal<>(); + private static final String SERVICECOMB_HEADER_KEY = "x-cse-context"; + + private static ServiceCombHeaderParseService parseService = + PluginServiceManager.getPluginService(ServiceCombHeaderParseService.class); + @Override public ExecuteContext doBefore(ExecuteContext context) { if (LOCK_MARK.get() != null) { @@ -81,6 +89,27 @@ public ExecuteContext onThrow(ExecuteContext context) { @Override protected Map> extractTrafficTagFromCarrier(HttpServletRequest httpServletRequest) { Map> tagMap = new HashMap<>(); + + // servicecomb场景,consumer端为servicecomb rpc,需从http的request中获取servicecomb的header字符串并解析 + String serviceCombHeaderValue = httpServletRequest.getHeader(SERVICECOMB_HEADER_KEY); + if (!StringUtils.isBlank(serviceCombHeaderValue)) { + Map headers = parseService.parseHeaderFromJson(serviceCombHeaderValue); + for (String key : headers.keySet()) { + if (!TagKeyMatcher.isMatch(key)) { + continue; + } + String value = headers.get(key); + if (value != null) { + tagMap.put(key, Collections.singletonList(value)); + continue; + } + + // 流量标签的value为null时,也需存入本地变量,覆盖原来的value,以防误用旧流量标签 + tagMap.put(key, null); + } + } + + // 常规http访问场景 Enumeration keyEnumeration = httpServletRequest.getHeaderNames(); while (keyEnumeration.hasMoreElements()) { String key = keyEnumeration.nextElement(); diff --git a/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/main/java/com/huaweicloud/sermant/tag/transmission/interceptors/rpc/servicecomb/ServiceCombRpcProviderInterceptor.java b/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/main/java/com/huaweicloud/sermant/tag/transmission/interceptors/rpc/servicecomb/ServiceCombRpcProviderInterceptor.java deleted file mode 100644 index b002761916..0000000000 --- a/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/main/java/com/huaweicloud/sermant/tag/transmission/interceptors/rpc/servicecomb/ServiceCombRpcProviderInterceptor.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) 2023-2023 Huawei Technologies Co., Ltd. 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. - */ - -package com.huaweicloud.sermant.tag.transmission.interceptors.rpc.servicecomb; - -import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext; -import com.huaweicloud.sermant.core.utils.tag.TrafficUtils; -import com.huaweicloud.sermant.tag.transmission.config.strategy.TagKeyMatcher; -import com.huaweicloud.sermant.tag.transmission.interceptors.AbstractServerInterceptor; - -import org.apache.servicecomb.core.Invocation; - -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * servicecombRPC provider端interceptor,支持servicecomb2.x版本 - * - * @author daizhenyu - * @since 2023-08-26 - **/ -public class ServiceCombRpcProviderInterceptor extends AbstractServerInterceptor { - @Override - protected ExecuteContext doBefore(ExecuteContext context) { - Object[] arguments = context.getArguments(); - if (arguments == null || arguments.length == 0) { - return context; - } - Object invocationObject = arguments[0]; - if (invocationObject instanceof Invocation) { - TrafficUtils.updateTrafficTag(extractTrafficTagFromCarrier((Invocation) invocationObject)); - } - return context; - } - - @Override - protected ExecuteContext doAfter(ExecuteContext context) { - TrafficUtils.removeTrafficTag(); - return context; - } - - @Override - public ExecuteContext onThrow(ExecuteContext context) { - TrafficUtils.removeTrafficTag(); - return context; - } - - /** - * 从Invocation中解析流量标签 - * - * @param invocation servicecomb rpc服务端的流量标签载体 - * @return 流量标签 - */ - @Override - protected Map> extractTrafficTagFromCarrier(Invocation invocation) { - Map> tag = new HashMap<>(); - extractFromContext(invocation, tag); - extractFromRequestEx(invocation, tag); - return tag; - } - - private void extractFromContext(Invocation invocation, Map> tag) { - if (invocation.getContext() == null) { - return; - } - Set keySet = invocation.getContext().keySet(); - for (String key : keySet) { - if (!TagKeyMatcher.isMatch(key)) { - continue; - } - String value = invocation.getContext().get(key); - if (value != null) { - // consumer端使用servicecombrpc方式调用provider端 - tag.put(key, Collections.singletonList(value)); - continue; - } - - // 流量标签的value为null时,也需存入本地变量,覆盖原来的value,以防误用旧流量标签 - tag.put(key, null); - } - } - - private void extractFromRequestEx(Invocation invocation, Map> tag) { - if (invocation.getRequestEx() == null) { - return; - } - Enumeration headerNames = invocation.getRequestEx().getHeaderNames(); - while (headerNames.hasMoreElements()) { - String key = headerNames.nextElement(); - if (!TagKeyMatcher.isMatch(key)) { - continue; - } - - // consumer端使用非servicecombrpc方式调用provider端,比如httpclient,okhttp等 - Enumeration valuesEnumeration = invocation.getRequestEx().getHeaders(key); - if (valuesEnumeration != null && valuesEnumeration.hasMoreElements()) { - List values = Collections.list(valuesEnumeration); - tag.put(key, values); - continue; - } - - // 流量标签的value为null时,也需存入本地变量,覆盖原来的value,以防误用旧流量标签 - tag.put(key, null); - } - } -} diff --git a/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/main/java/com/huaweicloud/sermant/tag/transmission/service/ServiceCombHeaderParseService.java b/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/main/java/com/huaweicloud/sermant/tag/transmission/service/ServiceCombHeaderParseService.java new file mode 100644 index 0000000000..e91e39343e --- /dev/null +++ b/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/main/java/com/huaweicloud/sermant/tag/transmission/service/ServiceCombHeaderParseService.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2023-2023 Huawei Technologies Co., Ltd. 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. + */ + +package com.huaweicloud.sermant.tag.transmission.service; + +import com.huaweicloud.sermant.core.plugin.service.PluginService; + +import java.util.Map; + +/** + * 用于从http header的value中解析json字符串为rpc服务的header + * + * @author daizhenyu + * @since 2023-09-14 + **/ +public interface ServiceCombHeaderParseService extends PluginService { + /** + * 将json字符串解析为rpc服务 的header + * + * @param header Json字符串 + * @return rpc服务 的header + */ + Map parseHeaderFromJson(String header); +} diff --git a/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.agent.declarer.PluginDeclarer b/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.agent.declarer.PluginDeclarer index d1229416d8..f2836e6210 100644 --- a/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.agent.declarer.PluginDeclarer +++ b/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.agent.declarer.PluginDeclarer @@ -28,7 +28,6 @@ com.huaweicloud.sermant.tag.transmission.declarers.rpc.sofarpc.SofaRpcServerDecl com.huaweicloud.sermant.tag.transmission.declarers.rpc.grpc.GrpcServerDeclarer com.huaweicloud.sermant.tag.transmission.declarers.rpc.grpc.ClientCallImplDeclarer com.huaweicloud.sermant.tag.transmission.declarers.rpc.servicecomb.ServiceCombRpcConsumerDeclarer -com.huaweicloud.sermant.tag.transmission.declarers.rpc.servicecomb.ServiceCombRpcProviderDeclarer com.huaweicloud.sermant.tag.transmission.declarers.mq.kafka.KafkaProducerDeclarer com.huaweicloud.sermant.tag.transmission.declarers.http.client.httpclient.HttpClient3xDeclarer com.huaweicloud.sermant.tag.transmission.declarers.http.client.okhttp.OkHttp2xDeclarer diff --git a/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/test/java/com/huaweicloud/sermant/tag/transmission/interceptors/http/server/HttpServletInterceptorTest.java b/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/test/java/com/huaweicloud/sermant/tag/transmission/interceptors/http/server/HttpServletInterceptorTest.java index d80f8d049e..171b80e743 100644 --- a/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/test/java/com/huaweicloud/sermant/tag/transmission/interceptors/http/server/HttpServletInterceptorTest.java +++ b/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/test/java/com/huaweicloud/sermant/tag/transmission/interceptors/http/server/HttpServletInterceptorTest.java @@ -17,15 +17,20 @@ package com.huaweicloud.sermant.tag.transmission.interceptors.http.server; import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext; +import com.huaweicloud.sermant.core.plugin.service.PluginServiceManager; import com.huaweicloud.sermant.core.utils.tag.TrafficUtils; import com.huaweicloud.sermant.tag.transmission.interceptors.BaseInterceptorTest; +import com.huaweicloud.sermant.tag.transmission.service.ServiceCombHeaderParseService; import org.apache.catalina.connector.Connector; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.RequestFacade; import org.apache.tomcat.util.http.MimeHeaders; +import org.junit.After; import org.junit.Assert; import org.junit.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; import java.lang.reflect.Field; import java.util.ArrayList; @@ -40,11 +45,18 @@ * @since 2023-07-27 */ public class HttpServletInterceptorTest extends BaseInterceptorTest { + private final ServiceCombHeaderParseService parseService = Mockito.mock(ServiceCombHeaderParseService.class); + private final HttpServletInterceptor interceptor; private final Object[] arguments; + public MockedStatic pluginServiceManagerMockedStatic; + public HttpServletInterceptorTest() { + pluginServiceManagerMockedStatic = Mockito.mockStatic(PluginServiceManager.class); + pluginServiceManagerMockedStatic.when(() -> PluginServiceManager.getPluginService(ServiceCombHeaderParseService.class)) + .thenReturn(parseService); interceptor = new HttpServletInterceptor(); arguments = new Object[2]; } @@ -103,4 +115,9 @@ public ExecuteContext buildContext(Map> addHeaders) arguments[0] = new RequestFacade(request); return ExecuteContext.forMemberMethod(new Object(), null, arguments, null, null); } + + @After + public void afterTest() { + pluginServiceManagerMockedStatic.close(); + } } diff --git a/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/test/java/com/huaweicloud/sermant/tag/transmission/interceptors/rpc/servicecomb/ServiceCombRpcProviderInterceptorTest.java b/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/test/java/com/huaweicloud/sermant/tag/transmission/interceptors/rpc/servicecomb/ServiceCombRpcProviderInterceptorTest.java deleted file mode 100644 index 252f8c075e..0000000000 --- a/sermant-plugins/sermant-tag-transmission/tag-transmission-plugin/src/test/java/com/huaweicloud/sermant/tag/transmission/interceptors/rpc/servicecomb/ServiceCombRpcProviderInterceptorTest.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.huaweicloud.sermant.tag.transmission.interceptors.rpc.servicecomb; - -import com.huaweicloud.sermant.core.plugin.agent.entity.ExecuteContext; -import com.huaweicloud.sermant.core.utils.tag.TrafficTag; -import com.huaweicloud.sermant.core.utils.tag.TrafficUtils; -import com.huaweicloud.sermant.tag.transmission.interceptors.rpc.AbstractRpcInterceptorTest; - -import org.apache.servicecomb.core.Invocation; -import org.apache.servicecomb.foundation.vertx.http.HttpServletRequestEx; -import org.junit.After; -import org.junit.Assert; -import org.junit.Test; -import org.mockito.Mockito; - -import java.util.Enumeration; -import java.util.List; -import java.util.Map; -import java.util.Vector; - -/** - * ServiceCombRpcProviderInterceptor类的单元测试 - * - * @author daizhenyu - * @since 2023-08-30 - **/ -public class ServiceCombRpcProviderInterceptorTest extends AbstractRpcInterceptorTest { - private final ServiceCombRpcProviderInterceptor interceptor = new ServiceCombRpcProviderInterceptor(); - - public ServiceCombRpcProviderInterceptorTest() { - } - - @Override - public void doBefore(TrafficTag trafficTag) { - } - - @Test - public void testServiceCombRpcProvider() { - // 定义参数 - Invocation invocation; - Object[] arguments; - Object obj = new Object(); - ExecuteContext context; - ExecuteContext returnContext; - Map> expectTrafficTag; - HttpServletRequestEx requestEx; - - // Invocation 为null - context = buildContext(null); - interceptor.before(context); - Assert.assertNull(TrafficUtils.getTrafficTag()); - - // 流量标签透传开关关闭 - tagTransmissionConfig.setEnabled(false); - context = buildContext(new Invocation()); - interceptor.before(context); - Assert.assertNull(TrafficUtils.getTrafficTag()); - tagTransmissionConfig.setEnabled(true); - - // Invocation包含完整的tag - invocation = new Invocation(); - invocation.getContext().put("id", "001"); - invocation.getContext().put("name", "test001"); - arguments = new Object[]{invocation}; - context = ExecuteContext.forMemberMethod(obj, null, arguments, null, null); - returnContext = interceptor.before(context); - expectTrafficTag = buildExpectTrafficTag("id", "name"); - Assert.assertEquals(TrafficUtils.getTrafficTag().getTag(), expectTrafficTag); - interceptor.after(returnContext); - - // Invocation包含部分的tag - invocation = new Invocation(); - invocation.getContext().put("id", "001"); - arguments = new Object[]{invocation}; - context = ExecuteContext.forMemberMethod(obj, null, arguments, null, null); - returnContext = interceptor.before(context); - expectTrafficTag = buildExpectTrafficTag("id"); - Assert.assertEquals(TrafficUtils.getTrafficTag().getTag(), expectTrafficTag); - interceptor.after(returnContext); - - // 使用非servicecombrpc方式调用provider - invocation = new Invocation(); - requestEx = Mockito.mock(HttpServletRequestEx.class); - Vector keyVector = new Vector<>(); - keyVector.add("id"); - keyVector.add("name"); - Enumeration headerNames = keyVector.elements(); - Mockito.when(requestEx.getHeaderNames()).thenReturn(headerNames); - Vector idVector = new Vector<>(); - idVector.add("001"); - Enumeration ids = idVector.elements(); - Vector nameVector = new Vector<>(); - nameVector.add("test001"); - Enumeration names = nameVector.elements(); - Mockito.when(requestEx.getHeaders("name")).thenReturn(names); - Mockito.when(requestEx.getHeaders("id")).thenReturn(ids); - invocation.onStart(requestEx, 1000L); - arguments = new Object[]{invocation}; - context = ExecuteContext.forMemberMethod(obj, null, arguments, null, null); - returnContext = interceptor.before(context); - expectTrafficTag = buildExpectTrafficTag("id", "name"); - Assert.assertEquals(TrafficUtils.getTrafficTag().getTag(), expectTrafficTag); - interceptor.after(returnContext); - } - - @After - public void afterTest() { - Mockito.clearAllCaches(); - } - - private ExecuteContext buildContext(Invocation invocation) { - Object[] arguments = new Object[]{invocation}; - return ExecuteContext.forMemberMethod(new Object(), null, arguments, null, null); - } -} \ No newline at end of file diff --git a/sermant-plugins/sermant-tag-transmission/tag-transmission-service/pom.xml b/sermant-plugins/sermant-tag-transmission/tag-transmission-service/pom.xml index cf08a26ca2..3e5a1e2887 100644 --- a/sermant-plugins/sermant-tag-transmission/tag-transmission-service/pom.xml +++ b/sermant-plugins/sermant-tag-transmission/tag-transmission-service/pom.xml @@ -23,6 +23,10 @@ org.yaml snakeyaml + + com.alibaba + fastjson + com.huaweicloud.sermant sermant-agentcore-core diff --git a/sermant-plugins/sermant-tag-transmission/tag-transmission-service/src/main/java/com/huaweicloud/sermant/tag/transmission/service/ServiceCombHeaderParseServiceImpl.java b/sermant-plugins/sermant-tag-transmission/tag-transmission-service/src/main/java/com/huaweicloud/sermant/tag/transmission/service/ServiceCombHeaderParseServiceImpl.java new file mode 100644 index 0000000000..cd3cc277da --- /dev/null +++ b/sermant-plugins/sermant-tag-transmission/tag-transmission-service/src/main/java/com/huaweicloud/sermant/tag/transmission/service/ServiceCombHeaderParseServiceImpl.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2023-2023 Huawei Technologies Co., Ltd. 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. + */ + +package com.huaweicloud.sermant.tag.transmission.service; + +import com.alibaba.fastjson.JSON; + +import java.util.Map; + +/** + * HeaderParseService的实现类,用于解析servicecomb rpc服务的header + * + * @author daizhenyu + * @since 2023-09-14 + **/ +public class ServiceCombHeaderParseServiceImpl implements ServiceCombHeaderParseService { + @Override + public Map parseHeaderFromJson(String header) { + return JSON.parseObject(header, Map.class); + } +} \ No newline at end of file diff --git a/sermant-plugins/sermant-tag-transmission/tag-transmission-service/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.service.PluginService b/sermant-plugins/sermant-tag-transmission/tag-transmission-service/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.service.PluginService index 702e2b1af9..8092b80e63 100644 --- a/sermant-plugins/sermant-tag-transmission/tag-transmission-service/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.service.PluginService +++ b/sermant-plugins/sermant-tag-transmission/tag-transmission-service/src/main/resources/META-INF/services/com.huaweicloud.sermant.core.plugin.service.PluginService @@ -14,4 +14,5 @@ # limitations under the License. # -com.huaweicloud.sermant.tag.transmission.service.TagConfigService \ No newline at end of file +com.huaweicloud.sermant.tag.transmission.service.TagConfigService +com.huaweicloud.sermant.tag.transmission.service.ServiceCombHeaderParseServiceImpl \ No newline at end of file