From 958608f9beb4075e16a48e0ccd092c4e8a46d5a4 Mon Sep 17 00:00:00 2001 From: andrew shan <45474304+andrewshan@users.noreply.github.com> Date: Mon, 17 Jun 2024 17:59:05 +0800 Subject: [PATCH 1/6] feat: support trace reporting --- polaris-assembly/polaris-assembly-api/pom.xml | 5 - .../polaris/assembly/api/AssemblyAPI.java | 61 ++--- .../assembly/api/pojo/AfterRequest.java | 108 -------- .../assembly/api/pojo/BeforeRequest.java | 65 ----- .../assembly/api/pojo/BeforeResponse.java | 89 ------- .../api/pojo/GetOneInstanceRequest.java | 131 +++++++++- .../pojo/GetReachableInstancesRequest.java | 150 +++++++++++ .../assembly/api/pojo/ServiceCallResult.java | 98 -------- .../assembly/api/pojo/TraceAttributes.java | 52 ++++ .../polaris/assembly/api/pojo/Validator.java | 88 +++++++ .../polaris/assembly/flow/AssemblyFlow.java | 41 +-- .../polaris-assembly-client/pom.xml | 20 -- .../assembly/client/DefaultAssemblyAPI.java | 51 ++-- .../client/flow/DefaultAssemblyFlow.java | 153 ++++++++++-- .../polaris-assembly-factory/pom.xml | 50 +++- .../assembly/factory/AssemblyAPIFactory.java | 20 +- .../assembly/factory/AssemblyTest.java | 236 ++++++++++++++++++ .../factory/PrometheusHttpServerTest.java | 99 ++++++++ .../src/test/resources/log4j2.xml | 28 +++ .../src/test/resources/polaris.yml | 30 +++ .../polaris-circuitbreaker-factory/pom.xml | 20 +- .../factory/test/CircuitBreakerTest.java | 117 +++++---- .../main/resources/conf/default-config.yml | 6 + .../api/config/global/GlobalConfig.java | 12 +- .../config/global/TraceReporterConfig.java | 68 ++--- .../config/global/GlobalConfigImpl.java | 16 ++ .../global/TraceReporterConfigImpl.java | 81 ++++++ .../polaris/client/util/CommonValidator.java | 2 + polaris-dependencies/pom.xml | 5 + .../tencent/polaris/api/core/ConsumerAPI.java | 12 + .../client/flow/CommonInstancesRequest.java | 20 ++ .../api/plugin/common/PluginTypes.java | 8 +- .../api/plugin/compose/Extensions.java | 20 ++ .../polaris/api/plugin/stat/StatReporter.java | 2 +- .../api/plugin/stat/TraceReporter.java | 65 +++-- .../polaris-plugins-observability/pom.xml | 1 + .../trace-otel/pom.xml | 29 +++ .../plugins/stat/otel/OtelTraceReporter.java | 72 ++++++ ...cent.polaris.api.plugin.stat.TraceReporter | 1 + .../stat/otel/OtelTraceReporterTest.java | 43 ++++ pom.xml | 3 +- 41 files changed, 1533 insertions(+), 645 deletions(-) delete mode 100644 polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/AfterRequest.java delete mode 100644 polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/BeforeRequest.java delete mode 100644 polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/BeforeResponse.java create mode 100644 polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/GetReachableInstancesRequest.java delete mode 100644 polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/ServiceCallResult.java create mode 100644 polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/TraceAttributes.java create mode 100644 polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/Validator.java create mode 100644 polaris-assembly/polaris-assembly-factory/src/test/java/com/tencent/polaris/assembly/factory/AssemblyTest.java create mode 100644 polaris-assembly/polaris-assembly-factory/src/test/java/com/tencent/polaris/assembly/factory/PrometheusHttpServerTest.java create mode 100644 polaris-assembly/polaris-assembly-factory/src/test/resources/log4j2.xml create mode 100644 polaris-assembly/polaris-assembly-factory/src/test/resources/polaris.yml rename polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/AttachmentBaseEntity.java => polaris-common/polaris-config/src/main/java/com/tencent/polaris/api/config/global/TraceReporterConfig.java (66%) create mode 100644 polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/TraceReporterConfigImpl.java rename polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/Capability.java => polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/stat/TraceReporter.java (57%) create mode 100644 polaris-plugins/polaris-plugins-observability/trace-otel/pom.xml create mode 100644 polaris-plugins/polaris-plugins-observability/trace-otel/src/main/java/com/tencent/polaris/plugins/stat/otel/OtelTraceReporter.java create mode 100644 polaris-plugins/polaris-plugins-observability/trace-otel/src/main/resources/META-INF/services/com.tencent.polaris.api.plugin.stat.TraceReporter create mode 100644 polaris-plugins/polaris-plugins-observability/trace-otel/src/test/java/com/tencent/polaris/plugins/stat/otel/OtelTraceReporterTest.java diff --git a/polaris-assembly/polaris-assembly-api/pom.xml b/polaris-assembly/polaris-assembly-api/pom.xml index 073812177..d0d0a3ae4 100644 --- a/polaris-assembly/polaris-assembly-api/pom.xml +++ b/polaris-assembly/polaris-assembly-api/pom.xml @@ -20,11 +20,6 @@ polaris-model ${project.version} - - com.tencent.polaris - polaris-plugin-api - ${project.version} - com.tencent.polaris polaris-client diff --git a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/AssemblyAPI.java b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/AssemblyAPI.java index f2814b7df..df2aae2c2 100644 --- a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/AssemblyAPI.java +++ b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/AssemblyAPI.java @@ -17,59 +17,52 @@ package com.tencent.polaris.assembly.api; +import java.io.Closeable; +import java.util.List; + import com.tencent.polaris.api.pojo.Instance; -import com.tencent.polaris.api.pojo.ServiceKey; -import com.tencent.polaris.assembly.api.pojo.AfterRequest; -import com.tencent.polaris.assembly.api.pojo.BeforeRequest; -import com.tencent.polaris.assembly.api.pojo.BeforeResponse; +import com.tencent.polaris.api.rpc.ServiceCallResult; import com.tencent.polaris.assembly.api.pojo.GetOneInstanceRequest; -import com.tencent.polaris.assembly.api.pojo.ServiceCallResult; +import com.tencent.polaris.assembly.api.pojo.GetReachableInstancesRequest; +import com.tencent.polaris.assembly.api.pojo.TraceAttributes; -public interface AssemblyAPI { +public interface AssemblyAPI extends AutoCloseable, Closeable { /** - * 主调 pre hook - * @param beforeRequest beforeRequest - * @return BeforeResponse + * 获取路由后的服务实例列表,贯穿服务发现、服务路由的逻辑 + * @param request 多个符合路由条件的服务实例 + * @return List */ - BeforeResponse beforeCallService(BeforeRequest beforeRequest); + List getReachableInstances(GetReachableInstancesRequest request); /** - * 主调 post hook - * @param afterRequest afterRequest + * 获取单个服务实例,贯穿服务发现、服务路由、负载均衡的逻辑,最终返回单个服务实例 + * @param request request + * @return Instance */ - void afterCallService(AfterRequest afterRequest); + Instance getOneInstance(GetOneInstanceRequest request); /** - * 被调 pre hook - * @param beforeRequest beforeRequest - * @return BeforeResponse + * 上报服务调用结果,服务调用结果可用于熔断统计和监控数据 + * @param result 调用结果(包括成功失败,返回码,以及时延) */ - BeforeResponse beforeProcess(BeforeRequest beforeRequest); + void updateServiceCallResult(ServiceCallResult result); /** - * 被调 post hook - * @param afterRequest afterRequest + * 上报调用链属性数据 */ - void afterProcess(AfterRequest afterRequest); + void updateTraceAttributes(TraceAttributes traceAttributes); /** - * 注册前hook - * @param serviceKey serviceKey + * 清理并释放资源 */ - void initService(ServiceKey serviceKey); + default void destroy() { - /** - * 负载均衡 hook - * @param request request - * @return Instance - */ - Instance getOneInstance(GetOneInstanceRequest request); + } - /** - * - * @param result - */ - void updateServiceCallResult(ServiceCallResult result); + @Override + default void close() { + destroy(); + } } diff --git a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/AfterRequest.java b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/AfterRequest.java deleted file mode 100644 index 1b03d5b46..000000000 --- a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/AfterRequest.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Polaris available. - * - * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * 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.tencent.polaris.assembly.api.pojo; - -import com.tencent.polaris.api.pojo.Instance; -import com.tencent.polaris.api.pojo.ServiceKey; -import com.tencent.polaris.api.rpc.MetadataProvider; -import com.tencent.polaris.api.rpc.RequestContext; -import com.tencent.polaris.api.rpc.ResponseContext; -import java.util.Map; - -public class AfterRequest extends AttachmentBaseEntity { - - private ServiceKey targetService; - - private Instance targetInstance; - - private RequestContext requestContext; - - private ResponseContext responseContext; - - private MetadataProvider metadataProvider; - - private Map routeLabels; - - private long delay; - - private Capability[] capabilities; - - public ServiceKey getTargetService() { - return targetService; - } - - public void setTargetService(ServiceKey targetService) { - this.targetService = targetService; - } - - public Instance getTargetInstance() { - return targetInstance; - } - - public void setTargetInstance(Instance targetInstance) { - this.targetInstance = targetInstance; - } - - public ResponseContext getResponseContext() { - return responseContext; - } - - public void setResponseContext(ResponseContext responseContext) { - this.responseContext = responseContext; - } - - public MetadataProvider getMetadataProvider() { - return metadataProvider; - } - - public void setMetadataProvider(MetadataProvider metadataProvider) { - this.metadataProvider = metadataProvider; - } - - public Capability[] getCapabilities() { - return capabilities; - } - - public void setCapabilities(Capability[] capabilities) { - this.capabilities = capabilities; - } - - public RequestContext getRequestContext() { - return requestContext; - } - - public Map getRouteLabels() { - return routeLabels; - } - - public void setRouteLabels(Map routeLabels) { - this.routeLabels = routeLabels; - } - - public void setRequestContext(RequestContext requestContext) { - this.requestContext = requestContext; - } - - public long getDelay() { - return delay; - } - - public void setDelay(long delay) { - this.delay = delay; - } -} diff --git a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/BeforeRequest.java b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/BeforeRequest.java deleted file mode 100644 index 31badd1f4..000000000 --- a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/BeforeRequest.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Polaris available. - * - * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * 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.tencent.polaris.assembly.api.pojo; - -import com.tencent.polaris.api.pojo.ServiceKey; -import com.tencent.polaris.api.rpc.MetadataProvider; -import com.tencent.polaris.api.rpc.RequestContext; - -public class BeforeRequest extends AttachmentBaseEntity { - - private ServiceKey targetService; - - private RequestContext requestContext; - - private MetadataProvider metadataProvider; - - private Capability[] capabilities; - - public ServiceKey getTargetService() { - return targetService; - } - - public void setTargetService(ServiceKey targetService) { - this.targetService = targetService; - } - - public RequestContext getRequestContext() { - return requestContext; - } - - public void setRequestContext(RequestContext requestContext) { - this.requestContext = requestContext; - } - - public MetadataProvider getMetadataProvider() { - return metadataProvider; - } - - public void setMetadataProvider(MetadataProvider metadataProvider) { - this.metadataProvider = metadataProvider; - } - - public Capability[] getCapabilities() { - return capabilities; - } - - public void setCapabilities(Capability[] capabilities) { - this.capabilities = capabilities; - } -} diff --git a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/BeforeResponse.java b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/BeforeResponse.java deleted file mode 100644 index 5f5479ddf..000000000 --- a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/BeforeResponse.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Polaris available. - * - * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * 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.tencent.polaris.assembly.api.pojo; - -import com.tencent.polaris.api.pojo.Instance; -import com.tencent.polaris.api.pojo.RetStatus; -import com.tencent.polaris.api.utils.CollectionUtils; -import java.util.HashMap; -import java.util.Map; - -public class BeforeResponse extends AttachmentBaseEntity { - - private final RetStatus retStatus; - - private final Instance selectedInstance; - - private final Map capabilityResponses = new HashMap<>(); - - public BeforeResponse(RetStatus retStatus, Instance selectedInstance, Map capabilityResponses) { - this.retStatus = retStatus; - this.selectedInstance = selectedInstance; - if (!CollectionUtils.isEmpty(capabilityResponses)) { - this.capabilityResponses.putAll(capabilityResponses); - } - } - - public RetStatus getRetStatus() { - return retStatus; - } - - - public Instance getSelectedInstance() { - return selectedInstance; - } - @SuppressWarnings("unchecked") - public T getCapabilityResponse(Capability capability) { - if (capabilityResponses.containsKey(capability)) { - return (T)capabilityResponses.get(capability); - } - return null; - } - - public static Builder builder() { - return new Builder(); - } - - public static class Builder { - - private RetStatus retStatus; - - private final Map capabilityResponses = new HashMap<>(); - - private Instance selectedInstance; - - public Builder setRetStatus(RetStatus retStatus) { - this.retStatus = retStatus; - return this; - } - - public Builder putCapabilityResponse(Capability capability, Object response) { - capabilityResponses.put(capability, response); - return this; - } - - public Builder setSelectedInstance(Instance selectedInstance) { - this.selectedInstance = selectedInstance; - return this; - } - - public BeforeResponse build() { - return new BeforeResponse(retStatus, selectedInstance, capabilityResponses); - } - } -} diff --git a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/GetOneInstanceRequest.java b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/GetOneInstanceRequest.java index 83995a2b2..d103ee2ad 100644 --- a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/GetOneInstanceRequest.java +++ b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/GetOneInstanceRequest.java @@ -17,32 +17,137 @@ package com.tencent.polaris.assembly.api.pojo; +import java.util.Collections; +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.function.Function; + +import com.tencent.polaris.api.pojo.RouteArgument; +import com.tencent.polaris.api.pojo.ServiceInfo; +import com.tencent.polaris.api.pojo.SourceService; import com.tencent.polaris.api.rpc.Criteria; -import com.tencent.polaris.api.rpc.MetadataProvider; +import com.tencent.polaris.api.rpc.MetadataFailoverType; import com.tencent.polaris.api.rpc.RequestBaseEntity; -import com.tencent.polaris.api.rpc.RequestContext; public class GetOneInstanceRequest extends RequestBaseEntity { - private RequestContext requestContext; + /** + * 可选,服务元数据信息,用于服务路由过滤 + */ + private Map metadata; + + /** + * 所属的金丝雀集群 + */ + private String canary; + + /** + * 可选,负载均衡辅助参数 + */ + private Criteria criteria; + + /** + * 接口参数 + */ + private String method; + + /** + * 可选, metadata失败降级策略 + */ + private MetadataFailoverType metadataFailoverType; + + + /** + * 主调方服务信息 + */ + private SourceService serviceInfo; + + /** + * 北极星内部治理规则执行时,会识别规则中的参数来源类别,如果发现规则中的参数来源指定为外部数据源时,会调用本接口进行获取 + * + * 可以实现该接口,实现规则中的参数来源于配置中心、数据库、环境变量等等 + */ + private Function> externalParameterSupplier = s -> Optional.empty(); + + public Criteria getCriteria() { + return criteria; + } + + public void setCriteria(Criteria criteria) { + this.criteria = criteria; + } + + public Map getMetadata() { + return metadata; + } + + public void setMetadata(Map metadata) { + this.metadata = metadata; + } + + public String getCanary() { + return canary; + } + + public void setCanary(String canary) { + this.canary = canary; + } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } - private MetadataProvider metadataProvider; + public SourceService getServiceInfo() { + return serviceInfo; + } - private Criteria lbCriteria; + public void setServiceInfo(ServiceInfo serviceInfo) { + if (serviceInfo instanceof SourceService) { + this.serviceInfo = (SourceService) serviceInfo; + } else { + SourceService sourceService = new SourceService(); + sourceService.setNamespace(serviceInfo.getNamespace()); + sourceService.setService(serviceInfo.getService()); + Set argumentSet = new HashSet<>(); + Optional.ofNullable(serviceInfo.getMetadata()).orElse(Collections.emptyMap()) + .forEach((key, value) -> argumentSet.add(RouteArgument.fromLabel(key, value))); + sourceService.setArguments(argumentSet); + this.serviceInfo = sourceService; + } + } + + public MetadataFailoverType getMetadataFailoverType() { + return metadataFailoverType; + } - public RequestContext getRequestContext() { - return requestContext; + public void setMetadataFailoverType(MetadataFailoverType metadataFailoverType) { + this.metadataFailoverType = metadataFailoverType; } - public void setRequestContext(RequestContext requestContext) { - this.requestContext = requestContext; + public Function> getExternalParameterSupplier() { + return externalParameterSupplier; } - public Criteria getLbCriteria() { - return lbCriteria; + public void setExternalParameterSupplier(Function> externalParameterSupplier) { + this.externalParameterSupplier = externalParameterSupplier; } - public void setLbCriteria(Criteria lbCriteria) { - this.lbCriteria = lbCriteria; + @Override + @SuppressWarnings("checkstyle:all") + public String toString() { + return "GetOneInstanceRequest{" + + "metadata=" + metadata + + ", canary='" + canary + '\'' + + ", criteria=" + criteria + + ", method='" + method + '\'' + + ", metadataFailoverType=" + metadataFailoverType + + ", serviceInfo=" + serviceInfo + + "} " + super.toString(); } } diff --git a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/GetReachableInstancesRequest.java b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/GetReachableInstancesRequest.java new file mode 100644 index 000000000..d24db1e41 --- /dev/null +++ b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/GetReachableInstancesRequest.java @@ -0,0 +1,150 @@ +/* + * Tencent is pleased to support the open source community by making Polaris available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.polaris.assembly.api.pojo; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import com.tencent.polaris.api.pojo.RouteArgument; +import com.tencent.polaris.api.pojo.ServiceInfo; +import com.tencent.polaris.api.pojo.SourceService; +import com.tencent.polaris.api.rpc.MetadataFailoverType; +import com.tencent.polaris.api.rpc.RequestBaseEntity; + +public class GetReachableInstancesRequest extends RequestBaseEntity { + + /** + * 服务元数据信息,用于服务路由过滤 + */ + private Map metadata; + + /** + * 主调方服务信息 + */ + private SourceService sourceService; + + /** + * 是否返回熔断实例,默认否 + */ + private boolean includeCircuitBreak; + + /** + * 是否返回不健康的服务实例,默认否 + */ + private boolean includeUnhealthy; + + /** + * 金丝雀集群 + */ + private String canary; + + /** + * 接口参数 + */ + private String method; + + /** + * 可选, metadata失败降级策略 + */ + private MetadataFailoverType metadataFailoverType; + + public boolean isIncludeCircuitBreak() { + return includeCircuitBreak; + } + + public void setIncludeCircuitBreak(boolean includeCircuitBreak) { + this.includeCircuitBreak = includeCircuitBreak; + } + + public Map getMetadata() { + return metadata; + } + + public void setMetadata(Map metadata) { + this.metadata = metadata; + } + + public boolean isIncludeUnhealthy() { + return includeUnhealthy; + } + + public void setIncludeUnhealthy(boolean includeUnhealthy) { + this.includeUnhealthy = includeUnhealthy; + } + + + public SourceService getServiceInfo() { + return sourceService; + } + + public void setServiceInfo(ServiceInfo serviceInfo) { + if (serviceInfo instanceof SourceService) { + this.sourceService = (SourceService) serviceInfo; + } else { + SourceService sourceService = new SourceService(); + sourceService.setNamespace(serviceInfo.getNamespace()); + sourceService.setService(serviceInfo.getService()); + Set argumentSet = new HashSet<>(); + Optional.ofNullable(serviceInfo.getMetadata()).orElse(Collections.emptyMap()) + .forEach((key, value) -> argumentSet.add(RouteArgument.fromLabel(key, value))); + sourceService.setArguments(argumentSet); + this.sourceService = sourceService; + } + } + + public String getCanary() { + return canary; + } + + public void setCanary(String canary) { + this.canary = canary; + } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public MetadataFailoverType getMetadataFailoverType() { + return metadataFailoverType; + } + + public void setMetadataFailoverType(MetadataFailoverType metadataFailoverType) { + this.metadataFailoverType = metadataFailoverType; + } + + @Override + @SuppressWarnings("checkstyle:all") + public String toString() { + return "GetInstancesRequest{" + + "metadata=" + metadata + + ", sourceService=" + sourceService + + ", includeCircuitBreak=" + includeCircuitBreak + + ", includeUnhealthy=" + includeUnhealthy + + ", canary='" + canary + '\'' + + ", method='" + method + '\'' + + ", metadataFailoverType=" + metadataFailoverType + + "} " + super.toString(); + } +} diff --git a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/ServiceCallResult.java b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/ServiceCallResult.java deleted file mode 100644 index 67701e07a..000000000 --- a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/ServiceCallResult.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making Polaris available. - * - * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * 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.tencent.polaris.assembly.api.pojo; - -import com.tencent.polaris.api.pojo.Instance; -import com.tencent.polaris.api.pojo.ServiceKey; -import com.tencent.polaris.api.rpc.MetadataProvider; -import com.tencent.polaris.api.rpc.RequestContext; -import com.tencent.polaris.api.rpc.ResponseContext; -import java.util.Map; - -public class ServiceCallResult { - - private ServiceKey targetService; - - private Instance targetInstance; - - private RequestContext requestContext; - - private ResponseContext responseContext; - - private MetadataProvider metadataProvider; - - private Map routeLabels; - - private long delay; - - public ServiceKey getTargetService() { - return targetService; - } - - public void setTargetService(ServiceKey targetService) { - this.targetService = targetService; - } - - public Instance getTargetInstance() { - return targetInstance; - } - - public void setTargetInstance(Instance targetInstance) { - this.targetInstance = targetInstance; - } - - public RequestContext getRequestContext() { - return requestContext; - } - - public void setRequestContext(RequestContext requestContext) { - this.requestContext = requestContext; - } - - public ResponseContext getResponseContext() { - return responseContext; - } - - public void setResponseContext(ResponseContext responseContext) { - this.responseContext = responseContext; - } - - public MetadataProvider getMetadataProvider() { - return metadataProvider; - } - - public void setMetadataProvider(MetadataProvider metadataProvider) { - this.metadataProvider = metadataProvider; - } - - public Map getRouteLabels() { - return routeLabels; - } - - public void setRouteLabels(Map routeLabels) { - this.routeLabels = routeLabels; - } - - public long getDelay() { - return delay; - } - - public void setDelay(long delay) { - this.delay = delay; - } -} diff --git a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/TraceAttributes.java b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/TraceAttributes.java new file mode 100644 index 000000000..d87cdccc0 --- /dev/null +++ b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/TraceAttributes.java @@ -0,0 +1,52 @@ +/* + * Tencent is pleased to support the open source community by making Polaris available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.polaris.assembly.api.pojo; + +import java.util.Map; + +public class TraceAttributes { + + /** + * The location to put attributes + */ + public enum AttributeLocation { + SPAN, + BAGGAGE + } + + private Map attributes; + + + private AttributeLocation attributeLocation; + + public Map getAttributes() { + return attributes; + } + + public void setAttributes(Map attributes) { + this.attributes = attributes; + } + + public AttributeLocation getAttributeLocation() { + return attributeLocation; + } + + public void setAttributeLocation(AttributeLocation attributeLocation) { + this.attributeLocation = attributeLocation; + } +} diff --git a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/Validator.java b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/Validator.java new file mode 100644 index 000000000..d216149a8 --- /dev/null +++ b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/Validator.java @@ -0,0 +1,88 @@ +/* + * Tencent is pleased to support the open source community by making Polaris available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.polaris.assembly.api.pojo; + +import com.tencent.polaris.api.exception.ErrorCode; +import com.tencent.polaris.api.exception.PolarisException; +import com.tencent.polaris.api.pojo.RetStatus; +import com.tencent.polaris.api.rpc.ServiceCallResult; +import com.tencent.polaris.api.utils.StringUtils; +import com.tencent.polaris.client.util.CommonValidator; + +public class Validator { + + /** + * 校验获取单个服务实例的请求 + * + * @param request 请求对象 + * @throws PolarisException 校验失败会抛出异常 + */ + public static void validateGetOneInstanceRequest(GetOneInstanceRequest request) throws PolarisException { + CommonValidator.validateNamespaceService(request.getNamespace(), request.getService()); + } + + /** + * 校验获取批量服务实例的请求 + * + * @param request 请求对象 + * @throws PolarisException 校验失败会抛出异常 + */ + public static void validateGetReachableInstancesRequest(GetReachableInstancesRequest request) throws PolarisException { + CommonValidator.validateNamespaceService(request.getNamespace(), request.getService()); + } + + /** + * 校验用户上报的调用结果 + * + * @param serviceCallResult 调用结果 + * @throws PolarisException 校验失败会抛出异常 + */ + public static void validateServiceCallResult(ServiceCallResult serviceCallResult) throws PolarisException { + CommonValidator.validateNamespaceService(serviceCallResult.getNamespace(), serviceCallResult.getService()); + if (null == serviceCallResult.getRetStatus()) { + throw new PolarisException(ErrorCode.API_INVALID_ARGUMENT, "retStatus can not be blank"); + } + if (null != serviceCallResult.getDelay() && serviceCallResult.getDelay() < 0) { + throw new PolarisException(ErrorCode.API_INVALID_ARGUMENT, "delay can not be less than 0"); + } + if (!RetStatus.RetReject.equals(serviceCallResult.getRetStatus())) { + validateHostPort(serviceCallResult.getHost(), serviceCallResult.getPort()); + } + } + + /** + * 校验端口信息 + * + * @param port 端口类型 + * @throws PolarisException 校验失败异常 + */ + private static void validateHostPort(String host, Integer port) throws PolarisException { + if (StringUtils.isBlank(host)) { + throw new PolarisException(ErrorCode.API_INVALID_ARGUMENT, "host can not be blank"); + } + if (port == null) { + throw new PolarisException(ErrorCode.API_INVALID_ARGUMENT, "port can not be null"); + } + if (port <= 0 || port >= CommonValidator.MAX_PORT) { + throw new PolarisException( + ErrorCode.API_INVALID_ARGUMENT, "port value should be in range (0, 65536)."); + } + } + + +} diff --git a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/flow/AssemblyFlow.java b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/flow/AssemblyFlow.java index 8f942aa49..91e589e58 100644 --- a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/flow/AssemblyFlow.java +++ b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/flow/AssemblyFlow.java @@ -17,43 +17,12 @@ package com.tencent.polaris.assembly.flow; -import com.tencent.polaris.api.pojo.Instance; -import com.tencent.polaris.api.pojo.ServiceKey; -import com.tencent.polaris.assembly.api.pojo.AfterRequest; -import com.tencent.polaris.assembly.api.pojo.BeforeRequest; -import com.tencent.polaris.assembly.api.pojo.BeforeResponse; -import com.tencent.polaris.assembly.api.pojo.GetOneInstanceRequest; -import com.tencent.polaris.assembly.api.pojo.ServiceCallResult; +import com.tencent.polaris.assembly.api.AssemblyAPI; import com.tencent.polaris.client.flow.AbstractFlow; -public interface AssemblyFlow extends AbstractFlow { - - default BeforeResponse beforeCallService(BeforeRequest beforeRequest) { - return null; - } - - default void afterCallService(AfterRequest afterRequest) { - - } - - default BeforeResponse beforeProcess(BeforeRequest beforeRequest) { - return null; - } - - default void afterProcess(AfterRequest afterRequest) { - - } - - default void initService(ServiceKey serviceKey) { - - } - - default Instance getOneInstance(GetOneInstanceRequest request) { - return null; - } - - default void updateServiceCallResult(ServiceCallResult result) { - - } +/** + * flow extension for AssemblyAPI + */ +public interface AssemblyFlow extends AbstractFlow, AssemblyAPI { } diff --git a/polaris-assembly/polaris-assembly-client/pom.xml b/polaris-assembly/polaris-assembly-client/pom.xml index fe83cb6bf..81fd7d943 100644 --- a/polaris-assembly/polaris-assembly-client/pom.xml +++ b/polaris-assembly/polaris-assembly-client/pom.xml @@ -25,25 +25,5 @@ polaris-discovery-client ${project.version} - - com.tencent.polaris - polaris-circuitbreaker-client - ${project.version} - - - com.tencent.polaris - polaris-ratelimit-client - ${project.version} - - - com.tencent.polaris - polaris-router-client - ${project.version} - - - com.tencent.polaris - polaris-configuration-client - ${project.version} - \ No newline at end of file diff --git a/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/DefaultAssemblyAPI.java b/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/DefaultAssemblyAPI.java index 1c7b32bef..ac74e830d 100644 --- a/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/DefaultAssemblyAPI.java +++ b/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/DefaultAssemblyAPI.java @@ -17,15 +17,17 @@ package com.tencent.polaris.assembly.client; +import java.util.List; + import com.tencent.polaris.api.exception.PolarisException; import com.tencent.polaris.api.pojo.Instance; -import com.tencent.polaris.api.pojo.ServiceKey; +import com.tencent.polaris.api.rpc.ServiceCallResult; +import com.tencent.polaris.api.utils.CollectionUtils; import com.tencent.polaris.assembly.api.AssemblyAPI; -import com.tencent.polaris.assembly.api.pojo.AfterRequest; -import com.tencent.polaris.assembly.api.pojo.BeforeRequest; -import com.tencent.polaris.assembly.api.pojo.BeforeResponse; import com.tencent.polaris.assembly.api.pojo.GetOneInstanceRequest; -import com.tencent.polaris.assembly.api.pojo.ServiceCallResult; +import com.tencent.polaris.assembly.api.pojo.GetReachableInstancesRequest; +import com.tencent.polaris.assembly.api.pojo.TraceAttributes; +import com.tencent.polaris.assembly.api.pojo.Validator; import com.tencent.polaris.assembly.flow.AssemblyFlow; import com.tencent.polaris.client.api.BaseEngine; import com.tencent.polaris.client.api.SDKContext; @@ -44,37 +46,32 @@ protected void subInit() throws PolarisException { } @Override - public BeforeResponse beforeCallService(BeforeRequest beforeRequest) { - return assemblyFlow.beforeCallService(beforeRequest); - } - - @Override - public void afterCallService(AfterRequest afterRequest) { - assemblyFlow.afterCallService(afterRequest); - } - - @Override - public BeforeResponse beforeProcess(BeforeRequest beforeRequest) { - return assemblyFlow.beforeProcess(beforeRequest); - } - - @Override - public void afterProcess(AfterRequest afterRequest) { - assemblyFlow.afterProcess(afterRequest); - } - - @Override - public void initService(ServiceKey serviceKey) { - assemblyFlow.initService(serviceKey); + public List getReachableInstances(GetReachableInstancesRequest request) { + checkAvailable("AssemblyAPI"); + Validator.validateGetReachableInstancesRequest(request); + return assemblyFlow.getReachableInstances(request); } @Override public Instance getOneInstance(GetOneInstanceRequest request) { + checkAvailable("AssemblyAPI"); + Validator.validateGetOneInstanceRequest(request); return assemblyFlow.getOneInstance(request); } @Override public void updateServiceCallResult(ServiceCallResult result) { + checkAvailable("AssemblyAPI"); + Validator.validateServiceCallResult(result); assemblyFlow.updateServiceCallResult(result); } + + @Override + public void updateTraceAttributes(TraceAttributes traceAttributes) { + checkAvailable("AssemblyAPI"); + if (CollectionUtils.isEmpty(traceAttributes.getAttributes())) { + return; + } + assemblyFlow.updateTraceAttributes(traceAttributes); + } } diff --git a/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/flow/DefaultAssemblyFlow.java b/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/flow/DefaultAssemblyFlow.java index a16dfa0f7..395255bbd 100644 --- a/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/flow/DefaultAssemblyFlow.java +++ b/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/flow/DefaultAssemblyFlow.java @@ -17,22 +17,42 @@ package com.tencent.polaris.assembly.client.flow; +import java.util.Collections; +import java.util.List; + +import com.tencent.polaris.api.config.Configuration; import com.tencent.polaris.api.config.global.FlowConfig; +import com.tencent.polaris.api.plugin.compose.Extensions; +import com.tencent.polaris.api.plugin.loadbalance.LoadBalancer; +import com.tencent.polaris.api.plugin.route.RouteInfo; +import com.tencent.polaris.api.plugin.stat.TraceReporter; import com.tencent.polaris.api.pojo.Instance; -import com.tencent.polaris.api.pojo.RetStatus; +import com.tencent.polaris.api.pojo.ServiceEventKey; +import com.tencent.polaris.api.pojo.ServiceInfo; +import com.tencent.polaris.api.pojo.ServiceInstances; import com.tencent.polaris.api.pojo.ServiceKey; -import com.tencent.polaris.assembly.api.pojo.AfterRequest; -import com.tencent.polaris.assembly.api.pojo.BeforeRequest; -import com.tencent.polaris.assembly.api.pojo.BeforeResponse; +import com.tencent.polaris.api.pojo.SourceService; +import com.tencent.polaris.api.rpc.ServiceCallResult; +import com.tencent.polaris.api.utils.CollectionUtils; +import com.tencent.polaris.api.utils.StringUtils; import com.tencent.polaris.assembly.api.pojo.GetOneInstanceRequest; -import com.tencent.polaris.assembly.api.pojo.ServiceCallResult; +import com.tencent.polaris.assembly.api.pojo.GetReachableInstancesRequest; +import com.tencent.polaris.assembly.api.pojo.TraceAttributes; import com.tencent.polaris.assembly.flow.AssemblyFlow; import com.tencent.polaris.client.api.SDKContext; +import com.tencent.polaris.client.api.ServiceCallResultListener; +import com.tencent.polaris.client.flow.BaseFlow; +import com.tencent.polaris.client.flow.ResourcesResponse; +import com.tencent.polaris.discovery.client.flow.CommonInstancesRequest; public class DefaultAssemblyFlow implements AssemblyFlow { private SDKContext sdkContext; + private Extensions extensions; + + private List serviceCallResultListeners; + @Override public String getName() { return FlowConfig.DEFAULT_FLOW_NAME; @@ -41,40 +61,127 @@ public String getName() { @Override public void setSDKContext(SDKContext sdkContext) { this.sdkContext = sdkContext; + this.extensions = sdkContext.getExtensions(); + serviceCallResultListeners = ServiceCallResultListener.getServiceCallResultListeners(sdkContext); } @Override - public BeforeResponse beforeCallService(BeforeRequest beforeRequest) { - return BeforeResponse.builder().setRetStatus(RetStatus.RetSuccess).build(); + public List getReachableInstances(GetReachableInstancesRequest request) { + CommonInstancesRequest commonInstancesRequest = buildCommonInstancesRequest(request, sdkContext.getConfig()); + ResourcesResponse resourcesResponse = BaseFlow.syncGetResources( + extensions, false, commonInstancesRequest, commonInstancesRequest); + ServiceInstances dstInstances = resourcesResponse.getServiceInstances(commonInstancesRequest.getDstInstanceEventKey()); + if (CollectionUtils.isEmpty(dstInstances.getInstances())) { + return Collections.emptyList(); + } + RouteInfo routeInfo = commonInstancesRequest.getRouteInfo(); + if (null != commonInstancesRequest.getDstRuleEventKey()) { + routeInfo.setDestRouteRule(resourcesResponse.getServiceRule(commonInstancesRequest.getDstRuleEventKey())); + } + if (null != commonInstancesRequest.getSrcRuleEventKey()) { + routeInfo.setSourceRouteRule(resourcesResponse.getServiceRule(commonInstancesRequest.getSrcRuleEventKey())); + } + ServiceInstances routerInstances = + BaseFlow.processServiceRouters(routeInfo, dstInstances, extensions.getConfigRouterChainGroup()); + return Collections.unmodifiableList(routerInstances.getInstances()); } - @Override - public void afterCallService(AfterRequest afterRequest) { - + private static CommonInstancesRequest buildCommonInstancesRequest(GetReachableInstancesRequest request, Configuration configuration) { + ServiceKey dstSvcKey = new ServiceKey(request.getNamespace(), request.getService()); + ServiceEventKey dstInstanceEventKey = new ServiceEventKey(dstSvcKey, ServiceEventKey.EventType.INSTANCE); + ServiceEventKey dstRuleEventKey = new ServiceEventKey(dstSvcKey, ServiceEventKey.EventType.ROUTING); + ServiceEventKey srcRuleEventKey = null; + SourceService srcServiceInfo = request.getServiceInfo(); + if (null != srcServiceInfo && StringUtils.isNotBlank(srcServiceInfo.getNamespace()) && StringUtils + .isNotBlank(srcServiceInfo.getService())) { + ServiceKey srcService = new ServiceKey(srcServiceInfo.getNamespace(), srcServiceInfo.getService()); + srcRuleEventKey = new ServiceEventKey(srcService, ServiceEventKey.EventType.ROUTING); + } + ServiceInfo dstServiceInfo = new ServiceInfo(); + dstServiceInfo.setNamespace(request.getNamespace()); + dstServiceInfo.setService(request.getService()); + dstServiceInfo.setMetadata(request.getMetadata()); + RouteInfo routeInfo = new RouteInfo(srcServiceInfo, dstServiceInfo, request.getMethod(), + configuration.getProvider().getService()); + routeInfo.setIncludeCircuitBreakInstances(request.isIncludeCircuitBreak()); + routeInfo.setIncludeUnhealthyInstances(request.isIncludeUnhealthy()); + routeInfo.setCanary(request.getCanary()); + routeInfo.setMetadataFailoverType(request.getMetadataFailoverType()); + return new CommonInstancesRequest(dstInstanceEventKey, dstRuleEventKey, srcRuleEventKey, routeInfo, + null, request, configuration); } @Override - public BeforeResponse beforeProcess(BeforeRequest beforeRequest) { - return BeforeResponse.builder().setRetStatus(RetStatus.RetSuccess).build(); + public Instance getOneInstance(GetOneInstanceRequest request) { + CommonInstancesRequest commonInstancesRequest = buildCommonInstancesRequest(request, sdkContext.getConfig()); + ResourcesResponse resourcesResponse = BaseFlow.syncGetResources( + extensions, false, commonInstancesRequest, commonInstancesRequest); + ServiceInstances dstInstances = resourcesResponse.getServiceInstances(commonInstancesRequest.getDstInstanceEventKey()); + if (CollectionUtils.isEmpty(dstInstances.getInstances())) { + return null; + } + RouteInfo routeInfo = commonInstancesRequest.getRouteInfo(); + if (null != commonInstancesRequest.getDstRuleEventKey()) { + routeInfo.setDestRouteRule(resourcesResponse.getServiceRule(commonInstancesRequest.getDstRuleEventKey())); + } + if (null != commonInstancesRequest.getSrcRuleEventKey()) { + routeInfo.setSourceRouteRule(resourcesResponse.getServiceRule(commonInstancesRequest.getSrcRuleEventKey())); + } + ServiceInstances routerInstances = + BaseFlow.processServiceRouters(routeInfo, dstInstances, extensions.getConfigRouterChainGroup()); + LoadBalancer loadBalancer = extensions.getLoadBalancer(); + return BaseFlow.processLoadBalance(loadBalancer, request.getCriteria(), routerInstances); } - @Override - public void afterProcess(AfterRequest afterRequest) { - + private static CommonInstancesRequest buildCommonInstancesRequest(GetOneInstanceRequest request, Configuration configuration) { + ServiceKey dstSvcKey = new ServiceKey(request.getNamespace(), request.getService()); + ServiceEventKey dstInstanceEventKey = new ServiceEventKey(dstSvcKey, ServiceEventKey.EventType.INSTANCE); + ServiceEventKey dstRuleEventKey = new ServiceEventKey(dstSvcKey, ServiceEventKey.EventType.ROUTING); + ServiceEventKey srcRuleEventKey = null; + SourceService srcServiceInfo = request.getServiceInfo(); + if (null != srcServiceInfo && StringUtils.isNotBlank(srcServiceInfo.getNamespace()) && StringUtils + .isNotBlank(srcServiceInfo.getService())) { + ServiceKey srcService = new ServiceKey(srcServiceInfo.getNamespace(), srcServiceInfo.getService()); + srcRuleEventKey = new ServiceEventKey(srcService, ServiceEventKey.EventType.ROUTING); + } + ServiceInfo dstServiceInfo = new ServiceInfo(); + dstServiceInfo.setNamespace(request.getNamespace()); + dstServiceInfo.setService(request.getService()); + dstServiceInfo.setMetadata(request.getMetadata()); + RouteInfo routeInfo = new RouteInfo(srcServiceInfo, dstServiceInfo, request.getMethod(), + configuration.getProvider().getService()); + routeInfo.setCanary(request.getCanary()); + routeInfo.setMetadataFailoverType(request.getMetadataFailoverType()); + return new CommonInstancesRequest(dstInstanceEventKey, dstRuleEventKey, srcRuleEventKey, routeInfo, + request.getCriteria(), request, configuration); } @Override - public void initService(ServiceKey serviceKey) { - + public void updateServiceCallResult(ServiceCallResult result) { + for (ServiceCallResultListener listener : serviceCallResultListeners) { + listener.onServiceCallResult(result); + } } @Override - public Instance getOneInstance(GetOneInstanceRequest request) { - return null; + public void updateTraceAttributes(TraceAttributes traceAttributes) { + if (!sdkContext.getConfig().getGlobal().getTraceReporter().isEnable()) { + return; + } + TraceReporter traceReporter = extensions.getTraceReporter(); + if (null == traceReporter) { + return; + } + switch (traceAttributes.getAttributeLocation()) { + case SPAN: + traceReporter.setSpanAttributes(traceAttributes.getAttributes()); + break; + case BAGGAGE: + traceReporter.setBaggageAttributes(traceAttributes.getAttributes()); + break; + default: + break; + } } - @Override - public void updateServiceCallResult(ServiceCallResult result) { - - } } diff --git a/polaris-assembly/polaris-assembly-factory/pom.xml b/polaris-assembly/polaris-assembly-factory/pom.xml index 8cca4acb3..3dd250a21 100644 --- a/polaris-assembly/polaris-assembly-factory/pom.xml +++ b/polaris-assembly/polaris-assembly-factory/pom.xml @@ -20,30 +20,70 @@ polaris-assembly-client ${project.version} + + com.tencent.polaris - polaris-discovery-factory + connector-composite ${project.version} + com.tencent.polaris - polaris-circuitbreaker-factory + registry-memory ${project.version} + com.tencent.polaris - polaris-ratelimit-factory + flow-cache-expired ${project.version} + com.tencent.polaris - polaris-router-factory + router-isolated ${project.version} com.tencent.polaris - polaris-configuration-factory + router-healthy ${project.version} + + + com.tencent.polaris + loadbalancer-random + ${project.version} + + + + + + com.tencent.polaris + stat-prometheus + ${project.version} + + + + + + com.tencent.polaris + trace-otel + ${project.version} + + + + com.tencent.polaris + polaris-test-common + ${project.version} + test + + + com.tencent.polaris + polaris-test-mock-discovery + ${project.version} + test + \ No newline at end of file diff --git a/polaris-assembly/polaris-assembly-factory/src/main/java/com/tencent/polaris/assembly/factory/AssemblyAPIFactory.java b/polaris-assembly/polaris-assembly-factory/src/main/java/com/tencent/polaris/assembly/factory/AssemblyAPIFactory.java index 03cd5a7c5..d9b9eeb75 100644 --- a/polaris-assembly/polaris-assembly-factory/src/main/java/com/tencent/polaris/assembly/factory/AssemblyAPIFactory.java +++ b/polaris-assembly/polaris-assembly-factory/src/main/java/com/tencent/polaris/assembly/factory/AssemblyAPIFactory.java @@ -26,18 +26,24 @@ import java.util.Arrays; public class AssemblyAPIFactory { - + + /** + * 创建服务集成的API对象,使用默认配置 + * + * @return AssemblyAPI + * @throws PolarisException 内部错误 + */ public static AssemblyAPI createAssemblyAPI() throws PolarisException { Configuration configuration = ConfigAPIFactory.defaultConfig(); return createAssemblyAPIByConfig(configuration); } /** - * 创建服务熔断的API对象 + * 创建服务集成的API对象,根据SDK上下文 * * @param sdkContext SDK上下文信息 - * @return 熔断API - * @throws PolarisException 校验失败 + * @return AssemblyAPI + * @throws PolarisException 校验失败或者内部错误 */ public static AssemblyAPI createAssemblyAPIByContext(SDKContext sdkContext) throws PolarisException { DefaultAssemblyAPI defaultAssemblyAPI = new DefaultAssemblyAPI(sdkContext); @@ -45,6 +51,12 @@ public static AssemblyAPI createAssemblyAPIByContext(SDKContext sdkContext) thro return defaultAssemblyAPI; } + /** + * 根据配置对象创建服务集成的API对象 + * @param config 配置对象 + * @return AssemblyAPI + * @throws PolarisException 校验失败或者内部错误 + */ public static AssemblyAPI createAssemblyAPIByConfig(Configuration config) throws PolarisException { SDKContext context = SDKContext.initContextByConfig(config); return createAssemblyAPIByContext(context); diff --git a/polaris-assembly/polaris-assembly-factory/src/test/java/com/tencent/polaris/assembly/factory/AssemblyTest.java b/polaris-assembly/polaris-assembly-factory/src/test/java/com/tencent/polaris/assembly/factory/AssemblyTest.java new file mode 100644 index 000000000..a47bffa0f --- /dev/null +++ b/polaris-assembly/polaris-assembly-factory/src/test/java/com/tencent/polaris/assembly/factory/AssemblyTest.java @@ -0,0 +1,236 @@ +/* + * Tencent is pleased to support the open source community by making Polaris available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.polaris.assembly.factory; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.tencent.polaris.api.config.Configuration; +import com.tencent.polaris.api.core.ConsumerAPI; +import com.tencent.polaris.api.pojo.Instance; +import com.tencent.polaris.api.pojo.ServiceKey; +import com.tencent.polaris.api.rpc.GetInstancesRequest; +import com.tencent.polaris.api.rpc.InstancesResponse; +import com.tencent.polaris.assembly.api.AssemblyAPI; +import com.tencent.polaris.assembly.api.pojo.GetOneInstanceRequest; +import com.tencent.polaris.assembly.api.pojo.GetReachableInstancesRequest; +import com.tencent.polaris.assembly.api.pojo.TraceAttributes; +import com.tencent.polaris.client.pojo.Node; +import com.tencent.polaris.logging.LoggerFactory; +import com.tencent.polaris.test.common.TestUtils; +import com.tencent.polaris.test.mock.discovery.NamingServer; +import com.tencent.polaris.test.mock.discovery.NamingService; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; + +import static com.tencent.polaris.test.common.Consts.ITERATE_COUNT; +import static com.tencent.polaris.test.common.Consts.NAMESPACE_TEST; +import static com.tencent.polaris.test.common.TestUtils.SERVER_ADDRESS_ENV; + +public class AssemblyTest { + + private static final Logger LOG = LoggerFactory.getLogger(AssemblyTest.class); + private static final Map validParams = new HashMap<>(); + private static final String SERVICE_TEST_NORMAL = "java_test_normal"; + private static final String SERVICE_TEST_ABNORMAL = "java_test_abnormal"; + private static final String NOT_EXISTS_SERVICE = "java_test_not_exists"; + + private NamingServer namingServer; + + static { + validParams.put(Operation.ALL_HEALTHY, + new ValidParam(SERVICE_TEST_NORMAL, 6, 6, 6)); + validParams.put(Operation.HAS_UNHEALTHY, + new ValidParam(SERVICE_TEST_ABNORMAL, 10, 4, 8)); + } + + private enum Operation { + ALL_HEALTHY, HAS_UNHEALTHY + } + + private static class ValidParam { + + final String serviceName; + + final int countAll; + + final int countHealth; + + final int countHasWeight; + + public ValidParam(String serviceName, int countAll, int countHealth, int countHasWeight) { + this.serviceName = serviceName; + this.countAll = countAll; + this.countHealth = countHealth; + this.countHasWeight = countHasWeight; + } + + public String getServiceName() { + return serviceName; + } + + public int getCountAll() { + return countAll; + } + + public int getCountHealth() { + return countHealth; + } + + public int getCountHasWeight() { + return countHasWeight; + } + } + + @Before + public void before() { + try { + namingServer = NamingServer.startNamingServer(-1); + System.setProperty(SERVER_ADDRESS_ENV, String.format("127.0.0.1:%d", namingServer.getPort())); + } catch (IOException e) { + Assert.fail(e.getMessage()); + } + for (ValidParam validParam : validParams.values()) { + NamingService.InstanceParameter instanceParameter = new NamingService.InstanceParameter(); + instanceParameter.setHealthy(true); + instanceParameter.setIsolated(false); + instanceParameter.setWeight(100); + ServiceKey serviceKey = new ServiceKey(NAMESPACE_TEST, validParam.getServiceName()); + List nodes = namingServer.getNamingService().batchAddInstances(serviceKey, 10000, + validParam.getCountAll(), instanceParameter); + if (validParam.getCountAll() > validParam.getCountHealth()) { + int abnormalCount = validParam.getCountAll() - validParam.getCountHealth(); + int unhealthyCount = abnormalCount / 2; + int isolatedCount = abnormalCount - unhealthyCount; + for (int i = 0; i < unhealthyCount; i++) { + namingServer.getNamingService().setInstanceHealthyStatus( + serviceKey, nodes.get(i), false, null, null); + } + for (int i = 0; i < isolatedCount; i++) { + namingServer.getNamingService().setInstanceHealthyStatus( + serviceKey, nodes.get(nodes.size() - 1 - i), null, true, null); + } + } + if (validParam.getCountAll() > validParam.getCountHasWeight()) { + int weightZeroCount = validParam.getCountAll() - validParam.getCountHasWeight(); + for (int i = 0; i < weightZeroCount; i++) { + namingServer.getNamingService().setInstanceHealthyStatus( + serviceKey, nodes.get(i), null, null, 0); + } + } + } + } + + @After + public void after() { + if (null != namingServer) { + namingServer.terminate(); + } + } + + @Test + public void testSyncGetOneInstanceNormal() { + commonTestSyncGetOneInstance(Operation.ALL_HEALTHY); + } + + @Test + public void testSyncGetOneInstanceAbnormal() { + commonTestSyncGetOneInstance(Operation.HAS_UNHEALTHY); + } + + @Test + public void testSyncGetReachableInstancesNormal() { + commonTestSyncGetReachableInstances(Operation.ALL_HEALTHY); + } + + @Test + public void testSyncGetReachableInstancesAbnormal() { + commonTestSyncGetReachableInstances(Operation.HAS_UNHEALTHY); + } + + private void commonTestSyncGetOneInstance(Operation operation) { + ValidParam validParam = validParams.get(operation); + Configuration configuration = TestUtils.configWithEnvAddress(); + try (AssemblyAPI assemblyAPI = AssemblyAPIFactory.createAssemblyAPIByConfig(configuration)) { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + LOG.error("test fail: commonTestSyncGetOneInstance", e); + } + for (int i = 0; i < ITERATE_COUNT; i++) { + GetOneInstanceRequest request = new GetOneInstanceRequest(); + request.setNamespace(NAMESPACE_TEST); + request.setService(validParam.getServiceName()); + + Instance instance = assemblyAPI.getOneInstance(request); + Assert.assertNotNull(instance); + + Assert.assertTrue(instance.isHealthy()); + Assert.assertFalse(instance.isIsolated()); + Assert.assertEquals(100, instance.getWeight()); + } + } + } + + private void commonTestSyncGetReachableInstances(Operation operation) { + ValidParam validParam = validParams.get(operation); + Configuration configuration = TestUtils.configWithEnvAddress(); + try (AssemblyAPI assemblyAPI = AssemblyAPIFactory.createAssemblyAPIByConfig(configuration)) { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + LOG.error("test fail: commonTestSyncGetReachableInstances", e); + } + for (int i = 0; i < ITERATE_COUNT; i++) { + GetReachableInstancesRequest request = new GetReachableInstancesRequest(); + request.setNamespace(NAMESPACE_TEST); + request.setService(validParam.getServiceName()); + + List instances = assemblyAPI.getReachableInstances(request); + Assert.assertEquals(validParam.getCountHealth(), instances.size()); + } + } + } + + @Test + public void testTraceSpanAttributes() { + Configuration configuration = TestUtils.configWithEnvAddress(); + try (AssemblyAPI assemblyAPI = AssemblyAPIFactory.createAssemblyAPIByConfig(configuration)) { + try { + Thread.sleep(3000); + } + catch (InterruptedException e) { + LOG.error("test fail: testTraceSpanAttributes", e); + } + Map values = new HashMap<>(); + values.put("testKey1", "testValue1"); + values.put("testKey2", "testValue2"); + TraceAttributes traceAttributes = new TraceAttributes(); + traceAttributes.setAttributeLocation(TraceAttributes.AttributeLocation.SPAN); + traceAttributes.setAttributes(values); + assemblyAPI.updateTraceAttributes(traceAttributes); + traceAttributes.setAttributeLocation(TraceAttributes.AttributeLocation.BAGGAGE); + assemblyAPI.updateTraceAttributes(traceAttributes); + } + } +} diff --git a/polaris-assembly/polaris-assembly-factory/src/test/java/com/tencent/polaris/assembly/factory/PrometheusHttpServerTest.java b/polaris-assembly/polaris-assembly-factory/src/test/java/com/tencent/polaris/assembly/factory/PrometheusHttpServerTest.java new file mode 100644 index 000000000..30d1cf6bb --- /dev/null +++ b/polaris-assembly/polaris-assembly-factory/src/test/java/com/tencent/polaris/assembly/factory/PrometheusHttpServerTest.java @@ -0,0 +1,99 @@ +/* + * Tencent is pleased to support the open source community by making Polaris available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.polaris.assembly.factory; + + +import com.tencent.polaris.api.config.Configuration; +import com.tencent.polaris.api.config.global.StatReporterConfig; +import com.tencent.polaris.client.api.SDKContext; +import com.tencent.polaris.factory.config.global.StatReporterConfigImpl; +import com.tencent.polaris.plugins.stat.prometheus.handler.PrometheusHandlerConfig; +import com.tencent.polaris.test.common.TestUtils; +import org.junit.Test; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; + +import static org.assertj.core.api.Assertions.assertThat; + +public class PrometheusHttpServerTest { + + @Test + public void testHttpServerWithPort() throws IOException { + Configuration configuration = TestUtils.configWithEnvAddress(); + StatReporterConfigImpl statReporterConfig = (StatReporterConfigImpl)configuration.getGlobal().getStatReporter(); + PrometheusHandlerConfig prometheusHandlerConfig = new PrometheusHandlerConfig(); + prometheusHandlerConfig.setHost("0.0.0.0"); + prometheusHandlerConfig.setPort(18080); + prometheusHandlerConfig.setPath("/metric"); + prometheusHandlerConfig.setType("pull"); + statReporterConfig.setPluginConfig(StatReporterConfig.DEFAULT_REPORTER_PROMETHEUS, prometheusHandlerConfig); + try (SDKContext sdkContext = SDKContext.initContextByConfig(configuration)) { + sdkContext.init(); + URL metricsUrl = new URL("http://127.0.0.1:18080/metrics"); + HttpURLConnection metricsConn = (HttpURLConnection) metricsUrl.openConnection(); + metricsConn.setRequestMethod("GET"); + metricsConn.connect(); + assertThat(metricsConn.getResponseCode()).isEqualTo(200); + metricsConn.disconnect(); + } + } + + @Test + public void testHttpServerRandomPort() throws IOException { + Configuration configuration = TestUtils.configWithEnvAddress(); + StatReporterConfigImpl statReporterConfig = (StatReporterConfigImpl)configuration.getGlobal().getStatReporter(); + PrometheusHandlerConfig prometheusHandlerConfig = new PrometheusHandlerConfig(); + prometheusHandlerConfig.setHost("0.0.0.0"); + prometheusHandlerConfig.setPort(0); + prometheusHandlerConfig.setPath("/metric"); + prometheusHandlerConfig.setType("pull"); + statReporterConfig.setPluginConfig(StatReporterConfig.DEFAULT_REPORTER_PROMETHEUS, prometheusHandlerConfig); + try (SDKContext sdkContext = SDKContext.initContextByConfig(configuration)) { + sdkContext.init(); + URL metricsUrl = new URL("http://127.0.0.1:28080/metrics"); + HttpURLConnection metricsConn = (HttpURLConnection) metricsUrl.openConnection(); + metricsConn.setRequestMethod("GET"); + metricsConn.connect(); + assertThat(metricsConn.getResponseCode()).isEqualTo(200); + metricsConn.disconnect(); + } + } + + @Test + public void testHttpServerWithPath() throws IOException { + Configuration configuration = TestUtils.configWithEnvAddress(); + StatReporterConfigImpl statReporterConfig = (StatReporterConfigImpl)configuration.getGlobal().getStatReporter(); + PrometheusHandlerConfig prometheusHandlerConfig = new PrometheusHandlerConfig(); + prometheusHandlerConfig.setHost("0.0.0.0"); + prometheusHandlerConfig.setPort(18081); + prometheusHandlerConfig.setPath("/customMetrics"); + prometheusHandlerConfig.setType("pull"); + statReporterConfig.setPluginConfig(StatReporterConfig.DEFAULT_REPORTER_PROMETHEUS, prometheusHandlerConfig); + try (SDKContext sdkContext = SDKContext.initContextByConfig(configuration)) { + sdkContext.init(); + URL metricsUrl = new URL("http://127.0.0.1:18081/customMetrics"); + HttpURLConnection metricsConn = (HttpURLConnection) metricsUrl.openConnection(); + metricsConn.setRequestMethod("GET"); + metricsConn.connect(); + assertThat(metricsConn.getResponseCode()).isEqualTo(200); + metricsConn.disconnect(); + } + } +} \ No newline at end of file diff --git a/polaris-assembly/polaris-assembly-factory/src/test/resources/log4j2.xml b/polaris-assembly/polaris-assembly-factory/src/test/resources/log4j2.xml new file mode 100644 index 000000000..3316c94fd --- /dev/null +++ b/polaris-assembly/polaris-assembly-factory/src/test/resources/log4j2.xml @@ -0,0 +1,28 @@ + + + + + + + + + %d{MM-dd-yyyy} %p %c{1.} [%t] -%M-%L- %m%n + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/polaris-assembly/polaris-assembly-factory/src/test/resources/polaris.yml b/polaris-assembly/polaris-assembly-factory/src/test/resources/polaris.yml new file mode 100644 index 000000000..6eeb63bfd --- /dev/null +++ b/polaris-assembly/polaris-assembly-factory/src/test/resources/polaris.yml @@ -0,0 +1,30 @@ +global: + #描述: 系统相关配置 + system: + variables: + x: y + x1: y1 + #描述:对接polaris server的相关配置 + serverConnector: + addresses: + - 127.0.0.1:10081 + api: + #api超时时间 + timeout: 2s + traceReporter: + enable: true +#描述:主调端配置 +consumer: + localCache: + persistEnable: false + #描述:节点熔断相关配置 + circuitBreaker: + #描述:是否启用节点熔断功能 + enable: false +provider: + # 优雅上下线 + lossless: + # 是否启用优雅上下线 + enable: false + delayRegisterInterval: 1s + healthCheckInterval: 1s \ No newline at end of file diff --git a/polaris-circuitbreaker/polaris-circuitbreaker-factory/pom.xml b/polaris-circuitbreaker/polaris-circuitbreaker-factory/pom.xml index c0254cdf6..1c091283f 100644 --- a/polaris-circuitbreaker/polaris-circuitbreaker-factory/pom.xml +++ b/polaris-circuitbreaker/polaris-circuitbreaker-factory/pom.xml @@ -87,6 +87,7 @@ circuitbreaker-composite ${project.version} + com.tencent.polaris @@ -94,6 +95,23 @@ ${project.version} + + + com.tencent.polaris + healthchecker-http + ${project.version} + + + com.tencent.polaris + healthchecker-tcp + ${project.version} + + + com.tencent.polaris + healthchecker-udp + ${project.version} + + com.tencent.polaris @@ -109,7 +127,7 @@ com.tencent.polaris - polaris-discovery-factory + polaris-assembly-factory ${project.version} test diff --git a/polaris-circuitbreaker/polaris-circuitbreaker-factory/src/test/java/com/tencent/polaris/circuitbreaker/factory/test/CircuitBreakerTest.java b/polaris-circuitbreaker/polaris-circuitbreaker-factory/src/test/java/com/tencent/polaris/circuitbreaker/factory/test/CircuitBreakerTest.java index cb044d50f..a145cb6f4 100644 --- a/polaris-circuitbreaker/polaris-circuitbreaker-factory/src/test/java/com/tencent/polaris/circuitbreaker/factory/test/CircuitBreakerTest.java +++ b/polaris-circuitbreaker/polaris-circuitbreaker-factory/src/test/java/com/tencent/polaris/circuitbreaker/factory/test/CircuitBreakerTest.java @@ -17,48 +17,49 @@ package com.tencent.polaris.circuitbreaker.factory.test; -import static com.tencent.polaris.test.common.Consts.NAMESPACE_TEST; -import static com.tencent.polaris.test.common.Consts.SERVICE_CIRCUIT_BREAKER; -import static com.tencent.polaris.test.common.TestUtils.SERVER_ADDRESS_ENV; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.List; +import java.util.function.Consumer; +import java.util.stream.Collectors; import com.google.protobuf.util.JsonFormat; import com.tencent.polaris.api.config.Configuration; import com.tencent.polaris.api.config.plugin.DefaultPlugins; -import com.tencent.polaris.api.core.ConsumerAPI; import com.tencent.polaris.api.pojo.CircuitBreakerStatus; import com.tencent.polaris.api.pojo.Instance; import com.tencent.polaris.api.pojo.RetStatus; import com.tencent.polaris.api.pojo.ServiceKey; -import com.tencent.polaris.api.rpc.GetInstancesRequest; -import com.tencent.polaris.api.rpc.InstancesResponse; import com.tencent.polaris.api.rpc.ServiceCallResult; +import com.tencent.polaris.assembly.api.AssemblyAPI; +import com.tencent.polaris.assembly.api.pojo.GetReachableInstancesRequest; +import com.tencent.polaris.assembly.factory.AssemblyAPIFactory; import com.tencent.polaris.circuitbreak.api.CircuitBreakAPI; import com.tencent.polaris.circuitbreak.api.FunctionalDecorator; import com.tencent.polaris.circuitbreak.api.pojo.FunctionalDecoratorRequest; import com.tencent.polaris.circuitbreak.client.exception.CallAbortedException; import com.tencent.polaris.circuitbreak.factory.CircuitBreakAPIFactory; import com.tencent.polaris.client.util.Utils; -import com.tencent.polaris.factory.api.DiscoveryAPIFactory; import com.tencent.polaris.factory.config.ConfigurationImpl; import com.tencent.polaris.logging.LoggerFactory; import com.tencent.polaris.specification.api.v1.fault.tolerance.CircuitBreakerProto; import com.tencent.polaris.test.common.TestUtils; import com.tencent.polaris.test.mock.discovery.NamingServer; import com.tencent.polaris.test.mock.discovery.NamingService.InstanceParameter; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.Collections; -import java.util.function.Consumer; -import java.util.stream.Collectors; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; +import static com.tencent.polaris.test.common.Consts.NAMESPACE_TEST; +import static com.tencent.polaris.test.common.Consts.SERVICE_CIRCUIT_BREAKER; +import static com.tencent.polaris.test.common.TestUtils.SERVER_ADDRESS_ENV; + /** * CircuitBreakerTest.java * @@ -120,20 +121,20 @@ private ServiceCallResult instanceToResult(Instance instance) { @Test public void testUpdateServiceCallResult() { Configuration configuration = TestUtils.configWithEnvAddress(); - try (ConsumerAPI consumerAPI = DiscoveryAPIFactory.createConsumerAPIByConfig(configuration)) { + try (AssemblyAPI assemblyAPI = AssemblyAPIFactory.createAssemblyAPIByConfig(configuration)) { Utils.sleepUninterrupted(10000); int index = 1; - GetInstancesRequest req = new GetInstancesRequest(); + GetReachableInstancesRequest req = new GetReachableInstancesRequest(); req.setNamespace(NAMESPACE_TEST); req.setService(SERVICE_CIRCUIT_BREAKER); - InstancesResponse instances = consumerAPI.getInstances(req); - Assert.assertEquals(MAX_COUNT, instances.getInstances().length); - Instance instanceToLimit = instances.getInstances()[index]; + List instances = assemblyAPI.getReachableInstances(req); + Assert.assertEquals(MAX_COUNT, instances.size()); + Instance instanceToLimit = instances.get(index); ServiceCallResult result = instanceToResult(instanceToLimit); result.setRetCode(-1); result.setDelay(1000L); result.setRetStatus(RetStatus.RetFail); - consumerAPI.updateServiceCallResult(result); + assemblyAPI.updateServiceCallResult(result); } } @@ -142,42 +143,41 @@ public void testCircuitBreakByErrorCount() { Configuration configuration = TestUtils.configWithEnvAddress(); ((ConfigurationImpl) configuration).getConsumer().getCircuitBreaker().setChain( Collections.singletonList(DefaultPlugins.CIRCUIT_BREAKER_ERROR_COUNT)); - try (ConsumerAPI consumerAPI = DiscoveryAPIFactory.createConsumerAPIByConfig(configuration)) { + try (AssemblyAPI assemblyAPI = AssemblyAPIFactory.createAssemblyAPIByConfig(configuration)) { Utils.sleepUninterrupted(10000); - Assert.assertNotNull(consumerAPI); - GetInstancesRequest getInstancesRequest = new GetInstancesRequest(); - getInstancesRequest.setNamespace(NAMESPACE_TEST); - getInstancesRequest.setService(SERVICE_CIRCUIT_BREAKER); - InstancesResponse instances = consumerAPI.getInstances(getInstancesRequest); - Assert.assertEquals(MAX_COUNT, instances.getInstances().length); - Instance instanceToLimit = instances.getInstances()[1]; + Assert.assertNotNull(assemblyAPI); + GetReachableInstancesRequest req = new GetReachableInstancesRequest(); + req.setNamespace(NAMESPACE_TEST); + req.setService(SERVICE_CIRCUIT_BREAKER); + List instances = assemblyAPI.getReachableInstances(req); + Assert.assertEquals(MAX_COUNT, instances.size()); + Instance instanceToLimit = instances.get(1); //report 60 fail in 500ms for (int i = 0; i < 60; ++i) { ServiceCallResult result = instanceToResult(instanceToLimit); result.setRetCode(-1); result.setDelay(1000L); result.setRetStatus(RetStatus.RetFail); - consumerAPI.updateServiceCallResult(result); + assemblyAPI.updateServiceCallResult(result); if (i % 10 == 0) { Utils.sleepUninterrupted(1); } } Utils.sleepUninterrupted(3000); - instances = consumerAPI.getInstances(getInstancesRequest); - Assert.assertEquals(MAX_COUNT - 1, instances.getInstances().length); - Instance[] instanceArray = instances.getInstances(); + instances = assemblyAPI.getReachableInstances(req); + Assert.assertEquals(MAX_COUNT - 1, instances.size()); boolean exists = false; - for (int i = 0; i < instanceArray.length; ++i) { - if (instanceArray[i].getId().equals(instanceToLimit.getId())) { + for (Instance instance : instances) { + if (instance.getId().equals(instanceToLimit.getId())) { exists = true; } } Assert.assertFalse(exists); LOG.info("start to test half open by error rate"); Utils.sleepUninterrupted(10000); - instances = consumerAPI.getInstances(getInstancesRequest); - Assert.assertEquals(MAX_COUNT, instances.getInstances().length); - for (Instance instance : instances.getInstances()) { + instances = assemblyAPI.getReachableInstances(req); + Assert.assertEquals(MAX_COUNT, instances.size()); + for (Instance instance : instances) { CircuitBreakerStatus circuitBreakerStatus = instance.getCircuitBreakerStatus(); if (null != circuitBreakerStatus && circuitBreakerStatus.getStatus() == CircuitBreakerStatus.Status.HALF_OPEN) { @@ -191,14 +191,14 @@ public void testCircuitBreakByErrorCount() { ServiceCallResult result = instanceToResult(instanceToLimit); result.setRetCode(-1); result.setRetStatus(RetStatus.RetSuccess); - consumerAPI.updateServiceCallResult(result); + assemblyAPI.updateServiceCallResult(result); Utils.sleepUninterrupted(200); - consumerAPI.updateServiceCallResult(result); + assemblyAPI.updateServiceCallResult(result); } LOG.info("start to test half open to close"); Utils.sleepUninterrupted(1000); - instances = consumerAPI.getInstances(getInstancesRequest); - Assert.assertEquals(MAX_COUNT, instances.getInstances().length); + instances = assemblyAPI.getReachableInstances(req); + Assert.assertEquals(MAX_COUNT, instances.size()); } } @@ -207,13 +207,13 @@ public void testCircuitBreakByErrorRate() { Configuration configuration = TestUtils.configWithEnvAddress(); ((ConfigurationImpl) configuration).getConsumer().getCircuitBreaker().setChain( Collections.singletonList(DefaultPlugins.CIRCUIT_BREAKER_ERROR_RATE)); - try (ConsumerAPI consumerAPI = DiscoveryAPIFactory.createConsumerAPIByConfig(configuration)) { - GetInstancesRequest getInstancesRequest = new GetInstancesRequest(); - getInstancesRequest.setNamespace(NAMESPACE_TEST); - getInstancesRequest.setService(SERVICE_CIRCUIT_BREAKER); - InstancesResponse instances = consumerAPI.getInstances(getInstancesRequest); - Assert.assertEquals(MAX_COUNT, instances.getInstances().length); - Instance instanceToLimit = instances.getInstances()[1]; + try (AssemblyAPI assemblyAPI = AssemblyAPIFactory.createAssemblyAPIByConfig(configuration)) { + GetReachableInstancesRequest req = new GetReachableInstancesRequest(); + req.setNamespace(NAMESPACE_TEST); + req.setService(SERVICE_CIRCUIT_BREAKER); + List instances = assemblyAPI.getReachableInstances(req); + Assert.assertEquals(MAX_COUNT, instances.size()); + Instance instanceToLimit = instances.get(1); //report 60 fail in 500ms for (int i = 0; i < 60; ++i) { ServiceCallResult result = instanceToResult(instanceToLimit); @@ -226,16 +226,15 @@ public void testCircuitBreakByErrorRate() { result.setRetCode(-1); result.setRetStatus(RetStatus.RetFail); } - consumerAPI.updateServiceCallResult(result); + assemblyAPI.updateServiceCallResult(result); Utils.sleepUninterrupted(1); } Utils.sleepUninterrupted(1000); - instances = consumerAPI.getInstances(getInstancesRequest); - Assert.assertEquals(MAX_COUNT - 1, instances.getInstances().length); - Instance[] instanceArray = instances.getInstances(); + instances = assemblyAPI.getReachableInstances(req); + Assert.assertEquals(MAX_COUNT - 1, instances.size()); boolean exists = false; - for (int i = 0; i < instanceArray.length; ++i) { - if (instanceArray[i].getId().equals(instanceToLimit.getId())) { + for (Instance instance : instances) { + if (instance.getId().equals(instanceToLimit.getId())) { exists = true; } } @@ -248,14 +247,14 @@ public void testCircuitBreakByErrorRate() { ServiceCallResult result = instanceToResult(instanceToLimit); result.setRetCode(-1); result.setRetStatus(RetStatus.RetSuccess); - consumerAPI.updateServiceCallResult(result); + assemblyAPI.updateServiceCallResult(result); Utils.sleepUninterrupted(200); - consumerAPI.updateServiceCallResult(result); + assemblyAPI.updateServiceCallResult(result); } LOG.info("start to test half open to close"); Utils.sleepUninterrupted(1000); - instances = consumerAPI.getInstances(getInstancesRequest); - Assert.assertEquals(MAX_COUNT, instances.getInstances().length); + instances = assemblyAPI.getReachableInstances(req); + Assert.assertEquals(MAX_COUNT, instances.size()); } } diff --git a/polaris-common/polaris-config-default/src/main/resources/conf/default-config.yml b/polaris-common/polaris-config-default/src/main/resources/conf/default-config.yml index 85463c801..21cca1166 100644 --- a/polaris-common/polaris-config-default/src/main/resources/conf/default-config.yml +++ b/polaris-common/polaris-config-default/src/main/resources/conf/default-config.yml @@ -73,6 +73,12 @@ global: serverSwitchInterval: 10m #描述:重连间隔时间 reconnectInterval: 500ms + # 调用链上报相关的配置 + traceReporter: + #描述: 是否启动调用链上报 + enable: false + #描述: 调用链实现 + reporter: otel #描述: 监控及日志数据上报相关配置 statReporter: #描述: 是否启用上报 diff --git a/polaris-common/polaris-config/src/main/java/com/tencent/polaris/api/config/global/GlobalConfig.java b/polaris-common/polaris-config/src/main/java/com/tencent/polaris/api/config/global/GlobalConfig.java index 98a67cdba..9efbdd4a3 100644 --- a/polaris-common/polaris-config/src/main/java/com/tencent/polaris/api/config/global/GlobalConfig.java +++ b/polaris-common/polaris-config/src/main/java/com/tencent/polaris/api/config/global/GlobalConfig.java @@ -43,14 +43,14 @@ public interface GlobalConfig extends Verifier { APIConfig getAPI(); /** - * services.global.serverConnector前缀开头的所有配置项 + * global.serverConnector前缀开头的所有配置项 * * @return ServerConnectorConfig */ ServerConnectorConfig getServerConnector(); /** - * Configuration of prefix of "services.global.serverConnectors". This has higher priority over + * Configuration of prefix of "global.serverConnectors". This has higher priority over * ${@link GlobalConfig#getServerConnector()}. * * @return List of ServerConnectorConfig @@ -58,12 +58,18 @@ public interface GlobalConfig extends Verifier { List getServerConnectors(); /** - * services.global.statReporter前缀开头的所有配置项 + * Configuration of prefix of "global.statReporter" * * @return StatReporterConfig */ StatReporterConfig getStatReporter(); + /** + * Configuration of prefix of "global.traceReporter" + * @return + */ + TraceReporterConfig getTraceReporter(); + /** * 获取地理位置提供者配置信息 * diff --git a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/AttachmentBaseEntity.java b/polaris-common/polaris-config/src/main/java/com/tencent/polaris/api/config/global/TraceReporterConfig.java similarity index 66% rename from polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/AttachmentBaseEntity.java rename to polaris-common/polaris-config/src/main/java/com/tencent/polaris/api/config/global/TraceReporterConfig.java index 8341e0906..573655f39 100644 --- a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/AttachmentBaseEntity.java +++ b/polaris-common/polaris-config/src/main/java/com/tencent/polaris/api/config/global/TraceReporterConfig.java @@ -1,30 +1,38 @@ -/* - * Tencent is pleased to support the open source community by making Polaris available. - * - * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * 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.tencent.polaris.assembly.api.pojo; - -import java.util.HashMap; -import java.util.Map; - -public class AttachmentBaseEntity { - - private final Map attachments = new HashMap<>(); - - public Map getAttachments() { - return attachments; - } -} +/* + * Tencent is pleased to support the open source community by making Polaris available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.polaris.api.config.global; + +import com.tencent.polaris.api.config.verify.Verifier; + +public interface TraceReporterConfig extends Verifier { + + String DEFAULT_REPORTER_OTEL = "otel"; + + /** + * 是否启用调用链上报 + * + * @return 启用开关 + */ + boolean isEnable(); + + /** + * 调用链上报插件名 + * @return 插件名 + */ + String getReporter(); +} diff --git a/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/GlobalConfigImpl.java b/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/GlobalConfigImpl.java index 2448358a8..d377c651c 100644 --- a/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/GlobalConfigImpl.java +++ b/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/GlobalConfigImpl.java @@ -21,6 +21,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.tencent.polaris.api.config.global.GlobalConfig; import com.tencent.polaris.api.config.global.LocationConfig; +import com.tencent.polaris.api.config.global.TraceReporterConfig; import com.tencent.polaris.api.config.plugin.DefaultPlugins; import com.tencent.polaris.api.utils.CollectionUtils; import com.tencent.polaris.factory.util.ConfigUtils; @@ -56,6 +57,8 @@ public class GlobalConfigImpl implements GlobalConfig { @JsonProperty private StatReporterConfigImpl statReporter; + @JsonProperty + private TraceReporterConfigImpl traceReporter; @JsonProperty private LocationConfigImpl location; @@ -113,6 +116,11 @@ public StatReporterConfigImpl getStatReporter() { return statReporter; } + @Override + public TraceReporterConfig getTraceReporter() { + return traceReporter; + } + @Override public void verify() { ConfigUtils.validateNull(system, "system"); @@ -122,6 +130,7 @@ public void verify() { validateMap.put("serverConnectors", serverConnectors); ConfigUtils.validateAllNull(validateMap); ConfigUtils.validateNull(statReporter, "statReporter"); + ConfigUtils.validateNull(traceReporter,"traceReporter"); system.verify(); api.verify(); @@ -137,6 +146,7 @@ public void verify() { serverConnectorConfigMap.put(serverConnector.getId(), serverConnector); } statReporter.verify(); + traceReporter.verify(); } @Override @@ -153,6 +163,9 @@ public void setDefault(Object defaultObject) { if (null == statReporter) { statReporter = new StatReporterConfigImpl(); } + if (null == traceReporter) { + traceReporter = new TraceReporterConfigImpl(); + } if (null == location) { location = new LocationConfigImpl(); } @@ -175,6 +188,7 @@ public void setDefault(Object defaultObject) { serverConnector.setDefault(globalConfig.getServerConnector()); } statReporter.setDefault(globalConfig.getStatReporter()); + traceReporter.setDefault(globalConfig.getTraceReporter()); location.setDefault(globalConfig.getLocation()); } } @@ -188,6 +202,8 @@ public String toString() { ", serverConnector=" + serverConnector + ", serverConnectors=" + serverConnectors + ", statReporter=" + statReporter + + ", traceReporter=" + traceReporter + + ", location=" + location + '}'; } } diff --git a/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/TraceReporterConfigImpl.java b/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/TraceReporterConfigImpl.java new file mode 100644 index 000000000..ba4ad3b85 --- /dev/null +++ b/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/TraceReporterConfigImpl.java @@ -0,0 +1,81 @@ +/* + * Tencent is pleased to support the open source community by making Polaris available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.polaris.factory.config.global; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.tencent.polaris.api.config.global.TraceReporterConfig; +import com.tencent.polaris.api.utils.StringUtils; +import com.tencent.polaris.factory.util.ConfigUtils; + +public class TraceReporterConfigImpl implements TraceReporterConfig { + + @JsonProperty + private Boolean enable; + + @JsonProperty + private String reporter; + + @Override + public boolean isEnable() { + if (null == enable) { + return false; + } + return enable; + } + + @Override + public String getReporter() { + return reporter; + } + + void setEnable(Boolean enable) { + this.enable = enable; + } + + void setReporter(String reporter) { + this.reporter = reporter; + } + + public void verify() { + ConfigUtils.validateNull(enable, "traceReporter.enable"); + if (isEnable()) { + ConfigUtils.validateString(reporter, "traceReporter.reporter"); + } + } + + @Override + public void setDefault(Object defaultObject) { + if (null != defaultObject) { + TraceReporterConfig traceReporterConfig = (TraceReporterConfig) defaultObject; + if (null == enable) { + setEnable(traceReporterConfig.isEnable()); + } + if (StringUtils.isBlank(reporter)) { + setReporter(traceReporterConfig.getReporter()); + } + } + } + + @Override + public String toString() { + return "TraceReporterConfigImpl{" + + "enable=" + enable + + ", reporter='" + reporter + '\'' + + '}'; + } +} diff --git a/polaris-common/polaris-model/src/main/java/com/tencent/polaris/client/util/CommonValidator.java b/polaris-common/polaris-model/src/main/java/com/tencent/polaris/client/util/CommonValidator.java index e1b562171..821ac961c 100644 --- a/polaris-common/polaris-model/src/main/java/com/tencent/polaris/client/util/CommonValidator.java +++ b/polaris-common/polaris-model/src/main/java/com/tencent/polaris/client/util/CommonValidator.java @@ -24,6 +24,8 @@ public class CommonValidator { + public static final int MAX_PORT = 65536; + /** * 校验命名空间和服务名 * diff --git a/polaris-dependencies/pom.xml b/polaris-dependencies/pom.xml index b1031f382..40e1608d8 100644 --- a/polaris-dependencies/pom.xml +++ b/polaris-dependencies/pom.xml @@ -287,6 +287,11 @@ stat-prometheus ${project.version} + + com.tencent.polaris + trace-otel + ${project.version} + com.tencent.polaris diff --git a/polaris-discovery/polaris-discovery-api/src/main/java/com/tencent/polaris/api/core/ConsumerAPI.java b/polaris-discovery/polaris-discovery-api/src/main/java/com/tencent/polaris/api/core/ConsumerAPI.java index 00f3915d5..59ee38a02 100644 --- a/polaris-discovery/polaris-discovery-api/src/main/java/com/tencent/polaris/api/core/ConsumerAPI.java +++ b/polaris-discovery/polaris-discovery-api/src/main/java/com/tencent/polaris/api/core/ConsumerAPI.java @@ -77,7 +77,11 @@ public interface ConsumerAPI extends AutoCloseable, Closeable { * @param req 请求 * @return 单个服务实例 * @throws PolarisException 错误码及错误信息 + * + * @deprecated + * *

Use {@link com.tencent.polaris.assembly.api.AssemblyAPI#getOneInstance(com.tencent.polaris.assembly.api.pojo.GetOneInstanceRequest)} instead. */ + @Deprecated InstancesResponse getOneInstance(GetOneInstanceRequest req) throws PolarisException; /** @@ -86,7 +90,11 @@ public interface ConsumerAPI extends AutoCloseable, Closeable { * @param req 请求 * @return 过滤后的服务列表 * @throws PolarisException 错误码及错误信息 + * + * @deprecated + * *

Use {@link com.tencent.polaris.assembly.api.AssemblyAPI#getReachableInstances(com.tencent.polaris.assembly.api.pojo.GetReachableInstancesRequest)} instead. */ + @Deprecated InstancesResponse getInstances(GetInstancesRequest req) throws PolarisException; /** @@ -121,7 +129,11 @@ public interface ConsumerAPI extends AutoCloseable, Closeable { * * @param req 调用结果(包括成功失败,返回码,以及时延) * @throws PolarisException 错误码及错误信息 + * + * @deprecated + * *

Use {@link com.tencent.polaris.assembly.api.AssemblyAPI#updateServiceCallResult(ServiceCallResult)} instead. */ + @Deprecated void updateServiceCallResult(ServiceCallResult req) throws PolarisException; /** diff --git a/polaris-discovery/polaris-discovery-client/src/main/java/com/tencent/polaris/discovery/client/flow/CommonInstancesRequest.java b/polaris-discovery/polaris-discovery-client/src/main/java/com/tencent/polaris/discovery/client/flow/CommonInstancesRequest.java index d79f9e62a..51d45be59 100644 --- a/polaris-discovery/polaris-discovery-client/src/main/java/com/tencent/polaris/discovery/client/flow/CommonInstancesRequest.java +++ b/polaris-discovery/polaris-discovery-client/src/main/java/com/tencent/polaris/discovery/client/flow/CommonInstancesRequest.java @@ -32,6 +32,7 @@ import com.tencent.polaris.api.rpc.GetHealthyInstancesRequest; import com.tencent.polaris.api.rpc.GetInstancesRequest; import com.tencent.polaris.api.rpc.GetOneInstanceRequest; +import com.tencent.polaris.api.rpc.RequestBaseEntity; import com.tencent.polaris.api.utils.StringUtils; import com.tencent.polaris.client.flow.BaseFlow; import com.tencent.polaris.client.flow.FlowControlParam; @@ -191,6 +192,25 @@ public CommonInstancesRequest(GetInstancesRequest request, Configuration configu BaseFlow.buildFlowControlParam(request, configuration, this); } + public CommonInstancesRequest(ServiceEventKey dstInstanceEventKey, ServiceEventKey dstRuleEventKey, ServiceEventKey srcRuleEventKey, + RouteInfo routeInfo, Criteria criteria, RequestBaseEntity request, Configuration configuration) { + this.srcRuleEventKey = srcRuleEventKey; + if (null != srcRuleEventKey) { + svcEventKeys.add(srcRuleEventKey); + } + this.dstInstanceEventKey = dstInstanceEventKey; + if (null != dstInstanceEventKey) { + svcEventKeys.add(dstInstanceEventKey); + } + this.dstRuleEventKey = dstRuleEventKey; + if (null != dstRuleEventKey) { + svcEventKeys.add(dstRuleEventKey); + } + this.routeInfo = routeInfo; + this.criteria = criteria; + BaseFlow.buildFlowControlParam(request, configuration, this); + } + public ServiceEventKey getSrcRuleEventKey() { return srcRuleEventKey; } diff --git a/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/common/PluginTypes.java b/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/common/PluginTypes.java index 1113b21cd..654587421 100644 --- a/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/common/PluginTypes.java +++ b/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/common/PluginTypes.java @@ -34,6 +34,7 @@ import com.tencent.polaris.api.plugin.route.ServiceRouter; import com.tencent.polaris.api.plugin.server.ServerConnector; import com.tencent.polaris.api.plugin.stat.StatReporter; +import com.tencent.polaris.api.plugin.stat.TraceReporter; import com.tencent.polaris.api.plugin.weight.WeightAdjuster; /** @@ -91,10 +92,15 @@ public enum PluginTypes { WEIGHT_ADJUSTER(new PluginType(WeightAdjuster.class, 2)), /** - * 统计上报扩展点 + * 统计监控上报扩展点 */ STAT_REPORTER(new PluginType(StatReporter.class, 2)), + /** + * 调用链上报扩展点 + */ + TRACE_REPORTER(new PluginType(TraceReporter.class, 2)), + /** * 限流器扩展点 */ diff --git a/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/compose/Extensions.java b/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/compose/Extensions.java index c3b54614e..cd65cdf57 100644 --- a/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/compose/Extensions.java +++ b/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/compose/Extensions.java @@ -44,6 +44,7 @@ import com.tencent.polaris.api.plugin.route.ServiceRouter; import com.tencent.polaris.api.plugin.server.ServerConnector; import com.tencent.polaris.api.plugin.stat.StatReporter; +import com.tencent.polaris.api.plugin.stat.TraceReporter; import com.tencent.polaris.api.utils.CollectionUtils; import com.tencent.polaris.api.utils.MapUtils; import com.tencent.polaris.api.utils.StringUtils; @@ -84,6 +85,9 @@ public class Extensions extends Destroyable { private CircuitBreaker resourceBreaker; private final List statReporters = new ArrayList<>(); + + private TraceReporter traceReporter; + private Supplier plugins; //系统服务的路由链 @@ -191,6 +195,9 @@ public void init(Configuration config, Supplier plugins, ValueContext valueConte // 加载监控上报 loadStatReporters(plugins); + // 加载调用链上报 + loadTraceReporter(plugins); + // 加载优雅上下线插件 loadLosslessPolicies(config, plugins); @@ -274,6 +281,15 @@ private void loadStatReporters(Supplier plugins) throws PolarisException { } } + private void loadTraceReporter(Supplier plugins) throws PolarisException { + if (configuration.getGlobal().getTraceReporter().isEnable()) { + Collection reporters = plugins.getPlugins(PluginTypes.TRACE_REPORTER.getBaseType()); + if (CollectionUtils.isNotEmpty(reporters)) { + traceReporter = (TraceReporter) reporters.iterator().next(); + } + } + } + private void loadLosslessPolicies(Configuration config, Supplier plugins) throws PolarisException { if (!config.getProvider().getLossless().isEnable()) { return; @@ -546,6 +562,10 @@ public List getLosslessPolicies() { return losslessPolicies; } + public TraceReporter getTraceReporter() { + return traceReporter; + } + @Override protected void doDestroy() { if (MapUtils.isNotEmpty(httpServers)) { diff --git a/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/stat/StatReporter.java b/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/stat/StatReporter.java index d458c259c..73f37e6fb 100644 --- a/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/stat/StatReporter.java +++ b/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/stat/StatReporter.java @@ -20,7 +20,7 @@ import com.tencent.polaris.api.plugin.Plugin; /** - * 【扩展点接口】上报统计结果 + * 【扩展点接口】上报统计监控 * * @author andrewshan * @date 2019/8/21 diff --git a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/Capability.java b/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/stat/TraceReporter.java similarity index 57% rename from polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/Capability.java rename to polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/stat/TraceReporter.java index 748049571..60a04ea36 100644 --- a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/Capability.java +++ b/polaris-plugins/polaris-plugin-api/src/main/java/com/tencent/polaris/api/plugin/stat/TraceReporter.java @@ -1,22 +1,43 @@ -/* - * Tencent is pleased to support the open source community by making Polaris available. - * - * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * 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.tencent.polaris.assembly.api.pojo; - -public enum Capability { - ALL, TRACING, DISCOVERY, ROUTER, LOAD_BALANCER, CIRCUIT_BREAKER, RATE_LIMITER, AUTH -} +/* + * Tencent is pleased to support the open source community by making Polaris available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.polaris.api.plugin.stat; + +import java.util.Map; + +import com.tencent.polaris.api.plugin.Plugin; + +/** + * 【扩展点接口】上报调用链 + * + * @author andrewshan + * @date 2024/6/2 + */ +public interface TraceReporter extends Plugin { + + /** + * set the attributes in trace span + * @param attributes span attributes + */ + void setSpanAttributes(Map attributes); + + /** + * set the attributes in baggage span + * @param attributes baggage attributes + */ + void setBaggageAttributes(Map attributes); +} diff --git a/polaris-plugins/polaris-plugins-observability/pom.xml b/polaris-plugins/polaris-plugins-observability/pom.xml index 9fd551a07..a60751920 100644 --- a/polaris-plugins/polaris-plugins-observability/pom.xml +++ b/polaris-plugins/polaris-plugins-observability/pom.xml @@ -18,6 +18,7 @@ stat-prometheus stat-common + trace-otel diff --git a/polaris-plugins/polaris-plugins-observability/trace-otel/pom.xml b/polaris-plugins/polaris-plugins-observability/trace-otel/pom.xml new file mode 100644 index 000000000..943bc79d3 --- /dev/null +++ b/polaris-plugins/polaris-plugins-observability/trace-otel/pom.xml @@ -0,0 +1,29 @@ + + + + polaris-plugins-observability + com.tencent.polaris + ${revision} + ../pom.xml + + 4.0.0 + + trace-otel + Polaris Plugins Observability Trace OTel + Polaris Plugins Observability Trace OTel JAR + + + + polaris-plugin-api + com.tencent.polaris + ${project.version} + + + io.opentelemetry + opentelemetry-api + ${otel.version} + + + \ No newline at end of file diff --git a/polaris-plugins/polaris-plugins-observability/trace-otel/src/main/java/com/tencent/polaris/plugins/stat/otel/OtelTraceReporter.java b/polaris-plugins/polaris-plugins-observability/trace-otel/src/main/java/com/tencent/polaris/plugins/stat/otel/OtelTraceReporter.java new file mode 100644 index 000000000..db464d308 --- /dev/null +++ b/polaris-plugins/polaris-plugins-observability/trace-otel/src/main/java/com/tencent/polaris/plugins/stat/otel/OtelTraceReporter.java @@ -0,0 +1,72 @@ +/* + * Tencent is pleased to support the open source community by making Polaris available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.polaris.plugins.stat.otel; + +import java.util.Map; + +import com.tencent.polaris.api.config.global.TraceReporterConfig; +import com.tencent.polaris.api.exception.PolarisException; +import com.tencent.polaris.api.plugin.PluginType; +import com.tencent.polaris.api.plugin.common.InitContext; +import com.tencent.polaris.api.plugin.common.PluginTypes; +import com.tencent.polaris.api.plugin.compose.Extensions; +import com.tencent.polaris.api.plugin.stat.TraceReporter; +import io.opentelemetry.api.baggage.Baggage; +import io.opentelemetry.api.baggage.BaggageBuilder; +import io.opentelemetry.api.trace.Span; + +public class OtelTraceReporter implements TraceReporter { + + @Override + public String getName() { + return TraceReporterConfig.DEFAULT_REPORTER_OTEL; + } + + @Override + public PluginType getType() { + return PluginTypes.TRACE_REPORTER.getBaseType(); + } + + @Override + public void init(InitContext ctx) throws PolarisException { + + } + + @Override + public void postContextInit(Extensions ctx) throws PolarisException { + + } + + @Override + public void destroy() { + + } + + @Override + public void setSpanAttributes(Map attributes) { + Span span = Span.current(); + attributes.forEach(span::setAttribute); + } + + @Override + public void setBaggageAttributes(Map attributes) { + BaggageBuilder builder = Baggage.current().toBuilder(); + attributes.forEach(builder::put); + builder.build().makeCurrent(); + } +} diff --git a/polaris-plugins/polaris-plugins-observability/trace-otel/src/main/resources/META-INF/services/com.tencent.polaris.api.plugin.stat.TraceReporter b/polaris-plugins/polaris-plugins-observability/trace-otel/src/main/resources/META-INF/services/com.tencent.polaris.api.plugin.stat.TraceReporter new file mode 100644 index 000000000..56a3a64bf --- /dev/null +++ b/polaris-plugins/polaris-plugins-observability/trace-otel/src/main/resources/META-INF/services/com.tencent.polaris.api.plugin.stat.TraceReporter @@ -0,0 +1 @@ +com.tencent.polaris.plugins.stat.otel.OtelTraceReporter \ No newline at end of file diff --git a/polaris-plugins/polaris-plugins-observability/trace-otel/src/test/java/com/tencent/polaris/plugins/stat/otel/OtelTraceReporterTest.java b/polaris-plugins/polaris-plugins-observability/trace-otel/src/test/java/com/tencent/polaris/plugins/stat/otel/OtelTraceReporterTest.java new file mode 100644 index 000000000..87366af32 --- /dev/null +++ b/polaris-plugins/polaris-plugins-observability/trace-otel/src/test/java/com/tencent/polaris/plugins/stat/otel/OtelTraceReporterTest.java @@ -0,0 +1,43 @@ +/* + * Tencent is pleased to support the open source community by making Polaris available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * 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.tencent.polaris.plugins.stat.otel; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Test; + +public class OtelTraceReporterTest { + + @Test + public void testSetSpanAttributes() { + OtelTraceReporter reporter = new OtelTraceReporter(); + Map values = new HashMap<>(); + values.put("key1", "value1"); + reporter.setSpanAttributes(values); + } + + @Test + public void testSetBaggageAttributes() { + OtelTraceReporter reporter = new OtelTraceReporter(); + Map values = new HashMap<>(); + values.put("key1", "value1"); + reporter.setBaggageAttributes(values); + } + +} diff --git a/pom.xml b/pom.xml index 41b8967cb..1494bf30b 100644 --- a/pom.xml +++ b/pom.xml @@ -65,7 +65,7 @@ - 1.15.7-SNAPSHOT + 1.15.8-SNAPSHOT ${maven.build.timestamp} false @@ -97,6 +97,7 @@ 3.16.1 -Xmx2048m 0.11.0 + 1.38.0 3.0.0 3.2.0 3.2.0 From e7d44175a287c1fdce8d80110f1dc868edbcd8f6 Mon Sep 17 00:00:00 2001 From: andrew shan <45474304+andrewshan@users.noreply.github.com> Date: Mon, 17 Jun 2024 18:03:15 +0800 Subject: [PATCH 2/6] feat: restore version to 1.15.7-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1494bf30b..cd68618e6 100644 --- a/pom.xml +++ b/pom.xml @@ -65,7 +65,7 @@ - 1.15.8-SNAPSHOT + 1.15.7-SNAPSHOT ${maven.build.timestamp} false From b76ddf4d9edabbfc6b66699609f8dc6336917a65 Mon Sep 17 00:00:00 2001 From: andrew shan <45474304+andrewshan@users.noreply.github.com> Date: Mon, 17 Jun 2024 21:50:26 +0800 Subject: [PATCH 3/6] feat: add initService to AssemblyAPI --- .../polaris/assembly/api/AssemblyAPI.java | 7 ++++++ .../polaris/assembly/api/pojo/Validator.java | 11 ++++++++++ .../assembly/client/DefaultAssemblyAPI.java | 8 +++++++ .../client/flow/DefaultAssemblyFlow.java | 22 +++++++++++++++++++ 4 files changed, 48 insertions(+) diff --git a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/AssemblyAPI.java b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/AssemblyAPI.java index df2aae2c2..ea5dc00eb 100644 --- a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/AssemblyAPI.java +++ b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/AssemblyAPI.java @@ -21,6 +21,7 @@ import java.util.List; import com.tencent.polaris.api.pojo.Instance; +import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.rpc.ServiceCallResult; import com.tencent.polaris.assembly.api.pojo.GetOneInstanceRequest; import com.tencent.polaris.assembly.api.pojo.GetReachableInstancesRequest; @@ -28,6 +29,12 @@ public interface AssemblyAPI extends AutoCloseable, Closeable { + /** + * 初始化服务实例列表,避免在服务调用的时候进行拉取,可有效减少调用时延。 + * @param serviceKey 服务名和命名空间 + */ + void initService(ServiceKey serviceKey); + /** * 获取路由后的服务实例列表,贯穿服务发现、服务路由的逻辑 * @param request 多个符合路由条件的服务实例 diff --git a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/Validator.java b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/Validator.java index d216149a8..49faa1254 100644 --- a/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/Validator.java +++ b/polaris-assembly/polaris-assembly-api/src/main/java/com/tencent/polaris/assembly/api/pojo/Validator.java @@ -20,6 +20,7 @@ import com.tencent.polaris.api.exception.ErrorCode; import com.tencent.polaris.api.exception.PolarisException; import com.tencent.polaris.api.pojo.RetStatus; +import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.rpc.ServiceCallResult; import com.tencent.polaris.api.utils.StringUtils; import com.tencent.polaris.client.util.CommonValidator; @@ -36,6 +37,16 @@ public static void validateGetOneInstanceRequest(GetOneInstanceRequest request) CommonValidator.validateNamespaceService(request.getNamespace(), request.getService()); } + /** + * 校验服务名和命名空间 + * + * @param serviceKey 请求对象 + * @throws PolarisException 校验失败会抛出异常 + */ + public static void validateServiceKey(ServiceKey serviceKey) throws PolarisException { + CommonValidator.validateNamespaceService(serviceKey.getNamespace(), serviceKey.getService()); + } + /** * 校验获取批量服务实例的请求 * diff --git a/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/DefaultAssemblyAPI.java b/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/DefaultAssemblyAPI.java index ac74e830d..1c3a8ebf1 100644 --- a/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/DefaultAssemblyAPI.java +++ b/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/DefaultAssemblyAPI.java @@ -21,6 +21,7 @@ import com.tencent.polaris.api.exception.PolarisException; import com.tencent.polaris.api.pojo.Instance; +import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.rpc.ServiceCallResult; import com.tencent.polaris.api.utils.CollectionUtils; import com.tencent.polaris.assembly.api.AssemblyAPI; @@ -45,6 +46,13 @@ protected void subInit() throws PolarisException { assemblyFlow = sdkContext.getOrInitFlow(AssemblyFlow.class); } + @Override + public void initService(ServiceKey serviceKey) { + checkAvailable("AssemblyAPI"); + Validator.validateServiceKey(serviceKey); + assemblyFlow.initService(serviceKey); + } + @Override public List getReachableInstances(GetReachableInstancesRequest request) { checkAvailable("AssemblyAPI"); diff --git a/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/flow/DefaultAssemblyFlow.java b/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/flow/DefaultAssemblyFlow.java index 395255bbd..6cbb6db47 100644 --- a/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/flow/DefaultAssemblyFlow.java +++ b/polaris-assembly/polaris-assembly-client/src/main/java/com/tencent/polaris/assembly/client/flow/DefaultAssemblyFlow.java @@ -32,6 +32,7 @@ import com.tencent.polaris.api.pojo.ServiceInstances; import com.tencent.polaris.api.pojo.ServiceKey; import com.tencent.polaris.api.pojo.SourceService; +import com.tencent.polaris.api.rpc.RequestBaseEntity; import com.tencent.polaris.api.rpc.ServiceCallResult; import com.tencent.polaris.api.utils.CollectionUtils; import com.tencent.polaris.api.utils.StringUtils; @@ -65,6 +66,27 @@ public void setSDKContext(SDKContext sdkContext) { serviceCallResultListeners = ServiceCallResultListener.getServiceCallResultListeners(sdkContext); } + @Override + public void initService(ServiceKey serviceKey) { + CommonInstancesRequest commonInstancesRequest = buildCommonInstancesRequest(serviceKey, sdkContext.getConfig()); + BaseFlow.syncGetResources(extensions, false, commonInstancesRequest, commonInstancesRequest); + } + + private static CommonInstancesRequest buildCommonInstancesRequest(ServiceKey serviceKey, Configuration configuration) { + ServiceKey dstSvcKey = new ServiceKey(serviceKey.getNamespace(), serviceKey.getService()); + ServiceEventKey dstInstanceEventKey = new ServiceEventKey(dstSvcKey, ServiceEventKey.EventType.INSTANCE); + ServiceEventKey dstRuleEventKey = new ServiceEventKey(dstSvcKey, ServiceEventKey.EventType.ROUTING); + ServiceInfo dstServiceInfo = new ServiceInfo(); + dstServiceInfo.setNamespace(serviceKey.getNamespace()); + dstServiceInfo.setService(serviceKey.getService()); + RequestBaseEntity requestBaseEntity = new RequestBaseEntity(); + requestBaseEntity.setService(serviceKey.getService()); + requestBaseEntity.setNamespace(serviceKey.getNamespace()); + RouteInfo routeInfo = new RouteInfo(null, dstServiceInfo, "", configuration.getProvider().getService()); + return new CommonInstancesRequest(dstInstanceEventKey, dstRuleEventKey, null, routeInfo, + null, requestBaseEntity, configuration); + } + @Override public List getReachableInstances(GetReachableInstancesRequest request) { CommonInstancesRequest commonInstancesRequest = buildCommonInstancesRequest(request, sdkContext.getConfig()); From 174620116c11a7003ea1fcefdd379ca72774518c Mon Sep 17 00:00:00 2001 From: andrew shan <45474304+andrewshan@users.noreply.github.com> Date: Mon, 17 Jun 2024 21:58:02 +0800 Subject: [PATCH 4/6] test: add test for initService --- .../polaris/assembly/factory/AssemblyTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/polaris-assembly/polaris-assembly-factory/src/test/java/com/tencent/polaris/assembly/factory/AssemblyTest.java b/polaris-assembly/polaris-assembly-factory/src/test/java/com/tencent/polaris/assembly/factory/AssemblyTest.java index a47bffa0f..1c3d2d4f1 100644 --- a/polaris-assembly/polaris-assembly-factory/src/test/java/com/tencent/polaris/assembly/factory/AssemblyTest.java +++ b/polaris-assembly/polaris-assembly-factory/src/test/java/com/tencent/polaris/assembly/factory/AssemblyTest.java @@ -168,6 +168,20 @@ public void testSyncGetReachableInstancesAbnormal() { commonTestSyncGetReachableInstances(Operation.HAS_UNHEALTHY); } + @Test + public void testInitService() { + ValidParam validParam = validParams.get(Operation.ALL_HEALTHY); + Configuration configuration = TestUtils.configWithEnvAddress(); + try (AssemblyAPI assemblyAPI = AssemblyAPIFactory.createAssemblyAPIByConfig(configuration)) { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + LOG.error("test fail: testInitService", e); + } + assemblyAPI.initService(new ServiceKey(NAMESPACE_TEST, validParam.getServiceName())); + } + } + private void commonTestSyncGetOneInstance(Operation operation) { ValidParam validParam = validParams.get(operation); Configuration configuration = TestUtils.configWithEnvAddress(); From bc9f0f61f61317c0539905bdb8a34c6fa8c60e29 Mon Sep 17 00:00:00 2001 From: andrew shan <45474304+andrewshan@users.noreply.github.com> Date: Tue, 18 Jun 2024 15:29:28 +0800 Subject: [PATCH 5/6] fix: TraceReporterConfig type mistake --- .../polaris/factory/config/global/GlobalConfigImpl.java | 2 +- .../factory/config/global/TraceReporterConfigImpl.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/GlobalConfigImpl.java b/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/GlobalConfigImpl.java index d377c651c..8d4244f7e 100644 --- a/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/GlobalConfigImpl.java +++ b/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/GlobalConfigImpl.java @@ -117,7 +117,7 @@ public StatReporterConfigImpl getStatReporter() { } @Override - public TraceReporterConfig getTraceReporter() { + public TraceReporterConfigImpl getTraceReporter() { return traceReporter; } diff --git a/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/TraceReporterConfigImpl.java b/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/TraceReporterConfigImpl.java index ba4ad3b85..f2274057e 100644 --- a/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/TraceReporterConfigImpl.java +++ b/polaris-common/polaris-config/src/main/java/com/tencent/polaris/factory/config/global/TraceReporterConfigImpl.java @@ -43,11 +43,11 @@ public String getReporter() { return reporter; } - void setEnable(Boolean enable) { + public void setEnable(Boolean enable) { this.enable = enable; } - void setReporter(String reporter) { + public void setReporter(String reporter) { this.reporter = reporter; } From 87dd61e1c3a22f92063dc2ee81352e4dc4df819f Mon Sep 17 00:00:00 2001 From: andrew shan <45474304+andrewshan@users.noreply.github.com> Date: Tue, 18 Jun 2024 17:22:40 +0800 Subject: [PATCH 6/6] feat: support modify loglevel over parameter & support log in tracereporter --- .../src/main/resources/polaris-log4j.xml | 14 +++++++------- .../trace-otel/pom.xml | 11 +++++++++++ .../plugins/stat/otel/OtelTraceReporter.java | 7 +++++++ 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/polaris-common/polaris-logging/src/main/resources/polaris-log4j.xml b/polaris-common/polaris-logging/src/main/resources/polaris-log4j.xml index f338d38a2..afc5038e5 100644 --- a/polaris-common/polaris-logging/src/main/resources/polaris-log4j.xml +++ b/polaris-common/polaris-logging/src/main/resources/polaris-log4j.xml @@ -73,31 +73,31 @@ - + - + - + - + - + - + - + \ No newline at end of file diff --git a/polaris-plugins/polaris-plugins-observability/trace-otel/pom.xml b/polaris-plugins/polaris-plugins-observability/trace-otel/pom.xml index 943bc79d3..454784fcc 100644 --- a/polaris-plugins/polaris-plugins-observability/trace-otel/pom.xml +++ b/polaris-plugins/polaris-plugins-observability/trace-otel/pom.xml @@ -20,6 +20,17 @@ com.tencent.polaris ${project.version} + + org.slf4j + slf4j-api + ${slf4j.version} + provided + + + com.tencent.polaris + polaris-logging + ${project.version} + io.opentelemetry opentelemetry-api diff --git a/polaris-plugins/polaris-plugins-observability/trace-otel/src/main/java/com/tencent/polaris/plugins/stat/otel/OtelTraceReporter.java b/polaris-plugins/polaris-plugins-observability/trace-otel/src/main/java/com/tencent/polaris/plugins/stat/otel/OtelTraceReporter.java index db464d308..8f67d8436 100644 --- a/polaris-plugins/polaris-plugins-observability/trace-otel/src/main/java/com/tencent/polaris/plugins/stat/otel/OtelTraceReporter.java +++ b/polaris-plugins/polaris-plugins-observability/trace-otel/src/main/java/com/tencent/polaris/plugins/stat/otel/OtelTraceReporter.java @@ -26,12 +26,17 @@ import com.tencent.polaris.api.plugin.common.PluginTypes; import com.tencent.polaris.api.plugin.compose.Extensions; import com.tencent.polaris.api.plugin.stat.TraceReporter; +import com.tencent.polaris.logging.LoggerFactory; +import com.tencent.polaris.logging.PolarisLogging; import io.opentelemetry.api.baggage.Baggage; import io.opentelemetry.api.baggage.BaggageBuilder; import io.opentelemetry.api.trace.Span; +import org.slf4j.Logger; public class OtelTraceReporter implements TraceReporter { + private static final Logger LOGGER = LoggerFactory.getLogger(PolarisLogging.class); + @Override public String getName() { return TraceReporterConfig.DEFAULT_REPORTER_OTEL; @@ -59,12 +64,14 @@ public void destroy() { @Override public void setSpanAttributes(Map attributes) { + LOGGER.debug("OtelTraceReporter: setSpanAttributes: {}", attributes); Span span = Span.current(); attributes.forEach(span::setAttribute); } @Override public void setBaggageAttributes(Map attributes) { + LOGGER.debug("OtelTraceReporter: setBaggageAttributes: {}", attributes); BaggageBuilder builder = Baggage.current().toBuilder(); attributes.forEach(builder::put); builder.build().makeCurrent();